From 38ad97a27a38fe7e497d1cccefca9a8d26de7862 Mon Sep 17 00:00:00 2001
From: Mario <mario@smbclan.net>
Date: Tue, 18 Jul 2017 09:20:39 +1000
Subject: [PATCH] Port accuracy to ClientState

---
 qcsrc/common/playerstats.qc      |  2 +-
 qcsrc/common/state.qc            |  2 +-
 qcsrc/server/client.qh           |  1 +
 qcsrc/server/player.qc           |  2 +-
 qcsrc/server/weapons/accuracy.qc | 12 ++++++------
 5 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/qcsrc/common/playerstats.qc b/qcsrc/common/playerstats.qc
index 913e46362..4165115d8 100644
--- a/qcsrc/common/playerstats.qc
+++ b/qcsrc/common/playerstats.qc
@@ -108,7 +108,7 @@ float PlayerStats_GameReport_Event(string prefix, string event_id, float value)
 void PlayerStats_GameReport_Accuracy(entity p)
 {
 	#define ACCMAC(suffix, field) \
-		PS_GR_P_ADDVAL(p, sprintf("acc-%s-%s", it.netname, suffix), p.accuracy.(field[i-1]));
+		PS_GR_P_ADDVAL(p, sprintf("acc-%s-%s", it.netname, suffix), CS(p).accuracy.(field[i-1]));
 	FOREACH(Weapons, it != WEP_Null, {
 		ACCMAC("hit", accuracy_hit)
 		ACCMAC("fired", accuracy_fired)
diff --git a/qcsrc/common/state.qc b/qcsrc/common/state.qc
index a47188422..9774bd5b9 100644
--- a/qcsrc/common/state.qc
+++ b/qcsrc/common/state.qc
@@ -69,6 +69,7 @@ void PlayerScore_Detach(entity this);
 
 void ClientState_detach(entity this)
 {
+    accuracy_free(this); // TODO: needs to be before CS() is deleted!
 	delete(CS(this));
 	this._cs = NULL;
 
@@ -80,7 +81,6 @@ void ClientState_detach(entity this)
     anticheat_report_to_eventlog(this);
     playerdemo_shutdown(this);
     entcs_detach(this);
-    accuracy_free(this);
     ClientData_Detach(this);
     PlayerScore_Detach(this);
 }
diff --git a/qcsrc/server/client.qh b/qcsrc/server/client.qh
index f0c7a3bef..752862cad 100644
--- a/qcsrc/server/client.qh
+++ b/qcsrc/server/client.qh
@@ -101,6 +101,7 @@ CLASS(Client, Object)
     ATTRIB(Client, latency_time, float, this.latency_time);
     ATTRIB(Client, v_angle_old, vector, this.v_angle_old);
     ATTRIB(Client, model_randomizer, float, this.model_randomizer);
+    ATTRIB(Client, accuracy, entity, this.accuracy);
 
     METHOD(Client, m_unwind, bool(Client this));
 
diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc
index e34826cab..2d7d99229 100644
--- a/qcsrc/server/player.qc
+++ b/qcsrc/server/player.qc
@@ -553,7 +553,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
         // increment frag counter for used weapon type
         Weapon w = DEATH_WEAPONOF(deathtype);
 		if(w != WEP_Null && accuracy_isgooddamage(attacker, this))
-			attacker.accuracy.(accuracy_frags[w.m_id-1]) += 1;
+			CS(attacker).accuracy.(accuracy_frags[w.m_id-1]) += 1;
 
 		MUTATOR_CALLHOOK(PlayerDies, inflictor, attacker, this, deathtype, damage);
 		damage = M_ARGV(4, float);
diff --git a/qcsrc/server/weapons/accuracy.qc b/qcsrc/server/weapons/accuracy.qc
index 7cc06da3e..bee961bc0 100644
--- a/qcsrc/server/weapons/accuracy.qc
+++ b/qcsrc/server/weapons/accuracy.qc
@@ -20,7 +20,7 @@ bool accuracy_send(entity this, entity to, int sf)
 
 	entity a = this.owner;
 	if (IS_SPEC(a)) a = a.enemy;
-	a = a.accuracy;
+	a = CS(a).accuracy;
 
 	if (to != a.owner)
 		if (!autocvar_sv_accuracy_data_share && !a.owner.cvar_cl_accuracy_data_share)
@@ -40,7 +40,7 @@ bool accuracy_send(entity this, entity to, int sf)
 // init/free
 void accuracy_init(entity e)
 {
-	entity a = e.accuracy = new_pure(accuracy);
+	entity a = CS(e).accuracy = new_pure(accuracy);
 	a.owner = e;
 	a.drawonlytoclient = e;
 	Net_LinkEntity(a, false, 0, accuracy_send);
@@ -48,13 +48,13 @@ void accuracy_init(entity e)
 
 void accuracy_free(entity e)
 {
-	delete(e.accuracy);
+	delete(CS(e).accuracy);
 }
 
 // force a resend of a player's accuracy stats
 void accuracy_resend(entity e)
 {
-	e.accuracy.SendFlags = 0xFFFFFF;
+	CS(e).accuracy.SendFlags = 0xFFFFFF;
 }
 
 // update accuracy stats
@@ -64,7 +64,7 @@ void accuracy_resend(entity e)
 void accuracy_add(entity this, int w, int fired, int hit)
 {
 	if (IS_INDEPENDENT_PLAYER(this)) return;
-	entity a = this.accuracy;
+	entity a = CS(this).accuracy;
 	if (!a) return;
 	if (!hit && !fired) return;
 	w -= WEP_FIRST;
@@ -85,7 +85,7 @@ void accuracy_add(entity this, int w, int fired, int hit)
 	if (b == accuracy_byte(a.accuracy_hit[w], a.accuracy_fired[w])) return; // no change
 	int sf = 1 << (w % 24);
 	a.SendFlags |= sf;
-	FOREACH_CLIENT(IS_SPEC(it) && it.enemy == this, LAMBDA(it.accuracy.SendFlags |= sf));
+	FOREACH_CLIENT(IS_SPEC(it) && it.enemy == this, LAMBDA(CS(it).accuracy.SendFlags |= sf));
 }
 
 bool accuracy_isgooddamage(entity attacker, entity targ)
-- 
2.39.5