From c9fa140df7f673f9ce25913fc4d91e10dc6af7a9 Mon Sep 17 00:00:00 2001 From: terencehill Date: Wed, 31 Jul 2024 23:55:49 +0200 Subject: [PATCH] Refactor flood control code to work with .cmd_floodtime initialized to 0 The new code is slightly less intuitive however it works even for "not-yet-client" clients --- qcsrc/server/client.qc | 3 --- qcsrc/server/command/cmd.qc | 13 +++++++++---- 2 files changed, 9 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..b29b0a140 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -1056,15 +1056,20 @@ 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: we use mod_time instead of time to allow using .cmd_floodtime initialized to 0 + 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