Jazz Jackrabbit 2 has always had online multiplayer as a 2D Arena Shooter, but JJ2+ fixes lots of bugs and adds lots of customization.

Spectating

JJ2 is so chatty/social that early levels had dedicated "chat room" areas where players could hang out and chat without getting roasted. Players who beat obstacle courses wanted to watch other players still struggling, and in early Last Rabbit Standing versions, one big issue was what to do with players who lost, so they didn't get bored.

JJ2+'s solution is Spectator Mode. The easiest way to spectate is to press Esc and then select "Spectate" (or "Unspectate" afterwards) from the menu box. You can also type /spectate on in chat, or choose Plus → Spectator Mode from the windowed dropdown menus, your choice.

The words "Spectator Mode" appear near the top right of your window, and below that, the name of your current target. Press or to spectate a different target.

Spectators are marked by darkened names. If you spectate a lot, you may want to set up highlights so other players can get your attention.

Targets

You can spectate any player who's still in the game, watching the game from their perspective. Some of their HUD information (weapon, health) is only approximate, but you can watch them move around.

Certain gamemodes let you spectate parts of the game: either flag in CTF or DCTF, the shared flag in Flag Run, the Ringholder or Bottom Feeder in Roast Tag, or each individual control point in Domination.

Free View

Or you can spectate the whole level in Free View. The camera moves with your mouse. Click the window to fix the camera in place until you click again.

Free View is also used when in Idle Server Mode, which hides you (as the server) from the player list. You can still chat, though, and press Ctrl+Enter to resume play.

Players who are Out in Last Rabbit Standing (and similar) also use Free View. So do winners in Race, and all players during the Pregame if the race level has no minimap.

Further Reading

Settings/actions: Allow Spectating, Force Spectate, Hide Spectators, Idle Server, Joiners Spectate, Show health to spectators while anti-radar is enabled, Spectate, Spectating Camera Shift

Scripting API: jjPLAYER::isIdle, jjPLAYER::isSpectating

Mutators

JJ2+'s most literal gamechanger. Want to make your own gamemode with its own rules and graphics? Change how players move? Replace the normal health system? Code a chatbot? Change the color palette?

Mutators are script files which are hosted by a server instead of tied to specific level. Once a mutator is activated, no matter how many levels the server plays, the mutator's code keeps running.

Servers may run any number of different mutators at once. Each keeps track of its own variables and does its own thing.

Mutators are (de)activated using the /mutators command or -mutators command line family, or in windowed mode, the dropdown menu Server → Mutators....

Examples

Five mutators come with JJ2+ to get you started, but you can always download more or write your own:

  1. allshields.mut: All shield monitors (fire, water, plasma, or laser) are replaced with staticky monitors that give you a random shield.
  2. doubledom.mut: Example of writing your own gamemode. Played in any Capture the Flag level, it replaces the two bases with control points that can be claimed for either team by touching them. If both points are claimed by the same team for long enough, that team scores a point.
  3. forcenormalpalette.mut: All levels use the same colors for most sprites (players, weapons, springs, and so on).
  4. plusEmoji.mut: Adds ten emoji to the game.
  5. SEjtf.mut: Jazz Team Fortress! Replaces much of JJ2's weapons system. Each player chooses a "class" that can only collect/fire one or two different weapons, and chooses another each time they die. Also adds three new weapons to the game.

Chat

In a server, press T to bring up the chat prompt!
Then Enter to send, or Esc to cancel.

Teamchat

JJ2 has always had teamchat: press Shift+T in team-based gamemodes for chat that only your teammates, not the other team/s, can see. Useful for strategizing. But unpatched JJ2's implementation was very buggy.

In JJ2+, team chat for both teams has [] brackets around the player's name, not just blue. More importantly, teamchat actually checks players' teams, instead of assuming that all odd-numbered players are blue and all even-numbered players are red.

Spectators cannot see any team's teamchat, no matter what team they were on before they started spectating.

Expanded Controls

New hotkeys while typing in the chat prompt:

Colored Text

JJ2+ keeps JJ2's use of the pipe | character to recolor text. For example, Hello |||||World draws Hello in brown and World in pink.

It also adds backslash colors to jump to specific colors. For example, \9Hello \5World draws Hello in purple and World in pink.

  1. Green
  2. Red
  3. Blue
  4. Orange
  5. Pink
  6. Brown
  7. Silver
  8. Teal
  9. Purple (the only way to get purple text)

(Backslash colors are available in almost all text-drawing contexts, including player names, server names, Text events, and Help pages.)

