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).
You can now create Custom HUD plugins to handle MixScrims match flow
Legacy CenterHTML menus and announcements are still supported, so creating a Custom HUD plugin to manage MixScrims match flow is 100% optional!
New external control API
Other plugins can now observe the whole match lifecycle through events: state changes, ready-ups, captain assignment, team picks, map voting, knife round, timeouts, surrender votes, vote kicks and match end.
Added snapshot reads for everything above, so a plugin that loads or reloads mid-match can catch up instantly instead of waiting for the next event.
Added driver methods so an external plugin can cast votes, make picks, volunteer captains and choose the starting side on a player’s behalf.
Added built-in UI suppression toggles (menus and center-screen text), so another plugin can replace MixScrims’ in-game presentation with its own without duplicate popups.
Two new config options to enable that suppression from the config file: SuppressBuiltInMenus, SuppressBuiltInCenterHtml.
Bug fixes
Surrender now actually ends the match. Previously a passing surrender vote just paused the game and quietly reset the plugin. It now ends the match through CS2’s native surrender flow with the proper end-of-match panel, and waits for that panel before resetting.
Votes resolve as soon as the result is decided. Timeout and surrender votes no longer hold the whole team hostage until the timer expires or every last player clicks — once a majority is reached (or is no longer possible), the vote closes immediately. The vote progress message now shows the votes actually required.
Duplicate votes are blocked. A player can no longer answer the same vote twice.
Fixed double timeouts. A timeout request could be served and then queued a second time on the next round start.
Fixed team counting. Team fullness and limit checks were reading player pawns, which gave wrong numbers for dead/spectating players. They now read player controllers.
Removed forced game restarts from phase configs. These were causing crashes on team-limit edge cases and were wiping entities spawned by other plugins mid-warmup. Phase transitions are now driven directly by the plugin.
Fixed phases silently not starting. The warmup timer wasn’t always cleared before the knife round and team-pick phases, so their transitions were being ignored by the game.
Fixed a rare edge-case where server would crash if captain chose !stay / !switch right at the moment when after knife round all players would be moved to the spawn and match pause initiated.
The fix is to extend round after it ended to +30s, this would allow captain to make their pick safely and if they dodn’t pick by that time, MixScrims counts that as a !stay and match begins
Must update to this version in order to avoid random crashes.
Fixed a server crash on team changes — reconnects, spectator moves and the
halftime side swap could all trigger it. The plugin was reading player names
out of game memory that had already been torn down.
Servers running with DetailedLogging enabled were the most exposed, but one
path could crash with it off too.
Must update to this version to avoid cases where vote cannot pass because of recently disconnected players.
Votes no longer hang when a player leaves mid-vote. Surrender, timeout and vote
kick re-count who is still on the team and close as soon as the rest have decided
it — a unanimous surrender used to sit open until the timer ran out, then announce
itself as failed.
A vote kick ends immediately when its target disconnects.
The starting-side vote closes once the remaining winners have answered, and votes
left behind by players who already left no longer count toward the result.
Leaving during map voting now withdraws your vote; the next player to connect used
to inherit it.
The team pick menu is rebuilt when a player it lists disconnects, so captains can
no longer click a name that is already gone. If nobody is left to pick, the knife
round starts instead of stalling.
Two players with the same name can no longer be picked as the same person, which
left the other unpickable for the rest of the draft.
Surrender vote progress now shows the correct total in replacement menus — it read
100% one vote before the team had agreed.