Atributos de armas
Atributos de armas es un sistema de datapacks que le dice al motor de combate de DragonMineZ cómo se comporta un objeto concreto en combate: alcance de ataque, animación, forma del hitbox, multiplicadores de daño, variantes de ataque condicionales (empuñar dos armas, agacharse, ir montado, etc.) y estadísticas críticas. Los mods de armas de terceros se conectan a este sistema para tener un comportamiento de combate de DragonMineZ adecuado.
Cargador: WeaponRegistry.loadAttributes(resourceManager), en src/main/java/com/dragonminez/common/combat/logic/weapon/WeaponRegistry.java. Se recarga con la recarga de datapacks de vanilla (/reload o un reinicio), no con /dmzreload.
Ubicación del archivo y asignación al objeto
data/<namespace>/weapon_attributes/<item_path>.json
El namespace y la ruta forman el id del objeto de destino: data/dragonminez/weapon_attributes/axe.json se aplica a dragonminez:axe. Un mod de terceros define sus propias armas en su propio namespace, por ejemplo data/mymod/weapon_attributes/great_axe.json para mymod:great_axe.
bettercombat: que aparezca en estos archivos JSON se reescribe como dragonminez: al cargarse, así que los datapacks de atributos de armas escritos para el mod Better Combat funcionan casi siempre tal cual.
Esquema de nivel superior
Un archivo contiene un objeto attributes:
{
"attributes": { ... }
}
O bien, para heredar los atributos de otro objeto y sobrescribir solo algunos campos, indica un parent:
{
"parent": "dragonminez:sword",
"attributes": {
"crit_chance": 0.10,
"crit_damage": 0.15
}
}
Las cadenas de parent pueden tener varios niveles (un padre puede tener su propio padre). Los ciclos se detectan: un arma cuya cadena de padres vuelve sobre sí misma no se puede resolver y se omite (se registra como error), así que revisa bien tus referencias de parent.
Campos de los atributos
fallbackCompatibility| Campo | Tipo | Qué hace |
|---|---|---|
attack_range |
Número | Alcance en bloques (el valor por defecto de Minecraft, 3.0, si se omite).
|
pose |
Texto | Pose de animación de GeckoLib para el arma de la mano principal. |
off_hand_pose |
Texto | Pose de animación de GeckoLib para el arma de la mano secundaria. |
two_handed |
Booleano | Si es true, no se puede usar la mano secundaria mientras se empuña el arma.
|
category |
Texto | Etiqueta de categoría libre. Se usa para dos cosas: para comparar las condiciones DUAL_WIELDING_SAME_CATEGORY entre la mano principal y la secundaria, y como categoría de destino del sistema de regex fallbackCompatibility de Configuración de combate.
|
crit_chance |
Número | Probabilidad crítica innata (0.0–1.0), aplicada como modificador de atributo.
|
crit_damage |
Número | Multiplicador de daño crítico innato, aplicado como modificador de atributo. |
attacks |
Array | Obligatorio. Una o más variantes de ataque (ver abajo). |
Entradas de ataque
Cada entrada de attacks describe una variante de golpe. DragonMineZ revisa las conditions de arriba abajo y usa el primer ataque cuyas condiciones se cumplen todas.
| Campo | Tipo | Qué hace |
|---|---|---|
conditions |
Lista de textos de condición | Todas deben cumplirse para que se active esta variante. Omítelo para un ataque sin condiciones. |
hitbox |
Texto | FORWARD_BOX (una caja que se extiende hacia delante, lo más parecido a vanilla), VERTICAL_PLANE (un tajo vertical de barrido) o HORIZONTAL_PLANE (un barrido horizontal amplio).
|
damage_multiplier |
Número | Multiplicador del daño base del arma (por defecto 1.0).
|
angle |
Número | Arco del golpe en grados. |
upswing |
Número | Multiplicador del tiempo de recarga: cooldownTicks = (1 / (4 - attackSpeed)) * 20 * upswing. Un valor menor significa un golpe siguiente más rápido. También define la preparación del golpe (el retraso antes de que impacte): ticks de animación × upswing × 0.95, limitado a 3–7 ticks.
|
animation |
Texto | Nombre de animación de GeckoLib. Se compara con animations/*.json; si no hay una coincidencia exacta, DragonMineZ elige el nombre más parecido (distancia de Levenshtein) después de quitar los prefijos conocidos (dragonminez:, bettercombat:, combat.).
|
swing_sound / impact_sound |
{ "id", "volume"*, "pitch"*, "randomness"* } |
Sonido que se reproduce al golpear o al impactar. volume y pitch valen 1.0 por defecto, y randomness, 0.1.
|
Condiciones de ataque
Esta es la lista completa de condiciones:
| Condición | Significado |
|---|---|
NOT_DUAL_WIELDING |
La mano secundaria está vacía (aire). |
DUAL_WIELDING_ANY |
Ambas manos sostienen algo. |
DUAL_WIELDING_SAME |
Ambas manos sostienen exactamente el mismo id de objeto. |
DUAL_WIELDING_SAME_CATEGORY |
Ambas manos sostienen objetos que comparten la misma category.
|
NO_OFFHAND_ITEM |
La mano secundaria está vacía. |
OFF_HAND_SHIELD |
La mano secundaria sostiene un escudo. |
MAIN_HAND_ONLY |
El ataque solo se aplica al arma de la mano principal. |
OFF_HAND_ONLY |
El ataque solo se aplica al arma de la mano secundaria. |
MOUNTED |
El jugador va montado en una entidad. |
NOT_MOUNTED |
El jugador no va montado. |
SNEAKING |
El jugador está agachado. |
NOT_SNEAKING |
El jugador está de pie. |
Ejemplo completo
Una daga con varios ataques y una variante para empuñar dos armas:
{
"attributes": {
"attack_range": 2,
"two_handed": false,
"category": "dagger",
"attacks": [
{
"hitbox": "HORIZONTAL_PLANE",
"damage_multiplier": 0.8,
"angle": 150,
"upswing": 0.5,
"animation": "combat.one_handed_slash_horizontal_right_1",
"swing_sound": { "id": "dragonminez:dagger_slash" }
},
{
"hitbox": "HORIZONTAL_PLANE",
"damage_multiplier": 0.8,
"angle": 150,
"upswing": 0.5,
"animation": "combat.one_handed_slash_horizontal_right_2",
"swing_sound": { "id": "dragonminez:dagger_slash" }
},
{
"conditions": ["DUAL_WIELDING_SAME_CATEGORY", "MAIN_HAND_ONLY"],
"hitbox": "FORWARD_BOX",
"damage_multiplier": 1.4,
"angle": 150,
"upswing": 0.5,
"animation": "combat.dual_handed_stab",
"swing_sound": { "id": "dragonminez:dagger_slash" }
}
]
}
}
Un ejemplo de herencia (brave_sword.json, que solo sobrescribe las estadísticas críticas):
{
"parent": "dragonminez:sword",
"attributes": {
"crit_chance": 0.10,
"crit_damage": 0.15
}
}
Archivos de atributos incluidos
DragonMineZ incluye estas entradas en data/dragonminez/weapon_attributes/, así que puedes usarlas como parent o como destino de weaponCombo o del sistema de respaldo:
- Combos base:
anchor,axe,battlestaff,claw,claymore,cutlass,dagger,double_axe,fist,giant,glaive,halberd,hammer,katana,lance,mace,pickaxe,rapier,scythe,sickle,soul_knife,spear,staff,sword,trident,twin_blade,wand. - Armas características:
brave_sword(Espada Valiente, padresword),yajirobe_katana(Katana de Yajirobe, padrekatana),z_sword(Espada Z, padreclaymore) ypower_pole(Bastón Mágico, padrestaff, con su propio combo de tres golpes).
Los objetos de DragonMineZ que no tienen una entrada propia (por ejemplo la Espada Dimensional y las armas de Tamagami: Espada de Tamagami, Tridente de Tamagami y Martillo de Tamagami) obtienen su combo de las regex de fallbackCompatibility de Configuración de combate, igual que las armas de terceros.
Para mods de armas de terceros
Si tu mod añade armas y no incluyes una entrada de Atributos de armas para ellas, DragonMineZ recurre a comparar el id de cada objeto con un modificador de daño de ataque con la lista fallbackCompatibility de Configuración de combate (por ejemplo, un id de objeto que contiene axe se trata como dragonminez:axe). Esto da un valor por defecto razonable, pero una entrada de datapack real que coincida con el combo y las animaciones reales de tu arma siempre es más precisa, y siempre tiene prioridad sobre la suposición del sistema de respaldo.
Recargar y validar
- Añade o edita archivos en
data/<namespace>/weapon_attributes/. - Valida la sintaxis JSON (consulta Cómo usar JSON).
- Ejecuta el
/reloadde vanilla o reinicia. Es un listener de recarga de datapacks normal, no forma parte de/dmzreload(consulta Recargar y actualizar cambios). - Prueba el arma en el juego: alcance, animación, forma del hitbox y cualquier variante condicional (empuñar dos armas, agacharse, ir montado).