/me and /whisper

Preface your chat message with /me  and it will be written out as an action, like in other chat programs.

Whispering lets you chat with only one other player, for example player 2, not the whole server. Preface your chat message with /whisper 2 , /w 2 , or just @2 .

Emoji

Press Ctrl+. while chatting to bring up an ingame emoji keyboard. These little images fit seamlessly into your chat and can be recolored and everything.

You may also write out the (case-sensitive) emoji names, bordered by : characters, instead of using the keyboard. For example, typing :cool: might be displayed like 😎.

Emoji are only available if any active scripts define them. The plusEmoji.mut mutator comes with JJ2+ but must be turned on in a server. You can also hide emoji locally, which doesn't affect whether other players do or don't see them.

URLs sent in chat (such as https://jazz2online.com) are now links. They are drawn in blue (by default) with a line under them. Players may click links and be sent to that website in their default web browser.

Other protocols are also allowed. Depending on how you installed JJ2+, for example, your computer may support the jazz2 protocol, which joins specific servers. Clicking a chat link jazz2://45.83.246.174:10057 would then launch another JJ2+ instance that joins the server at that IP address.

Links Beyond Chat

Links are also supported in welcome messages.

Clicking links is not possible in fullscreen, where there's no cursor, so the underline is not drawn.

Highlights

Sometimes you join a server but don’t continually pay attention, like if you’re waiting for somebody else to join. It’s nice to know when interesting things are happening without having the game window visible all the time.

The [Logging]Highlights setting in plus.ini lets you pick any number of words that flash JJ2+ in the taskbar if anyone says them in chat.

For example, if you want to play a duel or a 2vs2, and your handle is Shadow, you could write something like this (case-insensitive, separated by spaces):

Highlights="Shadow duel 2vs2"

Then JJ2+ would flash in the taskbar if another player said "HI SHADOW" or "Anyone want to play a duel?" or anything like that. The highlights have no effect if JJ2+ is the active window, though, only if you’re not paying attention to the game already.

Spam/Queue

Chat messages are now processed with a queue system to limit how often a client's chat message is displayed by the server. The client itself does not notice the delay for its own messages.

The interval between consecutive messages from the same client may be configured using SpamIntervalInMillis. The default value is 1000 milliseconds (1 second), while the maximum 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, it’s popped from their queue.

If the client is logged in as a remote admin, their admin group’s Spammers property decides 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. Clients who use it more often are kicked for spamming.

Other Chat Stuff

Server List

Normal View

The list of open multiplayer servers now uses a smaller font, so it can show you how full each server is. Servers with more players are sorted to the top of the list.

Press F9 to change the style on this page. By default, "style C," you see how many players there are, and the maximum number of players the server could hold.

Other styles have symbols to distinguish between
bots, spectators, and real, playing humans.

Message of the Day

Occasionally a scrolling message appears at the bottom of the server list, usually to tell you about some upcoming contest or other event.

Detail View

Hold Tab for more details about the selected server:

A server may not send you all its details if it's passworded, pinging, or running an old version of the game.

Timers & Gamestates

In unpatched JJ2, combat starts the moment each level is loaded, and the level ends when (and only when) one player or team gets enough points to win, immediately cycling to the next level.

JJ2+ optionally separates servers into four gamestates:

  1. Pregame: Players can collect ammo/powerups but can't hurt each other. An orange timer in the top right counts down the time until it reaches 0, then starts the game, though it may be extended if not enough players are in the server to playe. Usually only happens if the /pregame command is used, but mandatory in Jailbreak, Last Rabbit Standing (LRS), Pestilence, Race (players can't move, but preview the track instead), TLRS, and XLRS.
  2. Started: Normal gameplay. When a team or player wins, the server will cycle unless Auto Stop is on, in which case the game stops instead. If either Auto Stop or Auto Cycle are on, a green timer in the top right counts down and the game automatically cycles (or stops) when it reaches 0.
  3. Overtime: Bonus extra time if Auto Stop or Auto Cycle are on, the green timer reaches 0, and multiple players/teams are tied for first place. Shows a blue timer in the top right and cycles/stops when that timer runs out or when any player/team reaches a new, usually-smaller max score. In Battle, Last Rabbit Standing (LRS), Pestilence, Roast Tag, Team Battle, TLRS, and XLRS, players hurt each other for one extra heart during overtime.
  4. Stopped: Players can collect ammo/powerups (unless No Movement When Stopped is on) but can't hurt each other. If Auto Start is off, each level starts in this state instead of Started or Pregame. If Auto Stop is on, the game enters this state if any player/team wins or if the time limit runs out.

