]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/triggers/triggers.qc
Merge branch 'master' into Mario/snake
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / triggers / triggers.qc
index c9b5fdc6df6b2531d25bc8aea41abbfc6082c5c2..73c5c49651259aaa9376945cc6e1c080df0bb91b 100644 (file)
@@ -3,7 +3,7 @@ void SUB_DontUseTargets() { }
 void() SUB_UseTargets;
 
 void DelayThink()
-{
+{SELFPARAM();
        activator = self.enemy;
        SUB_UseTargets ();
        remove(self);
@@ -20,6 +20,103 @@ void FixSize(entity e)
        e.maxs_z = rint(e.maxs_z);
 }
 
+#ifdef SVQC
+void trigger_common_write(bool withtarget)
+{SELFPARAM();
+       WriteByte(MSG_ENTITY, self.warpzone_isboxy);
+       WriteByte(MSG_ENTITY, self.scale);
+
+       if(withtarget)
+       {
+               WriteString(MSG_ENTITY, self.target);
+               WriteString(MSG_ENTITY, self.target2);
+               WriteString(MSG_ENTITY, self.target3);
+               WriteString(MSG_ENTITY, self.target4);
+               WriteString(MSG_ENTITY, self.targetname);
+               WriteString(MSG_ENTITY, self.killtarget);
+       }
+
+       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);
+
+       WriteCoord(MSG_ENTITY, self.movedir_x);
+       WriteCoord(MSG_ENTITY, self.movedir_y);
+       WriteCoord(MSG_ENTITY, self.movedir_z);
+
+       WriteCoord(MSG_ENTITY, self.angles_x);
+       WriteCoord(MSG_ENTITY, self.angles_y);
+       WriteCoord(MSG_ENTITY, self.angles_z);
+}
+
+#elif defined(CSQC)
+
+void trigger_common_read(bool withtarget)
+{SELFPARAM();
+       self.warpzone_isboxy = ReadByte();
+       self.scale = ReadByte();
+
+       if(withtarget)
+       {
+               self.target = strzone(ReadString());
+               self.target2 = strzone(ReadString());
+               self.target3 = strzone(ReadString());
+               self.target4 = strzone(ReadString());
+               self.targetname = strzone(ReadString());
+               self.killtarget = strzone(ReadString());
+       }
+
+       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.movedir_x = ReadCoord();
+       self.movedir_y = ReadCoord();
+       self.movedir_z = ReadCoord();
+
+       self.angles_x = ReadCoord();
+       self.angles_y = ReadCoord();
+       self.angles_z = ReadCoord();
+}
+
+void trigger_remove_generic()
+{SELFPARAM();
+       if(self.target) { strunzone(self.target); }
+       self.target = string_null;
+
+       if(self.target2) { strunzone(self.target2); }
+       self.target2 = string_null;
+
+       if(self.target3) { strunzone(self.target3); }
+       self.target3 = string_null;
+
+       if(self.target4) { strunzone(self.target4); }
+       self.target4 = string_null;
+
+       if(self.targetname) { strunzone(self.targetname); }
+       self.target = string_null;
+
+       if(self.killtarget) { strunzone(self.killtarget); }
+       self.killtarget = string_null;
+}
+#endif
+
 /*
 ==============================
 SUB_UseTargets
@@ -40,8 +137,8 @@ match (string)self.target and call their .use function
 ==============================
 */
 void SUB_UseTargets()
-{
-       entity t, stemp, otemp, act;
+{SELFPARAM();
+       entity t, otemp, act;
        string s;
        float i;
 
@@ -76,7 +173,7 @@ void SUB_UseTargets()
        {
                centerprint(activator, self.message);
                if (self.noise == "")
-                       play2(activator, "misc/talk.wav");
+                       play2(activator, SND(TALK));
        }
 
 //
@@ -94,10 +191,9 @@ void SUB_UseTargets()
 // fire targets
 //
        act = activator;
-       stemp = self;
        otemp = other;
 
-       if(stemp.target_random)
+       if(this.target_random)
                RandomSelection_Init();
 
        for(i = 0; i < 4; ++i)
@@ -105,24 +201,29 @@ void SUB_UseTargets()
                switch(i)
                {
                        default:
-                       case 0: s = stemp.target; break;
-                       case 1: s = stemp.target2; break;
-                       case 2: s = stemp.target3; break;
-                       case 3: s = stemp.target4; break;
+                       case 0: s = this.target; break;
+                       case 1: s = this.target2; break;
+                       case 2: s = this.target3; break;
+                       case 3: s = this.target4; break;
                }
                if (s != "")
                {
+                       // Flag to set func_clientwall state
+                       // 1 == deactivate, 2 == activate, 0 == do nothing
+                       float aw_flag = self.antiwall_flag;
                        for(t = world; (t = find(t, targetname, s)); )
                        if(t.use)
                        {
-                               if(stemp.target_random)
+                               if(this.target_random)
                                {
                                        RandomSelection_Add(t, 0, string_null, 1, 0);
                                }
                                else
                                {
-                                       self = t;
-                                       other = stemp;
+                                       if (t.classname == "func_clientwall" || t.classname == "func_clientillusionary")
+                                               t.antiwall_flag = aw_flag;
+                                       setself(t);
+                                       other = this;
                                        activator = act;
                                        self.use();
                                }
@@ -130,15 +231,46 @@ void SUB_UseTargets()
                }
        }
 
-       if(stemp.target_random && RandomSelection_chosen_ent)
+       if(this.target_random && RandomSelection_chosen_ent)
        {
-               self = RandomSelection_chosen_ent;
-               other = stemp;
+               setself(RandomSelection_chosen_ent);
+               other = this;
                activator = act;
                self.use();
        }
 
        activator = act;
-       self = stemp;
+       setself(this);
        other = otemp;
 }
+
+#ifdef CSQC
+void trigger_touch_generic(void() touchfunc)
+{SELFPARAM();
+       entity e;
+       for(e = findradius((self.absmin + self.absmax) * 0.5, vlen(self.absmax - self.absmin) * 0.5 + 1); e; e = e.chain)
+       if(e.isplayermodel || e.classname == "csqcprojectile")
+       {
+               vector emin = e.absmin, emax = e.absmax;
+               if(self.solid == SOLID_BSP)
+               {
+                       emin -= '1 1 1';
+                       emax += '1 1 1';
+               }
+               if(boxesoverlap(emin, emax, self.absmin, self.absmax)) // quick
+               if(WarpZoneLib_BoxTouchesBrush(emin, emax, self, e)) // accurate
+               {
+                       other = e;
+                       touchfunc();
+               }
+       }
+}
+void trigger_draw_generic()
+{SELFPARAM();
+       float dt = time - self.move_time;
+       self.move_time = time;
+       if(dt <= 0) { return; }
+
+       if(self.trigger_touch) { trigger_touch_generic(self.trigger_touch); }
+}
+#endif