Saltearse al contenido

Tablas de Botín Personalizadas

Objetivo

Crear una tabla de drops personalizada para el NPC Slime del tutorial Crear un NPC Personalizado. Construirás un drop garantizado, agregarás un objeto raro ponderado y aprenderás cómo los contenedores anidados crean lógica de botín compleja.

Lo que Aprenderás

  • Cómo los tipos de Container (Multiple, Choice, Single) trabajan juntos para crear lógica de drops
  • Cómo Weight controla la probabilidad de drops aleatorios
  • Cómo combinar drops garantizados y raros en una sola tabla
  • Cómo QuantityMin y QuantityMax crean cantidades de drop variables
  • Cómo conectar una tabla de drops a un NPC mediante DropList

Requisitos Previos

Repositorios del mod complementario:


Descripción General del Sistema de Drops

Las tablas de drops se encuentran en Server/Drops/ y controlan qué objetos caen cuando un NPC muere, un bloque se rompe o un recurso es recolectado. El juego vanilla las organiza por tipo de fuente:

Assets/Server/Drops/
NPCs/
Beast/
Critter/
Intelligent/
Feran/
Trork/
Crop/
Wood/
Rock/
Plant/

Cada tabla de drops es un archivo JSON con un objeto raíz Container. El sistema de contenedores usa tres tipos que pueden anidarse para crear cualquier lógica de drops:

Tipos de Contenedor

TipoComportamiento
MultipleEvalúa todos los contenedores hijos en orden. Cada hijo se ejecuta independientemente
ChoiceElige uno de los hijos al azar, ponderado por los valores de Weight. El Weight del propio Choice controla si el grupo se activa
SingleNodo terminal. Produce el Item especificado con una cantidad aleatoria entre QuantityMin y QuantityMax

Paso 1: Crear un Drop Garantizado

La tabla de drops más simple garantiza un objeto cada vez. Empecemos haciendo que el Slime siempre deje caer 1 Fruta Encantada — la misma fruta del tutorial Árboles y Saplings Personalizados.

Crea (o reemplaza) el archivo de tabla de drops:

CreateACustomNPC/Server/Drops/Drop_Slime.json
{
"Container": {
"Type": "Multiple",
"Containers": [
{
"Type": "Single",
"Item": {
"ItemId": "Plant_Fruit_Enchanted",
"QuantityMin": 1,
"QuantityMax": 1
}
}
]
}
}

Un contenedor Multiple con un único hijo Single garantiza el drop cada vez. El ItemId debe coincidir con el nombre del archivo de una definición de objeto existente (sin .json).

Este es el mismo patrón usado por los depósitos de cristal vanilla. Por ejemplo, Rock_Crystal_Blue.json garantiza 4-5 cristales cian:

{
"Container": {
"Type": "Multiple",
"Containers": [
{
"Type": "Single",
"Item": {
"ItemId": "Ingredient_Crystal_Cyan",
"QuantityMin": 4,
"QuantityMax": 5
}
}
]
}
}

Paso 2: Agregar un Drop Raro de Cristal

Ahora hagamos al Slime más interesante — mantenemos la fruta garantizada, pero agregamos un 10% de probabilidad de también dejar caer un bloque Crystal Glow del tutorial Crear un Bloque Personalizado.

Actualiza Server/Drops/Drop_Slime.json:

{
"Container": {
"Type": "Multiple",
"Containers": [
{
"Type": "Choice",
"Weight": 100,
"Containers": [
{
"Type": "Single",
"Item": {
"ItemId": "Plant_Fruit_Enchanted",
"QuantityMin": 1,
"QuantityMax": 1
}
}
]
},
{
"Type": "Choice",
"Weight": 10,
"Containers": [
{
"Type": "Single",
"Item": {
"ItemId": "Ore_Crystal_Glow",
"QuantityMin": 1,
"QuantityMax": 1
}
}
]
}
]
}
}

Cómo Funcionan los Pesos

