Aller au contenu principal

Cibles des Elite Scripts

Les cibles sélectionnent les entités ou positions utilisées par les actions, conditions et zones. Écrivez Target sous forme de table YAML. Les valeurs par défaut sont SELF pour targetType, 20.0 pour range et true pour track. Les noms des champs sont insensibles à la casse ; les valeurs d'énumération des types de cible doivent être en majuscules.

Types de cible​

Les types de cible définissent quelles entités ou emplacements sont ciblés par un script.

DIRECT_TARGET est l'entité fournie par l'événement : joueur, élite attaquante ou entité traversant une zone. Utilisez-le uniquement avec un événement compatible ; sans cible directe, il ne sélectionne rien. Ce n'est pas automatiquement la cible de combat actuelle du boss. Les types de proximité cherchent dans une boîte alignée sur les axes autour du boss, sans trier par distance.

Les cibles d'entité peuvent fournir la position actuelle de leurs pieds aux actions sur des positions. L'inverse n'est pas automatique : LOCATION, LOCATIONS et LANDING_LOCATION ne sélectionnent pas les entités occupant ces positions. Créez une zone pour les trouver. Les sélecteurs de joueurs n'excluent pas eux-mêmes les spectateurs ou les joueurs d'autres rencontres ; une action peut appliquer des règles supplémentaires.

Type de cibleDescriptionParticularités
NEARBY_PLAYERSJoueurs à portéerange facultatif, valeur par défaut 20.0
NEARBY_MOBSEntités vivantes autres que des joueurs à portée, boss exclurange facultatif, valeur par défaut 20.0
NEARBY_ELITESÉlites suivies à portée, boss exclurange facultatif, valeur par défaut 20.0
WORLD_PLAYERSJoueurs dans le monde❌
ALL_PLAYERSJoueurs sur le serveur❌
DIRECT_TARGETEntité fournie par l'événementNécessite un événement compatible
SELFÉlite utilisant le pouvoir❌
SELF_SPAWNPosition d'apparition mémorisée du boss pour les actions sur des positionsLes actions sur des entités reçoivent toujours le boss lui-même
LOCATIONEmplacement précisNécessite location
LOCATIONSPlusieurs emplacements précisNécessite locations
ZONE_FULLCibles à l'intérieur de la zoneNécessite une Zone
ZONE_BORDERCibles sur la bordure de la zoneNécessite une Zone
ACTION_TARGETUtilise le contexte de cible de l'action qui l'entoureUniquement pour les conditions d'action avec FILTERING et les vecteurs relatifs ; ce n'est pas une cible d'action autonome
LANDING_LOCATIONCible l'emplacement où un bloc ou une entité a atterri.Ne peut être utilisé que dans les landingScripts des actions SPAWN_FALLING_BLOCK et SUMMON_ENTITY !
INHERIT_SCRIPT_TARGETHérite de la cible du script qui exécute ce scriptNe peut s'exécuter que si le script a été appelé par un autre script !
INHERIT_SCRIPT_ZONE_FULLCibles à l'intérieur de la zone héritée du script qui exécute ce scriptNécessite une Zone dans le script qui appelle ce script !
INHERIT_SCRIPT_ZONE_BORDERCibles sur la bordure de la zone héritée du script qui exécute ce scriptNécessite une Zone dans le script qui appelle ce script !
Exemple
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: ALL_PLAYERS
sValue: "&2Hello World!"

Ceci envoie un message à la cible. Comme la cible est définie sur ALL_PLAYERS, le message sera envoyé à tous les joueurs en ligne.


Attributs partagés​

Ces réglages s'appliquent lors de la résolution des positions cibles. Ils ne déplacent pas les entités et ne changent pas celle qui reçoit l'action.

ValeurDescriptionParticularités
offsetDéfinit le décalage de l'emplacement de la cible.Ne peut pas cibler des entités !
relativeOffsetDécale les positions à partir d'une définition de vecteur relatif. Ses cibles source et destination déterminent la direction.Ne peut pas cibler des entités !

