MonsterSetBase Configuration
Controls where and how monsters spawn across all maps. The server scans one folder of per-map XML files at startup and appends every entry into a single global spawn table.
File Location#
Per-map spawns: Data/Monster/MonsterSetBase/*.xml (one file per map)
No master registry file ships with AXIOM-EMU. The server scans the MonsterSetBase/ directory and loads every .xml file it finds.
Dependencies#
| Depends On | Purpose |
|---|---|
| Monster.xml | Spawns reference monster stats by Class (Index) |
| MapManager.xml | Entries on a map not enabled by this server are silently dropped at load time |
| Used By | Purpose |
|---|---|
| Map loading | Server reads spawn files during map initialization |
| Event systems | Blood Castle, Devil Square, Illusion Temple, Imperial Guardian, Raklion, Crywolf, Castle Siege, Chaos Castle, and Invasion Manager all scan the spawn table for their Type 3 / Type 4 entries |
File Structure#
Per-Map Spawn Files#
Each map has its own file: MonsterSetBase/000 - Lorencia.xml, MonsterSetBase/001 - Dungeon.xml, etc. The filename is documentation only; the actual map is chosen by each entry's Map attribute. Files load in alphabetical order and their entries are appended into one global spawn table, so adding or renaming a file is all that is needed to register new spawns.
Map numbers match the game's internal map IDs (00 = Lorencia, 01 = Dungeon, 02 = Devias, etc.) and must match the Map value written inside each entry.
Spawn Entry Attributes#
| Attribute | Type | Description |
|---|---|---|
Type | int | Spawn type (see Spawn Types below) |
Class | int | Monster Index from Monster.xml |
Map | int | Map number (00 = Lorencia, 01 = Dungeon, etc.) |
Dis | int | Roaming distance from spawn point (in tiles) |
X | int | Spawn X coordinate |
Y | int | Spawn Y coordinate |
TX | int | Target X coordinate (Type 1/3 only) - defines spawn area with X |
TY | int | Target Y coordinate (Type 1/3 only) - defines spawn area with Y |
Dir | int | Facing direction (0-7, or -1 for random) |
Count | int | Number of monsters to spawn (Type 1/3 only, minimum 1 if 0) |
Value | int | Parsed but unused - no current system reads it. Leave it off new entries |
Comment | string | Description (optional, for admin reference) |
Spawn Types#
| Type | Name | Behavior | Use Case |
|---|---|---|---|
| 0 | Fixed | Single monster at exact X/Y; respawns at the same location | NPCs, guards, stationary bosses |
| 1 | Group | Count monsters spawn randomly inside the (X,Y)-(TX,TY) rectangle; each respawn re-rolls a point in the same rectangle | Normal hunting zones |
| 2 | Spot | Single monster; loader offsets X/Y by -3..+3 once at load, then every (re)spawn picks a fresh point within +/-3 of that offset X/Y | Scattered individual spawns |
| 3 | Event | Parsed then skipped at map init; no system currently activates it. Do not use | None - see the warning below |
| 4 | Event Fixed | Single monster at exact X/Y; filtered out of normal init and activated by event code matching on MonsterClass and Map | Blood Castle, Devil Square, Illusion Temple, Imperial Guardian, Raklion |
Type 0: Fixed Spawn#
<Monster Type="0" Class="226" Map="00" Dis="00" X="122" Y="110" Dir="03" Comment="Trainer"/>
- Spawns exactly 1 monster at X=122, Y=110
- Dis="00" means the monster cannot roam
- Dir is a 0-7 facing index; use -1 for random
- Use for NPCs and bosses at specific locations
Type 1: Group Spawn#
<Monster Type="1" Class="003" Map="00" Dis="10" X="187" Y="121" TX="187" TY="121" Dir="-1" Count="007" Comment="Spider"/>
- Spawns 7 spiders at (187,121) because TX=X and TY=Y (the spawn rectangle collapses to a single tile)
- TX/TY must be set larger than X/Y to create a real spawn area; otherwise every unit of
Countspawns at the exact point Dis="10"allows each monster to roam 10 tiles from its spawn pointDir="-1"means random facing- Use for normal monster packs in hunting zones
Type 2: Spot Spawn#
<Monster Type="2" Class="028" Map="03" Dis="05" X="202" Y="155" Dir="-1" Comment="BeetleMonster"/>
- Spawns 1 monster within a 7x7 box centered on the configured X/Y (coordinates offset by -3..+3 on each axis)
- The loader offsets the stored X/Y once at load time, then picks a fresh random point within +/-3 of that offset X/Y on every spawn and respawn
- Good for scattered individual monsters that should not cluster
- Commonly used in Noria for BeetleMonster and ForestMonster
Type 3: Event Spawn (Invasion Manager)#
<Monster Type="3" Class="089" Map="00" Dis="10" X="100" Y="100" TX="120" TY="120" Dir="-1" Count="010" Value="1" Comment="White Wizard Event"/>
Type 4: Event Fixed Spawn#
<Monster Type="4" Class="131" Map="11" Dis="00" X="100" Y="100" Dir="03" Comment="Blood Castle Gate"/>
- Single monster at exact X/Y for event systems
- Behaves like Type 0 but filtered by event code (Type 3/4 are excluded from normal spawns)
- Used by Blood Castle, Devil Square, Illusion Temple, Imperial Guardian, Raklion
- Event systems programmatically control when these spawns are activated
Direction Values#
| Dir | Meaning |
|---|---|
| 0-7 | Facing index (MU Online standard 8-way facing) |
| -1 | Random; loader rolls a fresh 0-7 value per entry at load time |
TODO: verify exact compass mapping of each 0-7 value against the client's direction table.
Important Behavior#
Spawn Timing#
Coordinate System#
- Coordinates are in tiles (not pixels)
- Origin (0,0) is typically top-left corner
- Maximum coordinates vary by map (usually 255x255 or similar)
- Invalid coordinates = monster spawns but is unreachable/invisible
Dis (Roaming Distance)#
- Dis="00" = Monster cannot move (stays at spawn point)
- Dis="10" = Monster can wander up to 10 tiles from spawn point before AI forces return
- Distance is calculated as Euclidean distance from spawn point (sqrt formula)
- Too high Dis on maps with walls = monsters may appear to walk through walls when returning
- NPCs should always have Dis="00" to prevent walking away
Count Behavior#
Type 1 and 3 spawn exactly Count monsters:
Count="007"spawns 7 monstersCount="000"spawns 1 monster (the loader converts zero to one)- Each monster rolls its initial location inside the (X,Y)-(TX,TY) rectangle
- On death, the respawn rolls a new location in the same rectangle (Type 1/3 only)
Internally the loader expands each Type 1 / Type 3 entry into Count individual spawn slots in the 20000-slot global table. A Count="050" entry consumes 50 slots.
TX/TY as Spawn Area#
For Type 1/3, (X,Y) and (TX,TY) define a rectangular spawn area:
- If
TX=XandTY=Y, every unit ofCountspawns at the exact point (the box collapses to a single tile). Use this only when you want stacked spawns - If
TX>XorTY>Y, spawns are spread across the rectangle (must be greater than, not just not equal) - Example:
X="100" Y="100" TX="120" TY="120"= 20x20 tile spawn zone - The picker retries up to 100 times to find a walkable tile before giving up on that roll
Event Spawn Filtering (Type 3/4)#
Examples#
<Monster Type="0" Class="226" Map="00" Dis="00" X="122" Y="110" Dir="03" Comment="Trainer"/>
Spawns Trainer NPC at fixed location in Lorencia, cannot roam (Dis=0), facing index 3.
<Monster Type="1" Class="000" Map="00" Dis="10" X="201" Y="069" TX="201" TY="069" Dir="-1" Count="007" Comment="BullFighter"/>
Spawns 7 Bull Fighters at (201,69) with 10-tile roaming range, random facing. Because TX=X and TY=Y, all 7 start on the same tile before they roam apart.
<Monster Type="1" Class="003" Map="00" Dis="10" X="140" Y="080" TX="220" TY="180" Dir="-1" Count="050" Comment="Spider Zone"/>
Spawns 50 Spiders across an 80x100 tile zone (from 140,80 to 220,180), creating a dense hunting area.
<Monster Type="0" Class="018" Map="00" Dis="05" X="125" Y="125" Dir="00" Comment="Gorgon Boss"/>
Spawns Gorgon boss at (125,125), can roam 5 tiles, facing index 0. Respawn time is controlled by Monster.xml RegenTime.
<Monster Type="4" Class="131" Map="11" Dis="00" X="015" Y="075" Dir="00" Comment="Blood Castle Gate"/>
Defines a gate spawn for the Blood Castle event. Type 4 is filtered out of the normal map initialization spawn pass; Blood Castle finds it by scanning the spawn table for matching MonsterClass and Map.
<Monster Type="2" Class="028" Map="03" Dis="05" X="202" Y="155" Dir="-1" Comment="BeetleMonster"/>
<Monster Type="2" Class="028" Map="03" Dis="05" X="212" Y="157" Dir="-1" Comment="BeetleMonster"/>
The loader offsets each entry's X/Y by -3..+3 once at load time. On every spawn and respawn the server rolls a fresh random point inside +/-3 of that offset X/Y, so each entry occupies a 7x7 tile box.
Per-Map Spawn Files#
Each map has its own spawn file. The folder ships with files covering at least the following map IDs:
| Map ID | File | Map Name |
|---|---|---|
| 00 | 000 - Lorencia.xml | Lorencia |
| 01 | 001 - Dungeon.xml | Dungeon |
| 02 | 002 - Devias.xml | Devias |
| 03 | 003 - Noria.xml | Noria |
| 04 | 004 - Lost Tower.xml | Lost Tower |
| 06 | 006 - Arena.xml | Arena |
| 07 | 007 - Atlans.xml | Atlans |
| 08 | 008 - Tarkan.xml | Tarkan |
| 09 | 009 - Devil Square 1.xml | Devil Square (lower tiers) |
| 10 | 010 - Icarus.xml | Icarus |
| 11-17, 52 | 011 - Blood Castle 1.xml ... 017 - Blood Castle 7.xml, 052 - Blood Castle 8.xml | Blood Castle |
| 18-23, 53 | 018 - Chaos Castle 1.xml ... 023 - Chaos Castle 6.xml, 053 - Chaos Castle 7.xml | Chaos Castle |
| 24-29, 36 | 024 - Kalima 1.xml ... 029 - Kalima 6.xml, 036 - Kalima 7.xml | Kalima |
| 30 | 030 - Castle Siege.xml | Castle Siege |
| 31 | 031 - Land of Trials.xml | Land of Trials |
| 32 | 032 - Devil Square 2.xml | Devil Square (higher tiers) |
| 33 | 033 - Aida.xml | Aida |
| 34 | 034 - Crywolf.xml | Crywolf |
| 37-39 | 037 - Kanturu 1.xml ... 039 - Kanturu 3.xml | Kanturu |
| 40 | 040 - Silent.xml | Silent Map |
| 41 | 041 - Barracks.xml | Barracks of the Balgass |
| 42 | 042 - Refuge.xml | Refuge of the Balgass |
| 45-50 | 045 - Illusion Temple 1.xml ... 050 - Illusion Temple 6.xml | Illusion Temple |
| 51 | 051 - Elbeland.xml | Elbeland |
Kanturu 3 (map 39) also has dedicated spawn entries in KanturuMonsterSetBase.xml loaded separately for the Kanturu event.
Common Tasks#
Add Monster Spawn to Map#
- Find the map file (e.g.,
002 - Devias.xml) - Add a new
<Monster>entry - Set Type (usually 1 for monster groups)
- Set Class to monster Index from Monster.xml
- Set X/Y coordinates and Count
Increase Monster Density#
Find existing spawn entries and increase Count:
<!-- Before -->
<Monster Type="1" Class="003" Map="00" Dis="10" X="187" Y="121" TX="187" TY="121" Dir="-1" Count="007" Comment="Spider"/>
<!-- After -->
<Monster Type="1" Class="003" Map="00" Dis="10" X="187" Y="121" TX="187" TY="121" Dir="-1" Count="020" Comment="Spider"/>
Create Dense Hunting Zone#
Add multiple spawn entries with overlapping areas:
<Monster Type="1" Class="005" Map="02" Dis="10" X="100" Y="100" TX="120" TY="120" Dir="-1" Count="015"/>
<Monster Type="1" Class="005" Map="02" Dis="10" X="110" Y="110" TX="130" TY="130" Dir="-1" Count="015"/>
<Monster Type="1" Class="005" Map="02" Dis="10" X="120" Y="100" TX="140" TY="120" Dir="-1" Count="015"/>
Creates 45 Hell Hounds across overlapping zones for intense hunting.
Remove Monster from Map#
Delete or comment out the spawn entry:
<!-- <Monster Type="1" Class="003" Map="00" Dis="10" X="187" Y="121" TX="187" TY="121" Dir="-1" Count="007" Comment="Spider"/> -->
Move Boss Location#
Change X and Y coordinates:
<!-- Before -->
<Monster Type="0" Class="018" Map="01" Dis="05" X="125" Y="125" Dir="00" Comment="Gorgon"/>
<!-- After -->
<Monster Type="0" Class="018" Map="01" Dis="05" X="200" Y="200" Dir="00" Comment="Gorgon"/>
Common Issues#
Related Pages#
- Monster.xml - Stats, RegenTime, and level for every Class referenced here
- KanturuMonsterSetBase.xml - Separate Kanturu-event spawn list for map 39
- MapManager.xml - Map index table controlling which maps this server actually runs