]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/turrets/util.qc
Restore functionality to the phaser turret
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / turrets / util.qc
index 0344d149230461e0ca97b3db210de93bf7441e3a..6857ccad8dd8bc603637ff112e6e0e0cfc95d443 100644 (file)
@@ -1,17 +1,21 @@
+#include "util.qh"
+
+#ifdef SVQC
+
 /*
-* Update self.tur_shotorg by getting up2date bone info
+* Update this.tur_shotorg by getting up2date bone info
 * NOTICE this func overwrites the global v_forward, v_right and v_up vectors.
 */
-float turret_tag_fire_update()
-{SELFPARAM();
-       if(!self.tur_head)
+float turret_tag_fire_update(entity this)
+{
+       if(!this.tur_head)
        {
-               error("Call to turret_tag_fire_update with self.tur_head missing!\n");
-               self.tur_shotorg = '0 0 0';
+               LOG_DEBUG("Call to turret_tag_fire_update with this.tur_head missing!");
+               this.tur_shotorg = '0 0 0';
                return false;
        }
 
-       self.tur_shotorg = gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_fire"));
+       this.tur_shotorg = gettaginfo(this.tur_head, gettagindex(this.tur_head, "tag_fire"));
        v_forward = normalize(v_forward);
 
        return true;
@@ -24,98 +28,114 @@ void FireImoBeam(entity this, vector start, vector end, vector smin, vector smax
                                  float bforce, float f_dmg, float f_velfactor, int deathtype)
 
 {
-       vector hitloc, force, endpoint, dir;
-       entity ent;
-
-       dir = normalize(end - start);
-       force = dir * bforce;
+       vector dir = normalize(end - start);
+       vector force = dir * bforce;
 
        // go a little bit into the wall because we need to hit this wall later
        end = end + dir;
 
        // trace multiple times until we hit a wall, each obstacle will be made unsolid.
        // note down which entities were hit so we can damage them later
+       entity o = this;
        while (1)
        {
-               tracebox(start, smin, smax, end, false, this);
-
-               // if it is world we can't hurt it so stop now
-               if (trace_ent == world || trace_fraction == 1)
-                       break;
+               if(CS(this).antilag_debug)
+                       WarpZone_tracebox_antilag (this, start, smin, smax, end, false, o, CS(this).antilag_debug);
+               else
+                       WarpZone_tracebox_antilag (this, start, smin, smax, end, false, o, ANTILAG_LATENCY(this));
+               if(o && WarpZone_trace_firstzone)
+               {
+                       o = NULL;
+                       continue;
+               }
 
-               if (trace_ent.solid == SOLID_BSP)
+               // if it is NULL we can't hurt it so stop now
+               if (trace_ent == NULL || trace_fraction == 1)
                        break;
 
                // make the entity non-solid so we can hit the next one
+               IL_PUSH(g_railgunhit, trace_ent);
                trace_ent.railgunhit = true;
                trace_ent.railgunhitloc = end;
                trace_ent.railgunhitsolidbackup = trace_ent.solid;
+               trace_ent.railgundistance = vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - start);
+               trace_ent.railgunforce = WarpZone_TransformVelocity(WarpZone_trace_transform, force);
 
                // stop if this is a wall
+               if (trace_ent.solid == SOLID_BSP)
+                       break;
 
                // make the entity non-solid
                trace_ent.solid = SOLID_NOT;
        }
 
-       endpoint = trace_endpos;
+       vector endpoint = trace_endpos;
+       entity endent = trace_ent;
+       float endq3surfaceflags = trace_dphitq3surfaceflags;
 
        // find all the entities the railgun hit and restore their solid state
-       ent = findfloat(world, railgunhit, true);
-       while (ent)
+       IL_EACH(g_railgunhit, it.railgunhit,
        {
-               // restore their solid type
-               ent.solid = ent.railgunhitsolidbackup;
-               ent = findfloat(ent, railgunhit, true);
-       }
+               it.solid = it.railgunhitsolidbackup;
+       });
+
+       /*
+               Unlike the railgun, this does NOT check for targets close by
+       */
 
        // find all the entities the railgun hit and hurt them
-       ent = findfloat(world, railgunhit, true);
-       while (ent)
+       IL_EACH(g_railgunhit, it.railgunhit,
        {
-               // get the details we need to call the damage function
-               hitloc = ent.railgunhitloc;
-               ent.railgunhitloc = '0 0 0';
-               ent.railgunhitsolidbackup = SOLID_NOT;
-               ent.railgunhit = false;
+               // removal from the list is handled below
+               /* no falloff applied */
 
                // apply the damage
-               if (ent.takedamage)
+               if (it.takedamage)
                {
-                       Damage (ent, this, this, f_dmg, deathtype, hitloc, force);
-                       ent.velocity = ent.velocity * f_velfactor;
-                       //ent.alpha = 0.25 + random() * 0.75;
+                       Damage(it, this, this, f_dmg, deathtype, DMG_NOWEP, it.railgunhitloc, it.railgunforce);
+                       // slow down the target
+                       it.velocity = it.velocity * f_velfactor;
                }
 
-               // advance to the next entity
-               ent = findfloat(ent, railgunhit, true);
-       }
+               it.railgunhitloc = '0 0 0';
+               it.railgunhitsolidbackup = SOLID_NOT;
+               it.railgunhit = false;
+               it.railgundistance = 0;
+       });
+
+       IL_CLEAR(g_railgunhit);
+
+       /* no accuracy, as a weapon entity is not attached */
+
        trace_endpos = endpoint;
