From 450125fe9fa5ce6324db12446fe689cbde0678a3 Mon Sep 17 00:00:00 2001 From: Mario Date: Fri, 10 Jun 2016 19:35:31 +1000 Subject: [PATCH] Cleanse server client commands --- qcsrc/common/minigames/sv_minigames.qc | 76 ++-- qcsrc/common/minigames/sv_minigames.qh | 2 +- qcsrc/server/cl_client.qc | 8 +- qcsrc/server/command/cmd.qc | 337 +++++++++--------- qcsrc/server/command/cmd.qh | 7 +- qcsrc/server/mapvoting.qc | 12 +- qcsrc/server/mapvoting.qh | 2 +- .../mutators/mutator/gamemode_assault.qc | 8 +- qcsrc/server/mutators/mutator/gamemode_ca.qc | 13 +- qcsrc/server/mutators/mutator/gamemode_ctf.qc | 24 +- 10 files changed, 233 insertions(+), 256 deletions(-) diff --git a/qcsrc/common/minigames/sv_minigames.qc b/qcsrc/common/minigames/sv_minigames.qc index bde942616..499959302 100644 --- a/qcsrc/common/minigames/sv_minigames.qc +++ b/qcsrc/common/minigames/sv_minigames.qc @@ -303,11 +303,11 @@ bool MinigameImpulse(entity this, int imp) -void ClientCommand_minigame(int request, int argc, string command) -{SELFPARAM(); +void ClientCommand_minigame(entity caller, int request, int argc, string command) +{ if ( !autocvar_sv_minigames ) { - sprint(self,"Minigames are not enabled!\n"); + sprint(caller,"Minigames are not enabled!\n"); return; } @@ -316,88 +316,88 @@ void ClientCommand_minigame(int request, int argc, string command) string minig_cmd = argv(1); if ( minig_cmd == "create" && argc > 2 ) { - entity minig = start_minigame(self, argv(2)); + entity minig = start_minigame(caller, argv(2)); if ( minig ) - sprint(self,"Created minigame session: ",minig.netname,"\n"); + sprint(caller,"Created minigame session: ",minig.netname,"\n"); else - sprint(self,"Cannot start minigame session!\n"); + sprint(caller,"Cannot start minigame session!\n"); return; } else if ( minig_cmd == "join" && argc > 2 ) { - entity minig = join_minigame(self, argv(2)); + entity minig = join_minigame(caller, argv(2)); if ( minig ) - sprint(self,"Joined: ",minig.netname,"\n"); + sprint(caller,"Joined: ",minig.netname,"\n"); else { - Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_JOIN_PREVENT_MINIGAME); - sprint(self,"Cannot join given minigame session!\n"); + Send_Notification(NOTIF_ONE, caller, MSG_CENTER, CENTER_JOIN_PREVENT_MINIGAME); + sprint(caller,"Cannot join given minigame session!\n"); } return; } else if ( minig_cmd == "list" ) { - FOREACH(Minigames, true, sprint(self, it.netname, " (", it.message, ") ", "\n")); + FOREACH(Minigames, true, sprint(caller, it.netname, " (", it.message, ") ", "\n")); return; } else if ( minig_cmd == "list-sessions" ) { entity e; for ( e = minigame_sessions; e != world; e = e.list_next ) - sprint(self,e.netname,"\n"); + sprint(caller,e.netname,"\n"); return; } else if ( minig_cmd == "end" || minig_cmd == "part" ) { - if ( self.active_minigame ) + if ( caller.active_minigame ) { - part_minigame(self); - sprint(self,"Left minigame session\n"); + part_minigame(caller); + sprint(caller,"Left minigame session\n"); } else - sprint(self,"You aren't playing any minigame...\n"); + sprint(caller,"You aren't playing any minigame...\n"); return; } else if ( minig_cmd == "invite" && argc > 2 ) { - if ( self.active_minigame ) + if ( caller.active_minigame ) { entity client = GetIndexedEntity(argc, 2); - string error = invite_minigame(self,client); + string error = invite_minigame(caller,client); if ( error == "" ) { - sprint(self,"You have invited ",client.netname, - " to join your game of ", self.active_minigame.descriptor.message, "\n"); + sprint(caller,"You have invited ",client.netname, + " to join your game of ", caller.active_minigame.descriptor.message, "\n"); } else - sprint(self,"Could not invite: ", error, ".\n"); + sprint(caller,"Could not invite: ", error, ".\n"); } else - sprint(self,"You aren't playing any minigame...\n"); + sprint(caller,"You aren't playing any minigame...\n"); return; } - else if ( self.active_minigame ) + else if ( caller.active_minigame ) { - entity e = minigame_find_player(self); + entity e = minigame_find_player(caller); string subcommand = substring(command,argv_end_index(0),-1); int arg_c = tokenize_console(subcommand); - if ( self.active_minigame.minigame_event(self.active_minigame,"cmd",e,arg_c,subcommand) ) + if ( caller.active_minigame.minigame_event(caller.active_minigame,"cmd",e,arg_c,subcommand) ) return; } - else sprint(self,strcat("Wrong command:^1 ",command,"\n")); + else sprint(caller,strcat("Wrong command:^1 ",command,"\n")); } - sprint(self, "\nUsage:^3 cmd minigame create \n"); - sprint(self, " Start a new minigame session\n"); - sprint(self, "Usage:^3 cmd minigame join \n"); - sprint(self, " Join an exising minigame session\n"); - sprint(self, "Usage:^3 cmd minigame list\n"); - sprint(self, " List available minigames\n"); - sprint(self, "Usage:^3 cmd minigame list-sessions\n"); - sprint(self, " List available minigames sessions\n"); - sprint(self, "Usage:^3 cmd minigame part|end\n"); - sprint(self, " Leave the current minigame\n"); - sprint(self, "Usage:^3 cmd minigame invite \n"); - sprint(self, " Invite the given player to join you in a minigame\n"); + sprint(caller, "\nUsage:^3 cmd minigame create \n"); + sprint(caller, " Start a new minigame session\n"); + sprint(caller, "Usage:^3 cmd minigame join \n"); + sprint(caller, " Join an exising minigame session\n"); + sprint(caller, "Usage:^3 cmd minigame list\n"); + sprint(caller, " List available minigames\n"); + sprint(caller, "Usage:^3 cmd minigame list-sessions\n"); + sprint(caller, " List available minigames sessions\n"); + sprint(caller, "Usage:^3 cmd minigame part|end\n"); + sprint(caller, " Leave the current minigame\n"); + sprint(caller, "Usage:^3 cmd minigame invite \n"); + sprint(caller, " Invite the given player to join you in a minigame\n"); } diff --git a/qcsrc/common/minigames/sv_minigames.qh b/qcsrc/common/minigames/sv_minigames.qh index 60785c560..70c9bf805 100644 --- a/qcsrc/common/minigames/sv_minigames.qh +++ b/qcsrc/common/minigames/sv_minigames.qh @@ -30,7 +30,7 @@ bool minigame_CheckSend(entity this); bool MinigameImpulse(entity this, int imp); // Parse a client command ( cmd minigame ... ) -void ClientCommand_minigame(int request, int argc, string command); +void ClientCommand_minigame(entity caller, int request, int argc, string command); // Find the minigame_player entity for the given client entity entity minigame_find_player(entity client); diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index ffda2a471..fb0b1eb93 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -851,8 +851,8 @@ void KillIndicator_Think(entity this) } float clientkilltime; -void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2 = spec -{SELFPARAM(); +void ClientKill_TeamChange (entity this, float targetteam) // 0 = don't change, -1 = auto, -2 = spec +{ float killtime; float starttime; entity e; @@ -880,7 +880,7 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2 if(killtime <= 0 || !IS_PLAYER(this) || IS_DEAD(this)) { - ClientKill_Now(); + WITHSELF(this, ClientKill_Now()); } else { @@ -955,7 +955,7 @@ void ClientKill () if(this.player_blocked) return; if(STAT(FROZEN, this)) return; - ClientKill_TeamChange(0); + ClientKill_TeamChange(this, 0); } void FixClientCvars(entity e) diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index d681535a2..9a9da4def 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -36,27 +36,26 @@ #include -void ClientKill_TeamChange(float targetteam); // 0 = don't change, -1 = auto, -2 = spec +void ClientKill_TeamChange(entity this, float targetteam); // 0 = don't change, -1 = auto, -2 = spec // ========================================================= // Server side networked commands code, reworked by Samual // Last updated: December 28th, 2011 // ========================================================= -float SV_ParseClientCommand_floodcheck() +bool SV_ParseClientCommand_floodcheck(entity this) { - SELFPARAM(); if (!timeout_status) // not while paused { - if (time <= (self.cmd_floodtime + autocvar_sv_clientcommand_antispam_time)) + if (time <= (this.cmd_floodtime + autocvar_sv_clientcommand_antispam_time)) { - self.cmd_floodcount += 1; - if (self.cmd_floodcount > autocvar_sv_clientcommand_antispam_count) return false; // too much spam, halt + this.cmd_floodcount += 1; + if (this.cmd_floodcount > autocvar_sv_clientcommand_antispam_count) return false; // too much spam, halt } else { - self.cmd_floodtime = time; - self.cmd_floodcount = 1; + this.cmd_floodtime = time; + this.cmd_floodcount = 1; } } return true; // continue, as we're not flooding yet @@ -67,58 +66,56 @@ float SV_ParseClientCommand_floodcheck() // Command Sub-Functions // ======================= -void ClientCommand_autoswitch(float request, float argc) +void ClientCommand_autoswitch(entity caller, float request, float argc) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { if (argv(1) != "") { - self.autoswitch = InterpretBoolean(argv(1)); - sprint(self, strcat("^1autoswitch is currently turned ", (self.autoswitch ? "on" : "off"), ".\n")); + caller.autoswitch = InterpretBoolean(argv(1)); + sprint(caller, strcat("^1autoswitch is currently turned ", (caller.autoswitch ? "on" : "off"), ".\n")); return; } } default: - sprint(self, "Incorrect parameters for ^2autoswitch^7\n"); + sprint(caller, "Incorrect parameters for ^2autoswitch^7\n"); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd autoswitch selection\n"); - sprint(self, " Where 'selection' controls if autoswitch is on or off.\n"); + sprint(caller, "\nUsage:^3 cmd autoswitch selection\n"); + sprint(caller, " Where 'selection' controls if autoswitch is on or off.\n"); return; } } } -void ClientCommand_clientversion(float request, float argc) // internal command, used only by code +void ClientCommand_clientversion(entity caller, float request, float argc) // internal command, used only by code { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { if (argv(1) != "") { - if (IS_CLIENT(self)) + if (IS_CLIENT(caller)) { - self.version = ((argv(1) == "$gameversion") ? 1 : stof(argv(1))); + caller.version = ((argv(1) == "$gameversion") ? 1 : stof(argv(1))); - if (self.version < autocvar_gameversion_min || self.version > autocvar_gameversion_max) + if (caller.version < autocvar_gameversion_min || caller.version > autocvar_gameversion_max) { - self.version_mismatch = 1; - ClientKill_TeamChange(-2); // observe + caller.version_mismatch = 1; + ClientKill_TeamChange(caller, -2); // observe } else if (autocvar_g_campaign || autocvar_g_balance_teams) { - // JoinBestTeam(self, false, true); + // JoinBestTeam(caller, false, true); } - else if (teamplay && !autocvar_sv_spectate && !(self.team_forced > 0)) + else if (teamplay && !autocvar_sv_spectate && !(caller.team_forced > 0)) { - TRANSMUTE(Observer, self); // really? - stuffcmd(self, "menu_showteamselect\n"); + TRANSMUTE(Observer, caller); // really? + stuffcmd(caller, "menu_showteamselect\n"); } } @@ -127,67 +124,65 @@ void ClientCommand_clientversion(float request, float argc) // internal command } default: - sprint(self, "Incorrect parameters for ^2clientversion^7\n"); + sprint(caller, "Incorrect parameters for ^2clientversion^7\n"); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd clientversion version\n"); - sprint(self, " Where 'version' is the game version reported by self.\n"); + sprint(caller, "\nUsage:^3 cmd clientversion version\n"); + sprint(caller, " Where 'version' is the game version reported by caller.\n"); return; } } } -void ClientCommand_mv_getpicture(float request, float argc) // internal command, used only by code +void ClientCommand_mv_getpicture(entity caller, float request, float argc) // internal command, used only by code { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { if (argv(1) != "") { - if (intermission_running) MapVote_SendPicture(stof(argv(1))); + if (intermission_running) MapVote_SendPicture(caller, stof(argv(1))); return; } } default: - sprint(self, "Incorrect parameters for ^2mv_getpicture^7\n"); + sprint(caller, "Incorrect parameters for ^2mv_getpicture^7\n"); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd mv_getpicture mapid\n"); - sprint(self, " Where 'mapid' is the id number of the map to request an image of on the map vote selection menu.\n"); + sprint(caller, "\nUsage:^3 cmd mv_getpicture mapid\n"); + sprint(caller, " Where 'mapid' is the id number of the map to request an image of on the map vote selection menu.\n"); return; } } } -void ClientCommand_join(float request) +void ClientCommand_join(entity caller, float request) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { - if (IS_CLIENT(self)) + if (IS_CLIENT(caller)) { - if (!IS_PLAYER(self) && !lockteams && !gameover) + if (!IS_PLAYER(caller) && !lockteams && !gameover) { - if (self.caplayer) return; - if (nJoinAllowed(self, self)) + if (caller.caplayer) return; + if (nJoinAllowed(caller, caller)) { if (autocvar_g_campaign) campaign_bots_may_start = true; - TRANSMUTE(Player, self); - PlayerScore_Clear(self); - Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CPID_PREVENT_JOIN); - Send_Notification(NOTIF_ALL, world, MSG_INFO, ((teamplay && self.team != -1) ? APP_TEAM_ENT(this, INFO_JOIN_PLAY_TEAM) : INFO_JOIN_PLAY), self.netname); - PutClientInServer(); + TRANSMUTE(Player, caller); + PlayerScore_Clear(caller); + Kill_Notification(NOTIF_ONE_ONLY, caller, MSG_CENTER, CPID_PREVENT_JOIN); + Send_Notification(NOTIF_ALL, world, MSG_INFO, ((teamplay && caller.team != -1) ? APP_TEAM_ENT(caller, INFO_JOIN_PLAY_TEAM) : INFO_JOIN_PLAY), caller.netname); + WITHSELF(caller, PutClientInServer()); } else { // player may not join because of g_maxplayers is set - Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_JOIN_PREVENT); + Send_Notification(NOTIF_ONE_ONLY, caller, MSG_CENTER, CENTER_JOIN_PREVENT); } } } @@ -197,16 +192,15 @@ void ClientCommand_join(float request) default: case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd join\n"); - sprint(self, " No arguments required.\n"); + sprint(caller, "\nUsage:^3 cmd join\n"); + sprint(caller, " No arguments required.\n"); return; } } } -void ClientCommand_physics(float request, float argc) +void ClientCommand_physics(entity caller, float request, float argc) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: @@ -215,44 +209,43 @@ void ClientCommand_physics(float request, float argc) if (!autocvar_g_physics_clientselect) { - sprint(self, "Client physics selection is currently disabled.\n"); + sprint(caller, "Client physics selection is currently disabled.\n"); return; } if (command == "list" || command == "help") { - sprint(self, strcat("Available physics sets: \n\n", autocvar_g_physics_clientselect_options, " default\n")); + sprint(caller, strcat("Available physics sets: \n\n", autocvar_g_physics_clientselect_options, " default\n")); return; } if (Physics_Valid(command) || command == "default") { - stuffcmd(self, strcat("\nseta cl_physics ", command, "\nsendcvar cl_physics\n")); - sprint(self, strcat("^2Physics set successfully changed to ^3", command, "\n")); + stuffcmd(caller, strcat("\nseta cl_physics ", command, "\nsendcvar cl_physics\n")); + sprint(caller, strcat("^2Physics set successfully changed to ^3", command, "\n")); return; } } default: - sprint(self, strcat("Current physics set: ^3", self.cvar_cl_physics, "\n")); + sprint(caller, strcat("Current physics set: ^3", caller.cvar_cl_physics, "\n")); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd physics \n"); - sprint(self, " See 'cmd physics list' for available physics sets.\n"); - sprint(self, " Argument 'default' resets to standard physics.\n"); + sprint(caller, "\nUsage:^3 cmd physics \n"); + sprint(caller, " See 'cmd physics list' for available physics sets.\n"); + sprint(caller, " Argument 'default' resets to standard physics.\n"); return; } } } -void ClientCommand_ready(float request) // todo: anti-spam for toggling readyness +void ClientCommand_ready(entity caller, float request) // todo: anti-spam for toggling readyness { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { - if (IS_CLIENT(self)) + if (IS_CLIENT(caller)) { if (warmup_stage || autocvar_sv_ready_restart || g_race_qualifying == 2) { @@ -260,15 +253,15 @@ void ClientCommand_ready(float request) // todo: anti-spam for toggling readyne { if (time < game_starttime) // game is already restarting return; - if (self.ready) // toggle + if (caller.ready) // toggle { - self.ready = false; - bprint(self.netname, "^2 is ^1NOT^2 ready\n"); + caller.ready = false; + bprint(caller.netname, "^2 is ^1NOT^2 ready\n"); } else { - self.ready = true; - bprint(self.netname, "^2 is ready\n"); + caller.ready = true; + bprint(caller.netname, "^2 is ready\n"); } // cannot reset the game while a timeout is active! @@ -276,7 +269,7 @@ void ClientCommand_ready(float request) // todo: anti-spam for toggling readyne } else { - sprint(self, "^1Game has already been restarted\n"); + sprint(caller, "^1Game has already been restarted\n"); } } } @@ -286,69 +279,66 @@ void ClientCommand_ready(float request) // todo: anti-spam for toggling readyne default: case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd ready\n"); - sprint(self, " No arguments required.\n"); + sprint(caller, "\nUsage:^3 cmd ready\n"); + sprint(caller, " No arguments required.\n"); return; } } } -void ClientCommand_say(float request, float argc, string command) +void ClientCommand_say(entity caller, float request, float argc, string command) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { - if (argc >= 2) Say(self, false, world, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1); + if (argc >= 2) Say(caller, false, world, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1); return; // never fall through to usage } default: case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd say \n"); - sprint(self, " Where 'message' is the string of text to say.\n"); + sprint(caller, "\nUsage:^3 cmd say \n"); + sprint(caller, " Where 'message' is the string of text to say.\n"); return; } } } -void ClientCommand_say_team(float request, float argc, string command) +void ClientCommand_say_team(entity caller, float request, float argc, string command) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { - if (argc >= 2) Say(self, true, world, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1); + if (argc >= 2) Say(caller, true, world, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)), 1); return; // never fall through to usage } default: case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd say_team \n"); - sprint(self, " Where 'message' is the string of text to say.\n"); + sprint(caller, "\nUsage:^3 cmd say_team \n"); + sprint(caller, " Where 'message' is the string of text to say.\n"); return; } } } -void ClientCommand_selectteam(float request, float argc) +void ClientCommand_selectteam(entity caller, float request, float argc) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { if (argv(1) != "") { - if (IS_CLIENT(self)) + if (IS_CLIENT(caller)) { if (teamplay) { - if (self.team_forced <= 0) + if (caller.team_forced <= 0) { if (!lockteams) { @@ -373,43 +363,43 @@ void ClientCommand_selectteam(float request, float argc) if (selection) { - if (self.team == selection && !IS_DEAD(self)) + if (caller.team == selection && !IS_DEAD(caller)) { - sprint(self, "^7You already are on that team.\n"); + sprint(caller, "^7You already are on that team.\n"); } - else if (self.wasplayer && autocvar_g_changeteam_banned) + else if (caller.wasplayer && autocvar_g_changeteam_banned) { - sprint(self, "^1You cannot change team, forbidden by the server.\n"); + sprint(caller, "^1You cannot change team, forbidden by the server.\n"); } else { if (autocvar_g_balance_teams && autocvar_g_balance_teams_prevent_imbalance) { - CheckAllowedTeams(self); - GetTeamCounts(self); - if (!TeamSmallerEqThanTeam(Team_TeamToNumber(selection), Team_TeamToNumber(self.team), self)) + CheckAllowedTeams(caller); + GetTeamCounts(caller); + if (!TeamSmallerEqThanTeam(Team_TeamToNumber(selection), Team_TeamToNumber(caller.team), caller)) { - Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_TEAMCHANGE_LARGERTEAM); + Send_Notification(NOTIF_ONE, caller, MSG_INFO, INFO_TEAMCHANGE_LARGERTEAM); return; } } - ClientKill_TeamChange(selection); + ClientKill_TeamChange(caller, selection); } } } else { - sprint(self, "^7The game has already begun, you must wait until the next map to be able to join a team.\n"); + sprint(caller, "^7The game has already begun, you must wait until the next map to be able to join a team.\n"); } } else { - sprint(self, "^7selectteam can not be used as your team is forced\n"); + sprint(caller, "^7selectteam can not be used as your team is forced\n"); } } else { - sprint(self, "^7selectteam can only be used in teamgames\n"); + sprint(caller, "^7selectteam can only be used in teamgames\n"); } } return; @@ -417,45 +407,43 @@ void ClientCommand_selectteam(float request, float argc) } default: - sprint(self, "Incorrect parameters for ^2selectteam^7\n"); + sprint(caller, "Incorrect parameters for ^2selectteam^7\n"); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd selectteam team\n"); - sprint(self, " Where 'team' is the prefered team to try and join.\n"); - sprint(self, " Full list of options here: \"red, blue, yellow, pink, auto\"\n"); + sprint(caller, "\nUsage:^3 cmd selectteam team\n"); + sprint(caller, " Where 'team' is the prefered team to try and join.\n"); + sprint(caller, " Full list of options here: \"red, blue, yellow, pink, auto\"\n"); return; } } } -void ClientCommand_selfstuff(float request, string command) +void ClientCommand_selfstuff(entity caller, float request, string command) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { if (argv(1) != "") { - stuffcmd(self, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1))); + stuffcmd(caller, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1))); return; } } default: - sprint(self, "Incorrect parameters for ^2selectteam^7\n"); + sprint(caller, "Incorrect parameters for ^2selfstuff^7\n"); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd selfstuff \n"); - sprint(self, " Where 'command' is the string to be stuffed to your client.\n"); + sprint(caller, "\nUsage:^3 cmd selfstuff \n"); + sprint(caller, " Where 'command' is the string to be stuffed to your client.\n"); return; } } } -void ClientCommand_sentcvar(float request, float argc, string command) +void ClientCommand_sentcvar(entity caller, float request, float argc, string command) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: @@ -471,37 +459,36 @@ void ClientCommand_sentcvar(float request, float argc, string command) tokenize_console(s); } - GetCvars(this, 1); + GetCvars(caller, 1); return; } } default: - sprint(self, "Incorrect parameters for ^2sentcvar^7\n"); + sprint(caller, "Incorrect parameters for ^2sentcvar^7\n"); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd sentcvar \n"); - sprint(self, " Where 'cvar' is the cvar plus arguments to send to the server.\n"); + sprint(caller, "\nUsage:^3 cmd sentcvar \n"); + sprint(caller, " Where 'cvar' is the cvar plus arguments to send to the server.\n"); return; } } } -void ClientCommand_spectate(float request) +void ClientCommand_spectate(entity caller, float request) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { - if (IS_CLIENT(self)) + if (IS_CLIENT(caller)) { - int mutator_returnvalue = MUTATOR_CALLHOOK(ClientCommand_Spectate, self); + int mutator_returnvalue = MUTATOR_CALLHOOK(ClientCommand_Spectate, caller); if (mutator_returnvalue == MUT_SPECCMD_RETURN) return; - if ((IS_PLAYER(self) || mutator_returnvalue == MUT_SPECCMD_FORCE) && autocvar_sv_spectate == 1) ClientKill_TeamChange(-2); // observe + if ((IS_PLAYER(caller) || mutator_returnvalue == MUT_SPECCMD_FORCE) && autocvar_sv_spectate == 1) ClientKill_TeamChange(caller, -2); // observe } return; // never fall through to usage } @@ -509,41 +496,39 @@ void ClientCommand_spectate(float request) default: case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd spectate\n"); - sprint(self, " No arguments required.\n"); + sprint(caller, "\nUsage:^3 cmd spectate\n"); + sprint(caller, " No arguments required.\n"); return; } } } -void ClientCommand_suggestmap(float request, float argc) +void ClientCommand_suggestmap(entity caller, float request, float argc) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: { if (argv(1) != "") { - sprint(self, strcat(MapVote_Suggest(argv(1)), "\n")); + sprint(caller, strcat(MapVote_Suggest(caller, argv(1)), "\n")); return; } } default: - sprint(self, "Incorrect parameters for ^2suggestmap^7\n"); + sprint(caller, "Incorrect parameters for ^2suggestmap^7\n"); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd suggestmap map\n"); - sprint(self, " Where 'map' is the name of the map to suggest.\n"); + sprint(caller, "\nUsage:^3 cmd suggestmap map\n"); + sprint(caller, " Where 'map' is the name of the map to suggest.\n"); return; } } } -void ClientCommand_tell(float request, float argc, string command) +void ClientCommand_tell(entity caller, float request, float argc, string command) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: @@ -555,7 +540,7 @@ void ClientCommand_tell(float request, float argc, string command) if (tell_accepted > 0) // the target is a real client { - if (tell_to != self) // and we're allowed to send to them :D + if (tell_to != caller) // and we're allowed to send to them :D { // workaround for argv indexes indexing ascii chars instead of utf8 chars // In this case when the player name contains utf8 chars @@ -568,34 +553,33 @@ void ClientCommand_tell(float request, float argc, string command) string msg = substring(command, argv_start_index(next_token), argv_end_index(-1) - argv_start_index(next_token)); cvar_set("utf8_enable", utf8_enable_save); - Say(self, false, tell_to, msg, true); + Say(caller, false, tell_to, msg, true); return; } - else { print_to(self, "You can't ^2tell^7 a message to yourself."); return; } + else { print_to(caller, "You can't ^2tell^7 a message to yourself."); return; } } else if (argv(1) == "#0") { - trigger_magicear_processmessage_forallears(self, -1, world, substring(command, argv_start_index(next_token), argv_end_index(-1) - argv_start_index(next_token))); + trigger_magicear_processmessage_forallears(caller, -1, world, substring(command, argv_start_index(next_token), argv_end_index(-1) - argv_start_index(next_token))); return; } - else { print_to(self, strcat("tell: ", GetClientErrorString(tell_accepted, argv(1)), ".")); return; } + else { print_to(caller, strcat("tell: ", GetClientErrorString(tell_accepted, argv(1)), ".")); return; } } } default: - sprint(self, "Incorrect parameters for ^2tell^7\n"); + sprint(caller, "Incorrect parameters for ^2tell^7\n"); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd tell client \n"); - sprint(self, " Where 'client' is the entity number or name of the player to send 'message' to.\n"); + sprint(caller, "\nUsage:^3 cmd tell client \n"); + sprint(caller, " Where 'client' is the entity number or name of the player to send 'message' to.\n"); return; } } } -void ClientCommand_voice(float request, float argc, string command) +void ClientCommand_voice(entity caller, float request, float argc, string command) { - SELFPARAM(); switch (request) { case CMD_REQUEST_COMMAND: @@ -605,23 +589,23 @@ void ClientCommand_voice(float request, float argc, string command) entity e = GetVoiceMessage(argv(1)); if (!e) { - sprint(this, sprintf("Invalid voice. Use one of: %s\n", allvoicesamples)); + sprint(caller, sprintf("Invalid voice. Use one of: %s\n", allvoicesamples)); return; } - if (argc >= 3) VoiceMessage(this, e, substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2))); - else VoiceMessage(this, e, ""); + if (argc >= 3) VoiceMessage(caller, e, substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2))); + else VoiceMessage(caller, e, ""); return; } } default: - sprint(self, "Incorrect parameters for ^2voice^7\n"); + sprint(caller, "Incorrect parameters for ^2voice^7\n"); case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd voice messagetype \n"); - sprint(self, " 'messagetype' is the type of broadcast to do, like team only or such,\n"); - sprint(self, " and 'soundname' is the string/filename of the sound/voice message to play.\n"); + sprint(caller, "\nUsage:^3 cmd voice messagetype \n"); + sprint(caller, " 'messagetype' is the type of broadcast to do, like team only or such,\n"); + sprint(caller, " and 'soundname' is the string/filename of the sound/voice message to play.\n"); return; } } @@ -629,7 +613,7 @@ void ClientCommand_voice(float request, float argc, string command) /* use this when creating a new command, making sure to place it in alphabetical order... also, ** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION! -void ClientCommand_(float request) +void ClientCommand_(entity caller, float request) { switch(request) { @@ -642,8 +626,8 @@ void ClientCommand_(float request) default: case CMD_REQUEST_USAGE: { - sprint(self, "\nUsage:^3 cmd \n"); - sprint(self, " No arguments required.\n"); + sprint(caller, "\nUsage:^3 cmd \n"); + sprint(caller, " No arguments required.\n"); return; } } @@ -656,52 +640,51 @@ void ClientCommand_(float request) // ===================================== // Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;) -#define CLIENT_COMMANDS(request, arguments, command) \ - CLIENT_COMMAND("autoswitch", ClientCommand_autoswitch(request, arguments), "Whether or not to switch automatically when getting a better weapon") \ - CLIENT_COMMAND("clientversion", ClientCommand_clientversion(request, arguments), "Release version of the game") \ - CLIENT_COMMAND("mv_getpicture", ClientCommand_mv_getpicture(request, arguments), "Retrieve mapshot picture from the server") \ - CLIENT_COMMAND("join", ClientCommand_join(request), "Become a player in the game") \ - CLIENT_COMMAND("physics", ClientCommand_physics(request, arguments), "Change physics set") \ - CLIENT_COMMAND("ready", ClientCommand_ready(request), "Qualify as ready to end warmup stage (or restart server if allowed)") \ - CLIENT_COMMAND("say", ClientCommand_say(request, arguments, command), "Print a message to chat to all players") \ - CLIENT_COMMAND("say_team", ClientCommand_say_team(request, arguments, command), "Print a message to chat to all team mates") \ - CLIENT_COMMAND("selectteam", ClientCommand_selectteam(request, arguments), "Attempt to choose a team to join into") \ - CLIENT_COMMAND("selfstuff", ClientCommand_selfstuff(request, command), "Stuffcmd a command to your own client") \ - CLIENT_COMMAND("sentcvar", ClientCommand_sentcvar(request, arguments, command), "New system for sending a client cvar to the server") \ - CLIENT_COMMAND("spectate", ClientCommand_spectate(request), "Become an observer") \ - CLIENT_COMMAND("suggestmap", ClientCommand_suggestmap(request, arguments), "Suggest a map to the mapvote at match end") \ - CLIENT_COMMAND("tell", ClientCommand_tell(request, arguments, command), "Send a message directly to a player") \ - CLIENT_COMMAND("voice", ClientCommand_voice(request, arguments, command), "Send voice message via sound") \ - CLIENT_COMMAND("minigame", ClientCommand_minigame(request, arguments, command), "Start a minigame") \ +#define CLIENT_COMMANDS(ent, request, arguments, command) \ + CLIENT_COMMAND("autoswitch", ClientCommand_autoswitch(ent, request, arguments), "Whether or not to switch automatically when getting a better weapon") \ + CLIENT_COMMAND("clientversion", ClientCommand_clientversion(ent, request, arguments), "Release version of the game") \ + CLIENT_COMMAND("mv_getpicture", ClientCommand_mv_getpicture(ent, request, arguments), "Retrieve mapshot picture from the server") \ + CLIENT_COMMAND("join", ClientCommand_join(ent, request), "Become a player in the game") \ + CLIENT_COMMAND("physics", ClientCommand_physics(ent, request, arguments), "Change physics set") \ + CLIENT_COMMAND("ready", ClientCommand_ready(ent, request), "Qualify as ready to end warmup stage (or restart server if allowed)") \ + CLIENT_COMMAND("say", ClientCommand_say(ent, request, arguments, command), "Print a message to chat to all players") \ + CLIENT_COMMAND("say_team", ClientCommand_say_team(ent, request, arguments, command), "Print a message to chat to all team mates") \ + CLIENT_COMMAND("selectteam", ClientCommand_selectteam(ent, request, arguments), "Attempt to choose a team to join into") \ + CLIENT_COMMAND("selfstuff", ClientCommand_selfstuff(ent, request, command), "Stuffcmd a command to your own client") \ + CLIENT_COMMAND("sentcvar", ClientCommand_sentcvar(ent, request, arguments, command), "New system for sending a client cvar to the server") \ + CLIENT_COMMAND("spectate", ClientCommand_spectate(ent, request), "Become an observer") \ + CLIENT_COMMAND("suggestmap", ClientCommand_suggestmap(ent, request, arguments), "Suggest a map to the mapvote at match end") \ + CLIENT_COMMAND("tell", ClientCommand_tell(ent, request, arguments, command), "Send a message directly to a player") \ + CLIENT_COMMAND("voice", ClientCommand_voice(ent, request, arguments, command), "Send voice message via sound") \ + CLIENT_COMMAND("minigame", ClientCommand_minigame(ent, request, arguments, command), "Start a minigame") \ /* nothing */ -void ClientCommand_macro_help() +void ClientCommand_macro_help(entity caller) { - SELFPARAM(); #define CLIENT_COMMAND(name, function, description) \ - { sprint(self, " ^2", name, "^7: ", description, "\n"); } + { sprint(caller, " ^2", name, "^7: ", description, "\n"); } - CLIENT_COMMANDS(0, 0, ""); + CLIENT_COMMANDS(NULL, 0, 0, ""); #undef CLIENT_COMMAND } -float ClientCommand_macro_command(float argc, string command) +float ClientCommand_macro_command(float argc, entity caller, string command) { #define CLIENT_COMMAND(name, function, description) \ { if (name == strtolower(argv(0))) { function; return true; } } - CLIENT_COMMANDS(CMD_REQUEST_COMMAND, argc, command); + CLIENT_COMMANDS(caller, CMD_REQUEST_COMMAND, argc, command); #undef CLIENT_COMMAND return false; } -float ClientCommand_macro_usage(float argc) +float ClientCommand_macro_usage(float argc, entity caller) { #define CLIENT_COMMAND(name, function, description) \ { if (name == strtolower(argv(1))) { function; return true; } } - CLIENT_COMMANDS(CMD_REQUEST_USAGE, argc, ""); + CLIENT_COMMANDS(caller, CMD_REQUEST_USAGE, argc, ""); #undef CLIENT_COMMAND return false; @@ -712,7 +695,7 @@ void ClientCommand_macro_write_aliases(float fh) #define CLIENT_COMMAND(name, function, description) \ { CMD_Write_Alias("qc_cmd_cmd", name, description); } - CLIENT_COMMANDS(0, 0, ""); + CLIENT_COMMANDS(NULL, 0, 0, ""); #undef CLIENT_COMMAND } @@ -756,7 +739,7 @@ void SV_ParseClientCommand(string command) case "c2s": Net_ClientCommand(this, command); return; // handled by net.qh default: - if (SV_ParseClientCommand_floodcheck()) break; // "true": continue, as we're not flooding yet + if (SV_ParseClientCommand_floodcheck(this)) break; // "true": continue, as we're not flooding yet else return; // "false": not allowed to continue, halt // print("^1ERROR: ^7ANTISPAM CAUGHT: ", command, ".\n"); } @@ -766,7 +749,7 @@ void SV_ParseClientCommand(string command) if (argc == 1) { sprint(this, "\nClient networked commands:\n"); - ClientCommand_macro_help(); + ClientCommand_macro_help(this); sprint(this, "\nCommon networked commands:\n"); CommonCommand_macro_help(this); @@ -779,7 +762,7 @@ void SV_ParseClientCommand(string command) { return; } - else if (ClientCommand_macro_usage(argc)) // same, but for normal commands now + else if (ClientCommand_macro_usage(argc, this)) // same, but for normal commands now { return; } @@ -796,7 +779,7 @@ void SV_ParseClientCommand(string command) { return; // handled by server/command/common.qc } - else if (ClientCommand_macro_command(argc, command)) // continue as usual and scan for normal commands + else if (ClientCommand_macro_command(argc, this, command)) // continue as usual and scan for normal commands { return; // handled by one of the above ClientCommand_* functions } diff --git a/qcsrc/server/command/cmd.qh b/qcsrc/server/command/cmd.qh index 0dd27dd89..5f2c86e40 100644 --- a/qcsrc/server/command/cmd.qh +++ b/qcsrc/server/command/cmd.qh @@ -1,15 +1,10 @@ #pragma once -// ================================================= -// Declarations for server side networked commands -// Last updated: December 26th, 2011 -// ================================================= - .float cmd_floodtime; .float cmd_floodcount; .float lms_spectate_warning; -string MapVote_Suggest(string m); +string MapVote_Suggest(entity this, string m); // used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file void ClientCommand_macro_write_aliases(float fh); diff --git a/qcsrc/server/mapvoting.qc b/qcsrc/server/mapvoting.qc index 7a615fc86..999919fbe 100644 --- a/qcsrc/server/mapvoting.qc +++ b/qcsrc/server/mapvoting.qc @@ -120,8 +120,8 @@ void MapVote_UnzoneStrings() } } -string MapVote_Suggest(string m) -{SELFPARAM(); +string MapVote_Suggest(entity this, string m) +{ float i; if(m == "") return "That's not how to use this command."; @@ -156,7 +156,7 @@ string MapVote_Suggest(string m) strunzone(mapvote_suggestions[i]); mapvote_suggestions[i] = strzone(m); if(autocvar_sv_eventlog) - GameLogEcho(strcat(":vote:suggested:", m, ":", ftos(self.playerid))); + GameLogEcho(strcat(":vote:suggested:", m, ":", ftos(this.playerid))); return strcat("Suggestion of ", m, " accepted."); } @@ -260,9 +260,9 @@ void MapVote_Init() MapVote_Spawn(); } -void MapVote_SendPicture(float id) -{SELFPARAM(); - msg_entity = self; +void MapVote_SendPicture(entity to, int id) +{ + msg_entity = to; WriteHeader(MSG_ONE, TE_CSQC_PICTURE); WriteByte(MSG_ONE, id); WritePicture(MSG_ONE, strcat(mapvote_screenshot_dirs[mapvote_maps_screenshot_dir[id]], "/", mapvote_maps[id]), 3072); diff --git a/qcsrc/server/mapvoting.qh b/qcsrc/server/mapvoting.qh index 3a1a0ad64..31d89f42c 100644 --- a/qcsrc/server/mapvoting.qh +++ b/qcsrc/server/mapvoting.qh @@ -4,7 +4,7 @@ void MapVote_Start(); void MapVote_Spawn(); void MapVote_Think(); -void MapVote_SendPicture(float id); +void MapVote_SendPicture(entity to, int id); float GameTypeVote_Start(); float GameTypeVote_Finished(float pos); string GameTypeVote_MapInfo_FixName(string m); diff --git a/qcsrc/server/mutators/mutator/gamemode_assault.qc b/qcsrc/server/mutators/mutator/gamemode_assault.qc index 67e5fcb41..5b71be772 100644 --- a/qcsrc/server/mutators/mutator/gamemode_assault.qc +++ b/qcsrc/server/mutators/mutator/gamemode_assault.qc @@ -258,8 +258,8 @@ void assault_wall_think(entity this) // reset objectives, toggle spawnpoints, reset triggers, ... void vehicles_clearreturn(entity veh); void vehicles_spawn(entity this); -void assault_new_round() -{SELFPARAM(); +void assault_new_round(entity this) +{ //bprint("ASSAULT: new round\n"); // Eject players from vehicles @@ -271,7 +271,7 @@ void assault_new_round() )); // up round counter - self.winning = self.winning + 1; + this.winning = this.winning + 1; // swap attacker/defender roles if(assault_attacker_team == NUM_TEAM_1) @@ -323,7 +323,7 @@ int WinningCondition_Assault() } else { - WITHSELF(ent, assault_new_round()); + assault_new_round(ent); } } } diff --git a/qcsrc/server/mutators/mutator/gamemode_ca.qc b/qcsrc/server/mutators/mutator/gamemode_ca.qc index ebd964077..943fd27d7 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ca.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ca.qc @@ -279,9 +279,8 @@ MUTATOR_HOOKFUNCTION(ca, GetTeamCount, CBC_ORDER_EXCLUSIVE) M_ARGV(0, float) = ca_teams; } -entity ca_LastPlayerForTeam() +entity ca_LastPlayerForTeam(entity this) { - SELFPARAM(); entity last_pl = NULL; FOREACH_CLIENT(IS_PLAYER(it) && it != this, { if (!IS_DEAD(it)) @@ -294,12 +293,12 @@ entity ca_LastPlayerForTeam() return last_pl; } -void ca_LastPlayerForTeam_Notify() +void ca_LastPlayerForTeam_Notify(entity this) { if (round_handler_IsActive()) if (round_handler_IsRoundStarted()) { - entity pl = ca_LastPlayerForTeam(); + entity pl = ca_LastPlayerForTeam(this); if (pl) Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_ALONE); } @@ -309,7 +308,7 @@ MUTATOR_HOOKFUNCTION(ca, PlayerDies) { entity frag_target = M_ARGV(2, entity); - ca_LastPlayerForTeam_Notify(); + ca_LastPlayerForTeam_Notify(frag_target); if (!allowed_to_spawn) frag_target.respawn_flags = RESPAWN_SILENT; if (!warmup_stage) @@ -322,7 +321,7 @@ MUTATOR_HOOKFUNCTION(ca, ClientDisconnect) entity player = M_ARGV(0, entity); if (player.caplayer == 1) - ca_LastPlayerForTeam_Notify(); + ca_LastPlayerForTeam_Notify(player); return true; } @@ -336,7 +335,7 @@ MUTATOR_HOOKFUNCTION(ca, MakePlayerObserver) entity player = M_ARGV(0, entity); if (!IS_DEAD(player)) - ca_LastPlayerForTeam_Notify(); + ca_LastPlayerForTeam_Notify(player); if (player.killindicator_teamchange == -2) player.caplayer = 0; if (player.caplayer) diff --git a/qcsrc/server/mutators/mutator/gamemode_ctf.qc b/qcsrc/server/mutators/mutator/gamemode_ctf.qc index 7b687776b..cf6bd6b2c 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ctf.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ctf.qc @@ -299,11 +299,11 @@ void ctf_CaptureShield_Touch(entity this) } void ctf_CaptureShield_Spawn(entity flag) -{SELFPARAM(); +{ entity shield = new(ctf_captureshield); - shield.enemy = self; - shield.team = self.team; + shield.enemy = flag; + shield.team = flag.team; settouch(shield, ctf_CaptureShield_Touch); setcefc(shield, ctf_CaptureShield_Customize); shield.effects = EF_ADDITIVE; @@ -312,7 +312,7 @@ void ctf_CaptureShield_Spawn(entity flag) shield.avelocity = '7 0 11'; shield.scale = 0.5; - setorigin(shield, self.origin); + setorigin(shield, flag.origin); setmodel(shield, MDL_CTF_SHIELD); setsize(shield, shield.scale * shield.mins, shield.scale * shield.maxs); } @@ -1159,13 +1159,13 @@ void ctf_Reset(entity this) void ctf_DelayedFlagSetup(entity this) // called after a flag is placed on a map by ctf_FlagSetup() { // bot waypoints - waypoint_spawnforitem_force(self, self.origin); - self.nearestwaypointtimeout = 0; // activate waypointing again - self.bot_basewaypoint = self.nearestwaypoint; + waypoint_spawnforitem_force(this, this.origin); + this.nearestwaypointtimeout = 0; // activate waypointing again + this.bot_basewaypoint = this.nearestwaypoint; // waypointsprites entity basename; - switch (self.team) + switch (this.team) { case NUM_TEAM_1: basename = WP_FlagBaseRed; break; case NUM_TEAM_2: basename = WP_FlagBaseBlue; break; @@ -1174,12 +1174,12 @@ void ctf_DelayedFlagSetup(entity this) // called after a flag is placed on a map default: basename = WP_FlagBaseNeutral; break; } - entity wp = WaypointSprite_SpawnFixed(basename, self.origin + FLAG_WAYPOINT_OFFSET, self, wps_flagbase, RADARICON_FLAG); - wp.colormod = ((self.team) ? Team_ColorRGB(self.team) : '1 1 1'); - WaypointSprite_UpdateTeamRadar(self.wps_flagbase, RADARICON_FLAG, ((self.team) ? colormapPaletteColor(self.team - 1, false) : '1 1 1')); + entity wp = WaypointSprite_SpawnFixed(basename, this.origin + FLAG_WAYPOINT_OFFSET, this, wps_flagbase, RADARICON_FLAG); + wp.colormod = ((this.team) ? Team_ColorRGB(this.team) : '1 1 1'); + WaypointSprite_UpdateTeamRadar(this.wps_flagbase, RADARICON_FLAG, ((this.team) ? colormapPaletteColor(this.team - 1, false) : '1 1 1')); // captureshield setup - ctf_CaptureShield_Spawn(self); + ctf_CaptureShield_Spawn(this); } .bool pushable; -- 2.39.2