tmax_y = tmin_y + 1;
}
- setsize (trigger, tmin, tmax);
+ if(tmin_x < tmax_x)
+ if(tmin_y < tmax_y)
+ if(tmin_z < tmax_z)
+ {
+ setsize (trigger, tmin, tmax);
+ return;
+ }
+
+ // otherwise, something is fishy...
+ remove(trigger);
+ objerror("plat_spawn_inside_trigger: platform has odd size or lip, can't spawn");
}
void plat_hit_top()
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.pos2 = self.origin;
self.pos2_z = self.origin_z - self.height;
- plat_spawn_inside_trigger (); // the "start moving" trigger
-
self.reset = plat_reset;
plat_reset();
+
+ plat_spawn_inside_trigger (); // the "start moving" trigger
}
targ = find(world, targetname, self.target);
self.enemy = targ;
self.target = targ.target;
- if (!self.target)
+ if (self.target == "")
objerror("train_next: no next target");
self.wait = targ.wait;
if (!self.wait)
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);
self.nextthink = self.ltime + 1;
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;
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;
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";
// 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
}
// 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;
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;
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;
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;
}
-float EntitiesTouching(entity e1, entity e2)
+entity LinkDoors_nextent(entity cur, entity near, entity pass)
+{
+ while((cur = find(cur, classname, self.classname)) && ((cur.spawnflags & 4) || cur.enemy))
+ {
+ }
+ return cur;
+}
+
+float LinkDoors_isconnected(entity e1, entity e2, entity pass)
{
- if (e1.absmin_x > e2.absmax_x)
+ 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;
+ t.enemy = self;
+ break;
+ }
+ }
+ dprint("\n");
- if (self.health)
- return;
- IFTARGETED
- return;
- if (self.items)
- return;
+ // 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;
+ }
- self.owner.trigger_field = spawn_field(cmins, cmaxs);
+ // 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)
// 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()
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)
float SECRET_NO_SHOOT = 8; // only opened by trigger
float SECRET_YES_SHOOT = 16; // shootable even if targeted
-
void fd_secret_use()
{
float temp;
sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
}
+void fd_secret_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+ fd_secret_use();
+}
+
// Wait after first movement...
void fd_secret_move1()
{
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.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)
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;
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;
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();
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;
// 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;
if(self.state)
{
- for(e = findradius((self.absmin + self.absmax) * 0.5, vlen(self.absmax - self.absmin) * 0.5); e; e = e.chain)
+ for(e = findradius((self.absmin + self.absmax) * 0.5, vlen(self.absmax - self.absmin) * 0.5 + 1); e; e = e.chain)
if(!e.conveyor.state)
if(isPushable(e))
{