I’ve gotten better at this framework by creating a few personal plugins with Shared API and other more advanced features.
Because of this I now feel confident enough and have enough freed-up time to continue fixing remaining bugs (so glad there are only a few) and implementing most requested features.
Customizable Server Prefix - Set your server prefix in config to be applied across all translations
Player Leave Punishment - Automatic punishment for players disconnecting during matches with 3 sensitivity levels
Announcement Timer Controls - Adjust timing for ready status, captains, and command reminder messages
Comprehensive Plugin API - 40 methods providing full match control via external plugins (start/stop matches, manage players, control timeouts/surrenders, modify teams, force state transitions, etc.)
Improvements
Fixed Ready Status Displays - Scoreboard and center HTML overlays now update immediately instead of on delays
Enhanced player lifecycle tracking with punishment queue system
Broadened state coverage: Auto-reset now triggers in all match states except Warmup and MapLoading
Excluded bots from player count: Uses !IsBot(p) filter so CS2 bot replacements don’t inflate the count
Deferred reset on empty server: When all humans leave, sets resetMixOnFirstJoin flag instead of immediate reset (server hibernation prevents timers from firing)
Map change safety: Skips auto-reset logic during MapLoading state to prevent false resets when players reconnect after map vote
Fixed a critical bug which would cause endless map vote instead of picking team members
Fix: Do not register commands as raw (causes issues for some native-like commands (eg. map)
Fixed cases where if a map was changed by another plugin, it would mess up MixScrims config execution resulting in various issues, like match config being executed during Warmup.
Improvements
Hardened captain handling against stale/disposed IPlayer references that survive map changes and reconnects, preventing crashes in PrintChosenCaptains, StartTeamPickingPhase, StartKnifeRound, and the side-pick prompt.
Added a new EnsureCaptainsAlive() helper that clears invalid captain refs and re-picks replacements from playing/picked rosters.
Guarded !start so it can no longer relaunch the knife round when the match is already past pre-match phases (fixes the knife-round loop).
Preserve the pre-MapLoading state across map transitions so manual !map during warmup no longer auto-promotes the match to MapChosen (and skips captain selection in that case).