Implement g_warmup > 1 and related fixes and refactoring
Support multi-stage warmups in Announcer_Time()
We need to offset the "1 minute remains" and "5 minutes remain" so they play at the correct times.
Remove command-specific anti spam from ClientCommand_ready()
Improve SVQC command flood control
Changes to the same logic used by chat flood control which is more progressive. The previous command flood control was only triggered if a client managed to send more than 8 commands within 1 second, and then it reset immediately.
Prints an informative message when flood control blocks a command. Previously this was silent.
Special cases the client's initial connect commands, as these would otherwise trigger the new flood logic with the current default settings.
Exempts chat commands from command flood control, as these have their own flood control.
Simplifies the code for max perf.
Block spectators from changing their ready status
This is consistent with the existing behaviour of setting .ready to false when a player switches to spectating.
Also reduces indenting and removes a condition that's no longer needed since sv_ready_restart was removed.
Update the types of some voting related globals and fields
Refactor Nagger_SendEntity and Net_Handle_ENT_CLIENT_NAGGER
This will no longer network ready status outside of warmup_stage in the case that some clients manage to have ready status then. This change is made possible by the removal of sv_ready_restart in !940 (merged)
It also simplifies the code and no longer networks the ready status of some SVQC entities that are not clients in the case that maxclients is not a multiple of 8.
Refactor HUD_InfoMessages(), removing obsolete messages
Because sv_ready_restart (ReadyRestart triggered by readying up without being in warmup_stage) was removed in !940 (merged) we no longer need to display any ready-related messages outside of warmup_stage. Also, the messages specific to that feature are no longer necessary.
Fix HUD timer and infomessage support for g_warmup_limit -1 && (g_warmup -1 || g_warmup > 1)
Update hash due to some bot_think code running during countdown
Specifically, 28e4e107 "Allows bots to start playing again immediately when countdown is aborted."
Campaign: don't display scoreboard player count or ReadyRestart notification
Give bots genuine ready status, fixes not appearing ready until a human is ready
Refactor ReadyCount() and handle bots properly
Improve end of warmup countdown abort (when player count drops too low)
Respects g_warmup_allguns 1. Previously players were left with only shotgun and blaster in the resumed warmup when sv_ready_restart_after_countdown 0.
Fixes incomplete countdown abort when sv_ready_restart_after_countdown 1.
Allows bots to start playing again immediately when countdown is aborted.
Implement g_warmup > 1: manual min player setting (overrides map settings)
Follow-up to !1022 (comment 1036769180)