If you've ever run a staged server, you know how it usually goes: late at night you edit configs, raise the level cap, unlock the next grade, restart, and hope you didn't miss anything. Now the server does this itself. It keeps track of the current chapter and switches to the next one on a timer, at a set date, or once enough players have reached the cap. The new limits apply immediately, with no restart.
If you need to step in yourself, you can switch chapters from the game or from the Telegram bot.
What you can restrict
Each stage also has its own rate multipliers, its own catch-up EXP bonus for players who fall behind, and its own spawn groups that appear and disappear with the chapter.
GMs are not affected by any of the limits.
Commands
For players
.stage (also .stages and .chapter) opens a window with the current chapter, time until the next one, how many players are at the cap, the player's own EXP bonus and the rules for every chapter. The command can be turned off in the settings.
For admins in game
In the Telegram bot (if the bot is enabled in telegram_bot.properties)
Configuration
Everything lives in one file: gameserver/data/stages.xml. Edit it, run //stage reload, and the changes apply right away.
File structure:
Stages run in ascending id order. The stage name and description come from data/string/strings_en.properties, strings_ru.properties and other language files, using the keys in name_address and desc_address. Each player sees them in their own language.
All parameters are listed below. If an attribute is left out, the value from the "Default" column is used.
Hard cap and the EXP bar. Example with maxLevel="52":
Soft cap. With softCapExpMul="0.10", players get only 10% EXP once they pass maxLevel. The most dedicated will grind a level or two above the cap, but they won't get far ahead of everyone else.
Profession. The limit applies everywhere: the class master, the community board, profession NPCs and quests. It applies to subclasses too. If the profession is locked, nothing is taken from the player: no adena, no items, no marks. The 3rd profession quest stops at its last step and can be turned in once the profession is unlocked.
Subclasses. allowSubClass="false" blocks adding, buying and replacing subclasses. Switching between subclasses the player already has still works.
Grade. Items above the stage grade can't be equipped. If you roll the stage back, anything over the limit is moved to the inventory. If maxGrade has a typo, a warning is written to the log on load and the grade limit won't work on that stage.
Enchant. An item that's already at the limit can't be placed in the enchant window, and the scroll is not used up. Scrolls with a random bonus (+1..+3) won't push the item past the stage limit on success.
Example: four weeks
Week by week:
If you have ideas for what else could go into stages, post them in this thread and I'll take a look.
If you need to step in yourself, you can switch chapters from the game or from the Telegram bot.
What you can restrict
- level cap, hard or soft (soft means reduced EXP after the cap);
- max profession, including on subclasses;
- subclasses and Olympiad;
- equipment grade and specific items;
- enchant level, set separately for weapons, armor and jewelry;
- access to zones, instances and multisells, and damage to raid and epic bosses.
Each stage also has its own rate multipliers, its own catch-up EXP bonus for players who fall behind, and its own spawn groups that appear and disappear with the chapter.
GMs are not affected by any of the limits.
Commands
For players
.stage (also .stages and .chapter) opens a window with the current chapter, time until the next one, how many players are at the cap, the player's own EXP bonus and the rules for every chapter. The command can be turned off in the settings.
For admins in game
| Command | What it does |
|---|---|
| //stage | Opens the stage control panel |
| //stage toggle | Turns the system on or off without a restart |
| //stage next | Moves to the next stage with an announcement |
| //stage prev | Rolls back to the previous stage |
| //stage set <id> | Activates the stage with that number |
| //stage set <id> silent | Same, without a server-wide announcement |
| //stage pause / resume | Pauses or resumes the timer |
| //stage addhours <hours> | Adds or removes time on the current stage, for example 24 or -2 |
| //stage reload, //reload_stages | Reloads stages.xml (also available in //admin -> Reload) |
In the Telegram bot (if the bot is enabled in telegram_bot.properties)
| Command | What it does |
|---|---|
| /stage | Shows status, timer and the chapter list |
| /stage toggle | Turns the system on or off |
| /stage next, /stage prev | Next or previous stage |
| /stage set <id> | Activates the stage with that number |
| /stage pause, /stage resume | Pauses or resumes the timer |
| /stage addhours <hours> | Changes the current stage timer |
| /stage reload | Reloads stages.xml without logging into the game |
Configuration
Everything lives in one file: gameserver/data/stages.xml. Edit it, run //stage reload, and the changes apply right away.
File structure:
XML:
<stages enabled="true" announceOnEnter="true" voiceCommand="true" notifyTelegram="true">
<stage id="1" name_address="stage.1.name" desc_address="stage.1.desc">
<transition ... /> <!-- when to move to the next stage -->
<limits ... /> <!-- caps and restrictions -->
<rates ... /> <!-- stage rates -->
<catchup ... /> <!-- catch-up bonus, can have several lines -->
<restrictions ... /> <!-- locked content -->
<spawns ... /> <!-- spawn groups -->
</stage>
</stages>
Stages run in ascending id order. The stage name and description come from data/string/strings_en.properties, strings_ru.properties and other language files, using the keys in name_address and desc_address. Each player sees them in their own language.
All parameters are listed below. If an attribute is left out, the value from the "Default" column is used.
| Attribute | Default | Description |
|---|---|---|
| enabled | false | Whether the system is on. With false the server runs normally, with no stages. |
| announceOnEnter | true | On login, tell the player the current chapter, time until the next one and their EXP bonus. |
| voiceCommand | true | Allow players to use the .stage command. |
| notifyTelegram | true | Send a Telegram report on every transition, including timer-based ones in the middle of the night. |
The last stage doesn't need this block, since there is nothing after it.
Date formats for endTime: 2026-11-15 20:00:00, 2026-11-15 20:00, 15.11.2026 20:00, 20:00 15.11.2026.
endTime is useful when you want a chapter to open at prime time, for example exactly on Friday at 20:00.
mode values:
How player progress is counted: unique accounts that have a character or subclass at or above the stage cap. Several characters on one account count as one, so alts won't speed up the transition. GMs, banned characters and characters pending deletion are not counted. The condition is checked every 10 seconds.
| Attribute | Default | Description |
|---|---|---|
| durationHours | 0 | Stage length in hours from the moment it starts. 168 = one week. |
| durationMinutes | 0 | Minutes added to the hours. Handy for testing. |
| endTime | - | Exact end date by server time. If set, durationHours and durationMinutes are ignored. |
| unlockPlayersAtCap | 0 | How many accounts must reach this stage's maxLevel. 0 turns this condition off. |
| mode | ANY | How the timer and player progress combine, see below. |
Date formats for endTime: 2026-11-15 20:00:00, 2026-11-15 20:00, 15.11.2026 20:00, 20:00 15.11.2026.
endTime is useful when you want a chapter to open at prime time, for example exactly on Friday at 20:00.
mode values:
- ANY - moves on as soon as either condition is met: the timer runs out or enough players reach the cap;
- ALL - needs both: the time is up and enough players have reached the cap;
- MANUAL - no automatic transition, only an admin can switch the chapter.
How player progress is counted: unique accounts that have a character or subclass at or above the stage cap. Several characters on one account count as one, so alts won't speed up the transition. GMs, banned characters and characters pending deletion are not counted. The condition is checked every 10 seconds.
| Attribute | Default | Description |
|---|---|---|
| maxLevel | 0 | Level cap. 0 means no cap. |
| allowCapBarFill | true | With a hard cap, lets players keep filling the EXP bar of the last allowed level. Details below. |
| softCapExpMul | 0.0 | 0.0 is a hard cap. Anything above zero is a soft cap. Details below. |
| maxProfession | -1 | Highest profession allowed: 0 blocks even the 1st, 1/2/3 allow up to that profession, -1 means no limit. |
| allowSubClass | true | Whether subclasses can be added, bought or replaced. |
| allowOlympiad | true | Whether players can register for the Olympiad. |
| maxGrade | - | Highest equipment grade: NONE, D, C, B, A, S. If not set, any grade is allowed. |
| maxWeaponEnchant | -1 | Weapon enchant limit. |
| maxArmorEnchant | -1 | Armor enchant limit: helmets, tops, bottoms, gloves, boots, shields, sigils, shirts, belts. |
| maxJewelryEnchant | -1 | Jewelry enchant limit: rings, earrings, necklaces. |
Hard cap and the EXP bar. Example with maxLevel="52":
- allowCapBarFill="true": the player reaches 52 and can fill EXP up to 99.99%, but never gets 53. We recommend this one: players don't drop below 52 after their first PvP death and can keep farming SP.
- allowCapBarFill="false": EXP stops at exactly 52 and 0%. SP is still earned as usual.
Soft cap. With softCapExpMul="0.10", players get only 10% EXP once they pass maxLevel. The most dedicated will grind a level or two above the cap, but they won't get far ahead of everyone else.
Profession. The limit applies everywhere: the class master, the community board, profession NPCs and quests. It applies to subclasses too. If the profession is locked, nothing is taken from the player: no adena, no items, no marks. The 3rd profession quest stops at its last step and can be turned in once the profession is unlocked.
Subclasses. allowSubClass="false" blocks adding, buying and replacing subclasses. Switching between subclasses the player already has still works.
Grade. Items above the stage grade can't be equipped. If you roll the stage back, anything over the limit is moved to the inventory. If maxGrade has a typo, a warning is written to the log on load and the grade limit won't work on that stage.
Enchant. An item that's already at the limit can't be placed in the enchant window, and the scroll is not used up. Scrolls with a random bonus (+1..+3) won't push the item past the stage limit on success.
These multiply the base rates from the configs and apply to every player while the stage is active. 1.0 leaves the server rates unchanged.
| Attribute | Default | Multiplies |
|---|---|---|
| expMul | 1.0 | EXP |
| spMul | 1.0 | SP |
| adenaMul | 1.0 | Adena |
| dropMul | 1.0 | Drop |
| spoilMul | 1.0 | Spoil |
Example: it's week three, the cap is already 75. A new player shows up at level 1, the starting areas are empty and the rates are normal. Chances are they'll quit within an hour.
Catchup speeds up leveling only for players who are behind most of the server. Once a character catches up, the bonus switches off by itself.
You can add several lines to set up tiers:
Levels 1-51 get x3, levels 52-63 get x1.8, and from 64 there's no bonus, so the player levels at the same pace as everyone else.
You usually don't need catchup on the first stage, since everyone starts at the same time.
Catchup speeds up leveling only for players who are behind most of the server. Once a character catches up, the bonus switches off by itself.
| Attribute | Default | Description |
|---|---|---|
| minLevel | 1 | Level the bonus starts at (inclusive) |
| maxLevel | 1 | Level the bonus ends at (inclusive) |
| expMul | 1.0 | EXP multiplier |
| spMul | = expMul | SP multiplier. If not set, it equals expMul. |
You can add several lines to set up tiers:
XML:
<catchup minLevel="1" maxLevel="51" expMul="3.0" spMul="3.0" />
<catchup minLevel="52" maxLevel="63" expMul="1.8" spMul="1.8" />
You usually don't need catchup on the first stage, since everyone starts at the same time.
You can list values comma-separated in an attribute or as separate tags. Both work, and you can mix them.
How this works in game:
Epic boss IDs for reference: 29001 Queen Ant, 29006 Core, 29014 Orfen, 29022 Zaken, 29020 Baium, 29019 Antharas, 29028 Valakas, 29045 Frintezza.
| Attribute | Tag | What it locks |
|---|---|---|
| blockedZones | <zone name="..." /> | Zones by name from data/zone/*.xml |
| blockedInstances | <instance id="..." /> | Instances by ID from data/instances |
| blockedMultisells | <multisell id="..." /> | Multisells by ID |
| blockedItems | <item id="..." /> | Items that can't be equipped, even if their grade is allowed |
| blockedBosses | <boss npcId="..." /> | Raid and epic bosses that take no damage |
How this works in game:
- Zones. A player who walks or teleports into a locked zone gets a warning and is sent to town. This only applies to the main world; zones with the same name inside instances are not affected.
- Multisells. A locked multisell won't open. If a player opened it before the stage changed, they still can't buy from it.
- Bosses. A locked boss takes no damage, and the player gets a message that the boss isn't available in the current chapter.
Epic boss IDs for reference: 29001 Queen Ant, 29006 Core, 29014 Orfen, 29022 Zaken, 29020 Baium, 29019 Antharas, 29028 Valakas, 29045 Frintezza.
In data/spawn/*.xml you can name a spawn group with event_name. Then list those groups in the stage:
When a stage turns on, its groups are spawned. When the server moves to a stage that doesn't have a group, that group's NPCs and monsters are removed from the world. No restart needed.
XML:
<spawns groups="stage1_event_mobs,stage1_shop_npc" />
<!-- or like this -->
<spawns>
<group name="stage1_event_mobs" />
</spawns>
Example: four weeks
Week by week:
- Cap 52, C grade, 2nd profession only, subclasses and Olympiad locked. Zaken, Baium, Antharas and Valakas locked. Moves on after 7 days, or earlier if 50 accounts reach the cap.
- Cap 64, B grade, Zaken opens. Players below 52 get x2 EXP.
- Cap 75, A grade, subclasses and Baium open. Tiered bonus for lagging players.
- No more caps: 3rd profession, S grade, Olympiad and all epic bosses.
XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stages SYSTEM "stages.dtd">
<stages enabled="false" announceOnEnter="true" voiceCommand="true" notifyTelegram="true">
<!-- Week 1: cap 52, C grade, 2nd profession, enchant +6/+4/+4 -->
<stage id="1" name_address="stage.1.name" desc_address="stage.1.desc">
<transition durationHours="168" durationMinutes="0" unlockPlayersAtCap="50" mode="ANY" />
<limits maxLevel="52"
allowCapBarFill="true"
softCapExpMul="0.0"
maxProfession="2"
allowSubClass="false"
allowOlympiad="false"
maxGrade="C"
maxWeaponEnchant="6"
maxArmorEnchant="4"
maxJewelryEnchant="4" />
<rates expMul="1.0" spMul="1.0" adenaMul="1.0" dropMul="1.0" spoilMul="1.0" />
<restrictions blockedBosses="29019,29020,29022,29028" />
</stage>
<!-- Week 2: cap 64, B grade, enchant +8/+6/+6, Zaken open -->
<stage id="2" name_address="stage.2.name" desc_address="stage.2.desc">
<transition durationHours="168" durationMinutes="0" unlockPlayersAtCap="40" mode="ANY" />
<limits maxLevel="64"
allowCapBarFill="true"
softCapExpMul="0.0"
maxProfession="2"
allowSubClass="false"
allowOlympiad="false"
maxGrade="B"
maxWeaponEnchant="8"
maxArmorEnchant="6"
maxJewelryEnchant="6" />
<rates expMul="1.0" spMul="1.0" adenaMul="1.0" dropMul="1.0" spoilMul="1.0" />
<catchup minLevel="1" maxLevel="51" expMul="2.0" spMul="2.0" />
<restrictions blockedBosses="29019,29020,29028" />
</stage>
<!-- Week 3: cap 75, A grade, enchant +12/+8/+8, subclasses and Baium -->
<stage id="3" name_address="stage.3.name" desc_address="stage.3.desc">
<transition durationHours="168" durationMinutes="0" unlockPlayersAtCap="30" mode="ANY" />
<limits maxLevel="75"
allowCapBarFill="true"
softCapExpMul="0.0"
maxProfession="2"
allowSubClass="true"
allowOlympiad="false"
maxGrade="A"
maxWeaponEnchant="12"
maxArmorEnchant="8"
maxJewelryEnchant="8" />
<rates expMul="1.0" spMul="1.0" adenaMul="1.0" dropMul="1.0" spoilMul="1.0" />
<catchup minLevel="1" maxLevel="51" expMul="3.0" spMul="3.0" />
<catchup minLevel="52" maxLevel="63" expMul="1.8" spMul="1.8" />
<restrictions blockedBosses="29019,29028" />
</stage>
<!-- Final: everything open, no transition needed -->
<stage id="4" name_address="stage.4.name" desc_address="stage.4.desc">
<limits maxLevel="0"
maxProfession="-1"
allowSubClass="true"
allowOlympiad="true"
maxWeaponEnchant="-1"
maxArmorEnchant="-1"
maxJewelryEnchant="-1" />
<rates expMul="1.0" spMul="1.0" adenaMul="1.0" dropMul="1.0" spoilMul="1.0" />
<catchup minLevel="1" maxLevel="63" expMul="3.5" spMul="3.5" />
<catchup minLevel="64" maxLevel="74" expMul="2.0" spMul="2.0" />
</stage>
</stages>
If you have ideas for what else could go into stages, post them in this thread and I'll take a look.
Last edited: