Aller au contenu principal

Créer des pouvoirs

webapp_banner.jpg

Deux façons d'écrire un pouvoir​

Les pouvoirs définis dans des fichiers se trouvent dans plugins/EliteMobs/powers, sous-dossiers compris. Il existe deux formats :

FormatFichierÀ utiliser pour
Lua*.luaComportement scripté avec hooks de boss, boucles et état. La plupart des pouvoirs livrés utilisent ce format.
EliteScript*.ymlLe format déclaratif événement/action documenté dans le reste de cette page. Toujours pleinement pris en charge.

Sur les 71 pouvoirs livrés, 68 utilisent Lua. Seuls bonus_coins.yml, custom_summon.yml et elite_script.yml restent des pouvoirs Java adossés à du YAML. Pour créer un nouveau comportement scripté, commencez par Lua : Pour Commencer et Hooks et Cycle de Vie.

Les deux formats se référencent depuis un boss de la même façon, via la liste powers.

Utilisez des noms de fichiers uniques dans l'ensemble des sous-dossiers. Le registre utilise le nom du fichier, pas son chemin : les sous-dossiers n'isolent donc pas les doublons. Lorsque deux fichiers portent le même nom, EliteMobs charge celui dont le chemin complet vient en premier dans l'ordre de tri et enregistre Duplicate content filename pour l'autre, sauf si les deux fichiers ont un contenu identique. Après modification, exécutez /em reload et vérifiez les avertissements de chargement.

Un pouvoir .lua remplace un pouvoir .yml du même nom

Lorsqu'un boss demande attack_fire.yml, EliteMobs cherche d'abord un attack_fire.lua chargé avec succès. La même recherche s'applique aux demandes .yaml. Les anciennes références restent ainsi valables lorsque le remplacement Lua se charge. Les nouvelles configurations devraient nommer directement le fichier .lua. Respectez la casse du nom enregistré.

Les fichiers .lua préfabriqués sont écrits une fois, et les fichiers modifiés ne sont jamais écrasés

Chaque pouvoir Lua livré n'est écrit que lorsqu'aucun fichier correspondant n'a été trouvé sous powers. Lorsqu'une mise à jour corrige un pouvoir livré, EliteMobs répertorie les sommes de contrôle des versions livrées précédentes. Une copie non modifiée qui correspond à l'une d'elles est déplacée vers plugins/MagmaCore/outdated files/EliteMobs/, et la version actuelle est écrite au même démarrage. Un fichier que vous avez modifié ne correspond jamais : il reste tel quel et ne reçoit pas les correctifs amont. Donnez un nom propre aux copies modifiées et comparez les fichiers préfabriqués conservés à la version que vous souhaitez utiliser.

on_zone_enter / on_zone_leave ne sont pas déclenchés par les zones Lua

Les deux noms de hooks sont acceptés, mais créer une zone Lua ne les déclenche pas. Leur source intégrée est un écouteur de zone EliteScript, démarré lorsqu'un script YAML du même boss liste ZoneEnterEvent ou ZoneLeaveEvent dans Events: et définit une zone utilisable. Ces événements atteignent tous les pouvoirs correspondants de ce boss et n'identifient pas la zone YAML qui les a déclenchés. Déclarer ces hooks sur un boss utilisant uniquement Lua ne suffit pas à les exécuter.

Ne construisez pas un pouvoir Lua autour de ces deux hooks, sauf si vous l'associez délibérément à un tel script de zone YAML. Utilisez plutôt context.zones:watch_zone(...) (dont les propres callbacks on_enter / on_leave sont invoqués directement), un bloc Zone EliteScript, ou une interrogation depuis on_game_tick. Voir Hooks et Cycle de Vie et Événements de script.

Système de scripting d'EliteMobs​

La page suivante décrit comment créer des Elite Scripts !

Il s'agit d'une fonctionnalité avancée qui nécessite une connaissance approfondie d'EliteMobs.

Remarque : Les Elite Scripts peuvent être ajoutés en tant que fichiers de pouvoir ou dans des fichiers de boss personnalisés ! S'ils sont utilisés comme fichiers de pouvoir, vous pouvez les ajouter comme des pouvoirs normaux aux boss en utilisant le paramètre de configuration powers des Boss Personnalisés, comme d'habitude.

Ajouter un EliteScript​

Pour commencer à ajouter un EliteScript à un boss, ajoutez l'entrée suivante au fichier du boss :

eliteScript:

Remarque : Ce qui suit est extrêmement sensible à la casse et aux espaces ! Assurez-vous que vos espaces, sauts de ligne et formatage général correspondent aux exemples !

Maintenant que le début de votre script est déclaré, vous pouvez ajouter votre script spécifique. Pour cet exemple, nous allons créer un script appelé Example :

eliteScript:
Example:

Les EliteScripts ont cinq sections : Events, Conditions, Zone, Actions et Cooldowns. Fournissez une liste Actions non vide pour obtenir un script fonctionnel. Vous pouvez omettre Events pour les scripts appelés par d'autres scripts ou par des callbacks d'atterrissage ; sans appelant, un tel script ne s'exécute pas seul. Conditions et Cooldowns sont des structures clé-valeur, pas des listes.

Examinons un exemple simple :

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

Lors d'un coup de joueur remplissant les conditions, ce script pousse l'élite vers le haut et démarre un temps de recharge local de 60 ticks et global de 20 ticks. À 20 TPS, cela représente trois secondes et une seconde. Le temps global n'affecte que les pouvoirs qui le vérifient ; il ne bloque pas tous les hooks ou actions. Les scripts YAML déclenchés par événement vérifient les temps de recharge lorsque leur valeur locale ou globale est positive. Consultez le guide des temps de recharge ci-dessous pour le comportement des scripts appelés.

Maintenant que vous connaissez le format général de la structure des scripts, il est temps d'apprendre ce que vous pouvez faire avec chaque section !


Événements

Événements

Cliquez sur le lien ci-dessus pour apprendre à utiliser les événements !

Cibles

Cibles

Cliquez sur le lien ci-dessus pour apprendre à utiliser les cibles !

Actions

Actions

Cliquez sur le lien ci-dessus pour apprendre à utiliser les actions !

Zones

Zones

Cliquez sur le lien ci-dessus pour apprendre à utiliser les zones !

Conditions

Conditions

Cliquez sur le lien ci-dessus pour apprendre à utiliser les conditions !

Temps de recharge

Temps de recharge

Cliquez sur le lien ci-dessus pour apprendre à utiliser les temps de recharge !


Ajouter plusieurs EliteScripts​

Vous pouvez avoir plusieurs actions sur un événement, mais que faire si vous voulez plusieurs scripts sur le même boss ? C'est aussi simple que de créer une nouvelle entrée de script ! Développons l'exemple précédent et ajoutons un autre 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
duration: 20
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60

Example2 enflamme le joueur blessé pendant 20 ticks avec DIRECT_TARGET. Son temps local de 200 ticks empêche une nouvelle exécution de ce script déclenchée par événement pendant dix secondes à 20 TPS. Son temps global de 60 ticks est partagé avec les pouvoirs qui vérifient le temps de recharge du boss. D'autres scripts peuvent toujours appliquer le feu indépendamment.

Créer des pouvoirs autonomes​

Placez les pouvoirs YAML autonomes dans plugins/EliteMobs/powers. Le bloc eliteScript contient le comportement ; les champs de métadonnées optionnels ci-dessous contrôlent le chargement, la catégorie, l'affichage et les métadonnées de recharge. Exemple :

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

isEnabled​

Détermine si le pouvoir configuré est activé ; la valeur par défaut est true. Pour un pouvoir Lua personnalisé, un fichier de métadonnées associé désactivé empêche la découverte du fichier Lua. Un pouvoir Lua livré se charge malgré un fichier associé désactivé, mais il est marqué comme désactivé, comme expliqué plus bas.

powerType​

