Aller au contenu principal

Créer des pouvoirs

webapp_banner.jpg

Deux façons d'écrire un pouvoir

Chaque pouvoir se trouve dans ~/plugins/EliteMobs/powers (les sous-dossiers sont également analysés), et il existe deux formats :

FormatFichierÀ utiliser pour
Lua*.luaTout nouveau développement. Langage de script complet, tous les hooks de boss, boucles et état. C'est ce qu'utilisent les pouvoirs livrés.
EliteScript*.ymlLe format déclaratif événement/action documenté dans le reste de cette page. Toujours pleinement pris en charge.

La quasi-totalité des 71 pouvoirs livrés avec EliteMobs sont désormais en Lua — 68 d'entre eux. Seuls bonus_coins.yml, custom_summon.yml et elite_script.yml subsistent en tant que pouvoirs Java adossés à du YAML. Si vous écrivez un nouveau pouvoir de zéro, Lua est la voie disposant du plus de capacités — 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.

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

Lorsqu'un boss demande attack_fire.yml, EliteMobs cherche d'abord attack_fire.lua et l'utilise s'il existe. C'est pourquoi les anciennes configurations de boss écrites avant Lua continuent de fonctionner sans modification — vous n'avez pas à réécrire vos listes powers:. Les nouvelles configurations devraient nommer directement le fichier .lua.

Les fichiers .lua préfabriqués sont écrits une fois, jamais écrasés

Chaque pouvoir Lua livré n'est écrit dans le dossier powers que si ce fichier n'existe pas déjà. Une fois que vous en modifiez un, EliteMobs n'écrasera pas votre version lors d'une mise à jour — mais vous cessez aussi de recevoir les correctifs amont le concernant. Si vous souhaitez une copie modifiée, préférez lui donner un nouveau nom de fichier.

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

Les deux noms de hooks sont acceptés par le fournisseur de scripts de boss et ne provoqueront pas d'erreur de chargement, mais rien dans un pouvoir Lua ne peut les faire se déclencher. Ils ne sont dispatchés que depuis l'écouteur de zone d'EliteScript, lequel est démarré lorsqu'un eliteScript: YAML sur le même boss liste ZoneEnterEvent ou ZoneLeaveEvent dans ses Events:. Un boss ne disposant que de pouvoirs Lua chargera un fichier contenant ces hooks puis ne les appellera jamais.

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 5 sections différentes : Events, Conditions, Zones, Actions et Cooldowns. Seul Actions est obligatoire.

Examinons un exemple simple :

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

