Перейти к основному содержимому

Введение

Эти примеры объединяют действия EliteScript для создания способностей кастомных боссов. Их YAML можно редактировать напрямую или через веб-приложение.

Видео — старые демонстрации задуманных эффектов, а не проверка текущей реализации. Перед использованием прочитайте описание поведения и ограничений каждого примера.

Вставьте блок eliteScript в файл кастомного босса. Замените ссылки на контент, например fc_boss.yml, установленным определением босса. У примера Arrow Rain ниже есть описанное ограничение точки запуска снарядов: сейчас он не создаёт заявленный дождь из стрел сверху.

Это примеры EliteScript

EliteScript (.yml) по-прежнему полностью поддерживается, и именно его использует каждый пример на этой странице. Это больше не единственный вариант: способности можно писать и на Lua, и именно так теперь написана почти каждая способность, поставляемая с EliteMobs. О том, как соотносятся два формата, см. Создание способностей.

Используйте актуальные названия эффектов, например SLOWNESS, INSTANT_HEALTH и NAUSEA. Обработчик также принимает идентификаторы с пространством имён, например minecraft:slowness; старые написания Bukkit обрабатываются через механизм совместимости.

Все интервалы ниже указаны в игровых тиках: при нормальной скорости сервера 20 тиков равны секунде. Действия планируются независимо; wait отсчитывается от начала данного действия, а не после завершения предыдущего. Повторяемое действие начинается без дополнительной задержки на один интервал и выполняется times раз. track: false у цели действия фиксирует его зону до ожидания; установка только в Zone.Target не фиксирует все действия. Подробности геометрии и кэширования см. в разделах Цели и Зоны.

coverage выбирает точки зоны для эффектов и призыва, а не процент игроков. Фильтры сущностей зоны по умолчанию выбирают игроков, а NEARBY_PLAYERS ищет в параллелепипеде, выровненном по осям, а не в сферическом радиусе. Cooldowns.local и global задаются в тиках; автоматическую проверку перезарядки событий включает любое из них, если оно положительно. Вспомогательные скрипты, вызванные через scripts, запускаются при выполнении вызывающего действия. См. Перезарядки.

Примеры способностей​

Slam Down​

Когда игрок наносит урон боссу, тот телепортируется на 8 блоков выше позиции этого игрока. Через 15 тиков PUSH ставит установку скорости вниз в очередь на следующий тик. На тике 20 два независимых действия накладывают Замедление IV на 60 тиков и показывают подзаголовок «Stunned!» игрокам, выбранным поисковым параллелепипедом ближайших игроков с дальностью 3 у текущей позиции босса. Подзаголовок остаётся на 40 тиков, дополнительно по 10 тиков занимают появление и исчезновение.

Это эффект по таймеру, а не детектор приземления. Препятствия, гравитация и результат телепортации могут изменить положение босса на тике 20. Замедление не запрещает атаковать и не реализует полное оглушение; отдельного действия со скриптовым уроном в этом примере нет.

Развернуть пример
eliteScript:
SlamDown:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: TELEPORT
FinalTarget:
targetType: DIRECT_TARGET
offset: 0,8,0
Target:
targetType: SELF
- action: PUSH
vValue: 0,-5,0
Target:
targetType: SELF
wait: 15
- action: POTION_EFFECT
potionEffectType: SLOWNESS
amplifier: 3
duration: 60
Target:
targetType: NEARBY_PLAYERS
range: 3
wait: 20
- action: TITLE_MESSAGE
subtitle: "Stunned!"
duration: 40
fadeIn: 10
fadeOut: 10
Target:
targetType: NEARBY_PLAYERS
range: 3
wait: 20
Cooldowns:
local: 180
global: 80

Push Away​

Скрипт рисует купол радиусом 4 вокруг босса и одновременно запускает частицы, повторяющиеся толчки и сообщения. Исправленный пример срабатывает на урон от игрока и вычисляет направление от босса к этому атакующему со смещением вверх. Каждый выбранный игрок получает один и тот же вектор: это толчок в общем направлении, а не отдельное радиальное отталкивание каждого игрока от босса.

PUSH заменяет скорость через один тик после каждого действия и вычисляет относительный вектор один раз за запуск действия. Его позиция ACTION_TARGET совпала бы с позицией босса, поэтому сочетание с SourceTarget: SELF даёт направление нулевой длины вместо нужного толчка. Этот пример использует DIRECT_TARGET. Если позиции босса и атакующего совпадают, направление равно нулю и остаётся только смещение 0,0.2,0. Полная проверка сущностей купола использует включение в сферу, поэтому может выбрать и игрока ниже видимой полусферы.

