Repository navigation
CustomMaps Adding
A custom map is a world folder, one entry in a config file, and - if you want it to do anything of its own - a script. The running example is Tarkan Copy, map number 160, a copy of Tarkan that can be changed without touching the original.
Map numbers are 0-based and the client's own maps end at 146. Anything from 147 up to 199 is yours. If that is not enough, the number of maps will be raised in an update.
Number them from 199 down. Every update of the game adds its new maps straight after its last one, so a custom map low in the range is the first to end up on the same number as one of them.
The world folder is named for the map number plus one, which is a client convention worth getting right the first time:
| Map number | World folder |
|---|---|
| 8 (Tarkan) | Data\World9\ |
| 160 (Tarkan Copy) | Data\World161\ |
Data\World161\ the world itself
EncTerrain161.map tile textures
EncTerrain161.att walkability and height flags
EncTerrain161.obj object placement
TerrainLight.OZB, TerrainHeight.OZB light map and height map
<textures and object models>
Data\Interface\GFx\NaviMap\Navimap161.OZP the minimap (optional)
Data\Local\CustomMap.xdc map registration (encrypted)
Data\Lang.mpr object tables, inside the archive (optional)
EffectInfo\EffectInfo161.txt
MapObjectAnimationInfo\MapObjectAnimationInfo161.txt
Data\Custom\Scripts\Game\Maps\160.gsc the map script (optional)
CustomMap.xdc is optional. Without it the client starts normally, and custom maps
and fog stay off.
A world's object models live in Data\Object<n+1>\, one per object type, named for the
type plus one: Object95.bmd is type 94, Object08.bmd type 7. The client reads
BMD versions 10 and 15; version 12, which some older tools write, is not read by this
client - convert such a model first.
TerrainLight.OZB is the world's light map: a 24-bit BMP of 256 x 256, one pixel per tile,
behind a 4-byte prefix. The client reads only this file - a TerrainLight.OZJ beside it is
ignored. It multiplies the map by its own slope shading, with the sun from +x, -y and above,
so flat ground shows the map's value as it is and slopes facing away darken by themselves.
Bake shadows and colour into the map, not slope shading, or slopes come out twice as dark.
TerrainHeight.OZB is read from byte 1084 - after the 4-byte prefix and a 1080-byte BMP
header - one byte per tile, 1.5 world units per step.
The minimap is Data\Interface\GFx\NaviMap\Navimap<n>.OZP, where <n> is the world
number - the map number plus one, as in the world folder: Navimap161.OZP for Tarkan
Copy. The file can only be generated, with
MU World Creator from the IGCN
store. A map without one still loads; it just has no minimap.
- Copy
Data\World9\toData\World161\. - Rename every
EncTerrain9.*toEncTerrain161.*. - Renumber those three files with IGC File Encrypt in its Map number mode. They still declare the world they were made for, and the client refuses a terrain file whose number does not match its name.
-
Copy the world's object tables inside
Data\Lang.mpr:EffectInfo9.txttoEffectInfo161.txt, andMapObjectAnimationInfo9.txttoo if the world has one. Without them the copied objects lose their effects and animation behaviour - see Object effects and animations. - Register the map in
CustomMap.xdc(below). - Add the map on the server side so players can actually be moved there.
Edit Data\Local\CustomMap.xml, then encrypt it to CustomMap.xdc with
IGC File Encrypt in its Standard mode. The client only ever reads the .xdc.
<CustomMap CustomMusicPath="Data\Music\Custom\">
<Info>
<Map ID="160" Name="Tarkan Copy" ExtHeight="0" MainMusic="tarkan_main.mp3" SafeZoneMusic="tarkan_safe.mp3">
<Area StartX="100" EndX="140" StartY="100" EndY="140" FileName="cave.mp3" Flag="2" />
</Map>
</Info>
<MusicFileExclude>
<File Name="Lorencia.mp3" />
</MusicFileExclude>
</CustomMap>Every <Map> lists every attribute and at least one <Area>, so all entries read alike.
What a map does not use keeps its off value - an empty track, and the empty <Area>
below when it has no areas.
| Attribute | Meaning |
|---|---|
CustomMusicPath |
path your own tracks live under, e.g. Data\Music\Custom\
|
| Attribute | Meaning |
|---|---|
ID |
the map number, 147 or above |
Name |
the name shown on the world-entry banner and the minimap |
MainMusic |
track for the whole map, file name inside the custom music folder; empty for none |
SafeZoneMusic |
track used while the player stands in a safe zone; empty for none |
ExtHeight |
1 when the world's TerrainHeight.OZB is the extended format (about 196 KB), 0 (default) for the classic one (about 66 KB). Wrong here and the ground comes out deformed |
Each track is optional on its own: a map with no MainMusic is silent and still plays
the music of its areas.
An ID outside 0..199 makes the client exit on startup, so keep <Info> empty
until the map actually exists.
An optional per-region track inside a map. Coordinates are tile coordinates.
| Attribute | Meaning |
|---|---|
StartX EndX StartY EndY
|
the rectangle, 1..255 |
FileName |
track to play inside it; empty skips the area |
Flag |
2 plays FileName inside the rectangle, 1 stops it; 0 does nothing |
Up to 30 areas per map; a rectangle outside 1..255 is skipped. A map with no areas keeps
one that is skipped - all coordinates 0 and no track:
<Area StartX="0" EndX="0" StartY="0" EndY="0" FileName="" Flag="0" />Stops an original track from ever playing, by file name. Use it when you replace a world's music and do not want the original starting underneath.
<File Name="Lorencia.mp3" />No comments inside tags. The parser will not survive them. Comments above the root element are fine, which is where the shipped file keeps its notes.
A map script is optional. Add one when the world needs animated scenery or weather:
Data\Custom\Scripts\Game\Maps\160.gsc production, encrypted
Data\Custom\Scripts\Game\Maps\160.lua dev mode only
The file name is the map number, not the world folder number. There is nothing to register - the client looks for a file of that name when the map is entered.
See Map scripts.
Fog is configured in the same CustomMap.xdc, in its own section, and works on
original maps as well as custom ones. See Distance fog.
-
Data\World<n+1>\exists with allEncTerrain<n+1>.*files - terrain files renumbered to the new world, not just renamed
- the world's tables copied inside
Lang.mprunder the new number -
<Map ID>added toCustomMap.xmland encrypted to.xdc - music files present under the path
CustomMusicPathnames - map registered on the server, and the plugin active on the licence
-
[Lua] LuaCustomMapEnable = 1in the GameServer'sData\Plugins\PluginSettings.ini - script named after the map number, if the map needs one
- Map scripts - making the world move
-
Object effects and animations - what the tables in
Lang.mprdo - Distance fog - fog and horizon colour per map
- Custom Maps & Monsters - turning the plugin on
MuLua Scripting Plugin | Home
🖼️ Lua UI
- File map
- Creating windows
- Client and server
- Designing a window
- Protocol
- Scrolling and scrollbars
- Controls
- Custom text
- Text input
- Debug console
- Bitmap Slicer
- Encrypting scripts
Maps
Monsters
Shared
Version 1.14 | 2026-09-09