Guide Stage System: level caps, grades and content by chapters

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
  • 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
CommandWhat it does
//stageOpens the stage control panel
//stage toggleTurns the system on or off without a restart
//stage nextMoves to the next stage with an announcement
//stage prevRolls back to the previous stage
//stage set <id>Activates the stage with that number
//stage set <id> silentSame, without a server-wide announcement
//stage pause / resumePauses or resumes the timer
//stage addhours <hours>Adds or removes time on the current stage, for example 24 or -2
//stage reload, //reload_stagesReloads stages.xml (also available in //admin -> Reload)

In the Telegram bot (if the bot is enabled in telegram_bot.properties)
CommandWhat it does
/stageShows status, timer and the chapter list
/stage toggleTurns the system on or off
/stage next, /stage prevNext or previous stage
/stage set <id>Activates the stage with that number
/stage pause, /stage resumePauses or resumes the timer
/stage addhours <hours>Changes the current stage timer
/stage reloadReloads 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.

AttributeDefaultDescription
enabledfalseWhether the system is on. With false the server runs normally, with no stages.
announceOnEntertrueOn login, tell the player the current chapter, time until the next one and their EXP bonus.
voiceCommandtrueAllow players to use the .stage command.
notifyTelegramtrueSend 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.

AttributeDefaultDescription
durationHours0Stage length in hours from the moment it starts. 168 = one week.
durationMinutes0Minutes added to the hours. Handy for testing.
endTime-Exact end date by server time. If set, durationHours and durationMinutes are ignored.
unlockPlayersAtCap0How many accounts must reach this stage's maxLevel. 0 turns this condition off.
modeANYHow 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.

AttributeDefaultDescription
maxLevel0Level cap. 0 means no cap.
allowCapBarFilltrueWith a hard cap, lets players keep filling the EXP bar of the last allowed level. Details below.
softCapExpMul0.00.0 is a hard cap. Anything above zero is a soft cap. Details below.
maxProfession-1Highest profession allowed: 0 blocks even the 1st, 1/2/3 allow up to that profession, -1 means no limit.
allowSubClasstrueWhether subclasses can be added, bought or replaced.
allowOlympiadtrueWhether players can register for the Olympiad.
maxGrade-Highest equipment grade: NONE, D, C, B, A, S. If not set, any grade is allowed.
maxWeaponEnchant-1Weapon enchant limit.
maxArmorEnchant-1Armor enchant limit: helmets, tops, bottoms, gloves, boots, shields, sigils, shirts, belts.
maxJewelryEnchant-1Jewelry 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.

AttributeDefaultMultiplies
expMul1.0EXP
spMul1.0SP
adenaMul1.0Adena
dropMul1.0Drop
spoilMul1.0Spoil

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.

AttributeDefaultDescription
minLevel1Level the bonus starts at (inclusive)
maxLevel1Level the bonus ends at (inclusive)
expMul1.0EXP multiplier
spMul= expMulSP 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" />
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.

You can list values comma-separated in an attribute or as separate tags. Both work, and you can mix them.

AttributeTagWhat 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:
XML:
<spawns groups="stage1_event_mobs,stage1_shop_npc" />

<!-- or like this -->
<spawns>
  <group name="stage1_event_mobs" />
</spawns>
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.

Example: four weeks

Week by week:
  1. 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.
  2. Cap 64, B grade, Zaken opens. Players below 52 get x2 EXP.
  3. Cap 75, A grade, subclasses and Baium open. Tiered bonus for lagging players.
  4. 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:
Back
Top