JJ2+ Readme

JJ2+ (last updated August 2023)

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

Aug 2023 (5.12)

Feb 2023 (5.11)

Dec 2022 (5.10)

May 2021 (5.9)

May 2021 (5.8)

Aug 2020 (5.7)

Feb 27, 2018 (5.6)

Jun 1, 2017 (5.5)

Dec 7, 2016 (5.4)

Jul 9, 2016 (5.3)

Apr 20, 2016 (5.2)

Aug 24, 2015 (5.1)

Apr 6, 2015 (5.0)

Oct 30, 2013 (4.3)

Oct 19, 2013 (4.2)

Feb 5, 2013 (4.1 rerelease)

Feb 4, 2013 (4.1)

Jan 28, 2013 (4.0)

Jul 7, 2012

Jun 30, 2010

Apr 8, 2010 (A)

Apr 8, 2010

Jul 28, 2009

Apr 10, 2009

Apr 9, 2009

Nov 27, 2008 (0.2)

Aug 28, 2008

Jul 3, 2008

Jun 22, 2008

Apr 9, 2008

Apr 5, 2008

Apr 3, 2008

Mar 22, 2008

Mar 14, 2008

Feb 17, 2008

Jan 17, 2008

Jan 11, 2008

Jan 5, 2008

Dec 21, 2007

Miscellaneous features/fixes added before Dec 21, 2007

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.

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.

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:

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.

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:

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

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:

  1. Normal light
  2. Single point (ignores the "Size" parameter)
  3. Single point (brighter) (ignores the "Size" parameter)
  4. Flicker light
  5. Bright normal light
  6. Laser shield/Illuminate Surroundings
  7. Ring of light
  8. 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:

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.

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.
/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.*
/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).
To pass a flag, the flag/gem holder must hit at a teammate who is pressing up.
If Friendly Fire and Plus Only are enabled, any hit can be used for passing, otherwise only RFs can be used.
/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.

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

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.