Saltar al contenido principal

Crear Poderes

webapp_banner.jpg

Dos formas de escribir un poder

Todo poder vive en ~/plugins/EliteMobs/powers (las subcarpetas también se escanean), y hay dos formatos:

FormatoArchivoÚsalo para
Lua*.luaCualquier cosa nueva. Lenguaje de scripting completo, todos los hooks de jefe, bucles y estado. Es lo que usan los poderes incluidos.
EliteScript*.ymlEl formato declarativo de eventos/acciones documentado en el resto de esta página. Sigue estando plenamente soportado.

Casi todos los 68 poderes que vienen con EliteMobs son ahora Lua. Solo bonus_coins.yml, custom_summon.yml y elite_script.yml siguen siendo poderes Java respaldados por YAML. Si vas a escribir un poder nuevo desde cero, Lua es el camino con más capacidad detrás — empieza por Primeros Pasos con Lua y Hooks y Ciclo de Vida del Jefe.

Cualquiera de los dos formatos se referencia desde un jefe de la misma manera, mediante la lista powers.

Un poder .lua reemplaza a un poder .yml con el mismo nombre

Cuando un jefe pide attack_fire.yml, EliteMobs busca primero attack_fire.lua y lo usa si existe. Por eso las configuraciones antiguas de jefes escritas contra los nombres de poder anteriores a Lua siguen funcionando sin cambios — no tienes que reescribir tus listas powers:. Las configuraciones nuevas deberían nombrar el archivo .lua directamente.

Los archivos .lua predefinidos se escriben una vez y nunca se sobrescriben

Cada poder Lua incluido se escribe en la carpeta powers solo si ese archivo no existe ya. Una vez que editas uno, EliteMobs no sobrescribirá tu versión al actualizar — pero también dejas de recibir las correcciones oficiales para él. Si quieres una copia modificada, es preferible darle un nombre de archivo nuevo.

on_zone_enter / on_zone_leave no son disparados por las zonas de Lua

El proveedor de scripts de jefe acepta ambos nombres de hook y no generará un error de carga, pero nada dentro de un poder Lua puede hacer que se disparen. Solo se despachan desde el listener de zonas de EliteScript, que se inicia cuando un eliteScript: en YAML del mismo jefe lista ZoneEnterEvent o ZoneLeaveEvent en sus Events:. Un jefe que solo tenga poderes Lua cargará un archivo que contenga estos hooks y luego nunca los llamará.

No construyas un poder Lua alrededor de estos dos hooks salvo que lo estés emparejando deliberadamente con un script de zona en YAML de ese tipo. Usa context.zones:watch_zone(...) (cuyos propios callbacks on_enter / on_leave sí se invocan directamente), un bloque Zone de EliteScript, o sondeo desde on_game_tick en su lugar. Consulta Hooks y Ciclo de Vida y Eventos de Script.

Sistema de Scripting de EliteMobs

La siguiente página describe cómo crear Elite Scripts.

Esta es una función avanzada y requiere un conocimiento profundo de EliteMobs.

Nota: Los Elite Scripts se pueden agregar como archivos de poder o a archivos de jefes personalizados. Si se usan como archivos de poder, puedes agregarlos como poderes normales a los jefes usando la configuración powers de los Jefes Personalizados, como de costumbre.

Agregar un EliteScript

Para comenzar a agregar un EliteScript a un jefe, agrega la siguiente entrada al archivo del jefe:

eliteScript:

Nota: Lo siguiente es extremadamente sensible a mayúsculas/minúsculas y espacios. Asegúrate de que tus espacios, saltos de línea y formato general coincidan con los ejemplos.

Ahora que tienes declarado el inicio de tu script, puedes agregar tu script específico. Para este ejemplo, vamos a crear un script llamado Example:

eliteScript:
Example:

Los EliteScripts tienen 5 secciones diferentes: Events, Conditions, Zones, Actions y Cooldowns. Solo Actions es obligatorio.

Veamos un ejemplo sencillo:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20

Este script hace que un elite sea empujado hacia arriba cuando es golpeado por un jugador, y no lo hará de nuevo durante 3 segundos (y evitará que otros poderes se activen durante 1 segundo debido a la configuración del Cooldown).

Ahora que conoces el formato general de cómo se estructuran los scripts, es hora de aprender qué puedes hacer con cada sección.


Events

Events

Haz clic en el enlace de arriba para aprender a usar los eventos.

Targets

Targets

Haz clic en el enlace de arriba para aprender a usar los objetivos.

Actions

Actions

Haz clic en el enlace de arriba para aprender a usar las acciones.

Zones

Zones

Haz clic en el enlace de arriba para aprender a usar las zonas.

Conditions

Conditions

Haz clic en el enlace de arriba para aprender a usar las condiciones.

Cooldowns

Cooldowns

Haz clic en el enlace de arriba para aprender a usar los tiempos de reutilización.


Agregar múltiples EliteScripts

Puedes tener múltiples acciones en un evento, pero ¿qué pasa si quieres múltiples scripts en el mismo jefe? Es tan simple como crear una nueva entrada de script. Expandamos el ejemplo anterior y agreguemos otro script:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
Example2:
Events:
- PlayerDamagedByEliteMobEvent
Actions:
- action: SET_ON_FIRE
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60

En este ejemplo hemos agregado un segundo script llamado Example2. Example2 prenderá fuego al jugador que sea dañado por el jefe, esto se debe a que el targetType está configurado como DIRECT_TARGET.
El cooldown de este script está configurado en 200 ticks, lo que significa que el jefe solo podrá prender fuego a los jugadores cada 10 segundos.

