Customs
Con el Main.dll, un item custom se agregaba de los dos lados: el servidor lo definía en su Item.txt, y el cliente necesitaba un item.bmd regenerado más las tablas del Encoder empaquetadas en ClientInfo.bmd. Si no coincidían, el item se veía mal o el servidor lo rechazaba.
Ahora el servidor es la única fuente. Al iniciar sesión, el servidor le manda al cliente un catálogo con todas las definiciones: items, monstruos, efectos, pets y tooltips. El cliente sólo necesita los modelos (.bmd y sus texturas) en su carpeta Data. No se regenera item.bmd ni hay que tocar código.
Cliente y servidor tienen que ser de la misma versión (0.97.20 o posterior). Este sistema no funciona con el cliente con DLL.
Dónde van los archivos
| Qué | Dónde |
|---|---|
| Definiciones | Servidor: MuServer/Data/ del repositorio, o /opt/mu/Data dentro del volumen de Docker |
| Modelos y texturas | Cliente: bin/Client/Data/ antes de compilar o distribuir |
Un volumen persistente de Docker no se actualiza al bajar una imagen nueva: los archivos que agregues ahí se conservan entre versiones.
Después de agregar o cambiar un custom, reiniciá el servidor y volvé a iniciar sesión para recibir el catálogo nuevo. Los JSON se validan al arrancar: un archivo con errores se descarta entero y el motivo queda en el log del GameServer.
Índices: el rango clásico y el extendido
Cada sección de items (espadas, hachas, mazas, lanzas, arcos, bastones, escudos, cascos, armaduras, pantalones, guantes, botas, alas, helpers, pociones y joyas) tiene en el 0.97k 32 índices, del 0 al 31.
Además, cada sección acepta los índices 32 a 511: son los items agregados, que entran sin pisar ningún item original. Un agregado tiene que decir qué item original imita (columna Comportamiento): eso decide la lógica que el juego tiene escrita por tipo de item, como si gasta flechas, si es un ala o una joya, o qué opciones excellent puede tener. Todo lo demás (nombre, stats, tamaño, modelo, brillo, efectos) sale de su propia fila.
Ejemplo 1: un item con las tablas del Encoder
Si ya tenés customs armados para el DLL, las tablas del Encoder se siguen usando sin convertir nada. Van en Data/Custom/Encoder/ del servidor: CustomItem.txt, CustomGlow.txt, CustomBow.txt, CustomMonster.txt, ItemPosition.txt y MapFog.txt.
La Knight Blade en el índice 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
Modelo en el cliente: bin/Client/Data/Item/Custom/20/ (sword21.bmd y sus texturas).
Ejemplo 2: un item en el rango extendido
El mismo modelo como item agregado, en 0,32. Todo va en una fila de Data/Item/Item.txt: al final de las columnas de siempre se agregan el comportamiento, la carpeta y el nombre del modelo, y el color del brillo en RGB.
32 0 22 1 4 1 1 0 "Crimson Knight Blade" ... 00,020 "Item\Custom\20\" "Sword21" 255 40 40
Se comporta como la Knight Blade (00,020), usa el modelo Sword21 y brilla en rojo. Copiá una fila completa de la sección y ajustá sus stats: el ... del ejemplo representa las columnas de siempre, no se escribe así.
Para probarlo con una cuenta GM: /make 0 32.
Ejemplo 3: un set completo
El set Great Dragon en el índice 21 de las secciones 7 a 11 (casco, armadura, pantalones, guantes y botas):
// 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
Modelos en el cliente: bin/Client/Data/Player/Custom/21/. Las mismas piezas también se pueden definir sin el Encoder, con las columnas de modelo en Item.txt ("Player\Custom\21\" "HelmMale22").
El equipo custom se ve también en los demás jugadores y en la selección de personajes.
Ejemplo 4: efectos, pose y tooltip
Data/Custom/Items/<sección>_<índice>.json le agrega a un item, custom u original, efectos dibujados sobre los huesos del modelo, su pose en el inventario y líneas propias en el tooltip.
Unas alas con destellos y partículas:
{
"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 }
]
}
El tooltip acepta hasta 6 líneas, como texto ("Zen picker") o con color ({ "text": "Zen picker", "color": "gold" }). Colores: white, blue, red, gold, green, darkred, purple, darkblue y darkgold.
En el servidor hay dos ejemplos reales: 03_000.json corrige la posición del Light Spear en su casilla, y 13_400.json define la pose y el tooltip del Pet Rudolph.
Ejemplo 5: un pet custom
El Pet Rudolph (13,400) da vueltas alrededor del jugador y levanta el zen cercano. Viene incluido como ejemplo y usa cuatro archivos:
| Dónde | Archivo | Qué define |
|---|---|---|
| Cliente | bin/Client/Data/Item/Custom/Rudolph/ |
El modelo xmas_deer.bmd y sus texturas |
| Servidor | Data/Item/Item.txt |
La fila del item: Slot 8 (helper) y comportamiento * |
| Servidor | Data/Custom/Items/13_400.json |
La pose en el inventario y el tooltip |
| Servidor | Data/Custom/Pets/13_400.json |
Cómo se mueve y qué hace |
{
"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 } ]
}
El cliente dibuja el movimiento; las habilidades, como levantar el zen, las ejecuta el servidor. Para probarlo: /make 13 400.
Ejemplo 6: un monstruo custom
Con la tabla del Encoder, Data/Custom/Encoder/CustomMonster.txt (índice, tipo 0 = NPC y 1 = monstruo, dorado, escala, carpeta y modelo):
152 1 1 2.0 "Monster\\Karane\\" "Karane" // Karane
O directamente en Data/Monster/Monster.txt, con las mismas columnas al final de la fila:
152 0 "Karane" ... 0 0 1 1 2.0 "Monster\Karane\" "Karane"
Modelo en el cliente: bin/Client/Data/Monster/Karane/.
Alas custom
Las estadísticas de las alas custom (constantes de defensa y daño) se definen en Data/Item/CustomWing.txt del servidor. Como el resto del catálogo, el servidor es el que manda: el cliente no tiene una copia propia.
Referencia de columnas de Item.txt
Columnas opcionales al final de cada fila (* = sin valor):
| Columna | Ejemplo | Qué hace |
|---|---|---|
| Comportamiento | 00,020 |
Item original que imita en la lógica |
| Carpeta y modelo | "Item\Custom\20\" "Sword21" |
Modelo en el inventario, en el suelo y en el personaje |
| Brillo | 255 40 40 |
Color del brillo por nivel |
| Carpeta y modelo puesto | "Item\Custom\FenrirMount\" "fenril_black" |
Sólo si el item se ve distinto puesto, como una montura |
| Gate | 22 |
Para pergaminos: lleva siempre a ese gate |
Desde el panel web
El panel admin incluye editores para los items (Item.txt) y los monstruos (Monster.txt), y para las zonas custom (CustomSafeZone, CustomPkFree, CustomNpcMove). Ver Panel Admin.
Los archivos .txt del servidor se guardan en ANSI / Windows-1252 sin BOM: UTF-8 rompe los acentos en el cliente.