Le type fournit les métadonnées de catégorie pour les listes par défaut et la classification des anneaux de posture. Les valeurs sont :

  • UNIQUE : Prévu pour une attribution explicite. Il est exclu des listes partagées générées automatiquement, mais vous pouvez l'ajouter explicitement à une liste de pouvoirs naturels.
  • DEFENSIVE / MISCELLANEOUS / OFFENSIVE : Servent à générer la liste partagée correspondante lorsqu'elle manque. L'éligibilité dépend des listes configurées, de l'état activé et du niveau du mob.
  • MAJOR_ZOMBIE, MAJOR_SKELETON, MAJOR_BLAZE, MAJOR_ENDERMAN, MAJOR_GHAST : Ces cinq types comptent comme pouvoirs majeurs ; tous les autres sont mineurs. L'attribution naturelle utilise la liste majorPowers de l'entité, sans vérifier à l'exécution que le suffixe du type correspond à l'entité.

Comment powerType atteint les élites naturelles : EliteMobPowers.yml​

Les élites naturelles tirent leurs pouvoirs dans plugins/EliteMobs/EliteMobPowers.yml, pas à partir du seul powerType. Ce fichier contient :

CléSignification
defensivePowersPouvoirs défensifs que les élites naturelles peuvent tirer au hasard
offensivePowersPouvoirs offensifs que les élites naturelles peuvent tirer au hasard
miscellaneousPowersPouvoirs divers que les élites naturelles peuvent tirer au hasard
majorPowers.<ENTITY_TYPE>Pouvoirs majeurs que ce type d'entité peut tirer au hasard
disabledPowers.<ENTITY_TYPE>Pouvoirs retirés de ce type d'entité après application des listes partagées

Les listes partagées défensives, offensives et diverses manquantes sont générées à partir des pouvoirs chargés du type correspondant. Les valeurs par défaut des pouvoirs majeurs sont sélectionnées explicitement par type d'entité. Les listes existantes sont conservées : ajouter un pouvoir ultérieurement ne l'y ajoute pas, vous devez modifier la liste concernée. À l'inverse, un pouvoir Lua personnalisé présent lors de la génération d'une liste diverse manquante peut entrer dans cette liste par défaut.

Les noms de fichiers .lua et les anciens noms .yml sont tous deux acceptés dans ces listes ; les valeurs par défaut générées sont écrites en utilisant l'alias .yml. Un nom qui ne correspond à aucun pouvoir est ignoré avec un avertissement en console nommant le fichier et la clé.

Les emplacements de pouvoirs naturels se débloquent aux niveaux 10, 20, 30 et 40 pour les pouvoirs défensifs, offensifs, divers et majeurs respectivement. Un second emplacement de chaque catégorie se débloque aux niveaux 50, 60, 70 et 80. Les listes vides ou désactivées peuvent donner moins de pouvoirs. Modifier les listes ne change pas la classification majeure ou mineure d'un pouvoir.

effect​

Définit le matériau de l'objet qui orbite dans l'anneau de posture du pouvoir. Les types MAJOR_* utilisent l'anneau majeur ; les autres utilisent l'anneau mineur. La valeur doit être un matériau d'objet, ou un nom de particule ne nécessitant aucune donnée supplémentaire, qui orbite alors sous forme de particule. Toute autre valeur désactive l'effet et enregistre Disabled invalid power trail.

Un pouvoir sans effect, ou avec une valeur vide, n'ajoute aucun objet à l'anneau. C'est le comportement par défaut des pouvoirs Lua personnalisés sans effect dans leur fichier YAML optionnel de métadonnées.

Actuellement, les EliteScripts YAML autonomes ne copient pas cette métadonnée dans leur traînée d'exécution. Définir effect sur un tel pouvoir YAML n'ajoute donc pas d'objet de posture. Les pouvoirs Lua personnalisés copient bien l'effect de leur fichier associé.

CléValeursPar défaut
effectMatériauaucun

powerCooldown​

Définit le temps de recharge des métadonnées du pouvoir, en ticks. Les EliteScripts YAML utilisent leurs propres valeurs Cooldowns.local et Cooldowns.global, qui remplacent ces métadonnées à l'initialisation du script. Les pouvoirs Lua doivent utiliser l'API de recharge documentée pour vérifier et définir leurs temps de recharge.