Crear poderes independientes

Los poderes independientes están compuestos casi en su totalidad por el Elite Script. Solo hay dos campos opcionales. No olvides que para que los poderes independientes funcionen, deben colocarse en la carpeta ~plugins/EliteMobs/powers.
Ejemplo de poder independiente:

isEnabled: true
powerType: UNIQUE
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20

isEnabled

Al igual que en el resto del plugin, establece si el poder está habilitado.

powerType

El tipo de poder establece cómo se asigna el poder. Los valores son:

  • UNIQUE: El poder solo se aplicará a jefes personalizados que tengan el poder configurado en la sección de poderes.
  • DEFENSIVE / MISCELLANEOUS / OFFENSIVE: CUALQUIER elite podrá obtener estos poderes, y contarán para un subconjunto específico de poderes.
  • MAJOR_ZOMBIE, MAJOR_SKELETON, MAJOR_BLAZE, MAJOR_ENDERMAN, MAJOR_GHAST: Solo los elites del tipo de entidad adecuado podrán aparecer naturalmente con estos poderes, y contarán como poderes mayores. Estos cinco son los únicos tipos que cuentan como poderes mayores; todo lo demás cuenta como poder menor.

Cómo powerType llega a los elites naturales: EliteMobPowers.yml

powerType por sí solo no pone un poder delante de un elite natural. Lo que los elites naturales sortean realmente es ~/plugins/EliteMobs/EliteMobPowers.yml, que tiene estas listas:

ClaveSignificado
defensivePowersPoderes defensivos que los elites naturales pueden sortear al azar
offensivePowersPoderes ofensivos que los elites naturales pueden sortear al azar
miscellaneousPowersPoderes misceláneos que los elites naturales pueden sortear al azar
majorPowers.<ENTITY_TYPE>Poderes mayores que ese tipo de entidad puede sortear al azar
disabledPowers.<ENTITY_TYPE>Poderes eliminados de ese tipo de entidad después de aplicar las listas compartidas

Cuando el archivo se genera por primera vez, cada lista se rellena con todos los poderes cargados que coincidan con el powerType. A partir de ahí el archivo es la fuente autoritativa y nunca se vuelve a rellenar, así que un poder que añadas más tarde — incluido cualquier archivo .lua que dejes caer en la carpeta powers — no empezará a aparecer en los elites naturales hasta que lo añadas tú mismo a la lista correspondiente.

En estas listas se aceptan tanto los nombres de archivo .lua como los nombres .yml heredados; los valores por defecto generados se escriben usando el alias .yml. Un nombre que no resuelva a ningún poder se omite con una advertencia en consola que indica el archivo y la clave.

effect

Establece el efecto visual o material usado por el poder. Esto es utilizado por algunos poderes codificados para definir su efecto visual de partículas o material.

ClaveValoresPredeterminado
effectStringnone

powerCooldown

Establece el tiempo de reutilización, en ticks, para el poder individual. Esto controla con qué frecuencia puede activarse este poder específico.

ClaveValoresPredeterminado
powerCooldownInteger0

globalCooldown

Establece el tiempo de reutilización global, en ticks, compartido entre todos los poderes. Después de que este poder se active, ningún otro poder puede activarse hasta que expire el cooldown global.

ClaveValoresPredeterminado
globalCooldownInteger0

Crear poderes Lua independientes

Un poder Lua independiente es simplemente un archivo .lua en ~/plugins/EliteMobs/powers (subcarpetas incluidas — la carpeta se recorre recursivamente). No hay envoltorio YAML ni claves de configuración: el archivo es el poder.

return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then
return
end
context.player:apply_potion_effect("BLINDNESS", 60, 0)
end
}

Como no hay cabecera YAML de la que leerlos, un poder Lua descubierto de esta forma recibe metadatos fijos:

  • powerType es MISCELLANEOUS. No puedes cambiarlo a UNIQUE desde el archivo. (Los poderes Lua que vienen con EliteMobs llevan su tipo en Java, y por eso pueden ser UNIQUE, OFFENSIVE, MAJOR_*, etc.)
  • effect queda sin definir.

En la práctica esto no filtra tu poder a elites aleatorios, porque los grupos de sorteo de elites naturales provienen de EliteMobPowers.yml y ese archivo no se vuelve a rellenar una vez que existe — consulta más arriba. Añade el poder a la lista powers: de un jefe para usarlo.

Hooks disponibles para los poderes Lua de jefe

HookSe dispara cuando
on_spawnEl jefe aparece
on_game_tickEn cada tick del servidor
on_boss_damagedEl jefe recibe daño de cualquier fuente
on_boss_damaged_by_playerEl jefe recibe daño de un jugador
on_boss_damaged_by_eliteEl jefe recibe daño de otro elite
on_player_damaged_by_bossEl jefe daña a un jugador
on_enter_combatEl jefe entra en combate
on_exit_combatEl jefe sale de combate
on_healEl jefe se cura
on_boss_target_changedEl jefe cambia de objetivo
on_deathEl jefe muere
on_phase_switchEl jefe cambia de fase

on_zone_enter y on_zone_leave también son aceptados por el parser, pero nada dentro de un poder Lua puede hacer que se disparen — solo se despachan desde un listener de zonas de EliteScript en el mismo jefe. Consulta la advertencia al principio de esta página.

Para saber qué puedes llamar realmente dentro de estos hooks, consulta Primeros Pasos con Lua, Hooks y Ciclo de Vida del Jefe y Jefe y Entidades.