X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fstate.qc;h=882b2568741f0ba9194f73285c5567891144cd52;hp=226ff1ba5680135cf45db7b6db3b34d6ead38a83;hb=f0b43aed4f20e1034b2f7538d8c7252b29bd67a0;hpb=6f4c7132e635c0150e3894f2f9958b361ce0c238 diff --git a/qcsrc/common/state.qc b/qcsrc/common/state.qc index 226ff1ba5..2a1168eae 100644 --- a/qcsrc/common/state.qc +++ b/qcsrc/common/state.qc @@ -1,32 +1,35 @@ #include "state.qh" -void Inventory_new(entity this); +void Inventory_new(PlayerState this); void Inventory_delete(entity this); void PlayerState_attach(entity this) { this._ps = NEW(PlayerState, this); - Inventory_new(this); + Inventory_new(PS(this)); } void PlayerState_detach(entity this) { - if (!PS(this)) return; // initial connect - FOREACH_CLIENT(PS(it) == PS(this), { PS(it) = NULL; }); - remove(PS(this)); - this._ps = NULL; + PlayerState ps = PS(this); + if (!ps) return; // initial connect + PS(this) = NULL; - Inventory_delete(self); + if (ps.m_client != this) return; // don't own state, spectator + ps.ps_push(ps, this); + Inventory_delete(ps); + + FOREACH_CLIENT(PS(it) == ps, { PS(it) = NULL; }); + delete(ps); } -void GetCvars(int); +void GetCvars(entity this, entity store, int); void DecodeLevelParms(entity this); void PlayerScore_Attach(entity this); void ClientData_Attach(entity this); void accuracy_init(entity this); void entcs_attach(entity this); -void playerdemo_init(entity this); void anticheat_init(entity this); void W_HitPlotOpen(entity this); void bot_clientconnect(entity this); @@ -35,30 +38,24 @@ void ClientState_attach(entity this) { this._cs = NEW(ClientState, this); - GetCvars(0); // get other cvars from player - - // TODO: xonstat elo.txt support, until then just 404s - if (false && IS_REAL_CLIENT(this)) { PlayerStats_PlayerBasic_CheckUpdate(this); } + GetCvars(this, CS(this), 0); // get other cvars from player // TODO: fold all of these into ClientState DecodeLevelParms(this); PlayerScore_Attach(this); + PlayerStats_PlayerBasic_CheckUpdate(this); ClientData_Attach(this); accuracy_init(this); entcs_attach(this); - playerdemo_init(this); anticheat_init(this); W_HitPlotOpen(this); - - bot_clientconnect(this); } -void bot_clientdisconnect(); +void bot_clientdisconnect(entity this); void W_HitPlotClose(entity this); -void anticheat_report(); -void playerdemo_shutdown(); +void anticheat_report_to_eventlog(entity this); void entcs_detach(entity this); void accuracy_free(entity this); void ClientData_Detach(entity this); @@ -66,18 +63,16 @@ void PlayerScore_Detach(entity this); void ClientState_detach(entity this) { - remove(CS(this)); + GetCvars(this, CS(this), -1); // free cvars TODO: is this still needed now that it's stored on the clientstate entity? + accuracy_free(this); // TODO: needs to be before CS() is deleted! + PlayerScore_Detach(this); // what ^they^ said + W_HitPlotClose(this); + ClientData_Detach(this); + entcs_detach(this); + delete(CS(this)); this._cs = NULL; - GetCvars(-1); // free cvars - - bot_clientdisconnect(); + bot_clientdisconnect(this); - W_HitPlotClose(this); - anticheat_report(); - playerdemo_shutdown(); - entcs_detach(this); - accuracy_free(self); - ClientData_Detach(this); - PlayerScore_Detach(self); + anticheat_report_to_eventlog(this); }