]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/w_laser.qc
make the second trace hit
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / w_laser.qc
index 8633297a12d2c31bbbfe16d77b3b5d79a571322d..870c26627819df6a7af355e508025a016ad5e243 100644 (file)
@@ -101,10 +101,39 @@ void W_Laser_Attack (float issecondary)
        }
 }
 
+.vector hook_start, hook_end;
+float gauntletbeam_send(entity to, float sf)
+{
+       WriteByte(MSG_ENTITY, ENT_CLIENT_GAUNTLET);
+       sf = sf & 0x7F;
+       if(sound_allowed(MSG_BROADCAST, self.owner))
+               sf |= 0x80;
+       WriteByte(MSG_ENTITY, sf);
+       if(sf & 1)
+       {
+               WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+       }
+       if(sf & 2)
+       {
+               WriteCoord(MSG_ENTITY, self.hook_start_x);
+               WriteCoord(MSG_ENTITY, self.hook_start_y);
+               WriteCoord(MSG_ENTITY, self.hook_start_z);
+       }
+       if(sf & 4)
+       {
+               WriteCoord(MSG_ENTITY, self.hook_end_x);
+               WriteCoord(MSG_ENTITY, self.hook_end_y);
+               WriteCoord(MSG_ENTITY, self.hook_end_z);
+       }
+       return TRUE;
+}
 .entity gauntletbeam;
 .float prevgauntletfire;
 void gauntletbeam_think()
 {
+       vector endpos;
+       float oldsolid;
+
        float damage, myforce, myradius;
        if(self.cnt)
        {
@@ -131,8 +160,24 @@ void gauntletbeam_think()
        makevectors(self.owner.v_angle);
        vector angle;
        angle = v_forward;
+       // get effect origin
+       vector vecs, org;
+       if(self.owner.weaponentity.movedir_x > 0)
+               vecs = self.owner.weaponentity.movedir;
+       else
+               vecs = '0 0 0';
+       if(debug_shotorg != '0 0 0')
+               vecs = debug_shotorg;
+       org = self.owner.origin + self.owner.view_ofs + v_forward * vecs_x + v_right * -vecs_y + v_up * vecs_z;
+       
+       oldsolid = self.owner.dphitcontentsmask;
+       self.owner.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 
-       WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * myradius, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+       WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * myradius, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
+       endpos = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
+       WarpZone_traceline_antilag(self.owner, org, endpos + 4 * normalize(endpos - org), MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
+
+       self.owner.dphitcontentsmask = oldsolid;
 
        // apply the damage
        if(trace_fraction < 1)
@@ -143,27 +188,16 @@ void gauntletbeam_think()
        }
 
        // draw effect
-       vector vecs, org;
-       if(self.owner.weaponentity.movedir_x > 0)
+       if(org != self.hook_start)
        {
-               vecs = self.owner.weaponentity.movedir;
-               vecs_y = -vecs_y;
+               self.SendFlags |= 2;
+               self.hook_start = org;
+       }
+       if(endpos != self.hook_end)
+       {
+               self.SendFlags |= 4;
+               self.hook_end = endpos;
        }
-       else
-               vecs = '0 0 0';
-       org = self.owner.origin + self.owner.view_ofs + v_forward * vecs_x + v_right * vecs_y + v_up * vecs_z;
-       
-       // TODO turn into a csqc entity
-       WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
-       WriteByte(MSG_BROADCAST, TE_CSQC_BEAM);
-       WriteByte(MSG_BROADCAST, num_for_edict(self.owner));
-       WriteByte(MSG_BROADCAST, 3);
-       WriteCoord(MSG_BROADCAST, trace_endpos_x);
-       WriteCoord(MSG_BROADCAST, trace_endpos_y);
-       WriteCoord(MSG_BROADCAST, trace_endpos_z);
-       WriteCoord(MSG_BROADCAST, org_x);
-       WriteCoord(MSG_BROADCAST, org_y);
-       WriteCoord(MSG_BROADCAST, org_z);
 }
 
 // experimental gauntlet
@@ -186,6 +220,7 @@ void W_Laser_Attack2 (float issecondary)
        beam.bot_dodge = TRUE;
        beam.bot_dodgerating = cvar("g_balance_laser_primary_damage");
        beam.cnt = issecondary;
+       Net_LinkEntity(beam, FALSE, 0, gauntletbeam_send);
 
        oldself = self;
        self = beam;