El contenedor externo Multiple evalúa ambos grupos independientemente:

  1. Grupo 1 (Weight: 100): 100% de probabilidad — siempre deja caer 1 Fruta Encantada
  2. Grupo 2 (Weight: 10): 10% de probabilidad — a veces también deja caer 1 bloque Crystal Glow

El Weight en un contenedor Choice controla si ese grupo se activa. Weight: 100 significa siempre, Weight: 10 significa 10% de las veces.

Este es el mismo patrón que vanilla usa para drops de equipamiento de NPCs. Por ejemplo, Drop_Trork_Warrior.json usa tres grupos:

{
"Container": {
"Type": "Multiple",
"Containers": [
{
"Type": "Choice",
"Weight": 100,
"Containers": [
{
"Type": "Single",
"Item": {
"ItemId": "Ingredient_Fabric_Scrap_Linen",
"QuantityMin": 1,
"QuantityMax": 3
}
}
]
},
{
"Type": "Choice",
"Weight": 5,
"Containers": [
{ "Weight": 25, "Type": "Single", "Item": { "ItemId": "Armor_Trork_Head", "QuantityMin": 1, "QuantityMax": 1 } },
{ "Weight": 25, "Type": "Single", "Item": { "ItemId": "Armor_Trork_Chest", "QuantityMin": 1, "QuantityMax": 1 } },
{ "Weight": 25, "Type": "Single", "Item": { "ItemId": "Armor_Trork_Hands", "QuantityMin": 1, "QuantityMax": 1 } },
{ "Weight": 25, "Type": "Single", "Item": { "ItemId": "Armor_Trork_Legs", "QuantityMin": 1, "QuantityMax": 1 } }
]
},
{
"Type": "Choice",
"Weight": 15,
"Containers": [
{
"Type": "Single",
"Item": { "ItemId": "Weapon_Battleaxe_Stone_Trork", "QuantityMin": 1, "QuantityMax": 1 }
}
]
}
]
}
}
  • Grupo 1 (Weight: 100): Siempre deja caer 1-3 retazos de lino
  • Grupo 2 (Weight: 5): 5% de probabilidad de dejar caer una pieza de armadura (cada una con peso interno de 25%)
  • Grupo 3 (Weight: 15): 15% de probabilidad de dejar caer un hacha de batalla

Los valores internos de Weight dentro de un Choice son relativos entre sí: 25 + 25 + 25 + 25 = 100, así que cada pieza de armadura tiene 25% de probabilidad cuando el grupo se activa. La probabilidad total de obtener el casco es 5% x 25% = 1.25%.


Paso 3: Conectar la Tabla de Drops al NPC

Las tablas de drops son referenciadas por las definiciones de roles de NPC a través del campo DropList. El valor coincide con el nombre del archivo de la tabla de drops sin .json.

Abre el Rol de NPC de tu Slime en Server/NPC/Roles/Slime.json y agrega el campo DropList al bloque Modify:

{
"Type": "Variant",
"Reference": "Template_Predator",
"Modify": {
"Appearance": "Slime",
"MaxHealth": 75,
"DropList": "Drop_Slime",
"KnockbackScale": 0.5,
"IsMemory": true,
"MemoriesCategory": "Beast",
"NameTranslationKey": {
"Compute": "NameTranslationKey"
}
},
"Parameters": {
"NameTranslationKey": {
"Value": "server.npcRoles.Slime.name",
"Description": "Translation key for NPC name display"
}
}
}

El "DropList": "Drop_Slime" indica al motor que resuelva Server/Drops/Drop_Slime.json cuando el NPC muera. Los NPCs vanilla usan el mismo patrón — por ejemplo, Bear_Grizzly.json referencia "Drop_Bear_Grizzly".


Paso 4: Contenedores Anidados para Drops Complejos

Para escenarios más complejos, puedes anidar Multiple dentro de Choice para crear resultados ramificados. Este patrón es usado por el Wood_Branch.json vanilla para drops de recursos al romper ramas de madera:

{
"Container": {
"Type": "Choice",
"Containers": [
{
"Type": "Multiple",
"Weight": 50,
"Containers": [
{
"Type": "Single",
"Item": {
"ItemId": "Ingredient_Stick",
"QuantityMin": 0,
"QuantityMax": 2
}
},
{
"Type": "Single",
"Item": {
"ItemId": "Ingredient_Tree_Sap",
"QuantityMin": 0,
"QuantityMax": 1
}
}
]
},
{
"Type": "Multiple",
"Weight": 50,
"Containers": [
{
"Type": "Single",
"Item": {
"ItemId": "Ingredient_Stick"
}
}
]
}
]
}
}

Esta tabla tiene dos resultados posibles elegidos por el Choice externo:

  • 50% de probabilidad: Deja caer 0-2 palos y 0-1 savia de árbol (ambos objetos del Multiple)
  • 50% de probabilidad: Deja caer solo 1 palo

Cuando QuantityMin es 0, hay una posibilidad de que el objeto no produzca nada. Cuando QuantityMin y QuantityMax se omiten, la cantidad predeterminada es 1.


Paso 5: Tablas de Drops Vacías

Algunos NPCs no dejan caer nada. Todos los critters vanilla — Ardillas, Ranas, Geckos, Suricatas — usan un objeto vacío:

{}

Así es como tu Slime funcionaba antes de este tutorial — sin un DropList en el Rol de NPC, o con una tabla de drops vacía, el NPC no deja caer nada al morir.


Paso 6: Probar en el Juego

  1. Copia tu carpeta CreateACustomNPC/ actualizada a %APPDATA%/Hytale/UserData/Mods/

  2. Asegúrate de que los mods CreateACustomBlock y CustomTreesAndSaplings también estén instalados — la tabla de drops referencia objetos de ambos mods

  3. Inicia Hytale y entra en Modo Creativo

  4. Genera y mata al Slime múltiples veces:

    /op self
    /npc spawn Slime
  5. Verifica:

Drops del Slime en el juego — Frutas Encantadas y bloques Crystal Glow en el suelo después de matar varios Slimes

  • Cada muerte deja caer 1 Fruta Encantada (garantizado)
  • Aproximadamente 1 de cada 10 muertes también deja caer un bloque Crystal Glow (10% de probabilidad)
  • Las cantidades son correctas (siempre exactamente 1 de cada uno)

Errores comunes y soluciones:

ErrorCausaSolución
Unknown drop listNombre de archivo o ruta incorrectaVerifica que Drop_Slime.json exista en Server/Drops/ y que DropList coincida sin .json
Unknown item idError tipográfico en ID de objeto o mod faltanteVerifica que ItemId coincida con nombres de archivo reales. Asegúrate de que los mods que proveen esos objetos estén instalados
NPC no deja nadaDropList faltante en Rol de NPCAgrega "DropList": "Drop_Slime" al bloque Modify en Slime.json
Siempre misma cantidadQuantityMin igual a QuantityMaxEstablece valores diferentes para drops variables
Drop raro nunca apareceWeight muy bajo o mala suerteWeight: 10 significa ~10% — mata 20+ Slimes para confirmar

Referencia de Tablas de Drops Vanilla

Aquí hay un resumen de patrones reales de tablas de drops de los assets del juego:

Archivo VanillaPatrónCaso de Uso
Rock_Crystal_Blue.jsonMultipleSingleDrop de recurso garantizado
Drop_Bear_Grizzly.jsonMultipleChoice(100) + Choice(100)Múltiples drops garantizados
Drop_Trork_Warrior.jsonMultipleChoice(100) + Choice(5) + Choice(15)Garantizado + botín raro
Wood_Branch.jsonChoiceMultiple(50) + Multiple(50)Resultados ramificados de recursos
Drop_Frog_*.json{}Sin drops

Próximos Pasos