CléValeursPar défaut
powerCooldownInteger0

globalCooldown​

Définit les métadonnées du temps de recharge global en ticks. Ce temps ne bloque que les pouvoirs qui le vérifient ; ce n'est pas un verrou inconditionnel sur tous les hooks ou actions. Pour les scripts YAML, configurez leur propre section Cooldowns.

CléValeursPar défaut
globalCooldownInteger0

Créer des pouvoirs Lua autonomes​

Un pouvoir Lua autonome est un fichier .lua dans plugins/EliteMobs/powers, sous-dossiers compris. Un fichier YAML de métadonnées est facultatif.

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
}

Sans fichier de métadonnées .yml de même nom de base dans le même dossier, un pouvoir Lua personnalisé reçoit ces valeurs par défaut :

  • powerType vaut MISCELLANEOUS.
  • effect n'est pas défini.

Pour un my_power.lua personnalisé, vous pouvez ajouter my_power.yml à côté avec isEnabled, powerType, effect, powerCooldown et globalCooldown. Par exemple, powerType: UNIQUE l'exclut de la liste diverse par défaut. Un fichier de métadonnées désactivé empêche le chargement de ce fichier Lua personnalisé.

Un .yml ou .yaml de même nom de base placé à côté d'un pouvoir Lua préfabriqué livré s'y applique également. Ses valeurs isEnabled, effect, powerCooldown et globalCooldown remplacent les valeurs intégrées, y compris par les valeurs par défaut des clés que vous omettez : un effect omis retire donc l'objet de posture du pouvoir. powerType ne remplace le type intégré que s'il est défini. Un fichier désactivé n'empêche pas le pouvoir livré de se charger.

Les élites naturelles utilisent les listes explicites d'EliteMobPowers.yml ; vérifiez-les lorsque vous ajoutez des pouvoirs personnalisés. Ajoutez le nom de fichier .lua à la liste powers: d'un boss pour le lui attribuer directement.

Hooks disponibles pour les pouvoirs Lua de boss​

HookSe déclenche quand
on_spawnLe boss apparaît
on_game_tickÀ chaque tick serveur tant que l'instance d'exécution est active, sans pause ni suppression
on_boss_damagedLe boss subit des dégâts de n'importe quelle source
on_boss_damaged_by_playerLe boss subit des dégâts d'un joueur
on_reinforcement_damaged_by_playerUn renfort subit des dégâts d'un joueur ; le hook s'exécute sur son invocateur
on_boss_damaged_by_eliteLe boss subit des dégâts d'une autre élite
on_player_damaged_by_bossLe boss inflige des dégâts à un joueur
on_enter_combatLe boss entre en combat
on_exit_combatLe boss quitte le combat
on_healLe boss se soigne
on_boss_target_changedL'événement de ciblage d'un joueur, acquisition initiale comprise ; pas chaque changement ou perte de cible
on_deathLe boss meurt
on_phase_switchLe boss change de phase
on_mind_actionUn Mind natif demande une action aux pouvoirs associés

on_zone_enter et on_zone_leave sont également acceptés. Le répartiteur intégré les reçoit d'un écouteur de zone EliteScript du même boss, pas des observateurs de zones Lua. Voir l'avertissement en haut de cette page.

Chaque pouvoir Lua associé possède sa propre instance d'exécution et son propre état pour ce boss. L'exemple ci-dessus n'a volontairement aucun temps de recharge et s'exécute à chaque coup correspondant transmis au hook. Ajoutez des vérifications et des définitions explicites des temps de recharge si nécessaire ; les métadonnées seules ne contrôlent pas l'exécution des hooks Lua. Un dégât peut déclencher le hook général et un hook plus spécifique : définir les deux peut donc exécuter deux gestionnaires. Consultez le guide du cycle de vie pour les annulations, la suppression et les erreurs.

Pour savoir ce que vous pouvez réellement appeler à l'intérieur de ces hooks, consultez Lua : Pour Commencer, Hooks et Cycle de Vie et Boss et Entités.