Les décalages s'appliquent aux positions issues de cibles d'entités comme SELF et DIRECT_TARGET, à SELF_SPAWN, LOCATION et LOCATIONS, ainsi qu'à chaque position échantillonnée dans une zone par ZONE_FULL, ZONE_BORDER et leurs variantes héritées. Pour déplacer toute la zone, appliquez plutôt le décalage au Target propre à la zone, comme dans les exemples ci-dessous. Les mêmes règles s'appliquent aux utilitaires de script Lua.

offset utilise les axes X/Y/Z du monde, pas l'orientation de l'entité. Il s'applique avant relativeOffset. Les résultats de LANDING_LOCATION et INHERIT_SCRIPT_TARGET ignorent ces décalages supplémentaires. Dans un vecteur relatif, ACTION_TARGET utilise directement la position fournie par l'action et ignore ses propres réglages de décalage.

Exemple
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"

La foudre frappe 2 blocs au-dessus du boss. STRIKE_LIGHTNING sélectionne des positions et accepte donc un décalage. La foudre est purement visuelle et n'inflige pas de dégâts aux entités.

Vous ne pouvez pas définir de décalage pour envoyer un message, puisque les messages sont envoyés aux joueurs. Vous pouvez cependant définir un décalage pour une zone qui pourra ensuite cibler des entités.


range​

Définit la demi-largeur de la boîte de recherche pour NEARBY_PLAYERS, NEARBY_MOBS et NEARBY_ELITES. La même valeur s'applique aux axes X, Y et Z ; ce n'est pas une limite de distance sphérique. Les recherches de mobs et d'élites excluent le boss lanceur.

Utilisez un nombre fixe positif ou nul pour une boîte constante. Une plage avec ~ peut être tirée séparément sur chaque axe et utilise l'échantillonnage décimal décrit dans coverage ci-dessous ; elle ne garantit pas un cube avec un seul rayon tiré au hasard.

ValeurDescriptionValeur par défaut
rangeDemi-largeur en blocs pour les recherches de joueurs, mobs et élites proches.20.0
Exemple
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 25.0
sValue: "&2Targeted players within 25 blocks!"

À la mort du boss, le message est envoyé aux joueurs dans la boîte qui s'étend sur 25 blocs le long de chaque axe depuis sa position.

location​

Définit l'emplacement pour le type de cible LOCATION.

ValeurDescriptionValeur par défaut
locationDéfinit l'emplacement dans le monde qui sera ciblé.none

Utilise le format location: worldname,x,y,z,yaw,pitch pour l'emplacement. worldname,x,y,z est également accepté (yaw et pitch valent alors 0 par défaut), tout comme la forme sans monde x,y,z,yaw,pitch, même si cette dernière laisse l'emplacement sans monde et est rarement ce que vous voulez. Un simple x,y,z à trois valeurs n'est pas valide et est rejeté avec Attempted to deserialize an invalid location! dans la console.

Utilisez un monde chargé ou same_as_boss. L'analyse ne charge aucun monde ; une entrée incorrecte ou un monde non résolu peut échouer lors de l'utilisation de la cible. Les coordonnées sont absolues, même avec same_as_boss, qui ne change que le monde.

Si le monde configuré n'est pas chargé et que le boss se trouve dans un monde nommé <configuredWorld>_<number>, la cible utilise ce monde d'instance. Ce repli ne remplace pas un monde configuré déjà chargé.

Notez que same_as_boss est un substituant valide pour le nom du monde ; ainsi, same_as_boss,100,64,100,0,0 serait un emplacement valide qui ciblerait le même monde que celui où se trouve le boss.

Exemple
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: LOCATION
location: "myWorld,100,64,200,0,0"

Ceci fait apparaître un éclair à l'emplacement x=100, y=64, z=200 d'un monde appelé myWorld.


locations​

Définit les emplacements pour le type de cible LOCATIONS.

ValeurDescriptionValeur par défaut
locationsDéfinit la liste des emplacements dans le monde qui seront ciblés.none

Utilise le format worldname,x,y,z,yaw,pitch pour chaque emplacement, avec les mêmes variantes acceptées que pour location.

Notez que same_as_boss est un substituant valide pour le nom du monde ; ainsi, same_as_boss,100,64,100,0,0 serait un emplacement valide qui ciblerait le même monde que celui où se trouve le boss.

