#ifdef SVQC
&& (other.takedamage != DAMAGE_NO)
#elif defined(CSQC)
- && !PHYS_DEAD(other)
+ && !IS_DEAD(other)
#endif
)
{ // KIll Kill Kill!!
#ifdef SVQC
- Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+ Damage (other, self, self, 10000, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0');
#endif
}
else
{
#ifdef SVQC
if((self.dmg) && (other.takedamage == DAMAGE_YES)) // Shall we bite?
- Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+ Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0');
#endif
// don't change direction for dead or dying stuff
- if(PHYS_DEAD(other)
+ if(IS_DEAD(other)
#ifdef SVQC
&& (other.takedamage == DAMAGE_NO)
#endif
{
//gib dying stuff just to make sure
if((self.dmg) && (other.takedamage != DAMAGE_NO)) // Shall we bite?
- Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+ Damage (other, self, self, 10000, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0');
}
#endif
}
string oldmessage;
oldmessage = self.message;
self.message = "";
- SUB_UseTargets();
+ SUB_UseTargets(self, NULL, NULL);
self.message = oldmessage;
}
=============================================================================
*/
-float door_check_keys(void)
-{SELFPARAM();
- local entity door;
-
-
- if (self.owner)
- door = self.owner;
- else
- door = self;
+bool door_check_keys(entity door, entity player)
+{
+ if(door.owner)
+ door = door.owner;
// no key needed
- if (!door.itemkeys)
+ if(!door.itemkeys)
return true;
// this door require a key
// only a player can have a key
- if (!IS_PLAYER(other))
+ if(!IS_PLAYER(player))
return false;
-#ifdef SVQC
- if (item_keys_usekey(door, other))
- {
- // some keys were used
- if (other.key_door_messagetime <= time)
- {
+ int valid = (door.itemkeys & player.itemkeys);
+ door.itemkeys &= ~valid; // only some of the needed keys were given
- 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;
- }
+ if(!door.itemkeys)
+ {
+#ifdef SVQC
+ play2(player, SND(TALK));
+ Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_DOOR_UNLOCKED);
+#endif
+ return true;
}
- else
+
+ if(!valid)
{
- // no keys were used
- if (other.key_door_messagetime <= time)
+#ifdef SVQC
+ if(player.key_door_messagetime <= time)
{
- 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;
+ play2(player, door.noise3);
+ Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_DOOR_LOCKED_NEED, item_keys_keylist(door.itemkeys));
+ player.key_door_messagetime = time + 2;
}
- }
#endif
+ return false;
+ }
- if (door.itemkeys)
- {
+ // door needs keys the player doesn't have
#ifdef SVQC
- // door is now unlocked
- play2(other, SND(TALK));
- Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_UNLOCKED);
-#endif
- return true;
+ if(player.key_door_messagetime <= time)
+ {
+ play2(player, door.noise3);
+ Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_DOOR_LOCKED_ALSONEED, item_keys_keylist(door.itemkeys));
+ player.key_door_messagetime = time + 2;
}
- else
- return false;
-}
+#endif
-void door_fire()
-{SELFPARAM();
- entity starte;
+ return false;
+}
- if (self.owner != self)
- objerror ("door_fire: self.owner != self");
+void door_fire(entity this, entity actor, entity trigger)
+{
+ entity starte;
+ if (this.owner != this)
+ objerror ("door_fire: this.owner != this");
- if (self.spawnflags & DOOR_TOGGLE)
+ if (this.spawnflags & DOOR_TOGGLE)
{
- if (self.state == STATE_UP || self.state == STATE_TOP)
+ if (this.state == STATE_UP || this.state == STATE_TOP)
{
starte = self;
do
setself(this);
}
-void door_use()
-{SELFPARAM();
+void door_use(entity this, entity actor, entity trigger)
+{
//dprint("door_use (model: ");dprint(self.model);dprint(")\n");
- if (self.owner)
- {
- WITH(entity, self, self.owner, door_fire());
- }
+ if (this.owner)
+ WITHSELF(this.owner, door_fire(this.owner, actor, trigger));
}
-void door_damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
-{SELFPARAM();
- if(self.spawnflags & DOOR_NOSPLASH)
+void door_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
+{
+ if(this.spawnflags & DOOR_NOSPLASH)
if(!(DEATH_ISSPECIAL(deathtype)) && (deathtype & HITTYPE_SPLASH))
return;
- self.health = self.health - damage;
+ this.health = this.health - damage;
- if (self.itemkeys)
+ if (this.itemkeys)
{
// don't allow opening doors through damage if keys are required
return;
}
- if (self.health <= 0)
+ if (this.health <= 0)
{
- self.owner.health = self.owner.max_health;
- self.owner.takedamage = DAMAGE_NO; // wil be reset upon return
- WITH(entity, self, self.owner, door_use());
+ this.owner.health = this.owner.max_health;
+ this.owner.takedamage = DAMAGE_NO; // wil be reset upon return
+ door_use(this.owner, NULL, NULL);
}
}
+.float door_finished;
/*
================
{SELFPARAM();
if (!IS_PLAYER(other))
return;
- if (self.owner.attack_finished_single > time)
+ if (self.owner.door_finished > time)
return;
- self.owner.attack_finished_single = time + 2;
+ self.owner.door_finished = time + 2;
#ifdef SVQC
if (!(self.owner.dmg) && (self.owner.message != ""))
{
if (IS_CLIENT(other))
centerprint(other, self.owner.message);
- play2(other, SND(TALK));
+ play2(other, self.owner.noise);
}
#endif
}
if((self.spawnflags & 8) && (other.takedamage != DAMAGE_NO)) { // KIll Kill Kill!!
#ifdef SVQC
- Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+ Damage (other, self, self, 10000, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0');
#endif
}
else
#ifdef SVQC
if((self.dmg) && (other.takedamage == DAMAGE_YES)) // Shall we bite?
- Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+ Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0');
#endif
//Dont chamge direction for dead or dying stuff
- if(PHYS_DEAD(other) && (other.takedamage == DAMAGE_NO))
+ if(IS_DEAD(other) && (other.takedamage == DAMAGE_NO))
{
if (self.wait >= 0)
{
{
//gib dying stuff just to make sure
if((self.dmg) && (other.takedamage != DAMAGE_NO)) // Shall we bite?
- Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0');
+ Damage (other, self, self, 10000, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0');
}
#endif
}
string oldmessage;
oldmessage = self.message;
self.message = "";
- SUB_UseTargets();
+ SUB_UseTargets(self, NULL, other); // TODO: is other needed here?
self.message = oldmessage;
}
{SELFPARAM();
if (other.health < 1)
#ifdef SVQC
- if (!((other.iscreature || (other.flags & FL_PROJECTILE)) && !PHYS_DEAD(other)))
+ if (!((other.iscreature || (other.flags & FL_PROJECTILE)) && !IS_DEAD(other)))
#elif defined(CSQC)
- if(!((IS_CLIENT(other) || other.classname == "csqcprojectile") && !PHYS_DEAD(other)))
+ if(!((IS_CLIENT(other) || other.classname == "csqcprojectile") && !IS_DEAD(other)))
#endif
return;
- if (time < self.attack_finished_single)
+ if (time < self.door_finished)
return;
// check if door is locked
- if (!door_check_keys())
+ if (!door_check_keys(self, other))
return;
- self.attack_finished_single = time + 1;
-
- activator = other;
+ self.door_finished = time + 1;
- setself(self.owner);
- door_use ();
+ door_use(this.owner, other, NULL);
}
-void spawn_field(vector fmins, vector fmaxs)
+void door_spawnfield(vector fmins, vector fmaxs)
{SELFPARAM();
entity trigger;
vector t1 = fmins, t2 = fmaxs;
- trigger = spawn();
- trigger.classname = "doortriggerfield";
+ trigger = new(doortriggerfield);
trigger.movetype = MOVETYPE_NONE;
trigger.solid = SOLID_TRIGGER;
trigger.owner = self;
#ifdef SVQC
void door_link();
#endif
-void LinkDoors()
-{SELFPARAM();
+void LinkDoors(entity this)
+{
entity t;
vector cmins, cmaxs;
if (self.items)
return;
- spawn_field(self.absmin, self.absmax);
+ door_spawnfield(self.absmin, self.absmax);
return; // don't want to link this door
}
if (self.items)
return;
- spawn_field(cmins, cmaxs);
+ door_spawnfield(cmins, cmaxs);
}
+REGISTER_NET_LINKED(ENT_CLIENT_DOOR)
+
#ifdef SVQC
/*QUAKED spawnfunc_func_door (0 .5 .8) ? START_OPEN x DOOR_DONT_LINK GOLD_KEY SILVER_KEY TOGGLE
if two doors touch, they are assumed to be connected and operate as a unit.
float door_send(entity to, float sf)
{SELFPARAM();
- WriteByte(MSG_ENTITY, ENT_CLIENT_DOOR);
+ WriteHeader(MSG_ENTITY, ENT_CLIENT_DOOR);
WriteByte(MSG_ENTITY, sf);
if(sf & SF_TRIGGER_INIT)
WriteString(MSG_ENTITY, self.model);
- trigger_common_write(true);
+ trigger_common_write(self, true);
WriteCoord(MSG_ENTITY, self.pos1_x);
WriteCoord(MSG_ENTITY, self.pos1_y);
}
#endif
-void door_init_startopen()
-{SELFPARAM();
+void door_init_startopen(entity this)
+{
SUB_SETORIGIN(self, self.pos2);
self.pos2 = self.pos1;
self.pos1 = self.origin;
#endif
}
-void door_reset()
-{SELFPARAM();
- SUB_SETORIGIN(self, self.pos1);
- self.SUB_VELOCITY = '0 0 0';
- self.state = STATE_BOTTOM;
- self.SUB_THINK = func_null;
- self.SUB_NEXTTHINK = 0;
+void door_reset(entity this)
+{
+ SUB_SETORIGIN(this, this.pos1);
+ this.SUB_VELOCITY = '0 0 0';
+ this.state = STATE_BOTTOM;
+ this.SUB_THINK = func_null;
+ this.SUB_NEXTTHINK = 0;
#ifdef SVQC
- self.SendFlags |= SF_TRIGGER_RESET;
+ this.SendFlags |= SF_TRIGGER_RESET;
#endif
}
#ifdef SVQC
// spawnflags require key (for now only func_door)
-void spawnfunc_func_door()
-{SELFPARAM();
+spawnfunc(func_door)
+{
// Quake 1 keys compatibility
if (self.spawnflags & SPAWNFLAGS_GOLD_KEY)
self.itemkeys |= ITEM_KEY_BIT(0);
if (self.spawnflags & SPAWNFLAGS_SILVER_KEY)
self.itemkeys |= ITEM_KEY_BIT(1);
- SetMovedir ();
+ SetMovedir(self);
self.max_health = self.health;
if (!InitMovingBrushTrigger())
self.effects |= EF_LOWPRECISION;
self.classname = "door";
+ if(self.noise == "")
+ self.noise = "misc/talk.wav";
+ if(self.noise3 == "")
+ self.noise3 = "misc/talk.wav";
+ precache_sound(self.noise);
+ precache_sound(self.noise3);
+
self.blocked = door_blocked;
self.use = door_use;
#elif defined(CSQC)
-void door_draw()
+void door_draw(entity this)
{
- Movetype_Physics_NoMatchServer();
+ Movetype_Physics_NoMatchServer(this);
- trigger_draw_generic();
+ trigger_draw_generic(this);
}
-void ent_door()
-{SELFPARAM();
+NET_HANDLE(ENT_CLIENT_DOOR, bool isnew)
+{
float sf = ReadByte();
if(sf & SF_TRIGGER_INIT)
{
- self.classname = strzone(ReadString());
- self.spawnflags = ReadByte();
+ this.classname = strzone(ReadString());
+ this.spawnflags = ReadByte();
- self.mdl = strzone(ReadString());
- _setmodel(self, self.mdl);
+ this.mdl = strzone(ReadString());
+ _setmodel(this, this.mdl);
trigger_common_read(true);
- self.pos1_x = ReadCoord();
- self.pos1_y = ReadCoord();
- self.pos1_z = ReadCoord();
- self.pos2_x = ReadCoord();
- self.pos2_y = ReadCoord();
- self.pos2_z = ReadCoord();
-
- self.size_x = ReadCoord();
- self.size_y = ReadCoord();
- self.size_z = ReadCoord();
-
- self.wait = ReadShort();
- self.speed = ReadShort();
- self.lip = ReadByte();
- self.state = ReadByte();
- self.SUB_LTIME = ReadCoord();
-
- self.solid = SOLID_BSP;
- self.movetype = MOVETYPE_PUSH;
- self.trigger_touch = door_touch;
- self.draw = door_draw;
- self.drawmask = MASK_NORMAL;
- self.use = door_use;
-
- 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;
+ vector v;
+
+ v.x = ReadCoord();
+ v.y = ReadCoord();
+ v.z = ReadCoord();
+ this.pos1 = v;
+
+ v.x = ReadCoord();
+ v.y = ReadCoord();
+ v.z = ReadCoord();
+ this.pos2 = v;
+
+ v.x = ReadCoord();
+ v.y = ReadCoord();
+ v.z = ReadCoord();
+ this.size = v;
+
+ this.wait = ReadShort();
+ this.speed = ReadShort();
+ this.lip = ReadByte();
+ this.state = ReadByte();
+ this.SUB_LTIME = ReadCoord();
+
+ this.solid = SOLID_BSP;
+ this.movetype = MOVETYPE_PUSH;
+ this.trigger_touch = door_touch;
+ this.draw = door_draw;
+ this.drawmask = MASK_NORMAL;
+ this.use = door_use;
+
+ LinkDoors(this);
+
+ if(this.spawnflags & DOOR_START_OPEN)
+ door_init_startopen(this);
+
+ this.move_time = time;
+ this.move_origin = this.origin;
+ this.move_movetype = MOVETYPE_PUSH;
+ this.move_angles = this.angles;
+ this.move_blocked = door_blocked;
}
if(sf & SF_TRIGGER_RESET)
{
- door_reset();
+ door_reset(this);
}
if(sf & SF_TRIGGER_UPDATE)
{
- self.origin_x = ReadCoord();
- 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();
- self.pos1_z = ReadCoord();
- self.pos2_x = ReadCoord();
- self.pos2_y = ReadCoord();
- self.pos2_z = ReadCoord();
+ this.origin_x = ReadCoord();
+ this.origin_y = ReadCoord();
+ this.origin_z = ReadCoord();
+ setorigin(this, this.origin);
+ this.move_origin = this.origin;
+
+ this.pos1_x = ReadCoord();
+ this.pos1_y = ReadCoord();
+ this.pos1_z = ReadCoord();
+ this.pos2_x = ReadCoord();
+ this.pos2_y = ReadCoord();
+ this.pos2_z = ReadCoord();
}
+ return true;
}
#endif