Skip to content

CustomMaps Adding

wezzzyrek1 edited this page Sep 18, 2026 · 1 revision

Adding a map

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.

Numbering

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\

The files

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.

Models

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.

Light and height maps

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.

Minimap

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.

Copying a world

  1. Copy Data\World9\ to Data\World161\.
  2. Rename every EncTerrain9.* to EncTerrain161.*.
  3. 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.
  4. Copy the world's object tables inside Data\Lang.mpr: EffectInfo9.txt to EffectInfo161.txt, and MapObjectAnimationInfo9.txt too if the world has one. Without them the copied objects lose their effects and animation behaviour - see Object effects and animations.
  5. Register the map in CustomMap.xdc (below).
  6. Add the map on the server side so players can actually be moved there.

CustomMap.xdc

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.

Root attributes

Attribute Meaning
CustomMusicPath path your own tracks live under, e.g. Data\Music\Custom\

<Info> / <Map>

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.

<Area>

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" />

<MusicFileExclude>

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" />

One rule for the whole file

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.

Adding the script

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

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.

Checklist

  • Data\World<n+1>\ exists with all EncTerrain<n+1>.* files
  • terrain files renumbered to the new world, not just renamed
  • the world's tables copied inside Lang.mpr under the new number
  • <Map ID> added to CustomMap.xml and encrypted to .xdc
  • music files present under the path CustomMusicPath names
  • map registered on the server, and the plugin active on the licence
  • [Lua] LuaCustomMapEnable = 1 in the GameServer's Data\Plugins\PluginSettings.ini
  • script named after the map number, if the map needs one

See Also

Clone this wiki locally