Exemple
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: LOCATIONS
locations:
- "myWorld,100,64,200,0,0"
- "same_as_boss,-100,12,130,0,0"

Ceci fait apparaître un éclair à l'emplacement x=100, y=64, z=200 d'un monde appelé myWorld et un autre éclair dans le même monde que le boss à l'emplacement x=-100, y=12 et z=130.


Cibler des zones​

Les zones séparent leurs cibles d'origine des actions qui utilisent leur géométrie. Zone.Target fournit les origines ; ZONE_FULL ou ZONE_BORDER dans une action sélectionne à partir des formes obtenues. Plusieurs origines peuvent produire plusieurs formes. Les entités sont dédupliquées ; des formes superposées peuvent toujours fournir des positions de particules en double.

Les zones fonctionnent en deux parties :

Partie 1 - Définir où va la zone​

Les zones doivent savoir où elles sont censées se trouver, et pour cela vous utilisez le système de cibles de la même façon que pour n'importe quel autre effet basé sur un emplacement, comme un éclair.

Exemple
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF

Ce fragment décrit un cylindre de rayon 10 et de hauteur 1, partant des pieds du boss vers le haut. Il n'a pas encore d'actions ; un script exécutable nécessite les Actions ci-dessous. filter: PLAYER concerne les requêtes d'entités, pas les positions géométriques des particules.

Certaines zones, comme STATIC_RAY, ont deux cibles ou plus. C'est parce que les rayons sont des lignes, et qu'une ligne est définie par deux points. Ceci est traité plus en détail sur la page des zones, mais elles fonctionnent fondamentalement toutes de la même manière.

Partie 2 - Cibler l'intérieur de la zone​

Utilisez targetType: ZONE_FULL pour la forme entière ou targetType: ZONE_BORDER pour sa bordure. Les actions sur des positions reçoivent des points géométriques échantillonnés ; celles sur des entités reçoivent les entités correspondant au filtre et aux vérifications d'inclusion de la zone. Ce ne sont pas les mêmes collections.

Exemple
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL

Les particules apparaissent aux positions échantillonnées du cylindre, pas aux positions des joueurs. Il y a 12 exécutions espacées de 5 ticks. Les actions de particules sur une zone utilisent environ 30 % de couverture si coverage n'est pas explicite. filter: PLAYER ne limite pas ces particules aux joueurs.

Notez que ZONE_BORDER n'est pas disponible pour toutes les zones. Plus de détails à ce sujet sur la page des zones de script.

Suivi de zone​

Placez track dans le Target de l'action, comme ci-dessous. Avec true, les formes recalculent normalement leurs origines mobiles à chaque demande. Avec false, l'action met les formes en cache avant son wait, ce qui fixe l'origine ; les requêtes d'entités recherchent toujours celles présentes dans la forme au moment de la requête. La liste des joueurs présents au lancement n'est pas figée.

ValeurDescriptionValeur par défaut
trackRésout de nouveau la cible au lieu de mémoriser l'origine de la zone et ses positions échantillonnées.true

Avec un animationDuration positif, l'action met en cache les formes animées dès son démarrage, quel que soit son réglage track. Elle met en cache les formes, pas une liste fixe de leurs positions : leur animation continue donc. Plus de détails ici.

Exemple
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false

En reprenant le même exemple que dans les parties 1 et 2, la zone est désormais réglée pour ne pas suivre. Cela signifie que la zone apparaîtra à l'emplacement du boss, mais que même si le boss continue de s'éloigner, la zone restera là où elle est apparue initialement.

Le cache se prépare au démarrage de l'action, avant son attente. Retarder RUN_SCRIPT retarde donc aussi le démarrage et le cache du script appelé.

Pour un avertissement suivi de dégâts à la position initiale, lancez les deux scripts immédiatement et placez wait sur les actions de dégâts. Utilisez des origines fixes identiques si les positions doivent rester les mêmes malgré le mouvement ou les actions précédentes.

Ce qui suit est un exemple correct d'un pouvoir avec une phase d'avertissement et une phase de dégâts, tiré du Frost Palace Sanctum.

