Skip to content

Releases: themuffinator/MuffMode

v0.21.29

27 Jan 00:20

Choose a tag to compare

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 during MATCH_WARMUP_READYUP in addition to MATCH_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 map only displayed maps from either g_map_pool or g_map_list depending 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 the level.changemap pointer before dereferencing it in ExitLevel(). Added comprehensive pointer validation and string length checks to prevent crashes from invalid or corrupted pointers. The fix also adds validation in Vote_Pass_Map() to ensure the map name is properly copied to safe storage before use.
  • g_inactivity false positives: Fixed issue where g_inactivity could 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_teamBorder from 0 to 1, enabling team border display by default in team-based gamemodes. Players can still disable it by setting cl_teamBorder 0 if desired.

v0.21.20

21 Jan 12:39

Choose a tag to compare

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), and cl_teamBorderAlpha (transparency 0-255, default: 180). Fixed missing team_id assignment in player_state_t that was preventing the feature from working.
  • Configurable votable gametypes: Added g_votable_gametypes cvar 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. Admin gametype command 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 callvote command. Added null checks in vote menu updates, vote execution, and vote storage functions. Also fixed incomplete state cleanup when votes time out or fail, ensuring level.vote is properly cleared along with level.vote_time. Fixed vote state persistence across map changes - vote_execute_time and other vote state variables are now properly cleared during level initialization. Fixed vote cancellation when the vote caller disconnects. Fixed incorrect vote_arg initialization in G_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 in CheckVote() to detect and clear invalid vote state when level.vote is null, preventing hanging votes. Added automatic vote count recalculation in CalculateRanks() 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, including vote_arg clearing in Cmd_ForceVote_f() and Vote_Passed() error paths.
  • Division by zero fixes: Fixed potential division by zero in P_CurrentKickFactor() when kick.total is 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 in vec3_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 get team_join_time = level.time when joining the queue, ensuring proper FIFO ordering based on when they entered the queue. Non-queued spectators still get 0_sec to 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_gametypes cvar 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_pool and g_map_list. The system now validates maps against g_map_pool first (all available maps), then falls back to g_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, admin setmap command, and map queue system. Error messages now display the appropriate map list (pool if available, otherwise rotation list).

v0.21.14

16 Jan 00:37

Choose a tag to compare

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, and FollowPrev functions were setting the follow target but not updating spectator_state to SPECTATOR_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_Reset set SVF_NOCLIENT flag during round resets, but the flag wasn't properly cleared when a playing (non-eliminated) player spawned. Now SVF_NOCLIENT is 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_off and plasmabeam_on/plasmabeam_off entity keys to define alternative layouts, controlled by g_no_bfg and g_no_plasmabeam cvars. 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

05 Jan 19:28

Choose a tag to compare

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

27 Dec 22:10

Choose a tag to compare

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

11 Nov 22:03
e51338e

Choose a tag to compare

  • target_teleporter bug fix
  • numerous bug fixes and stability improvements
  • plasmabeam knockback greatly reduced in muffmode ruleset
  • banned player exploit fixed, more robust now

v0.19.60

11 Jul 10:02

Choose a tag to compare

[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

15 Dec 13:49
7518b7c

Choose a tag to compare

  • 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_protect to g_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
    • ruleset worldspawn key to auto-set ruleset, used when g_level_ruleset 1
  • Fixed incorrect powerup respawn times. Respawn times can now be overridden on a level by setting count entity 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

30 Sep 23:19

Choose a tag to compare

  • 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

23 Sep 16:35

Choose a tag to compare

  • 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