Развернуть пример
eliteScript:
PushAway:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: DOME
radius: 4
borderRadius: 3
Target:
targetType: SELF
track: true
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_BORDER
track: true
repeatEvery: 5
times: 4
- action: PUSH
Target:
targetType: ZONE_FULL
track: true
RelativeVector:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 1.0
offset: 0,0.2,0
repeatEvery: 1
times: 20
- action: MESSAGE
sValue: "&cCool boss!: &fBE GONE!"
Target:
targetType: ZONE_FULL
repeatEvery: 10
times: 2
Cooldowns:
local: 140
global: 80

Arrow Rain​

Этот старый пример рисует границу цилиндра радиусом 5 и высотой 1 у начальной позиции нанёсшего урон игрока и показывает предупреждение. Действие со стрелами фиксирует второй цилиндр на 10 блоков выше, ждёт 40 тиков и пытается выполнить четыре залпа с интервалом 10 тиков.

Текущее ограничение точки запуска снарядов

Для живого босса SUMMON_ENTITY со значением ARROW вызывает средство запуска снарядов самого босса. Поэтому стрелы запускаются от босса, по одной на выбранную точку зоны, а не из этих точек сверху. Скорость вниз по-прежнему применяется, но выход из изображённого круга не позволяет надёжно избежать этой реализации. Старое видео показывает задуманный дождь; YAML сохранён для объяснения ограничения, а не как рабочий рецепт дождя из стрел сверху.

Развернуть пример
eliteScript:
MakeCircle:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: CYLINDER
radius: 5
borderRadius: 4
height: 1
Target:
targetType: DIRECT_TARGET
track: false
Actions:
- action: SPAWN_PARTICLE
Target:
targetType: ZONE_BORDER
track: false
coverage: 1.0
repeatEvery: 5
times: 8
particles:
- particle: FLAME
- action: TITLE_MESSAGE
Target:
targetType: DIRECT_TARGET
fadeOut: 10
duration: 20
fadeIn: 10
subtitle: Move out of the zone!
- action: RUN_SCRIPT
scripts:
- "ArrowRain"
Cooldowns:
local: 160
global: 80
ArrowRain:
Zone:
shape: CYLINDER
radius: 5
borderRadius: 4
height: 1
Target:
targetType: DIRECT_TARGET
track: false
offset: 0,10,0
Actions:
- action: SUMMON_ENTITY
wait: 40
sValue: ARROW
Target:
targetType: ZONE_FULL
track: false
vValue: 0,-1,0
repeatEvery: 10
times: 4

Fire Aura​

Когда босс наносит урон игроку, скрипт запускает частицы в следующем за боссом цилиндре радиусом 2 и высотой 3 и выдаёт боссу временный тег FireOn на 120 тиков. Частицы запускаются 24 раза с интервалом 5 тиков, последний раз на тике 115.

Если игрок наносит урон боссу при наличии тега, SetOnFire устанавливает время горения этого непосредственного атакующего на 20 тиков. Блокирующее условие проверяет тег босса, а не нахождение атакующего внутри цилиндра. У вспомогательного скрипта нет значений перезарядки, поэтому он пропускает проверку перезарядки, и глобальная перезарядка визуального скрипта его не подавляет.

Развернуть пример
eliteScript:
Visual:
Events:
- PlayerDamagedByEliteMobEvent
Zone:
shape: CYLINDER
radius: 2
height: 3
Target:
targetType: SELF
track: true
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: FLAME
Target:
targetType: ZONE_FULL
track: true
coverage: 1.0
repeatEvery: 5
times: 24
- action: TAG
tags:
- "FireOn"
duration: 120
Target:
targetType: SELF
Cooldowns:
local: 180
global: 80
SetOnFire:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_ON_FIRE
duration: 20
Target:
targetType: DIRECT_TARGET
Conditions:
Target:
targetType: SELF
conditionType: BLOCKING
hasTags:
- "FireOn"

Poison Lines​

Скрипт фиксирует два перпендикулярных параллелепипеда у начальной позиции босса, образуя знак «плюс». SET_MOB_AI отключает обычный ИИ моба на 40 тиков и немедленно запускает PoisonLine2; вспомогательный скрипт не ждёт восстановления ИИ. Другие скрипты этим действием не отключаются.

Каждая полоса испускает облака восемь раз с интервалом 5 тиков. На тике 40 начинаются дым и Отравление V: каждое действие повторяется 12 раз с интервалом 5 тиков до тика 95. Каждое наложение отравления длится 50 тиков, поэтому эффект может сохраняться после окончания дыма. track: false на уровне действий фиксирует обе полосы даже после возобновления движения босса. Значение y: 1 у параллелепипеда создаёт неглубокую полосу столкновения сущностей от Y исходного блока до половины блока выше; частицы и проверка включения сущностей используют разные объёмы.

