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

Относительные Векторы Elite Script

Для чего они нужны

Относительные векторы — это векторы, привязанные к определённому, но динамическому местоположению.

Чтобы лучше объяснить, что это такое, рассмотрим следующий пример: вы хотите толкнуть игрока в направлении босса в рамках способности. Поскольку и босс, и игрок перемещаются во время боя, невозможно полагаться на конкретный вектор для достижения этого эффекта — вам понадобится вектор, который идёт от игрока к боссу. (Представьте короткую линию со стрелкой, идущую от игрока к боссу.)

Относительные векторы можно использовать множеством способов, перечислить которые невозможно, но среди них: запуск сущностей (таких как снаряды) в сторону определённого игрока или моба; спавн подкрепления позади игрока; запуск падающего блока в определённом направлении; создание лучей, направленных на игрока, и многое другое.

Контекст использования

Относительные векторы используются в контекстах действий с YAML-ключом RelativeVector:. Это включает такие действия, как:

  • SUMMON_ENTITY - Устанавливает скорость (направление движения и скорость) призванной сущности
  • SPAWN_PARTICLE - Устанавливает направление движения частиц
  • PUSH - Устанавливает скорость толчка
  • SPAWN_FALLING_BLOCK - Устанавливает скорость падающего блока
  • SET_FACING - Устанавливает направление, куда смотрит сущность

Для контекстов целей (изменение позиций целей) используйте вместо этого relativeOffset:. Подробности о том, как работает relativeOffset, см. в разделе Относительное Смещение Elite Script ниже.

Как работают векторы?

Если вы не знаете или не помните, что такое векторы и как они работают, можете думать о векторах как о стрелках, указывающих от одной точки к другой.

Таким образом, одним из свойств векторов является их длина. Эта длина важна; в случае стрел это скорость, с которой выстреливается стрела, в случае попытки получить смещённые точки от определённого местоположения — это расстояние от этой точки. Вещи, находящиеся дальше, будут иметь большую длину вектора, а ближние — меньшую.

Для некоторых механик вы, вероятно, не захотите полагаться на то, насколько далеко друг от друга находятся две точки, поскольку вам нужно просто получить направление. К счастью, вы можете использовать нормализацию вектора, которая гарантирует сохранение направления, но изменяет длину до 1.0. Затем вы можете использовать множители для лёгкого изменения вектора, пока не будете удовлетворены смещением, которое он обеспечивает, или скоростью, которую он даёт.

Свойства

ЗначениеПодробностиОбязательно?Значение по умолчанию
SourceTargetЦель в точке, откуда будет начинаться векторnone
DestinationTargetЦель в конечной точке вектораnone
normalizeОпределяет, должен ли вектор быть нормализованfalse
multiplierУмножает длину вектора. Вы можете рандомизировать это значение, используя ~. Пример: 1.0~2.5.1.0
offsetПозволяет вставить ручное фиксированное смещение к этому смещению. Вы можете рандомизировать это значение, используя ~. Пример: 0~5,0~2,0~10.none

Рандомизация

И multiplier, и offset поддерживают рандомизацию с помощью разделителя тильда (~):

  • Для multiplier: Используйте формат min~max (например, 1.0~2.5). Каждый раз при выполнении скрипта будет выбрано случайное значение между 1.0 и 2.5 (включительно).
  • Для offset: Используйте формат x1~x2,y1~y2,z1~z2 (например, 0~5,0~2,0~10). Каждый компонент (X, Y, Z) рандомизируется независимо.

Значения рандомизации пересчитываются каждый раз при вычислении вектора, обеспечивая динамичные и разнообразные эффекты.

Пример
eliteScript:
ShootChicken:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SUMMON_ENTITY
sValue: CHICKEN
Target:
targetType: SELF
RelativeVector:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 2.0

Запускает курицу


eliteScript:
ShootArrow:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SUMMON_ENTITY
sValue: ARROW
Target:
targetType: SELF
RelativeVector:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 2.0

Запускает стрелу


eliteScript:
SpawnReinforcement:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SUMMON_ENTITY
sValue: ZOMBIE
Target:
targetType: SELF
relativeOffset:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 2.0

Спавнит зомби на 2 блока позади игрока относительно босса.


eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
Shape: SPHERE
target:
targetType: SELF_SPAWN
offset: 0,0,0
track: false
filter: PLAYER
radius: 6
Actions:
- action: SPAWN_PARTICLE
repeatEvery: 38
times: 5
Target:
targetType: ZONE_FULL
track: false
coverage: 0.9
particles:
- particle: FLAME
RelativeVector:
SourceTarget:
targetType: ACTION_TARGET
track: true
DestinationTarget:
targetType: SELF_SPAWN
offset: 0,-0.5,0
speed: 0.05

Создаёт анимированную огненную сферу, которая сжимается к точке спавна.