+       trace_ent = endent;
+       trace_dphitq3surfaceflags = endq3surfaceflags;
 }
 
 #ifdef TURRET_DEBUG
-void marker_think()
-{SELFPARAM();
-       if(self.cnt)
-       if(self.cnt < time)
+void marker_think(entity this)
+{
+       if(this.cnt)
+       if(this.cnt < time)
        {
-               setthink(self, SUB_Remove);
-               self.nextthink = time;
+               setthink(this, SUB_Remove);
+               this.nextthink = time;
                return;
        }
 
-       self.frame += 1;
-       if(self.frame > 29)
-               self.frame = 0;
+       this.frame += 1;
+       if(this.frame > 29)
+               this.frame = 0;
 
-       self.nextthink = time;
+       this.nextthink = time;
 }
 
 void mark_error(vector where,float lifetime)
 {
        entity err = new(error_marker);
        setmodel(err, MDL_MARKER);
-       setorigin(err,where);
-       err.movetype = MOVETYPE_NONE;
+       setorigin(err, where);
+       set_movetype(err, MOVETYPE_NONE);
        setthink(err, marker_think);
        err.nextthink = time;
        err.skin = 0;
@@ -125,10 +145,10 @@ void mark_error(vector where,float lifetime)
 
 void mark_info(vector where,float lifetime)
 {
-       entity err = spawn(info_marker);
+       entity err = new(info_marker);
        setmodel(err, MDL_MARKER);
-       setorigin(err,where);
-       err.movetype = MOVETYPE_NONE;
+       setorigin(err, where);
+       set_movetype(err, MOVETYPE_NONE);
        setthink(err, marker_think);
        err.nextthink = time;
        err.skin = 1;
@@ -138,10 +158,10 @@ void mark_info(vector where,float lifetime)
 
 entity mark_misc(vector where,float lifetime)
 {
-       entity err = spawn(mark_misc);
+       entity err = new(mark_misc);
        setmodel(err, MDL_MARKER);
-       setorigin(err,where);
-       err.movetype = MOVETYPE_NONE;
+       setorigin(err, where);
+       set_movetype(err, MOVETYPE_NONE);
        setthink(err, marker_think);
        err.nextthink = time;
        err.skin = 3;
@@ -165,9 +185,9 @@ void paint_target(entity onwho, float f_size, vector v_color, float f_time)
        e.scale = (f_size/512);
        //setsize(e, '0 0 0', '0 0 0');
        //setattachment(e,onwho,"");
-       setorigin(e,onwho.origin + '0 0 1');
+       setorigin(e, onwho.origin + '0 0 1');
        e.alpha = 0.15;
-       e.movetype = MOVETYPE_FLY;
+       set_movetype(e, MOVETYPE_FLY);
 
        e.velocity = (v_color * 32); // + '0 0 1' * 64;
 
@@ -184,9 +204,9 @@ void paint_target2(entity onwho, float f_size, vector v_color, float f_time)
        e.scale = (f_size/512);
        setsize(e, '0 0 0', '0 0 0');
 
-       setorigin(e,onwho.origin + '0 0 1');
+       setorigin(e, onwho.origin + '0 0 1');
        e.alpha = 0.15;
-       e.movetype = MOVETYPE_FLY;
+       set_movetype(e, MOVETYPE_FLY);
 
        e.velocity = (v_color * 32); // + '0 0 1' * 64;
        e.avelocity_x = -128;
@@ -202,10 +222,12 @@ void paint_target3(vector where, float f_size, vector v_color, float f_time)
        setmodel(e, MDL_TUR_C512); // precision set above
        e.scale = (f_size/512);
        setsize(e, '0 0 0', '0 0 0');
-       setorigin(e,where+ '0 0 1');
-       e.movetype = MOVETYPE_NONE;
+       setorigin(e, where + '0 0 1');
+       set_movetype(e, MOVETYPE_NONE);
        e.velocity = '0 0 0';
        e.colormod = v_color;
        SUB_SetFade(e,time,f_time);
 }
 #endif
+
+#endif