Exemple
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
- action: SPAWN_PARTICLE
wait: 60
times: 13
repeatEvery: 3
particles:
- particle: FLAME
amount: 0
x: 0
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: -0.5
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: 0
y: 1
z: -0.5
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: -0.5
speed: 0.2
Target:
targetType: ZONE_FULL
track: false
- action: RUN_SCRIPT
scripts:
- DamageCylinder
- action: PLAY_ANIMATION
sValue: fire_zone
Target:
targetType: SELF
- action: SET_MOB_AI
duration: 100
bValue: false
Target:
targetType: SELF
Cooldowns:
local: 1200
global: 300
DamageCylinder:
Zone:
radius: 10.0
shape: CYLINDER
height: 10
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
offset: 0,-1,0
Actions:
- action: DAMAGE
wait: 60
repeatEvery: 10
times: 4
multiplier: 4
Target:
targetType: ZONE_FULL
track: false
- action: SET_ON_FIRE
wait: 60
duration: 80
Target:
targetType: ZONE_FULL
track: false

Ce script fait beaucoup de choses, mais il est séparé en deux scripts distincts : VisualCylinder et DamageCylinder.

VisualCylinder s'exécute en premier et possède l'action RUN_SCRIPT qui exécute aussi immédiatement DamageCylinder en même temps que VisualCylinder s'exécute.

Cependant, chaque action de DamageCylinder est réglée pour attendre 60 ticks, soit 3 secondes.

L'avertissement dure 3 secondes avant les effets retardés. Les deux scripts capturent la même position horizontale du boss lorsqu'ils démarrent immédiatement. Leurs volumes diffèrent : le cylindre visuel a une hauteur de 1 aux pieds, tandis que celui des dégâts commence 1 bloc plus bas et a une hauteur de 10. DAMAGE se répète quatre fois à 10 ticks d'intervalle ; SET_ON_FIRE s'exécute une fois après l'attente et demande 80 ticks de feu. L'animation nécessite un modèle personnalisé compatible avec fire_zone.

Chaque exécution d'une action conserve son propre cache. Des lancements simultanés du même script n'écrasent pas les positions mémorisées les uns des autres, et un nouveau lancement ne réutilise jamais les positions mises en cache par un lancement précédent.

Propriétés de cible spécifiques aux zones​

Les zones ont les propriétés spécifiques suivantes :

coverage​

Définit le pourcentage de la zone qui sera réellement utilisé pour l'action. Ne fonctionne que pour les cibles d'emplacement (ne fonctionne pas lorsqu'on cible des joueurs ou d'autres entités).

ValeurDescriptionValeur par défaut
coverageFraction des positions de la zone à conserver ; 0.5 correspond à environ la moitié. Préférez une valeur fixe de 0 à 1.1.0

Une plage comme 0.3~1.0 tire une valeur de 0.3 à 1.0, sans inclure 1.0, et la couverture peut être tirée séparément pour chaque point. Utilisez une fraction fixe pour une couverture prévisible. coverage: 1.0 explicite conserve toutes les positions ; l'absence de ce réglage sur une action de zone SPAWN_PARTICLE donne 0.3. La couverture ne réduit pas les requêtes d'entités. Avec track: false, la sélection de positions d'une zone statique est mémorisée et réutilisée, sans nouveau tirage à chaque répétition.

Exemple
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
coverage: 0.5

Chaque position échantillonnée a 50 % de chances d'être conservée pour les particules. Le nombre obtenu est approximatif, pas exactement la moitié.

Héritage des cibles​

Lorsqu'un script en exécute un autre (ou « appelle » ce script), il est possible de transmettre les informations de zone et de cible du premier script au second.

Exemples d'utilisation

  1. Exécuteurs de scripts améliorés

Les exécuteurs de scripts sont des scripts dont la seule fonction est d'exécuter un grand nombre d'autres scripts. Ils servent à faciliter la gestion des scripts, en particulier lorsqu'il s'agit de gérer plusieurs scripts qui nécessitent une synchronisation précise.

