## JJ2+ (last updated June 30, 2026)

Created by BlurredD based on Neobeo's code, with help from Monolith and Grytolle

Programming team: Seren, Violet CLM

Additional code: ak-47, Grovespaz, Jerrythabest, minmay, Necrolyte, Salamander, Stijn, Superjazz, zepect

Artwork: TreyLina; DoubleGJ, Hare; Bot-chan; Blade, Disguise, Haze, Mez, P4ul, Pyromanus, Spaztic, Toxic Bunny

Translation: Grytolle, Kyro, Seren

Testing/Feedback: cooba, Kev, Primpy, Naps, Necrolyte, Shaker, and the whole community

Additional thanks: Bobby aka Dizzy, Cataphract, Cpp, Emo, EvilMike, Foly, NinjaCC, Red Ninja, Shane Lillie, SuPrem, Syntax, Torkell, Andreas Jönsson of AngelCode.com, the guys at CodeProject, and others who (might?) know who they are.

## About JJ2+

JJ2+ is a massive mod of Epic Games' 1998 masterpiece Jazz Jackrabbit 2, adding countless features and bug fixes to both Single Player and Multiplayer gameplay. One way to think of JJ2+ is as a series of tools built into various parts of the game to give you and other users more ways of creating new Jazzy experiences for yourselves. For example, level designers have their options broadened hugely by JJ2+'s easy-to-use scripting language and the various new options for use in the Jazz Creation Station level editor. On the multiplayer side of things, JJ2+ expands Party Mode's four basic game modes (Battle, Capture the Flag, Treasure Hunt, and Race) by adding eleven new modes (Roast Tag, Last Rabbit Standing, Extended Last Rabbit Standing, Team Last Rabbit Standing, Pestilence, Team Battle, Death CTF, Jailbreak, Flag Run, Domination, and Head Hunters) and applying numerous bug fixes and feature additions to the old ones. In particular, JJ2+ expands multiplayer play with roughly two-hundred different console commands (many with matching options in the game's dropdown menu) for enabling or disabling game modes, weapons, and numerous other options like spectators or mouse aim gameplay. JJ2+ builds on Jazz Jackrabbit 2's strong foundation to create the world's foremost 2D Arena Shooter experience, even more feature-rich than many of its 3D competitors.

What JJ2+ is not is a content mod. JJ2+ ships with very few new maps or tilesets, and the ones it does include are intended more for exhibiting individual new mod features than for providing an exceptional gameplay experience. (You can try them out by opening the Home-Cooked Levels menu and searching for filenames beginning with the word "plus".) Fortunately, there are literally thousands of custom maps and tilesets already available for Jazz 2, and every new JJ2+ release gives authors new gameplay options to play with in the months ahead. Or join an existing online server and try out some of the levels it's hosting!

Similarly, if you start up Jazz 2's traditional Single Player campaign from within JJ2+, expecting a vastly new experience, you will be disappointed. JJ2+ aims to be as backwards compatible with existing levels made over Jazz 2's twenty-five year history as possible, while simultaneously fixing scores of bugs from the game-crashing to the incredibly obscure. Every new feature JJ2+ adds is one that you, as the level author or player or online server runner, deliberately choose to use, not one that breaks the original gameplay you know and love. Again, there are plenty of new Single Player levels out there for you to download and try out!

JJ2+ only works with the full (non-shareware) versions 1.23 and 1.24 ("TSF") of Jazz Jackrabbit 2, although not all versions of 1.23 and 1.24 are supported; in particular, TSF: LK Avalon is not supported, nor the various Holiday Hare/Christmas Chronicles releases. If you are running JJ2 version 1.20 through 1.22, you will need first to apply the 1.23 patch, then JJ2+ (see Installation below). If you are running version 1.00 or 1.10, you are legally out of luck; those are non-commercial beta versions of the game, and cannot directly be upgraded to full commercial releases.

JJ2+ makes use of the BASS audio library, allowing support for MP3/MP2/MP1/OGG/AIFF music and better support for module music. Warning: Clients running unmodded versions of JJ2 will crash if they attempt to load any music file that is not a supported module music track, e.g. by joining some servers hosted by JJ2+ players..

JJ2+ has been in development more or less since January 2006. It is not open source at this time.

Any questions or other feedback about JJ2+ can be posted in either the dedicated thread at the Jazz Jackrabbit Community Forums or our ModDB page. For the best results at ModDB, send your feedback/questions as private messages to the page's maintainer, since ModDB does not currently notify people when their mods receive comments. Bug reports and feature suggestions should be left in the dedicated JJ2+ issue tracker.

## Installation

There are three ways to install JJ2+, depending on what package you downloaded. If you have…

### GOG.com's distribution of JJ2

Apply JJ2+ to your installation using either GOG Galaxy (in "Manage installation") or the GOG website (in "Extras"). Click here for a detailed tutorial.

### plus_install.zip (automatic):

Run the plus_install.exe program and read the text in every window until JJ2+ is successfully installed.

### plus.zip (manual/legacy):

Extract all files from plus.zip into your Jazz Jackrabbit 2 directory.

If it is the first time JJ2+ is installed, it is necessary to run the Plusifier (plusifier.exe) first. The Plusifier takes JJ2's original executable and makes a new executable that automatically loads plus.dll on startup. The new executable will have a plus sign added to its filename. The Plusifier DOES NOT need to be used every time JJ2+ is updated, unless specified otherwise.

The Plusifier allows overwriting the original exe or another file, so BE CAREFUL and make backups when necessary. Please report any problems with the Plusifier.

## Latest Changes

### Jun 30 2026: Player List 6 (6.6e)

- Hold `Tab` in the server list to view extended details about each server, such as that server's player list.
- Press `F9` (or `Ctrl+F9`) in the server list to change how players are listed, potentially showing separate counts for active players, open spots, spectators, and bots (players whose names begin with `Bot` or `AI` ).
- Fixed crash from 6.6d in the Continue and Next Episode screens.
- Fixed client-side glitch where players who were zombies before a gamemode change sometimes had brains appear by their names upon cycling to a new level.

### Apr 28 2026: Player List 5 (6.6d)

- Reduced risk of clients getting kicked for having had sugar rushes or shields in the previous level. (Server-side fix.)
- Fixed Pestilence glitch where non-zombies could hurt each other after any zombie left the game, even if it wasn't the only zombie. (Server-side fix.)
- Fixed glitch where players with zero lives in LRS-based gamemodes, and spectators in Race pregames, would be stuck seeing a black screen. Hopefully fixed, anyway.
- Fixed glitch of player name colors or gamemode icons (skulls, brains, etc.) sometimes disappearing after clients touched No Fire Zone events or called certain `jjPLAYER` AngelScript methods. (Mostly server-side fix.)
- Fixed glitches while unspectating that sometimes caused players to have zero lives in (X)LRS or incorrect fur in/after Pestilence. (Server-side fix.)
- Lori now has the same zombie colors after unspectating that she does after getting roasted.
- Fixed visual glitch when drawing 32-bit tiles in front of Warp Horizon textured layers with the LEGACY texture surface.
- Fixed glitch of tileset/music filenames beginning with numbers getting partially colored in the HUD when not in your main JJ2 folder.

### Apr 03 2026: Player List 4 (6.6c)

- In the player list, moved the ping times farther to the right, and reverted 6.6b's dark `- -` stats for spectators. Names start out with the vanilla spacing and can only get one level narrower.
- Split the old `/streaming` option into new `/showpasswordsandips` and `/modulemusiconly` options, both disabled by default. As a result, unlike before, all passwords and IP addresses are now hidden/censored inside the game window. You must opt in to seeing them, by enabling this setting after opening the game.
- The `/kick` and `/ban` commands no longer show the IP address of the kicked/banned player to remote admins who aren't allowed to use the `/ip` command.
- Server IP logs skip duplicate lines and instead log a summary of how many times the line would have been duplicated: for example, if you receive five Server Queries in a row from the same IP, only the first is logged in full, then a " + 4 more" line is logged below it.

### Mar 10 2026: Player List 3 (6.6b)

