Releases: themuffinator/MuffMode
v0.21.29
Fixed
- Duel queue joining during match lock: Fixed issue where players were unable to join the duel queue when a match was locked. Queue joining is now allowed during match lock since it doesn't affect the active match - queued players are only pulled into matches during warmup periods. This allows players connecting mid-match to queue up for the next match without having to wait for warmup.
- Duel queue refilling during readyup: Fixed issue where the duel queue would not refill if a player disconnected during the readyup phase.
Duel_AddPlayer()now works duringMATCH_WARMUP_READYUPin addition toMATCH_WARMUP_DEFAULT, allowing queued players to be pulled in immediately if a slot opens during readyup. This ensures matches can start with a full roster even if players disconnect during the readyup phase. - Duel mode map change crash: Fixed crash error "Got null changemap when trying to exit level" that occurred when duel matches ended. Duel mode now automatically restarts on the same map if no changemap is configured, ensuring continuous duel matches without requiring map changelevel entities. This prevents server crashes when duel matches end and allows the queue system to continue functioning properly.
- Callvote map display: Fixed issue where
callvote maponly displayed maps from eitherg_map_poolorg_map_listdepending on which was populated. The callvote system now displays all maps from both lists combined, with case-insensitive deduplication and alphabetical sorting. This ensures players can see and vote for all available maps regardless of which cvar they're configured in. - Callvote map crash fix: Fixed access violation crash (0xc0000005) that occurred when executing
callvote map <mapname>. The crash was caused by insufficient validation of thelevel.changemappointer before dereferencing it inExitLevel(). Added comprehensive pointer validation and string length checks to prevent crashes from invalid or corrupted pointers. The fix also adds validation inVote_Pass_Map()to ensure the map name is properly copied to safe storage before use. - g_inactivity false positives: Fixed issue where
g_inactivitycould incorrectly trigger for actively playing players. The inactivity timer previously only checked for newly pressed buttons (latched_buttons), which meant players holding movement keys continuously or only moving the mouse could be flagged as inactive. The timer now checks for any button input, movement input (forwardmove/sidemove), view angle changes (mouse movement), and newly pressed buttons to accurately detect player activity. View angle changes are detected by comparing current and previous frame angles with a 1-degree threshold to avoid false positives from tiny movements. - [Special Colendro Fix] Eyecam spectator fall sound: Fixed the "donk" sound that played when spectating players in eyecam mode as they fell off ledges.
Added
- Automatic bot queueing in duel mode: Bots that are spectating in duel mode are now automatically added to the queue regardless of how many players are currently in the match. This allows bots to fill empty slots in duel matches and be ready for future matches, making it easier to test and play duel mode with bots. Bots are queued whenever they're spectating (except during intermission), and will be pulled into matches by
Duel_AddPlayer()during warmup periods.
Changed
- Team border display: Changed default value of
cl_teamBorderfrom 0 to 1, enabling team border display by default in team-based gamemodes. Players can still disable it by settingcl_teamBorder 0if desired.
v0.21.20
v0.21.20
Added
- Team border indicator: Added a configurable colored border at the bottom of the screen to clearly indicate team membership in team-based game modes (TDM, CTF, etc.). The border displays red for Red team and blue for Blue team. Configurable via cvars:
cl_teamBorder(enable/disable, default: 0),cl_teamBorderWidth(thickness in pixels, default: 4), andcl_teamBorderAlpha(transparency 0-255, default: 180). Fixed missingteam_idassignment inplayer_state_tthat was preventing the feature from working. - Configurable votable gametypes: Added
g_votable_gametypescvar to allow server admins to control which gametypes can be voted on by players. The cvar accepts a space-separated list of gametype short names (e.g., "ffa duel tdm ctf ca"). If empty (default), all gametypes are votable for backward compatibility. When set, only gametypes in the list can be voted on via callvote. Admingametypecommand still allows setting any gametype but shows a warning if the gametype is not in the votable list. Help text dynamically displays only the votable gametypes.
Fixed
- Spectator sound fixes: Fixed issue where positioned sounds for footsteps, fall damage, and ladder steps were being sent to all clients (including the player themselves), causing players to hear duplicate or changed sounds. Now positioned sounds are only sent when there are actual spectators viewing the player, so players hear normal entity event sounds while spectators can still hear the sounds properly.
- Callvote crash fixes: Fixed multiple null pointer dereference issues in the voting system that could cause server crashes when players used the
callvotecommand. Added null checks in vote menu updates, vote execution, and vote storage functions. Also fixed incomplete state cleanup when votes time out or fail, ensuringlevel.voteis properly cleared along withlevel.vote_time. Fixed vote state persistence across map changes -vote_execute_timeand other vote state variables are now properly cleared during level initialization. Fixed vote cancellation when the vote caller disconnects. Fixed incorrectvote_arginitialization inG_InitLevel()(was using= '\n'instead of.clear()for std::string). - Voting system improvements: Fixed duplicate vote vulnerability in menu voting functions (
G_Menu_Vote_Yes/No) that allowed players to vote multiple times. Added vote state validation inCheckVote()to detect and clear invalid vote state whenlevel.voteis null, preventing hanging votes. Added automatic vote count recalculation inCalculateRanks()when a vote is in progress, preventing race conditions when players join or leave during voting. Ensured complete state cleanup in all vote exit paths, includingvote_argclearing inCmd_ForceVote_f()andVote_Passed()error paths. - Division by zero fixes: Fixed potential division by zero in
P_CurrentKickFactor()whenkick.totalis zero or negative, which could cause crashes or NaN/infinity values to propagate through view angle calculations, resulting in corrupted camera views. Also fixed potential division by zero invec3_t operator/(const vec3_t &v)when any component is zero, preventing infinity/NaN values from propagating through vector calculations and causing physics or rendering issues. - Duel queue ordering fix: Fixed broken duel queue ordering where all queued players had
team_join_time = 0_sec, making queue order unpredictable. Now queued players correctly getteam_join_time = level.timewhen joining the queue, ensuring proper FIFO ordering based on when they entered the queue. Non-queued spectators still get0_secto maintain correct separation. - Gametype vote menu cleanup: Removed "ft" (Freeze Tag) and "horde" from the hardcoded available gametypes in vote command help text. Now replaced with configurable
g_votable_gametypescvar system that allows admins to control which gametypes are votable. The removed gametypes still function if set directly but are no longer in the default votable list. - Two-tier map validation system: Implemented proper validation hierarchy for map votes and commands using
g_map_poolandg_map_list. The system now validates maps againstg_map_poolfirst (all available maps), then falls back tog_map_list(maps in rotation) if not found in the pool. This allows players to vote for any map in the pool, not just those currently in rotation. Applied to callvote map validation, adminsetmapcommand, and map queue system. Error messages now display the appropriate map list (pool if available, otherwise rotation list).
v0.21.14
Fixed
-
Spectate functionality: Fixed issue where attempting to spectate would spam console with "You may not switch teams more than once per 5 seconds" message and prevent spectating. Players can now switch to spectator immediately without being blocked by the team switch rate limit. The rate limit still applies when switching between playing teams.
-
Spectator sound fixes: Fixed issue where spectators could not hear player footsteps, fall damage sounds, or ladder step sounds when spectating. These sounds used entity events (
EV_FOOTSTEP,EV_FALL_SHORT/MEDIUM/FAR,EV_LADDER_STEP) which weren't being transmitted to spectators. The fix adds positioned sound calls alongside the entity events to ensure spectators can hear these sounds. Item pickup sounds already worked correctly as they use direct sound calls rather than entity events. -
Spectator POV mode: Fixed issue where spectators were stuck in freecam mode and couldn't view from spectator POV (following other players). This was most noticeable in CA mode where eliminated players stay eliminated longer, but affected all gametypes. The issue was that
GetFollowTarget,FollowNext, andFollowPrevfunctions were setting the follow target but not updatingspectator_statetoSPECTATOR_FOLLOW. Now when spectators follow a player, they properly enter follow mode instead of remaining in freecam. -
Invisible player in CA mode: Fixed issue where a player could become invisible in Clan Arena mode. This occurred when
Entities_ResetsetSVF_NOCLIENTflag during round resets, but the flag wasn't properly cleared when a playing (non-eliminated) player spawned. NowSVF_NOCLIENTis explicitly cleared for playing players during spawn, ensuring they are always visible when they should be.
Restored
-
Map item layout switching: Restored functionality from v0.19.60 that allows maps to switch between different item layouts using entity keys and cvars. Maps can use
bfg_on/bfg_offandplasmabeam_on/plasmabeam_offentity keys to define alternative layouts, controlled byg_no_bfgandg_no_plasmabeamcvars. This fixes issues on maps like mm-kmach where multiple items were spawning at the same location - the map can now use these keys to have different layouts (e.g., BFG layout vs non-BFG layout) and toggle between them. -
Match cancellation delay: Added 300ms delay before match cancellation due to too few players. This allows
bot_minclients(or other bot systems) time to add bots before the match is cancelled, preventing premature cancellations when bots are being automatically added to maintain minimum player count.
v0.21.09
Fix elevators sometimes breaking after match start by resetting trains in Entities_Reset
Fix drop command: move special case checks before item lookup
Added new cvar g_frag_messages
Configure as below:
0: disable rampage messages across all game modes
1: disable rampage messages in TDM/CTF (default)
2: enable rampage messages in all game modes
v0.21.07
Disabled/removed banlist code as was causing issues.
Selectively implemented bugfixes from 0.21.0
Added new cvar: g_map_list_shuffle_once: when set to 1, shuffles the map list once at server startup, then cycles through maps in that order without re-shuffling. This differs from g_map_list_shuffle which re-shuffles on every map cycle. (default: 0)
v0.21.0
target_teleporterbug fix- numerous bug fixes and stability improvements
- plasmabeam knockback greatly reduced in muffmode ruleset
- banned player exploit fixed, more robust now
v0.19.60
[0.19.60] - 2025-06-01
Gameplay Tweaks
Renamed CVar: g_dm_spawn_farthest ➜ g_dm_player_spawn_rule
The original name caused confusion. New values and their effects:
0: Full Random – spawn randomly at any spawn point.
1: Half-Random – spawn randomly within the furthest half of spawn points (default).
2: Farthest – always spawn at the furthest point (poor for low player counts).
3: Nearest – spawn near other players (generally a bad idea).
Starting Health Bonus:
Default g_starting_health_bonus increased to 25
Aids in balancing matches and reduces dominant railgun abuse. Also helps new players stay in the fight.
Map Item Layout
New Entity Keys:
bfg_on / bfg_off: Allows adjusting of item layout involving/excluding BFG on maps using these keys.
Server control: g_mapspawn_no_bfg 0/1
plasmabeam_on / plasmabeam_off: Allows adjusting of item layout involving/excluding Plasma Beam on maps using these keys.
Server control: g_mapspawn_no_plasmabeam 0/1
Gametype Changes
Race Gametype Removed
It was non-functional and caused scoreboard bugs in unrelated gametypes.
Bug Fixes
Entity Reset Improvements:
Transition from warmup to match start no longer breaks bot weapon selection.
Scoreboard Fix:
End-of-match team scores now update correctly. No more outdated scores.
v0.19.55
- Server setting: spawn protection:
- grants 3 seconds of full protection from combat damage, this is cancelled if a weapon is fired.
- To use, add
item_spawn_protecttog_start_items
- added 300ms delay before match cancellation due to too few players - allows bot_minclients to add a bot before the match is cancelled
- rulesets:
- added q1 ruleset, still WIP
rulesetworldspawn key to auto-set ruleset, used wheng_level_ruleset 1
- Fixed incorrect powerup respawn times. Respawn times can now be overridden on a level by setting
countentity key - Fixed bots not joining the game
- Fixed: powerup global spawn sound not playing
- Neatened up spectator HUD
- Fixed: blaster/ripsaw/grapple weapon dropping not removing from inventory
v0.19.50
- g_owner_push_scores : when set to 1, shows scores instead of menu for lobby owners when auto joining is disabled (default 0)
- max health increased from 999 to 9999
- vampiric expiration has an obituary message now
- new commands:
- time-out: call a time out, only 1 allowed per player and lasts for value set by g_dm_timeout_length (in seconds). g_dm_timeout_length 0 disables time outs
- time-in: cuts a time out short
- followleader: when spectating, auto-follows leading player
- use holdable now works for the following items (from highest priority to lowest):
- AM-Bomb
- Doppelganger
- Personal Teleporter
- Adrenaline
- Compass
- g_dm_holdable_adrenaline : when set to 1, allows holdable Adrenaline during deathmatch (default 1)
- added Adrenaline usage fx
- added match announcer sound support, controlled client-side. Looks for QL's vo_evil announcer set, needs the ogg vorbis audio files converting to 22KHz PCM WAV. Clients use announcer command to toggle use of announcers.
- Various match state fixes and improvements including match locking.
- Spectating bots auto join during certain warmup phases.
- DuelFire Damage has been changed to Haste: 50% faster movement, 50% faster weapon rate of fire.
- followleader and followkiller now have a 500ms delay, allows spectators to see the frags before changing
- follow cam now has screen blends
- POI's:
- item dropping POI's now also send to spectators following the specific team
- item dropping and item pickups no longer broadcast to spectators who are following players who performed the drop/pickups
v0.19.30
- duel: fixed scoreboard and cross-level queuing
- fixed lack of player connection messages
- new client commands:
- followkiller : auto-follow killers when spectating (disabled by default)
- followpowerup : auto-follows player picking up powerups when spectating (disabled by default)
- fixed stat counts crashing game
- item pickup POI's: now also applies to CTF flag pickups
- plasma beam: added BFG holding hum
- fix ability to join team while match lock present
- spruced up team initialising
- added dynamic step size: 18 step size above origin, 20 below. somewhat recreates the old origin bug from original Q2 but feels a lot smoother and consistent.
- some improvements to player rankings during match
- some entity spawn rules added and tweaked some ent files to adapt some items to changes in gametype or enabling/disabling powerups