}
-float STATE_TOP = 0;
-float STATE_BOTTOM = 1;
-float STATE_UP = 2;
-float STATE_DOWN = 3;
-
.entity trigger_field;
void() plat_center_touch;
void() plat_go_up;
void() plat_go_down;
void() plat_crush;
-float PLAT_LOW_TRIGGER = 1;
+const float PLAT_LOW_TRIGGER = 1;
void plat_spawn_inside_trigger()
{
void plat_hit_top()
{
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
self.state = 1;
self.think = plat_go_down;
self.nextthink = self.ltime + 3;
void plat_hit_bottom()
{
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
self.state = 2;
}
void plat_go_down()
{
- sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_NORM);
self.state = 3;
SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, plat_hit_bottom);
}
void plat_go_up()
{
- sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_NORM);
self.state = 4;
SUB_CalcMove (self.pos1, TSPEED_LINEAR, self.speed, plat_hit_top);
}
void plat_center_touch()
{
- if not(other.iscreature)
+ if (!other.iscreature)
return;
if (other.health <= 0)
void plat_outside_touch()
{
- if not(other.iscreature)
+ if (!other.iscreature)
return;
if (other.health <= 0)
void plat_use()
{
- self.use = SUB_Null;
+ self.use = func_null;
if (self.state != 4)
objerror ("plat_use: not in up state");
plat_go_down();
if(self.spawnflags & 4)
self.dmg = 10000;
- if(self.dmg && (!self.message))
+ if(self.dmg && (self.message == ""))
self.message = "was squished";
- if(self.dmg && (!self.message2))
+ if(self.dmg && (self.message2 == ""))
self.message2 = "was squished by";
if (self.sounds == 1)
self.angles = '0 0 0';
self.classname = "plat";
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
self.effects |= EF_LOWPRECISION;
setsize (self, self.mins , self.maxs);
if(self.platmovetype_turn && !self.train_wait_turning)
{
entity targ, cp;
- vector org;
+ vector ang;
targ = find(world, targetname, self.target);
if((self.spawnflags & 1) && targ.curvetarget)
cp = find(world, targetname, targ.curvetarget);
cp = world;
if(cp) // bezier curves movement
- org = vectoangles(cp.origin - (self.origin + self.mins)); // use the origin of the control point of the next path_corner
+ ang = cp.origin - (self.origin - self.view_ofs); // use the origin of the control point of the next path_corner
else // linear movement
- org = vectoangles(targ.origin - (self.origin + self.mins)); // use the origin of the next path_corner
- org_x = -org_x; // flip up / down orientation
+ ang = targ.origin - (self.origin - self.view_ofs); // use the origin of the next path_corner
+ ang = vectoangles(ang);
+ ang_x = -ang_x; // flip up / down orientation
- if(self.wait >= 0) // slow turning
- {
- SUB_CalcAngleMove(org, TSPEED_TIME, self.ltime - time + self.wait, train_wait);
- self.train_wait_turning = TRUE;
- return;
- }
+ if(self.wait > 0) // slow turning
+ SUB_CalcAngleMove(ang, TSPEED_TIME, self.ltime - time + self.wait, train_wait);
else // instant turning
- self.angles = org;
+ SUB_CalcAngleMove(ang, TSPEED_TIME, 0.0000001, train_wait);
+ self.train_wait_turning = TRUE;
+ return;
}
if(self.noise != "")
void train_next()
{
- entity targ, cp;
- vector cp_org;
+ entity targ, cp = world;
+ vector cp_org = '0 0 0';
targ = find(world, targetname, self.target);
self.target = targ.target;
if(targ.curvetarget)
{
cp = find(world, targetname, targ.curvetarget); // get its second target (the control point)
- cp_org = cp.origin - self.mins; // no control point found, assume a straight line to the destination
+ cp_org = cp.origin - self.view_ofs; // no control point found, assume a straight line to the destination
}
- else
- cp = world; // no cp
}
- if (!self.target)
+ if (self.target == "")
objerror("train_next: no next target");
self.wait = targ.wait;
if (!self.wait)
if (targ.speed)
{
if (cp)
- SUB_CalcMove_Bezier(cp_org, targ.origin - self.mins, TSPEED_LINEAR, targ.speed, train_wait);
+ SUB_CalcMove_Bezier(cp_org, targ.origin - self.view_ofs, TSPEED_LINEAR, targ.speed, train_wait);
else
- SUB_CalcMove(targ.origin - self.mins, TSPEED_LINEAR, targ.speed, train_wait);
+ SUB_CalcMove(targ.origin - self.view_ofs, TSPEED_LINEAR, targ.speed, train_wait);
}
else
{
if (cp)
- SUB_CalcMove_Bezier(cp_org, targ.origin - self.mins, TSPEED_LINEAR, self.speed, train_wait);
+ SUB_CalcMove_Bezier(cp_org, targ.origin - self.view_ofs, TSPEED_LINEAR, self.speed, train_wait);
else
- SUB_CalcMove(targ.origin - self.mins, TSPEED_LINEAR, self.speed, train_wait);
+ SUB_CalcMove(targ.origin - self.view_ofs, TSPEED_LINEAR, self.speed, train_wait);
}
if(self.noise != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
+ sound(self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_IDLE);
}
void func_train_find()
entity targ;
targ = find(world, targetname, self.target);
self.target = targ.target;
- if (!self.target)
+ if (self.target == "")
objerror("func_train_find: no next target");
- setorigin(self, targ.origin - self.mins);
+ setorigin(self, targ.origin - self.view_ofs);
self.nextthink = self.ltime + 1;
self.think = train_next;
}
if (self.noise != "")
precache_sound(self.noise);
- if (!self.target)
+ if (self.target == "")
objerror("func_train without a target");
if (!self.speed)
self.speed = 100;
+
if (self.spawnflags & 2)
+ {
self.platmovetype_turn = TRUE;
+ self.view_ofs = '0 0 0'; // don't offset a rotating train, origin works differently now
+ }
+ else
+ self.view_ofs = self.mins;
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
self.effects |= EF_LOWPRECISION;
InitializeEntity(self, func_train_find, INITPRIO_SETLOCATION);
self.blocked = generic_plat_blocked;
- if(self.dmg & (!self.message))
+ if(self.dmg && (self.message == ""))
self.message = " was squished";
- if(self.dmg && (!self.message2))
+ if(self.dmg && (self.message2 == ""))
self.message2 = "was squished by";
if(self.dmg && (!self.dmgtime))
self.dmgtime = 0.25;
if (self.noise != "")
{
precache_sound(self.noise);
- ambientsound(self.origin, self.noise, VOL_BASE, ATTN_IDLE);
+ ambientsound(self.origin, self.noise, VOL_BASE, ATTEN_IDLE);
}
self.active = ACTIVE_ACTIVE;
self.pos1 = self.avelocity;
- if(self.dmg & (!self.message))
+ if(self.dmg && (self.message == ""))
self.message = " was squished";
- if(self.dmg && (!self.message2))
+ if(self.dmg && (self.message2 == ""))
self.message2 = "was squished by";
self.dmgtime2 = time;
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
// no EF_LOWPRECISION here, as rounding angles is bad
// wait for targets to spawn
self.nextthink = self.ltime + 999999999;
- self.think = SUB_Null;
+ self.think = SUB_NullThink; // for PushMove
// TODO make a reset function for this one
}
vector v;
self.nextthink = time + 0.1;
- if not (self.owner.active == ACTIVE_ACTIVE)
+ if (!(self.owner.active == ACTIVE_ACTIVE))
{
self.owner.velocity = '0 0 0';
return;
if (self.noise != "")
{
precache_sound(self.noise);
- soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
+ soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_IDLE);
}
if (!self.speed)
self.speed = 4;
// damage when blocked
self.blocked = generic_plat_blocked;
- if(self.dmg & (!self.message))
+ if(self.dmg && (self.message == ""))
self.message = " was squished";
- if(self.dmg && (!self.message2))
+ if(self.dmg && (self.message2 == ""))
self.message2 = "was squished by";
if(self.dmg && (!self.dmgtime))
self.dmgtime = 0.25;
else // Z
self.movedir = '0 0 1' * self.height;
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
// wait for targets to spawn
controller.nextthink = time + 1;
controller.think = func_bobbing_controller_think;
self.nextthink = self.ltime + 999999999;
- self.think = SUB_Null;
+ self.think = SUB_NullThink; // for PushMove
// Savage: Reduce bandwith, critical on e.g. nexdm02
self.effects |= EF_LOWPRECISION;
float v;
self.nextthink = time + 0.1;
- if not (self.owner.active == ACTIVE_ACTIVE)
+ if (!(self.owner.active == ACTIVE_ACTIVE))
{
self.owner.avelocity_x = 0;
return;
if (self.noise != "")
{
precache_sound(self.noise);
- soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
+ soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_IDLE);
}
self.active = ACTIVE_ACTIVE;
self.speed = 30;
// not initializing self.dmg to 2, to allow damageless pendulum
- if(self.dmg & (!self.message))
+ if(self.dmg && (self.message == ""))
self.message = " was squished";
- if(self.dmg && (!self.message2))
+ if(self.dmg && (self.message2 == ""))
self.message2 = "was squished by";
if(self.dmg && (!self.dmgtime))
self.dmgtime = 0.25;
self.blocked = generic_plat_blocked;
self.avelocity_z = 0.0000001;
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
if(!self.freq)
controller.nextthink = time + 1;
controller.think = func_pendulum_controller_think;
self.nextthink = self.ltime + 999999999;
- self.think = SUB_Null;
+ self.think = SUB_NullThink; // for PushMove
//self.effects |= EF_LOWPRECISION;
return;
if (self.noise != "")
- sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
self.state = STATE_UP;
SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, button_wait);
void button_use()
{
-// if (activator.classname != "player")
-// {
-// dprint(activator.classname);
-// dprint(" triggered a button\n");
-// }
-
- if not (self.active == ACTIVE_ACTIVE)
+ if (!(self.active == ACTIVE_ACTIVE))
return;
self.enemy = activator;
void button_touch()
{
-// if (activator.classname != "player")
-// {
-// dprint(activator.classname);
-// dprint(" touched a button\n");
-// }
if (!other)
return;
- if not(other.iscreature)
+ if (!other.iscreature)
return;
if(other.velocity * self.movedir < 0)
return;
self.health = self.health - damage;
if (self.health <= 0)
{
- // if (activator.classname != "player")
- // {
- // dprint(activator.classname);
- // dprint(" killed a button\n");
- // }
self.enemy = damage_attacker;
button_fire ();
}
{
SetMovedir ();
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
self.effects |= EF_LOWPRECISION;
}
-float DOOR_START_OPEN = 1;
-float DOOR_DONT_LINK = 4;
-float DOOR_TOGGLE = 32;
+const float DOOR_START_OPEN = 1;
+const float DOOR_DONT_LINK = 4;
+const float DOOR_TOGGLE = 32;
/*
void door_hit_top()
{
if (self.noise1 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
self.state = STATE_TOP;
if (self.spawnflags & DOOR_TOGGLE)
return; // don't come down automatically
void door_hit_bottom()
{
if (self.noise1 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
self.state = STATE_BOTTOM;
}
void door_go_down()
{
if (self.noise2 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
if (self.max_health)
{
self.takedamage = DAMAGE_YES;
}
if (self.noise2 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
self.state = STATE_UP;
SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, door_hit_top);
door = self;
// no key needed
- if not(door.itemkeys)
+ if (!door.itemkeys)
return TRUE;
// this door require a key
// only a player can have a key
- if (other.classname != "player")
+ if (!IS_PLAYER(other))
return FALSE;
if (item_keys_usekey(door, other)) {
void door_trigger_touch()
{
if (other.health < 1)
- if not(other.iscreature && other.deadflag == DEAD_NO)
+ if (!(other.iscreature && other.deadflag == DEAD_NO))
return;
if (time < self.attack_finished_single)
*/
void door_touch()
{
- if(other.classname != "player")
+ if (!IS_PLAYER(other))
return;
if (self.owner.attack_finished_single > time)
return;
if (!(self.owner.dmg) && (self.owner.message != ""))
{
- if (other.flags & FL_CLIENT)
+ if (IS_CLIENT(other))
centerprint (other, self.owner.message);
play2(other, "misc/talk.wav");
}
void door_rotating_hit_top()
{
if (self.noise1 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
self.state = STATE_TOP;
if (self.spawnflags & DOOR_TOGGLE)
return; // don't come down automatically
void door_rotating_hit_bottom()
{
if (self.noise1 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
if (self.lip==666) // self.lip is used to remember reverse opening direction for door_rotating
{
self.pos2 = '0 0 0' - self.pos2;
void door_rotating_go_down()
{
if (self.noise2 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
if (self.max_health)
{
self.takedamage = DAMAGE_YES;
return;
}
if (self.noise2 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
self.state = STATE_UP;
SUB_CalcAngleMove (self.pos2, TSPEED_LINEAR, self.speed, door_rotating_hit_top);
}
-float EntitiesTouching(entity e1, entity e2)
+entity LinkDoors_nextent(entity cur, entity near, entity pass)
{
- if (e1.absmin_x > e2.absmax_x)
+ while((cur = find(cur, classname, self.classname)) && ((cur.spawnflags & 4) || cur.enemy))
+ {
+ }
+ return cur;
+}
+
+float LinkDoors_isconnected(entity e1, entity e2, entity pass)
+{
+ float DELTA = 4;
+ if (e1.absmin_x > e2.absmax_x + DELTA)
return FALSE;
- if (e1.absmin_y > e2.absmax_y)
+ if (e1.absmin_y > e2.absmax_y + DELTA)
return FALSE;
- if (e1.absmin_z > e2.absmax_z)
+ if (e1.absmin_z > e2.absmax_z + DELTA)
return FALSE;
- if (e1.absmax_x < e2.absmin_x)
+ if (e2.absmin_x > e1.absmax_x + DELTA)
return FALSE;
- if (e1.absmax_y < e2.absmin_y)
+ if (e2.absmin_y > e1.absmax_y + DELTA)
return FALSE;
- if (e1.absmax_z < e2.absmin_z)
+ if (e2.absmin_z > e1.absmax_z + DELTA)
return FALSE;
return TRUE;
}
-
/*
=============
LinkDoors
*/
void LinkDoors()
{
- entity t, starte;
+ entity t;
vector cmins, cmaxs;
if (self.enemy)
return; // don't want to link this door
}
- cmins = self.absmin;
- cmaxs = self.absmax;
-
- starte = self;
- t = self;
+ FindConnectedComponent(self, enemy, LinkDoors_nextent, LinkDoors_isconnected, world);
- do
+ // set owner, and make a loop of the chain
+ dprint("LinkDoors: linking doors:");
+ for(t = self; ; t = t.enemy)
{
- self.owner = starte; // master door
-
- if (self.health)
- starte.health = self.health;
- IFTARGETED
- starte.targetname = self.targetname;
- if (self.message != "")
- starte.message = self.message;
-
- t = find(t, classname, self.classname);
- if (!t)
+ dprint(" ", etos(t));
+ t.owner = self;
+ if(t.enemy == world)
{
- self.enemy = starte; // make the chain a loop
-
- // shootable, or triggered doors just needed the owner/enemy links,
- // they don't spawn a field
-
- self = self.owner;
-
- if (self.health)
- return;
- IFTARGETED
- return;
- if (self.items)
- return;
+ t.enemy = self;
+ break;
+ }
+ }
+ dprint("\n");
- self.owner.trigger_field = spawn_field(cmins, cmaxs);
+ // collect health, targetname, message, size
+ cmins = self.absmin;
+ cmaxs = self.absmax;
+ for(t = self; ; t = t.enemy)
+ {
+ if(t.health && !self.health)
+ self.health = t.health;
+ if((t.targetname != "") && (self.targetname == ""))
+ self.targetname = t.targetname;
+ if((t.message != "") && (self.message == ""))
+ self.message = t.message;
+ if (t.absmin_x < cmins_x)
+ cmins_x = t.absmin_x;
+ if (t.absmin_y < cmins_y)
+ cmins_y = t.absmin_y;
+ if (t.absmin_z < cmins_z)
+ cmins_z = t.absmin_z;
+ if (t.absmax_x > cmaxs_x)
+ cmaxs_x = t.absmax_x;
+ if (t.absmax_y > cmaxs_y)
+ cmaxs_y = t.absmax_y;
+ if (t.absmax_z > cmaxs_z)
+ cmaxs_z = t.absmax_z;
+ if(t.enemy == self)
+ break;
+ }
+
+ // distribute health, targetname, message
+ for(t = self; t; t = t.enemy)
+ {
+ t.health = self.health;
+ t.targetname = self.targetname;
+ t.message = self.message;
+ if(t.enemy == self)
+ break;
+ }
- return;
- }
+ // shootable, or triggered doors just needed the owner/enemy links,
+ // they don't spawn a field
- if (EntitiesTouching(self,t))
- {
- if (t.enemy)
- objerror ("cross connected doors");
-
- self.enemy = t;
- self = t;
-
- if (t.absmin_x < cmins_x)
- cmins_x = t.absmin_x;
- if (t.absmin_y < cmins_y)
- cmins_y = t.absmin_y;
- if (t.absmin_z < cmins_z)
- cmins_z = t.absmin_z;
- if (t.absmax_x > cmaxs_x)
- cmaxs_x = t.absmax_x;
- if (t.absmax_y > cmaxs_y)
- cmaxs_y = t.absmax_y;
- if (t.absmax_z > cmaxs_z)
- cmaxs_z = t.absmax_z;
- }
- } while (1 );
+ if (self.health)
+ return;
+ IFTARGETED
+ return;
+ if (self.items)
+ return;
+ self.trigger_field = spawn_field(cmins, cmaxs);
}
setorigin(self, self.pos1);
self.velocity = '0 0 0';
self.state = STATE_BOTTOM;
- self.think = SUB_Null;
+ self.think = func_null;
+ self.nextthink = 0;
}
// spawnflags require key (for now only func_door)
SetMovedir ();
self.max_health = self.health;
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
self.effects |= EF_LOWPRECISION;
self.classname = "door";
// if(self.spawnflags & 8)
// self.dmg = 10000;
- if(self.dmg && (!self.message))
+ if(self.dmg && (self.message == ""))
self.message = "was squished";
- if(self.dmg && (!self.message2))
+ if(self.dmg && (self.message2 == ""))
self.message2 = "was squished by";
if (self.sounds > 0)
self.angles = self.pos1;
self.avelocity = '0 0 0';
self.state = STATE_BOTTOM;
- self.think = SUB_Null;
+ self.think = func_null;
+ self.nextthink = 0;
}
void door_rotating_init_startopen()
self.max_health = self.health;
self.avelocity = self.movedir;
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
self.velocity = '0 0 0';
//self.effects |= EF_LOWPRECISION;
if(self.spawnflags & 8)
self.dmg = 10000;
- if(self.dmg && (!self.message))
+ if(self.dmg && (self.message == ""))
self.message = "was squished";
- if(self.dmg && (!self.message2))
+ if(self.dmg && (self.message2 == ""))
self.message2 = "was squished by";
if (self.sounds > 0)
void() fd_secret_move6;
void() fd_secret_done;
-float SECRET_OPEN_ONCE = 1; // stays open
-float SECRET_1ST_LEFT = 2; // 1st move is left of arrow
-float SECRET_1ST_DOWN = 4; // 1st move is down from arrow
-float SECRET_NO_SHOOT = 8; // only opened by trigger
-float SECRET_YES_SHOOT = 16; // shootable even if targeted
-
+const float SECRET_OPEN_ONCE = 1; // stays open
+const float SECRET_1ST_LEFT = 2; // 1st move is left of arrow
+const float SECRET_1ST_DOWN = 4; // 1st move is down from arrow
+const float SECRET_NO_SHOOT = 8; // only opened by trigger
+const float SECRET_YES_SHOOT = 16; // shootable even if targeted
void fd_secret_use()
{
// Make a sound, wait a little...
if (self.noise1 != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
self.nextthink = self.ltime + 0.1;
temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1
self.dest2 = self.dest1 + v_forward * self.t_length;
SUB_CalcMove(self.dest1, TSPEED_LINEAR, self.speed, fd_secret_move1);
if (self.noise2 != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+}
+
+void fd_secret_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+ fd_secret_use();
}
// Wait after first movement...
self.nextthink = self.ltime + 1.0;
self.think = fd_secret_move2;
if (self.noise3 != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
}
// Start moving sideways w/sound...
void fd_secret_move2()
{
if (self.noise2 != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
SUB_CalcMove(self.dest2, TSPEED_LINEAR, self.speed, fd_secret_move3);
}
void fd_secret_move3()
{
if (self.noise3 != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
if (!(self.spawnflags & SECRET_OPEN_ONCE))
{
self.nextthink = self.ltime + self.wait;
void fd_secret_move4()
{
if (self.noise2 != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
SUB_CalcMove(self.dest1, TSPEED_LINEAR, self.speed, fd_secret_move5);
}
self.nextthink = self.ltime + 1.0;
self.think = fd_secret_move6;
if (self.noise3 != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
}
void fd_secret_move6()
{
if (self.noise2 != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
SUB_CalcMove(self.oldorigin, TSPEED_LINEAR, self.speed, fd_secret_done);
}
//self.th_pain = fd_secret_use;
}
if (self.noise3 != "")
- sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
+ sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTEN_NORM);
}
void secret_blocked()
*/
void secret_touch()
{
- if not(other.iscreature)
+ if (!other.iscreature)
return;
if (self.attack_finished_single > time)
return;
if (self.message)
{
- if (other.flags & FL_CLIENT)
+ if (IS_CLIENT(other))
centerprint (other, self.message);
play2(other, "misc/talk.wav");
}
self.takedamage = DAMAGE_YES;
}
setorigin(self, self.oldorigin);
- self.think = SUB_Null;
+ self.think = func_null;
+ self.nextthink = 0;
}
/*QUAKED spawnfunc_func_door_secret (0 .5 .8) ? open_once 1st_left 1st_down no_shoot always_shoot
self.mangle = self.angles;
self.angles = '0 0 0';
self.classname = "door";
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
self.effects |= EF_LOWPRECISION;
{
self.health = 10000;
self.takedamage = DAMAGE_YES;
- self.event_damage = fd_secret_use;
+ self.event_damage = fd_secret_damage;
}
self.oldorigin = self.origin;
if (!self.wait)
float n, i, t;
self.nextthink = time + 0.1;
- if not (self.owner.active == ACTIVE_ACTIVE)
+ if (!(self.owner.active == ACTIVE_ACTIVE))
{
self.owner.velocity = '0 0 0';
return;
if (self.noise != "")
{
precache_sound(self.noise);
- soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
+ soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_IDLE);
}
if (!self.speed)
self.cnt = 360 / self.speed;
self.blocked = generic_plat_blocked;
- if(self.dmg & (!self.message))
+ if(self.dmg && (self.message == ""))
self.message = " was squished";
- if(self.dmg && (!self.message2))
+ if(self.dmg && (self.message2 == ""))
self.message2 = "was squished by";
if(self.dmg && (!self.dmgtime))
self.dmgtime = 0.25;
if(self.netname == "")
self.netname = "1 0 0 0 1";
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
self.active = ACTIVE_ACTIVE;
controller.nextthink = time + 1;
controller.think = func_fourier_controller_think;
self.nextthink = self.ltime + 999999999;
- self.think = SUB_Null;
+ self.think = SUB_NullThink; // for PushMove
// Savage: Reduce bandwith, critical on e.g. nexdm02
self.effects |= EF_LOWPRECISION;
{
self.nextthink = time + 0.1;
- if not (self.owner.active == ACTIVE_ACTIVE)
+ if (!(self.owner.active == ACTIVE_ACTIVE))
{
self.owner.velocity = '0 0 0';
return;
if(!self.wp00 && !self.wp01 && !self.wp02 && !self.wp03)
objerror("No reference entity found, so there is nothing to move. Aborting.");
- self.destvec = self.origin - func_vectormamamam_origin(self.owner, 0);
+ self.destvec = self.origin - func_vectormamamam_origin(self, 0);
entity controller;
controller = spawn();
if (self.noise != "")
{
precache_sound(self.noise);
- soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
+ soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTEN_IDLE);
}
if(!self.targetfactor)
self.target4normal = normalize(self.target4normal);
self.blocked = generic_plat_blocked;
- if(self.dmg & (!self.message))
+ if(self.dmg && (self.message == ""))
self.message = " was squished";
- if(self.dmg && (!self.message2))
+ if(self.dmg && (self.message == ""))
self.message2 = "was squished by";
if(self.dmg && (!self.dmgtime))
self.dmgtime = 0.25;
if(self.netname == "")
self.netname = "1 0 0 0 1";
- if not(InitMovingBrushTrigger())
+ if (!InitMovingBrushTrigger())
return;
// wait for targets to spawn
self.nextthink = self.ltime + 999999999;
- self.think = SUB_Null;
+ self.think = SUB_NullThink; // for PushMove
// Savage: Reduce bandwith, critical on e.g. nexdm02
self.effects |= EF_LOWPRECISION;
for(e = world; (e = findentity(e, conveyor, self)); )
{
- if(e.flags & FL_CLIENT) // doing it via velocity has quite some advantages
+ if(IS_CLIENT(e)) // doing it via velocity has quite some advantages
continue; // done in SV_PlayerPhysics
setorigin(e, e.origin + self.movedir * sys_frametime);