📊 Sistema de Stats de Entidades
Guía sobre cómo funcionan los atributos dinámicos (Health, Mana, Stamina, Oxygen) en Hytale, desde su configuración JSON hasta la lógica del servidor.
📈 Stats Definidos
Hytale utiliza archivos JSON para definir el comportamiento base de cada estadística. Estos se encuentran en Assets/Server/Entity/Stats/.
| Stat | Uso Común | Características |
|---|---|---|
| ❤️ Health | Vida de la entidad | Llega a 0 provoca la muerte. |
| 💧 Oxygen | Respiración bajo el agua | Se consume al estar "Suffocating". |
| ⚡ Stamina | Energía para acciones físicas | Consumida por Sprinting o Gliding. Soporta "Overdrawn" (valores negativos). |
| 🔮 Mana | Energía mágica | Normalmente regeneración constante fuera de combate. |
| 🛡️ Immunity | I-frames de daño | Impide daño mientras el valor es > 0. |
⚙️ Configuración (JSON)
Estructura principal de un archivo de stat (ejemplo: Oxygen.json):
{
"InitialValue": 100,
"Min": 0,
"Max": 100,
"Shared": false, // ¿Es visible para otros jugadores?
"Regenerating": [
{
"Interval": 0.5,
"Amount": -3,
"RegenType": "Additive",
"Conditions": [
{ "Id": "Alive" },
{ "Id": "Suffocating" }
]
}
]
}
Atributos Clave
- InitialValue: Valor con el que aparece la entidad.
- Min / Max: Límites físicos del stat.
- Shared: Si es
true, el servidor envía actualizaciones de este stat a todos los clientes cercanos. Si esfalse, solo el dueño lo ve.
🔄 Regeneración y Consumo
La lógica de cambio automático se basa en reglas dentro del array Regenerating.
-
Additive: Suma o resta una cantidad fija cada intervalo.-
Percentage: Calcula la cantidad basándose en el (Max - Min).
Condiciones Comunes
Las reglas solo se activan si todas sus Conditions se cumplen:
Alive: La entidad no debe estar muerta.Suffocating: Activo cuando la cabeza está en materiales sin oxígeno (agua).Sprinting / Gliding: Acciones de movimiento del jugador.Player: Permite filtrar por GameMode (ej: Creative).Stat: Compara este u otro stat (ej: "No regenerar si Stamina < 0").
✨ Efectos y Umbrales
Se pueden disparar acciones cuando un stat alcanza su valor mínimo o máximo.
"MinValueEffects": {
"TriggerAtZero": true,
"Interactions": {
"Interactions": [
"Stamina_Bar_Flash",
{
"Type": "ChangeStat",
"Behaviour": "Set",
"StatModifiers": { "StaminaRegenDelay": -0.5 }
}
]
}
}
Esto permite mecánicas complejas como el "Stamina Broken", donde al agotarse la estamina se aplican debufos inmediatos o efectos visuales en el HUD.
📁 Arquitectura Técnica (Java)
| Clase | Responsabilidad |
|---|---|
EntityStatMap |
Contenedor de todos los stats de una entidad. Gestiona el registro de cambios (dirty tracking) para el networking. |
EntityStatValue |
Representa una única instancia de stat con su valor actual y modificadores activos. |
EntityStatsSystems.Regenerate |
Ticking system que evalúa las condiciones de regeneración cada frame. |
EntityStatsSystems.Changes |
Detecta cuando un valor cruza los límites y dispara los ValueEffects correspondientes. |