DocumentaciónCustoms▾

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.