]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/state.qc
Attach entcs to the client state
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / state.qc
index 226ff1ba5680135cf45db7b6db3b34d6ead38a83..2a1168eae017978fe7f56d72004bda716fc49344 100644 (file)
@@ -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);
 }