> For the complete documentation index, see [llms.txt](https://axiomemu.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://axiomemu.gitbook.io/docs/gameserver/common-dat.md).

# Common.dat

Server identity, network endpoints, rates, PK, trade, and every core gameplay toggle

The master configuration file. Defines who this GameServer is, how it reaches the other services, and every server-wide gameplay rule. Loaded first at startup; every other `.dat` file layers on top.

## File Location

```
GameServer/Data/GameServerInfo - Common.dat
```

All keys live under the single section `[GameServerInfo]`. Changes require a GameServer restart.

{% hint style="info" %}
**Default** in the tables below = the value in the shipped file. If you delete a line, the server uses its own built-in value instead, and that can be different (often `0`). To change a key that is not in your file, add the line yourself.
{% endhint %}

## Account Level (AL0-AL3)

Many keys come in groups of four with `_AL0`, `_AL1`, `_AL2`, `_AL3` suffixes. Each suffix maps to a VIP tier read from the account's stored `AccountLevel`:

| Suffix | Tier         | Typical use    |
| ------ | ------------ | -------------- |
| `_AL0` | Free account | Baseline value |
| `_AL1` | VIP tier 1   | Small bonus    |
| `_AL2` | VIP tier 2   | Medium bonus   |
| `_AL3` | VIP tier 3   | Top bonus      |

If VIP is disabled for the server, keep all four suffixes equal to the `_AL0` value.

## Server Settings

| Key                    | Type   | Range       | Default          | Effect                                                                                                                        |
| ---------------------- | ------ | ----------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `ServerName`           | string | <= 31 chars | `GameServer`     | Name shown in window title and broadcast messages                                                                             |
| `ServerCode`           | int    | 0-65535     | `0`              | Unique code matching one `<Server Code>` entry in ConnectServer's `ServerList.xml`                                            |
| `ServerLock`           | 0 or 1 |             | `0`              | `1` prevents non-GM clients from connecting                                                                                   |
| `GoldChannelServer`    | 0 or 1 |             | `0`              | `1` marks this server as a Gold channel (cosmetic label in the client)                                                        |
| `NonPvPServer`         | 0 or 1 |             | `0`              | `1` disables player-vs-player damage server-wide                                                                              |
| `ServerPort`           | int    | 1-65535     | `55901`          | TCP port game clients connect to. Must match ServerList.xml                                                                   |
| `ServerVersion`        | string | `X.XX.XX`   | `1.04.05`        | Season/episode identifier sent in handshakes                                                                                  |
| `ServerSerial`         | string | 16 chars    | *(ships filled)* | Protocol obfuscation serial. Do not change unless client ships with the matching value                                        |
| `ServerMaxUserNumber`  | int    | 1-1000      | `1000`           | Concurrent player cap. Values above 1000 are clamped to 1000                                                                  |
| `ServerMinLevel`       | int    | 0-MAX       | `0`              | Minimum character level allowed to log in. `0` = no limit                                                                     |
| `ServerMaxLevel`       | int    | 0-MAX       | `0`              | Maximum character level allowed to log in. `0` = no limit                                                                     |
| `ServerMinReset`       | int    | 0-MAX       | `0`              | Minimum character reset count to log in. `0` = no limit                                                                       |
| `ServerMaxReset`       | int    | 0-MAX       | `0`              | Maximum character reset count to log in. `0` = no limit                                                                       |
| `ServerMinMasterReset` | int    | 0-MAX       | `0`              | Minimum master reset count to log in. `0` = no limit                                                                          |
| `ServerMaxMasterReset` | int    | 0-MAX       | `0`              | Maximum master reset count to log in. `0` = no limit                                                                          |
| `LicenseKey`           | string |             | *(empty)*        | License token for this instance. Required                                                                                     |
| `EnableCastleSiege`    | 0 or 1 |             | `1`              | Master switch for Castle Siege machinery. When `0`, every CS-related Event.dat block is inert                                 |
| `GameDataOverlay`      | path   |             | *(empty)*        | Optional path to an overlay folder that shadows files in the shared `Data/` root. See [Data Overlays](/docs/data/overlays.md) |

{% hint style="warning" %}
`ServerCode` is the glue between GameServer, ConnectServer, and multi-instance deployments. Two GameServers with the same `ServerCode` will both heartbeat to the same slot in ConnectServer, producing flapping "online/offline" messages.
{% endhint %}

### Performance

Neither key ships in the default `Common.dat`. Add the line to change it. Both are read once at startup.

| Key               | Type   | Range | Default | Effect                                                                                                                                                                                                                                                                                                                       |
| ----------------- | ------ | ----- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PerfProfiler`    | 0 or 1 |       | `1`     | Built-in CPU profiler. `1` writes a summary to `Perf\YYYY-MM-DD.txt` once a minute. `0` = off                                                                                                                                                                                                                                |
| `SendBatchWindow` | int ms | 0-200 | `50`    | How long the server may hold packets for one player so it can send them together. Fewer, bigger sends = less CPU and network load on busy maps. A player's own replies are never held. `0` = off (send at once). Values above `200` are clamped to `200`. Any value above `0` also turns off Nagle's delay on player sockets |

## Connection Settings

| Key                      | Type   | Default     | Effect                                                                                                              |
| ------------------------ | ------ | ----------- | ------------------------------------------------------------------------------------------------------------------- |
| `DataServerAddress`      | string | `127.0.0.1` | IP of DataServer                                                                                                    |
| `DataServerPort`         | int    | `55960`     | TCP port of DataServer. Must match DataServer's `DataServerPort`                                                    |
| `JoinServerAddress`      | string | `127.0.0.1` | IP of JoinServer                                                                                                    |
| `JoinServerPort`         | int    | `55970`     | TCP port of JoinServer. Must match JoinServer's `JoinServerPort`                                                    |
| `ConnectServerAddress`   | string | `127.0.0.1` | IP of ConnectServer                                                                                                 |
| `ConnectServerPort`      | int    | `55557`     | UDP port on ConnectServer for heartbeats. Must match ConnectServer's `ConnectServerPortUDP`                         |
| `ConnectTimeOutPreLogin` | int    | `300`       | Seconds an idle socket may sit connected without submitting credentials (login box open) before the server drops it |
| `ConnectTimeOutLogged`   | int    | `60`        | Seconds a logged-in client may go without answering the server's live-client ping before it is disconnected         |

This GameServer's public IP must appear in DataServer's and JoinServer's `AllowableIpList.txt`.

{% hint style="warning" %}
Both timeout keys are silently raised to `30` if you configure anything lower - the server will not honour a shorter timeout than that.
{% endhint %}

## Server Manager Control Settings

The control channel lets the Axiom Server Manager see this GameServer's status and logs and send it commands (notice, kick, start events, graceful shutdown). None of these keys ship in the default `Common.dat`. Add the lines to change them. Read once at startup.

| Key               | Type   | Default     | Effect                                                                                                                       |
| ----------------- | ------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `ControlPort`     | int    | `55990`     | TCP port the control channel listens on. `0` = control channel off                                                           |
| `ControlKey`      | string | *(empty)*   | Shared password the Server Manager must send. Empty = no password                                                            |
| `ControlBind`     | IP     | `127.0.0.1` | Address the control channel listens on. `127.0.0.1` = only this machine can connect. An invalid IP falls back to `127.0.0.1` |
| `ControlInstance` | string | *(empty)*   | Label shown in the Server Manager to tell several GameServers apart (for example `Sub1`)                                     |

{% hint style="warning" %}

* A second GameServer on the same machine needs its own `ControlPort` (for example `55995`; `55991`-`55994` are taken by the other servers), and the same port on its row in the Server Manager. Otherwise the second one fails to listen and logs `[Control] failed to listen`.
* Set a `ControlKey` **before** you change `ControlBind` to a public or LAN address. With an empty key, anyone who can reach the port can shut the server down.
  {% endhint %}

## Log Settings

Each flag toggles one log category. Logs are written to the GameServer working directory.

| Key                      | Default | Logs                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `WriteChatLog`           | `1`     | Public, whisper, party, and guild chat                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `WriteCommandLog`        | `1`     | Every chat command use (success and denial)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `WriteTradeLog`          | `1`     | Trade window opens, items exchanged, zen transferred                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `WriteConnectLog`        | `1`     | Login, logout, character enter/leave                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `WriteHackLog`           | `1`     | Hack detections (see [Hack Settings](#hack-settings))                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `WriteCashShopLog`       | `1`     | Cash shop purchases and gift sends                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `WriteChaosMixLog`       | `1`     | Chaos machine attempts, outcomes, and announce broadcasts                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `WriteLuckySpinLog`      | `1`     | Lucky Spin spins (win/lose, prize, cost, charges left) and reward deliveries — including login redelivery of wins orphaned by a crash/disconnect                                                                                                                                                                                                                                                                                                                                                                               |
| `WriteMarketLog`         | `1`     | Market (personal store) to the `Market` folder: every deposit, withdraw, price change, open/close (with reason), sale, wallet collect and coin escrow step, plus every refused request as `[Market][Reject][<action>]` with the reason and item (index, level, serial). Also logs edge cases where an item could go missing: store rows dropped on login (`LoadRowLost`, with raw item bytes), auto-unlisted rows, dupe serial kicks, coin purchase timeouts and refunds. Rejects are capped at 10 lines per second per player |
| `WriteGameDataSyncLog`   | `0`     | GameDataSync block sends, chunk progress, completion / failure per player. Ships disabled - these lines are high-volume on a busy server. Set to `1` only when diagnosing a client/server data-sync mismatch                                                                                                                                                                                                                                                                                                                   |
| `WriteItemBagLog`        | `1`     | Item bag entries that point at an item not in Item.xml (skipped while loading the bag), plus GM make-item, make-set and drop commands refused for the same reason. Written to the `ItemBag` log folder                                                                                                                                                                                                                                                                                                                         |
| `WritePacketRejectLog`   | `0`     | Client packets the server refused (unknown opcode or subcode, wrong packet size). Written to the `ActionReject` log folder                                                                                                                                                                                                                                                                                                                                                                                                     |
| `WriteMovementRejectLog` | `0`     | Silent movement rejects and corrections (teleport range, forged path, gate mismatch, snap-back from a blocked tile). Written to the `ActionReject` log folder                                                                                                                                                                                                                                                                                                                                                                  |
| `WriteSkillRejectLog`    | `0`     | Skill casts and attacks the server refused (out of range, in safe zone, not enough mana/AG, wrong weapon, skill not learned). Written to the `ActionReject` log folder. Not in the shipped file - add the line to turn it on                                                                                                                                                                                                                                                                                                   |
| `WriteItemRejectLog`     | `0`     | Item actions the server refused (equip requirement not met, wrong slot, trade refusals). Written to the `ActionReject` log folder. Not in the shipped file - add the line to turn it on                                                                                                                                                                                                                                                                                                                                        |

Set to `0` to suppress that category. Logs rotate daily.

{% hint style="info" %}
The four `Write*RejectLog` keys share one `ActionReject` log folder. Each line has a `CATEGORY=` tag, the account and the character. To stop one cheater from filling the disk, each player gets at most 5 lines per second per category; the rest are counted in one `SUPPRESSED=` line. Turn these on when a player reports "my action did nothing" and you need to see why.
{% endhint %}

## Hack Settings

Server-side validators run on the potion use and movement paths. Not all of them disconnect - see the **Action** column.

| Key                            | Type      | Default | Action on trigger                                       | Effect                                                                                                                                                                                                                                                    |
| ------------------------------ | --------- | ------- | ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CheckAutoPotionHack`          | 0 or 1    | `1`     | Silently reject the potion (no disconnect, no hack log) | Prevents potion spam by enforcing a minimum gap between consumes.                                                                                                                                                                                         |
| `CheckAutoPotionHackTolerance` | int ms    | `250`   | -                                                       | Minimum gap between potion consumes. A use within this window is ignored.                                                                                                                                                                                 |
| `MoveSpeedGuardMode`           | 0-3       | `2`     | See below                                               | Movement speed guard. `0` = off, `1` = log-only (`[MoveSpeed]` lines, move still applied), `2` = refuse the move and snap the player back to the server position, `3` = as `2` plus disconnect at the 5th refused move within a rolling 60-second window. |
| `MoveSpeedGuardTolerance`      | int %     | `35`    | -                                                       | Extra leniency over the character's own walk speed. `35` = a player may cover 1.35x the distance his walk speed allows.                                                                                                                                   |
| `MoveSpeedGuardSlack`          | int tiles | `3`     | -                                                       | Extra distance always allowed on top of that (network lag, the client being a tile or two ahead of the server).                                                                                                                                           |

{% hint style="info" %}
**How the movement speed guard works.** The server remembers where each player was over the last few seconds. A move is refused when it would put the player farther from any of those spots than he can walk in that time, at his own speed (walk or run, wings, mounts), plus `Tolerance` and `Slack`. Teleports, warps, knockbacks and respawns are taken into account. Violations are written to the **hack log** (`WriteHackLog`), tagged `[MoveSpeed]`.

Independent of the mode, the server never accepts a position on a blocked tile or one that cannot be reached by walking from where the player is.

**Rollout:** legitimate play should produce **no** `[MoveSpeed]` lines. If players with an unusual speed source (custom items, buffs) trigger them, raise `MoveSpeedGuardTolerance`, or set mode `1` while you look into it.
{% endhint %}

{% hint style="info" %}
**Attack-speed protection is always on** and not exposed in `Common.dat`:

* `MaxAttackSpeed` caps the server-side attack speed used in all delay math, and `AttackSpeedOvercap` sets how far item and buff bonuses may push past that cap (see the Skill Timing / Attack Speed section below). Both values are sent to the client along with the rest of the timing config, so a change takes effect for a player on their next login rather than instantly.
* The skill timing validator recomputes a per-cast minimum delay from `BaseSkillDelay`, `SpeedGrowthFactor`, and `MinSkillDelay`, scaled per-skill via `Data/Plugins/Characters/SkillTweaks.xml`.
* Casts arriving faster than the computed minimum (with 20% tolerance) are blocked and logged as `[SkillTiming]`. 20 violations in a row disconnect the player.
  {% endhint %}

{% hint style="warning" %}
`CheckSpeedHack`, `CheckLatencyHack`, and `CheckAutoComboHack` (and their tolerances) were **removed**. They compared client-self-reported values, so real cheats bypassed them trivially. Their jobs are covered by the always-on skill timing validator and the `MoveSpeedGuard*` keys above. Leftover keys in an old `Common.dat` are ignored.
{% endhint %}

## Common Settings

| Key                          | Type         | Default | Effect                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ---------------------------- | ------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MaxItemOption`              | int 0-15     | `7`     | Cap on item option bonus (+0 to +15). Most legacy clients expect `7`; raising it requires a compatible client                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `JewelryLevelEnable`         | 0 or 1       | `1`     | `1` = elemental rings and pendants keep the item level they roll from every source (drops, item bags, chaos mix, shops, GM create, saved items), and Jewel of Bless / Jewel of Soul work on them. `0` forces every elemental ring and pendant to +0 on all of those paths and makes both jewels refuse them, which disables elemental resistance entirely                                                                                                                                                                                                                 |
| `JewelryLevelMax`            | int 0-15     | `7`     | Highest level an elemental ring or pendant may reach, applied on every creation path. It also lowers the Jewel of Bless (+6) and Jewel of Soul (+9) ceilings when set below them                                                                                                                                                                                                                                                                                                                                                                                          |
| `MaxIpConnection`            | int 0-N      | `10`    | Concurrent game connections allowed from one source IP. Distinct from ConnectServer's cap of the same name                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `MaxPacketsPerSecond`        | int 0-100000 | `250`   | Packets one game connection may send per second. A short burst of up to 4 seconds' worth is allowed, so a lag spike does not trip it. Over the limit the connection is closed and a line is written to the Hack log. A normal client sends about 15-45 per second while hunting and up to about 140 with the heaviest skills. `0` = no limit                                                                                                                                                                                                                              |
| `PersonalCodeCheck`          | 0 or 1       | `0`     | Require a personal passcode (second password) on character entry                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `SetItemAcceptHarmonySwitch` | 0 or 1       | `0`     | `1` allows Jewel of Harmony bonuses on set items                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `MainChecksum`               | int          | `0`     | Optional client main-binary checksum demanded at handshake. `0` disables the check; non-zero values force every client to report this exact checksum                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `JewelSocketPentagram`       | 0 or 1       | `0`     | `1` allows Jewel of Socket to apply on Pentagram items                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `KeepBonusBelowItemReq`      | 0 or 1       | `0`     | `1` keeps an equipped item's bonuses applied even after the character no longer meets its requirements (for example after a reset drops their level/stats). First equip still enforces level, strength, dexterity, vitality, energy, and leadership; once equipped, the item keeps applying its bonuses. The class requirement is always enforced. The value is sent to the client at login so its stat panel and the ancient set option list keep the same items the server applies. `0` = an item whose requirements are no longer met stops granting bonuses (default) |
| `KeepSkillBelowLearnReq`     | 0 or 1       | `0`     | The skill counterpart of `KeepBonusBelowItemReq`. `1` keeps a learned skill castable after the character no longer meets its stat requirements (again, typical after a reset). Learning the skill still enforces every `Require*` column in [Skill.txt](/docs/data/skill.md). `0` = the requirements are re-checked on every cast and the skill fails while they are unmet (default)                                                                                                                                                                                      |

### Elemental jewelry levels

`JewelryLevelEnable` and `JewelryLevelMax` control the level an elemental ring or pendant may carry. That level is what makes the item's resistance do anything: the resistance granted is the item's `*Res` value multiplied by its level, so a +0 ring grants nothing no matter how its `*Res` columns are set in [Item.xml](/docs/data/item/item.md).

Resistance translates into a chance to nullify the matching elemental effect:

| Item level | Nullify chance |
| ---------- | -------------- |
| +0         | 0%             |
| +1         | 50%            |
| +2         | 67%            |
| +3         | 75%            |
| +4         | 80%            |
| +5         | 83%            |
| +6         | 86%            |
| +7         | 88%            |

{% hint style="info" %}
Only the ten elemental rings and pendants are affected. On Wizard's Ring, the starter rings, transformation rings, pets and wings, item level selects a variant rather than acting as a plus, so these keys leave them alone.
{% endhint %}

## Movement / Warp Level Requirements

| Key                             | Type   | Default | Effect                                                                                                                                                                                                       |
| ------------------------------- | ------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `SpecialClassMoveLevelDiscount` | 0 or 1 | `1`     | `1` = vanilla: Magic Gladiator, Dark Lord and Rage Fighter need only two-thirds of a gate's or teleport's `MinLevel` on every map except Swamp of Calmness. `0` = all classes pay the full level requirement |

The per-destination level requirements themselves live in [Gate.txt](/docs/data/gate.md) and [Move.txt](/docs/data/gate/move.md); this key only decides whether the three special classes get a discount on them.

{% hint style="info" %}
This value is sent to the client, which uses it to grey out warp destinations the character cannot reach. Players who are already logged in keep the old behaviour in their warp list until they reconnect.
{% endhint %}

## PC Point Currency

{% hint style="warning" %}
**Not used in this build.** The PC Point system belongs to older seasons and is not part of this server. `PcPointSwitch` and `PcPointMaxPoint` are never read, so adding them does **not** turn PC Points on. The [BotBuffer](/docs/data/plugins/botbuffer.md) `PCPoints` cost does nothing. The [`/reward`](/docs/gameserver/command-dat.md) command is not affected by these keys.
{% endhint %}

## Monster Settings

| Key               | Type  | Default | Effect                                                         |
| ----------------- | ----- | ------- | -------------------------------------------------------------- |
| `MonsterLifeRate` | int % | `100`   | Global HP multiplier applied after all other monster modifiers |

## Health Bar

| Key                      | Default | Effect                               |
| ------------------------ | ------- | ------------------------------------ |
| `MonsterHealthBarSwitch` | `1`     | `1` shows monster HP bars to clients |
| `UserHealthBarSwitch`    | `1`     | `1` shows player HP bars to clients  |

## PK Settings

| Key              | Type    | Default | Effect                                                       |
| ---------------- | ------- | ------- | ------------------------------------------------------------ |
| `NonPK`          | 0 or 1  | `0`     | `1` disables all PK kills from counting toward outlaw status |
| `PKLimitFree`    | 0 or 1  | `0`     | `1` removes the per-day PK count cap                         |
| `PKDownTime1`    | seconds | `3600`  | Cooldown between second-tier and first-tier PK level         |
| `PKDownTime2`    | seconds | `3600`  | Cooldown between first-tier PK level and clear               |
| `PKDisableShop`  | 0 or 1  | `0`     | `1` blocks PK characters from opening personal shops         |
| `PKDisableTrade` | 0 or 1  | `0`     | `1` blocks PK characters from trading                        |

## Trade Settings

| Key           | Default | Effect                                   |
| ------------- | ------- | ---------------------------------------- |
| `TradeSwitch` | `1`     | Master toggle for player-to-player trade |

## Personal Shop Settings

| Key                  | Default | Effect                           |
| -------------------- | ------- | -------------------------------- |
| `PersonalShopSwitch` | `1`     | Master toggle for personal shops |

{% hint style="warning" %}
**Not used in this build:** `PersonalShopMoneyCommisionRate` and `PersonalShopJewelCommisionRate` (personal shop tax). These belong to a later season and are never read here. Adding them does nothing; personal shop sales are not taxed.
{% endhint %}

## Duel Settings

| Key                         | Type    | Default | Effect                                 |
| --------------------------- | ------- | ------- | -------------------------------------- |
| `DuelSwitch`                | 0 or 1  | `1`     | Master toggle for duel arena           |
| `DuelArenaAnnounceSwitch`   | 0 or 1  | `1`     | Broadcasts duel results to the server  |
| `DuelArenaDisableRestoreHP` | 0 or 1  | `0`     | `1` prevents HP restore during duel    |
| `DuelArenaDisableRestoreSD` | 0 or 1  | `0`     | `1` prevents SD restore during duel    |
| `DuelMaxScore`              | int     | `10`    | Score needed to win a duel             |
| `DuelBet`                   | int zen | `0`     | Mandatory bet amount. `0` = free duels |

## Guild Settings

| Key                      | Type   | Default | Effect                                               |
| ------------------------ | ------ | ------- | ---------------------------------------------------- |
| `GuildDeleteSwitch`      | 0 or 1 | `1`     | Allow guild deletion                                 |
| `GuildCreateMinLevel`    | int    | `100`   | Minimum character level to create a guild            |
| `GuildInsertMaxUser1`    | int    | `40`    | Base guild member cap                                |
| `GuildInsertMaxUser2`    | int    | `80`    | Expanded guild member cap after guild level-up       |
| `GuildAllianceMinUser`   | int    | `1`     | Minimum members required to form or join an alliance |
| `GuildAllianceMaxCount`  | int    | `5`     | Maximum guilds in an alliance                        |
| `GuildOwnerDestroyLimit` | 0 or 1 | `1`     | `1` lets the owner disband even with members present |

## Elf Buffer Settings

Controls Elf Soldier buff caps and formula constants. Four-tier keys apply per-account-level (see [Account Level](#account-level-al0-al3)).

| Key group                 | Default                  | Effect                                                 |
| ------------------------- | ------------------------ | ------------------------------------------------------ |
| `ElfBufferMaxLevel_AL0-3` | `1000 / 220 / 220 / 220` | Character level cap below which Elf buff still applies |
| `ElfBufferMaxReset_AL0-3` | `10000` each             | Reset cap below which Elf buff still applies           |
| `ElfBufferDamageConstA`   | `50`                     | Damage buff linear term                                |
| `ElfBufferDamageConstB`   | `5`                      | Damage buff quadratic term                             |
| `ElfBufferDefenseConstA`  | `45`                     | Defense buff linear term                               |
| `ElfBufferDefenseConstB`  | `3`                      | Defense buff quadratic term                            |

## Experience Settings

All rates are per-mille (out of 1000). `1000` = 1x, `2000` = 2x. Each group has four `_AL0-3` keys.

| Key group                               | Default  | Effect                                                                                                                                                                                                                    |
| --------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `AddExperienceRate_AL0-3`               | `100000` | Base XP multiplier for normal kills. `100000` equals 100x the baseline. Large values simulate high-rate servers                                                                                                           |
| `AddMasterExperienceRate_AL0-3`         | `100000` | Master XP multiplier                                                                                                                                                                                                      |
| `MinMasterExperienceMonsterLevel_AL0-3` | `95`     | Monster level below which no master XP is granted                                                                                                                                                                         |
| `AddEventExperienceRate_AL0-3`          | `1000`   | XP multiplier inside event maps (Blood Castle, Devil Square, etc.)                                                                                                                                                        |
| `AddQuestExperienceRate_AL0-3`          | `1000`   | XP multiplier for quest kills                                                                                                                                                                                             |
| `OffAttackExperienceRate_AL0-3`         | `1000`   | Replaces `AddExperienceRate` (not stacked on it) for normal-level characters while Off Attack is active. Missing key = same as `AddExperienceRate` for that tier (older builds used `0`, so offline characters got no XP) |
| `OffAttackMasterExperienceRate_AL0-3`   | `100000` | Replaces `AddMasterExperienceRate` for master-level characters while Off Attack is active. Missing key = same as `AddMasterExperienceRate`                                                                                |

{% hint style="info" %}
Experience rates stack multiplicatively with `MonsterLifeMultiplier` and level-difference penalties. High-rate servers typically set `AddExperienceRate` very high and leave the others at `1000`.
{% endhint %}

{% hint style="warning" %}
`OffAttackExperienceRate` is **not** on the same scale as `AddEventExperienceRate` / `AddQuestExperienceRate`, even though they sit next to each other in the file. The event and quest rates multiply a separate reward value. The Off Attack rate is substituted directly for `AddExperienceRate` in the per-kill formula. Leaving it at `1000` while `AddExperienceRate` is `100000` gives offline characters 1% of the online XP rate.
{% endhint %}

## Monster Kill EXP Formula

The base EXP a monster gives before any rate above is applied. Defaults equal the vanilla formula, so leaving them alone changes nothing.

| Key                             | Default | Effect                                                                                                                                                                       |
| ------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ExpBaseOffset`                 | `25`    | Base = (MonsterLevel + offset) x MonsterLevel / divisor                                                                                                                      |
| `ExpBaseDivisor`                | `3`     | See above. Minimum 1                                                                                                                                                         |
| `ExpLevelGapFree`               | `10`    | How many levels a player may be above the monster before the penalty starts. Past that, base x (MonsterLevel + gap) / PlayerLevel. Master characters use Level + MasterLevel |
| `ExpHighLevelBonusFrom`         | `65`    | Monsters at this level or above give a bonus                                                                                                                                 |
| `ExpHighLevelBonusDivisor`      | `4`     | Solo bonus = (MonsterLevel - (From - 1)) x (MonsterLevel / divisor). Minimum 1                                                                                               |
| `ExpFinalRate`                  | `125`   | % applied to the base at the end (vanilla x1.25)                                                                                                                             |
| `ExpPartyLowLevelSupport`       | `200`   | In a party, members more than N levels below the top member count as Level + N toward the party average                                                                      |
| `ExpPartyHighLevelBonusBase`    | `200`   | Party bonus for monsters at `ExpHighLevelBonusFrom`+ = base - PartyAverageLevel / divisor                                                                                    |
| `ExpPartyHighLevelBonusDivisor` | `5`     | See above. Minimum 1                                                                                                                                                         |

The party bonus uses the party's average level. Older builds used the killer's level for every member.

## Death Penalty

Dying to a monster costs EXP. Never zen and never items. On by default.

| Key                         | Default        | Effect                                                             |
| --------------------------- | -------------- | ------------------------------------------------------------------ |
| `DeathExpPenaltySwitch`     | `1`            | `0` turns the penalty off                                          |
| `DeathExpPenaltyMinLevel`   | `11`           | Characters below this level lose nothing                           |
| `DeathExpPenaltyRate`       | `10`           | Per mille of the current level's EXP span lost on death. `10` = 1% |
| `DeathExpPenaltyMasterRate` | `7`            | Same for master-level characters (0.7%)                            |
| `DeathExpPenaltyPKRate1-3`  | `30 / 40 / 50` | Replaces the normal rate for PK level 4, 5 and 6 (murderer stages) |
| `DeathExpPenaltyInDungeon`  | `0`            | `1` also applies the penalty inside dungeon runs                   |

EXP never drops below the start of the current level, so nobody loses a level. No penalty for PvP deaths (killed by a player or a player's summon), event maps (Blood Castle, Devil Square, Chaos Castle, Illusion Temple, Doppelganger, Imperial Guardian, Custom Arena), or Crywolf during the battle. The player sees a notice and the new EXP arrives with the respawn.

## Item Drop Settings

| Key                  | Type             | Default | Effect                                                 |
| -------------------- | ---------------- | ------- | ------------------------------------------------------ |
| `ItemDropTime`       | seconds          | `30`    | Lifetime of dropped items on the ground before despawn |
| `ItemDropRate_AL0-3` | int out of 10000 | `100`   | Drop chance per kill, out of 10000. `100` = 1%         |

## Money Drop Settings

| Key                         | Type           | Default | Effect                                                 |
| --------------------------- | -------------- | ------- | ------------------------------------------------------ |
| `MoneyDropTime`             | seconds        | `30`    | Lifetime of dropped zen piles                          |
| `MoneyAmountDropRate_AL0-3` | int multiplier | `1`     | Per-tier multiplier applied on top of base monster zen |

## Monster Stat Multipliers

All percentages. `100` = unchanged, `200` = 2x, etc.

| Key                             | Default | Effect                          |
| ------------------------------- | ------- | ------------------------------- |
| `MonsterLifeMultiplier`         | `100`   | Scales monster HP               |
| `MonsterDamageMinMultiplier`    | `100`   | Scales minimum monster damage   |
| `MonsterDamageMaxMultiplier`    | `100`   | Scales maximum monster damage   |
| `MonsterDefenseMultiplier`      | `100`   | Scales monster physical defense |
| `MonsterMagicDefenseMultiplier` | `100`   | Scales monster magic defense    |

## Monster Hit Damage Reset Settings

Controls the **damage credit** table, which decides who owns a monster's drop and EXP. This is not aggro — clearing it does not make a monster stop chasing.

| Key                             | Type    | Default | Effect                                                                                                                               |
| ------------------------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `MonsterHitDamageResetOnDeath`  | 0 or 1  | `0`     | `1` clears damage records when the monster dies. Runs after the drop is awarded, so this is cleanup only and changes nothing in play |
| `MonsterHitDamageResetTime`     | seconds | `30`    | Seconds without a hit before a player's damage record expires                                                                        |
| `MonsterHitDamageResetDistance` | steps   | `0`     | Steps from spawn point before **all** records clear. `0` disables the check                                                          |

{% hint style="warning" %}
`MonsterHitDamageResetDistance` is not a leash. The monster keeps chasing; it just stops owing anyone a drop, so a pulled monster dies giving no loot and no EXP to anybody. Use **Monster Leash Settings** below if you want monsters to go home.
{% endhint %}

## Monster Leash Settings

Vanilla MU has no leash. Once a monster is aggroed, `ActionState.Emotion` is set and the wander-radius check is skipped entirely, so the monster can be dragged across the whole map. Aggro also re-arms every time the target is re-found in view range, so a kiting player drags it indefinitely. When aggro finally lapses, the monster stands frozen wherever it stopped, because its wander targets are still measured from its spawn tile and all of them now fail.

| Key                        | Type   | Default | Effect                                                                                                                                                                     |
| -------------------------- | ------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MonsterLeashDistance`     | tiles  | `0`     | Extra tiles allowed **beyond the spawn's own wander radius** before the monster drops aggro. `0` disables the leash (vanilla). Suggested `15`                              |
| `MonsterLeashReturnHome`   | 0 or 1 | `1`     | `1` walks the monster back to its spawn tile, refusing aggro the whole way. `0` drops aggro and lets it settle where it stopped, adopting that tile as its new wander home |
| `MonsterLeashHealOnReturn` | 0 or 1 | `1`     | `1` restores full HP/Mana and wipes damage credit once the monster gives up                                                                                                |

Leave `MonsterLeashHealOnReturn` at `1`: without it a player can tag a monster, drag it past the leash, and still own the drop when someone else finishes the healed monster.

If the spawn tile turns out to be unreachable (walled off, built over), the walk home is abandoned after 30 seconds and the monster resumes normal behaviour where it stands. The original spawn tile is restored on death like always.

### Why the distance is relative

`MonsterLeashDistance` is added to the monster's own wander radius; it is not an absolute distance from spawn. That radius is the per-spawn `Dis` in `Data/Monster/MonsterSetBase/*.xml`, or `30` for invasion-spawned monsters.

`Dis` is wildly inconsistent across the spawn files:

| `Dis`             | Spawn entries | Where                                                                                                |
| ----------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
| `30`              | 4096          | Kanturu, Devil Square, Vulcanus, Land of Trials, Crywolf, Elbeland, Karutan, Raklion, all event maps |
| `10`              | 267           | Lorencia and other classic maps                                                                      |
| `05`              | 655           | most common on classic maps                                                                          |
| `07` / `03` / `1` | 53            | scattered                                                                                            |
| `00`              | 326           | NPCs and guards - never leashed                                                                      |

An absolute leash would have to exceed `30` to avoid firing on `Dis="30"` spawns during normal wandering, which would make it nearly useless on the `Dis="05"` spawns that make up most of the classic maps. Relative gives every spawn the same chase room: with the suggested `15`, a `Dis="05"` spawn leashes at 20 tiles and a `Dis="30"` spawn at 45.

### Invasions

Invasion monsters (`InvasionManager`) are spawned outside `MonsterSetBase` and get `WanderRange` `30`, or the boss `ClusterRadius` when the invasion uses cluster mode. They are leashed like anything else, measured from the random tile each one spawned on. With `15` an invasion mob gives up 45 tiles from where it appeared; cluster trash gives up at `ClusterRadius + 15`, so a tight `ClusterRadius` also tightens that invasion's leash.

### Not affected

These keep vanilla behaviour entirely:

* NPCs, guards and traps (`Dis="00"`, no wander radius)
* Stationary monsters (`MoveRange` 0)
* Summons (`Attribute` 100) and monster-summoned adds
* **Every monster on Blood Castle, Chaos Castle, Devil Square, Kalima, Illusion Temple, Doppelganger, Imperial Guardian and Castle Siege maps** - those events need monsters to chase players anywhere on the map

The event-map exclusion is by map number, not by spawn type. Blood Castle, Chaos Castle and Devil Square monsters are ordinary `MonsterSetBase` entries carrying `Dis="30"`, so nothing else would have caught them.

## Advanced Money Drop Settings

Chooses how the **base** zen amount for a monster kill is derived. Player bonuses are applied on top of whichever base is used.

| Key                | Type | Default  | Effect                                                                                                                                |
| ------------------ | ---- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `MoneyValue_AL0-3` | int  | `100000` | Base zen per monster level: `MoneyValue * MonsterLevel`. Set to `0` to use the baseline formula (`MonsterZen * MoneyAmountDropRate%`) |

Full order of operations:

```
base   = MoneyValue > 0 ? (MoneyValue * MonsterLevel)
                        : (MonsterZen * MoneyAmountDropRate / 100)
amount = base * PlayerZenBonus% / 100     <- item options, item implicits, master skill tree
amount = amount * (100 + CatchUpBonus%) / 100
```

{% hint style="info" %}
`MoneyDropItemBonusRate` was **removed**. It gated the player zen bonus behind a second multiplier that only existed in the `MoneyValue > 0` branch, so leaving it at its `0` default silently voided every source of "Increases Zen acquisition rate" — excellent options, item implicits and the master skill tree node alike. The player bonus now always multiplies the base, in both modes, the same way the Catch-Up bonus does. Delete the key from your `GameServerInfo - Common.dat`; it is no longer read.
{% endhint %}

## Item Durability Settings

Percentage of baseline durability consumed. `100` = normal, `200` = items break twice as fast, `50` = half rate.

| Key                      | Default |
| ------------------------ | ------- |
| `WeaponDurabilityRate`   | `100`   |
| `ArmorDurabilityRate`    | `100`   |
| `WingDurabilityRate`     | `100`   |
| `GuardianDurabilityRate` | `100`   |
| `PendantDurabilityRate`  | `100`   |
| `RingDurabilityRate`     | `100`   |
| `PetDurabilityRate`      | `100`   |

{% hint style="info" %}
**Not used in this build:** `MuunDurabilityRate`. Muun pets belong to a later season, so the key is never read. It is not in the shipped file and adding it does nothing.
{% endhint %}

## Trade Item Block Settings

Each flag blocks a category from being traded when `1`.

| Key                     | Default | Blocks                       |
| ----------------------- | ------- | ---------------------------- |
| `TradeItemBlock`        | `0`     | All items (master switch)    |
| `TradeItemBlockExc`     | `0`     | Excellent items              |
| `TradeItemBlockSet`     | `0`     | Set items                    |
| `TradeItemBlockHarmony` | `0`     | Harmony-enhanced items       |
| `TradeItemBlockSell`    | `0`     | Items whose sell flag is set |
| `TradeItemBlockLucky`   | `1`     | Lucky items                  |

## Level Up Settings

| Key                    | Type   | Default      | Effect                                                 |
| ---------------------- | ------ | ------------ | ------------------------------------------------------ |
| `MaxLevelUp`           | int    | `1`          | Levels granted per normal kill                         |
| `MaxLevelUpEvent`      | int    | `1`          | Levels granted per event kill                          |
| `MaxLevelUpQuest`      | int    | `1`          | Levels granted per quest reward                        |
| `MaxStatPoint_AL0-3`   | int    | `2000000000` | Stat point cap per tier                                |
| `DWLevelUpPoint`       | int    | `5`          | Stat points per level for Dark Wizard                  |
| `DKLevelUpPoint`       | int    | `5`          | Dark Knight                                            |
| `FELevelUpPoint`       | int    | `5`          | Fairy Elf                                              |
| `MGLevelUpPoint`       | int    | `7`          | Magic Gladiator                                        |
| `DLLevelUpPoint`       | int    | `7`          | Dark Lord                                              |
| `SULevelUpPoint`       | int    | `5`          | Summoner                                               |
| `RFLevelUpPoint`       | int    | `7`          | Rage Fighter                                           |
| `PlusStatPoint`        | int    | `1`          | Bonus points per level applied to every class          |
| `LevelUpRestoreLife`   | 0 or 1 | `1`          | `1` = HP filled to max on level up (normal and master) |
| `LevelUpRestoreMana`   | 0 or 1 | `1`          | `1` = MP filled to max on level up                     |
| `LevelUpRestoreShield` | 0 or 1 | `1`          | `1` = SD filled to max on level up                     |
| `LevelUpRestoreBP`     | 0 or 1 | `1`          | `1` = AG filled to max on level up                     |

## Create Character Settings

Controls which advanced classes can be created and the prerequisites. Each advanced class (MG, DL, SU, RF) has four keys: a master `CreateType`, plus per-tier `CreateLevel_AL0-3`, `CreateReset_AL0-3`, and `CreateMasterReset_AL0-3`.

| Key                              | Effect                                                                                                                  |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `CharacterCreateSwitch`          | Master toggle for all character creation                                                                                |
| `<CLASS>CreateType`              | `0` = another character on the account must meet the requirement. `1` = apply the requirement to the creating character |
| `<CLASS>CreateLevel_AL0-3`       | Minimum character level                                                                                                 |
| `<CLASS>CreateReset_AL0-3`       | Minimum reset count                                                                                                     |
| `<CLASS>CreateMasterReset_AL0-3` | Minimum master reset count                                                                                              |

Valid class prefixes: `MG`, `DL`, `SU`, `RF`.

{% hint style="danger" %}
Setting `RFCreateLevel_AL*` to `250` is a known bug that prevents creation entirely. Use `0` or any value other than `250`.
{% endhint %}

## Shield Gauge Settings

| Key                          | Type   | Default | Effect                                                                                                                  |
| ---------------------------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------------------- |
| `ShieldGaugeRate`            | int %  | `90`    | Baseline shield damage absorption rate                                                                                  |
| `ShieldGaugeConstA`          | int    | `12`    | Shield formula linear term                                                                                              |
| `ShieldGaugeConstB`          | int    | `15`    | Shield formula quadratic term                                                                                           |
| `ShieldGaugeAttackRate`      | int    | `2`     | Shield consumption rate per attack                                                                                      |
| `ShieldGaugeAttackComboMiss` | 0 or 1 | `0`     | `1` consumes shield on combo misses too                                                                                 |
| `ShieldGaugePvE`             | 0 or 1 | `0`     | `1` = SD also absorbs monster hits, using the same `ShieldGaugeRate` split. `0` = SD only takes player damage (vanilla) |

{% hint style="info" %}
SD only regenerates in safe zones (or with SD-recovery item options). With `ShieldGaugePvE = 1`, SD drains while hunting and stays low until the player uses SD potions or returns to town.
{% endhint %}

## Master Skill Tree Settings

| Key                       | Default | Effect                            |
| ------------------------- | ------- | --------------------------------- |
| `MasterSkillTree`         | `0`     | `1` enables the master skill tree |
| `MasterSkillTreePoint`    | `1`     | Skill points per master level     |
| `MasterSkillTreeMaxLevel` | `400`   | Master level cap                  |

## Gens System Settings

Faction-vs-faction contribution system.

| Key                                       | Type    | Default | Effect                                                      |
| ----------------------------------------- | ------- | ------- | ----------------------------------------------------------- |
| `GensSystemSwitch`                        | 0 or 1  | `1`     | Master toggle                                               |
| `GensSystemGuildLock`                     | 0 or 1  | `0`     | `1` locks faction per guild (all members share one faction) |
| `GensSystemPartyLock`                     | 0 or 1  | `0`     | `1` prevents parties mixing factions                        |
| `GensSystemInsertMinLevel`                | int     | `50`    | Minimum level to join a faction                             |
| `GensSystemContributionFloodTime`         | seconds | `30`    | Minimum gap between contribution-earning kills              |
| `GensSystemVictimContributionDecrease`    | int     | `3`     | Base contribution lost per death to a rival                 |
| `GensSystemKillerContributionIncrease`    | int     | `500`   | Base contribution gained per rival kill                     |
| `GensSystemVictimMinContributionDecrease` | int     | `1`     | Lower bound on victim loss                                  |
| `GensSystemVictimMaxContributionDecrease` | int     | `15`    | Upper bound on victim loss                                  |
| `GensSystemKillerMinContributionIncrease` | int     | `1`     | Lower bound on killer gain                                  |
| `GensSystemKillerMaxContributionIncrease` | int     | `15`    | Upper bound on killer gain                                  |
| `GensSystemStartRewardDay`                | int     | `1`     | First day of the weekly reward window                       |
| `GensSystemFinalRewardDay`                | int     | `7`     | Last day of the weekly reward window                        |

## Helper Settings (MuHelper)

| Key                  | Type    | Default | Effect                                                                                                                                                                                         |
| -------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `HelperSwitch`       | 0 or 1  | `1`     | Master toggle for MuHelper                                                                                                                                                                     |
| `OffAttackSwitch`    | 0 or 1  | `1`     | Master toggle for offline-attack. Gates **both** the `/offattack` chat command and the MuHelper Offline bridge. When `0`: chat command rejected with notice, bridge rejected before transition |
| `HelperActiveLevel`  | int     | `80`    | Minimum level to use MuHelper                                                                                                                                                                  |
| `HelperActiveDelay`  | minutes | `5`     | Zen charge interval                                                                                                                                                                            |
| `HelperActiveMoney1` | zen     | `20`    | Cost tier 1 (baseline level)                                                                                                                                                                   |
| `HelperActiveMoney2` | zen     | `50`    | Cost tier 2                                                                                                                                                                                    |
| `HelperActiveMoney3` | zen     | `80`    | Cost tier 3                                                                                                                                                                                    |
| `HelperActiveMoney4` | zen     | `100`   | Cost tier 4                                                                                                                                                                                    |
| `HelperActiveMoney5` | zen     | `120`   | Cost tier 5 (high level)                                                                                                                                                                       |
| `HelperMaxLevel`     | int     | `0`     | Global fallback maximum combined level (Level + Master Level) allowed to run MuHelper. `0` = no maximum. Used by any map whose `HelperMaxLevel` is `*`                                         |
| `HelperExpRate`      | int %   | `100`   | Global fallback XP percentage earned while MuHelper is active. `100` = full XP, `50` = half. Used by any map whose `HelperExpRate` is `*`                                                      |
| `OffAttackMinLevel`  | int     | `0`     | Minimum character level allowed to enter the `/offattack` chat command or MuHelper Offline bridge. `0` = no minimum. Global fallback for any map whose `OffAttackMinLevel` is `*`              |
| `OffAttackMaxLevel`  | int     | `0`     | Maximum combined level (Level + Master Level) allowed to use offline-attack. `0` = no maximum. Global fallback for any map whose `OffAttackMaxLevel` is `*`                                    |

`HelperMaxLevel`, `HelperExpRate`, `OffAttackMinLevel`, and `OffAttackMaxLevel` are the four server-wide fallbacks for the per-map MuHelper and Offline Mode limits. When a map in [MapManager.xml](/docs/data/mapmanager.md#per-map-muhelper-and-offline-mode-limits) sets one of these attributes to `*`, the value here is used for that map. See that page for the per-map overrides.

### MuHelper Offline Bridge

When a player ticks the **OffLine** checkbox in the MuHelper window and then presses **Start**, the server skips the normal helper billing loop and instead transitions the character directly into the same offline-attack mode used by the [`/offattack`](/docs/data/command-xml.md#shipped-commands) chat command.

**Flow:**

1. Player ticks the OffLine box and configures their primary attack skill in the MuHelper window. Closing the window saves the config to DataServer.
2. Player presses **Start** on MuHelper.
3. If the OffLine flag is set and the location allows it, the server starts custom-attack mode using the player's primary MuHelper attack skill, switches it to offline, and signals the client to **fully exit the process** (not just disconnect to the login screen). The character keeps attacking server-side until killed or the time limit runs out. Helper itself never runs - no Zen billing, no client-side helper logic.
4. If the OffLine flag is set but the location does not allow offline-attack (safezone, event map, trade/duel, no skill resolved), the server emits a chat notice and the helper does **not** start - the player stays online and must untick the box (or move to a valid map) before pressing Start again.
5. If the OffLine flag is **not** set, Start behaves normally: helper billing kicks in, client runs MuHelper.

Stop on MuHelper always behaves normally (stops helper). It is not part of the offline bridge.

**On reconnect:** the auto-resume entry written when offline-attack starts is force-cleared by the bridge, so when the player relaunches the client and logs back in, the offline attack stops and the character is back to a clean online state. This differs from `/attack` followed by `/offattack` chat commands - the chat-command path leaves auto-resume intact (per the existing `/offattack` behavior).

**Restrictions inherited from `/offattack`:**

* Map must allow custom attack ([MapManager.xml](/docs/data/mapmanager.md) `Attack` flag).
* Character must not be in safezone, trade, duel, or any event map (Chaos Castle, Doppelganger, Blood Castle, Crywolf, Illusion Temple, Deathmatch Arena, Doppelganger, Imperial Guardian).
* Character must have at least one valid attack skill (the primary MuHelper attack skill, falling back to the class default).

#### What carries over from MuHelper

| MuHelper config                                                 | Used in offline mode?                                                                                                                                                                           |
| --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Primary attack skill (Skill 1 in the UI)                        | **Yes** — used as the single skill `/offattack` cycles                                                                                                                                          |
| OffLine checkbox                                                | **Yes** — gates whether Start triggers the bridge                                                                                                                                               |
| Activation skills (Skill 2, Skill 3)                            | No — offline runs one skill only                                                                                                                                                                |
| Skill conditions (mob count, on-attack triggers)                | No                                                                                                                                                                                              |
| Combo                                                           | No                                                                                                                                                                                              |
| Buff skills picked in MuHelper UI                               | No — see "Built-in defaults" below                                                                                                                                                              |
| Auto Heal / Drain Life thresholds                               | No                                                                                                                                                                                              |
| Hunting range, targeting mode (nearest / lowest HP)             | No — picks first valid target in viewport                                                                                                                                                       |
| Long-range counter-attack, return-to-position, max seconds away | No                                                                                                                                                                                              |
| Pickup options (Zen, Jewels, Ancient, Excellent, Extras)        | **Yes** - offline mode walks to and picks up ground items matching the saved pickup filters                                                                                                     |
| Auto Repair                                                     | **Yes** - equipped items at or below 50% durability are self-repaired offline (deducts zen), throttled to a 5-second check                                                                      |
| Pet attack mode (Dark Raven / Dark Horse)                       | No                                                                                                                                                                                              |
| Self-defense, auto-accept friend / guild                        | No                                                                                                                                                                                              |
| Auto Reset checkbox in MuHelper                                 | No (MuHelper-side flag); the [Reset System plugin](/docs/data/plugins/resetsystem.md) AutoReset state is separate and continues to fire if the character hits the level cap, regardless of mode |

#### Built-in defaults (what offline mode does on its own)

These run server-side regardless of MuHelper config, driven by the `CustomAttack*` keys. Most live in this file; the auto-potion cooldown lives in [Custom.dat](/docs/gameserver/custom-dat.md):

| Behavior                                          | Source / tunable                                                                                                                                                                             |
| ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Single-skill attack on nearest viewable mob       | Skill from MuHelper Skill 1; range / animation from `Skill.txt`                                                                                                                              |
| Auto HP potion below 50% Life                     | Inventory slots `(14,3)` Big -> `(14,2)` Middle -> `(14,1)` Small; cooldown [`CustomAttackAutoPotionDelay`](/docs/gameserver/custom-dat.md) (Custom.dat)                                     |
| Auto Mana potion below 50% Mana                   | Inventory slots `(14,6)` -> `(14,5)` -> `(14,4)`; cooldown [`CustomAttackAutoPotionDelay`](/docs/gameserver/custom-dat.md) (Custom.dat)                                                      |
| Stay within 5 tiles of start position             | Auto-stops if dragged outside                                                                                                                                                                |
| Per-AccountLevel time limit                       | `CustomAttackTime_AL0-3` in Common.dat (`0` = unlimited)                                                                                                                                     |
| Per-AccountLevel autobuff (class-hardcoded buffs) | `CustomAttackAutoBuff_AL0-3`; **bridge passes `SetBuff=0`** so this is off by default in the bridge path even when configured. The `/attack` chat command can opt in via `/attack <skill> 1` |
| XP rate while offline                             | `OffAttackExperienceRate_AL0-3` (normal level), `OffAttackMasterExperienceRate_AL0-3` (master level). Both REPLACE the online rate, not multiply it                                          |
| Stop on safezone / trade / duel                   | Hardcoded                                                                                                                                                                                    |

The hardcoded class buffs (when autobuff is enabled by chat command, not the bridge) cycle through:

* Elf: Infinity Arrow, Greater Defense, Greater Damage, Heal
* DW / DK / DL / SU / RF: class-specific class buffs (Soul Barrier, Swell Life, Greater Critical Damage, Damage Reflection / Berserker, Ignore Defense / Increase Health / Increase Block)

#### Disabling offline mode

| Gate                                      | File                                              | Blocks chat `/offattack`?  | Blocks MuHelper Offline bridge?                                                                                                   |
| ----------------------------------------- | ------------------------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| **`OffAttackSwitch=0`**                   | this file                                         | **Yes**                    | **Yes**                                                                                                                           |
| Per-map `Attack` flag                     | [MapManager.xml](/docs/data/mapmanager.md)        | Yes                        | Yes                                                                                                                               |
| Per-AccountLevel `Enable` on `/offattack` | [Command.xml](/docs/data/command-xml.md) Index 67 | Yes                        | No — the bridge calls handlers directly, it does not go through CommandManager                                                    |
| `CustomAttackTime_AL{N}=0`                | this file                                         | No (means "no time limit") | No (same)                                                                                                                         |
| `HelperSwitch=0`                          | this file                                         | No (unrelated)             | Yes — bridge runs in the helper-start path; if helper is master-disabled, the Start packet is rejected before the bridge can fire |

**Recommended:** use `OffAttackSwitch=0` for a single-key global lockout - it's the only gate that blocks **both** entry points (chat command and MuHelper bridge) cleanly. When the bridge cannot proceed, it sends a chat notice and the helper does **not** fall back to online mode - the player must untick the OffLine box to start the helper online.

{% hint style="info" %}
The OffLine checkbox is opt-in. Players who don't tick it press Start and get normal online helper as before.
{% endhint %}

## Cash Shop Settings

| Key                              | Type    | Default | Effect                                                                 |
| -------------------------------- | ------- | ------- | ---------------------------------------------------------------------- |
| `CashShopSwitch`                 | 0 or 1  | `1`     | Master toggle                                                          |
| `CashShopGoblinPointDelay`       | minutes | `0`     | Interval between automatic Goblin Point grants. `0` disables the timer |
| `CashShopGoblinPointValue_AL0-3` | int     | `0`     | Goblin Points granted per tick, per tier                               |

{% hint style="info" %}
`CashShopScriptVersion*` and `CashShopBannerVersion*` appear in the shipped template but are not read by the current GameServer build. Leave them in place for forward compatibility; changes have no effect.
{% endhint %}

## Event Inventory and Mu Rummy

{% hint style="warning" %}
**Not used in this build.** The Event Inventory and the Mu Rummy card game belong to a later season. These keys are never read, and changing them does nothing:

`EventInventorySwitch`, `EventInventoryExpireYear`, `EventInventoryExpireMonth`, `EventInventoryExpireDay`, `MuRummySwitch`, `MuRummyRewardScore1`, `MuRummyRewardScore2`, `MuRummyRewardMoneyAmount`.
{% endhint %}

## Party Settings

Party XP distribution for party sizes 1-5. A party never has more than 5 members.

| Key                         | Default                   | Effect                                                                                                                                                                                                               |
| --------------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PartyMaxMembers`           | `5`                       | Maximum slots in a party                                                                                                                                                                                             |
| `PartyReconnectTime`        | `300` seconds             | Window to rejoin a party after disconnect. Also the window after a GameServer start in which clients may restore their parties (members must list each other, normal party map and Gens rules apply). `0` = both off |
| `PartyGeneralExperience1-5` | `100 / 80 / 75 / 65 / 60` | Percentage share per party size N (generic party). Keys 6-10 are no longer read                                                                                                                                      |
| `PartySpecialExperience1-5` | `100 / 80 / 75 / 65 / 60` | Share when 3 or more different classes are in range of the kill                                                                                                                                                      |
| `PartyDisablePK`            | `0`                       | `1` prevents PK characters from joining parties                                                                                                                                                                      |
| `PartyExperienceDistance`   | `0`                       | Tiles a party member may be from the dying monster and still get a share of the experience. Straight line, same map only. `0` = vanilla 10. Does not affect party heal/buff range, which stays at 10                 |
| `PartyExperienceRequireLOS` | `0`                       | `1` also requires a clear line of sight: a wall between the monster and the member blocks that member's share. `0` = vanilla, walls ignored                                                                          |

## Potion Settings

Per-potion restore rates, percent of max pool.

| Key                          | Default   | Effect                                  |
| ---------------------------- | --------- | --------------------------------------- |
| `ApplePotionRate`            | `10`      | Apple: % of max HP restored             |
| `SmallLifePotionRate`        | `20`      | Small Healing                           |
| `MidleLifePotionRate`        | `30`      | Medium Healing                          |
| `LargeLifePotionRate`        | `25`      | Large Healing                           |
| `SmallManaPotionRate`        | `20`      | Small Mana                              |
| `MidleManaPotionRate`        | `30`      | Medium Mana                             |
| `LargeManaPotionRate`        | `40`      | Large Mana                              |
| `SmallShieldPotionRate`      | `25`      | Small Shield                            |
| `MidleShieldPotionRate`      | `35`      | Medium Shield                           |
| `LargeShieldPotionRate`      | `45`      | Large Shield                            |
| `SmallCompoundPotionRate1/2` | `10 / 5`  | Small Compound: HP / MP (both restored) |
| `MidleCompoundPotionRate1/2` | `25 / 10` | Medium Compound                         |
| `LargeCompoundPotionRate1/2` | `45 / 20` | Large Compound                          |
| `EliteLifePotionRate`        | `100`     | Elite Healing                           |
| `EliteManaPotionRate`        | `100`     | Elite Mana                              |
| `EliteShieldPotionRate`      | `65`      | Elite Shield                            |

## Transformation Ring Settings

Map slots 1-6 to a transformation item index. Values are item subtypes in the Miscellaneous item category.

| Key                   | Default | Ring slot |
| --------------------- | ------- | --------- |
| `TransformationRing1` | `2`     | Slot 1    |
| `TransformationRing2` | `7`     | Slot 2    |
| `TransformationRing3` | `14`    | Slot 3    |
| `TransformationRing4` | `8`     | Slot 4    |
| `TransformationRing5` | `9`     | Slot 5    |
| `TransformationRing6` | `41`    | Slot 6    |

## Jewel Settings

Success rates (percent) for jewel and stone operations. Each group has four `_AL0-3` keys.

| Key group                      | Default | Effect                              |
| ------------------------------ | ------- | ----------------------------------- |
| `SoulSuccessRate_AL0-3`        | `100`   | Jewel of Soul on item +level up     |
| `LifeSuccessRate_AL0-3`        | `50`    | Jewel of Life on item +option       |
| `HarmonySuccessRate_AL0-3`     | `50`    | Jewel of Harmony enhancement        |
| `SmeltStoneSuccessRate1_AL0-3` | `50`    | Harmony Refining Stone purification |
| `SmeltStoneSuccessRate2_AL0-3` | `70`    | Harmony Refining Stone smelt        |
| `AddLuckSuccessRate1_AL0-3`    | `25`    | Lucky option roll attempt 1         |
| `AddLuckSuccessRate2_AL0-3`    | `20`    | Lucky option roll attempt 2         |

## Fruit Settings

Stat point redistribution via fruits. `_AL0-3` rate keys of `-1` mean the engine uses built-in formulas.

| Key                              | Default | Effect                                                    |
| -------------------------------- | ------- | --------------------------------------------------------- |
| `FruitAddPointMin`               | `1`     | Minimum stat points added per fruit                       |
| `FruitAddPointMax`               | `3`     | Maximum added                                             |
| `FruitAddPointSuccessRate_AL0-3` | `-1`    | Success rate override. `-1` keeps engine default          |
| `FruitSubPointMin`               | `1`     | Minimum subtracted per fruit                              |
| `FruitSubPointMax`               | `9`     | Maximum subtracted                                        |
| `FruitSubPointSuccessRate_AL0-3` | `-1`    | Subtract success rate override. `-1` keeps engine default |

## HP Bonus System

Grants bonus HP per master reset.

| Key             | Default | Effect                                            |
| --------------- | ------- | ------------------------------------------------- |
| `HpBonus_AL0-3` | `1`     | HP added per master reset, per tier               |
| `HpBonus_MAX`   | `1`     | Absolute cap on total bonus HP. Missing key = `0` |

Bonus HP = master resets x `HpBonus_ALn`, cut down to `HpBonus_MAX`. The shipped cap of `1` makes the system almost do nothing (at most +1 HP). Raise `HpBonus_MAX` to use it.

## Die System

Chat announcements on death.

| Key                | Default | Effect                                 |
| ------------------ | ------- | -------------------------------------- |
| `DieUserSwitch`    | `1`     | Broadcasts when a player dies          |
| `DieMonsterSwitch` | `1`     | Broadcasts when a notable monster dies |

## Online User System

| Key                | Default | Effect                        |
| ------------------ | ------- | ----------------------------- |
| `OnlineGmSwitch`   | `1`     | Announces GM login/logout     |
| `OnlineUserSwitch` | `1`     | Announces player login/logout |

## Experience Message

| Key                 | Default | Effect                                                                         |
| ------------------- | ------- | ------------------------------------------------------------------------------ |
| `DisableExpMessage` | `0`     | `1` hides XP-per-kill messages; only level-up messages remain. Premium feature |

## Pushback Effects

Each flag removes the push/fall animation triggered by the named skill when `1`.

| Key                      | Default | Removes pushback from |
| ------------------------ | ------- | --------------------- |
| `DisableLightningEffect` | `1`     | Lightning             |
| `DisableCycloneEffect`   | `1`     | Cyclone               |
| `DisableTwistEffect`     | `1`     | Twisting Slash        |
| `DisableLungEffect`      | `1`     | Lunge                 |
| `DisableFallingEffect`   | `1`     | Falling Slash         |
| `DisableUpperCutEffect`  | `1`     | Uppercut              |

## Wing Class Mix Restrictions

Per-class blocks on wing creation in the Chaos Machine.

| Key                | Default | Effect                                      |
| ------------------ | ------- | ------------------------------------------- |
| `DisableWingMixDL` | `0`     | `1` prevents Dark Lord from mixing wings    |
| `DisableWingMixSU` | `0`     | `1` prevents Summoner from mixing wings     |
| `DisableWingMixRF` | `0`     | `1` prevents Rage Fighter from mixing wings |

## PK Event Access

| Key            | Default | Effect                                     |
| -------------- | ------- | ------------------------------------------ |
| `PkCanEnterBC` | `0`     | `1` allows PK characters into Blood Castle |
| `PkCanEnterCC` | `0`     | `1` allows PK into Chaos Castle            |
| `PkCanEnterDS` | `0`     | `1` allows PK into Devil Square            |

## PK Item Drop

Controls item drops from PKed characters.

| Key                      | Type             | Default  | Effect                                       |
| ------------------------ | ---------------- | -------- | -------------------------------------------- |
| `PkItemDropSwitch`       | 0 or 1           | `0`      | Master toggle                                |
| `PkItemDropEnable_AL0-3` | 0 or 1           | `1` each | Per-tier enable                              |
| `PkItemDropMinLevel`     | int              | `0`      | Minimum character level before drops trigger |
| `PkItemDropMaxLevel`     | int              | `15`     | Maximum level at which drops still trigger   |
| `PkItemDropExecellent`   | 0 or 1           | `1`      | Include Excellent items in the drop pool     |
| `PkItemDropSocketItem`   | 0 or 1           | `1`      | Include Socket items                         |
| `PkItemDropSetItem`      | 0 or 1           | `1`      | Include Set items                            |
| `PkItemDropHarmony`      | 0 or 1           | `1`      | Include Harmony-enhanced items               |
| `PkItemDropRate`         | int out of 10000 | `100`    | Drop chance per eligible item. `100` = 1%    |

## Disconnect Online Account

| Key                       | Default | Effect                                                                         |
| ------------------------- | ------- | ------------------------------------------------------------------------------ |
| `DisconnectOnlineAccount` | `1`     | On duplicate login, kick the existing session instead of rejecting the new one |

## Castle Siege Skills

| Key                     | Default | Effect                                                    |
| ----------------------- | ------- | --------------------------------------------------------- |
| `EnableCsSkillsAllMaps` | `1`     | `1` enables Castle Siege skill effects outside the CS map |

## Combo System

| Key                      | Default | Effect                                   |
| ------------------------ | ------- | ---------------------------------------- |
| `EnableComboToAllSwitch` | `1`     | `1` enables combo skills for every class |
| `ComboEnablePushEffect`  | `1`     | `1` knocks back monsters on combo hits   |

`EnableComboToAllSwitch` remains the master toggle. The CustomCombo plugin (`Data/Plugins/Characters/CustomCombo.xml`) extends the system by defining which skills count as primary and secondary in a combo for the classes that unlock it. CustomCombo does not shadow this switch; a class with combos disabled here stays without combos regardless of plugin content.

## Online Rewards

Periodic zen / coin rewards for connected players. `OnlineRewardOfflineSystems = 1` extends this to offline accounts. Coin1 = WC, Coin2 = WP, Coin3 = GP.

| Key                            | Default  | Effect                                 |
| ------------------------------ | -------- | -------------------------------------- |
| `OnlineRewardOfflineSystems`   | `0`      | `1` applies rewards even while offline |
| `OnlineRewardCoin1Delay`       | `60` min | Interval for Coin1                     |
| `OnlineRewardCoin1Value_AL0-3` | `0`      | Amount per interval for each tier      |
| `OnlineRewardCoin2Delay`       | `60` min | Interval for Coin2                     |
| `OnlineRewardCoin2Value_AL0-3` | `0`      | Amount per interval                    |
| `OnlineRewardCoin3Delay`       | `60` min | Interval for Coin3                     |
| `OnlineRewardCoin3Value_AL0-3` | `0`      | Amount per interval                    |

## Skill Timing / Attack Speed

Global attack speed formula for every skill. Server is authoritative; client display is cosmetic.

```
delay = max(MinSkillDelay, BaseSkillDelay * 1000 / (1000 + speed * SpeedGrowthFactor))
APS   = (1000 + speed * SpeedGrowthFactor) / BaseSkillDelay
```

| Key                  | Default | Effect                                                                                                                                                                                                                                                                                                                        |
| -------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MaxAttackSpeed`     | `290`   | Cap on the speed a character reaches from stats alone. `0` = no cap                                                                                                                                                                                                                                                           |
| `AttackSpeedOvercap` | `50`    | How much speed items, potions and buffs may add **beyond** `MaxAttackSpeed`. Stat (agility) speed alone can never exceed `MaxAttackSpeed`; bonuses stack on top of it and are clamped to this value. Absolute ceiling = `MaxAttackSpeed + AttackSpeedOvercap`. `0` = vanilla behavior, where bonuses cannot push past the cap |
| `BaseSkillDelay`     | `1000`  | Starting delay in ms (delay at speed 0)                                                                                                                                                                                                                                                                                       |
| `SpeedGrowthFactor`  | `23`    | APS gain per speed point. Higher = faster scaling                                                                                                                                                                                                                                                                             |
| `MinSkillDelay`      | `100`   | Minimum delay in ms. Absolute floor                                                                                                                                                                                                                                                                                           |

At the shipped defaults, stat speed caps at `290` (130 ms delay, 7.69 casts/sec) and bonuses may carry a character to `340`.

{% hint style="warning" %}
Per-skill timing overrides live in the SkillTweaks plugin. Those layer on top of this global formula.
{% endhint %}

## Cross-File Dependencies

| Setting here                                                                                  | Depends on or affects                                                                                             |
| --------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `EnableCastleSiege`                                                                           | Every Castle Siege schedule/reward block in [Event.dat](/docs/gameserver/event-dat.md) is inert when `0`          |
| `WriteChaosMixLog`                                                                            | Gates log rows produced by [ChaosMix plugin](/docs/data/plugins/chaosmix.md) recipes                              |
| `WriteLuckySpinLog`                                                                           | Gates log rows produced by the LuckySpin plugin (`Data/Plugins/LuckySpin/` wheels)                                |
| `GameDataOverlay`                                                                             | Path of the overlay folder shadowing shared `Data/` - see [Data Overlays](/docs/data/overlays.md)                 |
| Create Character Settings                                                                     | Combines with [Character.dat](/docs/gameserver/character-dat.md) class availability                               |
| `<CLASS>LevelUpPoint`, `PlusStatPoint`                                                        | Feed stat growth curves in [Character.dat](/docs/gameserver/character-dat.md)                                     |
| `ServerMinReset`, `ServerMaxReset`, `ServerMinMasterReset`, `ServerMaxMasterReset`            | Cap reset limits defined per-command in [Command.dat](/docs/gameserver/command-dat.md)                            |
| `EnableComboToAllSwitch`, `ComboEnablePushEffect`                                             | Combo definitions live in [CustomCombo plugin](/docs/data/plugins/customcombo.md); this switch is the master gate |
| Skill Timing block (`MaxAttackSpeed`, `BaseSkillDelay`, `SpeedGrowthFactor`, `MinSkillDelay`) | Per-skill scaling in [SkillTweaks plugin](/docs/data/plugins/skilltweaks.md)                                      |
| `HelperSwitch`, `HelperActive*`                                                               | Pickup whitelist in [MuHelperPickup plugin](/docs/data/plugins/muhelperpickup.md)                                 |
| `CashShopSwitch`, `CashShopGoblinPointDelay`, `CashShopGoblinPointValue_AL*`                  | Cash shop catalog in [Cash Shop](/docs/data/cashshop.md)                                                          |
| `MasterSkillTree`, `MasterSkillTreePoint`, `MasterSkillTreeMaxLevel`                          | Tree definitions in [MasterSkillTree](/docs/data/skill/masterskilltree.md)                                        |

## Common Issues

* **Stuck at "Loading files..."** - `LicenseKey` empty or invalid
* **Port in use** - `ServerPort` conflicts with another process or a previous crashed instance
* **Duplicate "GameServer online/offline" in ConnectServer log** - `ServerCode` matches another running GameServer
* **Players report wrong server name** - `ServerName` mismatch with what ConnectServer's `ServerList.xml` advertises
* **VIP users get the same rates as free accounts** - `_AL1`/`_AL2`/`_AL3` keys all set to the same value as `_AL0`
* **Players rubber-banded or disconnected for moving too fast** - check the hack log for `[MoveSpeed]` lines; raise `MoveSpeedGuardTolerance`/`MoveSpeedGuardSlack`, or set `MoveSpeedGuardMode` to `1` (log-only) while you look into it
* **Cannot create Rage Fighter** - `RFCreateLevel_AL*` set to `250` (known bug)
* **Castle Siege schedule does nothing** - `EnableCastleSiege = 0`
