void() door_rotating_go_up;
void door_blocked()
-{
- if((self.spawnflags & 8)
+{SELFPARAM();
+ if((self.spawnflags & 8)
#ifdef SVQC
&& (other.takedamage != DAMAGE_NO)
#elif defined(CSQC)
}
void door_hit_top()
-{
+{SELFPARAM();
if (self.noise1 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_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
if (self.classname == "door")
{
- self.think = door_go_down;
+ self.SUB_THINK = door_go_down;
} else
{
- self.think = door_rotating_go_down;
+ self.SUB_THINK = door_rotating_go_down;
}
- trigger_setnextthink(self, self.ltime + self.wait);
+ self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
}
void door_hit_bottom()
-{
+{SELFPARAM();
if (self.noise1 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
+ _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM);
self.state = STATE_BOTTOM;
}
void door_go_down()
-{
+{SELFPARAM();
if (self.noise2 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+ _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
if (self.max_health)
{
self.takedamage = DAMAGE_YES;
}
void door_go_up()
-{
+{SELFPARAM();
if (self.state == STATE_UP)
return; // already going up
if (self.state == STATE_TOP)
{ // reset top wait time
- trigger_setnextthink(self, self.ltime + self.wait);
+ self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
return;
}
if (self.noise2 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_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);
*/
float door_check_keys(void)
-{
+{SELFPARAM();
local entity door;
if (other.key_door_messagetime <= time)
{
- play2(other, "misc/talk.wav");
+ play2(other, SND(TALK));
Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_ALSONEED, item_keys_keylist(door.itemkeys));
other.key_door_messagetime = time + 2;
}
// no keys were used
if (other.key_door_messagetime <= time)
{
- play2(other, "misc/talk.wav");
+ play2(other, SND(TALK));
Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_NEED, item_keys_keylist(door.itemkeys));
other.key_door_messagetime = time + 2;
{
#ifdef SVQC
// door is now unlocked
- play2(other, "misc/talk.wav");
+ play2(other, SND(TALK));
Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_UNLOCKED);
#endif
return true;
}
void door_fire()
-{
- entity oself;
+{SELFPARAM();
entity starte;
if (self.owner != self)
objerror ("door_fire: self.owner != self");
- oself = self;
-
if (self.spawnflags & DOOR_TOGGLE)
{
if (self.state == STATE_UP || self.state == STATE_TOP)
{
door_rotating_go_down ();
}
- self = self.enemy;
+ setself(self.enemy);
} while ( (self != starte) && (self != world) );
- self = oself;
+ setself(this);
return;
}
}
door_rotating_go_up ();
}
}
- self = self.enemy;
+ setself(self.enemy);
} while ( (self != starte) && (self != world) );
- self = oself;
+ setself(this);
}
void door_use()
-{
- entity oself;
-
+{SELFPARAM();
//dprint("door_use (model: ");dprint(self.model);dprint(")\n");
if (self.owner)
{
- oself = self;
- self = self.owner;
- door_fire ();
- self = oself;
+ WITH(entity, self, self.owner, door_fire());
}
}
-void door_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
- entity oself;
+void door_damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
+{SELFPARAM();
if(self.spawnflags & DOOR_NOSPLASH)
if(!(DEATH_ISSPECIAL(deathtype)) && (deathtype & HITTYPE_SPLASH))
return;
if (self.health <= 0)
{
- oself = self;
- self = self.owner;
- self.health = self.max_health;
- self.takedamage = DAMAGE_NO; // wil be reset upon return
- door_use ();
- self = oself;
+ self.owner.health = self.owner.max_health;
+ self.owner.takedamage = DAMAGE_NO; // wil be reset upon return
+ WITH(entity, self, self.owner, door_use());
}
}
*/
void door_touch()
-{
+{SELFPARAM();
if (!IS_PLAYER(other))
return;
if (self.owner.attack_finished_single > time)
{
if (IS_CLIENT(other))
centerprint(other, self.owner.message);
- play2(other, "misc/talk.wav");
+ play2(other, SND(TALK));
}
#endif
}
void door_generic_plat_blocked()
-{
+{SELFPARAM();
if((self.spawnflags & 8) && (other.takedamage != DAMAGE_NO)) { // KIll Kill Kill!!
#ifdef SVQC
}
void door_rotating_hit_top()
-{
+{SELFPARAM();
if (self.noise1 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_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
- self.think = door_rotating_go_down;
- self.nextthink = self.ltime + self.wait;
+ self.SUB_THINK = door_rotating_go_down;
+ self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
}
void door_rotating_hit_bottom()
-{
+{SELFPARAM();
if (self.noise1 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_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()
-{
+{SELFPARAM();
if (self.noise2 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
+ _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM);
if (self.max_health)
{
self.takedamage = DAMAGE_YES;
}
void door_rotating_go_up()
-{
+{SELFPARAM();
if (self.state == STATE_UP)
return; // already going up
if (self.state == STATE_TOP)
{ // reset top wait time
- trigger_setnextthink(self, self.ltime + self.wait);
+ self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
return;
}
if (self.noise2 != "")
- sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_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);
*/
void door_trigger_touch()
-{
+{SELFPARAM();
if (other.health < 1)
#ifdef SVQC
if (!((other.iscreature || (other.flags & FL_PROJECTILE)) && !PHYS_DEAD(other)))
activator = other;
- self = self.owner;
+ setself(self.owner);
door_use ();
}
void spawn_field(vector fmins, vector fmaxs)
-{
+{SELFPARAM();
entity trigger;
vector t1 = fmins, t2 = fmaxs;
*/
entity LinkDoors_nextent(entity cur, entity near, entity pass)
-{
+{SELFPARAM();
while((cur = find(cur, classname, self.classname)) && ((cur.spawnflags & 4) || cur.enemy))
{
}
void door_link();
#endif
void LinkDoors()
-{
+{SELFPARAM();
entity t;
vector cmins, cmaxs;
FindConnectedComponent(self, enemy, LinkDoors_nextent, LinkDoors_isconnected, world);
// set owner, and make a loop of the chain
- dprint("LinkDoors: linking doors:");
+ LOG_TRACE("LinkDoors: linking doors:");
for(t = self; ; t = t.enemy)
{
- dprint(" ", etos(t));
+ LOG_TRACE(" ", etos(t));
t.owner = self;
if(t.enemy == world)
{
break;
}
}
- dprint("\n");
+ LOG_TRACE("\n");
// collect health, targetname, message, size
cmins = self.absmin;
*/
float door_send(entity to, float sf)
-{
+{SELFPARAM();
WriteByte(MSG_ENTITY, ENT_CLIENT_DOOR);
WriteByte(MSG_ENTITY, sf);
WriteString(MSG_ENTITY, self.classname);
WriteByte(MSG_ENTITY, self.spawnflags);
- WriteByte(MSG_ENTITY, self.scale);
-
- WriteCoord(MSG_ENTITY, self.origin_x);
- WriteCoord(MSG_ENTITY, self.origin_y);
- WriteCoord(MSG_ENTITY, self.origin_z);
-
WriteString(MSG_ENTITY, self.model);
- WriteCoord(MSG_ENTITY, self.mins_x);
- WriteCoord(MSG_ENTITY, self.mins_y);
- WriteCoord(MSG_ENTITY, self.mins_z);
- WriteCoord(MSG_ENTITY, self.maxs_x);
- WriteCoord(MSG_ENTITY, self.maxs_y);
- WriteCoord(MSG_ENTITY, self.maxs_z);
-
- WriteCoord(MSG_ENTITY, self.movedir_x);
- WriteCoord(MSG_ENTITY, self.movedir_y);
- WriteCoord(MSG_ENTITY, self.movedir_z);
-
- WriteAngle(MSG_ENTITY, self.angles_x);
- WriteAngle(MSG_ENTITY, self.angles_y);
- WriteAngle(MSG_ENTITY, self.angles_z);
+ trigger_common_write(true);
WriteCoord(MSG_ENTITY, self.pos1_x);
WriteCoord(MSG_ENTITY, self.pos1_y);
WriteShort(MSG_ENTITY, self.speed);
WriteByte(MSG_ENTITY, self.lip);
WriteByte(MSG_ENTITY, self.state);
- WriteCoord(MSG_ENTITY, self.ltime);
+ WriteCoord(MSG_ENTITY, self.SUB_LTIME);
}
if(sf & SF_TRIGGER_RESET)
void door_link()
{
// set size now, as everything is loaded
- FixSize(self);
- Net_LinkEntity(self, false, 0, door_send);
+ //FixSize(self);
+ //Net_LinkEntity(self, false, 0, door_send);
}
#endif
void door_init_startopen()
-{
- setorigin (self, self.pos2);
+{SELFPARAM();
+ SUB_SETORIGIN(self, self.pos2);
self.pos2 = self.pos1;
self.pos1 = self.origin;
}
void door_reset()
-{
- setorigin(self, self.pos1);
- self.velocity = '0 0 0';
+{SELFPARAM();
+ SUB_SETORIGIN(self, self.pos1);
+ self.SUB_VELOCITY = '0 0 0';
self.state = STATE_BOTTOM;
- self.think = func_null;
- self.nextthink = 0;
+ self.SUB_THINK = func_null;
+ self.SUB_NEXTTHINK = 0;
#ifdef SVQC
self.SendFlags |= SF_TRIGGER_RESET;
#ifdef SVQC
// spawnflags require key (for now only func_door)
-void spawnfunc_func_door()
+spawnfunc(func_door)
{
// Quake 1 keys compatibility
if (self.spawnflags & SPAWNFLAGS_GOLD_KEY)
if (!self.lip)
self.lip = 8;
- self.pos1 = self.origin;
+ self.pos1 = self.SUB_ORIGIN;
self.pos2 = self.pos1 + self.movedir*(fabs(self.movedir*self.size) - self.lip);
+ if(self.spawnflags & DOOR_NONSOLID)
+ self.solid = SOLID_NOT;
+
// DOOR_START_OPEN is to allow an entity to be lighted in the closed position
// but spawn in the open position
if (self.spawnflags & DOOR_START_OPEN)
#elif defined(CSQC)
-void ent_door()
+void door_draw()
{
+ Movetype_Physics_NoMatchServer();
+
+ trigger_draw_generic();
+}
+
+void ent_door()
+{SELFPARAM();
float sf = ReadByte();
if(sf & SF_TRIGGER_INIT)
self.classname = strzone(ReadString());
self.spawnflags = ReadByte();
- self.scale = ReadByte();
-
- self.origin_x = ReadCoord();
- self.origin_y = ReadCoord();
- self.origin_z = ReadCoord();
- setorigin(self, self.origin);
-
self.mdl = strzone(ReadString());
- setmodel(self, self.mdl);
-
- self.mins_x = ReadCoord();
- self.mins_y = ReadCoord();
- self.mins_z = ReadCoord();
- self.maxs_x = ReadCoord();
- self.maxs_y = ReadCoord();
- self.maxs_z = ReadCoord();
- setsize(self, self.mins, self.maxs);
+ _setmodel(self, self.mdl);
- self.movedir_x = ReadCoord();
- self.movedir_y = ReadCoord();
- self.movedir_z = ReadCoord();
-
- self.angles_x = ReadAngle();
- self.angles_y = ReadAngle();
- self.angles_z = ReadAngle();
+ trigger_common_read(true);
self.pos1_x = ReadCoord();
self.pos1_y = ReadCoord();
self.speed = ReadShort();
self.lip = ReadByte();
self.state = ReadByte();
- self.ltime = ReadCoord();
+ self.SUB_LTIME = ReadCoord();
- self.movetype = MOVETYPE_PUSH;
self.solid = SOLID_BSP;
+ self.movetype = MOVETYPE_PUSH;
self.trigger_touch = door_touch;
- self.draw = trigger_draw_generic;
+ self.draw = door_draw;
self.drawmask = MASK_NORMAL;
- self.move_time = time;
self.use = door_use;
- self.blocked = door_blocked;
LinkDoors();
if(self.spawnflags & DOOR_START_OPEN)
door_init_startopen();
+
+ self.move_time = time;
+ self.move_origin = self.origin;
+ self.move_movetype = MOVETYPE_PUSH;
+ self.move_angles = self.angles;
+ self.move_blocked = door_blocked;
}
if(sf & SF_TRIGGER_RESET)
self.origin_y = ReadCoord();
self.origin_z = ReadCoord();
setorigin(self, self.origin);
+ self.move_origin = self.origin;
self.pos1_x = ReadCoord();
self.pos1_y = ReadCoord();