From: Samual <samual@xonotic.org>
Date: Fri, 23 Sep 2011 04:56:37 +0000 (-0400)
Subject: More major updates to the shotgun secondary tracing, adding new features like multi... 
X-Git-Tag: xonotic-v0.6.0~40^2~92^2~1^2~51^2~3
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=d0e90eaedd6742088105adb1e0e0c5f954936d15;p=xonotic%2Fxonotic-data.pk3dir.git

More major updates to the shotgun secondary tracing, adding new features like multi-hit and non-player hit detection.
---

diff --git a/balance25.cfg b/balance25.cfg
index 9949192c8f..6dfadc12d8 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 fc1a3d034c..ec23f590c7 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 4741f00f2d..37ca225e9d 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 71ed51b815..7fc125b596 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 49de125f97..2d7afed7a9 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 bcb47926bb..f3cc68c478 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 e78db50a83..a6aaae0af4 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)