void door_blocked()
{
- if((self.spawnflags & 8) && (other.takedamage != DAMAGE_NO))
+ if((self.spawnflags & 8)
+#ifdef SVQC
+ && (other.takedamage != DAMAGE_NO)
+#elif defined(CSQC)
+ && !PHYS_DEAD(other)
+#endif
+ )
{ // KIll Kill Kill!!
#ifdef SVQC
Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0');
Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0');
#endif
- //Dont chamge direction for dead or dying stuff
- if(PHYS_DEAD(other) && (other.takedamage == DAMAGE_NO))
+ // don't change direction for dead or dying stuff
+ if(PHYS_DEAD(other)
+#ifdef SVQC
+ && (other.takedamage == DAMAGE_NO)
+#endif
+ )
{
if (self.wait >= 0)
{
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;
}
- self.nextthink = self.ltime + self.wait;
+ self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
}
void door_hit_bottom()
self.takedamage = DAMAGE_YES;
self.health = self.max_health;
}
- print(
-#ifdef SVQC
- "Server ",
-#elif defined(CSQC)
- "Client ",
-#endif
- "going down at time ", ftos(time), "\n");
self.state = STATE_DOWN;
SUB_CalcMove (self.pos1, TSPEED_LINEAR, self.speed, door_hit_bottom);
if (self.state == STATE_TOP)
{ // reset top wait time
- self.nextthink = self.ltime + self.wait;
+ self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
return;
}
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()
if (self.state == STATE_TOP)
{ // reset top wait time
- self.nextthink = self.ltime + self.wait;
+ self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
return;
}
if (self.noise2 != "")
{
if (other.health < 1)
#ifdef SVQC
- if (!(other.iscreature && !PHYS_DEAD(other)))
+ if (!((other.iscreature || (other.flags & FL_PROJECTILE)) && !PHYS_DEAD(other)))
#elif defined(CSQC)
- if(!(IS_CLIENT(other) && !PHYS_DEAD(other)))
- return;
+ if(!((IS_CLIENT(other) || other.classname == "csqcprojectile") && !PHYS_DEAD(other)))
#endif
+ return;
if (time < self.attack_finished_single)
return;
door_use ();
}
-#ifdef SVQC
-
-float door_trigger_send(entity to, float sf)
-{
- WriteByte(MSG_ENTITY, ENT_CLIENT_DOOR_TRIGGER);
-
- WriteShort(MSG_ENTITY, num_for_edict(self.owner));
- WriteCoord(MSG_ENTITY, self.origin_x);
- WriteCoord(MSG_ENTITY, self.origin_y);
- WriteCoord(MSG_ENTITY, self.origin_z);
-
- 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);
-
- return true;
-}
-
-void door_trigger_link(entity trig)
-{
- Net_LinkEntity(trig, false, 0, door_trigger_send);
-}
-
void spawn_field(vector fmins, vector fmaxs)
{
entity trigger;
trigger.movetype = MOVETYPE_NONE;
trigger.solid = SOLID_TRIGGER;
trigger.owner = self;
+#ifdef SVQC
trigger.touch = door_trigger_touch;
+#elif defined(CSQC)
+ trigger.trigger_touch = door_trigger_touch;
+ trigger.draw = trigger_draw_generic;
+ trigger.drawmask = MASK_NORMAL;
+#endif
setsize (trigger, t1 - '60 60 8', t2 + '60 60 8');
- door_trigger_link(trigger);
}
-#elif defined(CSQC)
-
-void ent_door_trigger()
-{
- float entnum = ReadShort();
- self.origin_x = ReadCoord();
- self.origin_y = ReadCoord();
- self.origin_z = ReadCoord();
- setorigin(self, self.origin);
- 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);
-
- self.owner = findfloat(world, sv_entnum, entnum); // if owner doesn't exist, it shouldn't matter much
- self.classname = "doortriggerfield";
- self.movetype = MOVETYPE_NONE;
- self.solid = SOLID_TRIGGER;
- self.trigger_touch = door_trigger_touch;
- self.draw = trigger_draw_generic;
- self.drawmask = MASK_NORMAL;
- self.move_time = time;
-}
-#endif
-#ifdef SVQC
/*
=============
LinkDoors
return cur;
}
-float LinkDoors_isconnected(entity e1, entity e2, entity pass)
+bool LinkDoors_isconnected(entity e1, entity e2, entity pass)
{
float DELTA = 4;
if((e1.absmin_x > e2.absmax_x + DELTA)
return true;
}
+#ifdef SVQC
void door_link();
+#endif
void LinkDoors()
{
entity t;
vector cmins, cmaxs;
+#ifdef SVQC
door_link();
+#endif
if (self.enemy)
return; // already linked by another door
return;
if (self.items)
return;
+
spawn_field(self.absmin, self.absmax);
return; // don't want to link this door
spawn_field(cmins, cmaxs);
}
-
+#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.
{
WriteString(MSG_ENTITY, self.classname);
WriteByte(MSG_ENTITY, self.spawnflags);
- WriteShort(MSG_ENTITY, ((self.owner == self || !self.owner) ? -1 : num_for_edict(self.owner)));
- WriteShort(MSG_ENTITY, ((self.enemy == self || !self.enemy) ? -1 : num_for_edict(self.enemy)));
- WriteShort(MSG_ENTITY, num_for_edict(self));
-
- 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);
- WriteShort(MSG_ENTITY, self.ltime);
+ WriteCoord(MSG_ENTITY, self.SUB_LTIME);
}
if(sf & SF_TRIGGER_RESET)
FixSize(self);
Net_LinkEntity(self, false, 0, door_send);
}
+#endif
void door_init_startopen()
{
- setorigin (self, self.pos2);
+ SUB_SETORIGIN(self, self.pos2);
self.pos2 = self.pos1;
self.pos1 = self.origin;
+#ifdef SVQC
self.SendFlags |= SF_TRIGGER_UPDATE;
-}
-
#endif
+}
void door_reset()
{
- setorigin(self, self.pos1);
- self.velocity = '0 0 0';
+ 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;
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);
// DOOR_START_OPEN is to allow an entity to be lighted in the closed position
#elif defined(CSQC)
+void door_draw()
+{
+ Movetype_Physics_NoMatchServer();
+
+ trigger_draw_generic();
+}
+
void ent_door()
{
float sf = ReadByte();
{
self.classname = strzone(ReadString());
self.spawnflags = ReadByte();
- float myowner = ReadShort();
- float myenemy = ReadShort();
- self.sv_entnum = ReadShort();
-
- 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);
-
- 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 = ReadShort();
+ 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;
- print(ftos(self.entnum), " ", ftos(self.sv_entnum), "\n");
+ LinkDoors();
- self.owner = ((myowner == -1) ? self : findfloat(world, sv_entnum, myowner));
- self.enemy = ((myenemy == -1) ? self : findfloat(world, sv_entnum, myenemy));
+ 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();