From 880ec900682c7c466960b24bdeed3a68a9646213 Mon Sep 17 00:00:00 2001 From: TimePath Date: Thu, 24 Dec 2015 13:33:17 +1100 Subject: [PATCH] ClientConnect: cleanup --- .../mutator/waypoints/waypointsprites.qc | 4 - .../mutator/waypoints/waypointsprites.qh | 1 - qcsrc/server/anticheat.qc | 8 +- qcsrc/server/anticheat.qh | 2 +- qcsrc/server/bot/bot.qc | 7 +- qcsrc/server/bot/bot.qh | 2 +- qcsrc/server/cheats.qc | 5 - qcsrc/server/cheats.qh | 1 - qcsrc/server/cl_client.qc | 315 ++++++++---------- qcsrc/server/g_hook.qc | 8 - qcsrc/server/g_hook.qh | 1 - qcsrc/server/ipban.qc | 14 +- qcsrc/server/playerdemo.qc | 6 +- qcsrc/server/playerdemo.qh | 2 +- 14 files changed, 152 insertions(+), 224 deletions(-) diff --git a/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc b/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc index 9db086a8b..0710a49d0 100644 --- a/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc +++ b/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc @@ -877,10 +877,6 @@ void WaypointSprite_Init() waypointsprite_deadlifetime = autocvar_sv_waypointsprite_deadlifetime; } -void WaypointSprite_InitClient(entity e) -{ -} - void WaypointSprite_Kill(entity wp) { if (!wp) return; diff --git a/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qh b/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qh index c9a553431..4e3ceb0e5 100644 --- a/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qh +++ b/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qh @@ -155,7 +155,6 @@ void WaypointSprite_HelpMePing(entity e); void WaypointSprite_FadeOutIn(entity e, float t); void WaypointSprite_Init(); -void WaypointSprite_InitClient(entity e); void WaypointSprite_Kill(entity wp); diff --git a/qcsrc/server/anticheat.qc b/qcsrc/server/anticheat.qc index 79442299e..877d41657 100644 --- a/qcsrc/server/anticheat.qc +++ b/qcsrc/server/anticheat.qc @@ -239,10 +239,10 @@ void anticheat_endframe() anticheat_div0_evade_evasion_delta += frametime * (0.5 + random()); } -void anticheat_init() -{SELFPARAM(); - self.anticheat_speedhack_offset = 0; - self.anticheat_jointime = servertime; +void anticheat_init(entity this) +{ + this.anticheat_speedhack_offset = 0; + this.anticheat_jointime = servertime; } void anticheat_shutdown() diff --git a/qcsrc/server/anticheat.qh b/qcsrc/server/anticheat.qh index 9d2aa9405..5e6599b7e 100644 --- a/qcsrc/server/anticheat.qh +++ b/qcsrc/server/anticheat.qh @@ -1,7 +1,7 @@ #ifndef ANTICHEAT_H #define ANTICHEAT_H -void anticheat_init(); +void anticheat_init(entity this); void anticheat_report(); void anticheat_shutdown(); diff --git a/qcsrc/server/bot/bot.qc b/qcsrc/server/bot/bot.qc index b12556471..671014b80 100644 --- a/qcsrc/server/bot/bot.qc +++ b/qcsrc/server/bot/bot.qc @@ -407,10 +407,9 @@ void bot_clientdisconnect() bot_waypoint_queue_owner = world; } -void bot_clientconnect() -{SELFPARAM(); - if (!IS_BOT_CLIENT(self)) - return; +void bot_clientconnect(entity this) +{ + if (!IS_BOT_CLIENT(this)) return; self.bot_preferredcolors = self.clientcolors; self.bot_nextthink = time - random(); self.lag_func = bot_lagfunc; diff --git a/qcsrc/server/bot/bot.qh b/qcsrc/server/bot/bot.qh index 12cd763e1..7927942ea 100644 --- a/qcsrc/server/bot/bot.qh +++ b/qcsrc/server/bot/bot.qh @@ -99,7 +99,7 @@ void bot_custom_weapon_priority_setup(); void bot_endgame(); void bot_relinkplayerlist(); void bot_clientdisconnect(); -void bot_clientconnect(); +void bot_clientconnect(entity this); void bot_removefromlargestteam(); void bot_removenewest(); void autoskill(float factor); diff --git a/qcsrc/server/cheats.qc b/qcsrc/server/cheats.qc index cdad6d9fe..558fa2628 100644 --- a/qcsrc/server/cheats.qc +++ b/qcsrc/server/cheats.qc @@ -34,7 +34,6 @@ float CheatCommand(float argc) { return 0; } float CheatFrame() { return 0; } void CheatInit() { cheatcount_total = world.cheatcount; } void CheatShutdown() { } -void CheatInitClient() { } void CheatShutdownClient() { } void Drag_MoveDrag(entity from, entity to) { } @@ -54,10 +53,6 @@ void CheatShutdown() { } -void CheatInitClient() -{ -} - void CheatShutdownClient() { } diff --git a/qcsrc/server/cheats.qh b/qcsrc/server/cheats.qh index 122d2f7e9..16d17ca12 100644 --- a/qcsrc/server/cheats.qh +++ b/qcsrc/server/cheats.qh @@ -9,7 +9,6 @@ float cheatcount_total; .float cheatcount; void CheatInit(); void CheatShutdown(); -void CheatInitClient(); void CheatShutdownClient(); float CheatImpulse(float i); float CheatCommand(float argc); diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 6c3e2ec0c..32ec6eb03 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -58,56 +58,44 @@ void send_CSQC_teamnagger() { bool ClientData_Send(entity this, entity to, int sf) { - if(to != self.owner) - { - error("wtf"); - return false; - } - - entity e; + assert(to == this.owner, return false); - e = to; - if(IS_SPEC(to)) - e = to.enemy; + entity e = to; + if (IS_SPEC(e)) e = e.enemy; sf = 0; - - if(e.race_completed) - sf |= 1; // forced scoreboard - if(to.spectatee_status) - sf |= 2; // spectator ent number follows - if(e.zoomstate) - sf |= 4; // zoomed - if(e.porto_v_angle_held) - sf |= 8; // angles held + if (e.race_completed) sf |= 1; // forced scoreboard + if (to.spectatee_status) sf |= 2; // spectator ent number follows + if (e.zoomstate) sf |= 4; // zoomed + if (e.porto_v_angle_held) sf |= 8; // angles held WriteHeader(MSG_ENTITY, ENT_CLIENT_CLIENTDATA); WriteByte(MSG_ENTITY, sf); - if(sf & 2) + if (sf & 2) + { WriteByte(MSG_ENTITY, to.spectatee_status); - - if(sf & 8) + } + if (sf & 8) { WriteAngle(MSG_ENTITY, e.v_angle.x); WriteAngle(MSG_ENTITY, e.v_angle.y); } - return true; } -void ClientData_Attach() -{SELFPARAM(); +void ClientData_Attach(entity this) +{ Net_LinkEntity(this.clientdata = new(clientdata), false, 0, ClientData_Send); make_pure(this.clientdata); self.clientdata.drawonlytoclient = this; self.clientdata.owner = this; } -void ClientData_Detach() -{SELFPARAM(); - remove(self.clientdata); - self.clientdata = world; +void ClientData_Detach(entity this) +{ + remove(this.clientdata); + self.clientdata = NULL; } void ClientData_Touch(entity e) @@ -728,15 +716,15 @@ void SetChangeParms () DecodeLevelParms ============= */ -void DecodeLevelParms () -{SELFPARAM(); +void DecodeLevelParms(entity this) +{ // load parms - self.parm_idlesince = parm1; - if(self.parm_idlesince == -(86400 * 366)) - self.parm_idlesince = time; + this.parm_idlesince = parm1; + if (this.parm_idlesince == -(86400 * 366)) + this.parm_idlesince = time; // whatever happens, allow 60 seconds of idling directly after connect for map loading - self.parm_idlesince = max(self.parm_idlesince, time - sv_maxidle + 60); + this.parm_idlesince = max(this.parm_idlesince, time - sv_maxidle + 60); MUTATOR_CALLHOOK(DecodeLevelParms); } @@ -994,225 +982,188 @@ void ClientPreConnect () } #endif -/* +/** ============= ClientConnect Called when a client connects to the server ============= */ -void DecodeLevelParms (); -void ClientConnect () +void ClientConnect() { SELFPARAM(); - ClientState_attach(this); - float t; - - if(IS_CLIENT(self)) - { - LOG_INFO("Warning: ClientConnect, but already connected!\n"); - return; - } - - if(Ban_MaybeEnforceBanOnce(self)) - return; - - DecodeLevelParms(); + if (Ban_MaybeEnforceBanOnce(this)) return; + assert(!IS_CLIENT(this), return); + assert(player_count >= 0, player_count = 0); + this.classname = "player_joining"; + this.flags = FL_CLIENT; #ifdef WATERMARK - Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_WATERMARK, WATERMARK); + Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_WATERMARK, WATERMARK); #endif - - self.classname = "player_joining"; - - self.flags = FL_CLIENT; - self.version_nagtime = time + 10 + random() * 10; - - if(player_count<0) - { - LOG_TRACE("BUG player count is lower than zero, this cannot happen!\n"); - player_count = 0; - } + this.version_nagtime = time + 10 + random() * 10; // TODO: xonstat elo.txt support, until then just 404s - if(false && IS_REAL_CLIENT(self)) { PlayerStats_PlayerBasic_CheckUpdate(self); } + if (false && IS_REAL_CLIENT(this)) { PlayerStats_PlayerBasic_CheckUpdate(this); } - PlayerScore_Attach(self); - ClientData_Attach(); - accuracy_init(self); - Inventory_new(self); - - bot_clientconnect(); - - playerdemo_init(); - - anticheat_init(); + ClientState_attach(this); + // TODO: fold all of these into ClientState + DecodeLevelParms(this); + PlayerScore_Attach(this); + ClientData_Attach(this); + accuracy_init(this); + Inventory_new(this); + playerdemo_init(this); + anticheat_init(this); + entcs_attach(this); + W_HitPlotOpen(this); + + bot_clientconnect(this); // identify the right forced team - if(autocvar_g_campaign) + if (autocvar_g_campaign) { - if(IS_REAL_CLIENT(self)) // only players, not bots + if (IS_REAL_CLIENT(this)) // only players, not bots { - switch(autocvar_g_campaign_forceteam) + switch (autocvar_g_campaign_forceteam) { - case 1: self.team_forced = NUM_TEAM_1; break; - case 2: self.team_forced = NUM_TEAM_2; break; - case 3: self.team_forced = NUM_TEAM_3; break; - case 4: self.team_forced = NUM_TEAM_4; break; - default: self.team_forced = 0; + case 1: this.team_forced = NUM_TEAM_1; break; + case 2: this.team_forced = NUM_TEAM_2; break; + case 3: this.team_forced = NUM_TEAM_3; break; + case 4: this.team_forced = NUM_TEAM_4; break; + default: this.team_forced = 0; } } } - else if(PlayerInIDList(self, autocvar_g_forced_team_red)) - self.team_forced = NUM_TEAM_1; - else if(PlayerInIDList(self, autocvar_g_forced_team_blue)) - self.team_forced = NUM_TEAM_2; - else if(PlayerInIDList(self, autocvar_g_forced_team_yellow)) - self.team_forced = NUM_TEAM_3; - else if(PlayerInIDList(self, autocvar_g_forced_team_pink)) - self.team_forced = NUM_TEAM_4; - else if(autocvar_g_forced_team_otherwise == "red") - self.team_forced = NUM_TEAM_1; - else if(autocvar_g_forced_team_otherwise == "blue") - self.team_forced = NUM_TEAM_2; - else if(autocvar_g_forced_team_otherwise == "yellow") - self.team_forced = NUM_TEAM_3; - else if(autocvar_g_forced_team_otherwise == "pink") - self.team_forced = NUM_TEAM_4; - else if(autocvar_g_forced_team_otherwise == "spectate") - self.team_forced = -1; - else if(autocvar_g_forced_team_otherwise == "spectator") - self.team_forced = -1; - else - self.team_forced = 0; - - if(!teamplay) - if(self.team_forced > 0) - self.team_forced = 0; + else if (PlayerInIDList(this, autocvar_g_forced_team_red)) this.team_forced = NUM_TEAM_1; + else if (PlayerInIDList(this, autocvar_g_forced_team_blue)) this.team_forced = NUM_TEAM_2; + else if (PlayerInIDList(this, autocvar_g_forced_team_yellow)) this.team_forced = NUM_TEAM_3; + else if (PlayerInIDList(this, autocvar_g_forced_team_pink)) this.team_forced = NUM_TEAM_4; + else switch (autocvar_g_forced_team_otherwise) + { + default: this.team_forced = 0; break; + case "red": this.team_forced = NUM_TEAM_1; break; + case "blue": this.team_forced = NUM_TEAM_2; break; + case "yellow": this.team_forced = NUM_TEAM_3; break; + case "pink": this.team_forced = NUM_TEAM_4; break; + case "spectate": + case "spectator": + this.team_forced = -1; + break; + } + if (!teamplay && this.team_forced > 0) this.team_forced = 0; - JoinBestTeam(self, false, false); // if the team number is valid, keep it + JoinBestTeam(this, false, false); // if the team number is valid, keep it - if((autocvar_sv_spectate == 1) || autocvar_g_campaign || self.team_forced < 0) { - self.classname = STR_OBSERVER; + if (autocvar_sv_spectate || autocvar_g_campaign || this.team_forced < 0) { + this.classname = STR_OBSERVER; } else { - if(teamplay) + if (!teamplay || autocvar_g_balance_teams) { - if(autocvar_g_balance_teams) - { - self.classname = STR_PLAYER; - campaign_bots_may_start = 1; - } - else - { - self.classname = STR_OBSERVER; // do it anyway - } + this.classname = STR_PLAYER; + campaign_bots_may_start = 1; } else { - self.classname = STR_PLAYER; - campaign_bots_may_start = 1; + this.classname = STR_OBSERVER; // do it anyway } } - self.playerid = (playerid_last = playerid_last + 1); - - PlayerStats_GameReport_AddEvent(sprintf("kills-%d", self.playerid)); + this.playerid = ++playerid_last; - if(IS_BOT_CLIENT(self)) - PlayerStats_GameReport_AddPlayer(self); + PlayerStats_GameReport_AddEvent(sprintf("kills-%d", this.playerid)); - if(autocvar_sv_eventlog) - GameLogEcho(strcat(":join:", ftos(self.playerid), ":", ftos(etof(self)), ":", ((IS_REAL_CLIENT(self)) ? self.netaddress : "bot"), ":", self.netname)); + // always track bots, don't ask for cl_allow_uidtracking + if (IS_BOT_CLIENT(this)) PlayerStats_GameReport_AddPlayer(this); - LogTeamchange(self.playerid, self.team, 1); + if (autocvar_sv_eventlog) + GameLogEcho(strcat(":join:", ftos(this.playerid), ":", ftos(etof(this)), ":", ((IS_REAL_CLIENT(this)) ? this.netaddress : "bot"), ":", this.netname)); - self.just_joined = true; // stop spamming the eventlog with additional lines when the client connects + LogTeamchange(this.playerid, this.team, 1); - self.netname_previous = strzone(self.netname); + this.just_joined = true; // stop spamming the eventlog with additional lines when the client connects - if(IS_PLAYER(self) && teamplay) - Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_ENT_4(self, INFO_JOIN_CONNECT_TEAM_), self.netname); - else - Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_JOIN_CONNECT, self.netname); + this.netname_previous = strzone(this.netname); - stuffcmd(self, strcat(clientstuff, "\n")); - stuffcmd(self, "cl_particles_reloadeffects\n"); // TODO do we still need this? + Send_Notification(NOTIF_ALL, NULL, MSG_INFO, (teamplay ? APP_TEAM_ENT_4(this, INFO_JOIN_CONNECT_TEAM_) : INFO_JOIN_CONNECT), this.netname); - FixClientCvars(self); + stuffcmd(this, clientstuff, "\n"); + stuffcmd(this, "cl_particles_reloadeffects\n"); // TODO do we still need this? - // spawnfunc_waypoint sprites - WaypointSprite_InitClient(self); + FixClientCvars(this); - // Wazat's grappling hook - SetGrappleHookBindings(); + // Grappling hook + stuffcmd(this, "alias +hook +button6\n"); + stuffcmd(this, "alias -hook -button6\n"); // Jetpack binds - stuffcmd(self, "alias +jetpack +button10\n"); - stuffcmd(self, "alias -jetpack -button10\n"); + stuffcmd(this, "alias +jetpack +button10\n"); + stuffcmd(this, "alias -jetpack -button10\n"); // get version info from player - stuffcmd(self, "cmd clientversion $gameversion\n"); + stuffcmd(this, "cmd clientversion $gameversion\n"); // get other cvars from player GetCvars(0); // notify about available teams - if(teamplay) + if (teamplay) { - CheckAllowedTeams(self); - t = 0; if(c1 >= 0) t |= 1; if(c2 >= 0) t |= 2; if(c3 >= 0) t |= 4; if(c4 >= 0) t |= 8; - stuffcmd(self, strcat("set _teams_available ", ftos(t), "\n")); + CheckAllowedTeams(this); + int t = 0; + if (c1 >= 0) t |= BIT(0); + if (c2 >= 0) t |= BIT(1); + if (c3 >= 0) t |= BIT(2); + if (c4 >= 0) t |= BIT(3); + stuffcmd(this, sprintf("set _teams_available %d\n", t)); } else - stuffcmd(self, "set _teams_available 0\n"); - - entcs_attach(self); + { + stuffcmd(this, "set _teams_available 0\n"); + } bot_relinkplayerlist(); - self.spectatortime = time; - if(blockSpectators) + this.spectatortime = time; + if (blockSpectators) { - Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime); + Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime); } - self.jointime = time; - self.allowed_timeouts = autocvar_sv_timeout_number; + this.jointime = time; + this.allowed_timeouts = autocvar_sv_timeout_number; - if(IS_REAL_CLIENT(self)) + if (IS_REAL_CLIENT(this)) { - if(!autocvar_g_campaign) + if (!autocvar_g_campaign) { - self.motd_actived_time = -1; - Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MOTD, getwelcomemessage()); + this.motd_actived_time = -1; + Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_MOTD, getwelcomemessage()); } - if(g_weaponarena_weapons == WEPSET(TUBA)) - stuffcmd(self, "cl_cmd settemp chase_active 1\n"); + if (g_weaponarena_weapons == WEPSET(TUBA)) + stuffcmd(this, "cl_cmd settemp chase_active 1\n"); } - if(!sv_foginterval && world.fog != "") - stuffcmd(self, strcat("\nfog ", world.fog, "\nr_fog_exp2 0\nr_drawfog 1\n")); - - W_HitPlotOpen(self); + if (!sv_foginterval && world.fog != "") + stuffcmd(this, strcat("\nfog ", world.fog, "\nr_fog_exp2 0\nr_drawfog 1\n")); - if(autocvar_sv_teamnagger && !(autocvar_bot_vs_human && (c3==-1 && c4==-1)) && !g_ca && !g_cts && !g_race) // teamnagger is currently bad for ca, race & cts - send_CSQC_teamnagger(); + if (autocvar_sv_teamnagger && !(autocvar_bot_vs_human && (c3==-1 && c4==-1))) + if (!g_ca && !g_cts && !g_race) // teamnagger is currently bad for ca, race & cts + send_CSQC_teamnagger(); - CheatInitClient(); + CSQCMODEL_AUTOINIT(this); - CSQCMODEL_AUTOINIT(self); + this.model_randomizer = random(); - self.model_randomizer = random(); + if (IS_REAL_CLIENT(this)) + sv_notice_join(this); - if(IS_REAL_CLIENT(self)) - sv_notice_join(self); - - for (entity e = world; (e = findfloat(e, init_for_player_needed, 1)); ) { - WITH(entity, self, e, e.init_for_player(this)); - } + FOREACH_ENTITY_FLOAT(init_for_player_needed, true, { + WITH(entity, self, it, it.init_for_player(it)); + }); - MUTATOR_CALLHOOK(ClientConnect, self); + MUTATOR_CALLHOOK(ClientConnect, this); } /* ============= @@ -1285,7 +1236,7 @@ void ClientDisconnect () accuracy_free(self); Inventory_delete(self); - ClientData_Detach(); + ClientData_Detach(this); PlayerScore_Detach(self); if(self.netname_previous) diff --git a/qcsrc/server/g_hook.qc b/qcsrc/server/g_hook.qc index 06c49907b..5515c57aa 100644 --- a/qcsrc/server/g_hook.qc +++ b/qcsrc/server/g_hook.qc @@ -419,11 +419,3 @@ void GrappleHookInit() hook_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK.m_id), false, false, 4); } } - -void SetGrappleHookBindings() -{SELFPARAM(); - // this function has been modified for Xonotic - // don't remove these lines! old server or demos coud overwrite the new aliases - stuffcmd(self, "alias +hook +button6\n"); - stuffcmd(self, "alias -hook -button6\n"); -} diff --git a/qcsrc/server/g_hook.qh b/qcsrc/server/g_hook.qh index 2a2d566b3..95ba88205 100644 --- a/qcsrc/server/g_hook.qh +++ b/qcsrc/server/g_hook.qh @@ -4,7 +4,6 @@ // Wazat's grappling hook .entity hook; void RemoveGrapplingHook(entity pl); -void SetGrappleHookBindings(); // (note: you can change the hook impulse #'s to whatever you please) .float hook_time; diff --git a/qcsrc/server/ipban.qc b/qcsrc/server/ipban.qc index 7463fefbe..12d12bf54 100644 --- a/qcsrc/server/ipban.qc +++ b/qcsrc/server/ipban.qc @@ -446,12 +446,11 @@ float Ban_IsClientBanned(entity client, float idx) return false; } -float Ban_MaybeEnforceBan(entity client) +bool Ban_MaybeEnforceBan(entity client) { - if(Ban_IsClientBanned(client, -1)) + if (Ban_IsClientBanned(client, -1)) { - string s; - s = strcat("^1NOTE:^7 banned client ", client.netaddress, " just tried to enter\n"); + string s = sprintf("^1NOTE:^7 banned client %s just tried to enter\n", client.netaddress); dropclient(client); bprint(s); return true; @@ -459,11 +458,10 @@ float Ban_MaybeEnforceBan(entity client) return false; } -.float ban_checked; -float Ban_MaybeEnforceBanOnce(entity client) +.bool ban_checked; +bool Ban_MaybeEnforceBanOnce(entity client) { - if(client.ban_checked) - return false; + if (client.ban_checked) return false; client.ban_checked = true; return Ban_MaybeEnforceBan(client); } diff --git a/qcsrc/server/playerdemo.qc b/qcsrc/server/playerdemo.qc index 5273a65a7..6f263ae44 100644 --- a/qcsrc/server/playerdemo.qc +++ b/qcsrc/server/playerdemo.qc @@ -12,9 +12,9 @@ const float PLAYERDEMO_MODE_OFF = 0; const float PLAYERDEMO_MODE_READING = 1; const float PLAYERDEMO_MODE_WRITING = 2; -void playerdemo_init() -{SELFPARAM(); - self.playerdemo_mode = PLAYERDEMO_MODE_OFF; +void playerdemo_init(entity this) +{ + this.playerdemo_mode = PLAYERDEMO_MODE_OFF; } void playerdemo_shutdown() {SELFPARAM(); diff --git a/qcsrc/server/playerdemo.qh b/qcsrc/server/playerdemo.qh index 05e012aa6..7c1931432 100644 --- a/qcsrc/server/playerdemo.qh +++ b/qcsrc/server/playerdemo.qh @@ -1,7 +1,7 @@ #ifndef PLAYERDEMO_H #define PLAYERDEMO_H -void playerdemo_init(); +void playerdemo_init(entity this); void playerdemo_shutdown(); void playerdemo_write(); float playerdemo_read(entity this); -- 2.39.2