Ce script fait qu'un elite est poussé vers le haut lorsqu'il est frappé par un joueur, et ne le refera pas pendant 3 secondes (et empêchera d'autres pouvoirs de se déclencher pendant 1 seconde en raison des paramètres de la section Cooldowns).

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 !


Events

Events

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

Targets

Targets

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 !

Cooldowns

Cooldowns

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
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60

Dans cet exemple, nous avons ajouté un second script appelé Example2. Example2 mettra le feu au joueur qui est endommagé par le boss, car le targetType est défini sur DIRECT_TARGET.
Le cooldown de ce script est fixé à 200 ticks, ce qui signifie que le boss ne pourra enflammer les joueurs que toutes les 10 secondes.

Créer des pouvoirs autonomes

Les pouvoirs autonomes sont presque entièrement composés de l'Elite Script. Il n'y a que deux champs optionnels. N'oubliez pas que pour que les pouvoirs autonomes fonctionnent, ils doivent être placés dans le dossier ~plugins/EliteMobs/powers.
Exemple de pouvoir autonome :

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

isEnabled

Comme partout ailleurs dans le plugin, définit si le pouvoir est activé.

powerType

Le type de pouvoir définit comment le pouvoir est attribué. Les valeurs sont :

  • UNIQUE : Le pouvoir ne sera appliqué qu'aux boss personnalisés qui ont le pouvoir défini dans la section des pouvoirs.
  • DEFENSIVE / MISCELLANEOUS / OFFENSIVE : N'IMPORTE QUEL elite pourra obtenir ces pouvoirs, et ils compteront pour un sous-ensemble spécifique de pouvoirs.
  • MAJOR_ZOMBIE, MAJOR_SKELETON, MAJOR_BLAZE, MAJOR_ENDERMAN, MAJOR_GHAST : Seuls les elites du type d'entité approprié pourront apparaître naturellement avec ces pouvoirs, et ils compteront comme pouvoirs majeurs. Ces cinq types sont les seuls à compter comme pouvoirs majeurs ; tout le reste compte comme pouvoir mineur.

Comment powerType atteint les élites naturelles : EliteMobPowers.yml

powerType ne place pas à lui seul un pouvoir devant une élite naturelle. Ce sur quoi les élites naturelles tirent réellement, c'est ~/plugins/EliteMobs/EliteMobPowers.yml, qui contient ces listes :

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

À la première génération du fichier, chaque liste est amorcée avec tous les pouvoirs chargés du powerType correspondant. Ensuite, le fichier fait autorité et n'est jamais réamorcé : un pouvoir que vous ajoutez plus tard — y compris tout fichier .lua que vous déposez dans le dossier powers — n'apparaîtra pas sur les élites naturelles tant que vous ne l'aurez pas ajouté vous-même à la liste concernée.

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é.

effect

Définit l'effet visuel ou le matériau utilisé par le pouvoir. Ceci est utilisé par certains pouvoirs codés en dur pour définir leur effet visuel de particules ou de matériau.

CléValeursPar défaut
effectStringnone

powerCooldown

Définit le temps de recharge, en ticks, pour le pouvoir individuel. Cela contrôle la fréquence à laquelle ce pouvoir spécifique peut se déclencher.

CléValeursPar défaut
powerCooldownInteger0

globalCooldown

Définit le temps de recharge global, en ticks, partagé entre tous les pouvoirs. Après le déclenchement de ce pouvoir, aucun autre pouvoir ne peut se déclencher tant que le cooldown global n'a pas expiré.

CléValeursPar défaut
globalCooldownInteger0

Créer des pouvoirs Lua autonomes

Un pouvoir Lua autonome n'est qu'un fichier .lua dans ~/plugins/EliteMobs/powers (sous-dossiers compris — le dossier est parcouru récursivement). Il n'y a ni enveloppe YAML ni clés de configuration : le fichier est le pouvoir.

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
}

Comme il n'y a pas d'en-tête YAML dont les lire, un pouvoir Lua découvert de cette façon reçoit des métadonnées fixes :

  • powerType vaut MISCELLANEOUS. Vous ne pouvez pas le définir à UNIQUE depuis le fichier. (Les pouvoirs Lua livrés avec EliteMobs portent leur type en Java, c'est pourquoi ils peuvent être UNIQUE, OFFENSIVE, MAJOR_*, etc.)
  • effect n'est pas défini.

En pratique, cela ne fait pas fuiter votre pouvoir vers des élites aléatoires, car les réserves de tirage des élites naturelles proviennent d'EliteMobPowers.yml et ce fichier n'est pas réamorcé une fois qu'il existe — voir ci-dessus. Ajoutez le pouvoir à la liste powers: d'un boss pour l'utiliser.

Hooks disponibles pour les pouvoirs Lua de boss

HookSe déclenche quand
on_spawnLe boss apparaît
on_game_tickÀ chaque tick serveur
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_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_changedLe boss change de cible
on_deathLe boss meurt
on_phase_switchLe boss change de phase

on_zone_enter et on_zone_leave sont également acceptés par l'analyseur, mais rien dans un pouvoir Lua ne peut les faire se déclencher — ils ne sont dispatchés que depuis un écouteur de zone EliteScript sur le même boss. Voir l'avertissement en haut de cette page.

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.