From e0b08311f47a6451a647f5c2ad00ec9f1c02aa70 Mon Sep 17 00:00:00 2001
From: terencehill <piuntn@gmail.com>
Date: Thu, 13 Jul 2017 19:20:05 +0200
Subject: [PATCH] Shotgun accuracy stats: also count damage dealt by
 projectiles hitting the enemy after the one that kills them. It fixes wrong
 accuracy percentage on shotgun shots that kill the enemy

---
 qcsrc/server/client.qc           |  5 +++++
 qcsrc/server/player.qc           | 10 ++++++----
 qcsrc/server/weapons/accuracy.qc |  2 +-
 qcsrc/server/weapons/tracing.qc  |  4 ++--
 4 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc
index 381373ad2b..da256e8f40 100644
--- a/qcsrc/server/client.qc
+++ b/qcsrc/server/client.qc
@@ -2708,6 +2708,11 @@ void PlayerPostThink (entity this)
 	}
 
 	if (IS_PLAYER(this)) {
+		if(this.death_time == time && IS_DEAD(this))
+		{
+			this.maxs.z = 5;
+			setsize(this, this.mins, this.maxs);
+		}
 		DrownPlayer(this);
 		CheckRules_Player(this);
 		UpdateChatBubble(this);
diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc
index 0ca9cb8491..ac312dc590 100644
--- a/qcsrc/server/player.qc
+++ b/qcsrc/server/player.qc
@@ -173,9 +173,6 @@ void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float da
 	vector v;
 	Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, this, attacker);
 
-	// damage resistance (ignore most of the damage from a bullet or similar)
-	damage = max(damage - 5, 1);
-
 	v = healtharmor_applydamage(this.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage);
 	take = v.x;
 	save = v.y;
@@ -625,11 +622,16 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
 			animdecide_setstate(this, this.anim_state | ANIMSTATE_DEAD1, true);
 		else
 			animdecide_setstate(this, this.anim_state | ANIMSTATE_DEAD2, true);
+
+		/* // postpone resize until frame end so that dead player can still
+		// properly get hit by all the projectiles fired in this frame (shotgun)
 		if (this.maxs.z > 5)
 		{
 			this.maxs_z = 5;
 			setsize(this, this.mins, this.maxs);
 		}
+		*/
+
 		// set damage function to corpse damage
 		this.event_damage = PlayerCorpseDamage;
 		// call the corpse damage function just in case it wants to gib
@@ -648,7 +650,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
 		if(autocvar_sv_gentle > 0 || autocvar_ekg || this.classname == "body") {
 			// remove corpse
 			// clones don't run any animation code any more, so we must gib them when they die :(
-			PlayerCorpseDamage(this, inflictor, attacker, autocvar_sv_gibhealth+1.0, deathtype, hitloc, force);
+			this.event_damage(this, inflictor, attacker, autocvar_sv_gibhealth + 1, deathtype, hitloc, force);
 		}
 
 		// reset fields the weapons may use just in case
diff --git a/qcsrc/server/weapons/accuracy.qc b/qcsrc/server/weapons/accuracy.qc
index 7cc06da3e6..6e4c675958 100644
--- a/qcsrc/server/weapons/accuracy.qc
+++ b/qcsrc/server/weapons/accuracy.qc
@@ -93,7 +93,7 @@ bool accuracy_isgooddamage(entity attacker, entity targ)
 	int mutator_check = MUTATOR_CALLHOOK(AccuracyTargetValid, attacker, targ);
 
 	if (warmup_stage) return false;
-	if (IS_DEAD(targ)) return false;
+	if (IS_DEAD(targ) && time > targ.death_time) return false;
 	if (STAT(FROZEN, targ)) return false;
 	if (SAME_TEAM(attacker, targ)) return false;
 
diff --git a/qcsrc/server/weapons/tracing.qc b/qcsrc/server/weapons/tracing.qc
index 8e4f88b8cd..6b07d8a0f5 100644
--- a/qcsrc/server/weapons/tracing.qc
+++ b/qcsrc/server/weapons/tracing.qc
@@ -422,10 +422,10 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo
 			yoda = 0;
 			MUTATOR_CALLHOOK(FireBullet_Hit, this, hit, start, end, damage, this.(weaponentity));
 			damage = M_ARGV(4, float);
-			float g = accuracy_isgooddamage(this, hit);
+			bool gooddamage = accuracy_isgooddamage(this, hit);
 			Damage(hit, this, this, damage * solid_penetration_left, dtype, start, force * dir * solid_penetration_left);
 			// calculate hits for ballistic weapons
-			if(g)
+			if(gooddamage)
 			{
 				// do not exceed 100%
 				float added_damage = min(damage - total_damage, damage * solid_penetration_left);
-- 
2.39.5