]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/triggers/func/door.qc
Merge branch 'master' into Mario/qc_physics_prehax
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / triggers / func / door.qc
index 79277c7d7ec028c70b6d8e52ed9d4044ccdee993..1a1c82b9addb74741c8ae8013f97f09863dae133 100644 (file)
@@ -27,7 +27,13 @@ void() door_rotating_go_up;
 
 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');
@@ -40,8 +46,12 @@ void door_blocked()
                        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)
                        {
@@ -83,12 +93,12 @@ void door_hit_top()
                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()
@@ -107,13 +117,6 @@ void door_go_down()
                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);
@@ -126,7 +129,7 @@ void door_go_up()
 
        if (self.state == STATE_TOP)
        {       // reset top wait time
-               self.nextthink = self.ltime + self.wait;
+               self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
                return;
        }
 
@@ -380,8 +383,8 @@ void door_rotating_hit_top()
        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()
@@ -417,7 +420,7 @@ void door_rotating_go_up()
 
        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 != "")
@@ -445,11 +448,11 @@ void door_trigger_touch()
 {
        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;
@@ -466,32 +469,6 @@ void door_trigger_touch()
        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;
@@ -502,41 +479,18 @@ void spawn_field(vector fmins, vector fmaxs)
        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
@@ -553,7 +507,7 @@ entity LinkDoors_nextent(entity cur, entity near, entity pass)
        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)
@@ -566,13 +520,17 @@ float LinkDoors_isconnected(entity e1, entity e2, entity pass)
        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
@@ -586,6 +544,7 @@ void LinkDoors()
                        return;
                if (self.items)
                        return;
+
                spawn_field(self.absmin, self.absmax);
 
                return;         // don't want to link this door
@@ -657,7 +616,7 @@ void LinkDoors()
        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.
 
@@ -696,32 +655,10 @@ float door_send(entity to, float sf)
        {
                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);
@@ -738,7 +675,7 @@ float door_send(entity to, float sf)
                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)
@@ -769,25 +706,26 @@ void door_link()
        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;
@@ -836,7 +774,7 @@ void spawnfunc_func_door()
        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
@@ -866,6 +804,13 @@ void spawnfunc_func_door()
 
 #elif defined(CSQC)
 
+void door_draw()
+{
+       Movetype_Physics_NoMatchServer();
+
+       trigger_draw_generic();
+}
+
 void ent_door()
 {
        float sf = ReadByte();
@@ -874,35 +819,11 @@ void ent_door()
        {
                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();
@@ -919,21 +840,25 @@ void ent_door()
                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)
@@ -947,6 +872,7 @@ void ent_door()
                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();