Введение
Эти примеры объединяют действия EliteScript для создания способностей кастомных боссов. Их YAML можно редактировать напрямую или через веб-приложение.
Видео — старые демонстрации задуманных эффектов, а не проверка текущей реализации. Перед использованием прочитайте описание поведения и ограничений каждого примера.
Вставьте блок eliteScript в файл кастомного босса. Замените ссылки на контент, например fc_boss.yml, установленным определением босса. У примера Arrow Rain ниже есть описанное ограничение точки запуска снарядов: сейчас он не создаёт заявленный дождь из стрел сверху.
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