Server hosts and remote admins may manually control the game state with many commands: /start, /stop, and so on.

Player List

The ingame player list (F9) has been expanded to show more information more clearly. Some of this information is always visible, some requires you to press F9 twice for more detail.

Instead of just one stats column (e.g. Roasts in Battle), many gamemodes now have two. The columns may be moved to the right to make room for long player names, which are no longer allowed to use custom spacing to break the HUD. Spectators are drawn with dark names and do not have stats numbers at all.

Player numbers use a narrower column if they only need one digit and are written in teal if they are running 1.23. Each player's connection speed is written (in milliseconds) to the right, or the letters C (connecting) or D (downloading) if they haven't finished joining yet.

Icons

In some gamemodes, an extra column is added to indicate special player roles, so you don't have to just guess who has the flag. These icons appear in that column in the player list, and also by players' names ingame and in chat.

The Icons Left of Names setting picks whether icons are drawn to the left of players' names in a single column, or to the right in jagged rows.

jjPLAYER::iconSet lets scriptwriters define their own icons for their own gamemodes (or levels).

More

Other icons that may appear: a green A for remote admins (only after F9 has been pressed twice), and a crossed-out speaker for muted players.

Unpatched players have a - drawn to the left of their player numbers (red if 1.24, teal if 1.23). The host can see a + for players running different JJ2+ versions (brown if 1.24, teal if 1.23).

Controls

Press F9 once to show the player list, twice to show it with more detail (along with some other debug info around the screen), and a third time to hide everything.

Press Ctrl+F9 to change the sorting style (written at the bottom left of the list):

  1. Sorted by player numbers.
  2. Connected players before still-connecting; active players before spectators; blue team before red before green before yellow; normal players before out/zombies/jailed; sorted by player number as last resort.
  3. Same as style 2, but also sort by number of points/lives/gems/laps/deaths.

Hold down Tab to view the player list (sorting style 3) quickly.

Rostrum

JJ2+ adds a new end-of-level graphic at the end of each level in a server (except in SP/Coop), featuring much larger character sprites and names against a black background.

In free-for-all gamemodes, the winning player is shown in the center, looking smug, while second and third place are shown to the sides looking defeated.

In team-based gamemodes, the top-performing player from each team is shown, no matter which team won.

Teams

The Team Battle, Team Last Rabbit Standing, and Domination gamemodes support up to four teams.

The new teams, Green and Yellow, behave just the same as the usual Blue and Red. They can use teamchat, arrows and control points may be painted in their colors, and so on. The Start Position (Multiplayer) event has an expanded "Team" parameter so you can choose any of the four teams.

Teams may be enabled or disabled freely using the /teams command. You can even have only one active team, if you don't want players to be able to fight each other.

Green and Yellow are not available in the other team-based gamemodes because they rely on map layouts that assume exactly two bases (or jails), but let us know if you have ideas.

Remote Admins

When Remote Admin is enabled (/remoteadmin on) in a server, a client can be promoted to administrator 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

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 twice 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.

Setting Up Admin Groups

JJ2+ offers the ability to manage admin groups in a configuration file admin.ini. Here's a download link for a template, in case your JJ2+ distribution doesn't include one. The template 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 8–20 alphanumeric, case-insensitive characters for the group to work. Passwords are NOT case sensitive.

Any attempt to log in (whether Remote Admin is enabled or not), as well as any command issued by an admin, is hidden from non-admin clients.

Script Privileges

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.

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. Here's a download link for a template, in case your JJ2+ distribution doesn't include one. (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.

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:

Downloading Files

While you're download files from a server, their progress is shown with a (restored, previously unused) progress bar graphic and a text percentage, as well as an estimate of the transfer speed.

If the server's Upload Music setting and your Download Music setting are both on, then you can even download level music, unlike in unpatched JJ2.

The only files that are always transferred (if you don't have them already) are the level, its tileset, and its script if any. Scripts may also define any number of external files (graphics, sound effects, scripting libraries, etc.) that also get transferred.

Normally the download screen says "Press Esc to abort." For optional files—mostly music, but also files marked offer by scripts—it says "OPTIONAL download / SKIP by pressing Esc" instead, because such files tend to be very large and maybe you just want to play JJ2 as quickly as possible.

Colored level names are now ignored (here and in the window caption) instead of breaking the screen.

Miscellaneous Fixes