From f74ffc24ebb5432b13ed9f8480e0ad43189d4832 Mon Sep 17 00:00:00 2001 From: terencehill Date: Fri, 2 Aug 2024 23:05:13 +0200 Subject: [PATCH] Refactor flood control code to work with .cmd_floodtime initialized to 0 --- qcsrc/server/client.qc | 3 --- qcsrc/server/command/cmd.qc | 14 ++++++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 854c1f0d0..575d6d971 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -1115,9 +1115,6 @@ void ClientConnect(entity this) TRANSMUTE(Client, this); CS(this).version_nagtime = time + 10 + random() * 10; - entity store = IS_CLIENT(this) ? CS(this) : this; - store.cmd_floodtime = -999999; - Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_JOIN_CONNECT, this.netname); bot_clientconnect(this); diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index ca028f12b..4606d2a41 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -1056,15 +1056,21 @@ void SV_ParseClientCommand(entity this, string command) { if(MUTATOR_CALLHOOK(ClientCommand_FloodControl, this, strtolower(argv(0)), argc, command)) break; // a mutator has prevented flood control - entity store = IS_CLIENT(this) ? CS(this) : this; // unfortunately, we need to store these on the client initially + // this is basically the same as the chat flood control - if (time < store.cmd_floodtime) + entity store = IS_CLIENT(this) ? CS(this) : this; // unfortunately, we need to store these on the client initially + // NOTE: using mod_time instead of time here to avoid initializing both this.cmd_floodtime + // and CS(this).cmd_floodtime to -(antispam_count * antispam_time) (or -999999) + float mod_time = time + autocvar_sv_clientcommand_antispam_count * autocvar_sv_clientcommand_antispam_time; + if (mod_time < store.cmd_floodtime) { - sprint(this, strcat("^3CMD FLOOD CONTROL: wait ^1", ftos(store.cmd_floodtime - time), "^3 seconds, command was: ", command, "\n")); + sprint(this, strcat("^3CMD FLOOD CONTROL: wait ^1", ftos(store.cmd_floodtime - mod_time), + "^3 seconds, command was: ", command, "\n")); return; // too much spam, halt } else - store.cmd_floodtime = max(time - autocvar_sv_clientcommand_antispam_count * autocvar_sv_clientcommand_antispam_time, store.cmd_floodtime) + autocvar_sv_clientcommand_antispam_time; + // micro-optimization: replaced mod_time - max_delay with time here as they are equal + store.cmd_floodtime = max(time, store.cmd_floodtime) + autocvar_sv_clientcommand_antispam_time; } break; // continue, as we're not flooding yet } -- 2.39.2