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

Относительные векторы 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
Пример
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

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

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

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

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

Относительное смещение 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, чтобы гарантировать, что луч рисуется от центра босса к центру игрока, а не от их ног.

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