From: Mario Date: Mon, 17 Jul 2017 23:20:39 +0000 (+1000) Subject: Port accuracy to ClientState X-Git-Tag: xonotic-v0.8.5~2573 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=38ad97a27a38fe7e497d1cccefca9a8d26de7862;p=xonotic%2Fxonotic-data.pk3dir.git Port accuracy to ClientState --- 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)