At long last, we are happy to announce the release of Zandronum 3.0! We spent more than two years working on 3.0, so it comes with a large amount of fixes and additions. As the major version bump indicates, it comes with an updated (G)ZDoom base, which is now at ZDoom 2.8pre-441-g458e1b1 / GZDoom 1.8.6. Instead of further delaying this release by writing a long and polished announcement, let me just briefly mention two random highlights: We have a much improved chat input thanks to Dusk and better support for large maps with many actors due to a new buffering system. Everything else is collected in the detailed changelog below.

What is your favorite new feature or bug fix? Please let us know in this thread!

Note that we changed the dmflags values to match the ZDoom values to resolve compatibility problems with the updated ZDoom base and future ZDoom updates. Recent launcher versions should already be aware of this change, but you will need to adjust config files to the new values.

*+ - Updated Zandronum's (G)ZDoom base to ZDoom 2.8pre-441-g458e1b1 / GZDoom 1.8.6. [Torr Samaho]
*! - Rewrote support for preferred weapon order. Weapon info is now automatically looked up, the ORDERDEF lump has been removed. [Dusk]
*+ - Generalized the rune system. Any rune can be used as a powerup (including spread, prosperity and reflection, which are now available as powerups), and any powerup can be used as a rune. [Dusk]
*+ - Added a new buffer for the reliable packets scheduled to be sent from the server to the clients. This allows to limit the number of packets the server sends to a client per tick (CVAR sv_maxpacketspertick, default 64). In particular, this allows to spread the full update a client gets when connecting to the server over multiple ticks and should fix problems connecting to large maps with many actors. Also increased the packet loss buffer size from 1024 to 2048. [Torr Samaho]
+ - Added NamedRequestScriptPuke, named variant of RequestScriptPuke. The two functions can now take 1-5 parameters, thus supporting 4 script arguments. [Dusk]
+ - Added ACS time and date access functions SystemTime(), GetTimeProperty and Strftime(). The return value of SystemTime() may be overridden by the user with the new CCMD acstime. [Dusk]
+ - Quad-buffered stereo / 3D Vision support can now be toggled with the new CVAR gl_quadbufferedstereo (default false). [Torr Samaho]
+ - The warp cheat now works online and can be used by spectators even if sv_cheats is false. [Dusk]
+ - Being banned from a server now shows the server's contact email address. Being masterbanned now shows a clearer message that directs to the forums. [Dusk]
+ - Players' positions in the join queue are now rendered on the scoreboard. [Dusk]
+ - The internal server browser now automatically loads the wads of the selected server when joining. For this, all wads need to be in a place where they can be found with the '-file' command line option. In the browser menu, the left and right keys allow to scroll through the list of filtered servers. [Torr Samaho]
+ - The 'Join the game' command key used by spectators is now customizable in the 'Customize Controls' menu. [Edward-san, Dusk]
+ - The default 'authhostname' CVAR has been changed to the official zandronum game authentication server ( auth.zandronum.com:16666 ). [AlexMax, Edward-san]
+ - BOTINFO now allows to define more than 128 bots. [Torr Samaho]
+ - Chat now features a movable cursor, allowing text insertion/deletion from elsewhere than just the end. [Dusk]
+ - Chat preview is now rendered on multiple lines, if necessary. [Dusk]
+ - Chat now remembers the ten previously sent messages that can be brought up with up/down arrow keys. [Dusk]
+ - Chat can now tab complete player names. [Dusk]
+ - Clients' account names are now visible in the output of CCMD "playerinfo", unless the player hides it with the new CVar cl_hideaccount. The server can always see the accountname from playerinfo. [Dusk]
+ - Added a mechanism to safe login credentials under Windows using the Windows Credential Manager aka Windows Vault. The credentials can be stored using the new CCMD 'login_add'. A default user name can be specified with the new CVAR 'login_default_user'. [Torr Samaho]
+ - This server now prevents players to use a name already used by another player. If a player requests a duplicate name, the player is renamed to 'Player N' where N is a random number from 0 to 9999. [Torr Samaho]
+ - Added CCMD demo_pause that allows to pause/resume the currently played client side demo. In free spectate mode, the spectator can still move around while the demo is paused. [Torr Samaho]
+ - Added cl_soundwhennotactive CVAR support to non-Windows clients. [Edward-san]
+ - Added support to clientside ACS_ExecuteWithResult with four arguments. [Edward-san]
+ - Added sv_survival_nomapresetondeath Zandronum dmflag to modify survival game mode where the map will not be reset on all players death - the players will be able to continue with fresh amount of lives. Dead players will carry over their inventory in accordance to "keep inventory" flags. [Zalewa]
+ - Backported ZDoom's ACS function GetActorFloorTexture. [Torr Samaho]
+ - The SQLite3 database can now be used in WAL mode. This mode is enabled / disabled with the new CCMDs 'db_enable_wal' / 'db_disable_wal'. [Torr Samaho]
+ - Added new ACS command SetDeadSpectator (int playernumber, int deadspectator). This command can turn alive players into dead spectators (deadspectator == 1) and revive dead spectators (deadspectator == 0). [Torr Samaho]
+ - Added the new ACS command SetActivatorToPlayer as a replacement solution for AAPTR_PLAYERx that works with all 64 players instead of only 8. [Dusk]
+ - Added CVAR sv_forcerespawntime that controls the time delay before force respawn activates and respawns a player. [Ru5tK1ng]
+ - The authentication mechanism for non-map related lumps now allows Freedoom 0.11.3/Doom clients to join Doom/Freedoom 0.11.3 servers. [Torr Samaho]
- - Fixed: Newly connecting clients were not properly informed about the secrets that were already revealed. [Torr Samaho]
- - Fixed: Resurrect cheat didn't work online. [Dusk]
- - Fixed: Turbo cheat didn't work online. [Dusk]
- - Fixed: Kill [class] cheat didn't work online. The kill monsters cheat can also be used by clients if sv_cheats is true. The server can use the kill [class] cheat anytime, like with kill monsters. [Dusk]
- - Fixed: Logfiles would sometimes contain timestamps in the middle of lines. [Dusk]
- - sv_shotgunstart is now respected in non-cooperative gamemodes. [Dusk]
- - Fixed: Take cheat didn't work online. [Dusk]
- - Fixed: An invalid "winlimit hit" message would be displayed on map change in possession. [Dusk]
- - Fixed: The internal server browser didn't list all of the compatible, available servers. [Torr Samaho]
- - Fixed: A_CheckSight would not jump if a spectator was in the line of sight of the calling actor. [Dusk]
- - Fixed: Using kick_idx, ignore_idx, unignore_idx, getip_idx, kickfromgame_idx and ban_idx with an invalid player index assumed a default of player 0. [Dusk]
- - Fixed: SpawnDecal did not work online. [Dusk]
- - Fixed: the 'take inventory' server command informed the clients by using the inventory class string instead of the much cheaper network id. Thanks to Siferah for spotting and reporting it. [Edward-san]
- - Fixed: the 'spawn player' server command used 1 more byte than needed. [Edward-san]
- - Fixed problems of the Doom status bar with high res font replacements. [Torr Samaho]
- - Fixed: ACS function PlaySound did not work online. [Edward-san]
- - Fixed: Bots on a large map may freeze the game. [Torr Samaho]
- - Fixed: clients would play D'Sparil's attacks sound even when the attacks didn't start because there was no target to attack. [Edward-san]
- - Fixed: clients weren't informed to play the heretic Knight attack sounds when it throws the axes. [Edward-san]
- - Fixed: clients were told to play the 'poison cough' sound even when the poisoning by flechette didn't happen (for example because the player is invulnerable). [Edward-san]
- - Fixed: clients were not informed correctly about the actors being in alert when another actor is hit by a dagger attack. [Edward-san]
- - Fixed: clients would play the sounds from the world-activated ACS function ActivatorSound differently from offline. [Edward-san]
- - Fixed: the server didn't inform the clients to not apply the DROPPED flag to level-spawned items which don't have it by default. [Edward-san]
- - Fixed: clients were not informed correctly about the morphed player's morph style. [Edward-san]
- - Fixed: clients were not informed to play the active sound of a PowerProtection powerup. [Edward-san]
- - Fixed: clients couldn't hide the RaiseAlarm item released by dying NPC actors. [Edward-san]
- - Fixed: clients were not informed correctly about actors being affected by A_NoBlocking invoked by an item pickup. [Edward-san]
- - Fixed: HUDMessage messages weren't cleared on map resets. [Edward-san]
- - Fixed: Player start types were selected based on the CVARs deathmatch and teamgame instead of the GAMEMODE flags DEATHMATCH and TEAMGAME. [Torr Samaho]
- - Fixed: A titlemap run with gamemode cooperative and dead spectators was not started correctly. [Edward-san, Torr Samaho]
- - Fixed: The ACS function ReplaceTextures didn't show an effect for clients already in the game. [Torr Samaho]
- - Fixed: Certain code pointers like A_PlaySound didn't work on MorphFlash/UnMorphFlash online. [Torr Samaho]
- - Fixed: Clients played the Archvile resurrect sound twice. [Edward-san]
- - Fixed a network inconsistency with Archvile-like monsters which miss the Heal state and use A_VileChase to eventually resurrect the corpses. [Edward-san, Torr Samaho]
- - Fixed: clients didn't handle properly resurrecting monsters in rare occurrences. [Edward-san]
- - Fixed the wrong thingz positioning after an offline map reset. [Torr Samaho, Edward-san]
- - Fixed: clients mispredicted NOGRAVITY things, attached to the ceiling, when pushed by something. [Edward-san]
- - Fixed: menu ignore got confused about players with the same name. [Dusk]
- - Fixed: A_Respawn wasn't handled correctly online. [Edward-san]
- - Fixed: clients couldn't hear the player's jumping sound if present. [Edward-san]
- - Fixed: When the server used ACS_ExecuteWithResult to start a CLIENTSIDE scripts, the clients were told the wrong arguments. [Torr Samaho]
- - Fixed: A_Mushroom did not work properly online. [Torr Samaho]
- - Fixed: The server didn't instruct clients to spawn missiles from A_CustomMissile if they exploded on spawn. [Torr Samaho]
- - Fixed: AFastProjectile ignored the CLIENTSIDEONLY flag of its MissileType. [Torr Samaho]
- - Fixed: A_SpawnDebris did not work properly online and ignored the CLIENTSIDEONLY flag. [Torr Samaho]
- - Fixed: Voodoo dolls could cause unnecessary network traffic. [Torr Samaho]
- - Fixed: Indefinitely hidden non-inventory actors caused unnecessary network traffic during a map reset. [Torr Samaho]
- - Fixed: Clients were informed about RandomSpawners, even though they only needed to know about the outcome of the spawner, which wasted network traffic. [Torr Samaho]
- - Fixed: The server could instruct the client to spawn puffs without a netID even if the puff didn't have the NONETID flag. [Torr Samaho]
- - Fixed: Clients with high bandwidth weren't informed about the item dropping physics online. [Edward-san]
- - When sv_nocallvote is 2, only consider votes of players joined in the game (addresses 2590). [Ru5tK1ng]
- - Fixed: Returning to a map in a hub could crash the clients online. [Torr Samaho]
- - Fixed: Votes were not being removed or cancelled when a player disconnected. [Ru5tK1ng]
- - Fixed: Server-to-client ACS script executions could not represent the values [-127..-1] as parameters. [Dusk]
- - Fixed the inconsistent/missing number of allies and/or opponents left when the displayed player dies/spectates in gamemodes with dead spectators. [Edward-san]
- - Fixed: SMF_Look was not working in CTF and other team game modes. [Ru5tK1ng]
- - Fixed: Fixed colormaps not being respected for actors beneath 3D floors. [Dusk, Torr Samaho]
- - Fixed: The scoreboard duel wins drawer could crash with cameras not attached to the player. [Edward-san]
- - Fixed: The screen blending effects wouldn't work on the automap. [Edward-san]
- - Fixed: A_BrainScream and A_BrainExplode caused unnecessary network traffic. [Torr Samaho]
- - Fixed: the change of the player name with a too short name wasn't handled correctly. [Edward-san]
- - Fixed: z-position client-server inconsistencies for things on cliffs. [Zalewa, Edward-san]
- - Fixed: Leaf1 and Leaf2 caused unnecessary network traffic. [Torr Samaho]
- - Fixed: Mugshot multiplayer background color didn't change with player color in OpenGL. [Zalewa]
- - Fixed: "File|Join" from server console wouldn't load DeHackEd patches. [Zalewa]
- - Fixed: GetScreenWidth and GetScreenHeight ACS functions did not work online. [Dusk]
- - Fixed: the DamageFactor calculation was executed twice for armors. [Edward-san]
- - Fixed: body of the player who loses all lives no longer disappears into thin air. [Zalewa]
- - Fixed a certain number of commands and server CVARs which weren't protected against the ConsoleCommand. [Edward-san, Torr Samaho]
- - Fixed: the server could crash if a morph powerup is taken away when the morphed player exhausts the ammo. [Edward-san]
- - Fixed crash with voodoo dolls and PowerIronFeet. [Edward-san]
- - Fixed: Under rare circumstances, the server could freeze when selecting a random map from the map rotation. [Torr Samaho]
- - Fixed: When the server instructed a client to jump as result of A_Jump*, the client did not call the state function of the state jumped to. [Torr Samaho]
- - Fixed: The server didn't fully notify the clients about water splashes. [Torr Samaho]
- - Fixed a potential client crash related to the firing sound of a railgun. [Torr Samaho]
- - Fixed: Blood splatter caused unnecessary network traffic. [Torr Samaho]
- - Fixed: A_FiredSpawnRock and A_FiredSplotch caused unnecessary network traffic. [Torr Samaho]
- - Fixed: Angle arguments in DECORATE didn't work properly on ARM devices like the Raspberry Pi (adapted from the corresponding ZDoom fix). [Torr Samaho]
- - Fixed: The server informed the clients about the position of the other players during intermission, which generated unnecessary network traffic. [Torr Samaho]
- - Fixed: the server erroneously told clients that some slamming actors changed their state to the Spawn state instead of the Idle state. [Edward-san]
- - Slightly improved how the MinotaurFriend is handled online. [Edward-san]
- - Fixed: When a player was damaged, clients always executed the first state function of the standard pain state. [Torr Samaho]
- - Fixed: The server didn't inform the clients about changes made with A_ChangeFlag to the special Zandronum flags, like DONTIDENTIFYTARGET. [Torr Samaho]
- - Fixed: CLIENTSIDE scripts lost track of the player as activator when the player was morphed or unmorphed. [Torr Samaho]
- - Fixed: A too long value of sv_hostname could crash the Windows server when it was minimized to the system tray. [Torr Samaho]
- - Fixed: Using SetDBEntryString with an integer instead of a string as argument could cause a crash. [Torr Samaho]
! - Changed: Spectators can now interact with gravity and use the fly/land commands. [Leonard]
! - Save games now contain information about the renderer used to create the save. This allows to print a proper error message when an incompatible save is tried to be loaded. [Torr Samaho]
! - Clients don't error out anymore when encountering a division by zero in a DECORATE expression. Instead, a one time warning is printed on the first occasion and the result is assumed to be zero. This is necessary since clients can encounter this in valid DECORATE code due to Zandronum's jump handling. [Torr Samaho]
! - Changed the dmflags values to match the ZDoom values to resolve compatibility problems with the updated ZDoom base and future ZDoom updates. Launchers and config files need to be updated to account for this change. [Torr Samaho]
! - sv_nodrop is now a dmflag. [Dusk]
! - sv_limitnumvotes renamed to sv_votecooldown and changed to integer that determines the time to wait before a player can revote. All vote limits and times are double this value. [Ru5tK1ng]
! - Merged sv_nokill and sv_disallowsuicide into one dmflag with two names. [Dusk]
! - The CVARINFO error message triggered when an existing CVAR in the ini conflicts with CVARINFO now instructs the user to clean the ini. [Torr Samaho]
! - The server now displays the IP address of the player upon connection and disconnection in log messages. [Dusk]
! - ZDoom changed the jumping physics in ZDoom SVN revisions 2238 and 2970. The old jumping behavior known from Skulltag can be restored with the new CVAR compat_skulltagjumping. [Torr Samaho]
! - con_virtualwidth and con_virtualheight now default to 640 and 480, respectively. [Dusk]
! - kickfromgame and kickfromgame_idx have been renamed to forcespec and forcespec_idx, respectively, though the old names still exist for compatibility with e.g. aliases. Same also with the ACS function KickFromGame, whose new name is ForceToSpectate.
! - A new non-fatal 'Script Error' message will be printed if in a MAPINFO episode definition it's present either 'botskillname' or 'botskillpicname' but not 'botepisode'.
! - The CVARs gl_render_things, gl_render_walls, gl_render_flats and gl_mask_threshold are now restricted to beta builds. [Torr Samaho]
! - Make newly connected clients wait before calling a vote. The wait time is controlled with the new CVAR 'sv_voteconnectwait'. [Ru5tK1ng]
! - Keys can now be used while a client side demo is played. This allows binds to CCMDs like demo_pause to be used during playback. [Torr Samaho]
! - Dead spectators will now preserve inventory so that they can be respawned with it. [Zalewa]
! - When alive players complete the map in survival, dead spectators will recover their inventory on the next map in accordance to SV_COOP_LOSE* flags [Zalewa]
+ - The 'authhostname' DNS lookup is not done during startup anymore, but only if the IP address is needed. [Torr Samaho]
! - The memory required for the bot nodes is now dynamically allocated when the first bot is added and freed when the last bot is removed. Thus, the CVAR sv_disallowbots is obsolete and was removed (adapted form Konar6's kpatch). This also fixes that offline, the memory required for the bot nodes was always allocated. [Torr Samaho]
! - To stay compatible with Zandronum 2.x, GetCVar still returns the consoleplayer's value if called in a non-player activated CLIENTSIDE script to get the value of a user cvar. [Torr Samaho]
! - Althud's discovered secret counter now shows global discovered secret count in netgames. [Zalewa]
! - Changed the default value of sv_defaultdmflags to false. [Torr Samaho]
+ - The coop info HUD now uses weapon tags. [Dusk]
- - Fixed: The effects of the terminator sphere and the hellstone on a player were not properly stored in save games. [Torr Samaho]
- - Fixed: SetPlayerProperty could still change certain flags on a spectator. [Leonard]
- - Fixed: Changing the CVAR 'fullscreen' crashed the server. [Torr Samaho]
- - Fixed: sv_sharekeys did not use actor tags properly anymore after the ZDoom update in 2.0. [Dusk]
- - Fixed: Free spectate mode would crash the game. [Dusk]
- - Fixed: The game could tick too fast after getting kicked. [Leonard]
- - Fixed: The automap would render spectators other than the local player. The local player, if spectating, now won't be rendered either if the user spies on someone. [Dusk]
- - Fixed: the server did not handle item givings and takings with amounts greater than 32767. [Edward-san]
- - Fixed: Thing arguments were transmitted with 1 byte each instead of 4 bytes. [Dusk]
- - Fixed inconsistent 'spectating' text draw when a dead spectator coop spies another player. [Edward-san]
- - Fixed: Online clients trying to run an offline skirmish were not disconnected properly. [Edward-san]
- - Fixed: A_SpawnFly's customized BrainFire-like fog actor parameter reproduced the wrong sound online. [Edward-san]
- - Fixed: A_FadeTo did not work properly online. [Edward-san]
- - Fixed: clients were not updated about the successful gauntlet lifesteal attacks from a player. [Edward-san]
- - Fixed: clients ignored the customized sound argument of A_VileAttack. [Edward-san]
- - Fixed display problems of the MOTD on the clients when the server sent an invalid string. [Torr Samaho]
- - Fixed: The server didn't inform the clients about jumps made by A_CheckSight. [Torr Samaho]
- - Fixed c/s sync problems on maps with more than 65535 sidedefs. [Torr Samaho]
- - Fixed sidedef related problems with map resets on UDMF maps. [Torr Samaho]
- - Fixed: Clients were not properly informed about the effects of SetAmmoCapacity after a changemap map change. [Torr Samaho]
- - Fixed: sv_forcegldefaults 1 didn't cover gl_distfog changes. [Edward-san, Torr Samaho]
- - Fixed: The ACS function SetMugshotState was not handled properly online. [Edward-san, Torr Samaho]
- - Fixed: The player drowning code was not handled properly online. [Edward-san]
- - Fixed: Clients did not receive the correct MaxAmount value for AmmoCapacity inventories if it was greater than 32767 after a map change. [Edward-san]
- - Fixed: Server-to-client ACS script calls would corrupt arguments within the range [-128, -1]. [Dusk]
- - Fixed: The client could change the value of sv_limitcommands for itself, allowing it to skip some sanity checks. [Dusk]
- - Fixed: Player TIDs were not synced to newly connecting clients. [Dusk]
- - Fixed: sv_forcegldefaults 1 didn't honor the MAPINFO lightmode option if present. [Edward-san]
- - Fixed: Invisible and translucent map things lost their visual effect on map restarts and nightmare respawns. [Edward-san]
- - Fixed: Boom-style generic ceilings did not cause texture changes properly online and were not reverted during a map reset. [Dusk, Torr Samaho]
- - Fixed: When a player carrying the white flag died or disconnected, the white flag was spawned on the floor instead of the actual Z position of the player. [Edward-san]
- - Fixed: Dying players with no lives left disappeared instantly if compat_instantrespawn was enabled. [Edward-san]
- - Fixed: joining spectators could cause spawn telefrags more often than they were intended. [Edward-san]
+ - The authentication mechanism for non-map related lumps now allows Freedoom 0.10/Doom clients to join Doom/Freedoom 0.10 servers. [Torr Samaho]
! - Spectators may now move freely even when the game has ended and players are frozen in place. [Dusk]
! - The "wrong protocol version" network error now shows the full server and client version. [Torr Samaho]
! - Since the only purpose of the CVARs sv_useticbuffer and sv_limitcommands is for debug, they are now restricted to testing binaries. [Torr Samaho, Dusk]
! - The player's yaw movement is locked if its speed is above 'SR40' (and angle changes are disregarded) on client and server. [Circunei Z, Hypnotoad]
! - Joypad strafing movements are now capped at SR40 speed. [Leonard]
! - Dropping is now allowed in competitive gamemodes, unless sv_nodrop explicitly disallows it. [Dusk]

Question is, whats next? I think it's safe to say TSPG's constant updates with the forced beta builds has proven invaluable for getting 3.0 tested and out the door. Will this continue as newer beta releases come out? And what's next for Zandronum? There was talk of some kind of merge with ZDoom a while back but I don't know if any plans were made. There are still a ton of ZDoom features missing that would make modding for this engine a LOT easier, and I'm not even talking about zscript (although finally having an excuse to tinker with that would be nice). It would be nice to know what's upcoming, if anything (plz don't take my consolecommand away ).

thanks to everyone who helped with testing, thanks for everyone who put up with TSPG forcing 3.0 beta just so we could help with the numbers, thanks to Torr Samaho and the rest of the devs for their awesome contributions, thanks MiFU for continuing to give zandronum a home, thanks to everyone who submitted bug reports and got stuff done, and thanks to everyone for continuing to support an extremely flexible multiplayer doom client that every year gets bigger and better.

Big thanks to the devs: Torr, Dusk and Edward for their long journey of hard work.

I'd like to thank the testing team that carried the tracker and tickets over the last few years: Watakid, Ru5tK1ng. Honorable mentions: Marcaek, Decay, Argentum, CombineBobnt. The ticket reporters that actually tested and provided feedback when requested.