Как это работает:

  • Зона нацеливается на всех игроков в пределах 6-блочной сферы вокруг точки спавна босса.
  • Частицы появляются в случайных точках по всей сфере (coverage: 0.9 означает, что используется 90% точек).
  • Каждая частица движется от точки своего появления (ACTION_TARGET с track: true) к точке спавна босса (SELF_SPAWN).
  • track: true на SourceTarget означает, что частица постоянно обновляет своё направление по мере движения.
  • Это создаёт эффект движения внутрь, заставляя сферу казаться схлопывающейся к центру.
  • Эффект повторяется 5 раз (times: 5) с интервалом в 38 тиков между каждой итерацией (repeatEvery: 38).

Порядок операций

Порядок применения свойств следующий:

Вычисление вектора -> normalize -> multiplier -> offset

Технические Заметки

Нормализация Вектора: Нормализация сохраняет направление вектора, но устанавливает его длину ровно в 1.0. Это полезно, когда вам нужно единообразное поведение независимо от расстояния.

Отрицательные Множители: Множитель может быть отрицательным для разворота направления вектора. Например, множитель -1.0 будет указывать в противоположном направлении.

Координаты Смещения: Смещение применяется в мировых координатах, а не относительно направления вектора. Оно добавляется после всех остальных вычислений.

Валидация Мира: Исходная и конечная цели должны находиться в одном мире. Если они находятся в разных мирах, возвращается нулевой вектор (0, 0, 0), что может привести к сбою действий или неожиданному поведению.

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

Контекст Скорости против Позиции: В контекстах действий, таких как SUMMON_ENTITY, RelativeVector устанавливает скорость (движение) сущности. В контекстах целей relativeOffset устанавливает смещение позиции (корректировку местоположения). Используется одна и та же базовая система, но интерпретация отличается в зависимости от контекста.

#

Относительное Смещение Elite Script

Для чего они нужны?

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

Как работают Относительные Смещения?

Относительные смещения аддитивны, то есть то, во что разрешится смещение, будет добавлено к базовому значению (например, к местоположению или вектору).

Разберём пример:

У вас есть зона луча:

  • Цель 1 это SELF (босс).
  • Цель 2 это NEARBY_PLAYERS с радиусом 10.

Если игрок находится на расстоянии 8 блоков, луч будет длиной 8 блоков, заканчиваясь на игроке.

Теперь применим относительное смещение:

Случай 1: normalize = false, multiplier = 1

  • Исходное расстояние 8.
  • Значение смещения становится 8 × 1 = 8.
  • Финальная длина луча: 8 + 8 = 16.

Луч пройдёт через игрока и продолжится ещё на 8 блоков.

Случай 2: normalize = false, multiplier = 2

  • Значение смещения становится 8 × 2 = 16.
  • Финальная длина луча: 8 + 16 = 24.

Случай 3: normalize = true, multiplier = 1

  • Расстояние нормализовано до 1.
  • Значение смещения становится 1 × 1 = 1.
  • Финальная длина луча: 8 + 1 = 9.

Случай 4: normalize = true, multiplier = 2

  • Значение смещения становится 1 × 2 = 2.
  • Финальная длина луча: 8 + 2 = 10.

Резюме

  • normalize = false использует фактическое расстояние между целями.
  • normalize = true всегда начинается с базы 1, независимо от фактического расстояния.
  • Смещение всегда добавляется к исходному значению.
  • Когда multiplier установлен в 0 с normalize = true, смещение становится 0 (поскольку 1 × 0 = 0), и с normalize = false смещение также становится 0 (поскольку любое число, умноженное на 0, равно 0), эффективно отключая относительное смещение в обоих случаях.

Эта система позволяет легко расширять или сжимать расстояния динамически при построении более сложной логики навыков в скриптах EliteMobs.

Свойства

ЗначениеПодробностиОбязательно?Значение по умолчанию
SourceTargetЦель в точке, откуда будет начинаться векторnone
DestinationTargetЦель в конечной точке вектораnone
normalizeОпределяет, должен ли вектор быть нормализованfalse
multiplierУмножает длину вектора. Вы можете рандомизировать это значение, используя ~. Пример: 1.0~2.5.1.0
Пример
eliteScript:
MakeStaticRay:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: STATIC_RAY
Target:
targetType: SELF
offset: 0,1,0
Target2:
targetType: NEARBY_PLAYERS
range: 10
offset: 0,1,0
relativeOffset:
sourceTarget:
targetType: SELF
destinationTarget:
targetType: NEARBY_PLAYERS
range: 10
multiplier: 5
normalize: true
Actions:
- action: SPAWN_PARTICLE
Target:
targetType: ZONE_FULL
particles:
- particle: ELECTRIC_SPARK
amount: 1
repeatEvery: 1
times: 400

Это создаст статический луч между боссом и игроком с относительным смещением, которое продлевает луч на 5 блоков дальше игрока. Обратите внимание, что обычные смещения также применены к Target и Target2, чтобы луч рисовался от центра босса к центру игрока, а не от их ног.

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