Развернуть пример
eliteScript:
PoisonLine1:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: CUBOID
x: 20
y: 1
z: 2
Target:
targetType: SELF
track: false
Actions:
- action: SET_MOB_AI
bValue: false
duration: 40
Target:
targetType: SELF
scripts:
- "PoisonLine2"
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
coverage: 1
track: false
repeatEvery: 5
times: 8
- action: SPAWN_PARTICLE
particles:
- particle: SMOKE
Target:
targetType: ZONE_FULL
coverage: 1
track: false
wait: 40
repeatEvery: 5
times: 12
- action: POTION_EFFECT
potionEffectType: POISON
amplifier: 4
duration: 50
Target:
targetType: ZONE_FULL
track: false
wait: 40
repeatEvery: 5
times: 12
Cooldowns:
local: 200
global: 80
PoisonLine2:
Zone:
shape: CUBOID
x: 2
y: 1
z: 20
Target:
targetType: SELF
track: false
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
coverage: 1
track: false
repeatEvery: 5
times: 8
- action: SPAWN_PARTICLE
particles:
- particle: SMOKE
Target:
targetType: ZONE_FULL
coverage: 1
track: false
wait: 40
repeatEvery: 5
times: 12
- action: POTION_EFFECT
potionEffectType: POISON
amplifier: 4
duration: 50
Target:
targetType: ZONE_FULL
track: false
wait: 40
repeatEvery: 5
times: 12

Bounce​

Скрипт фиксирует цилиндр радиусом 10 и высотой 2 у начальной позиции босса. Он испускает частицы 20 раз с интервалом 10 тиков и выполняет 200 толчков вверх с интервалом 1 тик — примерно 10 секунд при нормальной скорости сервера.

Каждый толчок на следующем тике устанавливает скорость 0,0.4,0, заменяя и горизонтальную скорость. Игроки могут подпрыгивать при входе в вертикальные границы цилиндра и выходе из них: весь ограничивающий параллелепипед игрока должен помещаться в его высоту. Обе цели действий фиксированы, поэтому область столкновения не следует за движущимся боссом, оставляя частицы позади.

Развернуть пример
eliteScript:
Bounce:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: CYLINDER
radius: 10
height: 2
Target:
targetType: SELF
track: false
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: EXPLOSION
repeatEvery: 10
times: 20
Target:
targetType: ZONE_FULL
track: false
coverage: 0.2
- action: PUSH
vValue: 0,0.4,0
Target:
targetType: ZONE_FULL
track: false
repeatEvery: 1
times: 200
Cooldowns:
local: 220
global: 80

Summon​

Скрипт фиксирует цилиндр радиусом 3 и высотой 1 на 6 блоков выше начальной позиции нанёсшего урон игрока и сразу показывает ему подзаголовок. track: false действия призыва фиксирует зону до ожидания в 40 тиков, поэтому движение во время предупреждения не перемещает область появления.

Через 40 тиков coverage: 0.2 независимо выбирает точки зоны для подкреплений. Это не гарантирует ни фиксированного количества, ни ровно одной пятой точек. Замените fc_boss.yml действительным именем установленного файла кастомного босса. Каждый успешно призванный босс получает время до побега в 400 тиков. Точки появления находятся в воздухе, безопасная поверхность не ищется; обычное удаление босса или встречи может убрать подкрепления раньше.

Развернуть пример
eliteScript:
Summon:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: CYLINDER
radius: 3
height: 1
Target:
targetType: DIRECT_TARGET
offset: 0,6,0
track: false
Actions:
- action: SUMMON_REINFORCEMENT
sValue: "fc_boss.yml"
duration: 400
Target:
targetType: ZONE_FULL
coverage: 0.2
track: false
wait: 40
- action: TITLE_MESSAGE
subtitle: "Friends! Help!!!"
duration: 30
fadeIn: 10
fadeOut: 10
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 333
global: 80

Potion Zones​

Урон от игрока запускает равновероятный случайный выбор между PotionZoneBad и PotionZoneGood через onlyRunOneScript: true.

Оба вспомогательных скрипта фиксируют цилиндр радиусом 5 и высотой 2 вокруг каждого игрока, выбранного поисковым параллелепипедом ближайших игроков с дальностью 20 у босса. Цилиндры остаются в исходных позициях; эффекты получают игроки, находящиеся внутри в момент выполнения, включая вошедших позже. Перекрывающиеся цилиндры образуют общую выборку, поэтому одно вспомогательное действие не накладывает эффект повторно на игрока только из-за пересечения нескольких цилиндров.

