]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/w_electro.qc
nex charge: properly support g_use_ammunition; don't bite off more than you can chew...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / w_electro.qc
index ef478e2b225e109170b53827e46ba5169e0c9a56..2268ca7cb150a558e9f83d325027213b238b4beb 100644 (file)
@@ -195,6 +195,7 @@ float lgbeam_send(entity to, float sf)
        if(sf & 1)
        {
                WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+               WriteCoord(MSG_ENTITY, cvar("g_balance_electro_primary_range"));
        }
        if(sf & 2)
        {
@@ -214,55 +215,61 @@ float lgbeam_send(entity to, float sf)
 .float prevlgfire;
 void lgbeam_think()
 {
-       vector endpos;
        self.owner.prevlgfire = time;
-       if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self != self.owner.lgbeam || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK)
+       if (self != self.owner.lgbeam)
        {
                remove(self);
                return;
        }
+       if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK)
+       {
+               if(self == self.owner.lgbeam)
+                       self.owner.lgbeam = world;
+               remove(self);
+               return;
+       }
 
        self.nextthink = time;
 
        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;
-
-       WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_electro_primary_range"), FALSE, self.owner, ANTILAG_LATENCY(self.owner));
-       endpos = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
-       WarpZone_traceline_antilag(self.owner, org, endpos, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
 
+       float dt, f;
+       dt = frametime;
        if not(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
-               self.owner.ammo_cells = max(0, self.owner.ammo_cells - cvar("g_balance_electro_primary_ammo") * frametime);
+       {
+               if(cvar("g_balance_electro_primary_ammo"))
+               {
+                       dt = min(dt, self.owner.ammo_cells / cvar("g_balance_electro_primary_ammo"));
+                       self.owner.ammo_cells = max(0, self.owner.ammo_cells - cvar("g_balance_electro_primary_ammo") * frametime);
+               }
+       }
+
+       W_SetupShot_Range(self.owner, TRUE, 0, "", cvar("g_balance_electro_primary_damage") * dt, cvar("g_balance_electro_primary_range"));
+       WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
 
        // apply the damage
-       if(trace_fraction < 1)
+       if(trace_ent)
        {
                vector force;
-               force = angle * cvar("g_balance_electro_primary_force") + '0 0 1' * cvar("g_balance_electro_primary_force_up");
-               Damage (trace_ent, self.owner, self.owner, cvar("g_balance_electro_primary_damage") * frametime, WEP_ELECTRO, trace_endpos, force * frametime);
-               W_Plasma_TriggerCombo(trace_endpos, cvar("g_balance_electro_primary_comboradius"), self.owner);
+               force = w_shotdir * cvar("g_balance_electro_primary_force") + '0 0 1' * cvar("g_balance_electro_primary_force_up");
+
+               f = ExponentialFalloff(cvar("g_balance_electro_primary_falloff_mindist"), cvar("g_balance_electro_primary_falloff_maxdist"), cvar("g_balance_electro_primary_falloff_halflifedist"), vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - w_shotorg));
+
+               Damage (trace_ent, self.owner, self.owner, cvar("g_balance_electro_primary_damage") * dt * f, WEP_ELECTRO, trace_endpos, force * dt);
+               Damage_RecordDamage(self.owner, WEP_ELECTRO, cvar("g_balance_electro_primary_damage") * dt * f);
        }
+       W_Plasma_TriggerCombo(trace_endpos, cvar("g_balance_electro_primary_comboradius"), self.owner);
 
        // draw effect
-       if(org != self.hook_start)
+       if(w_shotorg != self.hook_start)
        {
                self.SendFlags |= 2;
-               self.hook_start = org;
+               self.hook_start = w_shotorg;
        }
-       if(endpos != self.hook_end)
+       if(w_shotend != self.hook_end)
        {
                self.SendFlags |= 4;
-               self.hook_end = endpos;
+               self.hook_end = w_shotend;
        }
 }
 
@@ -357,7 +364,7 @@ float w_electro(float req)
                        {
                                if(cvar("g_balance_electro_lightning"))
                                {
-                                       if (self.BUTTON_ATCK_prev == 0)
+                                       if ((!self.lgbeam) || wasfreed(self.lgbeam))
                                        {
                                                W_Electro_Attack3();
                                        }
@@ -370,7 +377,14 @@ float w_electro(float req)
                                weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_electro_primary_animtime"), w_ready);
                        }
                } else {
-                       self.BUTTON_ATCK_prev = 0;
+                       if(cvar("g_balance_electro_lightning"))
+                       {
+                               if (self.BUTTON_ATCK_prev != 0)
+                               {
+                                       ATTACK_FINISHED(self) = time + cvar("g_balance_electro_primary_refire") * W_WeaponRateFactor();
+                               }
+                               self.BUTTON_ATCK_prev = 0;
+                       }
                }
 
                if (self.BUTTON_ATCK2)
@@ -403,7 +417,7 @@ float w_electro(float req)
        else if (req == WR_CHECKAMMO1)
        {
                if(cvar("g_balance_electro_lightning"))
-                       return self.ammo_cells >= cvar("g_balance_electro_primary_ammo") * cvar("g_balance_electro_primary_refire");
+                       return !cvar("g_balance_electro_primary_ammo") || (self.ammo_cells > 0);
                else
                        return self.ammo_cells >= cvar("g_balance_electro_primary_ammo");
        }
@@ -454,27 +468,27 @@ float w_electro(float req)
        else if (req == WR_SUICIDEMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
-                       w_deathtypestring = "could not remember where they put plasma";
+                       w_deathtypestring = "%s could not remember where they put plasma";
                else
-                       w_deathtypestring = "played with plasma";
+                       w_deathtypestring = "%s played with plasma";
        }
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
                {
                        if(w_deathtype & HITTYPE_SPLASH) // unchecked: BOUNCE
-                               w_deathtypestring = "just noticed #'s blue ball";
+                               w_deathtypestring = "%s just noticed %s's blue ball";
                        else // unchecked: BOUNCE
-                               w_deathtypestring = "got in touch with #'s blue ball";
+                               w_deathtypestring = "%s got in touch with %s's blue ball";
                }
                else
                {
                        if(w_deathtype & HITTYPE_BOUNCE) // combo
-                               w_deathtypestring = "felt the electrifying air of #'s combo";
+                               w_deathtypestring = "%s felt the electrifying air of %s's combo";
                        else if(w_deathtype & HITTYPE_SPLASH)
-                               w_deathtypestring = "got too close to #'s blue beam";
+                               w_deathtypestring = "%s got too close to %s's blue beam";
                        else
-                               w_deathtypestring = "was blasted by #'s blue beam";
+                               w_deathtypestring = "%s was blasted by %s's blue beam";
                }
        }
        return TRUE;