Customs
With Main.dll, a custom item had to be added on both sides: the server defined it in its Item.txt, and the client needed a regenerated item.bmd plus the Encoder tables packed into ClientInfo.bmd. If they did not match, the item looked wrong or the server rejected it.
Now the server is the only source. At login, the server sends the client a catalog with every definition: items, monsters, effects, pets and tooltips. The client only needs the models (.bmd files and their textures) in its Data folder. There is no item.bmd to regenerate and no code to touch.
Client and server must be the same version (0.97.20 or later). This system does not work with the DLL client.
Where the files go
| What | Where |
|---|---|
| Definitions | Server: MuServer/Data/ in the repository, or /opt/mu/Data inside the Docker volume |
| Models and textures | Client: bin/Client/Data/ before you build or distribute it |
A persistent Docker volume is not updated when you pull a new image: whatever you add there is kept across versions.
After adding or changing a custom, restart the server and log in again to receive the new catalog. The JSON files are validated at startup: a file with errors is discarded entirely and the reason is written to the GameServer log.
Indexes: the classic range and the extended one
Each item section (swords, axes, maces, spears, bows, staffs, shields, helms, armors, pants, gloves, boots, wings, helpers, potions and jewels) has 32 indexes in 0.97k, from 0 to 31.
On top of that, each section accepts indexes 32 to 511: these are added items, which fit without overwriting any original item. An added item must state which original item it imitates (the Behavior column): that decides the logic the game has written per item type, such as whether it uses arrows, whether it is a wing or a jewel, or which excellent options it can have. Everything else (name, stats, size, model, glow, effects) comes from its own row.
Example 1: an item with the Encoder tables
If you already have customs built for the DLL, the Encoder tables are still used without converting anything. They go in the server’s Data/Custom/Encoder/: CustomItem.txt, CustomGlow.txt, CustomBow.txt, CustomMonster.txt, ItemPosition.txt and MapFog.txt.
The Knight Blade at index 0,20:
// Data/Custom/Encoder/CustomItem.txt
00,020 22 "Sword21" // Knight Blade
// Data/Custom/Encoder/CustomGlow.txt
00,020 191 165 127 // Knight Blade
Model in the client: bin/Client/Data/Item/Custom/20/ (sword21.bmd and its textures).
Example 2: an item in the extended range
The same model as an added item, at 0,32. Everything goes in one row of Data/Item/Item.txt: after the usual columns you add the behavior, the model folder and name, and the glow color in RGB.
32 0 22 1 4 1 1 0 "Crimson Knight Blade" ... 00,020 "Item\Custom\20\" "Sword21" 255 40 40
It behaves like the Knight Blade (00,020), uses the Sword21 model and glows red. Copy a full row from the section and adjust its stats: the ... in the example stands for the usual columns and is not written like that.
To test it with a GM account: /make 0 32.
Example 3: a full set
The Great Dragon set at index 21 of sections 7 to 11 (helm, armor, pants, gloves and boots):
// Data/Custom/Encoder/CustomItem.txt
07,021 0 "HelmMale22" // Great Dragon Helm
08,021 0 "ArmorMale22" // Great Dragon Armor
09,021 0 "PantMale22" // Great Dragon Pant
10,021 0 "GloveMale22" // Great Dragon Glove
11,021 0 "BootMale22" // Great Dragon Boot
Models in the client: bin/Client/Data/Player/Custom/21/. The same pieces can also be defined without the Encoder, with the model columns in Item.txt ("Player\Custom\21\" "HelmMale22").
Custom equipment is also visible on other players and on the character selection screen.
Example 4: effects, pose and tooltip
Data/Custom/Items/<section>_<index>.json adds to an item, custom or original, effects drawn on the model’s bones, its pose in the inventory and its own tooltip lines.
Wings with flares and particles:
{
"item": "12,032",
"effects": [
{ "on": "equipped", "type": "sprite", "texture": "Effect/Flare.jpg",
"bones": [5, 6, 7, 8, 18, 19], "color": [0.5, 0.0, 0.0], "scale": 0.6,
"pulse": { "speed": 0.002, "scale": 0.2, "color": 0.4 } },
{ "on": "equipped", "type": "particle", "particle": 1230,
"bones": [13, 31], "chance": 2, "color": [0.8, 0.8, 0.3], "scale": 0.5 }
]
}
The tooltip takes up to 6 lines, as plain text ("Zen picker") or with a color ({ "text": "Zen picker", "color": "gold" }). Colors: white, blue, red, gold, green, darkred, purple, darkblue and darkgold.
The server ships two real examples: 03_000.json fixes the Light Spear’s position in its inventory slot, and 13_400.json sets the Pet Rudolph’s pose and tooltip.
Example 5: a custom pet
Pet Rudolph (13,400) circles around the player and picks up nearby zen. It is included as an example and uses four files:
| Where | File | What it defines |
|---|---|---|
| Client | bin/Client/Data/Item/Custom/Rudolph/ |
The xmas_deer.bmd model and its textures |
| Server | Data/Item/Item.txt |
The item row: Slot 8 (helper) and behavior * |
| Server | Data/Custom/Items/13_400.json |
Inventory pose and tooltip |
| Server | Data/Custom/Pets/13_400.json |
How it moves and what it does |
{
"item": "13,400",
"blendMesh": 0,
"movement": { "type": "orbit", "radius": 50, "period": 4000, "height": 20 },
"abilities": [ { "type": "pickup", "what": "zen", "range": 3, "interval": 1000, "delay": 1500 } ]
}
The client draws the movement; the abilities, such as picking up zen, are run by the server. To test it: /make 13 400.
Example 6: a custom monster
With the Encoder table, Data/Custom/Encoder/CustomMonster.txt (index, type 0 = NPC and 1 = monster, golden, scale, folder and model):
152 1 1 2.0 "Monster\\Karane\\" "Karane" // Karane
Or directly in Data/Monster/Monster.txt, with the same columns at the end of the row:
152 0 "Karane" ... 0 0 1 1 2.0 "Monster\Karane\" "Karane"
Model in the client: bin/Client/Data/Monster/Karane/.
Custom wings
Custom wing stats (defense and damage constants) are defined in the server’s Data/Item/CustomWing.txt. As with the rest of the catalog, the server is in charge: the client keeps no copy of its own.
Item.txt column reference
Optional columns at the end of each row (* = no value):
| Column | Example | What it does |
|---|---|---|
| Behavior | 00,020 |
Original item it imitates in the logic |
| Folder and model | "Item\Custom\20\" "Sword21" |
Model in the inventory, on the ground and on the character |
| Glow | 255 40 40 |
Glow color per level |
| Equipped folder and model | "Item\Custom\FenrirMount\" "fenril_black" |
Only if the item looks different when equipped, like a mount |
| Gate | 22 |
For scrolls: always takes you to that gate |
From the web panel
The admin panel has editors for items (Item.txt) and monsters (Monster.txt), and for the custom zones (CustomSafeZone, CustomPkFree, CustomNpcMove). See Admin Panel.
Server .txt files must be saved in ANSI / Windows-1252 without BOM: UTF-8 breaks accented characters in the client.