Atributos de armas

De DragonMineZ Wiki
Esta página es una versión traducida de la página Weapon Attributes. La traducción está completa al 100 %.

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.

Datapacks de Better Combat Cualquier namespace 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

Se configura en: Configuración de combatefallbackCompatibility
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

Véase también: Armas especiales

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, padre sword), yajirobe_katana (Katana de Yajirobe, padre katana), z_sword (Espada Z, padre claymore) y power_pole (Bastón Mágico, padre staff, 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

  1. Añade o edita archivos en data/<namespace>/weapon_attributes/.
  2. Valida la sintaxis JSON (consulta Cómo usar JSON).
  3. Ejecuta el /reload de vanilla o reinicia. Es un listener de recarga de datapacks normal, no forma parte de /dmzreload (consulta Recargar y actualizar cambios).
  4. Prueba el arma en el juego: alcance, animación, forma del hitbox y cualquier variante condicional (empuñar dos armas, agacharse, ir montado).