- Made the following changes to the player list in response to player feedback:
- Reverted the cog icon to a green uppercase A.
- Moved the admin and mute icons back to the left of the player list, and offset the player list a bit to the right to allow that.
- Long names in the player list are handled through a combination of reduced spacing (but not reduced too far) and extended list width (but not extended too far), which should handle all but the longest possible names without sacrificing legibility.
- Hosts now see teal player numbers for clients running the other JJ2 version (i.e. 1.23 clients in 1.24 servers or 1.24 clients in 1.23 servers). If such a client is also not running JJ2+, their `-` symbol is teal instead of red, to clash less.
- Hosts now see a red `@` behind a brown or teal `+` for players running a different version of JJ2+, instead of a red `?`.
- The `-` for non-plus players now appears even when those players are still connecting.
- Spectators have a dark `-` drawn in place of their stats columns, iff the player list is sorted only by player number (so spectators are't sorted down to the bottom of the list).
- Updated the shading on the Jazz and Spaz sprites in the ingame Help displays.
- The hash (`#`) character is no longer hidden when typed as the first character while chatting. (Local fix.)
- Adjusted the kerning of the following characters in the smallest font size: `! " + , . 1 5 7`
- Fixed glitch of emoji not appearing while typing chat after you pressed left to move the cursor leftwards.

### Jan 10 2026: Player List 2 (6.6a)

- Clients, not just hosts, now see a red `-` in the server player list for non-plus players.
- Note that this information is only reliable for clients when the server is running plus: if you are a plus client in a non-plus server, then the server host is the only other player whose plus status you can know for sure.
- The red `-`, like the red `?` for clients running a different plus version, is drawn to the left of the player numbers (but to the right of IP addresses). This would overlap with wide gamemode icons, but wide icons are only ever drawn in response to AngelScript, which is only run in plus-only servers, so a non-plus player will never have a wide icon.

### Jan 06 2026: Player List (6.6)

- In servers, revamped the player list layout to bring gamemode icons (e.g. gold flags for flagholders) much closer to the player names, so you can see at a glance which players are important:
- The `A` and `M` letters for admin/muted players have been moved to the right of player scores (where less time-sensitive information goes) and replaced with custom images (cog, disabled speaker).
- The entire player list has been slightly offset to the left to account for this.
- Admin cogs are only shown after pressing `F9` twice.
- By default, all gamemode icons are now drawn between the player number and the player name (though this column is omitted in gamemodes without any icons). Disabling the new "Icons Left of Names" option (`/iconsleftofnames` command, `[General]IconsLeftOfNames` ini setting) moves icons to the right side instead, like how 6.3 and earlier drew them in CTF/DCTF/FR, and a new wide AngelScript option forces the 6.4 visuals for icons that need the room.
- Long names are drawn with reduced spacing so that names/icons are less likely to overlap with scores.
- `+` symbols are not displayed next to player names anymore. The only remaining such symbols are `-` for non-plus players and `?` for players with a different plus version, both red and only displayed if you are the server.
- Pings and client IPs are drawn with slightly reduced spacing.
- Player numbers are narrower when players 10-32 are not present.
- Spectators are no longer drawn with eye icons (or scores).
- Fixed name-related glitches from joining servers running 6.3 or earlier.
- Reverted jjPLAYER::name to its behavior from 6.3 in gamemodes that don't support colored names.

### Nov 25 2025: Overtime (6.5)

- New blue-colored 'OT' entry behind the double F9 dashboard to display whether overtime is currently enabled in the current 6.5 server.
- Serverside changes to overtime in Battle, Team Battle, Pestilence and Roast Tag:
- Overtime now behaves similar to CTF and other CTF-like game modes, as in by having the game end automatically when a certain score is reached once overtime has begun.
- Previously when overtime would kick in while playing in these game modes, the game would continue until the maximum score is reached or the timer would run out, giving players more room for interpretation on when such a game should end and a potential victor should be announced.
- From this point on, when overtime kicks in for these game modes, the game will calculate a new score cap at the beginning of the overtime, based on the current highest ranked player/team score by adding a value of 2 on top of it (but never exceeding the current maximum score). For example if there are 2 players that are currently tied at 12 points in classic battle, the game will announce: "First player to reach 14 points WINS!". Once ANY player reaches 14 points, the game ends automatically and that player is declared the winner, no matter how far from the top ranks they were when overtime began, meaning that even a player with 0 points at the start of overtime can still theoretically win the game.
- When the game is in overtime, the overtime score cap is displayed in the place of the normal maximum score in the HUD, colored in blue (except for Team Battle where all team scores are colored anyway). (Only for 6.5 clients in 6.5 servers.)
- Chatting with pipes when joining servers running 6.0 or earlier no longer shows backslash-number pairs before the flashing underline.
- Hid backslash-number pairs in the ingame Help displays when joining servers running 6.0 or earlier.
- Fixed crash from cycling while the ingame Help display was visible.
- Fixed Pestilence glitch where the server host wouldn't see a brain icon next to the first zombie (though all clients would).
- Removed the word "flag" from the overtime announcement in Head Hunters.
- The Christmas Chronicles menu theme will now appear only in December, not in January or February.

### Nov 18 2025: Gamemode Help (6.4)

- Servers now use specialized symbols to indicate when players are flag carriers, jailed, eliminated, winners, zombies, or spectators, replacing the old asterisks and ‘S’ symbols.
- The `Esc` menu box has a new "Help" option, which displays instructions for the current gamemode and sometimes level, to help players who aren't familiar with all sixteen multiplayer gamemodes. Level scripts and mutators may extend this display to explain custom gamemodes and so on.
- Fixed glitch of players who begin spectating while zombies in Pestilence maintaining their green names after unspectating.
- Fixed incorrect behavior of the `/rename` command on eliminated players in TLRS.
- Fixed glitchy behavior from 6.0 in `jjPIXELMAP::save` (and `jjCOLORMAP::save`) when used on tiles that shared their image with other tiles.
- New AngelScript sprite mode `SPRITE::INVERSE`.

### Sep 02 2025: Player Bullets (6.3)

- Seekers seek other players in Race games.
- Added some control keys to the Race HUD (left, right, `F10`) and fixed some text positioning.
- Added three new remote admin settings (and corresponding plus.ini configuration settings and Game -> Game Options settings) which determine how players move in response to (enemy) bullets in most competitive gamemodes: `/bulletpush` ([Server]BulletPush, enabled by default), `/injuryknockback` ([Add-On]InjuryKnockback, disabled by default), and `/blastknockback` ([Add-On]BlastKnockback, enabled by default). Though related, these all control separate interactions, so please read carefully:
- When "Bullet Push" is enabled, client game instances locally detect collisions between enemy bullets and local players, and resolve them by pushing those players out of the way, as per the game's original behavior. This can lead to a negative phenomenon where moving out of the way of the bullet results in not taking damage from the bullet. When the setting is disabled, clients only react to bullets when the server detects a collision, i.e. when that collision causes damage to the player.
- When "Injury Knockback" is disabled, players damaged by a bullet will only experience minimal knockback, similar to touching spikes, single player enemies, or being damaged by a melee move. When enabled, they will instead bounce high in the air, proportionately to the bullet's "force" value (i.e. how much damage it deals in single player), same as when damaged by a bullet in vanilla JJ2 when playing as the server or in local splitscreen. This setting only affects clients when Bullet Push is disabled, since otherwise knockback can be overriden by a push, which means network conditions determine whether knockback happens or not, as per the game's original behavior.
- When "Blast Knockback" is enabled, the blasts from certain weapons (particularly seekers, RFs, and TNT) cause additional knockback to nearby players, independent from the above two settings. When disabled, players receive knockback from only their own weapons' blasts (necessary for RF climbing, TNT jumping, and so on).
- Players now receive knockback from their own TNT in team-based gamemodes, just as they could in free-for-all gamemodes.
- (Having these three separate, very specialized options for the same few interactions may not be ideal game design. We hope the community will arrive at a consensus for how to design this more consistently.)
- Fixed glitch from 5.12c of the skidding animations never appearing.
- Restored "sliding" (crouching immediately after running) to how it worked in 5.2 and earlier, skipping immediately to the final frame of the crouch animation.
- Disabled some of the effects of "The redundant 'PlayerName captured the flag' alert is no longer shown when flags are passed or stolen" from version 6.1a. This was found to interact badly with players capturing flags immediately after the flagholders of those same flags were roasted.
- (This change is intended as only a temporary measure while we try to figure out how to hide the message in the pass/steal case but still show it in the roast-capture case.)
- Fixed glitch where 24-bit tiles with opaque color 0,0,0 were drawn incorrectly when MMX Capabilities were enabled.

### Jul 08 2025: Race (6.2)

- Non-local Race games do not end until all players finish all laps, rather than when only one player finishes. Players are ranked (in the player list and the Playlog) in the order they finished, with the first player being considered the winner. Players who have finished have their names colored orange.
- The second column of the player list now shows total racing time, rather than best lap time, and only appears for players who have finished.
- Redesigned the Race HUD again, this time to emphasize what place you're in.
- New optional system for defining the track contours in Race levels. In levels using this, a minimap will show on screen showing the positions of all players relative to the main track and arrows will attempt to tell you which direction to go next. All six official race levels (including the Diamondus one from OEM versions of JJ2) have been edited (and named plusRace#.j2l) to demonstrate this.
- The anti-radar mode (`/antiradar`) is disabled in Race servers.
- The `/nomovement` and `/autostart` commands are no longer forced by Race servers (although `/nomovement on` is still recommended for pauses). Instead, Race servers now have a mandatory 30-second pregame so players can preview the track before they begin. If there is a minimap, the pregame will automatically move the camera through the course; otherwise, you can control the standard free camera with your mouse.
- Added announcements for players finishing the race and setting new lap records. Locally, when you finish a lap (after the first) you see how you did compared to your previous best lap time.
- Removed the lap time list for spectated players because it was showing inaccurate numbers.
- Fixed glitch of the AngelScript jjPLAYER::hurt method being able to kill players in Race. (The same issue was fixed for non-angelscript damage sources in 5.6.)
- Dying from delivering a red flag in single player now shows the text "you killed yourself" instead of "loser."
- Idle servers with multiple local players now use free cameras.

### Jul 01 2025: Grabbag (6.1a)

- New `/streaming` option (and "Streaming" item in the Plus dropdown menu). When streaming is enabled, IP addresses, passwords, and admin-chat are hidden, and the game tries to avoid copyrighted music.
- `/passing` is now much simpler: injured players now automatically pass flags (in CTF, DCTF, and FR) or gems (in Head) to nearby teammates with full health. Players no longer need to look up, get shot at, or turn `/friendlyfire` on. Server-side change.
- The redundant "PlayerName captured the flag" alert is no longer shown when flags are passed or stolen.
- Assorted fixes to backslash-number pairs such as `\9`. They are now drawn as symbols in servers running 6.0 or earlier (because the servers do not understand them), are hidden in spectator names in servers running 6.1 or above, and otherwise work to recolor text. Their colors in menus are now more closely matched to their ingame colors.
- If Spaz moves before a UFO passes over him, he will not fire a bullet and the UFO will not be shot down.

### Jun 24 2025: Purple :gem: (6.1)

- Chat, names, and other text can now use the character sequence `\9` to color text purple. (The standard colors are also available using `\1`, `\2`, etc.)
- Chat now supports emoji. A new "plusEmoji.mut" mutator is included with JJ2+, but you are encouraged to edit it for your own server to draw and name your own emoji of choice.

### Jun 17 2025: Spectators (6.0b)

- Added new hide spectators option which shortens the player list by hiding the names of spectators during ongoing games. This option can be configured via the `/hidespectators <on|off>` command, the dropdown menu strip option "Hide Spectators", or via the plus.ini "`[General]HideSpectatorsDuringOngoingGame`" option. This feature applies in the following conditions:
- Hide spectators option is enabled
- Game is started
- Game info HUD is set to the 2nd option (F9 is pressed only once)
- `Tab` key is not pressed (this means `Tab` can peek at the full player list)
- Fixed(?) glitch from 5.12b of the death screen sometimes never going away, such as when unspectating.
- Fixed glitch from 5.5 of online clients failing to cycle to the next level when joined during end of level screen, causing them to stay in the current level.
- Fixed glitch from 6.0 of the continue screen crashing if you chose Yes.
- Fixed `jjLAYER(const jjLAYER &in)` reading unrelated memory.
- Fixed `jjLAYER(uint, uint)` sometimes never being deleted from memory.

### May 29, 2025: Hotfix (6.0a)

- Fixed oversights from 6.0:
- Certain images caused crashes in `jjPIXELMAP::save(jjANIMFRAME@)`.
- The portrait for the Shareware Levels episode (and some custom episodes) displayed incorrectly.
- Loading `jjPIXELMAP` from improper PNG filenames wasn't displaying error messages anymore.

### May 27, 2025: 32-bit Graphics (6.0)

- Added support for `j2t` and `j2a` files with 32-bit images.
- See plus32BitGraphics.j2l/,j2as
- AngelScript support: jjCOLORMAP, jjTilesFromTileset32, jjPALCOLOR::alpha, jjPALCOLOR::component, jjANIMFRAME::is32Bit, jjTileIs32Bit.
- Reduced memory footprint of AngelScript function `jjTilesFromTileset` when importing only a subset of a tileset's tiles.
- Fixed incorrect behavior when calling `jjPIXELMAP::save(# | TILE::VFLIPPED | TILE::HFLIPPED, true)`, where `#` was any number from `1` to `TILE::RAWRANGE`.
- Improved particle pixel explosions' handling of vertically flipped sprites.
- Vertically flipped frames in animated tiles no longer crash JJ2, though they still don't draw correctly.

### May 20, 2025: Based on your feedback (5.12c)

- Added "[Logging]Theme" line to plus.ini, which sets the color for the chatlogger window. By default in Windows 10 and 11, it uses your Personalization > Colors > Default App Mode setting to pick light/dark mode. You can also write "Light" or "Dark" in plus.ini to force that color scheme, especially in older Windows versions.
- The game now launches in front of the chatlogger instead of behind it.
- Removed the "About" menu from the chatlogger.
- Fixed glitch from 5.12 of monitors (powerups, shields, morphs) falling through solid tiles in servers.
- Improved 5.12's code for players sticking to the floor when going down slopes. It no longer breaks in any known levels (but can still be disabled using jjPlayersStickToSlopes).
- Fixed glitch of not being able to type in menus or chat if you started the game in fullscreen.
- Autoupdating in fullscreen will now relaunch the game in fullscreen. (When you update 5.12c to the next release.)
- Autoupdating now works for users with multiple JJ2 folders. (This is fixed in plus.dll, not in plus_install.exe, so if this applies to you, you will need to manually run plus_install.exe again for each folder.)
- Corrected plus.ini's setting names from "[General]LimitFPS" (incorrect) to "[General]MaxFPS" (actually used by JJ2+).

### May 13, 2025: Automatic Update! (5.12b)

- New /maxfps local command.
- Weakened 5.0's powered-up toaster buff in local games. Now only every other bullet does 2 damage to enemies and bosses, so on average, powered-up toaster will do 1.5 times as much damage as regular toaster.
- TNT now only sends pickups and bullets flying, not enemies and bosses. (It still does damage, though.)
- TNT now causes shootable poles to fall in the correct direction.
- AngelScript jjOBJ::isBlastable now also controls whether pickups can be shot down by bullets, to make it easier for level designers to disable that interaction for (some or all) pickups without writing complicated custom behaviors.
- Shields are no longer drawn at reduced height while using special moves such as Jazz's uppercut.
- Fixed client-only glitch of hanging from an invisible Copter after pressing jump almost immediately after grabbing the Copter.
- Fixed glitchy movement from grabbing a Cheshire2 while holding down jump to use helicopter ears.
- Fixed glitch from 5.7 of being able to buttstomp inside sucker tubes with the "WaitTime" parameter.
- Fixed glitch from 4.2 making it harder to use V-Pole events on partially masked tiles.
- Death screens, the end-of-level iris fade, and lighting changes from (Re)Set Light events are now linked to ingame time, not framerate. They look more like they did in 1998 instead of going too fast on modern computers.
- Refactored how the AngelScript API is registered internally to improve plus.dll compilation speed. This should have zero effect on gameplay.

### May 06, 2025: Autoupdater (5.12a)

- Added an autoupdater to JJ2+. Whenever a new version is released, the game's splash screen will be replaced by a new menu. Picking "Update" (except on Windows XP) will automatically download an updated installer and run it.
- plus_install.exe and plusifier.exe now work on Windows XP.
- plus_install.exe now has more useful error messages for invalid Jazz2.exe versions.

### Aug 2023: Minus (5.12)

- You now stick to the floor when going down slopes instead of running off into the air. The old behavior can be restored for specific levels with the new AngelScript jjPlayersStickToSlopes property.
- Running up a slope into a wall no longer gets you stuck in a running position, unless the wall is designed to be a "turret" you can shoot high-speed bullets through, in which case the old behavior is maintained.
- Joining clients only start at the most recently activated checkpoint if in a Cooperative server running 5.10 or above.
- The initial fire rate is now somewhat faster on Turbo, to make it less unfun. It still takes the same number of fastfire pickups to reach the maximum rate, though.
- Phased out the "custom mode" term in favor of calling everything simply a "game mode". Only clients running vanilla JJ2 will still be told the custom mode upon joining a server; everyone else can press F9, look at the chatlog, or infer it from the HUD.
- The `/gamemode` command now supports all game modes, not just the vanilla ones.
- Removed the `/off` command.
- `Tab` autocomplete for chat commands is no longer case-sensitive.
- Automatically switching to a missile-like weapon (seekers, RFs, TNT) by firing the last bullet of a non-missile-like weapon no longer instantly fires a bullet of the missile-like weapon.
- Fixed glitch from 5.0 making crates and barrels open less frequently from landing on animated tiles.
- Fixed glitch from 4.2 of pepper spray initially firing upwards instead of straight ahead.
- When automatically picking which team to join upon joining a server, if multiple teams are tied for being the smallest, the one with the lower score will now be preferred. If there's still a tie, the team will be assigned at random.
- Keyboard controls are now available for all major functions in the `F10` debug mode.
- If a player presses both Fire and Select at the same time, Fire is now processed first, to make it easier for scripts to respond to specific selected weapons.
- Upgrades to the network code in online- and LAN-hosted games:
- Based on the feedback received from the public testing period of the packet exchange interval configurability, the interval of exchanging movement packets between an online/LAN server and its clients is now minimized to happen once on every game tick. Since game ticks are run 70 times per second in JJ2, the interval between each tick is roughly 14 milliseconds.
- This means that online games are significantly smoother in responsivity, compared to the previous dynamic interval based on the number of active players in a server (48-144 ms). On the other side of the coin, there is naturally a significant increase in the network traffic between a server and its clients, considering that most of modern internet connections should be able to handle this.
- The previous dynamic packet exchange interval functionality (as mentioned above) has been removed for now.
- Clients running Plus version 5.11 or lower are affected by the increased amount of movement packets sent from the server, but their own packet sending interval towards the server will still be based on the same dynamic interval as mentioned above, since there are no control mechanisms over clients running older versions. Also vice versa, clients running version 5.12 or higher will send movement packets at an increased rate to the server, but the server's sending interval will behave as previously if it is running Plus version 5.11 or lower.
- While the default packet exchange interval between a server and its clients is from now on 1 game tick (14ms), there is also the possibility to tweak the interval rates of your server if necessary via plus.ini for now. It is recommended to NOT touch these configuration options unless you know what you are doing.
- To configure the interval of packets sent from your server to its clients, use key "[Server]PXIServerInTicks". Accepted values are between 0 and 5.
- To configure the interval of packets sent from your server's clients towards your server, use key "[Server]PXIClientInTicks". Accepted values are between 0 and 5. Note that this only affects clients who are running Plus version 5.12 or higher.
- In the configuration options 0 is practically the same as 1, since movement packets won't be sent more often than once on each game tick. However, a value of 0 ensures that movement packets are always sent on each game tick, since with a value of 1, there may be some corner cases where the game may think that the interval of 14,2857... milliseconds has not yet passed since the previous game tick, due to for example clock synchronization issues, etc.
- The packet exchange intervals are rendered to the HUD in milliseconds when `F9` is pressed twice. The text shows as "PXI S: (ms) C: (ms)", where S stands for Server sending interval and C for client sending interval. NOTE: If the server runs Plus version 5.11 or lower, the server sending interval will be rendered as N/A in clients running version 5.12 or higher.
- This configurability part might or might not be removed in a future update, in case it is found to be redundant.
- The 8-bit hue cycling from smoke rings in single player no longer breaks custom level palettes applied in AngelScript.
- Switching from 8-bit to 16-bit during smoke ring hue cycling no longer gets the game stuck in the hue cycled palette.

### Feb 2023: Hotfix (5.11)

- Fixed oversights from 5.10:
- Fixed glitch of clients and servers sometimes running different versions of the same level (server-side fix).
- Restored user ability to run multiple concurrent instances of JJ2+.
- Fixed some issues with corrupted savegames.
- Fixed interaction between `SPRITE::CHROMAKEY` and `SURFACE::INNERLAYER` for layers that use both.
- Bubba's new death sequence is now also used when he is defeated by a physical attack.
- Fixed crashes from loading levels or tilesets with names exactly 32 characters long.
- Uterus spike balls (event 27) no longer spawn from generators if the event to their left is Pulse Light.
- jjSampleLoad can now load .ogg files.
- Fixed Auto Volume Leveling sometimes not working after using jjMusicLoad.
- Killing a frozen enemy by shooting it while overlapping it no longer hurts you.
- Lori's animations for being stood on by another player in Cooperative are now positioned correctly.
- New event parameter for H-Pole/V-Pole events.
- Fixed glitch of getting stuck inside a slope with the One Way event when going up the slope using Spaz's kick.
- Fixed glitchy interaction from 5.3 between horizontal vines and rundashes/horizontal springs.
- Fixed negative effects of trying to use level palettes with non-black transparency.
- Fixed inconsistent parsing of the `-player` command line argument between 1.23 and 1.24.

### Dec 2022: Cooperative (5.10)

- Most of Lori's menu sprites are now reshaded by Bot-chan to better match Jazz and Spaz's art style.
- Both plus.j2a and plus.j2d have been updated; if you're using plus.zip as your distribution option, make sure to re-extract those files in addition to plus.dll.
- The Game Server Setup menu now supports hosting Cooperative and Race servers. For Cooperative, you select difficulty instead of max score.
- Raised the menu's maximum max score from 100 to 255.
- 5.10 servers tell 5.10 clients upon joining and cycling what the game's difficulty is, so that the clients can load Easy-only/Hard-only events as appropriate, and so on. The new `/difficulty` command can be used to update this over the course of a server.
- 5.10 clients joining older servers will assume a Medium difficulty at the start of each level.
- In 5.10 Cooperative servers, enemies and bosses now have their movements synced for all 5.10 players. This applies only to enemies and bosses whose behavior functions have not been replaced by any AngelScript modules, since those might need more complicated syncing mechanisms.
- Improved directional support for some controller models.
- Added command line argument `-joyinfo` to display what values JJ2 thinks are being sent from any attached joysticks/controllers. Useful only if you are experiencing trouble with your devices and want to submit a bug report.
- Controllers can now skip the intro logos and the credits.
- New debug mode when you press F10 (only in single player). Use player 1's directional controls and mouse to move the player to another part of the level without interacting with objects, then left-click to place the player somewhere new and resume normal gameplay. Press F10 again (or Esc) to exit debug mode without moving the player. Other controls (listed on-screen) can be used to place and delete objects too.
- When you press a number key to change weapon when there's only one local player, the "COMMON_HORN1" sound will now only play if you don't have any ammo of the weapon you want to change to. For other options, you can modify the new plus.ini "[General]HornFrequency" configuration setting: accepted values are 3 (always), 2 (only if a weapon other than blaster), 1 (only if you don't have any ammo of the weapon), and 0 (never). Values other than those four are undefined.
- Three new texture effects for use in levels: "Wave" (4), "Cylinder" (5), and "Reflection" (6), not all of which are expected solely for use in layer 8. The AngelScript texture interface has been extended to take that into account. Read about them in the JCS.ini section, and check out the new plusLayers .j2l/.j2as example level.
- Textured layers now mostly support alternate sprite modes and have options for being drawn to only certain areas of a screen, which allows multiple texture effects to be present on screen at a time.
- Fixed all known issues with running JJ2 in long folder paths.
- JJ2 no longer crashes when trying to load levels or tilesets that don't exist or are corrupted. Servers will refuse to cycle to them, and local games will return to the main menu system.
- Added configuration setting "CycleOutsideLevelList" (defaults to true) in the admin configuration file, determining whether members of a remote admin group can use the `/c` and `/n` commands to cycle to any level at all, except for those levels listed in the new "BlockedLevels" sections. If false, the old behavior is retained of being restricted to cycling only to levels on the current level list.
- The above two bullet points are together intended to obsolesce the popular "sec.mut" mutator and its `!c` command, by adding all its functionality into JJ2+.
- The level list readme section has been restored from the pre-4.0 readme and significantly expanded, and includes the following new features.
- The `/levellist shuffle` and `/llautoshuffle` commands no longer permanently edit your levellist ini file.
- All gamemodes have their own level lists now. However, if Level List Cycling is enabled but the current gamemode's level list is empty, JJ2+ will try to substitute a different gamemode's list if that wouldn't break anything: for instance, a Domination server with an empty [Domination] list will try to use levels from the [CTF] list instead (because Domination treats flag bases as control points).
- New `/levellist <name>` command (and `-levellist=<name>` command line option) lets you use lists with any names at all, rather than only the one named after the current gamemode. Manually chosen lists don't go away when the gamemode changes either.
- Level lists can add any number of chat commands to be run at the start of each level in the list.
- Servers hosting the final level of an episode (i.e. a level whose next level setting begins with "end") will now replace that setting with the first level of the next episode, when available, or else default to either Dungeon Dilemma (castle1.j2l) or Rabbit in Training (trainer.j2l) depending on the server difficulty.
- Servers hosting either Rabbit in Training (trainer.j2l) or Return to Birdland (labrat3.j2l) will now cycle to their proper next levels instead of repeating the same level forever.
- Secret levels such as Gargoyle's Lair are no longer disabled in servers. The secret level's next level setting will be changed to the level that normally follows the level containing the secret level's entrance, e.g. Gargoyle's Lair will cycle to Hare Scare, the level that normally follows Medieval Kineval, as if the `/n` command had been used once the secret level loaded.
- In Cooperative games, any player collecting a coin will now result in every player collecting that coin, even clients who are spectating or who haven't joined yet. This should allow all players to beat levels where progress is locked behind mandatory coin warps. Client-side change.
- In Cooperative games, dying no longer resets your coins, because (unlike in single player) dying does not cause them to respawn.
- In local SP/Coop games with more than one player, any players who run out of lives will now be revived (with no points or ammo) at the start of the next level, without being stuck seeing GAME OVER forever. If all players run out of lives in the same level, the Continue? screen will appear.
- In SP/Coop servers, the lives system has been removed entirely. You can die any number of times and you will not get a game over or suffer any other consequence. 1up pickups are replaced with carrots if the server is running 5.10 or above.
- Players who die in Cooperative games now respawn at the most recently activated checkpoint. (A checkpoint is considered activated when it shows its springing-out-of-the-box animation.)
- 5.10 servers tell 5.10 clients upon joining which checkpoint was activated most recently (by any player), so that clients in SP/Coop games can start at that location instead of at the level's start position.
- After a level begins, checkpoints in SP/Coop games may only be activated by local players.
- The initial fire rate is now somewhat faster on Turbo, to make it less unfun. It still takes the same number of fastfire pickups to reach the maximum rate, though.
- Changes to the esc menu box: In servers, replaced the disabled "Load Game" and "Save Game" options with common multiplayer actions "Spectate" and "Stuck." Moved "Controls" down a few rows.
- Spectating players (including idle servers, and players who ran out of lives in LRS-based gamemodes) no longer produce light, play Spaz's ledge-wobbling sound, or interact with enemies/bridges/etc. at their pre-spectating location.
- AngelScript API additions:
- New jjPLAYERDRAW class with accompanying hook function
- Three new sprite modes: CHROMAKEY, MAPPING, and TRANSLUCENTMAPPING. There are several new global functions for configuring the latter two.
- New ways to distribute custom sprites without building your own .j2a files: jjANIMATION can read and write GIF files, jjANIMSET can load from jjPIXELMAP objects formatted like sprite sheets, and jjPIXELMAP can read and write PNG files.
- jjPAL::load also now supports GIF and PNG files
- Numerous new jjPIXELMAP methods for doing basic image editing.
- All previous textured background styles now use the AngelScript properties `jjTexturedBGFadePositionX`, `jjTexturedBGFadePositionY`, and `jjTexturedBGStars` (or, preferably, their new jjLAYER property equivalents).
- New methods jjPLAYER::spring and jjTILE::setFrames.
- New optional arguments for jjANIMSET::load, jjPAL::gradient, and jjMusicLoad
- New global properties jjDifficultyNext and jjDifficultyOrig
- jjLevelFileName and other filenames are now guaranteed to be all-lowercase for easier comparison.
- Updated the AngelScript library to a WIP build of version 2.36.0, including all the changes since 2.31.2, our previous update. Among other things, this introduces `array::sort` and fixes `array::removeRange`.
- All argument names in AngelScript functions and methods are now applied internally. This means that you will be given more informative error messages if you pass a series of arguments inconsistent with any overloads of a function/method name, and also that you may reorder arguments freely. For example, `jjMaskedHLine(xPixel:10, yPixel:20, lineLength:4)` and `jjMaskedHLine(xPixel:10, lineLength:4, yPixel:20)` are both valid. You may also skip over any number of arguments with default values, e.g. `jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, layerZ: 1)`. As the AngelScript documentation notes, "No positional arguments may follow any named arguments," so `jjDrawSpriteFromCurFrame(obj.xPos, obj.yPos, obj.curFrame, layerZ: 1, 4)` does not compile: you would need to write `layerXY: 4` instead.
- Updated the exception messages (e.g. "Index out of bounds") to include line numbers and otherwise be more consistent with other AngelScript messages.
- Added new `/spectatingcamerashift` command (and corresponding plus.ini "[General]SpectatingCameraShift" configuration setting, and "Spectating Camera Shift" item in the Plus dropdown menu) for configuring whether spectating another player should shift the camera based on the spectated player's current speed (true, default, as has been the case since 5.7) or center the player exactly (false, as in 5.6 and before).
- Removed the `/maxspectators` setting due to people not intentionally using it.
- Remote admins may now use `/spectate`, `!k`, or `!swap` even when `/spectating`, `/allowsuicide`, or `/selfswap` are disabled, if their admin groups allow the `/forcespectate`, `/k`, or `/swap` commands respectively. (Hosts too for `/spectate`.)
- Fixed glitch from 5.7 of getting stuck inside walls in the usermade Battle levels "Apocalyptic End" and "Pleased with Presents."
- Fixed glitch from 5.7 of crashes or other errors in response to certain kicks in online servers, particularly remote admins kicking themselves.
- Fixed glitch from 5.0 of the particle explosions from destroying objects incorrectly drawing transparent pixels as opaque black.
- Fixed glitch from 5.0 of incessant noises in stopped servers from shields with six seconds or less remaining.
- Fixed command line argument `-nochatlogger`, which broke at some point. Added to new command line arguments section.
- Right-clicking a url in chat now copies it to clipboard.
- 5.10 clients in servers running 5.1 or below (including vanilla) use the original chat character limit instead of 5.2's expanded one.
- Restored unused progress bar graphics for downloading files.
- The HUD elements at the center top of the screen (player list, boss health bar, sugar rush time, shield time, and help string) no longer overlap each other when two or more are present. A help string will not be offset by this unless the offset from those other HUD elements is greater than that from any `@` characters at the start of the string.
- Reduced HUD text overlapping from pressing `F9` twice in Race.
- Removed some HUD elements for spectators because they weren't showing accurate numbers: shield duration, sugar rush duration, coin warp tally, SP/Coop score.
- Score particles no longer appear in SP/Coop servers for points gained by non-local players.
- Signpost objects ("End of Level signpost" and "Bonus Level signpost" in JCS) now work in servers too, not just local games.
- Fixed glitch of signpost objects restarting the current level instead of cycling to the next/secret level, when shot by players with only one remaining life.
- Restored broken code to make bonus signposts animate after being shot.
- Big Box and Big Rock objects are now solid in SP/Coop servers, to facilitate levels that require standing on them to reach high areas.
- Character-specific start position events are now chosen based on your real character, not whichever you most recently morphed into, so e.g. if you're playing Single Player as Jazz and type JJMORPH and JJNXT, you'll start in the next level at a Jazz start position, not at a Spaz start position.
- 5.10 clients in older Cooperative servers are unable to kill bosses locally, which should mean more bullets overall will hit bosses, making it more likely that the server will think the boss has died.
- Several enemies and bosses now flicker and shake slightly while unfreezing, behaviors that were often present but nonfunctional in the original code.
- Various enemies and bosses (Bat, Tuf Boss, Devil Devan) are now better at choosing targets in contexts with multiple players.
- Restored unused death animations for Bubba and Tuf Boss.
- Made Bilsy easier on Easy and Medium difficulties: the timing for dodging behind him so he doesn't throw a fireball has been made more generous, and you don't get instantly hurt if he teleports directly into you. The vanilla behavior is maintained on Hard and Turbo.
- Added alternate behavior for the Bilsy and Xmas Bilsy events that better handles arenas with uneven floors. See JCS.ini section for details.
- Fixed glitch of Uterus sometimes skipping the spike ball phase, without even waiting for Activate Boss events to be touched.
- Fixed glitch from 5.6 of Uterus taking damage when shot while frozen even before all the spike balls had been destroyed.
- Fixed glitchy handling of Uterus falling past the bottom of the level when defeated when there are no solid tiles to land on.
- Uterus spike balls (event 27) now persist instead of disappearing immediately when spawned by Generator objects or crates, and explode into pixels when destroyed instead of vanishing.
- Uterus spike balls in Cooperative servers can only be damaged by bullets and do not fall down, as measures to improve syncing.
- Fixed glitches from having multiple Bolly bosses in a level.
- Restored broken animation code for Bolly's eye.
- Bolly bosses move a little faster and have an extra spike ball on Hard and Turbo.
- Added alternate behavior for Bolly that doesn't stick to an invisible ceiling. See JCS.ini section for details.
- Fixed fallback code for levels with a "Devan (robot boss)" event but no "Robot (robot boss)" event.
- Devan now warps in already carrying a gun instead of having it appear when he starts to move, and drops it when he starts to transform.
- Fixed glitch of the stars spinning around Devan's head after he's defeated moving faster when you shoot.
- Devan and Fencer enemies now have better collision detection.
- Devil Devan and Bee enemies now use their previously unused turning animations.
- Bee and Rapier enemies use simplified attack patterns in Cooperative servers for syncing reasons.
- Restored one unused animation and two unused samples for Rapier enemies.
- Fish and Dragonfly enemies charge at you faster on Turbo.
- Restored some unused/broken code for Dog and Cat enemies, making them run slightly faster while facing a player (only in local games).
- Fat Chick enemies are now more likely to send players flying with their punches, including players who have shields.
- Fixed glitch of Demon enemies always coming to a halt facing the same direction.
- Fixed glitch from 4.2 of copters dropped by Xmas Float Lizards using the wrong animation.
- Bat enemies now go back to sleep upon returning to their place of origin, and use their previously unused idle animation while asleep.
- Fixed glitch of Witch enemies (or other enemies with 5+ health) disappearing in servers if buttstomped while frozen. (Older clients or hosts will still trigger this glitch.)
- Normal Turtle enemies are now better at hiding from bullets.
- Fixed various glitches surrounding killing Normal Turtle enemies in servers.
- Fixed the Pause key and Pause dropdown menu option to work properly in multiplayer and to work the same way as one another.
- The pause screen now shows some reminder text for how to unpause the game.
- While the game is paused, pressing `Esc` or entering local menus such as the `F1` help page now unpauses the game instead of drawing the menus at half brightness.
- The special key changes from 5.7, such as being able to press `Ctrl+F7` for 800×600, now apply even when the game is paused.
- Revised tunnel textured background math to reduce 8-bit moiré effects, make the tunnel more circular, avoid slowdowns when `F3`/`F4` are used, and prevent vertical camera position from gradually increasing spiral intensity.
- Fixed player getting stuck when warping while morphing into a bird.
- Fixed glitch of players' glowing trails getting stuck in a loop while the players were frozen.
- Rabbits with shields/flags and airboards now see the shield/flag following them as they bounce up and down.
- Flags are now drawn upside-down when carried by players who are drawn upside-down because of reverse gravity.
- Fixed glitch of frogs with airboards bouncing up and down.
- Fixed glitch of rabbits with airboards and reverse gravity seeing their puffs of smoke in the wrong position.
- Fixed graphics issues from changing `jjTexturedBGStyle` from `TEXTURE::MENU` to either `TEXTURE::WARPHORIZON` or `TEXTURE::TUNNEL` without refreshing the palette afterwards.
- Fixed memory corruption from AngelScript method `jjPIXELMAP::save(jjANIMFRAME@)` when used on sprites from the BIRD3D, CONTINUE, FACES, JAZZ3D, MENU, and SPAZ3D animation sets.
- Reinforced already-existing PLUS_REPLACEMENT animations to not occasionally go missing.
- The game will now accurately report the number of active players during idlemode, even if the local player is using splitscreen.

### May 2021 (5.9)

- In response to player feedback, reverted all changes to bullet code made in 5.8. Any further changes along these lines will be made in conversation with the community.
- Fixed internet connection issues in Windows 8 and above associated with entering full screen while in an online server, as caused by the Windows API changing since JJ2's release.
- 5.8's frozen camera for free spectating/idle servers now unfreezes upon cycling to a new level. Click the game window again to refreeze it.

### May 2021 (5.8)

- Fixed Windows-7-exclusive glitch from 5.7 of closing JJ2 causing it to freeze or get stuck in the task manager when "[Logging]Chatlog" was true in plus.ini.
- Added new `/allowwalljump` command (and corresponding plus.ini "[Server]AllowWalljump" configuration setting, and "Allow Walljump" item in the Server dropdown menu) for toggling the availability of the "walljumping" bug. This mostly defaults to true but is set to false at the start of each level in local SP/Coop games.
- Fixed bug of clients sometimes bouncing off bullets without getting hurt (client-side fix).
- Added new `/bulletbouncing` server-side command (and corresponding plus.ini "[Add-on]BulletBouncing" configuration setting, and "Bullet Bouncing" item in the Game->Game Options dropdown menu). This determines whether players should bounce high up in the air when hurt by a bullet (default, on), proportionate to how much damage the bullet does in SP, or whether players should only bounce up a little bit (off), equivalent to being hurt by a buttstomp or hurt event. Previously the higher bounces would or would not happen pretty much at random.
- If a clear preference emerges among users for turning this command on or off, this command will probably be retired in some future JJ2+ update in favor of making that setting universal.
- Improved handling of when score commands (`/maxscore`, `/bluescore`, `/redscore`, etc.) directly cause one or more players or teams to win: if `/autostop` is on, the game will stop instead of cycling, and this works in Race and Battle-based gamemodes now too, not just CTF-based gamemodes.
- When Race games end for reasons other than someone reaching the max score, such as hitting the time limit, the player or players with the most laps will now be announced the winner, same as in other gamemodes.
- TLRS games with three or four teams now end when only one team does has lives, rather than when only one team doesn't.
- Improved 5.7's fix for hearing displaced noises while a client in servers with anti-radar mode enabled.
- The file downloading screen for joining online servers now makes it clear which files are required to download and which (e.g. music) may safely be skipped by pressing `Esc`.
- Added 800×450 to the list of windowed resolutions; this is somewhat smaller than the maximum 800×600 resolution, but it is a classic widescreen 16:9 aspect ratio and may therefore appeal on aesthetic grounds.
- The list of windowed resolutions now additionally copies all resolutions (smaller than 800×600) from the list of full screen resolutions allowed by your graphics card, so for example if you tell your graphics card you want a 336×600 resolution available so you can play JJ2 in portrait mode, 336×600 will be available for both full screen and windowed.
- Spectating nobody/idle server mode now freezes the camera in the place you are currently viewing if you click JJ2 using the left or right mouse button, in case there's a particular area you want to look at for a while, particularly while JJ2 isn't your focused window. The camera is unfrozen again if you click again.
- Fixed glitch from 5.7 of the camera pointing too far down while spectating frogs.
- Made `/idleserver` a server-only command and disallowed `/forcespectate 1 on` for remote admins when the server is idle. Now only the actual host of a server may enable or disable idle server mode.
- Fixed glitch from 5.2 of the `/autosavechatlog off` command crashing the game.
- Fixed the AngelScript function `jjSendPacket`'s treatment of negative `toClientID` arguments.
- The `morphEffect` parameter of the `jjPLAYER::morph` and `jjPLAYER::morphTo` AngelScript methods now works even when morphing the player to a frog.
- Made filename comparison more precise for applying translated help strings to levels. Previously, "train.j2l" would use the strings (in whatever the player's selected language was) from training.j2l, "brat.j2l" would use the strings from labrat2.j2l, and so on.
- Fixed glitch of the robot boss's health bar not rising to the top of the screen upon defeat, unlike every other boss.
- Some speed improvements to drawing sprites and tiles.

### Aug 2020 (5.7)

- Raised JJ2's memory limit to 128MB, quadrupling the 32MB limit that had been in place since 2008. This is hoped to remove all reservations about using large music files or custom sound effects, tunnel textured backgrounds, and so forth.
- Head Hunters uses a new algorithm ("lg") for determining how many points you score for your team upon bringing gems to your base. The score numbers are more reasonable and don't grow as quickly, and you need at least two gems to score any points at all.
- The second column in the player list for Head Hunters no longer displays deaths, but rather how many points each player would score with their current gem count.
- The Head Hunters gem count display in the top left corner of your screen likewise previews how many points you would currently score, if any.
- HUD gem counts at the top of the screen are now pink in both Head Hunters and Treasure Hunt, to further distinguish them from roasts.
- The Head Hunters section in this document has been updated accordingly.
- Spectators may now see the field of view shifting of spectated players, similar to the players themselves, e.g. when the player looks up or down while on solid ground or runs left or right. The shift is not 100% accurate between the player and the spectator though, as lag and movement prediction also play a role in where the spectated player appears to be, but without major lag, the difference should be barely noticeable.
- Chat messages are now processed with a queue system to limit how often will a client's chat message be displayed by the server. The client itself does not notice the delay for its own messages.
- The previous configuration property `SpamInterval` has been removed, due to the new major change in the property's effect on game features.
- The interval between consecutive messages from the same client may now be configured either via the configuration property `SpamIntervalInMillis` or via the in-game command `/spaminterval <milliseconds>`.
- The default value for this configuration is 1000 milliseconds (1 second), while the maximum value is 10000 milliseconds (10 seconds). Setting the property to 0 will disable this feature altogether.
- If the client's queue exceeds 8 messages, the client will be kicked for spamming. Every time a message is displayed, the client's queue's size is reduced accordingly.
- If the client is logged in as a remote admin, the configuration property `Spammers` will also have an effect on whether the client can be kicked when its message queue is filled up.
- The `/whisper` command has its own identical queue. Due to the different handling of whisper messages, the client who sends the whisper messages, will notice the delay between the queued whisper messages.
- The `/spectate` command has a harsher limit for its usage. A client may use the `/spectate off` command only twice in every 5 seconds. Using it more often results into the client getting kicked for spam.
- Updates to the anti-radar mode (`/antiradar`)
- Fixed issue with toaster bullets sometimes showing up in the wrong location while anti-radar mode is enabled
- Add an extra command (`/antiradarspechealth [on|off]`) and ini directive `[Server]AntiRadarSpectateHealth` that will when enabled allow spectators to see players’ health while anti-radar mode is enabled.
- Fixed issue of players in the right half of the level hearing hurt sounds whenever players in the left half of the level are injured while anti-radar mode is enabled.
- JJNOWALL cheat code now gives you a fly carrot if you're not already flying when you turn it on, and takes that fly carrot away when you turn it off.
- JJNOWALL now works while swimming as well as while flying, and gives you a fly carrot when you emerge from the water.
- JJNOWALL now resets when the level changes.
- The episode file extension of `.j2ep` introduced in the previous revision has been replaced with `.j2pe`; the original did not accomplish its intended purpose, i.e. would still be loaded in vanilla JJ2.
- Some speed improvements to drawing layers, especially layers with sprite modes other than `SPRITE::NORMAL`.
- Fixed glitch of players with sugar rush getting kicked or banned when the server would cycle to a level without food from a level with food.
- Fixed (some?) cases where a client dying while collecting a carrot would throw that client's health out of sync, resulting in the client thinking they had the normal starting health but the server thinking that client had only one heart, leading to what is commonly known as "5hk" or "3hk" deaths.
- Fixed issues with getting stuck to floors/hooks/vines and being unable to jump while using copter ears.
- Fixes/modifications for pushable objects (boxes/barrels/monitors) in local games:
- Fixed glitch from 5.0 of players sometimes getting stuck in the floor when running uphill and colliding with a pushable object.
- Buttstomping a pushable object should always destroy it now, if it can be destroyed at all. (Previously sometimes you would destroy it and sometimes you would land on it, seemingly at random.)
- Now you can't fire while pushing an object, but you can fire while standing next to one. (Previously only some objects prevented you from firing, but not all, and even when you were standing next to them instead of pushing them.)
- Fixed some bugs with certain controller models or configurations.
- If your computer has multiple controllers, now only the first controller ("Joystick 1" in the player setup menu) can move the mouse, and even this is disabled by default. Set the new plus.ini fields "[General]Joystick1MouseXAxis" and "[General]Joystick1MouseYAxis" to numbers in the range of 0-3 if you wish to enable mouse movement from the first controller. (Different controller models use different axis numbers for the right stick, so unfortunately you will need to determine/set these numbers yourself based on your own particular controller.)
- Players may now be moved using controllers while chatting. (Moving using the keyboard remains disabled.)
- Fixed sporadic crashes from loading layers with no tiles in them using `jjLayersFromLevel`.
- Fixed Area Warp Secret event and Area End Of Level event with Secret set to 1 to a greater extent than the 2010 fix. Not only is the event you touched removed from the level's event map, so too are all neighboring copies of the same event, and their neighboring copies, and so on, like a fill tool in a graphics program. This thoroughly solves the issue of inadvertently entering the Gargoyle's Lair secret level multiple times in a row.
- Fixed glitch from 4.0 of one Sucker Tube event in the "Suburbia Commando" level from The Secret Files episode causing a softlock. This is a hardcoded fix and applies only to levels with the filename town2.j2l.
- Pressing `Ctrl+F7` now changes the resolution to 800×600, just like `Ctrl+F1`–`Ctrl+F6` for the various lower resolutions.
- Pressing `F12` to take a screenshot now works even when you are holding down `Ctrl`.
- Pressing number keys to switch weapons no longer works while recording macros.
- Pressing `1` to switch to blaster no longer works if your blaster ammo is 0 due to some script.
- Pressing `F3` to reduce screen size is now less buggy when playing with vertical splitscreen, more than two local players, or side-by-side 3D.
- Fixed positioning of Tunnel textured backgrounds when playing with black borders from F3, a level smaller than the window, and/or a limited max resolution.
- Pressing `F6` no longer opens the Save Game menu when playing a scripted level. (Saving and loading do not currently work in scripted levels, so the Save Game menu was already disabled from the esc menu box but not previously `F6`.)
- The various `F#` keys may now be used while chatting.
- Links used as the full text of the `/welcomemessage` command may now be clicked by clients, as with links in regular chat.
- More URLs are now detected and made clickable in chat/welcomemessages.
- Whenever a screenshot is successfully saved in game, an alert message will now be echoed in the chat about it, displaying the filename the screenshot was saved with.
- AngelScript API additions: jjPLAYER::poleSpin, jjPLAYER::suckerTube, onDrawGameModeHUD, jjTakeScreenshot.
- Custom sound effects (loaded by the AngelScript `jjSampleLoad` function) are no longer overwritten by loading the animsets defining the sounds that the custom sound effects nominally replace.
- Removed the `/ctfmessages` command in favor of making its effects mandatory. It is no longer possible to disable the messages "x lost the flag," "x made the score," and "x scored for the other team" (and variants).
- Removed code preventing JJ2 from loading official levels from the command line (e.g. `jazz2.exe castle1`). Previously only custom levels could be loaded from the command line without using workarounds.
- Restored an option removed from JJ2 before release to freely rescale the game window by dragging its edges without affecting the ingame resolution. This option is now available by checking the "Rescalable Window" item in the "Video" dropdown menu but currently has no equivalent setting in the ingame video options menu. Note that changing resolutions while this option is enabled may have unattractive results.
- Fixed death code to treat music consistently across all species (rabbits/birds/frogs): music will now be reset upon death only in local single player games.
- Fixed glitch of music volume being saved to jazz2.cfg as 0 if you closed the game during a music reset.
- Fixed glitch from an earlier revision of some options in some languages in the esc menu box displaying incorrectly when selected.
- Fixed issue of AngelScript functions `jjDrawSprite`, `jjDrawResizedSprite`, and `jjDrawRotatedSprite` not accepting all possible `ANIM::CUSTOM` values for their `setID` parameter.
- Fixed the math used by the `BLEND_OVERLAY` and `BLEND_HARDLIGHT` sprite modes for brighter pixels.
- Updated all 8-bit preview images for `BLEND_` sprite modes to reflect the fix to `jjPAL::findNearestColor` from 5.2.
- Fixed return values from setting AngelScript properties `jjOBJ::deactivates`, `jjOBJ::isBlastable`, and `jjOBJ::isFreezable`.
- Fixed glitch of Wind and Belt events getting players stuck against the sides of walls. (The old behavior is preserved in Quirks Mode.)
- Fixed glitch of laser shield monitors being unaffected by the `/noshields` command.
- Fixed glitch of the "WaitTime" parameter on Sucker Tube events not working right if placed in row or column 512 or greater.
- Fixed glitch of `jjSTREAM` objects being unable to read screenshot files (and other files whose filenames happen to begin with the characters "jazz2" but are not the genuinely restricted files jazz2.exe, jazz2.log, and jazz2.cfg).
- Fixed glitch of JJ2 continuing to think you were in a secret level if you returned to the main menu from a secret level and then started a new game.
- Fixed glitches associated with playing a local game, returning to the main menu, and then playing an online/TCP game. Start/max health will be set to the online/TCP game's gamemode's proper default health, rather than 5 (or 3 if the local game was at Turbo difficulty), and the capped weapon speeds from Turbo difficulty will not be carried over into games that do not use the Single Player or Cooperative gamemodes.
- Fixed glitch from 4.2 of your end-of-level animation not playing if you ended the level in front of a spring object.
- Fixed glitch of commands being allowed while cycling if triggered by clicking dropdown menu options. (Commands are forbidden during cycling due to their unpredictable or undesirable effects.)
- Added dropdown menu options for editing the level list file and the regular and remote admin configuration files, and for reloading the admin configuration file using the `/resetadmins` command.
- Restored behavior of the "jjackrabbitsaysthatneobeoiscool" cheat code in the level Neobeo's Firetruck (although all other text in the level remains broken in JJ2+).

### Feb 27, 2018 (5.6)

- You may now choose any .j2s file in your JJ2+ directory as your current language, not just the default six that ship with the game.
- The JJ2+ installer has been updated to optionally install four additional language files (Afrikaans, Arabic, Polish, and Swedish), for a total of ten.
- Polish (selectable as "Polski" in the ingame menu) has been updated from the LK Avalon release's version, with more accurate or idiomatic translations of numerous strings. It also uses a new encoding of Polish characters, because the old one used by LK Avalon was incompatible with JJ2's use of the section character for altering the spacing of strings. (The JJ2+ team cannot presently endorse using Polish characters for any purpose other than this .j2s file—read: chatting—because their encoding is nonstandard and Polish characters will therefore not appear correctly in the chatlogger.)
- The other translations were made by members of the JJ2 community. Three more language files are currently available on J2O—Finnish, Romanian, and Serbian—but unfortunately we were unable to contact their authors to obtain permission to distribute them with JJ2+. If you extract them or any other .j2s file into your JJ2+ folder (and rename Romanian so it doesn't overwrite the real Dutch.j2s) they will be picked up by the select language options menu.
- The parallaxing stars background effect of Warp Horizon is now supported in 800×600 resolution.
- Fixed glitch of stars appearing off-center when switching resolution to one with a different height and same width.
- You may now click on links written in chat (if beginning with `http://`, `https://`, `ftp://`, or `jazz2://`) in order to load those URLs, instead of copying and pasting them from the chatlogger. (This option is not available when playing in fullscreen, due to its lack of a cursor.)
- The Continue screen should no longer crash in large levels.
- Episode files with the `.j2ep` extension are now also accepted. Use this extension if you want to hide your episode file from vanilla JJ2, which crashes if given too many episodes to load.
- Improved support for DirectInput/XInput (read: XBox-style) controllers:
- Movement (both ingame and in menus) is now based on the D-pad, not just the left analog stick.
- The start button and the right and left bumpers can now be used to select items in menus and menu-like environments (e.g. the esc menu box—previously only the A/B/X/Y buttons could be used for this)
- The back/select button now works equivalently to the escape key in all environments in which controllers are polled at all.
- JJ2+ should now ignore corrupted controller data instead of seeming to constantly press the left and up keys.
- The right analog stick can now be used to move and click the mouse.
- Fixed glitch from a previous revision of not being able to rev a dash while using a controller.
- Added command line argument `-noupdate` which, if given, will make JJ2+ skip checking if an updated version is available.
- You can now optionally choose which title screen to use with the `[General]TitleScreen` ini setting, which accepts the values "1.23", "1.23+", "TSF+", "XMAS", "vanilla" and "random" (default, randomly chooses from 1.23/1.23+/TSF+/vanilla).
- During the months of December through February, to match up with when J2O's background has snow, the main menu (and logo) will be styled after the Christmas Chronicles.
- The `/corpsedelay` command no longer has an effect in local games, because corpse objects had been found to corrupt save files.
- Reverted to vanilla JJ2 behavior of showing custom fur colors in local cooperative games.
- Fixed glitch of AngelScript function `jjLayersFromLevel` sometimes improperly handling tiles that were both horizontally and vertically flipped.
- Fixed glitch from 5.2 of objects immediately deactivating in local SP/Coop games when leaving the boundaries of the level.
- Fixed a glitch where cycling from a level with too many references to the default layers in its script would sometimes crash the game.
- Fixed glitch that made JJ2 always try to list on list.jj2.plus first, rather than choosing a random available list server.
- Fixed glitch where failing to list a server was not properly detected.
- Fixed glitch of Uterus's health resetting upon being shot or touched while frozen.
- Fixed glitch of the "Beta Sprites" menu option crashing JJ2+ when toggled while not ingame (e.g. in the main menu).
- Fixed glitch where players could lose health (and ultimately die) from hurt events or enemies in Race.

### Jun 1, 2017 (5.5)

- Pressing `F9` twice while in an online multiplayer game now shows the server IP below the player list. Baud rates have also been moved to this display level and are no longer displayed after pressing `F9` once or holding `tab`.
- Servers in idle server mode will not count the server's player in the player count reported to the list server.
- The Message of the Day is now displayed under the server list, if available.
- Added `-listserver=<hostname>` commandline argument that allows you to set a preferred list server.
- JJ2+ now sends more data about live servers to the list server, such as whether `plusOnly` is enabled.
- JJ2+ now uses port 10057 to retrieve the server list, which allows it to display more info about servers that are pinging.
- Added `-mutators=<filename>[,<filename>][,...]` command line argument to define mutators to be loaded by the game in multiplayer gamemode.
- Fixed glitch of servers crashing upon receiving excessively long whisper messages.
- The `/whispering off` command now prevents whispering to the server, not just to clients.
- Fixed glitch of generators occasionally beginning to rapidly spawn their objects after a non-local player destroys a crate. This was most commonly known for making all players in the server impossible to damage with projectiles (by making the host reach the object limit and thus unable to spawn bullets).
- Fixed glitch of clients sporadically getting automatically kicked off servers for no apparent reason when using valid shields (client-side fix).
- Fixed glitch of servers potentially freezing or crashing when their scripts require or offer extra j2as files.
- Fixed glitch of clients sometimes not being able to download j2as files depending on where on the server's computer they were.
- Fixed glitch of AngelScript function `jjTilesFromTileset` sometimes preventing clients from joining online servers.
- Fixed glitch of tiles created in scripts (particularly by `jjTilesFromTileset`) potentially using the tile types (e.g. transparent, heat effect...) from previous levels instead of being reset to default.
- Fixed glitch of AngelScript properties `jjIsSnowingOutdoorsOnly`, `jjSnowingType`, and `jjSnowingIntensity` not being reset at the start of levels.
- Fixed glitch from 5.4 of memory leaks and/or flickering tile images being caused by palette changes in 16-bit color.
- Fixed AngelScript property `jjCHARACTER::helicopterDurationMax` to not be useless.
- Fixed glitch from 4.2 of "Caption" tiles not working in 1.23.
- Fixed glitch from an earlier revision of clients not acknowledging being shot by bullets while buttstomping, despite losing health.
- Fixed glitch from 5.0 of objects spawned by a Generator object with its "Initial Delay" parameter set to 1 never giving the player any points in Single Player/Cooperative.
- Fixed glitch of WEAPON::POPCORN weapons, such as default toaster, having their ammo depleted when firing shield ammo with that weapon selected (by enabling the weapon's replacedByShield in AngelScript).
- Fixed glitch of the Angelscript `jjParameterGet` and `jjParameterSet` functions failing for the bottommost row and rightmost column of the level.
- Fixed minor glitch of string drawing functions incorrectly aligning strings beginning with `"##"` for some `jjTEXTAPPEARANCE` arguments.
- Fixed some interactions between morphing into non-rabbit characters and the `/instagib`, `/corpsedelay`, and `corpsesdropammo` commands.
- Improved level cycling.
- Clients can now wait out their full countdown in end-of-game-screen without being prompted to reconnect the moment the server presses fire.
- A server in `/idleserver` mode now cycles instantly without waiting for the end-of-game-screen. Thus, a client may also cycle to the next level faster in an idle server.
- Added new "Multithreaded Lighting" item to the Video dropdown menu and corresponding plus.ini "[General]MultithreadedLighting" configuration setting (defaults true), which should make JJ2 handle ambient lighting noticeably faster except on older machines.
- Ambient lighting over 199 is now full white instead of undefined and prone to flickering.
- Camera view is now cropped in levels whose layer 4 size is smaller than the current window resolution.
- Camera boundaries are now correctly limited for all `jjPLAYER::cameraFreeze` function overloads.
- Spectating nobody/idle server mode now limits the camera to the edges of the level without snapping the camera back to the center of the level when the mouse leaves the boundaries of the window.
- Spectator mode interface was reduced to a small message in the top right corner of the screen.
- Animated tiles are now fully initialized before any script modules are loaded, which is important in case any code (particularly mask-testing code) queries them in `onLevelLoad`.
- Passing now works in Head Hunters. A player can transfer all of his/her gems to another player in the same way as passing a flag in CTF.
- Fixed glitch of servers failing to load certain settings from saved configuration when the servers' net initialization failed, e.g. due to a port being already taken.
- The number of columns of text used to display team scores now depends solely on how many scores are being displayed, not on which specific colors they are.
- It is now allowed in local games (i.e. not internet or LAN) to use AngelScript to change the fur colors of players that do not exist.
- Chatlog is now output to stdout, meaning that it can be freely redirected when running JJ2+ from command line.
- Removed the 3D Mode menu options from the Video dropdown menu on account of it currently not working properly and taking up valuable screenspace in the meantime. (3D Mode can still be accessed by command or plus.ini.)
- Updated the AngelScript library to version 2.31.2.

### Dec 7, 2016 (5.4)

- Flag base events in CTF or FR levels are now treated as Control Points in DOM. (This change applies to servers running 5.4 or above; if you are in an earlier server, they will still look like bases and you will not be able to capture them. Earlier clients in 5.4 servers will not see the control points but they will be able to capture them.)
- Added command `/gemtransfer <on|off>` and configuration setting "[Add-on]GemTransfer" (defaults to false) for transferring gems between attackers and victims immediately in Treasure Hunt and Head Hunters, rather than having gems be dropped as physical objects and then potentially be picked up by somebody other than the attacker.
- The `/autostop` command now works in Treasure Hunt and Race, although clients running 5.3 or below may not fully understand this.
- JJ2+ now properly shows the home-cooked level list for some customized home.j2e files.
- Fixed glitch of `/pgtimelimit` only accepting numbers of seconds between 1 and 10.
- Fixed glitch of clients experiencing unexpected health changes after collecting a carrot that no longer exists for the server when `/antiradar` is enabled.
- Fixed a crash from using jjZlibCompress in TSF.
- Fixed glitch of AngelScript function `jjRegexSearch` behaving as `jjRegexMatch` when the results output argument is included.
- Fixed glitch of AngelScript function `jjGetPublicInterface` failing to find running script modules from files in different directories, in particular the cache directory.
- Fixed glitch from 5.2 of parallax stars not being drawn at any resolution.
- Fixed glitch from 5.0 of memory leaks and ultimately crashes being caused by ambient sound events loading samples from animation sets without any animations.
- Fixed glitch from 5.3 of the wrong animations being used when one player stands on another in Coop.
- Fixed glitch of the coin/gem collection animation starting at the wrong position when playing with black borders from F3 and/or a limited max resolution.
- Fixed glitch of coin warps producing sounds constantly until the level finishes cycling if a local player is standing on one when the level ends.
- Fixed glitch of splash effects not being produced when a local player enters or leaves low-gravity water.
- Fixed glitch of Float Lizards only ever attacking player 1.
- Fixed glitch of Helmuts being drawn with a Lab Rat frame (or invisible) for one gametick after standing in place.
- Fixed glitch for online games where players who use fast warps (or jjPLAYER::offsetPosition) are not seen as moving instantly by other players in the server.
- Rewrote toaster bullet code to look better when fired at non-orthogonal angles in mouse aim mode.
- Fixed glitch of `jjWeapons[WEAPON::TOASTER].replacedByBubbles = false;` being insufficient to actually keep toaster bullets from turning into bubbles. Instead any bullet will turn into a bubble if it goes underwater subsequent to being fired, no matter its behavior, if and only if its `jjWEAPON::replacedByBubbles` is set accordingly.
- Powered-up toaster now stays in place upon hitting a wall instead of adjusting its vertical position to match its firer's.
- Fixed a crash triggered by the "Choose Party Game Mode" splitscreen menu in 800×600 resolution.
- Sped up code for drawing layers, particularly layers with lots of translucent tiles.
- Added new command `/resetadmins` that reloads the admin configuration file.
- Restored original behavior of the Stop Enemy event.
- Lori's Pestilence zombie colors have been improved to look less like christmas spice.
- Flags are no longer drawn in front of bases in Head Hunters, due to their inability to be captured. The bases and Evas both still get drawn.
- Cheat codes JJCOINS and JJGEMS now display the new amount of a player's coins and gems upon use, respectively.
- Fixed glitch of the Angelscript `jjParameterGet` and `jjParameterSet` functions failing when the absolute length was 32.
- Updated the AngelScript library to a WIP build of version 2.31.2. Most noticeably, this removes all the "WARN : Value is too large for data type" spam that appeared in the chatlog when `AngelscriptDebug` was enabled.
- Both plus.j2a and plus.j2d have been updated slightly, so remember to re-extract them from this zip file if this is not your first time installing JJ2+. The example level plus52Scripting.j2l/.j2as has also been (retroactively) updated to include some 5.3-related code.

### Jul 9, 2016 (5.3)

- The chatlogger no longer asks for confirmation when closed.
- Fixed glitch from 5.2 of the `/list` and `/delist` commands being broken.
- Fixed glitch from 5.2 of the `/ban` command failing to parse the ban duration parameter.
- Fixed glitch from 5.2 of the `/restartmusic` being an admin-only command that affects only the server.
- Fixed glitch of player prediction conditionally failing to correctly recognize level masking.
- Fixed glitch from 5.2 of clients sometimes not getting pushed into the air by bullets hitting them.
- Fixed a crash triggered on the game over screen in 800×600 resolution.
- Fixed glitch from a previous revision of fully opaque rows of pixels in tiles created by `jjPIXELMAP::save` not always being drawn for translucent or frozen tiles.
- Fixed glitch of the AngelScript `jjNxt` functions restarting the current level instead of cycling to the next one when not passed an explicit filename argument.
- Fixed glitch of players not getting knocked as far back upon being hurt while running left as while running right. (The old inconsistency is preserved in Quirks Mode.)
- Fixed glitch of The Secret Files episode ending with a high score list rather than cycling to the first level of Formerly a Prince.
- Reverted the change in the `/run` command behavior from the previous version. Holding the run key when Always Running is enabled no longer causes the player to walk, as this was found to conflict with team chat.
- Layers may now be configured in AngelScript to draw their tiles using sprite modes instead of only using the (far smaller) list of tile types.
- It is now possible to rev up a dash (including a golden jump) or enter the goofy standing pose while capslock and/or the `/run` command are turned on.
- Reverse gravity players are now pushed in the right direction by blasts (from e.g. RFs, TNT, and bombs).
- Deceleration is now more powerful on vines, making it possible to change direction on vines while running.
- The JJNXT/JJNEXT cheat code is no longer available for clients, since it would result in them being kicked for requesting an unauthorized file.
- Helicopter ears that are configured in AngelScript to move players upwards instead of downwards now use the proper animations.
- Lori now has her own sound effect for buttstomping.
- Lori now uses her full swinging vine and idle animations.
- Rabbit characters now use their full crouching animations (particularly noticeable with Lori).
- Rabbit character idle animations are now chosen more randomly.
- Breaking out of Spaz's bird-eating idle animation no longer makes that idle animation unavailable until your next death.
- Morphing during Spaz's bird-eating idle animation no longer freezes the bird in place until the next time you are Spaz.
- The little bird is now recolored to match your fur colors throughout its lifespan, rather than only while perched on Spaz's hand.
- Added a variety of new AngelScript features, including an interface for interaction between separate script modules jjPUBLICINTERFACE. View the dedicated readme for more details.
- Updated the AngelScript library to version 2.31.1.

### Apr 20, 2016 (5.2)

- The AngelScript API now allows for the creation of new layers (from within the script or from other .j2l files) and the drawing of layers in arbitrary orders, as well as the importation of tiles from other .j2t files. See plus52Scripting.j2l for some examples.
- Companion birds (as obtained from bird cages or the JJBIRD cheat code) now work online. (At least among players running Plus version 5.2 or higher—various degrees of degradation apply when dealing with players with older versions.) Other players will see your bird following you around until you lose it, you will not lose health if you are hurt while you still have a bird, and your bird will be able to attack other players (by shooting them or ramming into them, depending) just as if they were enemies.
- If a level is properly configured in AngelScript, red companion birds can shoot bullets of whatever their player's current weapon is instead of always shooting blaster bullets.
- The math for determining whether a blue bird is able to attack an enemy (or enemy player) has been made more generous.
- Companion birds now match their players' frozen and anti-gravity status.
- Bird cages now obey the AngelScript property jjDelayGeneratedCrateOrigins and, like crates and monitors, will hang from the ceiling if configured to have a vertically flipped direction in AS.
- Blue companion birds now use a proper attack animation instead of the normal flying one while attacking.
- Another unused animation routine for idle companion birds has been restored: instead of always dropping down to the ground, they now have a one-quarter chance of patrolling around their player in a circle.
- Players who use fast warps (or jjPLAYER::offsetPosition) will have their companion birds' positions get instantly adjusted as well.
- Fixed glitch from a previous revision of the Next Episode screen crashing the game if the JJT cheat had not been used.
- Fixed glitch from a previous revision of "TNT climbing" being made more difficult by some slight horizontal momentum.
- Fixed glitch from a previous revision of players being able to run around on top of the first row of masked tiles, outside the level's borders.
- Fixed glitch from a previous revision of boss1.j2b or boss2.j2b continuing to play after a player died after hitting an Activate Boss event in a local game.
- Fixed glitch of upside-down or invisible players continuing to be drawn upside-down or invisible by other players in online servers following their deaths.
- Fixed glitch of the `/teams default` command not immediately being reflected in clients' HUDs.
- Fixed glitch where clients who pressed Esc while downloading an optional file (named with `#pragma offer` in a script module) would be kicked for making an unauthorized file request.
- Improved code for colliding with other players while Quirks Mode and/or anti-gravity were on.
- Fixed glitch of spectators seeing players in the bottom-right corner of the level when `/antiradar` was on.
- Fixed glitch of `jjPIXELMAP::save` failing to update textured backgrounds when overwriting the images of tiles used in layer 8.
- Fixed glitch of `jjPAL::findNearestColor` returning incorrect results when no sufficiently close match is found.
- Fixed glitch from a previous revision of shields being drawn at slightly incorrect positions while fading away or while players were hanging from hook/vine events.
- Fixed glitch of pasting long strings of characters into the chat box potentially causing the colors of frozen green sprites to look messed up in 16-bit color.
- Fixed glitch of online clients with shields not losing shield time when hit by hurt events or enemies.
- Fixed server-side glitch of idle server mode not being initialized correctly when enabled on startup using the plus.ini setting.
- Fixed client-side glitch of whispering occasionally not showing names of people whispering or being whispered to.
- Fixed glitch that made it possible for newly joining clients to obtain action packets intended for clients with the same ID who had left before those packets were sent.
- Fixed glitch of servers neglecting to inform players about their actual gem count in Treasure Hunt and Head Hunters modes when those players collect gems that had already been collected for the server.
- Fixed glitch of newly joining clients in Head Hunters mode being able to locally collect, but not actually benefit from, gems left previously from death of players with the same ID. The new behavior is that the gems appear as black and aren't possible to collect.
- Fixed unexpected behavior and memory leaks caused by using AngelScript to assign delegates as object behaviors. Delegates are now properly supported by the jjBEHAVIOR class.
- AngelScript may now use special class instances as object behaviors in addition to global functions or delegates.
- Fixed AngelScript glitch of gem rings changing their `behavior` property to a nonexistent `BEHAVIOR::Behavior` value (i.e. not `BEHAVIOR::GEMRING`) upon contact with a player. They now revert to `jjObjectPresets[OBJECT::GEMRING].behavior`.
- Fixed glitches that would make objects sometimes get incorrectly deactivated in local SP/Coop games in levels more than about 1000 tiles wide or high.
- Changed behavior of jjWEAPON::allowed to fix issue of players being kicked or banned for invalid weapon use in levels with powerups but no ammo pickups.
- Users who strongly dislike the large announcements that appear in the center of the screen (e.g. upon roasting or being roasted by another player) may now set "[General]NoBigEchoes" to true (defaults false) in plus.ini. This relegates all such announcements—including cheat codes in SP—to the regular chat in the bottom left corner of the screen instead. This setting is intended only as a stopgap measure; there are plans for a more nuanced approach to configuring the large announcements, but those plans aren't done yet, so this setting was included in this release for users who really do not like having their view interfered with, and when the more nuanced approach is implemented this setting will be removed again.
- Introduced a Privileges section in the admin configuration file, which can be used by scripts to determine actions allowed to be taken by users of specific admin groups. Learn more about privileges in the Remote Admin section of this readme.
- Consequently added server-only commands `/addprivilege` and `/removeprivilege`.
- Anything that regularly does damage should now cause you to lose gems in Treasure Hunt, in particular TNT and (with `/evilice`) ice bullets.
- Disabled collisions of dead players with objects.
- Improved handling of vine events for anti-gravity players.
- Improved handling of non-normal tile types for vertically flipped tiles.
- Command autocompletion will no longer suggest server-only commands to clients or admin-only commands to clients who are not logged in.
- Fixed bugs related to AngelScript hooks onChat and onLocalChat:
- The hooks no longer client-side process any commands, in particular server commands.
- Admin chat sent by the server is now correctly processed by onLocalChat.
- Parameter of the `/me` command is now processed as a separate chat type CHAT::ME.
- Commands that accept parameters "on" and "off" will now also accept parameters "true" and "false", allowing scripts to use the default bool type conversion to string as a parameter. Experimentally, parameters "yes" and "no", as well as "y" and "n" will also be accepted, but are strongly discouraged from usage in scripts, as they are not guaranteed to remain valid.
- The `/changemusic` command (and the Music->Load Music File dropdown menu option) can now load music files from any folder listed in your Additional File Folders list, not just your main JJ2 folder and its cache subfolder.
- Corrected AngelScript function jjDrawSwingingVineSpriteFromCurFrame, which previously had the order of two of its arguments coded in the opposite order from both its documentation and its close cousin jjCANVAS::drawSwingingVineSpriteFromCurFrame. Note that this is a violation of backwards compatibility, but we suspect the fact no one reported this issue means that no one has yet used this function, so it shouldn't be a problem.
- Fixed AngelScript glitch of `jjTileSet` returning the wrong number when used to place an animated tile.
- The maximum number of characters you can type in chat has been roughly doubled: you can now type even more characters than can be seen in an 800×600 resolution. Players running older versions of JJ2+ will see as much of the line as fits in their screen, but their chatlog windows may truncate a handful of characters at the end; players running vanilla JJ2 will truncate the line to the original maximum.
- Laser shields are now drawn to match the brightness of their laser beams, in case the latter is altered via AngelScript.
- If you play a level in an online server in the SP or Coop gamemodes, JJ2+ will now try to start you at a start position specific to your character (Jazz, Spaz, or Lori). Previously SP and Coop used the same random start position rules as every other gamemode.
- TLRS no longer displays the max score in its HUD on account of that number being largely meaningless in an LRS context.
- The warning if you try to host a level with a script and/or one or more mutators without first enabling both `/plusonly` and `/latestversiononly` has been restored after going missing in 5.0. The separate warning that appeared only in levels with the Text event with its AngelScript parameter set to 1 has been removed on account of its being redundant.
- The native resolutions of the splash screen images have been increased. They now look better at 800×600 and worse at 640×480.
- Holding down the run key while `/run` is on now causes you to walk. This change has not been applied to the capslock key.
- Various internal code changes that aren't very visible from the outside but should make future development easier.
- Removed plus.exe from plus.zip for a combination of reasons: it can no longer be be used for midgame injection of plus.dll, it doesn't work on all versions of Windows, and its level listing/zipping functionality is only partially connected to the JJ2+ project. As such, it and its documentation have been removed from this zip, but it may be reuploaded to J2O (possibly under a different name) later.
- Added: plus52Scripting .j2l/.j2as for demonstrating some new AngelScript features in more detail than the general API docs allow.
- plusPixelMapEx.j2as has been minimally edited to use `jjBEHAVIORINTERFACE` instead of `jjVOIDFUNCOBJ`.
- Updated the AngelScript library to a WIP build of version 2.31.1.

### Aug 24, 2015 (5.1)

- Raised maximum resolution from 640×480 to 800×600.
- The `/maxresolution` command now works better in local games, and can be successfully used to limit the max resolution across any number of cycles until a new game (local or otherwise) begins. Barring this command, local games will assume a max resolution of 800×600 no matter your plus.ini settings.
- Fixed glitch from a previous revision of various HUD elements leaving trails in local games when F3 was used.
- Added `/antiradar` command and `AntiRadar` ini directive, which limit the amount of positional and health information sent by the server. Note that clients using split screen will still receive the full "real" data; if you are concerned about cheating players, using `/nosplitscreeners on` is advisable.
- Extended AngelScript functionality by the dictionary object add-on.
- Fixed memory leak lasting between level cycles caused by usage of AngelScript function jjGenerateSettableTileArea.
- Fixed the Download Same Music Version setting broken by the previous release (would act as if always enabled).
- Fixed glitch that caused some projectiles to become impossible to fire upwards from most vines and hooks.
- Fixed glitch of commands beginning in "/w" sent by remote admins being misinterpreted as attempts to whisper. Also made it possible to send non-whispering chat starting in '@' as long as it's not immediately followed by a digit.
- Fixed glitch preventing admins from sending chat messages beginning in '!' when Only Admins May Chat setting was in effect.
- Fixed glitch from 4.2 of shootable poles falling rightwards when shot by leftwards-moving pepper spray or electro-blaster bullets.
- Fixed glitch of the game displaying a self-swap failure message for clients who send a chat message beginning in '!' when only one team is enabled.
- Fixed glitch of shields being drawn at a wrong position for crouching anti-gravity players.
- Fixed glitch of AngelScript function jjGenerateSettableTileArea underestimating area size when its xTile argument was not a multiple of 4.
- Fixed minor visual glitch triggered by whispering between players with colored nicknames.
- Fixed glitch of players briefly losing 3 last characters of their name on making a score in team-based modes.
- Fixed glitch of clients not being notified of the final score change in team-based games if No Movement and Auto-Stop are enabled and the game ends by reaching max score.
- Fixed glitch in 5.0 of level names not being visible on the Loading screen or in the F9 info if the level was not stored in the same folder as the game executable.
- Characters '&', '~', '{', and '}' can now be used in nicknames.
- Restored behavior from 4.3 of being able to run .j2as scripts in folders not contained in the Additional File Folders list if the script is in the exact same folder as its matching .j2l.
- Resolved incompatibility with levels that use the outdated ".lev" file extension in their Next Level field, in particular Trainer.j2l.
- Fixed glitch in 5.0 of seeing incorrect animations or crashing when spectating a player who was not a rabbit at the time you joined the server.
- Spectating a non-shooting bird no longer incorrectly displays its ammo.
- Fixed glitch of bullets being mouse-fired at an incorrect angle when the window size was greater than the `/maxresolution` value.

### Apr 6, 2015 (5.0)

- Fixed all known glitches that would occasionally crash the game on level change:
- Fixed glitch where cycling to a level with music would sometimes crash the game because of data races involving Galaxy Sound System.
- Fixed glitch where cycling (or just changing palette via AngelScript) in 16-bit color mode would sometimes crash the game.
- Fixed glitch where cycling to a large level with Low Detail turned on would sometimes crash the game.
- Fixed glitch where cycling to a level with an animated tile with a non-zero random frame wait would sometimes crash the game.
- Fixed glitch of JJ2+ crashing upon opening in full screen mode.
- Added support for up to four teams in Team Battle, Team Last Rabbit Standing, and Domination.
- The `/allblue` and `/allred` commands have been removed. In their place is the `/teams {<blue|red|green|yellow|all> <on|off>|default}` command, which enables or disables specific teams. Accordingly, BlueTeam, RedTeam, GreenTeam and YellowTeam have been added under [CTF] in plus.ini.
- The other team-oriented commands -- e.g. `/bluescore`, `/swap`, `!swap` -- also now have green or yellow counterparts or arguments.
- Race mode now works much better online.
- The number of laps to be completed is set with the standard `/maxscore` command.
- Laps are synced across clients, and each player's number of completed laps will be clearly visible in the HUD. (Players using older versions of JJ2+ will not see the updated HUD but will still have their laps counted by the server.)
- Notice to level designers: as an anti-lag measure, laps may not be shorter than five seconds. If a client completes a lap in less time than that, the server will not record it, and the client and server will be temporarily out of sync.
- If Plus Only is enabled, End of Level events also function as lap-ending warps, even for clients running older versions of JJ2+, meaning that any Single Player or Treasure Hunt level can be run in Race mode instead. (However, fast warps should not be used because lag may prevent the server from noticing the warp being touched.)
- Late-joining 5.0+ clients no longer have to wait through a countdown before beginning to play.
- The "player timer" AngelScript feature is no longer incompatible with Race games.
- So does Treasure Hunt.
- Players should not be able to collect their own dropped gems immediately after being shot.
- Clients are now more likely to locally delete gems collected by other players in a server if the gems were collected shortly after being dropped.
- If a player drops some gems and those gems fall to the bottom of the level in a pit level, the gems will be given to the player who caused the player to drop the gems.
- The top-left-corner HUD for Treasure Hunt uses a larger font than it used to, and also shows how many gems are between you and the first (or second) place player.
- Players dropping gems will see how many gems they lost displayed in red at the bottom of their screen.
- At the end of a game of Treasure Hunt, the winning player will be listed at the top of the ranked F9 list even if they don't have the most gems.
- In Treasure Hunt and Race both, bullets shot by blinking players will not be able to hurt other players. (This behavior already existed in Battle and CTF.)
- Added Head Hunters custom mode (uses `/head`).
- The new `/mutators` command family may be used in servers with Plus Only and Latest Version Only on to enable or disable mutators, specialized AngelScript files that may be run in any level at all. Mutators are new to this version of JJ2+ and are named for the Unreal series staple.
- Several example mutators have been included with your JJ2+ download; to try them out, host a server, then select `Server->Mutators->Enable New...` from the dropdown menu. Enable one or more mutators, then cycle with the `/r` or `/c` commands to start them runnning. Enjoy!
- You may also define a list of mutators you want to enable every time you host a server by writing a comma-separated list of filenames in `[Add-on]Mutators` in your plus.ini file, e.g. `Mutators="forceNormalPalette, allshields"`
- Players in online servers may now send private messages to each other using the `/whisper`, `/w`, or `@` commands. The host or admins may disable this feature by typing `/whispering off`.
- The behavior of the `/nomovement` server setting when games are stopped has been made significantly more powerful: practically the entire game, save for chatting and certain menu functions, will be paused completely. In particular, bullets will remain in place, players in midair will not fall, and generating objects (e.g. carrots and powerups) will not regenerate. This should make stopping the game a less effective cheating strategy in duels.
- 5.0 clients in servers running earlier versions of JJ2+ will fall back to the old no movement behavior for the sake of compatibility. Earlier clients in 5.0 servers will still use the old behavior too, but nothing will regenerate for them, and if they fall too far (or otherwise move too great a distance) while the game is stopped their position will be reset when the game begins again.
- Many multiplayer announcements are now sent as special larger text that displays briefly in the center of the screen instead of taking up room in the chat display in the bottom left. These announcements are still recorded in the logger as before.
- The Playlog now records several new variables and delivers more specific results for the different team-based custom gamemodes.
- The chatlogger is now much better at handling large numbers of incoming chat lines.
- Many missing symbols have been added to JJ2's ingame fonts, including tildes, ampersands, and curly braces in the smallest font (used by chatting).
- The colon and semicolon in the smallest font have had their kerning adjusted so that smiley faces look better.
- The end-of-level animation has been replaced for all non-SP/Coop modes with a rostrum screen that shows the top three players (or else the top players from each team).
- JJ2 now supports a hugely increased number of sprites, animations, and objects, and so will no longer crash if too many different enemies/bosses/etc. are placed in the same level.
- The new AngelScript `jjSTREAM` class may be used to send arbitrary data between clients and the server, as well as to read and write to files on the local harddrive.
- AngelScript now allows the loading of custom sounds and graphics from .wav and .j2a files, as well as the editing of sprites, tiles, masks, and textured backgrounds directly within the script.
- AngelScript's sprite-drawing abilities have been greatly expanded: any sprite may be drawn at any angle or scale, flipped horizontally or vertically or both, using any of the existing sprite modes or several new ones (including some access to the alpha channel).
- Modified the Home Cooked Levels list:
- Removed the limit of 256 levels on the list. It will now show all j2l files in the directory (unless they're hidden or corrupted).
- Level data is now loaded parallelly with displaying the list. This significantly speeds up reaction of the game on choosing the Home Cooked Levels episode.
- Decreased font size so that up to 20 levels can fit on a single page of the list. The behavior of Page Up and Page Down keys was adjusted accordingly.
- Added a side menu with "Find", "Sort by", "Add to favorites", "Hide level" and "Delete level" functionalities. The first three are meant to improve users' experience when browsing the list and the last two allow interaction with level files. Notice that "Hide level" has the exact same effect as setting the "Hide level in Home Cooked Levels list" checkbox in JCS. Both "Hide level" and "Delete level" will display a prompt to confirm the requested action.
- In addition to previously existing hotkeys interpreted by the menu (Page Up, Page Down, Home, End), Delete will now have the same effect as the "Delete level" side menu option, left and right arrows can be used for switching between the list and the side menu, as can Tab, and all alphanumeric character keys (A-Z and 0-9) can be used to jump to the first level with a file name starting with that character (or chain of characters if typed in quick consequence).
- Modified the episodes list:
- Removed the limit of episodes on the list. It will now show all j2e files in the directory and not crash.
- Removed several glitches, such as the menu trapping users in an inescapable loop when the user attempts to quit the game if Home Cooked Levels episode is the first entry on the list, and crashing when no j2e files are found.
- Improved ordering of custom episodes on the list - they're now listed alphabetically by file name and always placed further on the list than official episodes.
- Extended information stored in episode file headers (as interpreted by JJ2+) by: the condition of unlocking (currently only defined for 0 meaning "always unlocked" and 1 meaning "requires the previous episode to be finished", stored as a 4-byte-long integer starting at byte 0x4), binary flags of various purpose (currently supported flags are 1 and 2 used to reset respectively player ammo and lives when the episode begins; stored as a 4-byte-long integer starting at byte 0x8), file name of the preceding episode (used mostly to determine whether the episode should be locked, stored as a 32-byte-long chain of characters starting at byte 0x4C), file name of the following episode (that is cycled to after the episode ends, stored as a 32-byte-long chain of characters starting at byte 0x6C)
- Screenshots will now be saved as .png images with the filename format `Jazz2-LEVELFILENAME-###.png`. Past screenshots will not be overwritten by new ones unless 1000 screenshots have already been taken in a single level.
- Added a menu option Plus->Beta Sprites to replace the sprites used by gems (including super gems and gem rings) and sodas with their equivalents from the OEM versions of JJ2. In particular, this makes normal gems and rect gems use different animations.
- The Snow event is significantly more random and has several new parameters for controlling snowfall or replacing the snow with other types of ambient scenery. See JCS.ini section for details.
- Seeker holes should be less frequent now. This is primarily a server-side fix; 5.0 clients in 5.0 servers should not see seeker holes, but earlier clients in 5.0 servers will, as will 5.0 clients in earlier servers.
- Fixes and additions related to frogs and birds:
- The default bird player has been recolored to match the blue and orange bird from Medivo. You may also morph into a second bird character (corresponding to `CHAR::BIRD2` in AngelScript) who can shoot two bullets at a time, using the old red and green colors, by typing repeated JJMORPH cheats or by adding a parameter to the Bird Morph event (see JCS.ini section).
- Dying as a bird turns the screen black, shows a defeated message, doesn't delete all objects in multiplayer, doesn't make you stay a bird after you come back to life, and doesn't quit to the high score list on your penultimate life.
- Nose-diving as a bird now can be done while facing up as well as down.
- Now the Up and Jump keys have the same effect while being a bird.
- While nose-diving, pressing the opposite key from the direction you are moving does not change the direction of your sprite.
- Bird players will use standing/idle animations while idling on a masked tile instead of flapping in place forever.
- If you get hurt while you have a bird companion, the bird will perform a special freakout animation routine that was coded in the original game but accidentally made inaccessible.
- If you end a level with a bird companion, it will still be with you when you begin the next level, just like in JJ1. (This doesn't fully work with secret levels yet.)
- Frogs and birds no longer lose coins continuously while sitting in front of a Warp event that has coins parameter greater than 0.
- The run key is now disabled for frogs and birds unless specifically enabled in AngelScript, fixing the old bug of being locked into running or not depending on whether the key was pressed at the time of morphing.
- If a level is properly configured in AngelScript, the frog's tongue and the blue bird's nose-dive will hurt enemies, buttstomp scenery, and other players.
- Finishing a level in SP as a bird or frog (or in certain rabbit animations, such as swinging from a pole) no longer freezes the game.
- Frogs no longer get stuck on Hook/Vine or H-Pole/V-Pole events.
- Frogs no longer float forever upwards after touching a Float Up event.
- Using a frog tongue no longer changes your currently selected weapon.
- It is now possible to use the frog tongue after collecting an airboard pickup.
- Mouse aim mode now aims the frog tongue.
- Reverse gravity gameplay has been significantly upgraded:
- Player sprites are now drawn upside-down. All sprite collision code has been rewritten to account for this possibility.
- Basic physics have been improved -- in particular, jumping into a slope from above no longer gets you stuck, and running into a wall no longer causes you to bounce backwards. No known issues remain.
- Most objects now recognize when players have reversed gravity and adjust their behaviors accordingly. The remaining holdouts (to be fixed in some subsequent JJ2+ update/s) are shootable poles, bridges, and pinball flippers, but all other objects (including swinging platforms and all varieties of boxes/barrels/monitors) should be usable without hesitation.
- By altering their `direction` property in AngelScript, boxes/barrels/monitors may be made to fall upwards instead of downwards, allowing for all-new level design possibilities.
- Copter ears may be used by simply holding down the jump key as well as by pressing it repeatedly.
- Various changes made to the cheat codes:
- Whenever you use a cheat code it will be displayed onscreen, just in case you're recording or anything like that.
- All cheat codes should now work properly with multiple local players.
- JJBIRD, if typed while you have a red bird, transforms it into a blue bird instead.
- JJBIRD can no longer give you multiple birds if you type it soon after losing one.
- JJCOLOR toggles you between the default SP fur colors and your default MP fur colors.
- JJGEMS does not give you coins and does not sometimes result in a negative gem total.
- JJGRAV reverses your gravity.
- JJMORPH allows you to morph to both kinds of bird (the shooting bird is at the end of the list, after the frog).
- JJPOWER powers up all your current weapons (but does not give you any new ammo).
- JJQ displays the Order Info screens from the shareware version that are otherwise inaccessible in registered versions of JJ2.
- JJT doubles the speed at which the entire game runs. Type it again and it cuts the speed in half. Type it a third time to restore speed to normal. Only allowed in local games, for obvious reasons, and may not work on all systems (the conditions are unknown).
- Receiving too many chat messages (or too many `jjAlert/jjPrint` calls) in too short a time no longer temporarily freezes the game window.
- The `/wc` command has been replaced with a new menu option Plus->Quirks Mode, or `/quirks`. This restores all wallclimbing behavior (including wallclimbing with other players), restores old morph box behavior (uppercutting it as Jazz gives you a diagonal uppercut; cannot morph to Lori except by shooting it), and allows you to get stuck in the floor under an H-Pole event if hurt while spinning. Quirks Mode is intended only for use in levels that require these specific behaviors, and resets to disabled whenever you start or join a new online or local game.
- In Turbo difficulty mode, pressing the fire key repeatedly does not allow you to shoot more frequently than holding the key down.
- Sugar rushes and shields no longer count down while the game is stopped.
- Sugar rushes now use a new animation routine that is visible both to you and to other players in online servers.
- Gem Rings now rotate clockwise. More interestingly, they may be configured to produce rings of any object, not just red gems. See JCS.ini section for details.
- Warp events with the ShowAnim parameter set to 1 will now display sprites for any number of coins, instead of only 10, 20, 50, or 100.
- trying to use a Warp event with ShowAnim=1 will no longer crash the game if there is no matching Warp Target event. (This fix was previously applied only to warps with ShowAnim=0.)
- All weapons now properly support mouse aim, including the bubble and laser shields.
- Bubble shield bullets are now properly synced between client and server.
- The `/strongpowerups` command now also applies to powered-up ice, not just pepper spray and electro-blaster, when `/evilice` is on. The damage done by ice is also increased when `/da` is on or when the shooter is a zombie in Pestilence.
- Powered-up pepper spray and electro-blaster now have visuals distinct from their normal forms when `/strongpowerups` is on, to make it easier to predict how much they'll hurt. (Both the client and the server must be running 5.0 or greater for this to work.)
- Powered-up electro-blaster and toaster now do additional damage to enemies and bosses, instead of being functionally identical to their non-powered-up counterparts
- Objects destroyed by powered-up electro-blaster or toaster now dissolve into blue ashes instead of orange ones. Likewise, the laser shield produces gray ashes.
- Fireball now has its own sound when shot instead of reusing Pepper Spray's sound.
- Fireball bullets now do a better job of passing through destruct scenery objects when fired at high speeds.
- Most bullets are now drawn as rotated sprites, most visible when mouse aim mode is enabled.
- The Play/Pause media key (available on some keyboards) will make JJ2 pause or resume its current music track.
- Arrows displayed in Flag Run and Domination are now transparent white if pointing to an uncaptured flag/neutral control point. Arrows in Roast Tag are green. Arrows are also better handled when you have more than one local player.
- When a CTF team scores a point, the Eva at its base jumps for joy. This code (and animation) was in the original game but inaccessible.
- The morph box animation in TSF now includes an additional yellow arrow to represent Lori.
- Lori has her own fastfire and blaster powerup animations now.
- The laser shield now has its own animation instead of reusing the lightning shield's.
- All instances of the Jazz Jackrabbit 2 logo now have a + symbol appended to them.
- After an object created by a Generator object has first been destroyed, subsequent objects created by that same Generator will not give any points and (if enemies) will not be able to drop random pickups.
- Ambient lighting of intensity greater than 100 no longer messes up while the game is paused or while the camera is near the edges of the level.
- The invincibility effect now handles bright colors much better in 16-bit color.
- Water shields now look better when drawn near the side of the screen.
- Running no longer prevents the display of idle animations or the landing-from-a-buttstomp animation. (AngelScript users who previously set `jjPLAYER::keyRun` to `true` to prevent hearing idle noises should now set `jjPLAYER::idle` to `0` instead.)
- Bird cage objects should work somewhat better online.
- Lori's Swinging Vine and wobbling-over-an-edge animations now animate better.
- Lori now has a proper set of animations at the Continue screen instead of reusing Spaz's.
- Trying to exit JJ2+ from the Continue screen will take you to the High Scores list, which is a small step up from doing nothing.
- Fixed glitches from a previous revision of layers sometimes displaying in incorrect positions, particularly if given negative speeds or when viewed by a stoned player.
- Fixed glitch where "left the game" message was displayed along with "was kicked for SPAMMING".
- Fixed glitch where non-admins could still chat even if `/shutup` was enabled.
- Fixed glitch where using the mouse wheel in the main menu crashed or froze the game.
- Fixed glitch where shields would sometimes temporarily disappear or even crash the game, particularly when landing from a buttstomp.
- Fixed glitch where ravens would sometimes stop moving forever after attacking you.
- Ravens now use their turning animation from anims.j2a, and they shake a little while frozen (this effect was in the original code but accidentally made too weak to be visible).
- Fixed glitch where Devil Devan would not give any points when defeated by a bullet.
- Fixed glitch where destroying a morph box with a special move would not create the same visual morphing effect as does destroying it with a bullet.
- Fixed glitch where certain enemies would never drop random pickups if killed by a bullet while frozen.
- Fixed glitch where certain bosses could be repeatedly buttstomped forever even after being defeated.
- Fixed glitch where Spaz could consecutively use sidekick against several bosses to kill them in a short amount of time.
- Fixed glitch where dying to an enemy object in an online server would sometimes incorrectly result in a "You got roasted by" message.
- Fixed glitch where shooting a super gem from the left side with powered-up ice would freeze it instead of breaking it.
- Fixed glitch where players could shoot while spectating.
- Fixed glitch where players might not die properly after warping to a target not immediately above a masked tile.
- Fixed glitch where certain parameters for the Ambient Sound event would crash the game.
- Fixed glitch of springs floating off toward position 0,0 if placed underneath monitors or other such objects in JCS.
- Fixed glitch of monitors (shields, powerups, etc.) sometimes ceasing to animate.
- Fixed glitch of animated tiles in textured backgrounds (or other attempts to draw undefined tiles) causing crashes.
- Fixed glitch of moving a little too fast when stepping from one swinging platform to another.
- Fixed glitch of sprite collision detection thinking every pixel was one farther left than it really was in horizontally flipped sprites.
- Fixed glitch of Player 1 not being able to use Keyboard 2 (or vice versa).
- Fixed glitch of RFs being able to hurt other players in SP (but not Coop).
- Fixed glitch from a previous revision of being able to shoot certain Trigger Scenery events on animated tiles longer than two frames.
- Fixed glitch from a previous revision of HH98/TSF enemies appearing in 1.23 multiplayer even if not set to "Multiplayer Only."
- Fixed glitch from a previous revision of blaster powerups not being drawn correctly when frozen.
- Fixed AngelScript glitch of not being able to call `jjOBJ::behave` on a `jjBEHAVIOR` variable. `jjOBJ::behave(BEHAVIOR::INACTIVE)` also now works as expected.
- Fixed AngelScript glitch of calling functions to play samples when `jjSoundEnabled` was false leading to a crash.
- Fixed AngelScript glitch of the deprecated `p/jjP` variable not being initialized quickly enough in TSF, leading to crashes in certain scripts.
- Fixed AngelScript glitch of setting `jjObjectPresets[OBJECT::FLICKERGEM].behavior` leading to a crash in levels with ammo crates hosted online.
- List server additions: `/maxplayers`, `/private`, `/public`, `/servername`, `/gamemode` and custom mode commands no longer require a relist.
- Trying to set a team score to greater or equal to `/maxscore` now ends the game instead of returning an error message.
- The ~ character in level help strings may now be used to freeze the active color after a previous # character.
- Added `-nochatlogger` command line argument that disables chatlogger.
- Added highlights that notify you when a specific word is written in chat, accordingly added Highlights entry under [Logging] in plus.ini that includes the highlight words, separated with a space.
- The new AdditionalFileFolders setting in plus.ini may be used to load levels, tilesets, music, etc. from folders other than the one with your JJ2+ executable in it, including other installations of JJ2 on your computer.
- Killed players in Instagib explode.
- Players hanging from Swinging Vine objects may be properly killed with the `/k` command.
- Online Coop and SP games behave somewhat more similarly to each other.
- Colored level names in the (down)loading screen don't mess up the drawing code anymore.
- The window title bar no longer displays the | character in levels' names.
- If a player changes their default-orange fur color to something other than orange, yellow pixels will also be recolored to match. This makes Jazz's gun look more consistent, and particularly fixes Spaz's hurt animation and Lori's frog morph animation.
- The boss health bar animation is always loaded, even if no boss events are placed in the level.
- A frame of the Fly Carrot animation has been edited to remove some junk pixels at its bottom right.
- JJ2+ will now inform you if you are not running the most recent JJ2+ release and will urge you to download the newest one. (Until 5.1 comes out, you'll just have to take our word for it on this one.)
- Increased compatibility between JJ2+ and vanilla JJ2 save games (but there's still a lot of work to be done).
- Restored *.669 music format support.
- A sample of other AngelScript changes and additions (view the AngelScript readme for more information on the changes):
- Various functions to control module music files.
- Increased control over weapons and characters.
- Looped samples (like the bee enemy's buzz) may be played properly.
- Chat messages may be received and interpreted by scripts.
- Regular expression support.
- Updated the AngelScript library to version 2.30.0.

### Oct 30, 2013 (4.3)

- Fixed glitch of JJ2+ crashing with an Access Violation when loading a level in Single Player mode, if Player 1 did not have a name specified.
- Fixed glitch of unspectating players getting kicked or banned for invalid shield use (primarily a client-side fix).
- Fixed glitch from a previous revision of certain objects behaving incorrectly for clients after being destroyed while frozen.
- Fixed glitch of laser shield blasts not destroying all Destruct Scenery blocks in their path.
- Fixed glitch of trigger crates destroyed by laser shield blasts failing to communicate that the trigger should be turned on other players in the server.
- Fixed glitch of text events displaying at whatever size was last used by `jjPLAYER::showText`.
- Fixed glitch of `jjOBJ::behave` causing an error when called without any specified parameters.
- Fixed glitch of the server's `jjAlert` messages getting sent to remote admins.
- Fixed glitch of JJ2+ crashing upon trying to draw animated tiles as AngelScript-generated particles or through `jjDrawTile`.
- Fixed glitch of players getting "nudged" following a health change.
- Fixed glitch of the game timer continuing to appear if starting a local single player game after exiting a multiplayer game with the timer visible.
- Fixed glitch of maximizing or otherwise resizing the window causing all mouse-related code to calculate positions incorrectly.
- Fixed glitch of bullets being mouse-fired at an incorrect angle when F3 was used.
- Mouse aim targets no longer display if the player is unable to fire.
- Improved remapping the controls. See Control Schemes section for details.
- The mouse wheel can now be used for switching between weapons iff there is only one local player.
- Added command `/flipmousewheel <on|off>` and configuration setting "[General]FlipMouseWheel" (defaults to false).
- Improved the spam kicker.
- Added command `/spaminterval <seconds>` and configuration setting "[Server]SpamInterval" (defaults to 60). If a message from a player is repeated after more time than `<seconds>`, it will be ignored by the spam kicker.
- Added configuration setting "Spammers" (defaults to false) in the admin configuration file, determining whether members of a remote admin group can be kicked for spam or not.
- When a player is kicked for spamming, their spam history is reset.
- `/me` messages can now trigger spam kicking.
- Added command `/allowsuicide <on|off>` and configuration setting "[Server]AllowSuicide" (defaults to false). When enabled, players may type "!k" to kill themselves.
- Modified `/login` command to censor the entered password with asterisks, in case the player trying to log in is recording their gameplay for any reason.
- Modified `/swap` command to allow for swapping all players in the server at once.
- Removed `/swapversion` command, since it hasn't been needed by JJ2+ users for a while.
- Implemented menu option "Always on Top" for letting the game window be displayed on top of other applications even when it's not the focused window.
- The incompatible version warning now appears for clients running all older Plus versions, major or minor.
- The same applies for the red circle appearing next to names of players on the Game Info screen.
- RFs and bouncers will now behave more closely to their vanilla counterparts.
- WAV files are no longer recognized by JJ2+ as valid music files.
- Servers will now send .j2as files to clients even if those files are not valid.
- Layer 4 will display infinitely if 'Tile Width' or 'Tile Height' is checked. This is solely a visual effect.
- Updated the AngelScript API doc to include newly discovered information about `jjCANVAS::drawString`.
- Updated the 1.23+ splash screen to its final edition.
- The build date in the Main Menu now also includes the build version number.

### Oct 19, 2013 (4.2)

- Both versions of JJ2+ may run all levels and tilesets created in the TSF JCS.
- 1.23+ can run any level saved in TSF JCS as well, even those saved with more than 1023 tiles counting both regular and animated tiles.
- 1.23+ users can now join any TSF+ server (but not vanilla TSF). The `/multiversion` command and plus.ini setting have accordingly been removed.
- All tiles have the same IDs in both 1.23+ and TSF+ now, so caution need no longer be exercised in dealing with tile IDs in AngelScript.
- Added 'Turbo' difficulty mode, accessible from the main menu or through the `-TURBO` command line argument. While playing on Turbo, your max health is only three hearts, buttstomping does not give you invincibility, and enemies are harder to kill and may exhibit behaviors unique to this difficulty.
- Replaced 1.23 and 1.24's old splash screens with new art from community members Hare and DoubleGJ.
- Updated the credits shown while quitting JJ2 to include JJ2+ credits.
- Added commands `/mouseaim <on|off>` and `/allowmouseaim <on|off>`, along with configuration settings "[General]MouseAim" (defaults true) and "[Server]AllowMouseAim" (defaults false), to enable/disable mouse aim mode. When `/mouseaim` is turned on locally in a server with `/allowmouseaim` turned on globally, a target reticle will appear on the game screen beneath the mouse cursor, and bullets will be fired toward that reticle. The (logical) left mouse button replaces the standard fire key while this mode is enabled.
- Added `/shutup <on|off>` command to disable chatting from everyone but the host and any remote admins present. (Server must be running latest version of JJ2+.)
- Pressing Alt no longer focuses on the game menu.
- Allowed JJ2 to flip tiles vertically, rather than only horizontally. (No level editor programs currently support this.)
- Added tile types 'Invisible' (3), 'Heat Effect' (5), and 'Frozen' (6), plus a `jjTileType[]` array in AngelScript.
- Improved textured backgrounds.
- Added textured background effects 'Tunnel' (1), 'Menu' (2), and 'Tile Menu' (3), plus a host of AngelScript properties for configuring them. See JCS.ini section for details.
- Fixed glitch from a previous revision of textured backgrounds skipping frames at certain speeds. (This was most noticeable in EvilMike's "This Level is Untitled".)
- Fixed glitch of textured backgrounds moving at different speeds while the game was paused.
- Running a level with translucent tiles in the textured background at certain resolutions will no longer crash JJ2.
- Improved JJ2's handling of bullets in online play.
- Fixed glitch of Bouncers bouncing in random directions not synchronized among clients, potentially causing fake health.
- Destroyed scenery blocks and other objects are now synchronized better.
- Spectators can now see the ammo counts of other players, besides just their health and current weapon.
- Bullets that the server thinks exploded against players should now explode for clients as well.
- Pickups created from shooting or buttstomping crates or barrels, shooting enemies, or bumping carrot bumpers are now server-global objects instead of local, so if you pick one up, everyone else will see that same pickup disappear.
- The created pickups also now eventually fade away and disappear online, as an additional precaution. (This only works for versions 4.2 and higher, but it degrades gracefully for older clients.)
- Consequently, players no longer receive fake health from carrots created by enemies, carrot bumpers, carrot crates, and carrot barrels.
- Fixed glitch of sometimes sending malformed animation data packets while morphing, particularly to or from a frog.
- Fixed glitch of clients crashing upon joining when `/plusonly` was disabled while hosting a level using a .j2as file.
- Fixed glitch of muting a player failing to block that player's `/me` messages.
- Fixed glitch from a previous revision of TNT not destroying destruct scenery tiles in TSF.
- Fixed glitch of the Rocket Turtle boss not using its new behavior from the January 28th update in TSF.
- Fixed glitch of palette changing sometimes crashing JJ2 when there were a lot of animated tiles present.
- Fixed glitch from a previous revision of JJ2 sometimes crashing when a player was outside the bounds of layer 4.
- Fixed glitch from a previous revision of destroying powerups with special attacks or buttstomps not always increasing the player's ammo count.
- Fixed glitch of 16-bit water in low detail mode only being drawn on the left half of the screen.
- Fixed glitch of special attacks not being able to destroy stomp blocks during sugar rushes.
- Fixed glitch of kicking or uppercutting a morph monitor morphing the player twice instead of once.
- Fixed glitch of bird morph monitors only being destroyable by bullets, not by special attacks or buttstomps.
- Looking up or down while destroying a bird morph or turning into a frog will no longer freeze the player into an altered camera state until reverting to a rabbit.
- Fixed glitch of birds and frogs triggering Cheshire2 objects despite not being able to use them.
- Fixed glitch of frozen barrels not creating anything when destroyed by laser shield blasts.
- Fixed glitch of Devil Devan's health messing up when he was hurt by special attacks or buttstomps.
- Devil Devan no longer briefly displays an incorrect sprite (often "Chris is a Redneq") after landing from a jump.
- Fixed glitch of buttstomping enemies or collecting carrots potentially shortening a player's invincibility time instead of adding to it.
- Fixed glitch of turtle shells occasionally partially transforming into bones or copters when destroying skeletons or float lizards.
- Turtle shells placed in JCS as 'Still Turtleshell' events work as surrogate bullets for a player who shoots them, i.e. when they destroy an enemy, that player gets the points for it. Previously this only worked for shells created by shooting normal turtles.
- Fixed glitch of `jjOBJ::lightType` being a write-only property.
- Fixed glitch of `jjPLAYER::localPlayerID` always returning 0 in local play splitscreen games.
- Fixed glitch of `jjPLAYER::playerID` returning the wrong number when the player had a shield.
- Fixed numerous swinging platform glitches:
- Fixed glitch of fast players falling through swinging platforms.
- Fixed glitch of players falling off fast swinging platforms.
- Fixed glitch of spike bolls sometimes crashing JJ2 (or disabling its sound system) when shot down.
- Fixed glitch of wind events not affecting players standing on swinging platforms.
- Fixed glitch of swinging platforms with their Swing parameter set to 1 drawing to the wrong spot while frozen.
- Fixed glitch of swinging platforms becoming permanently immobile if frozen in front of a tile with the 12th parameter bit set to 1.
- Fixed glitch of not being able to stand on other players other than the numerically last client in a server.
- Fixed glitch of layers with auto speeds sometimes resetting their positions after scrolling for too long.
- Fixed glitch of not being able to fire RF missiles diagonally underwater while facing left, or pepper spray while facing either direction.
- Fixed glitches in players' collision with enemies.
- Destroying an enemy with a buttstomp or special attack in online multiplayer no longer hurts.
- Destroying an enemy by freezing it and running into it really fast no longer hurts.
- All enemies now bounce the player back back when destroyed by freezing and running; previously only some of them did.
- Servers are no longer hurt just by touching a frozen enemy.
- Fixed glitch of bullets sometimes not being tested for collision with other objects while passing in front of certain events, such as Collapse Scenery.
- If a vanilla client fails to join because of `/joinersspectate` being enabled outside of Plus Only mode, the server will see a warning reminding them that the setting is turned on.
- Ammo pickups are now drawn to each subscreen based on the powerup status of the player viewing them, instead of the powerup status of player 1. Likewise, blaster powerups appear with the green or blue gun depending on the character of the player viewing them, and fastfire pickups take both factors into account. This means that two players in local splitscreen may see different sprites for the same object.
- The toaster powerup sprites now display the purple and orange powerup colors instead of the red and blue normal colors, bringing them in line with every other powerup.
- Increased speed, acceleration, and lifetime of powered up Fireball bullets to match the regular Fireball bullets.
- Console announcements will now display in local games. The 't' chat key is available in local multiplayer non-SP/Coop games, but only for writing commands, not for chatting; some commands will work, and others won't, because this hasn't been something we've really focused on.
- Max Health and Start Health may be as high as 127 in local games, as opposed to their limit of 7 in network games.
- Clients no longer perform the hurt animation/sound upon receiving health from HFK or the AngelScript `jjPLAYER::health` property.
- Gem rings may now be frozen.
- The 500 Pinball Bumper gives you 500 points the first time it's used.
- Fastfire and ammo pickups will no longer decrease a player's fire rate/ammo count if it's faster/higher than the maximum when the pickup is touched.
- Changing gamemodes while setting up a server will no longer change the filename to that gamemode's default filename (battle1/treasur1/capture1).
- Starting a level with no start positions in a multiplayer game will no longer crash JJ2.
- Starting a level with no Spaz Start events as Spaz will no longer complain about this to the jazz2.log file.
- Errors generated while starting a level should now specify whether the error arose from the level or the tileset, and if the latter, the error will actually tell you the tileset's filename.
- Calling `jjSample` or `jjSamplePriority` within an `onMain` function in AngelScript now plays the sample more reliably.
- Added "Show Max Health" menu option and corresponding "[General]ShowMaxHealth" configuration setting (defaults false), which shows the hearts a player is currently missing in black.
- Removed the "Hardware Acceleration" menu option, due to its conflicting with new code. This may or may not be a temporary removal.
- The Game Info screen will display the tileset and music filenames in addition to the level name and everything else, after pressing F9 twice. The `/np` command has accordingly been removed.
- Partially entered cheat codes no longer subsist between levels, since if you had a partially entered cheat code when you started an MP level, it would never go away (as visible from double-F9) until the next time you were in SP and could get rid of it.
- The Echo property (`jjEcho` in AngelScript) now resets at the beginning of each level.
- Chat text always appears at the bottom of the window, even if you're playing in splitscreen.
- Splitscreen clients will see only one subscreen while spectating, instead of multiple identical subscreens.
- If the server and the spectator are both running this version of JJ2+ or higher, spectating no one is now a free camera mode controlled by the mouse.
- Idle Server Mode now also uses this mode.
- The `/ready` command in CTF now uses standard warp code, so players' speed and other such properties will not be retained after warping to their bases.
- If `/ready` would warp a player into a wall, JJ2+ will now make a good faith effort to move the player somewhere else instead.
- Created a "plus.j2d" file for storing various images used by JJ2+, using the same file format as JJ2's native data.j2d.
- Numerous additions have been made to the AngelScript API. For a detailed account, users are advised to view the dedicated AS help file instead, but examples include:
- Scriptwriters may now define objects' behavior, as well as define the results of their collisions with players or bullets.
- AngelScript now has access to direct player input through the keyboard and mouse.
- Added jjPARTICLE class to give scriptwriters full control over JJ2's particle effect system, and jjCANVAS class for drawing sprites and other graphics directly to the screen, as level elements or as part of the HUD.
- Added functions for detecting the collision mask of layer 4 or any other layer.
- Added weapon-specific properties `comesFromGunCrates`, `infinite`, `replenishes`, `replacedByBubbles`, `multiplier`, `maximum`, and `style`, allowing level designers much greater control over weapons.
- Added hooks `onLevelBegin`, which takes place slightly later than `onLevelLoad`, and `onGameStart` and `onGameStop`, which are even later.
- All hooks that set the `p` or `jjP` global property should now include a `jjPLAYER@` parameter. The old coding style still works for previously added hook names, but is deprecated.
- Deprecated the jjOBJ properties `creator`, `noHit`, and `objType`, and replaced them with new, more specific/useful properties.
- jjPAL is now a reference type and so may be passed to functions by handle instead of by value.
- SOUND::Sample and ANIM::Set constants referring to HH98 or TSF-exclusive enemies, when used in 1.23, will now be evaluated as referring to their 1.23-compatible equivalents, dog in place of cat and so on.
- Updated the AngelScript library to a WIP build of version 2.28.0, imported the math add-on, and enabled the `split` and `join` methods on strings.
- Updated the example levels:
- All existing levels have been updated to reflect the implemented changes, either simply to use a less deprecated coding style or else to include genuinely new features.
- Renamed several levels to standardize the example level filenames. For example, DOMlevel.j2l is now plusDOMLevel.j2l.
- Added: plusComet, plusMenu, plusHeaven, plusTetris .j2l/.j2as.
- flycarrotPJ and plusLimitX .j2l/.j2as have been deprecated and subsequently removed.
- Moved the example levels into a separate zip archive, as to not bloat the main installation archive with multiple files.

### Feb 5, 2013 (4.1 rerelease)

- Fixed glitch in the `/readystart` command where the server would not consider itself idle if it began hosting in Idle Server mode.
- Fixed glitch of the `/cstop` command's countdown being reinterpreted as a `/cstart` countdown if the game ends (e.g. by someone making a score) before the countdown runs out.
- Fixed glitch where remote admins would be falsely announced as ready instead of receiving an error if the `/ready` command wasn't typed correctly.

### Feb 4, 2013 (4.1)

- Fixed a major memory leak in the AngelScript implementation. Thanks to Shaker, TreyLina, and all others who pointed it out.
- Fixed a 1.23-only memory leak in 16-bit color mode.
- Fixed glitch of `/me` and `/ip` giving the wrong results in servers with splitscreen players.
- Fixed glitch where exiting a stopped online/TCP game and starting a local game would disable all damage.
- Fixed glitch where shooting powerups in SP could give the player more than 99 ammo. (Finally.)
- Documentation fix: AngelScript property `jjPLAYER.jumpStrength` was incorrectly listed as `jjPLAYER.jumpSpeed`.
- Fixed glitch of AngelScript `jjPLAYER.kill()` method sometimes failing to add to a client's death count.
- Fixed glitch of AngelScript `jjChat` function crashing in local games when used to send plain text instead of a command.
- Added boolean "teamchat" parameter (defaults to false) to AngelScript `jjChat` function, to address issue of it inheriting the teamchat setting from the player's last chat message.
- Added command `/weaponchange <on|off>` and configuration setting "WeaponChange" (defaults to true).
- Added command `/readystart <on|off>` and configuration setting "Ready-Start" (defaults to false).
- Added command `/readyff <on|off>` and configuration setting "ReadyGivesFastFire" (defaults to false).
- Added parameter "Strength" to the Slide event. See JCS.ini section for details.
- Added global AngelScript properties `jjDelayGeneratedCrateOrigins`, `jjGameState`, `jjGameMode`, `jjGameCustom`, and `jjGameConnection`.
- Added global AngelScript functions `jjDeleteObject` and `jjKillObject` (almost identical to one another).
- Added AngelScript method `jjPLAYER::setScore` and property `jjPLAYER::flag`.
- Updated the AngelScript API to point out how the `jjPLAYER::fly` property can be used with copter objects.
- Updated the example levels:
- Fixed glitch in PlusJCSFun.j2as where the timer at the beginning of the level wouldn't restart after death.
- Generating trigger crates in PlusJCSFun.j2l now use simple generator events instead of AngelScript.
- Updated battle1plus and plusSurvivor .j2as to better demonstrate certain events happening on the first gametick.
- Also attempted to make battle1plus.j2as less confusing to users not familiar with coding.

### Jan 28, 2013 (4.0)

- Implemented the AngelCode Scripting Library (AngelScript for short), allowing level designers to inject large sections of code into their levels and dramatically alter gameplay. See the included file plus-angelscript.html for instructions and API.
- It is necessary for the server (or a remote admin) to enable both Plus Only mode and Latest Version Only modes for AngelScript to work online. In offline play, including Single Player, no special settings are required.
- Added configuration setting "AngelscriptDebug" (defaults to false). See plus-angelscript.html for details.
- Plus.exe will now include .j2as files as well as levels, tilesets, and music when used to zip levels.
- The chatlogger will no longer scroll down every time someone says something, if it's the focused window.
- Added significant subset of JJ2+ console commands as options in the dropdown menu that appears while running JJ2+ in a window.
- Using the menu or pressing Alt no longer freezes the game.
- Some commands (e.g. `/wc`, `/run`) are now also available in offline games through the menu.
- Added tab completion functionality to the commands. When you type in part of a command and then press the Tab key, the command will be completed for you automatically, or you will be given a list of possible commands.
- Added command `/ready` which, when the game is stopped at the very beginning, acquires all available ammo, fastfire, and powerups, and warps all local players to their bases in Capture The Flag mode.
- Added command `/allowready <on|off>` and configuration setting "AllowReady" (defaults to false).
- Added command `/ip <client>` for remote admins. (Server must be running latest version of JJ2+.)
- Added command `/me <text>`, as an analogy to actions in IRC. (Server must be running latest version of JJ2+.)
- Added command `/run <on|off>` and configuration setting "AlwaysRunning" (defaults to false).
- This replaces the old "always run" checkbox from the "plus settings" window.
- Added command `/strongpowerups <on|off>` and configuration setting "StrongPowerups" (defaults to false). When enabled, pepper spray and electro-blaster will deal 2 hearts of damage when powered up. (Server must be running latest version of JJ2+.)
- Modified command `/gamemode <gamemode>` to be able to change from a custom mode directly into its respective 'master' gamemode.
- Added server-side command `/fireball <on|off>` to replace pepper spray with the fireball weapon from the beta versions of JJ2. (Server must be running latest version of JJ2+.)
- Added command `/cstop` by analogy to `/cstart` command. (Server must be running latest version of JJ2+).
- Improved player detection of belt events, collapse scenery, and ceiling springs.
- Improved handling of underwater diagonal bullets. (Server must be running latest version of JJ2+, and clients should be running it in order to see the bullets in the right places.)
- Fixed glitch of client health not being updated globally when hurt by enemies or Hurt events in online games. (Both client and server must be running latest version of JJ2+).
- Fixed glitch where players would be invincible against bullets when standing on the left side of the level. (Mostly server-side fix.)
- The same glitch for the right side of the level had been fixed previously, but not documented.
- Fixed glitches with copter ears interacting with airboards, fly carrots, copters, and water.
- Fixed glitch where water could never be removed from a level after it was first added.
- Fixed glitch where stomping a pinball paddle would slow down the player and make jumping off impossible.
- Fixed the Illuminate Surroundings checkbox so it now works for all objects instead of only 1up.
- There are a few older levels that used this checkbox that will now look slightly different, but usually for the better.
- Fixed glitches that prevented appearance of most bullet SCEs, and fixed the bubble shield SCE so it no longer crashes the game.
- Fixes are not applied to bullets in crates, since certain Ground Force levels take their existing behavior into account. All generator-based SCEs should work perfectly, though.
- Fixed glitch of robot boss completely ceasing to function after being frozen once.
- Fixed the Slide event. To use, place it on floor tiles like regular Hurt events.
- Fixed the Laser Shield event.
- Fixed the Butterfly event (which now gives 100 points instead of 10).
- Added a new method of making paths for the Butterfly and the Rocket Turtle, using the Area ID events. See JCS.ini section for details.
- Edited the destruct/collapse/speed/stomp/bomb scenery block events to work properly with the Generator event.
- Following the lead of regenerating blocks in local splitscreen, the events will not respawn when players are too close to them.
- Fixed glitch of JJ2 crashing when block events were used with flipped animated tiles.
- This is a purely local fix -- any clients running earlier versions of JJ2+ or regular JJ2 when loading such a level will still crash, and without warning or explanation.
- Allowed block events to work with non-animated tiles (including flipped non-animated tiles).
- Note that events on non-animated tiles do not lead to the creation of new words in the tile cache, so this may not always work out as desired. See this article for further details.
- Fixed glitches that made ice, pepper spray, and electro-blaster unable to destroy destruct scenery with the Weapon parameter set to 3, 8, or 9 respectively. (Local fix.)
- Fixed issues with Gem Ring event not giving the player any points and totally ignoring its Speed and Length parameters.
- Improved the Sucker Tube event.
- Fixed glitch of player getting stuck after falling from a warp target into a sucker tube with a non-zero wait time.
- Made diagonal tube movement possible at any speeds.
- Enabled the Trig Sample parameter.
- Added parameters to Sucker Tube event to create sucker tubes that disregard masking and can only be entered at certain places. See JCS Events section for details.
- A number of events have received new JCS parameters, whose entries in JCS.ini should be updated accordingly. In each case, see the JCS.ini section for instructions on how to add the new parameters and how to use them.
- Horizontal springs may have their direction reversed manually.
- Warp events may warp players instantly without any special sound or animation.
- Trigger crates may deactivate or toggle triggers, just like Trigger Zone.
- This is a local change, so online servers must have both Plus Only and Latest Version Only turned on.
- Bomb Crate events may be completely empty, creating not even a bomb when destroyed.
- Steady Light and Pulze Light events can create a far greater variety of light types and sizes.
- Ambient lighting can coexist with water.
- Limit X Scroll can create more flexible boundaries and scrolling levels. See JCS.ini section for details.
- No Fire Zone can leave a player unable to shoot even after leaving the tile the event is in, and can also reverse the player's gravity.
- The Text event can display only a substring of one of the sixteen Help Strings set in Level Properties.
- All events banned from non-local multiplayer (enemies, swinging platforms, etc.) may now be used without resorting to MCEs, as long as their difficulty is set to "multiplayer only."
- Note that not all events may behave quite perfectly; this is merely a blanket change allowing them to appear in-game in the first place.
- Enemies exclusive to TSF and HH98 will now work in 1.23, and will be displayed as their regular 1.23 counterparts. (XMas Lizard to Lizard, Cat to Doggy Dogg, etc.)
- The Copter event no longer places restrictions on the horizontal speed of players using it.
- Changed low detail mode to show all optional layers with XSpeed 1 and YSpeed 1, instead of only layer 3 regardless of its speed.
- Instead of killing players, the bottom of the level may now optionally be a solid floor. See the Pit Levels section below.
- Disabled the "jjnowall" cheat functionality in all non-Single Player gamemodes.
- Added 3D TV support. See 3D Mode section for details.
- Touching an end of level event in Treasure Hunt will now notify the player how many more gems are needed to win, providing a way to discover where the exit actually is.
- Made the HUD not display the player's current weapon/ammo if the player is unable to fire.
- Added command line argument `-servername=<name>`.
- Removed pitlevelex.j2l from plus.zip, since its information had gotten out of date.
- Added battle1plus, flycarrotPJ, hellwarp, plusButterfly, plusEnscripted, plusJCSFun, plusLimitX, plusPalettes, plusSurvivor, plusTimerBattle, and plusTimerEx .j2l/.j2as example levels to illustrate various new JJ2+ features.
- Converted this readme file from .txt to .html.
- Updated BASS to version 2.4.9.

### Jul 7, 2012

- Outsourced the project files to the "1.25 council" on the JCF.

### Jun 30, 2010

- Fixed issue where CTF death pits (instant death areas in Single Player mode created with CTF bases) would not work as intended in some situations.
- Fixed glitch with "All Blue" and "All Red" modes where clients would sometimes see themselves on the wrong team (server-side fix).
- Fixed issues related to players morphing characters (ideally both the server and clients must be running the latest version of JJ2+).
- Fixed glitch with chat field and menu player name field where special accent mark key combinations were not handled properly.
- Fixed glitch where random chat text was sent to others immediately after pressing 't' to show the chat field (local fix). Special thanks to FawFul for helping me figure out the problem.
- Added additional parameters to events Area End Of Level, Area Warp EOL, and Area Warp Secret. The new parameters allow for fast level cycling and a greater number of choices for the next level. See JCS.ini section below to learn what to do.
- See levels SPlevel1.j2l and SPlevel2.j2l for an example. It's recommended to update JCS.ini before running these levels through JCS (via Save & Run).
- Fixed Area Warp Secret event and Area End Of Level event with Secret set to 1 so that the event cannot later be retriggered when the player returns to the original level after playing the secret level(s).
- Fixed glitch with Warp event and Area Warp Secret event where the "need x more" message was not displayed properly.
- Fixed glitch with pit levels played offline in Single Player or Coop where not all local split screen players will die after falling into a pit.
- Added the ability to insert and erase characters in the middle of the text of the chat field.
- In Treasure mode, the level no longer cycles when a player reaches an exit during a stopped game (both the server and clients must be running the latest version of JJ2+).
- Fixed glitch with level cycling in Single Player, Coop, and Race modes.
- Fixed cycling issues in Single Player and Coop in online games.
- The level now cycles when any player reaches an end-of-level exit. Note that bonus level exits still do not work.
- The level now cycles when a boss is finished. Note that the server and clients may not see the boss finished off at the same time.
- Clients running the latest version of JJ2+ no longer see the level cycle locally when they finish a boss while the server sees the boss as still alive.
- Fixed glitch in Playlog where Place stat would show the incorrect place of players.
- Improved collision detection for online games.
- In Single Player and Coop, clients now lose hearts after being hit (client-side fix).
- MCE and SCE events can now hit players without causing JJ2 to crash (server-side change).
- Warning: Clients not using the latest version of JJ2+ WILL CRASH if the level has any MCE/SCE seeker objects.
- Fixed issues with Extended Last Rabbit Standing:
- Made Place stat no longer partially determined by the number of points a player has.
- Game will now only go into overtime if two or more players have the highest number of lives left. Previously, a winner would have been decided if one of those players had a higher number of points than the rest.
- Improved HUD.
- Redesigned HUD for Battle-based modes and most notably for LRS-based modes.
- Fixed minor HUD player list sort issue (client-side fix).
- Fixed other miscellaneous issues.
- Added command `/maxresolution <width>x<height>` and configuration settings "MaxResolutionWidth" and "MaxResolutionHeight" (Max Resolution defaults to 640x480). Only players running the latest version of JJ2+ are affected.
- For the Game List in the menu, now at most only 10 servers with the same IP address will be shown.
- Increased the maximum distance a player can be hit by TNT in online games when Extended TNT Range is enabled.
- Improved how start positions work in team games (local fix). If a level doesn't have a Multiplayer Level Start event for both blue team and red team, then players will start at any start position.
- Latest Version Only setting now only applies to JJ2+ clients. Clients not using JJ2+ will be able to join when the setting is enabled. Use Plus Only setting to exclude those clients.
- Fixes for being hit while/after warping and being killed while frozen are now used for all modes and both online and offline play.
- Fixed glitch in Treasure mode where the server was able to die after hitting certain objects or events.
- Removed command `/lives` which was used to send chat indicating each player's number of lives if custom mode was Extended Last Rabbit Standing. This command hasn't been needed by JJ2+ users for a long while.
- Fixed minor in-game ping issue (server-side fix).
- "<team> scored a point" messages are now never displayed for Team Last Rabbit Standing (client-side fix).
- Most Windows-1252 characters can now be typed into the server name in the menu.
- Documentation fix: "-levellist=<filename>" should be "-levellistfile=<filename>".

### Apr 8, 2010 (A)

- Fixed issues with UDP packets not being properly sent to the server (client- side fix).
- Changed again how Lori's clothes colors are customized in multiplayer games (local fix). Lori's clothes color is now editable by setting the value that used to change the color of Lori's eyes. This means Lori's eye color will always be green.
- Improved how Lori's fur color is displayed.
- Added note related to the last update: When there are already 16 connections to the server, and the 17th connection is made, all clients using a previous version of JJ2+ will be kicked. Therefore, you may wish to limit the number of connections to 16 (with command `/maxconnections 16`) until more people get the latest version of JJ2+.

### Apr 8, 2010

- If you didn't install the previous JJ2+ update, make sure to use the updated Plusifier.
- Added configuration setting "UseAnyLocalAddress" (defaults to true). When false, a JJ2 will bind to a single local IP address when creating listen sockets. You probably don't want to change this setting.
- Fixed glitch where a JJ2 server would fail to bind to a single local IP address when creating listen sockets.
- Server now automatically relists if it loses its connection to the list server.
- Added support for downloading music files:
- Added server command `/uploadmusic <on|off>` and configuration setting "UploadMusic" (defaults to on).
- Added server command `/maxuploadpacketsize <bytes>` and configuration setting "MaxUploadPacketSize" (defaults to 1024).
- Added client command `/downloadmusic <on|off>` and configuration setting "DownloadMusic" (defaults to on). When downloading music, note that the escape key can be pressed to stop downloading while staying in the server.
- Added client command `/downloadsamemusicversion <on|off>` and configuration setting "DownloadSameMusicVersion" (defaults to off).
- plus.exe can also be used to add levels to LevelList.ini and to zip levels including their tilesets, music, and other linked levels automatically (see Level List and Zipping Levels section below). Use command line argument "-loadplus" to skip the prompt and automatically load the plus.dll into a running JJ2 process.
- Made adjustments which allow command `/changemusic <music_filename>` to increase the maximum allowed length for <music_filename> from 31 to 62 (though JJ2's chat limitations won't allow a filename that long). These changes make it impossible to change music through programs like Project Controller.
- Added support for up to 32 connections in a server (both the server and clients must be running the latest version of JJ2+). Note that clients running a previous version of JJ2+ cannot join servers where there are already 16 or more connections. However, non-Plus clients can join such a server, although they won't be able to see chat from any client (including themselves) who has a connection number above 15.
- Added command `/maxconnections <number>` and configuration setting "MaxConnections" (defaults to 32).
- Improved Max Players check for joining clients.
- Added the needless ability for the server to be able to host levels from folders other than the Jazz2 directory, including the cache folder, without causing problems for clients. The 31 character limit still applies to the length of the path and filename of the level, and the tileset for the level must exist in the Jazz2 directory.
- No Fire Zone events now work in Single Player mode (local change).
- Spring delays now work in all game modes (local change). Previously spring delays only worked for Battle, Race, and Treasure.
- Re-added constraint where secret levels cannot cycle to other secret levels.
- Improved the fix for the glitch where a player hits a warp event while the level cycles and then continues warping to a random postion in the next level. It should now always work even if the player was frozen while warping. Also, the warp fix is now only for online games.
- Most Windows-1252 characters can now be typed into the chat field.
- Most Windows-1252 characters can now be typed into a player name in the menu. Also, a space character can now be used as the second character in the name.
- When editing a player name, the name is no longer displayed animated in a pattern of colors.
- Updated how chat is stored and displayed within JJ2. Most notably, chat lines no longer disappear if the player who said the lines leaves the server.
- Updated `/ban` and `/kick` commands to `/ban [<time>{s|m|h|d}] {<player>|<ip_address>} [<reason>]"` and `/kick <player> [<reason>]"` respectively.
- Updated `/ban`, `/kick`, and `/unban` commands to give more error messages when appropriate.
- The old "ban" and "kick" commands (the ones that did not use a preceding forward slash) no longer can be used.
- IP addresses banned through Banlist.lst can now be unbanned through the `/unban` command.
- Server now sees "<player> was kicked off" and "<player> was BANNED" messages when a player is kicked and banned respectively.
- Server now blocks attempts from banned players to join the server sooner.
- Updated how Remote Admin is done:
- Added support for admin groups (uses admin configuration file admin.ini).
- For each admin group, the following can be set: the password, allowed commands (or blocked commands), Auto Admin IP addresses, and whether the group is currently enabled.
- Auto Admin IP addresses allow a user to be automatically promoted to an admin for a given group when joining the server.
- Removed restriction where admins cannot kick or ban other admins. These commands can be made unavailable by adjusting the allowed or blocked commands for a given group.
- Replaced command `/setadminpass <password>` with command `/setadminpass <group> <password>`.
- Replaced command `/getadminpass <password>` with command `/getadminpass <group> <password>`.
- Removed configuration setting "AdminPassword". Change the password of a group in the admin configuration file instead.
- Added server-only commands `/admingroup <group> <on|off>`, `/addadminip <group> <ip_address>`, `/removeadminip <group> <ip_address>`, `/addallowedcommand <group> <command>`, `/removeallowedcommand <group> <command>`, `/addblockedcommand <group> <command>`, and `/removeblockedcommand <group> <command>`.
- Note that an admin group needs to be enabled and have a valid password before users can log on that group.
- See Remote Admin section and file admin.ini for more information.
- Added command line arguments "-settings=<filename>", "-admin=<filename>", and "-levellistfile=<filename>" for specifying configuration files. Note that the configuration file must exist beforehand or else default file will be used.
- Changed parsing method for command line arguments of the form "-<name>=<value>" so that backslashes no longer need to be escaped in <value>. Note however that to use double quotation mark in <value>, the double quotation mark must be escaped by another double quotation mark.
- Fixed command line argument "-player <number>" for TSF. It had a name conflict with command line argument "-play".
- Updated client command `/login <password>` so that if the server is running JJ2+, the login command and password will not be displayed locally in the chat and instead will be replaced by a message saying "Attempting to login".
- Updated Roast Tag so that the maximum points the player who is IT receives after roasting a player is five.
- Updated Jailbreak to better handle the case where one team no longer has any free players after Pregame has ended, particularly when a player changes team mid-game. When there aren't enough free players, the jails are now always opened or stay open afterwards.
- In Jailbreak, jails are now always open during pregame.
- Made minor improvement for how killing spree text is displayed in team games with Friendly Fire enabled.
- When Idle Server mode is enabled, a visual indicator is now always displayed, and Idle Server can now be disabled by pressing CTRL+ENTER.
- Server is no longer hidden for clients when the server minimizes. Server is now only hidden for clients when Idle Server mode is enabled.
- Player pings are now shown on the Game Info (F9) screen when F9 is pressed twice, when the tab key is held down, and when the "Always Show In-Game Pings" setting is enabled (both the server and clients must be running the latest version of JJ2+).
- Added command `/alwaysshowingamepings <on|off>` and configuration setting "AlwaysShowInGamePings" (defaults to off).
- Clients now must wait for server data before being able to play in a level (both the server and clients must be running the latest version of JJ2+). This change fixes issues related to scenery events and game objects being processed at the wrong time by clients.
- Improved how spectating works in general.
- Fewer movement packets are now sent for Spectator mode and Idle Server mode (local change).
- Added command `/maxspectators <number>` and configuration setting "MaxSpectators" (defaults to 32). Note that the limit also applies to joining players when Joiners Spectate is enabled.
- Server no longer spectates when Idle Server mode is on and command `/forcespectate all on` is used.
- During a game when the user wants to quit and the "Are you Sure? Yes/No" prompt is displayed, the arrow keys and tab key can no longer change the spectated target or display the player list on the HUD respectively.
- Added command `/allblue <on|off>` and configuration setting "AllBlue" (defaults to off).
- Added command `/allred <on|off>` and configuration setting "AllRed" (defaults to off).
- Teams are now always made more even when a new player joins the game except when Even Teams is off and the joining player specifies his or her team while running the latest version of JJ2+
- Fixed glitches in Team Last Rabbit Standing:
- The incorrect number of lives were sometimes shown for a player who joins the current game after previously being in Spectator mode or, in the case of the server, in Idle Server mode.
- When `/forcespectate all off` was used while a player was spectating while out, spectating would be disabled for the client.
- When `/forcespectate all on` was used while a player was spectating while out, spectating would be disabled for the client.
- When `/shuffle` command was used during normal player without enough active players in the server, excess reserves were given to each team.
- Fixed glitch in Roast Tag where a player who becomes the ring holder receives the improper amount of health when Health From Kills is enabled.
- Fixed glitch where Add-Ons (e.g. instagib) could be used in offline games.
- Fixed glitch in offline CTF games where the flag was never dropped when the flag holder was roasted.
- Fixed glitch where clients would keep team colors when the game mode is changed from CTF to another game mode (client-side fix).
- Fixed glitch where the server would corrupt an upload to clients.
- Fixed buffer issue with UDP packets.
- Fixed glitch where clients would see the incorrect time left when the server resets the time limit while the game is stopped.
- Fixed glitch where clients would see negative team scores when a team's score is between 128 and 255 (client-side fix). No negative team scores was an adjustment added in a previous JJ2+ update.
- Fixed glitch where clients would not see certain objects spawn initially after the level cycles (client-side fix).
- Fixed glitch where a copter would cause a generated object to disappear (local fix). Most notably, the bouncer powerup in Bluez's Green Beret no longer disappears.
- Fixed various Lori issues:
- Fixed glitch where Lori cannot use copters (local fix).
- Lori's fur and clothes colors can now be properly customized in multiplayer games (local fix). Lori's clothes color will be editable by setting the value that used to change the color of the tip of Lori's gun. This means the tip of Lori's gun will stay red, but the rest of the gun can still be different colors.
- Lori Level Start (event 32) can be used to create a start position usable only by Lori. Requires replacing lines in JCS.ini. See JCS.ini section below to learn what to do.
- Fixed glitch where the server would hear the game end music restart after a player joins.
- Fixed UDP exploit for clients (client-side fix).
- Fixed glitch where JJ2 would randomly crash due to sprites not being cleared from a previous level.
- Fixed minor glitch where clients not running JJ2+ don't see the correct health update when there is a health change.
- Fixed minor client-side issue related to level cycle.
- In online games, missing level backgrounds now always appear black with no trails from any tiles, even when chat fills the screen.
- Slightly improved idle player detection.
- Removed player prediction for remote players who are spawning or warping so that their positions are updated immediately (ideally both the server and clients must be running the latest version of JJ2+).
- Improved how morphing works online. Both server and client need the latest version of JJ2+.
- Frog anims are now always loaded on each level initialization.
- When JJ2 is minimized to the tray, the same procedures are now done as if JJ2 has been minimized to the taskbar.
- Improved how game echoes are displayed when a player is roasted (server-side change).
- "Player joined/left the game" messages now always appear in all green for clients (client-side fix).
- Teams are now always internally made even when the game mode is not CTF.
- Server no longer sees the characters of clients who are connecting to the level.
- The right CTRL key can now be used for keyboard shortcuts that specify the use of a CTRL key, e.g. CTRL+F9.
- The main window no longer pauses when a client minimizes or when the Sound & Music Properties dialog is accessed.
- Fixed minor formatting issue with some strings.
- Documentation fix: `/unban <ip_address>` should be `/unban <ip_address|all>`.
- In this readme, section "Level List" renamed to "Level List and Zipping Levels.".

### Jul 28, 2009

- Updated the Plusifier:
- New JJ2+ exe created with the Plusifier now no longer crashes if Data Execution Prevention is enabled.
- plus.dll is now loaded earlier by JJ2+ exe.
- The Plusifier now optionally makes backups of your original JJ2 exe.
- NOTE: You MUST use the Plusifier again on your original JJ2 exe (i.e. an exe that has not been patched by the plusifier yet) EVEN IF YOU ALREADY HAVE A FUNCTIONING JJ2+ EXE.
- Fixed problem (hopefully) where some clients timeout in a server after 30 seconds. This is mainly a server-side fix, but to ensure all UDP packets are received, clients must be running this version of JJ2+ as well. Special thanks to SuPrem and Cpp (Overlord) for helping me find the problem.
- Fixed glitch where boss event attempts to use BOSS1.S3M or BOSS2.S3M for music instead of BOSS1.J2B or BOSS2.J2B.
- Players now always won't lose control (and potentially get stuck) when they get hit before or after warping (local fix). This was previously a Plus Only feature.
- Players now always will be automatically unfrozen if they die and are freezed (local fix). This was previously a Plus Only feature.
- Significantly improved how servers on the Game List screen is displayed.
- Made better fix for gem rings crashes by preventing gem rings from being frozen (local fix).
- Gem counters are now always displayed when a player collects 100 red gems or an equivalent.
- Fixed glitch in Team Last Rabbit Standing where connecting players in Spectator mode are changed to Out Spectator mode.
- For the server, more packets from connecting clients that shouldn't be processed are now ignored.
- Adjusted protection rules for weapons and shields not available in the current level. For Single Player and Coop, fixed how players sometimes couldn't use ammo they collected from the previous level(s). Moreover, if the game mode is or was Single Player or Coop at some point during the current level, players can now use any weapon or shield except the laser shield without being kicked/banned, and laser shots by players will be blocked but not count as a hack attempt.
- Fixed glitch in Jailbreak where the last free player for a team can get more than 90 seconds to free his or her teammates.
- In Pestilence, made chat message less ambiguous. Now states: "No kills by zombies for 2 minutes means random new zombie".
- Fixed glitch where clients get kicked for an unauthorized file request when the request was legitimate (server-side fix).
- Fixed glitch where JJ2's Galaxy Music System causes a crash if Data Execution Prevention is enabled.
- When No Movement on Stopped Games is enabled, objects no longer automatically spawn during stopped games. Use command `/spawnobjects` to force all allowed objects created by generators to spawn if they aren't spawned already.
- chatlogger window now uses the a new icon.
- Added command line argument "-port=<port>" so that servers can use ports other than 10052 for hosting.
- Note: This version of JJ2+ is no longer compatible with [anonymous]'s JJ2 1.23 Port Changer program.
- Added support so that clients can join servers not listening for connections on port 10052 (client-side change).
- Added support through command line and j2i files for joining servers that are passworded or on a different version of JJ2. When using the command line, use "-connect" before the IP address.
- Formats:
- <ip_address>[:<port>] [-password=<password>] [-version=<server_version>]
- <ip_address>[:<port>][/[<password>][/<server_version>]]
- Values for <server_version>:
- For 1.23, use: 1.23, 23, 1.21, or 21 (all map to "21 ")
- For TSF, use: 1.24 or 24 (both map to "24 ")
- Examples:
- 127.0.0.1:10052 -password=abc -version=1.24
- 127.0.0.1 -password="pw \w ""spaces"""
- 127.0.0.1/abc/1.21
- 127.0.0.1:10058//1.21
- Note that to use a double quotation mark in a password, the double quotation mark must be "escaped" by another double quotation mark. Backslashes do not need to be escaped.
- TSF JJ2+ users can now join any 1.23 server whether through the Game List in the menu, command line argument "-connect", or j2i file (local change). Note that TSF JJ2+ users don't have to specify the server version in command line and j2i file.
- During a game when the escape key is pressed and the menu box is displayed, the arrow keys and tab key can no longer change the spectated target or display the player list on the HUD respectively.
- JJ2 servers now bind to a single local IP address when creating listen sockets.
- Food and Fastfire (fire speed) are now always reset between levels if the game mode is not Single Player or Coop. Plan multiplayer levels accordingly.
- Loading settings no longer turns off Spectator mode if "AllowSpectating" configuration setting is set to false.
- Changed how loading settings after startup works so that missing settings are not automatically set to their defaults.
- Command `/np` now indicates nothing is playing if the music filename is blank.
- All Remote Admin logins are now publicly announced.
- Players who attempt to use invalid shields and weapons are now always automatically kicked on their first hack attempt.
- Finally added configuration settings for the following: WeakPowerups, NoPowerups, NoAmmoCrates, NoCarrots, and NoShields.
- Added command `/fastpoweruprespawn <on|off>` and configuration setting "FastPowerupRespawn" (defaults to off).
- Added command `/noseekerammo <on|off>` and configuration setting "NoSeekerAmmo" (defaults to off).
- Added command `/noseekerpowerups <on|off>` and configuration setting "NoSeekerPowerups" (defaults to off).
- Modified Domination so that a team gains a point for each control point separately depending on when it was captured. Previously, a team gained points all at once depending on the number of captured control points after every x seconds.
- Fixed command line arguments so that "-noddrawwin" isn't required in addition to "-noddraw" to prevent crashes.
- Moved hook for chat function around. Users should see no difference with chat.
- Slowly dropping IPX support.

### Apr 10, 2009

- Fixed glitch where users crashed (usually on the menu screen) after loading JJ2+.
- For protection against players using weapons and shields not available in the current level, weapons and shields added through the extra event parameter of events such as Gun Barrel and Bomb Crate are now properly detected. Also note that if JJ2+ is loaded mid-game, players can use any weapon/shield except the laser shield until the level is cycled. If the game mode is Single Player, players can use any weapon/shield except the laser shield.

### Apr 9, 2009

- Note: This version isn't entirely incompatible with the last version.
- Note: I made changes that may cause clients to never see any objects when they first spawn. Please tell me if this happens often!
- Fixed glitch created in the last update where the server freezes clients after sending too many packets.
- The JJ2+ build date is now displayed on the main menu screen.
- Command `/levellist <shuffle>` now gives an error if all levels could not be shuffled.
- Command `/n` now displays the level number if the next level is from the Level List.
- Improved how Level List Cycling works in general.
- Added command line arguments: Custom Mode: `-rt`, `-lrs`, `-xlrs`, `-pest`, `-tb`, `-dctf`, `-jb`, `-fr`, `-tlrs`, `-dom`, `-list`, `-levellist [<number>]`, `-spaz` (for 1.23), `-menu`, `-minimize`.
- User-defined fur is now always used for online games (as in for Internet Play and Local Network).
- This fixes the behavior where command line argument -connect does not allow user-defined fur by default.
- Fixed glitch where command line argument -server does not assign the server to a valid team.
- Fixed glitch where flag holder's health cannot be seen when spectating a flag.
- Command `/stats` now always logs player stats if there are active players, even when play has not begun.
- Made Auto-Stop more useful:
- When game stops, Auto-Stop now automatically logs player stats and announces who won.
- Now stops overtime games.
- On 'Game Server Setup' screen, can now use "levellist [<number>]" in place of a level filename. When the server starts, JJ2+ will attempt to load the first level (or the level belonging to the specified number) from the Level List.
- Fixed glitch where music could not be heard if volume was initially muted.
- Documentation fix: `/forcespectate <player> <on|off>` should be `/forcespectate <player|all> <on|off>`.
- Added note about Admin Chat. See Remote Admin section below for more details.
- Added Plus Only Features section.
- Reduced probability of seeing "trails" of players who died or warped.
- Reduced probability of clients being able to lose hearts immediately after spawning (the server needs latest version of JJ2+).
- JJ2 no longer freezes or turns off sound when screensaver or monitor low- power activates.
- Fixed glitch (hopefully) where loading plus.exe on the menu screen sometimes causes JJ2 to crash. Note that plus.exe still cannot be loaded on the connecting screen. Please notify me if crashes still occur.
- Download bar on downloading screen should now properly indicate how much of a the file was downloaded.
- In addition, the "<x> bytes received in <y> s" message in the spy log now displays the correct values.
- Probably fixed most issues with connecting and downloading files. Tell me if something fails.
- Clients running the latest version of JJ2+ are no longer kicked if they are downloading when the level cycles.
- Changed how special trigger zones work. See special trigger zones section below.
- The changes may cause problems for levels still using the original special trigger zones, though there should be no major problems if everyone in the server is using the latest version of JJ2+.
- Added a special trigger zone for an overtime trigger. See Special Trigger Zones section below.
- Fixed minor issue where the server does not always update the team trigger for clients.
- Clients in a JJ2+ server will no longer automatically flash locally when hit by the shockwaves of RFs and TNT. This was previously a Plus Only feature.
- Holding down tab now displays player list on HUD as long as the key is pressed.
- Can sort the player list on the Game Info (F9) screen differently by pressing CTRL+F9. Default is state 1. Press once for state 2, twice for state 3, and three times for state 1 again. When F9 is pressed twice, the number of the current state will be displayed to the left of the divider. When tab is held down, state 3 is always used.
- State 1:
- Sort players by player number only.
- State 2:
- Sort players who are not connecting before players who are connecting.
- Then sort players who are not spectating before players who are spectating.
- Then sort players by team if CTF mode.
- Then sort players who are not out/zombies/jailed before players who are out/zombies/jailed.
- Then sort players by player number.
- State 3:
- Sorts players as in state 2
- In addition, sort players by number of points/lives/gems/deaths.
- Added configuration settings for "GameInfo" (defaults to 0, range is [0, 2]) and "PlayerListSort" (defaults to 1, range is [1, 3]).
- Adjusted No Movement on Stopped Games so that players no longer see other players jitter when those other players are not actually moving. Server and clients must have latest version of JJ2+.
- Server and Remote Admin passwords are no longer automatically shown after they are changed.
- Remote Admin password no longer displayed on the HUD. In its place is "Remote Admin" in yellow.
- Fixed glitch where clients sometimes see multiple objects spawn at one place when only one object should have spawned. As a result, most notably clients should no longer see any duplicate carrots which give "fake health" (client- side fix).
- Multiple objects spawned on the same tile with MCEs are now always processed correctly when a non-local player attempts to pickup all of them at once (local fix).
- Fixed the trigger zone switch so that it only switches the trigger state once on contact (local fix).
- Fixed behavior so that when changing a trigger or triggers for a non-Plus client, all triggers except the one(s) currently being set are no longer set to become the same as the server's triggers.
- Fixed glitch where clients using splitscreen do not immediately see health decreases when they stomp one another (server-side fix).
- Added more targets to that can be spectated. See `/spectate <target>` command.
- For Spectator mode, sound now corresponds to the spectated target.
- For Idle Server mode, sound can no longer be heard.
- Added protection against players using weapons and shields not available in the current level. Players using invalid shields and weapons will have their bullets blocked and will be banned if they shoot them too often. Note that if `/nopowerups <on|off>` or `/noshields <on|off>` is used, players will still be allowed to shoot bullets from powerups and shields until the level is cycled.
- JJ2+ messages that are unrelated to commands are no longer preceded by "Console:".
- Changed how basic CTF messages are displayed. Most notably each message is now a single color based on the team.
- In Flag Run, "<player> captured the flag" messages now appear only once on each flag capture (local fix).
- In Jailbreak, if prisoners are released with no active players on either blue team or red team, the jails will will open until there are enough active players.
- Fixed glitch where the check for the number of active players in team games was incorrect.
- Updated plus.exe to improved how levels are added to the Level List. Users can now specify which section levels are added either after being prompted by the program or by using "-section <section_name>" before the level filename arguments. In addition, plus.exe now automatically does renumbering for missing keys and blank level filenames, even when no levels are added to the specified section.
- Added command `/resetsettings` mainly so that admins can reset settings.
- Players running the latest version of JJ2+ who are killed or fall into a pit while using a shield can now immediately use the blaster.
- Playlog improvements:
- Now logs Treasure games.
- Now logs the winners of games.
- Now logs Game Mode changes in addition to Custom Mode changes.
- Auto-Stop now automatically stops the game if there is a winner in Battle- and CTF-based modes.
- Warning: Reaching the score limit with Auto-Stop enabled may cause clients not running JJ2+ or using an older version of JJ2+ to see the game end when the level is not cycling.
- Most generated pickups are now automatically destroyed if they fall into a pit.
- In JJ2+ servers in Treasure mode, players running the latest version of JJ2+ will see an arrow pointing to the nearest exit when they have enough gems to win.
- In Treasure mode, improved cycling when player with enough gems to win reaches exit.
- Objects no longer automatically spawn during stopped games.
- Added command `/spawnobjects` which forces all allowed objects to spawn.
- Increased maximum delay time for generated objects to 255 seconds and added a JCS event parameter so that objects can optionally be delayed from initially spawning until after the delay time specified. Requires replacing lines in JCS.ini. See JCS.ini section below to learn what to do.

### Nov 27, 2008 (0.2)

- Fixed the Plusifier so that overwriting the original JJ2 exe actually works. You do not need to use the Plusifier again if you already have a functioning JJ2+ exe. If you choose to overwrite your original JJ2 exe with the Plusifier, MAKE A BACKUP FIRST!
- Implemented a better fix for the glitch where downloaders can freeze the server.
- The new implementation also fixes the glitch caused by the original implementation where downloads of levels and tilesets were extra slow.
- In Team Last Rabbit Standing, lives are now distributed more evenly.
- LivesPerTeam configuration setting now defaults to 30.
- Added `/maxteamplayers` command and configuration setting (defaults to 16).
- Command `/setlives` no longer can be used during pregame in TLRS.
- Fixed glitch with command `/setlives` in TLRS related to team lives reserves.
- Fixed glitch in TLRS where players start with 0 lives when they join the game with no other active players.
- Made various other fixes to TLRS.
- Fixed glitched in Spectator mode where clients see flashing hearts at top- right corner when spectating flags or no one.
- Fixed glitch where players don't immediately drop the flag when they enter Spectator mode or, in the case of the server, enter Idle Server mode.
- Added music support for MP3/MP2/MP1/OGG/AIFF and better music support for MOD music.
- Implemented BASS audio library which works on top of JJ2's Galaxy Music System.
- BASS version: 2.4
- Warning: Users not running the latest version of JJ2+ will crash if JJ2 attempts to load any music file that is not a supported module music track.
- Fixed glitch (hopefully) where the music volume would decrease without resetting in online games.
- Restored original behavior for how music works in offline games (for the most part).
- Fixed how the volume works in general.
- Added `/autovolumeleveling` command and configuration setting (defaults to true).
- All `/loadsettings` and `/savesettings` commands can now be used by clients in a server.
- When a client is not an admin in a server, bad commands now always give an error message instead of being printed to the screen.
- Added a better explanation for how to play/make Domination levels.
- In Domination, the number of seconds between each score now depends on the total number of control points in the level. See Domination section below for more details.
- Made minor improvement to the Playlog.
- Fixed glitch where Level List Cycling needlessly changes the next level setting when the custom mode is changed.
- When there is not enough active and potentially active players in the server and the pregame countdown ends, pregame is now extended up to 3 times for 30 seconds. Previously pregame was only extended once for 1 minute.

### Aug 28, 2008

- Added Team Last Rabbit Standing custom mode (uses `/tlrs`).
- Added `/livesperteam` command and configuration setting (defaults to 20).
- Added Domination custom mode (uses `/dom`).
- Fixed glitch in LRS-based modes where players may be in the game (i.e. not out) with a red name.
- Fixed glitch where countdowns for new rounds in Flag Run, Jailbreak, and DCTF are done too quickly.
- Added `/loadsettings <filename>` and `/savesettings <filename>` commands.
- Added `/forcespectate <player> <on|off>` command.
- Added `/joinersspectate <on|off>` command and configuration setting (defaults to false).
- Disabled pause key so that JJ2 no longer freezes.
- Idle Server mode is no longer automatically enabled when the server spectates.
- Players no longer die when Idle Server mode or Spectator mode is enabled.
- Idle Server mode is now automatically disabled when Spectator mode is enabled. Similarly, Spectator mode is now automatically disabled when Idle Server mode is enabled.
- Fixed glitch in camera caused by starting normal Spectator mode after spectating while out in LRS-based modes.
- Various other spectating fixes.
- Added a warning about `/shuffle`: Shuffling teams several seconds after a level cycles or while players are still connecting may cause players to spawn at the wrong start positions.
- Adjusted Death CTF so that when a player scores for the other team, no one dies because of it.
- Added `/resetallteams` command and configuration setting (defaults to true).
- Added `/welcomer <on|off>` command and configuration setting (defaults to false).
- Added `/welcomemessage <message>` command and configuration setting (defaults to an empty string).
- Fixed glitch when No Movement on Stopped Games is enabled where players using JJ2+ do not stop shooting after a game is stopped.
- In LRS-based modes, any one who joins after a player places 4th or 3rd will be automatically out.
- In LRS-based modes, lives are no longer reset for the idle server and spectating players after a new game.
- In XLRS, when the game ends, players can now see the adjusted points on their screen after the points for 1st, 2nd, and 3rd place are multiplied by 1.5, 1.25, and 1.125 respectively.
- Fixed glitch in XLRS where the `/setlives/` command does not update plus users of their current lives.
- Spectating players' names in the Game Info (F9) screen now appear gray.
- Improved spacing for how roast/deaths/lives/points are displayed in Game Info (F9) screen.
- Ice now has a more similarly behavior with server and clients.
- Players running the latest version of JJ2+ will be automatically unfrozen if they die and are freezed.
- Added `/evilice <on|off>` command and configuration setting (defaults to false).
- On Game Info (F9) screen, when F9 is pressed twice:
- "Custom Mode:" text on left side is removed.
- Current Game Mode is now displayed when the Custom Mode is off.
- Below the current Game/Custom mode, the start health (S), max health (M), and the Plus Only status (P) is now displayed. Note that the start health displayed is the minimum of the max health and the actual start health value.
- Command `/setlives` can now be used on connecting players.
- Forgot to mention the optional [reset] parameter which resets the amount of time left for commands /timelimit, /pgtimelimit, and /otlimit.
- Instagib now always displays 1 heart at the top-right of the screen to JJ2+ users. Instagib still overrides Start Health and Max Health settings.
- Added `/smhealth <number|default>` command for setting both Start Health and Max Health at the same time.
- !swap, !blue, and !red messages now always appear before the consequent Console message.
- Command `/reset` now resets lives for LRS and XLRS during pregame.
- Fixed glitch (hopefully) where the random number generator was not properly seeded.
- In Flag Run, players running the latest version of JJ2+ can now see a visual indicator of a capture point.
- Command `/mute` no longer mutes all players when used by the server. See mute command. If the server mutes a player, that player cannot use Self-Swap and admin commands.
- When Even Teams is enabled, clients can no longer use Self-Swap to make teams more uneven.
- Added example levels for Jailbreak (JBlevel.j2l), Flag Run (FRlevel.j2l), and Domination (DOMlevel.j2l).
- Added minor descriptions on how to play Team Last Rabbit Standing and Domination.

### Jul 3, 2008

- Setting Max Health to 1 is now treated more similarly to instagib. Most notably, carrots will no longer respawn just like in instagib.
- Fixed glitch when player warps while the level cycles and then continues warping to a random warp target afterwards.
- Removed constraint where secret levels sometimes cannot cycle to other levels.
- In LRS and XLRS, players who don't get a roast every 3 minutes will no longer be punished by having their health set to one heart. In its place, players who fail to get a roast every 2 minutes will have their position announced in the server. For other incentives for players to get roasts, Health From Kills can be used.
- Fixed up how Late Joiners works with LRS and XLRS. In particular, fixed how players can sometimes rejoin the server with more lives than when they left.
- Added more changes to reduce lag clones and hopefully without significantly increasing the server's lag.
- Command `/levellist <number>` now always gives an error when the Level List file belonging to the specified number cannot be accessed.
- Added `/llautoshuffle` command and configuration setting (defaults to false).
- IdleTime configuration setting now defaults to 3 minutes.

### Jun 22, 2008

- 32MB is now allocated for JJ2's main memory (previously 9MB for 1.23 and 11MB for TSF). This basically means larger music files and levels can be played locally without any Amnesia errors. Only available in the patched JJ2 exe made with the Plusifier. If you already have a patched exe, you MUST use the Plusifier again to access this feature.
- Updated the Plusifier with a save dialog so that any filename can be used for the save file. This means you may accidently overwrite the original exe or another file, so BE CAFEFUL and make backups when necessary.
- Server now does a better job of always relaying flag holder (for CTF) and ring holder (for Roast Tag) positions to clients.
- When No Blink is enabled, clients using the latest version of JJ2+ won't see players blinking after they are hit (server must also have latest version).
- Removed `/capture` command (Team Battle with captures enabled led to bad start positions anyway). May replace with TBCTF eventually, if DCTF isn't good enough.
- In Team Battle, arrow no longer points to flag.
- Fixed glitch where players could not press fire to continue to next level when movement was restricted, such as during spectating, when out in LRS/XLRS, etc.
- Fixed how "Spectator Mode" text is displayed for spectating splitscreeners.
- In Last Rabbit Standing and Extended LRS, players running JJ2+ now automatically spectate when all local players are out.
- Adjusted spectating so that players who are out and CTF flags in certain conditions cannot be spectated. Such conditions for flags include when the current game mode is not CTF and when the custom mode is Team Battle.
- Made spectator camera work more smoothly in certain levels.
- Made the following commands usable by remote admins: list, delist, relist, public, private, servername, maxplayers, password, blockdownloads, multiversion, plusonly, nosplitscreeners, kickidlers, idletime, spectating, ban <ip_address>, unban.
- Needless to say, admins are now more capable of fixing/breaking a server.
- Reduced chance of getting an Amnesia error when /restartmusic is used.
- Admins now always see hack attempts and the IPs of clients who get kicked/banned (when JJ2's default kick/ban commands are not used).
- Changed HFK Health Increase value range from [1, 6] to [-6, 6].
- Restored default behavior of being able to capture flags in offline play.
- Added info and example level for Pit Levels.
- Fixed minor glitch with anti-hack procedures.
- Added `/autosavechatlog` command and configuration setting (defaults to false).
- Improved how JJ2+ logging works in general. In particular, logging for multiple instances of JJ2 is handled better.
- Added ExtendedTNT and TNTDamage configuration settings.
- Added `/selfswap` command and configuration setting (defaults to true).
- Added `/alwaysupdatepos` command and configuration setting (defaults to false).
- LateJoiners configuration setting now defaults to false.
- In LRS and XLRS, players' lives in the Game Info (F9) screen now appear yellow.
- Updated list server addresses located in JJ2's memory (i.e. NOT in registry keys) to use list1.digiex.net and list2.digiex.net.
- Added `/latestversiononly` command and configuration setting (defaults to false).
- Added `/sdteampointdec` command and configuration setting (defaults to true).
- Added `/ffpointdec` command and configuration setting (defaults to false).
- Added a minor section about the Playlog in this readme after Known Issues.

### Apr 9, 2008

- Fixed glitch where clients could not mute players other than the server.
- Fixed glitch where saving the chatlog changes the current working directory of JJ2.
- Remembered to mention the fix for "<player> captured the flag" messages that appeared repeatedly for clients, which was caused by a flag holder colliding into an unmasked border of a CTF level (client-side fix).
- Added older features from Carrotade to the readme.
- LevelList.ini updated: Removed duplicate "[TeamBattle]".

### Apr 5, 2008

- Removed Jazz2+.exe and added plusifier.exe, which can be used to make an exe that can run plus.dll.
- Made beta public, with virtually no last-minute testing.

### Apr 3, 2008

- Fixed glitch when Auto Shuffle is on during Jailbreak, and server dies after warping out of jail.
- Fixed glitch where Auto Shuffle caused players to start at the wrong positions.
- Adjusted how certain packets are sent to hopefully solve sudden crashes for clients in Jailbreak and Pestilence once and for all.
- Added local fix for clients so that certain packets from the server can't cause crashes.
- Added JJ2+ server feature to help alleviate lag clones for clients.
- Clients running JJ2+ no longer see "Game is currently..." messages when a level starts.
- Fixed glitch where game mode and max score changes kick non-Plus clients in private servers and cause glitches for non-Plus clients who are connecting.
- When Plus Only is enabled, players running the latest version of JJ2+
- Won't lose control (and potentially get stuck) when they get hit before or after warping.
- (clients) won't automatically flash locally when hit by the shockwaves of RFs and TNT.
- Fixed glitch where clients would flash when they aren't supposed to (I'd rather not explain this one...)
- Possibly other fixes/features I forgot to mention. I want this update tested as soon as possible.

### Mar 22, 2008

- Fixed glitches caused by rushing the last update:
- Fixed team score glitch in Team Battle when a player self-destructs into a pit.
- Fixed glitch where blinking players are allowed to cause damage to others.
- Fixed glitch in 1.23 where powered-up ice projectiles travel in opposite directions when shot while facing left (a local fix, exactly like the fix TSF has always used).
- For clients running JJ2+, "<team> scored a point" is no longer displayed when a team's score decreases.
- Fixed minor glitch when Even Teams is on and the server joins the game after spectating/idling.
- Added `/nosplitscreeners` command and configuration setting (defaults to false).
- Added `/autoshuffle` command and configuration setting (defaults to false).
- Adjusted `/shuffle` command so that it can be used at any time in CTF mode.
- When Plus Only is enabled in Roast Tag, players running the latest version of JJ2+ now can see an arrow pointing to the ring holder if there is one.
- When no one has the flag in Flag Run, players running the latest version of JJ2+ can now see an arrow pointing to the nearest place the flag can be captured.
- Fixed glitch where spectating clients are unable to properly "rejoin" the game when they stop spectating (thanks for pointing it out, cooba).
- Added `/mute` and `/unmute` commands.
- Renamed files from 'cade' to 'plus'. This means Jazz2+.exe and plus.exe now use plus.dll.
- Updated the dll loader (plus.exe) to use Gry's method, since the original method was too unreliable.

### Mar 14, 2008

- Added `/plusonly` command.
- In configuration ini file, moved HfkMaxHealth, HfkHealthInc, and FriendlyFire from [CustomMode] to [Add-on].
- Added PunishSDs configuration setting.
- Fixed glitch where Pregame Time Limit doesn't save the configuration setting for 15s and 30s time limits properly.
- HFK no longer reduces the HFK Max Health setting if HFK Max Health is lower than the general Max Health, but players will still not be able to get more health than the general Max Health. See `/hfkmaxhealth` and `/maxhealth` commands.
- Added `/starthealth` and `/maxhealth` commands and configuration settings (both default to 'Default'). Warning: Not friendly to clients not running the latest version of JJ2+.
- Fixed glitch for clients related to 'CTF' games in levels that don't have both flags (false "captured the flag" messages).
- Added additional disconnect messages for the 'Network Error' screen.
- For the server: If a player is running an old/incompatible version of JJ2+, a red circle now appears behind the Plus sign shown next to that player's name on the Game Info (F9) screen.
- Friendly Fire no longer affects Roast Tag. This means there's no longer the option to allow players who don't have the ring and aren't the bottom feeder to hurt each other when someone has the ring (not that it was used often). Friendly Fire still doesn't affect Pestilence.
- Friendly Fire now affects team games if Plus Only is enabled (clients need latest JJ2+ version).
- When Plus Only is enabled, players will be unable to hit or push other players under certain conditions:
- In Roast Tag, when there is a ring holder and neither the killer or the victim is the ring holder or the bottom feeder.
- In Pestilence, zombies can't hit/push other zombies. And when there's at least one zombie, non-zombies can't hit/push other non-zombies.
- In Jailbreak, free players can't hit/push jailed players.
- When Passing, Friendly Fire, and Plus Only are enabled, a pass to another teammate can be done with any hit.
- Modified `/swap` command so that flag holder's team can be changed (it slightly distorts player stats, but then again, so does `/k` and a few other commands).
- In Jailbreak, players running the latest version of JJ2+ cannot be freed by the other team or wallclimb. Specifically, players won't be able to freeze objects inside the jail of the other team.

### Feb 17, 2008

- Added shortcut SHIFT+F2 for minimizing JJ2 to tray (blame Gry). Note: cannot be used in fullscreen mode.
- Fixed glitch in Flag Run where the server only sees one flag (either red or blue) captured when a client steals the flag.
- Just a note: the pepper spray fix (for respawning events) probably requires clients to use it too.
- Fixed minor glitch with autostop and autocycle commands when they are turned on during a stopped game.
- During a stopped normal untimed game, "STOPPED" is now displayed at top- right corner.
- When game is stopped, "OT", "PG", and "TG" is displayed to the left of the timer for overtime, pregame, and normal timed games respectively.
- Added timer for JJ2+ clients in JJ2+ servers.
- Added "plus" indicator for JJ2+ clients in JJ2+ servers when F9 is pressed twice (see features).
- Current Custom Mode is now displayed on the left side of the screen when F9 is pressed twice.
- Added `/ban <ip_address>` and `/unban` commands for server (cannot be used by admins).
- Fixed glitch where user gets sent to 'Start Multiplayer game' screen after pressing 'Done' on 'Game Server Setup' screen. This glitch occurs after pressing escape on 'Players on this computer' screen.
- On 'Game Server Setup' screen, pressing 'Done' now sets menu to 'Select a Level' when level does not exist.

### Jan 17, 2008

- Fixed glitch with `/shuffle` where clients could not see the update teams.
- Modified an undocumented feature that may or may not be in the final release.
- Wallclimbing configuration setting now defaults to false.
- Added AllowSpectating configuration setting (defaults to false).
- Fixed glitch in Treasure mode where leaving clients don't explode off their gems. The problem is related to the seeker hole fix...

### Jan 11, 2008

- Added `/wc` (wallclimbing) command and configuration setting (defaults to true).
- Sugar rush music now stops immediately after dying with a sugar rush (not for splitscreeners though...).
- Auto-Stop (still a poor command name) now stops the game after overtime.
- Reduced probability of clients causing damage to others by stomping/kicking/uppercutting the "ghost" of another player.
- Made one more precaution before sending certain packets (in hope of ceasing client crashing problems).
- Added issue with Game Mode and Max Score changes to Known Issues.
- Fixed glitch with `/eventeams` where splitscreeners don't join on the opposite team of the server.
- Fixed glitch where events on the far-left side of levels stop respawning for clients (only the server must be running JJ2+). Such an event is the infamous copter in battle1. Special thanks goes to a random player named Emo for shooting pepper spray (the cause of the glitch) in my Battle Game XC server.
- Updated the dll loader (cade.exe) so that it hopefully works on Wine and I suppose all reasonably versions of Windows. It probably does. The dll loader now requires the dll to be in the same directory as the JJ2 exe though.

### Jan 5, 2008

- Added `/ptrigger` command for changing the triggers of just one player (Note: if a client is splitscreening, this command cannot be used to give each splitscreener of that client different triggers).
- Significantly reduced amount of TCP sent from the server to clients in general.
- This means Jailbreak and Pestilence should cause fewer crashes to clients!
- Fixed `/maxscore` command so it doesn't time-out non-Plus clients.
- Unfortunately, I'm now sending even more TCP to non-Plus clients when changing game mode or score, so it would be a good idea to avoid game mode changes whenever possible.
- Timers for Flag Run and Roast Tag no longer continue when game is stopped.
- The `/rename` command now says "<old_name> was renamed to <new_name>" on success.
- Clients running this program no longer see negative team scores when a team's score is between 128 and 255.
- Added loading issue to Known Issues.
- Added `/changemusic`, `/restartmusic`, and `/np` (now playing) commands.
- Chat field no longer disappears on level cycle.
- Hearts now always display right to left. This makes it easier to see more than 5 hearts on the display.
- Spectators' displays now look similar to the display of the player they are spectating, including number of hearts, roasts/gems, and current weapon (current weapon is based on last fired shot). Since ammo cannot be accurately determined, an infinity sign is used instead of a number.

### Dec 21, 2007

- For LRS and XLRS:
- amount of time for a player not roasting before health getting set to 1 changed from 2 minutes to 3
- Jailed name now only has 1 asterisk (i.e. "BlurredD" becomes "*BlurredD").
- Made order of who gets the flag in Flag Run based on captures.
- i.e. if player 1 has 4 captures and player 2 has 3 captures, and they both go for the flag at the same time, player 2 gets the flag.
- if two or more players who go after the flag have the same number of captures, the flag is given to one of those players randomly.
- Random anti-crash fixes (unfortunately no major fixes for Jailbreak client crashes, yet..)
- In Flag Run, capturing and scoring the flag is now more similar to what's done in normal CTF. Basically this means clients are now more likely to score or capture the flag the instance they try to score or capture.

### Miscellaneous features/fixes added before Dec 21, 2007

- Fixed Team Chat.
- Fixed cycling while minimized (for the most part).
- Weapon Respawn fix.
- Seeker Hole fix (local fix).
- CTF fixes for the following:
- Recapturing enemy flag immediately after death (fixed for the most part).
- Disappearing flags.
- Fixed glitch where clients can join private server without a password (server-side fix).
- Fixed online RF missle glitches:
- Recoil from RF missles no longer causes fake health for clients.
- Recoil from RF missles that were not powered-up now only does 1 heart damage.
- Fixed glitch related to level filename lengths which cause clients to suddenly disconnect.
- Reduced probability of clients getting fake health from carrots (server-side fix).
- Added Spectator Mode. Note that spectating players cannot send or receive team chat.
- Added Flag Passing, which requires the receiver to hold the up arrow when shot by RF missiles by the flag holder.

## New features and bug fixes

Note that this section is updated rather arbitrarily. For a much fuller sense of JJ2+'s contributions, read the Latest Changes section instead.

- Fixed problem (hopefully) where some clients timeout in a server after 30 seconds. This is mainly a server-side fix, but to ensure all UDP packets are received, clients must be running the latest version of JJ2+ as well. Special thanks to SuPrem and Cpp (Overlord) for helping me find the problem.
- Fixed players from appearing to go outside the level (both client and server need to use JJ2+).
- Fixed all major access violation issues.
- Improved how downloading files works.
- Improved how objects spawn.
- Improved issues with fake health.
- SHIFT+F2 minimizes JJ2 to tray (blame Gry). Note: cannot be used in fullscreen mode.
- 32MB is now allocated for JJ2's main memory (previously 9MB for 1.23 and 11MB for TSF). This basically means larger music files and levels can be played locally without any Amnesia errors. Only available in the patched JJ2 exe made with the Plusifier.
- Added music support for MP3/MP2/MP1/OGG/AIFF and better music support for MOD music.
- Implemented BASS audio library which works on top of JJ2's Galaxy Music System.
- BASS version: 2.4.9
- Warning: Users not running the latest version of JJ2+ WILL CRASH if JJ2 attempts to load any music file that is not a supported module music track.
- Added support through command line and j2i files for joining servers that are passworded or on a different version of JJ2. When using the command line, use "-connect" before the IP address.
- Formats:
- <ip_address>[:<port>] [-password=<password>] [-version=<server_version>]
- <ip_address>[:<port>][/[<password>][/<server_version>]]
- Values for <server_version>:
- For 1.23, use: 1.23, 23, 1.21, or 21 (all map to "21 ")
- For TSF, use: 1.24 or 24 (both map to "24 ")
- Examples:
- 127.0.0.1:10052 -password=abc -version=1.24
- 127.0.0.1 -password="pw \w ""spaces"""
- 127.0.0.1/abc/1.21
- 127.0.0.1:10058//1.21
- Note that to use a double quotation mark in a password, the double quotation mark must be "escaped" by another double quotation mark. Backslashes do not need to be escaped.
- TSF JJ2+ users can now join any 1.23 server, and 1.23 JJ2+ users can join all TSF JJ2+ servers.
- 1.23 may now play levels that use TSF tilesets or were otherwise compiled in the TSF JCS, no matter the number of tiles. Enemies exclusive to TSF and HH98 will be displayed as their regular 1.23 counterparts. (XMas Lizard to Lizard, Cat to Doggy Dogg, etc.)
- Overtime and Pregame modes.
- Spectator mode.
- Optionally replacing Pepper Spray with the OEM Fireball gun.
- Server Game Info (F9) features.
- Plus sign shown next to name for players running Plus (blue for 1.23, green for TSF).
- A red circle appears behind the Plus sign if a player is running an old/incompatible version of JJ2+.
- Exclamation point shown next to player names if they are using a different version of JJ2 than the server.
- Other Game Info (F9) features (for both server and clients in Plus servers).
- For JJ2+ clients in JJ2+ servers, gray plus sign shown next to name for players running Plus.
- "C" shown to the right of name to indicate connecting client.
- "D" shown to the right of name to indicate downloading client.
- "A" indicates client has admin access.
- "S" indicates player is spectating.
- "M" indicates player is muted.
- Point count shown for CTF mode.
- Death count shown for Battle and CTF modes.
- On left side when F9 is pressed twice:
- Below the level name and player's position, Current Game or Custom Mode is displayed.
- Below the current Game/Custom mode, the start health (S), max health (M), and the Plus Only status (P) is now displayed. Note that the start health displayed is the minimum of the max health and the actual start health value.
- Holding down tab now displays player list on HUD as long as the key is pressed.
- Can sort the player list on the Game Info (F9) screen differently by pressing CTRL+F9. Default is state 1. Press once for state 2, twice for state 3, and three times for state 1 again. When F9 is pressed twice, the number of the current state will be displayed to the left of the divider. When tab is held down, state 3 is always used.
- State 1:
- Sort players by player number only.
- State 2:
- Sort players who are not connecting before players who are connecting.
- Then sort players who are not spectating before players who are spectating.
- Then sort players by team if CTF mode.
- Then sort players who are not out/zombies/jailed before players who are out/zombies/jailed.
- Then sort players by player number.
- State 3:
- Sorts players as in state 2
- In addition, sort players by number of points/lives/gems/deaths.
- Various game mode improvements.
- New custom modes:
- Pestilence (roasted rabbits get morphed into zombies, so live long and roast for points).
- Last Rabbit Standing (players have lives, last player with lives wins).
- Extended Last Rabbit Standing (players have lives, but win by points).
- Points for 1st, 2nd, and 3rd place get multiplied by 1.5, 1.25, and 1.125 respectively.
- Roast Tag (roast the ring holder, the player with the green name, to become IT).
- Only the player who is IT or becomes IT receives points from roasts.
- Team Battle (roast is 1 team point, i.e. Battle mode, but with teams).
- Death CTF (roast is 1 team point, flag score points equals 1 + number of enemy team).
- On flag scores, either the enemy team or both teams die depending on settings -- see `/resetallteams`.
- Jailbreak (those roasted go to jail and must be freed with ice, score by jailing entire enemy team).
- For those who want to make JB levels:
- Trigger ID 30 is for release prisoners and Trigger ID 29 is for overtime.
- The overtime trigger is mainly meant to prevent freeing players with ice on either team.
- Flag Run (one flag for both teams, score by taking it into the enemy's base).
- Team Last Rabbit Standing (players have lives, team has total lives, last team with lives wins).
- Domination (teams capture control points, get 1 point for each control point they own every 5-20 seconds).
- Head Hunters (roasting gives victim's gems plus one; bring gems to base to score).
- Bringing gems scores `n log n` points, where `n` is your number of gems.
- Special features which are only enabled when Plus Only and/or Latest Version Only is enabled. See Plus Only Features section below.
- Scripting language (AngelScript) support.
- Mouse aim mode.
- Special trigger zones that sets triggers for all players. See Special Trigger Zones section below.
- New and updated JCS Events. See JCS.ini section below to learn more.
- Older features and bug fixes from Carrotade:
- Death from pits (the event at the bottom-right corner of level must be 255).
- Level List cycling. See Level List section below.
- Automatic level cycling.
- Chat, stats, and IP logging.
- Anti-cheat protection.
- Idle player or spammer kicking.
- Idle Server mode.
- Remote Admin.
- Created additional command line arguments (see New Command Line Arguments section below).

Note: See commands below for additional features.

## Known Issues

This is, naturally, only a partial list, but hopefully it covers some of the more egregious issues.

- The TSF: LK Avalon version of JJ2 is not supported and most likely will never be supported.
- Currently, JJ2 performs extremely poorly on Windows 8 in fullscreen mode. See this thread for some suggestions for how to deal with this on your own.
- Downloaders cannot receive chat, for lag reasons.
- Downloaders not running the latest version of JJ2+ may get kicked when the level changes.
- Game Mode and Max Score changes causes glitches for splitscreeners not running JJ2+.
- Changing a player's team may lead to bad triggers (such as for team-based triggers) depending on the level.
- Shuffling teams while splitscreeners are in the server may cause bad triggers as well as other problems.
- Reaching the score limit with Auto-Stop enabled may cause clients not running JJ2+ or using an older version of JJ2+ to see the game end when the level is not cycling.
- Some menu options corresponding to console commands are only available for the player hosting the server, not for remote admins.
- The fireball gun will display as pepper spray for anyone not running a sufficiently recent JJ2+ version.
- Script state is not saved over single player load/saves.
- Leaving the game running for a very long period of time (several weeks or more) may cause certain time-related features to misfunction.
- 1.23's odd ability to read text strings of IDs higher than 15 has been lost, perhaps temporarily.
- Hardware Acceleration mode has been removed from the game.

## Playlog

If `[Logging]Playlog` is set to `true` in your plus.ini file, every time you host an online game its results will be recorded in a `playlog###.txt` file, where ### is a three-digit number representing which open instance of JJ2+ hosted the game. Usually this will be 001, but if you open two instances at once and host a game in the second, for example, the results will be saved to playlog002.txt. Results will be saved whenever a game ends, whether that be at level cycle time or not, and individual players may also have their details recorded if they leave the server, begin spectating, etc. Following is a glossary of terms used in the playlog:

- ID: Which number the player had in the player list, 1-32.
- IP Address: The IPv4 address of a client, or 0.0.0.0 if the host, because hosts do not know their own IP addresses.
- Player Name: The basic name of the player, stripped of any color-changing characters or status markers (e.g. for carrying a flag or being in jail).
- Place: In Race, `1st` is the first person who finished all laps, `2nd` the second person, etc. `N/A` if the player did not finish all laps. In Pestilence or an LRS-based gamemode, how good the player was at staying alive, with `1st` the last person to die, `2nd` the second to last, etc.
- Team: In a CTF-based gamemode, which team the player was on at the time the results were written.
- Points: How many times the player roasted someone, minus the number of times they died to a pit or other environmental hazard.
- Roasts: How many times the player roasted someone.
- Laps: How many laps the player finished in Race.
- FRoasts: Short for Flag Roasts. In CTF, DCTF, or FR, how many times the player roasted an opposing team's flagholder.
- KRoasts: Short for Key Roasts. In CTF or DCTF, how many times the player roasted an opposing team's flagholder allowing for the scoring of a point. In JB, how many times the player roasted the final surviving member of an opposing team.
- Deaths: How many times the player died.
- KDeaths: Short for Key Deaths. In JB, how many times the player was the final surviving member of their team.
- SDs: Short for Self Destructs. How many times the player died to a pit or other environmental hazard.
- Drops: How many times the player was carrying a flag but lost it (usually to being roasted).
- KDrops: Short for Key Drops. How many times the player's dropping a flag allowed another team to score a point.
- Caps: How many times the player captured a flag (or a control point in Domination).
- Scores: How many times the player brought a flag (or one or more gems in Head Hunters) back to their home base.
- ScrPts: Short for Score Points. In DCTF, FR, or Head Hunters, how many points in total the player earned for their team across the various times they scored.
- Solos: In CTF or DCTF, how many times the player scored a point for their team either a) without the opposing team ever capturing the flag or b) as the key roaster for that point.

## Level List

Most levels point to another level as their "next" level, which follows them in sequence. For example, Dungeon Dilemma (castle1.j2l)'s next level is Knight Cap (castle1n.j2l), and Knight Cap's next level is Tossed Salad (carrot1.j2l), and so on. The same is true for multiplayer levels: battle1.j2l points to battle2.j2l, which points to battle3.j2l, which points back to battle1.j2l again, in a loop. JJ2+ allows server hosts and remote admins nonce overrides of those built-in next level settings using the `/n` (changes the next level) and `/c` (changes the next level and immediately loads it, known as "cycling") commands, but also offers a powerful tool that lets server hosts plan out entire sequences of levels in advance: Level Lists.

Level lists are defined in `LevelList.ini`, which comes shipped with JJ2+. (The `-levellistfile` command line option can be used to choose a different filename, but LevelList.ini is the default.) This is the general format of LevelList.ini:

    [Battle]
    001=levelFilename
    002=differentFilename

There is one default list name for every gamemode: [Battle], [CTF], [DCTF], [Domination], and so on. The numbers before the equal signs must be sequential numbers between 001 and 999, and the leading zeros are required. It doesn't matter whether you include or leave out the `.j2l` file extension.

You can enable Level List Cycling using the `/levellist on` command. At this point JJ2+ will pick levels based on the level list named after the current gamemode, ignoring their usual next level settings in favor of the list that you wrote. In many cases, if you haven't written a level list for a specific gamemode, JJ2+ may substitute a different, simpler gamemode's list instead: for example, if you're hosting a Team Battle server but don't have a [TeamBattle] list, JJ2+ will check if you have a [Battle] list instead. At any time you may use `/levellist off` to disable Level List Cycling and go back to normal.

Normally, level 001 in the list will be followed by 002, and then 003, and so on, until it reaches the end and goes back to 001. You may also skip ahead using the `/levellist <number>` command, which does not require any leading zeros: for example, if your server is in level 001 from a list and you use `/levellist 5` and then `/c` to cycle, that will skip over levels 002, 003, and 004.

The `/levellist shuffle` command randomly reorganizes all the levels in the list (without editing LevelList.ini) when you use it, and the `/llautoshuffle on` command randomly reorganizes the list automatically.

Besides the lists named after gamemodes, you may also add any number of other lists named anything you want. (Although their names must use letters, and can't be the keywords `default`, `shuffle`, `on`, `off`, `true`, `false`, `yes`, `no`, `y`, or `n`.) For example, the Double Domination mutator (doubledom.mut) shipped with JJ2+ works best in CTF levels hosted in the Flag Run gamemode, but you might want your [FlagRun] level list to have actual Flag Run levels in it. In this case, you can have two lists:

    [FlagRun]
    001=plusFRLevel

    [DoubleDom]
    001=capture3
    002=capture1

Instead of simply `/levellist on`, to use your custom [DoubleDom] list you would type `/levellist doubledom`. Manually chosen list names like this persist even across gamemode changes, although if you disable Level List Cycling, the next time you enable it your manually chosen list will have been forgotten. The `/levellist default` command also goes back to basing the list name choice solely on the current gamemode.

Each level in a list can even have any number of commands associated with it, which will be executed at the start of the level when it is cycled to (but not when it is restarted using the `/r` command). For example, if you want to host levels that are different sizes, you could require fewer roasts to win in larger levels where roasting is slower.

    [Battle]
    001=battle1 /maxscore 7
    002=battle2 /maxscore 10
    003=battle3 /maxscore 5
    004=battle1 /delist /kick all Thanks for coming!

You can also use most of the `/levellist` commands from the command line while running JJ2 with the `-server` option. `-levellist=<number>` will enable Level List Cycling starting from a specific number in the list; `-levellist=<name>` will manually choose a list name instead of using the gamemode's default (starting at level 001 unless the `number` option is also used); and `-levellist` simply enables Level List Cycling using the default gamemode-based name and the default 001 number. Or typing "levellist" instead of a level filename in the server setup menu screen also works.

## Remote Admin

When Remote Admin is enabled (`/remoteadmin on`), a client can be promoted to an admin and given access to certain server commands. A client can become an admin either by typing the command `/login <password>` or by having an Auto Admin IP address, which allows a client to be automatically promoted to an admin (for a given group) when joining the server

JJ2+ offers the ability to manage admin groups. The admin configuration file (admin.ini) distributed with JJ2+ gives full details about each group property/section, but here is a summary. For each admin group, the following can be set: the password, allowed (or blocked) commands, blocked (blacklisted) level filenames, script privileges, Auto Admin IP addresses, whether the group should be affected by spam kick, whether the group can make the server cycle to levels not in the current Level List (except for blacklisted levels), and whether the group is currently enabled.

The password must be between 8 to 20 characters long and must contain only letters and numbers. If no password or an invalid password has been stored for an admin group in the admin configuration file (admin.ini), a valid password will have to be specified later before that group can be used. Passwords are NOT case sensitive. Any attempt to login (whether Remote Admin is enabled or not) as well as any command issued by an admin will be hidden to any player in the server who is not an admin.

Script privileges specified in the [GroupName.Privileges] section of the admin configuration file should take one of the following forms:

    privilege
    module:privilege

where `module` is the file name of the script for which the privilege is enabled, and `privilege` is a script-specific name of a privilege. Both `module` and `privilege` may only contain letters, digits, underscores ('_'), full stops ('.'), and hyphens ('-'). Both can also contain wildcards '?', which matches any single character, and '*', which matches a sequence of characters of any length, including an empty sequence. The shortened form which does not specify module name is shorthand for `*:privilege`. Notice in particular that if the Privileges section only contains the following entry:

    *

the admin will have access to all privileges. Privileges are not case sensitive. By design, scripts are never obligated to test privileges to perform an action, thus it's responsibility of the script writer to perform any checks and provide users with information on what entries they may want to add to their admin configuration file.

The server and admins are able to use Admin Chat--chat only viewable by the server and admins--by prefixing their chat messages with ">". Pressing `F9` or `Tab` will show players with Admin Access with a green "A" next to their name. Since an admin may have considerable access to server commands, it is especially important to make sure those who have the admin password can be trusted.

## Control Schemes

JJ2+ allows players to edit their keyboard control mapping schemes from ingame, rather than only from the main menu, even in online servers. To modify these controls, press Esc and select the "Controls" option from the menu that appears. (If your JJ2 is configured to use a language other than English, this option will have some other name instead.)

Editing control schemes from this ingame menu works essentially the same way as from the main menu: use the arrow keys to select the control (e.g. jump) you want to specify a key for, press space or enter, then press the key you want to use (e.g. left ctrl). Unlike the main menu control scheme setup screen, the primary, secondary, and middle mouse buttons are available options here, and you are allowed to assign the same key to multiple controls or multiple schemes, although you really shouldn't.

In the event that you are playing with only one local player, your control scheme is "Keyboard 1" (or its equivalent in your current language), and mouse aiming is enabled in the current level or server, you will use the special "Kbd/Mouse" control scheme instead of Keyboard 1. This is preconfigured to allow either arrow keys or WSAD controls, with your primary mouse button serving as an alternate fire key, but you may configure this control scheme just like the other two if you so wish.

Note that if you set any of the controls for Keyboard 1 or Keyboard 2 to use the mouse buttons, and then try to edit that control scheme from JJ2's native main menu control scheme editing screen, JJ2+ may crash. Additionally, normal unpatched JJ2 will not recive input from the mouse even if it is included in a control scheme.

Note that this ingame menu only supports editing the keyboard-based control schemes. Support for joysticks depends minimally on some kind user volunteering to pay for one or more joysticks for testing the necessary code with.

## Race

JJ2+ takes regular JJ2's Race gamemode and makes it work online. Any Race level made for regular JJ2 will also work in JJ2+. The end of the track should have a Warp event with the "SetLap" parameter set to 1: passing through this warp will cause a player to advance to the next lap. In order for an online server to properly register the lap warp, though, the "Fast" parameter must be set to 0, and the track must take at least five seconds to complete. If Plus Only is enabled, End of Level events also function as lap-ending warps, meaning that Single Player (or Treasure Hunt) levels can also be run in Race mode.

The `/maxscore` command is used to set the number of laps players must complete.

You can give your Race level a minimap by placing Text events as waypoints along the track. (See the included plusRace#.j2l levels for examples.) Set their TextID parameters to 100 or higher, and their AngelScript parameters to 0. The minimap will be drawn as a series of lines between subsequent TextID numbers: a line will be drawn between TextID 100 and 101, then another between 101 and 102, and so on. Skip a TextID to not draw a line between waypoints, such as if there's a warp in the middle of the track. Players may hide or re-show the minimap by pressing `F10`.

If you place multiple Text events with the same TextID, and they all use the same value for the Offset parameter, the minimap will center the waypoint to the unweighted center of all copies of that TextID. You can also create multiple waypoints on the minimap if you use different values for the Offset parameter, in case the track splits.

It's not necessary for players to cross through waypoint Text events, but it helps, because an arrow will point to what the game thinks is your next waypoint, and they're used to guess what players' relative ranks are if they're in the same lap.

## Domination

Teams try to capture the control points in a level. Each team gains a point for each control point separately every 5-20 seconds depending on when it was captured. The number of seconds between each score depends on the total number of control points in the level:

1-4 control points: 5 seconds

5-8 control points: 10 seconds

9-12 control points: 15 seconds

13-16 control points: 20 seconds

Neutral control points (that is, control points not controlled by any team yet) are shown as a spinning white circle. Once a player touches it, after a one second delay the control point will turn into a Super Gem in the color of the player's team. Captured control points can then be captured by another team in a similar manner. The team that currently holds a control point can prevent its capture by another team by touching the control point within a second after another team has touched it.

In JCS, control points are created by marking any event as Easy or Hard. Control points marked as "Easy" face to the right, while control points marked as "Hard" face to the left. If the event used is a text event, the control point is named after the text string used with that event. If the event used is NOT a text event, the control point will be automatically named based on it's relative position to other control points. For example, if there are two control points and none of them use a text event, the control point closest to the top and furthest to the left would be named "Control Point 1", and the other control point would be named "Control Point 2." The control point ordering goes from top to bottom and left to right.

CTF base events are also treated as control points, meaning any CTF or FR level may also be played as DOM, although then the bases' difficulty settings should be left at Normal to avoid confusion. In this case, the events' Direction parameters are used to determine the control points' directions instead, and they are assigned the default "Control Point #" names.

Domination is enabled by the `/dom` command, and supports the Green and Yellow teams.

## Flag Run

In this gamemode derived from Unreal Tournament 2004, there is one "flag" which both teams can capture, usually located somewhere in the middle of the level. The flag holder must return the flag to the opponent's base before time runs out or else the flag holder will self-destruct and lose the flag. The flag holder's team has 45 seconds to score on flag captures, and 30 seconds to score on flag steals. A flag can be stolen by roasting the flag holder when he/she has 15 seconds or less to score.

Scoring:

- 45-31 seconds left: 3 points + extra points
- 30-16 seconds left: 2 points + extra points
- 15-0 seconds left: 1 point + extra points

On flag captures, extra points start at 0.

On flag passes and flag steals, extra points get set to 1.

Each roast by the flag holder adds 1 extra point.

Extra points can be 3 at the most.

Flag Run is enabled by the `/fr` command.

## Head Hunters

Named for the Quake 1 modification, Head Hunters may be played in any standard CTF level. Flags cannot be captured, so players must instead collect gems and bring them back to their teams' bases. Whenever a player is roasted, they will drop all the gems they were carrying plus one additional gem. (You cannot pick up gems that you yourself dropped.) Most CTF levels do not include any gems of their own, so you will need to get them by roasting, since even a player carrying zero gems will drop a gem (0+1=1) when roasted.

Scoring: The number of points scored for bringing `n` gems back to your team's base is calculated by the formula `n log n`. You must bring at least two gems to score any points at all. Bringing back two gem scores 1 point; three gems, 3 points; four gems, 5 points; five gems, 8 points; and so on. The more gems you collect before returning to your base, the higher your team's score will be, but the more the other team will try to roast you before you can get there.

The top left corner of the screen displays your current gem count (pink), and how many points your gems would currently score for your team, if any (silver). The player list visible by pressing `F9` or `Tab` likewise displays pink and silver numbers for each player with these same meanings: gem count and current potential score.

So long as the server is running 5.0 or above, clients running older versions of JJ2+ or even vanilla JJ2 may participate in Head Hunters games. They will not be able to see other players' gem counts in the HUD, however, and may incorrectly see themselves as able to collect their own dropped gems (although the server will ignore this). If the server is running a version between 5.0 and 5.6, it will use a different, more extreme scoring formula instead of `n log n`.

The `/gemtransfer` command may be used in Head Hunters to make it so that players instantly acquire any gems from roasting other players, rather than having to physically pick them up.

If you die from a self-inflicted pit death in Head Hunters, and you are carrying at least one gem, your team will lose a point. (Or if your team has no points to begin with, you will be reset to 1 health instead.)

Head Hunters is enabled by the `/head` command.

## Roast Tag

This is a custom gametype where one player can become it (i.e. the player who has "Eva's Ring" and has a green name), and everyone else tries to roast that player. When no one is it yet, there is a free-for-all, and the first player to get a roast receives three points then becomes it. Afterwards, any time a player kills the one that is it, the killer will become it. In addition, the player with the least points and most deaths will become the bottom feeder and will get a red name. Whenever someone is it, the other players, excluding the bottom feeder, cannot receive points unless they roast the player who is it. The bottom feeder can receive one point for roasting normal players (i.e. players without colored names).

After the first roast, the player who is it receives one point for roasting a normal player, and the points received increase by one after each roast of a normal player for a maximum of five points. Whoever is it will always receive three points for roasting the bottom feeder. Furthermore, the player that is it must get a roast every 90 seconds, or else that player will lose a point and cease to be it. After that, there is another free-for-all.

Roast Tag is enabled by the `/rt` command.

## Team Last Rabbit Standing

Teams have a set number of lives which are divided among the players of a team. No player cannot receive more points than Max Lives. If there are lives left over, they go into a team's reserves. When players lose all their lives, and their team has reserves, the remaining reserves are divided among all players of the same team who are out. Game ends when only one team has remaining lives left.

Team Last Rabbit Standing is enabled by the `/tlrs` command, and supports the Green and Yellow teams.

## Pit Levels

Enabling pits makes it so players die when they hit the bottom of the level. If ammo, carrots, or other pickups are shot down and fall into a pit, they will be destroyed. For a level to be able to use pits, the event at the bottom-right corner of level must be "MCE Event" (#255). If the event in the bottom-right corner of the level is "One Way" (#1) instead of #255, the bottom of the level will function as a solid floor, instead of as a death pit.

Fly carrots, airboards, copters, and water are recommended not to be used with pits. Start positions, warp targets, and platforms should not be placed too close to the bottom of a level since this may cause clients to get stuck at the bottom. Warp targets where players can fall into a pit without landing on a platform must especially be avoided.

## Trigger Zones

Some things to know first: Whenever a client first spawns in a level, the client receives all of the server's trigger settings. This behavior is needed to make many levels work, but causes problems for others. Levels that will have problems include those which use a trigger for team-based routes. This section addresses these issues.

With JJ2+, the trigger IDs of the trigger zones placed on the bottom row of a level will receive special properties. Several trigger zones have specific uses. When the server sends its trigger settings to clients, the trigger settings will be adjusted depending on the client. For the following triggers, note that "Position <number>" means place the trigger zone at position (<number>, <level_height>) in JCS. For example, to set the server trigger in a level with 50 as its height, you would place a trigger zone at (2, 50).

- Position 1: Team trigger
- When the trigger zone's onoff state equals 0, the trigger is set on for red team, off for blue team.
- When the trigger zone's onoff state equals 1, the trigger is set on for blue team, off for red team.
- The behavior of team triggers for the green and yellow teams is currently undefined, because they do not currently work for any gamemode that lends itself toward team-focused level design.
- Position 2: Server trigger
- The trigger is set on for server, off for clients.
- Position 3: Overtime trigger
- The trigger is always set on when overtime begins.

Any other trigger zone placed on the bottom row of a level will have its trigger set to off when trigger settings are sent to clients. In addition, clients running the latest version of JJ2+ will always ignore their trigger settings.

Note: I plan on giving other uses for trigger zones after position 3, so if you want a trigger to always be off/ignored by clients, place its trigger zone at the bottom right of your level.

## JCS.ini

To use special events recognized only by JJ2+, you must replace certain lines in your JCS.ini, which should be located in the same folder as JCS.exe. It's recommended to update JCS.ini before opening levels that take advantage of these JCS event changes, since some of the level's data may be lost when they attempt to save it.

### Feb 2023 Additions (5.11)

H-Pole and V-Pole events have a new "Delay" parameter which lets you set how many ticks the player should spin around the pole before launching off in some direction. If left at 0, the default value of 70 (one second) is used.

    6=H-Pole                            |+|Object    |H-Pole |       |Delay:7
    7=V-Pole                            |+|Object    |V-Pole |       |Delay:7

### Dec 2022 Additions (5.10)

Several new textured background effects have been added to JJ2 besides "Warp Horizon." The first, "Tunnel," is most similar to Warp Horizon, except that it draws the texture in a circle around a fade spot instead of as two planes above and below a fade line. See `Psych2.j2l` for an example.

The "Menu" textured background is the familiar effect from JJ2's main menus, complete with numerous little Jazz Jackrabbit 2 logos. The "Palrow 16," "Palrow 32," and "Palrow 256" parameters choose which colors from the tileset palette each layer of the background will use. For example, if you set Palrow 256 to 112, the JJ2 logos will only use colors from the 112-127 range. No layer uses all 16 colors from a row, so feel free to move the number up and down a little for the best-looking result.

(Some tilesets' palettes have gradients ranging from dark to light, and others from light to dark. Therefore, checking the "Parallaxing Stars" checkbox with a Menu textured background will reverse the background's expectations for which order to grab its colors in.)

The "Tile Menu" textured background uses the same code as the "Menu" background to draw, but draws tiles from the tileset instead! The front layer is filled with the 8x8 texture in layer 8 (or whatever texture is specified with the AngelScript property `jjLAYER::texture`). The middle layer is filled with the 2x2 square set of tiles in the top left corner of layer 4, from 0,0 to 1,1, and the back layer is filled with tile 0,2 in layer 4. Checking the "Parallaxing Stars" checkbox doubles the size at which the layers are drawn to be closer to their normal size as tiles.

The "Wave" textured background draws the repeating texture, similar to an untextured 8×8 layer, but may apply sine wave distortions to the texture if either the "Hor Length" (horizontal wavelength, for horizontal distortions to the texture) and/or "Ver Length" (vertical wavelength) properties are non-zero. Recommended wavelength numbers are powers of two minus one: 255, 127, and so on, down to 0 for no distortion at all. "Wave Spd" (wave speed) moves the distortion waves along the texture at that constant speed, and is treated as a signed byte: positive values (e.g. 1 or 2) move the waves up and left, and negative values (e.g. 255 or 254, treated as -1 and -2 respectively) move the waves down/right. By checking the "Parallaxing Stars" checkbox you can rotate the wave speed to move up/right or down/left instead. The AngelScript jjLAYER properties `wave.amplitudeX` and `wave.amplitudeY` are used to determine the waves' amplitudes.

The "Cylinder" textured background is similar to "Warp Horizon" but more curved and with a fainter fade effect, as if the player is inside a horizontal tube. Checking the "Parallaxing Stars" checkbox zooms out from the tube a bit, drawing the texture at a reduced size and increasing the curvature.

The "Reflection" effect draws a 3D surface covering the bottom half of the screen, akin to those drawn by Warp Horizon, except that the surface is reflective, effectively mirroring the top half of the screen. Because only layers further away than the textured layer are mirrored, this effect is only useful when placed on layers other than the furthest background layer. In fact, Reflection may even mirror game sprites if placed on foreground layers.

The used texture determines the shape and size of distortions in the reflection. An entirely single-color texture will result in a perfectly symmetrical reflection, whereas most textures designed for textured backgrounds will give it appearance of a body of water. Parameters of reflection modifiable in JCS are Alpha, Distance, and Amplitude. Alpha determines intensity of the color overlaid over the reflection (palette entry 192 by default unless changed using AngelScript jjLAYER property `reflection.tintColor`), Distance adjusts how close the water appears to be to the camera view, and Amplitude affects strength of the distortion. Additionally, the Parallaxing stars background box may be checked to apply a horizontal blur effect to the outcome in 16-bit color mode.

      #JCS version:
    0=Warp Horizon			|Fade Red  |Fade Green |Fade Blue
    1=Tunnel			|Fade Red  |Fade Green |Fade Blue
    2=Menu				|Palrow 16 |Palrow 32  |Palrow 256
    3=Tile Menu
    4=Wave				|Hor Length|Ver Length |Wave Spd
    5=Cylinder			|Fade Red  |Fade Green |Fade Blue
    6=Reflection			|Alpha     |Distance   |Amplitude
      #MLLE version:
    0=3D Planes                   |+|Parallaxing stars|Fade Color
    1=Tunnel                      |+|Spiral|Fade Color
    2=Menu                        |-|Reverse gradients|Palrow 16|Palrow 32|Palrow 256
    3=Tile Menu                   |-|Full size
    4=Wave                        |-|Swap Angles|Hor Wlength|Ver Wavelength|WSpeed
    5=Cylinder                    |+|Half size|Fade Color
    6=Reflection                  |-|Blur|Alpha|Distance|Amplitude

Bilsy bosses have a new "Falls" parameter. When it's set to 1, each time they teleport they will automatically fall down to the nearest masked surface, rather than always stay at the same vertical coordinate.

      #JCS version:
    114=Bilsy Boss                      |-|Boss      |Bilsy  |Boss   |EndText:4|Falls:1
    251=Xmas Bilsy Boss                 |-|Boss      |XMBilsy|Boss   |EndText:4|Falls:1
      #MLLE version:
    114=Bilsy                           |-|Boss      |Bilsy  |       |EndText:t4|Falls:c1
    251=Xmas Bilsy                      |-|Boss      |XMBilsy|       |EndText:t4|Falls:c1

Bolly (event 235) has a new "NoCeiling" parameter. When it's set to 1, they can move farther up than three tiles above their starting position.

      #JCS version:
    235=Bolly Boss                      |-|Boss      |Bolly  |Boss   |EndText:4|NoCeiling:1
      #MLLE version:
    235=Bolly                           |-|Boss      |Bolly  |       |EndText:t4|NoCeiling:c1

### Jul 9 2016 Additions (5.3)

A minor new tile type has been added to JJ2+: 2, "Opaque." Tiles of this type are always drawn normally. This only ever makes a difference in layers that are configured in AngelScript to be drawn using alternate sprite modes. In those cases, tile types 0 (default), 4, and 5 will all be drawn using that alternate sprite mode, but tile type 2 (and 1, 3, and 6) will override that be drawn in all layers as fully opaque (or translucent, invisible, or frozen) instead.

    1=Translucent
    2=Opaque
    3=Invisible
    4=Caption
    5=Heat Effect
    6=Frozen

### Feb 14 2015 Additions (5.0)

Multiplayer Level Start (event 31) can be expanded to support four teams in the simplest possible way: set Team to 2 for green or 3 for yellow. Whenever a player spawns in a team-based game, they will compare the list of currently enabled teams to the list of teams that have team-specific start positions. If there is at least one enabled team (not necessarily the team the player is actually on) without its own start position/s, the player will spawn at any start position at random; otherwise they will spawn at a start position specific to their team.

      #JCS version:
    31=Multiplayer Level Start          |+|StartPos  |MP     |Start  |Team:2
      #MLLE version:
    31=Start Position (Multiplayer)     |+|SignPost  |MP     |Start  |Team:{Blue, Red, Green, Yellow}2

Bouncer Ammo+15 (event 54) can be used to create +15 ammo crates for any of the eight non-Blaster weapons, including TNT, Gun8, and Electro-Blaster, which do not have dedicated events of their own. In order to set the parameter on a generating ammo crate (for example, in a multiplayer level), you are recommended to turn on the `jjDelayGeneratedCrateOrigins` option in AngelScript and place the generator directly above an MCE Event event (described below) with the proper parameter.

      #JCS version:
    54=Bouncer Ammo+15                  |+|Ammo      |Gun2   |Am+15  |Weapon:3
      #MLLE version:
    54=Ammo+15                          |+|Ammo      |Gun2   |Am+15  |Weapon:{Bouncer, Ice, Seeker, RF, Toaster, TNT, Gun8, EB}3

Airboard (event 59) allows you to set the delay time before the next airboard pickup spawns. This defaults to 30 seconds.

    59=Airboard                         |+|Object    |Air    |Board  |Delay Secs:5

Morph Into Bird (event 94) provides a one-bit parameter for morphing into the shooting bird (red) instead of the diving bird (blue).

    94=Morph Into Bird                  |-|Morph     |Bird   |Morph  |Flip: 1

Gem Ring (event 192)'s Length and Speed parameters are now properly read by JJ2+, both defaulting to 8. Additionally, gem rings can be used to create rings of any object (with Red Gem as the default pick). This works best with other pickups, but other objects may be used with varying success, including enemies, bullets, and more.

    192=Gem Ring                        |+|Gem       |Gem    |Ring   |Length:5|Speed:5|Event:8

Snow (event 238) produces its snowflake particles much more randomly than in vanilla JJ2, and moreover provides several new options for the effect:

"Intensity" determines how frequently new snowflakes are created. Vanilla JJ2 uses Intensity 0, but you can ramp it up to 3 to make the screen much busier.

Setting "Outdoors" to 1 causes snow to appear only where layer 4 is transparent, rather than appearing inside of buildings for no obvious reason. This only checks for pixels in layer 4, however, even if other layers share its size and speed values.

Setting "Off" to 1 disables the previously established snow effect when the event is first encountered, making the level totally free of ambient particle effects.

The "Type" parameter replaces snowflakes with several other types of particle: 0 makes snow, 1 makes white flowers that also look like snow, 2 makes raindrops, and 3 replaces the broken Leaf event by creating falling leaves (which collide with masked tiles if "Outdoors" is set to 1).

      #JCS version:
    238=Snow                            |-|Scenery   |Snow   |Particles|Intensity:2|Outdoors:1|Off:1|Type:2
      #MLLE version:
    238=Activate Snow Effect            |-|Scenery   |Snow   |Particles|Intensity:2|Outdoors:c1|Off:c1|Type:{Snow, Flowers, Rain, Leaf}2

No Fire Zone (event 245) now provides much finer control and a wider variety of gameplay alterations. By default, the player is unable to fire while standing in the zone. If "Set To" is set to 2, the player will be unable to fire even after leaving the tile. Setting "Set To" to 1 will disable the effect. Finally, setting "Set To" to 3 will toggle the effect, like the "switch" parameter on trigger zones.

By setting "Var" to 1, the event will turn on and off a reverse gravity mode instead of a no-firing mode. This mode is not yet compatible with bridges, shootable poles, or pinball flippers, but should work flawlessly the rest of the time.

Setting "Var" to 2 instead will make the rabbit invisible both to you and to other players in an online server. Even the name will not be drawn.

      #JCS version:
    245=No Fire Zone                    |+|Area      |No Fire|Zone  |Set To:2|Var:2
      #MLLE version:
    245=No Fire Zone                    |+|Area      |No Fire|Zone  |Set To:{Local, Off, On, Toggle}2|Var:{No Fire, Anti-Grav, Invisibility}2

### Oct 19 2013 Additions (4.2)

Three new tile types have been added to JJ2. "Invisible" tiles are simply not drawn at all; this can be used with tilesets that do not include empty masked tiles on their own, or else to make a certain set of tiles seem to disappear. "Frozen" tiles are drawn blue and semi-translucently, using the same effect as frozen rotating rocks or shootable pole objects. "Heat Effect" tiles, a feature planned for JJ2 but never implemented, are drawn wavily to the screen as if seen through intense heat.

    1=Translucent
    2=Opaque
    3=Invisible
    4=Caption
    5=Heat Effect
    6=Frozen

### Feb 4 2013 Additions (4.1)

Slide (event 5) now provides control over its strength.

    5=Slide                             |+|Modifier  |Slide    |       |Strength:2

### Jan 28 2013 Additions (4.0)

Limit X Scroll (event 24) now offers additional control over the limits placed on horizontal scrolling.

The "Left" parameter specifies what column should be the farthest left point in the level that the player can move to. If left at 0, this defaults to whatever column the event itself is in, for full backwards compatibility.

The "Width" parameter, if greater than 0, specifies the distance in tiles) between the farthest left point and the farthest right point that the player can move to. Additionally, if "Width" is greater than 0, these two points will scroll to their specified targets.

    24=Limit X Scroll                   |+|Modifier  |Limit  |Xscroll|Left:10|Width:10

Bomb Crate (event 52) can be used to create a crate with no default contents at all, only whatever you specify through ExtraEvent and NumEvent. The same change is not applied to other crate events because that would be pointless.

    52=Bomb Crate                       |+|Goodies   |Bomb    |Crate |ExtraEvent:8|NumEvent:4|RandomFly:1|NoBomb:1

Extra Time (event 89) is now used for the Player Timer feature new in JJ2+ (see plusTimerEx.j2l and PlusTimerEx.j2as). Its Seconds parameter defaults to 10 if left empty.

    89=Extra Time                       |+|Goodies   |Extra  |Time   |Seconds:7

The horizontal spring events now have a parameter to reverse their direction from what it would otherwise be, analogous to the "Ceiling" parameter on non-horizontal springs. This should primarily be used to create leftward-facing springs in midair, but may also be used by cruel people to create springs that point directly into walls.

    91=Hor Red Spring                   |+|Spring    |H-Red  |Spring |Empty:2|Keep Y-Speed:1|Delay:4|Reverse:1
    92=Hor Green Spring                 |+|Spring    |H-Green|Spring |Empty:2|Keep Y-Speed:1|Delay:4|Reverse:1
    93=Hor Blue Spring                  |+|Spring    |H-Blue |Spring |Empty:2|Keep Y-Speed:1|Delay:4|Reverse:1

Trigger Crate (event 95) now can disable and toggle triggers as well as enabling them. These parameters work exactly the same as for Trigger Zone, except "off" defaults to enabling the trigger and only disables the trigger when set to 1, whereas Trigger Zone's "onoff" default to disabling the trigger and only enables the trigger when set to 1. Like for the Bouncer Ammo +15 crate above, the `jjDelayGeneratedCrateOrigins` AngelScript option is the easiest way to add a generating trigger crate with specific parameters.

    95=Scenery Trigger Crate            |+|Trigger   |Trig   |Crate  |TriggerID:5|off:1|switch:1

Steady Light (event 148) and Pulze Light (event 149) can now create different types and sizes of light source. The types are:

0. Normal light
1. Single point (ignores the "Size" parameter)
2. Single point (brighter) (ignores the "Size" parameter)
3. Flicker light
4. Bright normal light
5. Laser shield/Illuminate Surroundings
6. Ring of light
7. Ring of light 2

      #JCS version:
    148=Steady Light                    |+|Light     |Steady |Light |Type:3 |Size:7
    149=Pulse Light                     |+|Light     |Pulse  |Light |Speed:8|Sync:4|Type:3|Size:5
      #MLLE version:
    148=Steady Light                    |+|Light     |Steady |Light  |Type: {Normal,Point,Point2,Flicker,Bright,Laser,Ring,Ring2}3 |Size:7
    149=Pulse Light                     |+|Light     |Pulse  |Light  |Speed:8|Sync:4|Type: {Normal,Point,Point2,Flicker,Bright,Laser,Ring,Ring2}3|Size:5

Sucker Tube (event 206) now allows an alternate Noclip Mode. While in Noclip Mode, a player ignores walls and is unfettered by gravity and deceleration. The parameter "BecomeNoclip" determines whether using the event causes the player to enter Noclip Mode; the parameter "Noclip Only" determines whether the player must already be in Noclip Mode to use the event. A player in Noclip Mode cannot use a sucker tube event with Noclip Only set to 0, nor can a player not in Noclip Mode use a sucker tube event with Noclip Only set to 1.

Thus, to enter Noclip Mode, Noclip Only should be set to 0 and BecomeNoclip to 1. To resume normal play, Noclip Only should be set to 1 and BecomeNoclip to 0.

    206=Sucker Tube                     |+|Object    |Suck   |      |X-Speed:-7|Y-Speed:-7|Trig Sample:1|BecomeNoclip:1|Noclip Only:1|WaitTime:3

Text (event 207) now allows the player to view only one substring of a greater help string. The substrings are delimited by the vertical pipe character (|), just like for the end of level events, and "Offset" determines which substring will be viewed. The first substring cannot be displayed independently, since an Offset value of 0 will default to displaying the entire string.

For example, with help string 2 being set to "Zero|One|Two|Three", setting TextID to 2 and Offset to 3 will display the word "Three" onscreen, instead of the entire help string. Offset 1 will display "One", and Offset 0 will display "Zero|One|Two|Three".

See plus-angelscript.html for information about the "AngelScript" parameter.

    207=Text                            |+|Trigger   |Text   |      |TextID:8|Vanish:1|AngelScript:1|Offset:8

Water Level (event 208) can be configured to allow ambient lighting and water to exist simultaneously if the "Lighting" parameter is set to 1. Alternatively, setting it to 3 will ignore the level's ambient lighting setting but will cause the level to appear progressively darker the farther underwater the player is. Value 2 is not yet implemented and so should not be used.

      #JCS version:
    208=Water Level                     |+|Scenery   |Water  |      |Height (Tiles):8|Instant:1|Lighting:2
      #MLLE version:
    208=Water Level                     |+|Scenery   |Water  |      |Height (Tiles):8|Instant:c1|Lighting:{Off, On, ???, Lagunicus}2

Warp (event 230) can now warp players instantaneously to their targets, without playing a sound effect or showing warping animations.

    230=Warp                            |+|Area      |Warp   |      |ID:8|Coins:8|SetLap:1|ShowAnim:1|Fast:1

The Rocket Turtle boss has received a significant overhaul for its movement and its interaction with the Area ID events. (Or "Path", since "Area ID" is a completely meaningless name.) To use the new alternate behavior, set its "Velocity" parameter to anything other than zero. Leaving Velocity at 0 will use the old, rather buggy behavior for the boss. See plusButterfly.j2l for examples.

Once activated through an Activate Boss event, the Rocket Turtle will begin moving in a specified direction ("Angle") at a specified speed ("Velocity").

There are eight possible angles, beginning at angle 0 (right/east) and rotating clockwise all the way to angle 7 (up-right/northeast).

The Rocket Turtle will maintain this angle and velocity until it hits a Path event, at which point it will adopt the angle/velocity specified by the parameters of that Path event. Unlike in the old Rocket Turtle behavior, this Path event will still exist after being used and can (and should) be used again for infinitely looping paths.

Alternatively, if the "Relative" parameter on the Path event is set to 1, the Rocket Turtle will add the Path event's "Angle" parameter to its existing angle. So an "Angle" of 0 will cause no change: 2 will cause a 90 degree rightward turn; 6 will cause a 90 degree leftward turn; and so on.

If the "RandRev" parameter on the Path event is set to 1, there is a 50% chance the Rocket Turtle will move in the exact opposite direction that the event would otherwise send it in. This allows for more variation in the followed path. For example, Angle=2/Relative=0/RandRev=1 will sometimes send the Rocket Turtle upward and will sometimes send it downward.

The "WaitTime" parameter on the Path event works identically to the same parameter on the "Sucker Tube" event, and will cause the Rocket Turtle to stop at that tile for that number of seconds before continuing on the path.

      #JCS version:
    198=Rocket Turtle                   |-|Boss      |Rock   |Turt  |EndText:4|Velocity:6|Angle:3
    242=Path                            |-|Area      |Path   |      |Velocity:6|Angle:3|Relative:1|RandRev:1|WaitTime:3
      #MLLE version:
    198=Rocket Turtle                   |-|Boss      |Rock   |Turt  |EndText:t4|Velocity:6|Angle:{E,SE,S,SW,W,NW,N,NE}3
    242=Path                            |-|Area      |Path   |      |Velocity:6|Angle:{E,SE,S,SW,W,NW,N,NE}3|Relative:c1|RandRev:c1|WaitTime:3

The Butterfly enemy (event 236) has been recoded to also use the Path events, but as a simple enemy instead of a boss. It interacts with all the Path parameters in exactly the same way that the Rocket Turtle does.

If the Butterfly is created directly through a generator, crate, or three-event MCE, its velocity will default to 8 and its angle to 6 (up). Use a five-event MCE or place the Butterfly event directly in the level (non-generating) to use other initial velocity/angle values.

      #JCS version:
    236=Butterfly                       |-|Enemy     |Butter |Fly   |Velocity:6|Angle:3
      #MLLE version:
    236=Butterfly                       |-|Enemy     |Butter |Fly   |Velocity:6|Angle:{E,SE,S,SW,W,NW,N,NE}3

### Pre-2013 Additions

Lori Level Start (event 32) can be used to create a start position usable only by Lori.

    32=Lori Level Start                 |+|StartPos  |Lori   |Start

Generator (event 216) now has a maximum delay time for generated objects to 255 seconds and an extra parameter so that objects can optionally be delayed from initially spawning until after the delay time specified. The new maximum delay time and the optional initial delay can also be used with MCE events (see MCE Event below).

    216=Generator                       |+|Generator |Gene-  |rator  |Event:8|Delay Secs:8|Initial Delay:1

MCE Event (event 255) can be used to create MCE events with no unwanted side effects. It has the same parameters as the Generator event.

    255=MCE Event                       |+|Area      |MCE    |Event  |Event:8|Delay Secs:8|Initial Delay:1

The end-of-level events now have additional parameters to allow fast level cycling and a greater number of choices for the next level. The TextID parameter is used for the help string number, and each help string can contain multiple filenames separated by a vertical bar (|). If TextID is zero, the default next level filename is used. The Offset parameter is used to select the filename within the help string. For example, if the help string is "beachlevel|castlelevel" and Offset is 1, castlelevel is used end-of-level event.

    17=Area End Of Level                |+|Area      |End    |Area   |Secret:1|Fast:1|TextID:4|Offset:4
    18=Area Warp EOL                    |+|Area      |End    |Warp   |Empty:1|Fast:1|TextID:4|Offset:4
    26=Area Warp Secret                 |+|Area      |Warp   |Secret |Coins:10|TextID:4|Offset:4

Hurt (event 2) can now hurt players from more than one direction, allowing it to be used to create ceiling and wall spikes as well as floor spikes. Set each parameter to 1 to have it hurt players in that direction. If all four are left at 0, JJ2 will act as if "Up" is still set to 1.

    2=Hurt                              |+|Modifier  |Hurt   |       |Up:1|Down:1|Left:1|Right:1

## Plus Only Features

Certain features are only available when Plus Only is enabled:

- When Friendly Fire is also enabled during a team game, teammates are able to hit each other.
- Players are unable to hit or push other players under certain conditions:
- In Roast Tag, when there is a ring holder and neither the killer or the victim is the ring holder or the bottom feeder.
- In Pestilence, zombies can't hit/push other zombies. And when there's at least one zombie, non-zombies can't hit/push other non-zombies.
- In Jailbreak, free players can't hit/push jailed players.
- In Race, players will treat End of Level areas as lap-end warps.
- In Roast Tag, players will see an arrow pointing to the ring holder if there is one.
- When Latest Version Only is also enabled, or in Single Player, levels can be enhanced with the AngelScript scripting language.
- When Latest Version Only is also enabled, or in Single Player, Trigger Crates can toggle or disable triggers (see JCS.ini section).
- When Latest Version Only is also enabled, or in Single Player, No Fire Zones can reverse players' gravity or permanently disable their guns.

## Additional File Folders

If you have multiple installations of JJ2 (for instance, one for 1.23 and one for 1.24), it may be annoying trying to run a file in one folder and discovering that it relies on a file in another. Or perhaps you want to run a level from your cache, but its tileset isn't in your main folder. JJ2+ solves these problems with the plus.ini setting `[General]AdditionalFileFolders`, a comma-separated list of folders that JJ2+ should check whenever it's trying to find a file. For example, if you have 1.23 installed in C:\Games\Jazz2, and 1.24 installed in C:\Games\Jazz2TSF, and you also have a general folder for module music files, then your 1.23 plus.ini would include this line in the [General] section:

    AdditionalFileFolders="C:\Games\Jazz2TSF, C:\Games\Jazz2TSF\Cache, D:\Mod Music"

And your 1.24 plus.ini would include this line:

    AdditionalFileFolders="C:\Games\Jazz2, C:\Games\Jazz2\Cache, D:\Mod Music"

In local games or as the host of an online/network server, JJ2+ will check all additional file folders after checking your main folder (the folder your JJ2+ executable is in) but before checking your cache. Clients in online/network servers reverse the search order, checking first the cache, then the additional file folders, then the main folder.

Not every file-loading operation uses this list of folders—for instance, the Home Cooked Levels list will only return .j2l files in your main folder—but a significant number of them do, including all AngelScript functions and any code you should need while cycling to levels in a multiplayer server.

If you use JCS a lot, you could use this feature to place tilesets you have no interest in using into a different folder, so they wouldn't show up in JCS but would still be usable from within JJ2+. (Although then ordinary, unpatched JJ2 would not be able to find them.) Similarly, you could try storing all levels except your own (and the official levels) in your cache folder.

## Emoji

When chatting in multiplayer servers, certain case-sensitive colon-bordered identifiers may be replaced by small “emoji” images. You can type them manually into the chat prompt by typing e.g. `:foo:`, or press `Ctrl+Period` to bring up the emoji keyboard in the bottom right corner of the window. In order to do this, AngelScript modules must add emoji images, which persist only for one level (although the same code could certainly be run again in the next level). There are no default emoji images if AngelScript does not define any.

The `/emoji <on|off>` command may be used to enable (default) or disable emoji images in chat altogether, but only for the local game instance. You cannot force or prevent the display of images for other players in your server.

## 32-bit Graphics

In normal JJ2, all graphics are 8-bit, meaning that instead of containing actual color data they contain only a series of palette indices, and the combination of those indices and the game's current palette are what the user sees on screen. For example, turtles' shells are not inherently purple; instead, their sprite data contain a series of palette indices that happen to match up to sections of palettes that are usually purple, yet may not be purple in all tilesets or other contexts. Changing the current palette thus recolors all basic graphics, although certain effects are palette-independent when you are playing in 16-bit color, such as water, frozen sprites, and the fade color for some textured backgrounds.

JJ2+ expands your options by allowing for 32-bit graphics, which not only define palette-independent colors but also have full (instead of 1-bit) alpha channels for defining varying opacities. To accomplish this, JJ2+ allows certain modifications to the J2T (tileset) and J2A (animations) file formats, meaning that some tiles and/or sprites may be 32-bit while others are 8-bit. At present, the only tools capable of creating/editing such files are MLLE for building/using 32-bit tilesets and these python scripts for importing/exporting 32-bit sprites. You can also use AngelScript to load 24-bit or 32-bit PNG images.

Whenever one or more 32-bit graphics—either tiles or sprites—are used in a level, the option to play JJ2 in 8-bit color mode is disabled from the menu until the level ends, at which point it will become available again until such time as another 32-bit graphic is used.

32-bit graphics are completely usable in most contexts, but placing 32-bit tiles in a layer used as a textured background is undefined.

## Commands

### For Server and Remote Admins Only

#### Main Server Commands

/list
  Lists server.
/delist
  Delists server.
/relist
  Relists server.
/public
  Makes server public.
/private
  Makes server private
/servername <server_name>
  Renames server. Server name cannot exceed 30 characters.
/maxplayers <number>
  Sets the max number of players allowed in server. Must be between 1 and 32.
/gamemode <mode>
  Sets Game Mode. All vanilla and plus modes are supported, including various aliases/nicknames.
  Warning: Game Mode changes causes glitches for splitscreeners not running JJ2+.
/sp
/coop
/battle
/race
/treasure
/ctf
  Shorthand commands equivalent to `/gamemode` followed by the matching gamemode name.
/password <password>
  Sets server password. Password cannot exceed 14 characters.
/bluescore <number>
/redscore <number>
/greenscore <number>
/yellowscore <number>
  Sets the score of the named team. If the team's new score is greater or equal to Max Score, that team will win.
/maxscore <number>
  Sets Max Score.
  Warning: Max Score changes causes glitches for splitscreeners not running JJ2+.
  Note: In most gamemodes, setting Max Score at or below any player or team's score will cause the level to cycle or stop depending on whether Auto-Stop is enabled.
/difficulty <easy|medium|hard|turbo>
  Sets what the server's Difficulty will be next time the level cycles. Mostly affects whether certain events are loaded from the event map and some details of some enemies' behaviors.
/alwaysupdatepos <on|off>
  Enables/disables always updating clients of other players' positions.
/antiradar <on|off>
  Enables/disables limiting the amount of position information sent by server. If enabled, players will not receive positional and health information about other players not in their view, except flag carriers, about whom only enough information is sent to make the CTF hint arrow point in the right direction. Note that clients using split screen will still receive most of the "real" data; if you are concerned about cheating players, using `/nosplitscreeners on` is advisable. No effect in Race mode, where player positions are constantly shown on screen for clients.
/antiradarspechealth <on|off>
  By default anti-radar mode sends ‘fake’ health information to spectators while it is enabled. With this command, you can make spectators see the actual health of players instead.
/blockdownloads <on|off>
  Enables/disables blocking downloads by clients.
/uploadmusic <on|off>
  Enables/disables uploading music to clients.
/maxuploadpacketsize <bytes>
  Sets the number bytes for the maximum upload packet size for clients using the latest version of JJ2+.*
/maxconnections <number>
  Sets the maximum number of connections allowed for the server. This is different than Max Players which accounts for splitscreeners. Note that clients running JJ2+ but not the latest version cannot join servers where there are 16 or more connections. However, non-Plus clients can join such a server, although they won't be able to see chat from any client (including themselves) who has a connection number above 15.
  Sprites will automatically display correctly for a player's character if clients do not edit their JJ2 version before joining.
/plusonly <on|off>
  Allows only players with JJ2+ to be in the server.
  All players not running JJ2+ are automatically kicked.
  See Plus Only Features section.
/latestversiononly <on|off>
  Restricts the players allowed in the server to all players not running JJ2+ and players running a JJ2+ version that is equal to or greater than the server's JJ2+ version.
  All JJ2+ players not running the latest JJ2+ version are automatically kicked.
  Note that to use Plus Only features, Plus Only must be enabled.
/nosplitscreeners <on|off>
  Allows only players who aren't splitscreeners join the server.
/welcomer <on|off>
  When enabled, clients joining the server are greeted with a custom message.
/welcomemessage <message>
  Sets the welcome message clients see when they join the server if the Welcomer is on.
  For longer messages, manually edit the setting in the configuration file.
  Welcome message cannot exceed 50 characters.
/rename <player> <new_name>
  Changes player's name to a new name.
/k <player>
  Kills player (not counted as a death).
/spawnobjects
  Forces all allowed objects created by generators to spawn if they aren't spawned already.
/allowready <on|off>
  Toggles the availability of the /ready command.
/allowmouseaim <on|off>
  Toggles the availability of clients using mouse aim.
/allowsuicide <on|off>
  Toggles the availability of clients using the !k command to commit suicide.
/allowwalljump <on|off>
  Toggles the availability of the "walljumping" bug.
/ip <client>
  Displays the client's IP address.
  Cannot be used by the server, since the IP addresses of all players are available to the server on the Game Info screen already.
/spaminterval <milliseconds>
  Determines the amount of time in milliseconds for displaying another consecutive chat message by a client. The default value is 1000 milliseconds (1 second), while the maximum value is 10000 milliseconds (10 seconds).
  Setting this to 0 disables the spam kicker entirely.
/whispering <on|off>
  Toggles the availability of players being able to whisper

#### Idle Player Management

/kickidlers <on|off>
  Enables/disables automatically kicking idlers.
/idletime <minutes>
  Sets the max number of minutes a client can idle.

#### Idle Server Commands

/idleserver <on|off>
  Enables/disables Idle Server mode.*
  Automatically enabled after an hour (or 5 minutes if minimized) of server inactivity in a Battle or CTF game.

#### Resolution Command

/maxresolution <width>x<height>
  Sets the maximum viewable area for online games.
  Only players running the latest version of JJ2+ are affected.

#### Spectating

/spectating <on|off>
  Allows/disallows all clients running JJ2+ to request to (un)spectate using the `/spectate` command.
  The host will always be able to spectate even when this setting is disabled, as will remote admins whose admin group allows the `/forcespectate` command, which takes precedent over this setting.
/joinersspectate <on|off>
  Enables/disables automatic spectating for players joining with JJ2+.
  Players not running JJ2+ will not be able to join the server.
/forcespectate <player|all> <on|off>
  Forces spectator mode to turned on/off for specified player or all players, even when `/spectating` is disabled.
  Players not running JJ2+ cannot be forced to spectate.

#### Remote Admin

/remoteadmin <on|off>
  Enables/disables admin access.*
/resetadmins
  Reloads the admin configuration file (admin.ini). If remote admin is enabled and any players are logged in, first logs all players out, then reloads the file and attempts to log all players back in with passwords of their previous groups. Then, for all players who are still not logged in, attempts to automatically log them in based on their IP.*
/admingroup <group> <on|off>
  Enables/disables the specified admin group.*
/setadminpass <group> <password>
  Sets password needed for admins to login for the specified group.*
  Password must be only letters and numbers and between 8 and 20 characters.
/getadminpass <group>
  Displays password needed for admins to login for the specified group. Not available when `/showpasswordsandips` is disabled. *
/addadminip <group> <ip_address>
  Adds an Auto Admin IP address for the specified group.*
/removeadminip <group> <ip_address>
  Removes an Auto Admin IP address for the specified group.*
/addallowedcommand <group> <command>
  Adds an allowed command for the specified group.*
/removeallowedcommand <group> <command>
  Removes an allowed command for the specified group.*
/addblockedcommand <group> <command>
  Adds a blocked command for the specified group.*
/removeblockedcommand <group> <command>
  Removes a blocked command for the specified group.*
/addprivilege <group> <privilege>
  Adds a privilege for the specified group.*
/removeprivilege <group> <privilege>
  Removes a privilege for the specified group.*
/shutup <on|off>
  Only the server and any logged-in remote admins are allowed to chat.

#### Kick/Ban Commands

/kick <player> [<reason>]
  Kicks player. If reason is specified, all players running the latest version of JJ2+ will see the reason.
/ban [<time>{s|m|h|d}] {<player>|<ip_address>} [<reason>]
  Bans specified player or IP address. Asterisks can be used as wildcards for the IP address.
  When banning an IP address, players who have the banned IP will NOT be automatically kicked.
  The optional ban time can be set to a number of seconds, minutes, hours, or days, and ban time must be between 5 seconds and 30 days. If no ban time is specified, the player or IP address is banned indefinitely.
  If reason is specified, all players running the latest version of JJ2+ will see the reason.
  Examples: "/ban 30s 2 Bye" bans player 2 for 30 seconds with a reason of "Bye". "/ban 5h 127.0.0.1" bans IP 127.0.0.1 for 5 hours with no reason given.
/unban <ip_address|all>
  Removes ban for a single or all IP addresses. Asterisks can be used as wildcards.
  This command cannot be used to unban IP addressses banned through JJ2's default ban command or Banlist.lst.

#### Start/Stop, & Time-Based Commands

/start
  Starts game.
/stop
  Stops game
/cstart
  Starts game with a countdown.
/cstop
  Stops game with a countdown.
/nomovement <on|off>
  Enables/Disables no movement for when a game is stopped.
  When enabled and game is stopped: -Players running JJ2+ are restricted of movement. -Players not running JJ2+ are sent to the bottom-left corner.
  When enabled and game is started: -Players running JJ2+ are allowed to move again. -Players not running JJ2+ are roasted (and flags will be lost).
/autostart <on|off>
  Enables/disables Auto-Start. Game automatically starts after the level cycles.
/readystart <on|off>
  Enables/disables Start When All Are Ready. Game automatically starts (after a countdown) if all visible, non-spectating players in the server have used the /ready command. Obviously only applicable if Allow Ready is turned on.
/time
  Displays time limit and time left.
/pregame
  Enables/disables Pregame.
  Pregame is automatically extended if there is not enough active players in the server.
/pgtimelimit <time>[s] [reset]
  Sets Pregame time limit.
/overtime <on|off>
  Enables/disables Overtime.
/otlimit <minutes> [reset]
  Sets Overtime limit.
/autocycle <on|off>
  Enables/disables Auto-Cycling. Level automatically cycles after the time limit is reached.
/autostop <on|off>
  Enables/disables Auto-Stop. Game automatically stops after the time limit is reached or after a player/team wins in any non-SP/Coop mode.
  Warning: Reaching the score limit with Auto-Stop enabled may cause clients not running JJ2+ or using an older version of JJ2+ to see the game end when the level is not cycling.
/timelimit <minutes> [reset]
  Sets time limit for when the game is in Normal (i.e. when it's not Pregame or Overtime).

#### Cycling and Next Level Commands

/c
  Cycles to the next level.
/c <level_filename>
  Sets next level to <level_filename> if it exists, then cycles.
/nr
  Sets next level to current level.
/n
  Displays level filename of the next level.
/n <level_filename>
  Sets next level to <level_filename> if it exists.
/r
  Restarts level (i.e. cycles to current level).
/levellist <on|off>
  Enables/disables Level List Cycling.
/levellist shuffle
  Shuffles levels within the Level List.
/levellist <number>
  Sets next level to the Level List file belonging to the specified number.
/llautoshuffle <on|off>
  Enables/disables automatic shuffling of the levels within the Level List.

#### General CTF Mode Commands

/eventeams <on|off>
  Enables/disables Even Teams. Teams are only made more even when a player joins.
/teams {<blue|red|green|yellow|all> <on|off>|default}
  Enables or disables each of the four team colors. If only one team is enabled, all players will be on that team and (unless Friendly Fire is on) will be unable to hurt each other. Writing "/teams default" will turn Blue and Red on and Green and Yellow off. The Green and Yellow teams are only currently available in the Team Battle, Team Last Rabbit Standing, and Domination custom game modes.
/selfswap <on|off>
  Enables/disables clients to change their own team. When enabled, clients can use !swap, !blue, !red, !green, and !yellow to change teams.
/passing <on|off>
  Enables/disables Flag Passing between teammates (or Gem Passing in Head Hunters). This happens automatically whenever an injured player with a flag (or gems) is near a teammate with full health.
/capturewait <on|off>
  Enables/disables Capture Wait.
/shuffle
  Shuffles all players' teams. Must be done at the beginning of the game.
  Doesn't make sure splitscreeners stay on the same teams.
  Shuffling teams several seconds after a level cycles or while players are still connecting may cause players to spawn at the wrong start positions.
/shuffle <player>
  The same as the general /shuffle command, but only affects one player at a time.
/autoshuffle <on|off>
  Automatically shuffles all player's teams at the start of the level.
  Doesn't make sure splitscreeners stay on the same teams.
  Also, players may not always start at the correct start positions.
/swap <player|all> [blue|red|green|yellow]
  Changes the team for the specified player, or all players.
  Doesn't make sure splitscreeners stay on the same teams.
  If a team parameter is specified, changes the team of the the specified player/s to that team.

#### Mutators

/mutators
  Writes out a list of all mutators that will be in play next time the game cycles, using their names (if defined) or else their filenames. Mutators are AngelScript files that are not tied to any specific level but may instead be activated or deactivated in any level, for example, a script to make seeker missiles slower or a script to make blaster ammo non-infinite. Because mutators may need to run setup code at the beginning of a level, adding a mutator to the active mutator list does not actually run its script until the next cycle, and nor does removing a mutator stop running its script until then.
/mutators all off
  Next time the game cycles, all mutators will be disabled.
/mutators <filename> <on|off>
  Enables or disables a specific mutator on the host's harddrive next time the game cycles. If the filename does not end in `.mut`, it will be appended to the end.

#### Add-on Commands

/starthealth <number|default>
  Sets the amount of health players start with. Can be between 1 and 7.
  Setting Start Health to "default" sets Start Health to the default of the current game mode, which is 5 for Battle and 3 for CTF. If the start health is greater than max health, players will start with max health.
  Warning: If start health isn't equal to the game mode's default, clients not running JJ2+ will be glitched. It is HIGHLY recommended to enable Plus Only.
/maxhealth <number|default>
  Sets the maximum amount of health players can get. Can be between 1 and 7
  Setting Max Health to "default" sets Max Health to the default of the current game mode, which is 5 for Battle and 3 for CTF.
  Warning: If max health isn't equal to the game mode's default, and there are carrots in the level, clients not running JJ2+ will be glitched. It is HIGHLY recommended to enable Plus Only.
/smhealth <number|default>
  Sets both Start Health and Max Health at the same time. See above commands for more information.
/instagib <on|off>
  Enables/disables Instagib. When enabled, all unshielded hits roast opponents instantly.
/frustration <on|off>
  Enables/disables Frustration. When enabled, players who get a roast will also die themselves.
/mutualinjury <on|off>
  Enables/disables Mutual Injury. When enabled, recently hurt players will be able to damage others during a short window of time before starting to blink.
/hfk <on|off>
  Enables/disables Health From Kills. Roast gives players health.
/hfkmaxhealth <number>
  Sets HFK Max Health. Must be between 1 and 7.
  If HFK Max Health is greater than the general max health, players will start with general max health.
/hfkhealthinc <number>
  Sets HFK Health Increase. Must be between -6 and 6.
/da <on|off>
  Enables/disables Damage Amplifier. Fired shots do +1 extra damage.
/noblink <on|off>
  Enables/disables No Blink Mode.
/friendlyfire <on|off>
  Enables/disables Friendly Fire for team games.
  Note: To have an affect, Plus Only must be enabled.
/punishsds <on|off>
  Enables/disables Punishment for Self-Destructs.
/sdteampointdec <on|off>
  Enables/disables team point decreases for Self-Destructs.
  When disabled, a pit death causes a point increase for the other team.
/ffpointdec <on|off>
  Enables/disables point decreases for Friendly Fire.
  When disabled, friendly fire causes a point increase for the other team.
/fastammorespawn <on|off>
  Enables/disables Fast Ammo Respawn (every 5 seconds at the most).
/fastpoweruprespawn <on|off>
  Enables/disables Fast Powerup Respawn (every 5 seconds at the most).
/weakpowerups <on|off>
  Enables/disables Weak Powerups. Makes powerups only do 1 damage.
  Mutually exclusive with Strong Powerups.
/strongpowerups <on|off>
  Enables/disables Strong Powerups. Makes pepper spray, electro-blaster, and ice (when Evil Ice is on) powerups do 2 damage, and gives them distinct appearances from their non-powered-up forms.
  Mutually exclusive with Weak Powerups.
/nopowerups <on|off>
  Enables/disables No Powerups.
/noammocrates <on|off>
  Enables/disables No Ammo Crates.
/noseekerammo <on|off>
  Enables/disables No Seeker Ammo.
/noseekerpowerups <on|off>
  Enables/disables No Seeker Powerups.
/nocarrots <on|off>
  Enables/disables No Carrots.
/noshields <on|off>
  Enables/disables No Shields.
/extendedtnt <on|off>
  When enabled, the maximum distance a player can be hit by TNT in online games increases.
/tntdamage <number>
  Sets amount of damage TNT can inflict. Must be between -6 and 7.
/evilice <on|off>
  When enabled, ice shot by players does 1 heart damage (2 if powered up if Strong Powerups is on) if the victim isn't frozen already.
/fireball <on|off>
  When enabled, pepper spray is replaced with fireball gun from the beta versions of JJ2.
  The fireball gun does 2 damage when powered up even without /strongpowerups.
/corpsesdropammo <on|off>
  When enabled, players who are roasted will drop their ammo as pickups for other players to collect. If a player had more than 15 of an ammo type, they will drop only five pickups; otherwise, the number of pickups for each ammo type will match how much ammo they were carrying at the time of their death. Blaster and/or weapons that are configured in AngelScript to be infinite will never be dropped.
/gemtransfer <on|off>
  When enabled in Treasure Hunt or Head Hunters, gems that would be dropped as objects are instead immediately transferred to the player who hurt/roasted the player losing the gems.
/bulletpush <on|off>
  When enabled, client game instances detect collisions between enemy bullets and local players, and resolve them by pushing those players out of the way, as per the game's original behavior. This can lead to a negative phenomenon where the push causes those players to avoid taking damage from the bullet. When disabled, such client-local collisions are ignored. Regardless of the value of this setting, the only time players are damaged by bullets is when the server detects a collision instead.
  This setting has no effect in Race mode, where collisions between bullets and players are always entirely local.
/injuryknockback <on|off>
  When enabled, players bounce high in the air upon taking damage from a bullet, the height depending on the force of the bullet (i.e. how much damage it deals in single player), following the behavior seen in vanilla JJ2 when playing in local splitscreen or as the server. When disabled, players only experience minimal knockback, similar to touching a Hurt event or being hit by a melee move.
  This setting only affects clients when Bullets Push Players is disabled, since otherwise knockback can be overriden by a push, which means network conditions determine whether knockback happens or not, as per the game's original behavior.
  This setting has no effect in Race mode.
/blastknockback <on|off>
  When enabled, the blasts from certain weapons (particularly seekers, RFs, and TNT) cause additional knockback to nearby players, independent from the above two settings. When disabled, players receive knockback from only their own weapons' blasts (necessary for RF climbing, TNT jumping, and so on).

#### Settings

/resetsettings
  Loads configution settings of plus.ini (automatically done at startup).
  Mainly meant for admins. See "/loadsettings" commands below.

#### Player Stats

/stats
  Logs player stats.*

#### Logging Commands

/chatlog <on|off>
  Enables/disables Chatlog (requires restart).*
/playlog <on|off>
  Enables/disables Playlog (requires restart).*
/iplog <on|off>
  Enables/disables IPlog (requires restart).*
/autosavechatlog <on|off>
  Enables/disables automatic saving of the chatlog.*

#### The ALMIGHTY Trigger Commands

Note: Changing the trigger state of the Server Trigger or Team Trigger may cause unintended results.

/trigger <trigger|all> <on|off>
  Turns specified trigger or all triggers on/off for all players.
/ptrigger <player> <trigger|all> <on|off>
  Turns specified trigger or all triggers on/off for specified player.

#### Game Mode Commands

/latejoiners <on|off>
  Enables/disables Allowing Late Joiners (affects LRS, XLRS, and Pestilence).
/resetallteams <on|off>
  When enabled, both teams have their ammo and health reset after a round ends in Death CTF or Jailbreak.
  For the time being, this means both teams get roasted after a round ends.
/maxlives <number>
  Sets Max Lives. Must be between 1 and 100.
/setlives <player> <lives>
  Sets player lives. Lives must be between 1 and 100.
  Can only be used for LRS, XLRS, and TLRS. Cannot be used during pregame in TLRS.
/livesperteam <lives>
  Sets number of lives each team receives in Team Last Rabbit Standing. Lives must be between 1 and 100.
/maxteamplayers <number>
  For Team Last Rabbit Standing, sets the max number of players allowed to have lives on each team.
  Must be between 1 and 16.
/rt
  Changes game mode to Roast Tag.
/lrs
  Changes game mode to Last Rabbit Standing.
/xlrs
  Changes game mode to Extended Last Rabbit Standing.
/pest
  Changes game mode to Pestilence.
/tb
  Changes game mode to Team Battle.
/dctf
  Changes game mode to Death CTF.
/jb
  Changes game mode to Jailbreak.
/release
  Releases all players in jail if game mode is Jailbreak.
/fr
  Changes game mode to Flag Run.
/tlrs
  Changes game mode to Team Last Rabbit Standing.
/dom
  Changes game mode to Domination.
/head
  Changes game mode to Head Hunters.
/reset
  Resets the game.

* This command cannot be used by admins.

### For Clients and Server running JJ2+

#### Settings

/loadsettings
  Loads configution settings of plus.ini (automatically done at startup).
  See "/resetsettings" command above.
/loadsettings <filename>
  Loads configution settings of the filename specified.
/savesettings
  Saves configution settings to plus.ini.
/savesettings <filename>
  Saves configution settings to the filename specified.
  Filename must be at least 5 characters long ending with the ".ini" extension.

#### Spectating

/spectate <on|off>
  Enables/disables Spectator Mode if user is in a JJ2+ server and Spectating is enabled. The limit of Max Spectators may prevent spectating. If you are spectating because you are out in a LRS/XLRS game, "/spectate on" will make you enter normal Spectator Mode.
/spectate <target>
  Spectate target if user is in a JJ2+ server and Spectating is enabled. The limit of Max Spectators may prevent spectating.
  Target can be:
  - A player number
  - "blue flag"
  - "red flag"
  - "flag" if Flag Run
  - "ring holder" if Roast Tag
  - "bottom feeder" if Roast Tag
  - "cp <number>" for Control Point if Domination

#### Music

/autovolumeleveling <on|off>
  Enables Auto Volume Leveling for music files loaded with BASS audio library.
  When enabled, it automatically attempts to raise the volume level of the music track if it is not loud enough. This feature may momentarily cause a slight slow down to JJ2 as the appropriate volume level is found. JJ2's music volume setting is never adjusted.
  Note that j2b files cannot use this feature.
/modulemusiconly <on|off>
  When enabled, music files with the `.mp3` or `.ogg` file extensions are not loaded. Intended for use when you are streaming or recording gameplay, so that your stream/video is not deleted or demonetized.
/changemusic <music_filename>
  Changes next level to <music_filename> if it exists.
  May cause JJ2 to crash with an Amnesia error.
/restartmusic
  Restarts the music currently being played.
  May cause JJ2 to crash with an Amnesia error, but probably not.

#### 3D Commands

/3D <on|off>
  Switches 3D Mode on or off.
/3D <SBS|TAB>
  Switches 3D Mode on in Side-By-Side or Top-And-Bottom mode, respectively.
  See the 3D Mode section for details.
/3Ddepth <number>
  Sets the depth of the 3D effect. Must be between 0 and 25.
  0 means completely 'flat', whereas 25 is the most agressive 3D depth setting and may cause headaches since it requires you to cross your eyes badly.

#### Other

/quirks <on|off>
  Enables/disables Quirks Mode. When disabled (default), it becomes harder to get stuck in ceilings, it's possible to morph to Lori by physically destroying a morph box, destroying a morph box with a special move morphs you once instead of twice, getting hurt while on an H-Pole event doesn't get you stuck in the floor, and Wind and Belt events can't get you stuck against walls. Turning Quirks Mode on temporarily reenables all those old bugs in case a specific level (e.g. many Ground Force levels) requires one.
/alwaysshowingamepings <on|off>
  Enables/disables always displaying in-game pings on the Game Info (F9) screen.
/maxfps <intensity>
  By default, JJ2+ slightly limits the game's FPS to reduce CPU load. You can set target FPS by editing the plus.ini fields "[General]MaxFPS" (default 120) and "[General]MaxFPSDirectDraw" (default 120) and "[General]MaxFPSMinimized" (default 50), or by using this command (which modifies whatever is the current variable in use, depending on the window properties). Higher target values reduce stuttering (up to your hardware's capabilities) but increase CPU load, and may have unknown unforeseen consequences.
  This may be a temporary setting. We hope to replace it with something more nuanced later. Discuss it in this thread.
/mouseaim <on|off>
  Enables/disables mouse aim mode.
/mute <player>
  Mutes chat from specified player.
  If the server mutes a player, that player cannot use Self-Swap and admin commands.
/unmute <player>
  Unmutes chat from specified player.
/ready
  All local players acquire all available ammo, powerups, and fastfire (if Ready Gives Fast Fire is turned on) and are warped to their CTF base if applicable.
  Only available when the game is stopped at the very beginning, and only if the server has enabled Allow Ready.
/readyff <on|off>
  Enables/disables the /ready command giving you full fastfire when used, in levels with one or more fastfire pickups.
/run <on|off>
  Enables/disables Always Running. Unlike capslock, this works even when there is more than one local player, and has the side benefit of not making everything you type uppercase.
/spectatingcamerashift <on|off>
  Enables/disables whether the camera's focus should shift while spectating another player based on that player's speed and whether they're looking upwards or downwards. When disabled, the spectated player will remain exactly in the center of the screen no matter what they're doing.
/weaponchange <on|off>
  Enables/disables automatically changing weapons upon picking up ammo for a new weapon/getting a new powerup.
/flipmousewheel <on|off>
  Reverses the order of weapon cycling via the mouse wheel.
/me <text>
  Displays <text> as an IRC-style action message. For example, typing "/me is waiting" would produce a "*BlurredD is waiting" message.
/whisper <player> <message>
  Sends a private message to the specified player, only allowed if `/whispering` is turned on. Additionally, to prevent cheating in duels or similar scenarios, spectators may not whisper to non-spectators nor vice versa.
  The shorter aliases "/w" and simply "@" are also available, e.g. "@1 Take your time, Jazz!"
/noctfcolors <on|off>
  When on, players in CTF games will use their normal fur colors (their guns and shoes will not be repainted to match their team), though their names will still use their team colors. This is a local setting only. `/noctfcolours`, with a u, is a recognized alias.
/corpsedelay <seconds>
  Unless playing in Instagib mode, the dead bodies of players will stick around for a number of seconds after being roasted before finally fading away. if seconds equals 0, corpses will not be left behind at all. This is a local setting only and has no effect on gameplay.
/emoji <on|off>
  Enables/disables the display of emoji in chat.
/showpasswordsandips <on|off>
  By default, sensitive information is hidden from the game window: IP addresses are not drawn in the player list, and are censored when using the `/ip` command or when a player is kicked or banned. Passwords are censored in the `/login`, `/password`, and `/setadminpass` commands, as well as when joining or configuring servers. Admin chat is censored. The `/getadminpass` command is not available. You may intentionally enable this setting if you are confident you are not streaming and will not be taking screenshots of your game with this sensitive information visible.

### For Clients running JJ2+

/downloadmusic <on|off>
  Enables/disables downloading music from the server if the server allows it.
  Audio formats client can download: J2B, XM, IT, S3M, MOD, MTM, UMX, MO3, MP3, OGG.
  When downloading music, note that the escape key can be pressed to stop downloading while staying in the server.
/downloadsamemusicversion <on|off>
  When enabled with the Downloading Music setting also enabled, client always downloads music even if a music file with the same name already exists but is a different version (that is, the music file has a different CRC than the version the server has).

### For All Clients in JJ2+ Server

/login <password>
  Allows a client to login if the server allows remote admins and the password is correct.
  No other players, including the server, will be able to see the login attempt. If the server is running JJ2+, the login command and password will not be displayed locally in the chat and instead will be replaced by a message saying "Attempting to login". Password is NOT case sensitive.

## New Command Line Arguments

### Basic

-port=<port>
  Sets server port used for listening for client connections. Default port is 10052.
-list
  Lists the server on the Internet. Requires -server.
-listserver=<hostname>
  Sets preferred list server, which will be tried before any others both when hosting servers and retrieving the server list.
-levellist
  Enables Level List Cycling. Requires -server.
-levellist=<name>
  Enables Level List Cycling and picks the Level List with this name. Requires -server.
-levellist=<number>
  Enables Level List Cycling and loads the specified level number from the Level List. Requires -server.
-spaz
  For offline games, sets character to Spaz.
  Added for 1.23 only since TSF already has this functionality.
-player <number>
  Sets number of local players.
  Added for TSF to fix a parsing issue.
-menu
  Skips the intro and goes directly to the menu screen.
-minimize
  Minimizes JJ2 to the tray on startup.
-servername=<name>
  Renames server. Server name cannot exceed 30 characters.
-settings=<filename>
  Sets the main configuration file (file must exist). If not specified, defaults to plus.ini.
-admin=<filename>
  Sets the admin configuration file (file must exist). If not specified, defaults to admin.ini.
-levellistfile=<filename>
  Sets the Level List file (file must exist). If not specified, defaults to LevelList.ini.
-mutators=<filename>[,<filename>][,...]
  Defines the mutators to be loaded by the game in multiplayer gamemode. Mutator filenames are accepted as arguments. The .mut extension is optional. Multiple filenames are separated by a comma.
  At this time the `-mutators` option has no effect on local single player games, only on multiplayer games, but this may change in some future JJ2+ release.
-mutators+=<filename>[,<filename>][,...]
  Similar to the above option, but writing `+=` instead of simply `=` means that the list of mutators specified by this command line option will be added to, instead of replacing outright, the list of mutators specified by the `[Add-on]Mutators` entry in your plus.ini settings file.
  For example, if your plus.ini includes the line `Mutators=forcenormalpalette` and your command line string includes `mutators=allshields`, then only allshields.mut will be loaded. If your command line string includes `mutators=+allshields` instead, forcenormalpalette.mut and allshields.mut will both be loaded.
-nochatlogger
  Disables the chatlogger window from appearing, overriding the `[Logging]Chatlog` setting in plus.ini.
-joyinfo
  Display what values JJ2 thinks are being sent from any attached joysticks/controllers. Useful only if you are experiencing trouble with your devices and want to submit a bug report.

### Game Mode (requires -server)

-rt
  Changes game mode to Roast Tag.
-lrs
  Changes game mode to Last Rabbit Standing.
-xlrs
  Changes game mode to Extended Last Rabbit Standing.
-pest
  Changes game mode to Pestilence.
-tb
  Changes game mode to Team Battle.
-dctf
  Changes game mode to Death CTF.
-jb
  Changes game mode to Jailbreak.
-fr
  Changes game mode to Flag Run.
-tlrs
  Changes game mode to Team Last Rabbit Standing.
-dom
  Changes game mode to Domination.
-head
  Changes game mode to Head Hunters.

### New formats for -connect

-connect <ip_address>[:<port>] [-password=<password>] [-version=<server_version>]
-connect <ip_address>[:<port>][/[<password>][/<server_version>]]
  Values for <server_version>
  - For 1.23, use: 1.23, 23, 1.21, or 21 (all map to "21 ")
  - For TSF, use: 1.24 or 24 (both map to "24 ")

## Integration with other tools and applications

### Server information query packet

JJ2+ adds functionality to allow third-party websites or applications to query a server running JJ2+ and receive detailed information about the status of that server (current game mode, players in the server, et cetera). This information can be retrieved by sending an UDP packet to the server on the port the server is hosted on (10052 by default).

The UDP packet should have the value `\x07\x14\x05\x00\x01`. Note that the first two bytes are the packet checksum, used by the server to verify data integrity; the actual packet value is `\x05\x00\x01`. If the server is running JJ2+, you will receive a packet with the following structure in return:

    char[2]  header
    long     uptime in seconds
    long     version
    char     number of connected clients
    char     number of players
    char     game mode
    char     max players
    char     length of server name
    char[]   server name
    char     custom mode
    char     flags (if the server is not running at least JJ2+ 5.5,
             this byte and all the following will be missing)
       & 1: server is private? (if this is the case none of the
            data after this byte will be sent!)
       & 1 << 1: plus only?
       & 1 << 2: idle server mode?
    char     max score
    char     blue score
    char     red score
    char     green score
    char     yellow score

    then for each player (i.e. repeated ‘number of players’ times):
      char[]  player name (null-terminated)
      char    player score
      char    player flags
         & 3: player team
         & 1 << 2: player is spectating

    char[] level filename

## Licenses

JJ2+ is distributed under the MIT License.

    Copyright 2007-2010, 2013, 2015-2018 The JJ2+ Team, https://jj2.plus

    Permission is hereby granted, free of charge, to any person obtaining a copy of
    this software and associated documentation files (the "Software"), to deal in
    the Software without restriction, including without limitation the rights to
    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
    of the Software, and to permit persons to whom the Software is furnished to do
    so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

JJ2+ incorporates the curl library.

    COPYRIGHT AND PERMISSION NOTICE

    Copyright (c) 1996 - 2018, Daniel Stenberg, <daniel@haxx.se>, and many
    contributors, see the THANKS file.

    All rights reserved.

    Permission to use, copy, modify, and distribute this software for any purpose
    with or without fee is hereby granted, provided that the above copyright
    notice and this permission notice appear in all copies.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
    NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
    DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
    OR OTHER DEALINGS IN THE SOFTWARE.

    Except as contained in this notice, the name of a copyright holder shall not
    be used in advertising or otherwise to promote the sale, use or other dealings
    in this Software without prior written authorization of the copyright holder.