Вредный скрипт испускает облака четыре раза, затем на тике 40 запускает крупный дым и Иссушение IV. Последние действия выполняются шесть раз с интервалом 10 тиков до тика 90; каждое наложение иссушения длится 80 тиков. Полезный скрипт меняет частицы местами и применяет Мгновенное лечение II. Его duration: 80 не превращает мгновенный эффект в непрерывную регенерацию. coverage: 0.3 у частиц не уменьшает долю затронутых игроков. Оба скрипта отправляют сообщение ближайшим игрокам сразу, до отложенных эффектов.

Развернуть пример
eliteScript:
Trigger:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: RUN_SCRIPT
scripts:
- "PotionZoneBad"
- "PotionZoneGood"
onlyRunOneScript: true
Cooldowns:
local: 110
global: 80
PotionZoneBad:
Zone:
shape: CYLINDER
height: 2
radius: 5
Target:
targetType: NEARBY_PLAYERS
range: 20
track: false
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
coverage: 0.3
track: false
repeatEvery: 10
times: 4
- action: SPAWN_PARTICLE
particles:
- particle: LARGE_SMOKE
Target:
targetType: ZONE_FULL
coverage: 0.3
track: false
wait: 40
repeatEvery: 10
times: 6
- action: POTION_EFFECT
potionEffectType: WITHER
amplifier: 3
duration: 80
Target:
targetType: ZONE_FULL
track: false
wait: 40
repeatEvery: 10
times: 6
- action: MESSAGE
sValue: "&cCool boss!: &fFeel the burn!"
Target:
targetType: NEARBY_PLAYERS
range: 20
PotionZoneGood:
Zone:
shape: CYLINDER
height: 2
radius: 5
Target:
targetType: NEARBY_PLAYERS
range: 20
track: false
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: LARGE_SMOKE
Target:
targetType: ZONE_FULL
coverage: 0.3
track: false
repeatEvery: 10
times: 4
- action: SPAWN_PARTICLE
particles:
- particle: CLOUD
Target:
targetType: ZONE_FULL
coverage: 0.3
track: false
wait: 40
repeatEvery: 10
times: 6
- action: POTION_EFFECT
potionEffectType: INSTANT_HEALTH
amplifier: 1
duration: 80
Target:
targetType: ZONE_FULL
track: false
wait: 40
repeatEvery: 10
times: 6
- action: MESSAGE
sValue: "&cCool boss!: &fFeel the... Wait, this is the wrong one."
Target:
targetType: NEARBY_PLAYERS
range: 20

Blind Waves​

Скрипт фиксирует два горизонтальных отрезка луча у позиции босса. Каждый идёт от Z +5 до Z -5, затем за 100 тиков сдвигается вдоль мировой оси X к +10 или -10. Эти смещения относятся к осям мира, а не к направлению взгляда босса.

Две конечные точки по Z определяют длину отрезка в 10 блоков, а каждая пара конечных координат X — направление движения. При изменении перемещающегося луча сохраняйте и FinalTarget, и FinalTarget2.

Нулевые смещения Y располагают отрезки на начальной высоте ног босса. Изменение высоты обоих концов перемещает луч вертикально, но не придаёт ему высоту прямоугольной стены. По умолчанию pointRadius равен 0.5; столкновение проверяет сферы в выбранных точках против ограничивающих параллелепипедов игроков. Поэтому возможность перепрыгнуть зависит от рельефа и полного хитбокса игрока. ignoresSolidBlocks: true позволяет волнам проходить через твёрдые блоки.

Уменьшение animationDuration ускоряет движение; измените и times действий, если эффекты должны закончиться вместе с укороченной анимацией. Последний кадр анимации точно достигает конечных целей, и эта итоговая геометрия остаётся доступной до конца действия.

Дым запускается каждые 5 тиков, всего 20 раз, а слепота проверяется каждый тик, всего 100 раз. Каждый контакт накладывает 100 тиков слепоты, поэтому продолжающийся контакт обновляет эффект, а не запускает единственное фиксированное окно в пять секунд. Анимированные зоны движутся и при track: false на уровне действия, а каждое действие кеширует свои анимированные формы в момент запуска независимо от настройки track. Отдельные действия частиц и зелий владеют собственными захваченными анимированными формами.

