From d0e90eaedd6742088105adb1e0e0c5f954936d15 Mon Sep 17 00:00:00 2001 From: Samual Date: Fri, 23 Sep 2011 00:56:37 -0400 Subject: [PATCH] More major updates to the shotgun secondary tracing, adding new features like multi-hit and non-player hit detection. --- balance25.cfg | 2 + balanceFruit.cfg | 2 + balanceLeeStricklin.cfg | 2 + balanceXonotic.cfg | 6 ++- balancetZork.cfg | 2 + qcsrc/server/autocvars.qh | 2 + qcsrc/server/w_shotgun.qc | 77 +++++++++++++++++++++++---------------- 7 files changed, 60 insertions(+), 33 deletions(-) diff --git a/balance25.cfg b/balance25.cfg index 9949192c8..6dfadc12d 100644 --- a/balance25.cfg +++ b/balance25.cfg @@ -265,6 +265,8 @@ 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_melee_nonplayerdamage 0 +set g_balance_shotgun_secondary_melee_multihit 1 set g_balance_shotgun_secondary_damage 115 set g_balance_shotgun_secondary_force 150 set g_balance_shotgun_secondary_refire 1.1 diff --git a/balanceFruit.cfg b/balanceFruit.cfg index fc1a3d034..ec23f590c 100644 --- a/balanceFruit.cfg +++ b/balanceFruit.cfg @@ -265,6 +265,8 @@ 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_melee_nonplayerdamage 0 +set g_balance_shotgun_secondary_melee_multihit 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 4741f00f2..37ca225e9 100644 --- a/balanceLeeStricklin.cfg +++ b/balanceLeeStricklin.cfg @@ -265,6 +265,8 @@ 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_melee_nonplayerdamage 0 +set g_balance_shotgun_secondary_melee_multihit 1 set g_balance_shotgun_secondary_damage 84 set g_balance_shotgun_secondary_force 147 set g_balance_shotgun_secondary_refire 1.1 diff --git a/balanceXonotic.cfg b/balanceXonotic.cfg index 71ed51b81..7fc125b59 100644 --- a/balanceXonotic.cfg +++ b/balanceXonotic.cfg @@ -265,9 +265,11 @@ 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_melee_nonplayerdamage 0 +set g_balance_shotgun_secondary_melee_multihit 1 +set g_balance_shotgun_secondary_damage 100 set g_balance_shotgun_secondary_force 200 -set g_balance_shotgun_secondary_refire 1.1 +set g_balance_shotgun_secondary_refire 1.4 set g_balance_shotgun_secondary_animtime 1 set g_balance_shotgun_reload_ammo 0 //default: 5 set g_balance_shotgun_reload_time 2 diff --git a/balancetZork.cfg b/balancetZork.cfg index 49de125f9..2d7afed7a 100644 --- a/balancetZork.cfg +++ b/balancetZork.cfg @@ -265,6 +265,8 @@ 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_melee_nonplayerdamage 0 +set g_balance_shotgun_secondary_melee_multihit 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/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index bcb47926b..f3cc68c47 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -656,6 +656,8 @@ 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_melee_nonplayerdamage; +float autocvar_g_balance_shotgun_secondary_melee_multihit; float autocvar_g_balance_shotgun_secondary_refire; float autocvar_g_balance_shotgun_reload_ammo; float autocvar_g_balance_shotgun_reload_time; diff --git a/qcsrc/server/w_shotgun.qc b/qcsrc/server/w_shotgun.qc index e78db50a8..a6aaae0af 100644 --- a/qcsrc/server/w_shotgun.qc +++ b/qcsrc/server/w_shotgun.qc @@ -46,23 +46,31 @@ void W_Shotgun_Attack (void) W_AttachToShotorg(flash, '5 0 0'); } -entity lgbeam_owner_ent; .float swing_prev; +.entity swing_alreadyhit; void shotgun_meleethink (void) { // declarations - float i, f, swing, swing_factor, meleetime; + float i, f, swing, swing_factor, swing_damage, meleetime, is_player; vector targpos; - - if(!self.cnt) { self.cnt = time; } - makevectors(self.realowner.v_angle); + if(!self.cnt) { self.cnt = time; } // set start time of melee + makevectors(self.realowner.v_angle); // update values for v_* vectors + + // calculate swing percentage based on time meleetime = autocvar_g_balance_shotgun_secondary_melee_time * W_WeaponRateFactor(); - swing = bound(0, (self.cnt + meleetime - time) / meleetime, 1); f = ((1 - swing) * autocvar_g_balance_shotgun_secondary_melee_traces); + // check to see if we can still continue, otherwise give up now + if(time >= self.cnt + meleetime || (self.realowner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) + { + remove(self); + return; + } + + // if okay, perform the traces needed for this frame for(i=self.swing_prev; i < f; ++i) { swing_factor = ((1 - (i / autocvar_g_balance_shotgun_secondary_melee_traces)) * 2 - 1); @@ -71,45 +79,52 @@ void shotgun_meleethink (void) + (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); + WarpZone_traceline_antilag(self.realowner, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, lgbeam_owner_ent, ANTILAG_LATENCY(self.realowner)); + + // draw lightning beams for debugging + // 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'); + + is_player = (trace_ent.classname == "player" || trace_ent.classname == "body"); - // apply the damage, also remove self - if((trace_fraction < 1) && (trace_ent.takedamage == DAMAGE_AIM) && (trace_ent.classname == "player" || trace_ent.classname == "body")) + if((trace_fraction < 1) // if trace is good, apply the damage and remove self + && (trace_ent.takedamage == DAMAGE_AIM) + && (trace_ent != self.swing_alreadyhit) + && (is_player || autocvar_g_balance_shotgun_secondary_melee_nonplayerdamage)) { + if(is_player) // this allows us to be able to nerf the non-player damage done in e.g. assault or onslaught. + swing_damage = (autocvar_g_balance_shotgun_secondary_damage * min(1, swing_factor + 1)); + else + swing_damage = (autocvar_g_balance_shotgun_secondary_melee_nonplayerdamage * min(1, swing_factor + 1)); + Damage(trace_ent, self.realowner, self.realowner, - autocvar_g_balance_shotgun_secondary_damage * min(1, swing_factor + 1), WEP_SHOTGUN | HITTYPE_SECONDARY, + swing_damage, 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)); + accuracy_add(self.realowner, WEP_SHOTGUN, 0, swing_damage); - // debug: te_customflash(targpos, 200, 2, '15 0 0'); + // draw large red flash for debugging + // te_customflash(targpos, 200, 2, '15 0 0'); - remove(self); - return; + if(autocvar_g_balance_shotgun_secondary_melee_multihit) // allow multiple hits with one swing, but not against the same player twice. + { + self.swing_alreadyhit = trace_ent; + continue; // move along to next trace + } + else + { + remove(self); + return; + } } } - 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); - return; - } - else - { - self.swing_prev = i; - self.nextthink = time; - } + // set up next frame + self.swing_prev = i; + self.nextthink = time; } void W_Shotgun_Attack2 (void) -- 2.39.2