Относительные векторы 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, чтобы гарантировать, что луч рисуется от центра босса к центру игрока, а не от их ног.
Примечание: Несмотря на то, что этот пример использует относительное смещение в зоне, имейте в виду, что относительные смещения не ограничиваются зонами, их можно применять и к другим целям.