From 4916a5ed36ceb96f47690fa5f4c77a57f20b008a Mon Sep 17 00:00:00 2001 From: Samual Date: Thu, 22 Sep 2011 18:43:17 -0400 Subject: [PATCH] Totally re-work how the tracing works for shotgun secondary... possibly needs rebalanced, but should work decently well now. --- balance25.cfg | 10 +++-- balanceFruit.cfg | 12 +++--- balanceLeeStricklin.cfg | 10 +++-- balanceXonotic.cfg | 6 ++- balancetZork.cfg | 10 +++-- qcsrc/server/autocvars.qh | 4 +- qcsrc/server/w_shotgun.qc | 77 +++++++++++++++++++++++++-------------- 7 files changed, 82 insertions(+), 47 deletions(-) diff --git a/balance25.cfg b/balance25.cfg index 843bd634f..9949192c8 100644 --- a/balance25.cfg +++ b/balance25.cfg @@ -258,10 +258,12 @@ set g_balance_shotgun_primary_ammo 1 set g_balance_shotgun_primary_speed 12000 set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu set g_balance_shotgun_secondary 1 -set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim -set g_balance_shotgun_secondary_melee_range 60 -set g_balance_shotgun_secondary_melee_swing 50 -set g_balance_shotgun_secondary_melee_time 0.1 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow +set g_balance_shotgun_secondary_melee_range 120 +set g_balance_shotgun_secondary_melee_swing_side 120 +set g_balance_shotgun_secondary_melee_swing_up 30 +set g_balance_shotgun_secondary_melee_time 0.15 +set g_balance_shotgun_secondary_melee_traces 10 set g_balance_shotgun_secondary_melee_no_doubleslap 1 set g_balance_shotgun_secondary_damage 115 set g_balance_shotgun_secondary_force 150 diff --git a/balanceFruit.cfg b/balanceFruit.cfg index 5a078e44c..fc1a3d034 100644 --- a/balanceFruit.cfg +++ b/balanceFruit.cfg @@ -258,11 +258,13 @@ set g_balance_shotgun_primary_ammo 1 set g_balance_shotgun_primary_speed 12000 set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu set g_balance_shotgun_secondary 1 -set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim -set g_balance_shotgun_secondary_melee_range 85 -set g_balance_shotgun_secondary_melee_swing 50 -set g_balance_shotgun_secondary_melee_time 0.1 -set g_balance_shotgun_secondary_melee_no_doubleslap 0 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow +set g_balance_shotgun_secondary_melee_range 120 +set g_balance_shotgun_secondary_melee_swing_side 120 +set g_balance_shotgun_secondary_melee_swing_up 30 +set g_balance_shotgun_secondary_melee_time 0.15 +set g_balance_shotgun_secondary_melee_traces 10 +set g_balance_shotgun_secondary_melee_no_doubleslap 1 set g_balance_shotgun_secondary_damage 110 set g_balance_shotgun_secondary_force 150 set g_balance_shotgun_secondary_refire 1.1 diff --git a/balanceLeeStricklin.cfg b/balanceLeeStricklin.cfg index 02e804e79..4741f00f2 100644 --- a/balanceLeeStricklin.cfg +++ b/balanceLeeStricklin.cfg @@ -258,10 +258,12 @@ set g_balance_shotgun_primary_ammo 1 set g_balance_shotgun_primary_speed 12000 set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu set g_balance_shotgun_secondary 1 -set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim -set g_balance_shotgun_secondary_melee_range 85 -set g_balance_shotgun_secondary_melee_swing 50 -set g_balance_shotgun_secondary_melee_time 0.1 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow +set g_balance_shotgun_secondary_melee_range 120 +set g_balance_shotgun_secondary_melee_swing_side 120 +set g_balance_shotgun_secondary_melee_swing_up 30 +set g_balance_shotgun_secondary_melee_time 0.15 +set g_balance_shotgun_secondary_melee_traces 10 set g_balance_shotgun_secondary_melee_no_doubleslap 1 set g_balance_shotgun_secondary_damage 84 set g_balance_shotgun_secondary_force 147 diff --git a/balanceXonotic.cfg b/balanceXonotic.cfg index dc9a9c065..71ed51b81 100644 --- a/balanceXonotic.cfg +++ b/balanceXonotic.cfg @@ -260,8 +260,10 @@ set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu set g_balance_shotgun_secondary 1 set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow set g_balance_shotgun_secondary_melee_range 120 -set g_balance_shotgun_secondary_melee_swing 50 -set g_balance_shotgun_secondary_melee_time 0.1 +set g_balance_shotgun_secondary_melee_swing_side 120 +set g_balance_shotgun_secondary_melee_swing_up 30 +set g_balance_shotgun_secondary_melee_time 0.15 +set g_balance_shotgun_secondary_melee_traces 10 set g_balance_shotgun_secondary_melee_no_doubleslap 1 set g_balance_shotgun_secondary_damage 110 set g_balance_shotgun_secondary_force 200 diff --git a/balancetZork.cfg b/balancetZork.cfg index 57c499687..49de125f9 100644 --- a/balancetZork.cfg +++ b/balancetZork.cfg @@ -258,10 +258,12 @@ set g_balance_shotgun_primary_ammo 1 set g_balance_shotgun_primary_speed 12000 set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu set g_balance_shotgun_secondary 1 -set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim -set g_balance_shotgun_secondary_melee_range 85 -set g_balance_shotgun_secondary_melee_swing 50 -set g_balance_shotgun_secondary_melee_time 0.1 +set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow +set g_balance_shotgun_secondary_melee_range 120 +set g_balance_shotgun_secondary_melee_swing_side 120 +set g_balance_shotgun_secondary_melee_swing_up 30 +set g_balance_shotgun_secondary_melee_time 0.15 +set g_balance_shotgun_secondary_melee_traces 10 set g_balance_shotgun_secondary_melee_no_doubleslap 1 set g_balance_shotgun_secondary_damage 110 set g_balance_shotgun_secondary_force 150 diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 7b7a3fcef..bcb47926b 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -651,8 +651,10 @@ float autocvar_g_balance_shotgun_secondary_damage; float autocvar_g_balance_shotgun_secondary_force; float autocvar_g_balance_shotgun_secondary_melee_delay; float autocvar_g_balance_shotgun_secondary_melee_range; -float autocvar_g_balance_shotgun_secondary_melee_swing; +float autocvar_g_balance_shotgun_secondary_melee_swing_side; +float autocvar_g_balance_shotgun_secondary_melee_swing_up; float autocvar_g_balance_shotgun_secondary_melee_time; +float autocvar_g_balance_shotgun_secondary_melee_traces; float autocvar_g_balance_shotgun_secondary_melee_no_doubleslap; float autocvar_g_balance_shotgun_secondary_refire; float autocvar_g_balance_shotgun_reload_ammo; diff --git a/qcsrc/server/w_shotgun.qc b/qcsrc/server/w_shotgun.qc index 2088073f9..e78db50a8 100644 --- a/qcsrc/server/w_shotgun.qc +++ b/qcsrc/server/w_shotgun.qc @@ -47,46 +47,69 @@ void W_Shotgun_Attack (void) } entity lgbeam_owner_ent; +.float swing_prev; void shotgun_meleethink (void) { - // store time when we started swinging down inside self.cnt - if(!self.cnt) - self.cnt = time; + // declarations + float i, f, swing, swing_factor, meleetime; + vector targpos; + + if(!self.cnt) { self.cnt = time; } makevectors(self.realowner.v_angle); - vector angle; - angle = v_forward; - float meleetime; meleetime = autocvar_g_balance_shotgun_secondary_melee_time * W_WeaponRateFactor(); - // perform trace - float f; - f = (self.cnt + meleetime - time) / meleetime * 2 - 1; - vector targpos; - targpos = self.realowner.origin + self.realowner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing; - - if(!lgbeam_owner_ent) + swing = bound(0, (self.cnt + meleetime - time) / meleetime, 1); + f = ((1 - swing) * autocvar_g_balance_shotgun_secondary_melee_traces); + + for(i=self.swing_prev; i < f; ++i) { - lgbeam_owner_ent = spawn(); - lgbeam_owner_ent.classname = "lgbeam_owner_ent"; + swing_factor = ((1 - (i / autocvar_g_balance_shotgun_secondary_melee_traces)) * 2 - 1); + + targpos = (self.realowner.origin + self.realowner.view_ofs + + (v_forward * autocvar_g_balance_shotgun_secondary_melee_range) + + (v_up * swing_factor * autocvar_g_balance_shotgun_secondary_melee_swing_up) + + (v_right * swing_factor * autocvar_g_balance_shotgun_secondary_melee_swing_side)); + + if(!lgbeam_owner_ent) // WTF IS THIS DOING HERE? + { + lgbeam_owner_ent = spawn(); + lgbeam_owner_ent.classname = "lgbeam_owner_ent"; + } + WarpZone_traceline_antilag(lgbeam_owner_ent, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, lgbeam_owner_ent, ANTILAG_LATENCY(self.realowner)); + + // te_lightning2(world, targpos, self.realowner.origin + self.realowner.view_ofs + v_forward * 5 - v_up * 5); + // te_customflash(targpos, 40, 2, '1 1 1'); + + // apply the damage, also remove self + if((trace_fraction < 1) && (trace_ent.takedamage == DAMAGE_AIM) && (trace_ent.classname == "player" || trace_ent.classname == "body")) + { + Damage(trace_ent, self.realowner, self.realowner, + autocvar_g_balance_shotgun_secondary_damage * min(1, swing_factor + 1), WEP_SHOTGUN | HITTYPE_SECONDARY, + self.realowner.origin + self.realowner.view_ofs, + v_forward * autocvar_g_balance_shotgun_secondary_force); + + if(accuracy_isgooddamage(self.realowner, trace_ent)) + accuracy_add(self.realowner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, swing_factor + 1)); + + // debug: te_customflash(targpos, 200, 2, '15 0 0'); + + remove(self); + return; + } } - WarpZone_traceline_antilag(lgbeam_owner_ent, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, lgbeam_owner_ent, ANTILAG_LATENCY(self.realowner)); - - // apply the damage, also remove self - if(trace_fraction < 1 && trace_ent.takedamage == DAMAGE_AIM && (trace_ent.classname == "player" || trace_ent.classname == "body")) + + if(time >= self.cnt + meleetime || (self.realowner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent { - vector force; - force = angle * autocvar_g_balance_shotgun_secondary_force; - if(accuracy_isgooddamage(self.realowner, trace_ent)) - accuracy_add(self.realowner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1)); - Damage (trace_ent, self.realowner, self.realowner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.realowner.origin + self.realowner.view_ofs, force); remove(self); + return; } - else if(time >= self.cnt + meleetime || (self.realowner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent - remove(self); - else // continue swinging the weapon in hope of hitting someone :) + else + { + self.swing_prev = i; self.nextthink = time; + } } void W_Shotgun_Attack2 (void) -- 2.39.2