Развернуть пример
eliteScript:
Blind:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: TRANSLATING_RAY
Target:
targetType: SELF
offset: 0,0,5
track: false
FinalTarget:
targetType: SELF
offset: 10,0,5
track: false
Target2:
targetType: SELF
offset: 0,0,-5
track: false
FinalTarget2:
targetType: SELF
offset: 10,0,-5
track: false
animationDuration: 100
ignoresSolidBlocks: true
Actions:
- action: RUN_SCRIPT
scripts:
- "Blind2"
- action: SPAWN_PARTICLE
particles:
- particle: SMOKE
Target:
targetType: ZONE_FULL
track: false
coverage: 1.0
repeatEvery: 5
times: 20
- action: POTION_EFFECT
potionEffectType: BLINDNESS
amplifier: 5
duration: 100
Target:
targetType: ZONE_FULL
track: true
repeatEvery: 1
times: 100
Cooldowns:
local: 200
global: 80
Blind2:
Zone:
shape: TRANSLATING_RAY
Target:
targetType: SELF
offset: 0,0,5
track: false
FinalTarget:
targetType: SELF
offset: -10,0,5
track: false
Target2:
targetType: SELF
offset: 0,0,-5
track: false
FinalTarget2:
targetType: SELF
offset: -10,0,-5
track: false
animationDuration: 100
ignoresSolidBlocks: true
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: SMOKE
Target:
targetType: ZONE_FULL
track: false
coverage: 1.0
repeatEvery: 5
times: 20
- action: POTION_EFFECT
potionEffectType: BLINDNESS
amplifier: 5
duration: 100
Target:
targetType: ZONE_FULL
track: true
repeatEvery: 1
times: 100

Freeze Wall​

Скрипт располагает три вращающихся луча на начальной высоте ног босса и на 1 и 2 блока выше. У луча есть pointRadius, а не прямоугольная высота, поэтому скрипты объединяют несколько отрезков в эффект стены.

Каждый отрезок имеет длину 6 блоков и выполняет положительный поворот по yaw на 360 градусов за 200 тиков. Его начальное направление — мировое +X, оно не зависит от взгляда босса. Зафиксированный центр вращения не следует за боссом. Полная линия существует с момента создания формы, ещё до первого шага вращения. Твёрдые блоки не останавливают эти лучи.

Каждый скрипт испускает частицы 20 раз с интервалом 10 тиков и проверяет контакт с игроками каждый тик, всего 200 раз. Каждый контакт добавляет 100 тиков замерзания. Контакт с перекрывающимися лучами может добавить несколько порций за один тик. Оттаивание и урон от замерзания контролирует Minecraft, поэтому это не фиксированный визуальный эффект на пять секунд и не блокировка движения. Действия зелий и замерзания также соблюдают политику эффектов инстансов EliteMobs.

Развернуть пример
eliteScript:
Trigger:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: RUN_SCRIPT
scripts:
- "FreezeWall"
- "FreezeWall2"
- "FreezeWall3"
Cooldowns:
local: 300
global: 80
FreezeWall:
Zone:
shape: ROTATING_RAY
Target:
targetType: SELF
track: false
Target2:
targetType: SELF
offset: 6,0,0
track: false
yawRotation: 360
animationDuration: 200
ignoresSolidBlocks: true
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: SNOWFLAKE
repeatEvery: 10
times: 20
Target:
targetType: ZONE_FULL
track: false
coverage: 1.0
- action: VISUAL_FREEZE
amount: 100
Target:
targetType: ZONE_FULL
track: false
repeatEvery: 1
times: 200
FreezeWall2:
Zone:
shape: ROTATING_RAY
Target:
targetType: SELF
track: false
offset: 0,1,0
Target2:
targetType: SELF
track: false
offset: 6,1,0
yawRotation: 360
animationDuration: 200
ignoresSolidBlocks: true
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: SNOWFLAKE
repeatEvery: 10
times: 20
Target:
targetType: ZONE_FULL
track: false
coverage: 1.0
- action: VISUAL_FREEZE
amount: 100
Target:
targetType: ZONE_FULL
track: false
repeatEvery: 1
times: 200
FreezeWall3:
Zone:
shape: ROTATING_RAY
Target:
targetType: SELF
track: false
offset: 0,2,0
Target2:
targetType: SELF
track: false
offset: 6,2,0
yawRotation: 360
animationDuration: 200
ignoresSolidBlocks: true
Actions:
- action: SPAWN_PARTICLE
particles:
- particle: SNOWFLAKE
repeatEvery: 10
times: 20
Target:
targetType: ZONE_FULL
track: false
coverage: 1.0
- action: VISUAL_FREEZE
amount: 100
Target:
targetType: ZONE_FULL
track: false
repeatEvery: 1
times: 200