Avec l'héritage des cibles, plusieurs scripts peuvent utiliser la même zone ou la même cible, réduisant potentiellement des centaines de lignes de scripting répétitif.

  1. Filtrage de cibles en poupées russes / filtrage de cibles en matriochka

Une action parent qui résout et filtre réellement des entités peut transmettre son résultat en cache à un enfant via sa liste scripts. Gardez des types de cible compatibles. RUN_SCRIPT n'exécute pas lui-même le filtrage individuel : lui ajouter une condition FILTERING ne produit pas de liste filtrée à hériter.

Pour vérifier des tags, utilisez ACTION_TARGET avec FILTERING sur l'action d'entité. Une probabilité aléatoire nécessite des conditions de script ou BLOCKING ; ce n'est pas un tirage par entité pendant le filtrage. isAlive vérifie la validité Bukkit : l'inverser ne constitue pas un déclencheur fiable de mort d'un joueur.

  1. Zones complexes

Enfin, il est possible d'empiler des cibles pour créer des zones complexes, en utilisant éventuellement des conditions si nécessaire, et il est même possible de créer des zones semi-aléatoires en utilisant les conditions de script et la capacité de n'exécuter qu'un seul des scripts listés dans les actions de script.

Remarque : Dans cette section, « script parent » désigne le script qui exécute le « script héritier », qui est le script qui utilisera les cibles héritées.

Lorsque vous utilisez l'héritage des cibles, il est important d'examiner attentivement le script parent pour vous assurer que les bonnes données sont bien transmises.

INHERIT_SCRIPT_TARGET​

INHERIT_SCRIPT_TARGET lit le sélecteur ou le cache de l'action parent précise qui a appelé l'enfant, pas l'ensemble des cibles du script parent. Placez-le sur les actions ou origines de zone de l'enfant, pas dans ses Conditions de premier niveau : celles-ci sont évaluées avant que les données d'action héritées soient disponibles, et la cible héritée y échoue avec une erreur.

Le parent ne transmet ses cibles résolues et filtrées par ses conditions que si son Target a track: false. Avec la valeur par défaut track: true, l'enfant résout de nouveau la cible du parent, sans le filtrage du parent. Un parent RUN_SCRIPT ne résout jamais ses propres cibles : son enfant résout donc toujours les entités de nouveau. Avec track: false, l'enfant réutilise bien les positions que ce parent a mises en cache au démarrage de son action. Quelques limites s'appliquent :

  • Pour des cibles d'entité, l'enfant peut les utiliser avec des actions sur des entités ou sur des positions. Les actions sur des positions reçoivent les positions des entités.

  • Lorsqu'on transmet des cibles d'emplacement, il n'est possible d'utiliser que des emplacements. Une action sur des entités qui hérite de positions échoue avec une erreur. La seule façon d'obtenir une entité à partir d'un emplacement est de créer une zone à cet emplacement et d'y rechercher des entités. Ainsi, bien qu'il ne soit pas impossible de transmettre un emplacement puis d'obtenir des entités, cela nécessitera un peu de travail supplémentaire.

Héritage des zones​

Lorsque vous utilisez INHERIT_SCRIPT_ZONE_FULL ou INHERIT_SCRIPT_ZONE_BORDER, il est impératif que le script parent définisse une zone, faute de quoi le script héritier ne pourra pas s'exécuter correctement.

Une action avec track: false met les formes de sa zone en cache avant son attente. Une action avec suivi laisse normalement les formes sans cache et recalcule les origines mobiles. Les données de l'action parent peuvent réutiliser les formes en cache ; track: true ne fige pas une position commune.

Les cibles de zone héritées utilisent la Zone propre au script parent et les formes mises en cache par l'action appelante, si elle en a mis en cache. Les requêtes d'entités de INHERIT_SCRIPT_ZONE_FULL utilisent le test du volume entier, comme ZONE_FULL. Si le script parent n'a pas de zone valide, ou si le script n'a pas été appelé par un autre script, l'action échoue avec une erreur.

Pour partager une origine fixe, donnez track: false au Target de l'action appelante. L'enfant réutilise alors les formes que le parent a mises en cache au démarrage de son action, même si les actions de l'enfant attendent.