Zum Hauptinhalt springen

Elite Script Relative Vectors

Wofür sie gedacht sind

Relative Vektoren sind Vektoren, die relativ zu einem bestimmten, aber dynamischen Standort sind.

Um am besten zu erklären, was das bedeutet, betrachten wir folgenden Fall: Du möchtest einen Spieler als Teil einer Power zum Boss hin stoßen. Da sich sowohl der Boss als auch der Spieler während des Kampfes bewegen, ist es nicht möglich, sich auf einen bestimmten Vektor zu verlassen, um diesen Effekt zu erzielen - du brauchst einen Vektor, der vom Spieler zum Boss zeigt. (Stell dir eine kurze Linie mit einem Pfeil vor, die vom Spieler zum Boss zeigt.)

Relative Vektoren können auf so viele Arten verwendet werden, dass es unmöglich wäre, sie alle aufzulisten, aber dazu gehören: Entitäten (wie Projektile) auf einen bestimmten Spieler oder Mob schießen; Verstärkungen hinter einem Spieler spawnen; einen fallenden Block in eine bestimmte Richtung schießen; Strahlen erstellen, die auf einen Spieler geschossen werden, und vieles mehr.

Verwendungskontext

Relative Vektoren werden in Aktionskontexten mit dem YAML-Schlüssel RelativeVector: verwendet. Dies umfasst Aktionen wie:

  • SUMMON_ENTITY - Setzt die Geschwindigkeit (Bewegungsrichtung und -geschwindigkeit) der gespawnten Entität
  • SPAWN_PARTICLE - Setzt die Bewegungsrichtung der Partikel
  • PUSH - Setzt die Stoßgeschwindigkeit
  • SPAWN_FALLING_BLOCK - Setzt die Geschwindigkeit des fallenden Blocks
  • SET_FACING - Setzt die Blickrichtung einer Entität

Für Zielkontexte (Modifizierung von Zielpositionen) verwende stattdessen relativeOffset:. Siehe den Abschnitt Elite Script Relative Offset weiter unten für Details dazu, wie relativeOffset anders funktioniert.

Wie Vektoren funktionieren

Wenn du nicht weißt oder dich nicht erinnerst, was Vektoren sind oder wie sie funktionieren, kannst du dir Vektoren als Pfeile vorstellen, die von einem Punkt zu einem anderen zeigen.

Eine der Eigenschaften von Vektoren ist daher ihre Länge. Diese Länge ist wichtig; bei Pfeilen ist diese Länge die Geschwindigkeit, mit der ein Pfeil geschossen wird, bei Versatzpunkten von einem bestimmten Standort ist es die Entfernung von diesem Punkt. Weiter entfernte Dinge haben größere Vektorlängen und nähere Dinge haben kürzere Längen.

Für einige Mechaniken möchtest du dich wahrscheinlich nicht darauf verlassen, wie weit zwei Punkte voneinander entfernt sind, da du nur eine Richtung brauchst. Glücklicherweise kannst du die Vektornormalisierung verwenden, die garantiert, dass die Richtung beibehalten wird, aber die Länge auf 1.0 ändert. Du kannst dann Multiplikatoren verwenden, um den Vektor einfach zu modifizieren, bis du mit dem Versatz oder der Geschwindigkeit zufrieden bist.

Eigenschaften

WertDetailsPflicht?Standardwert
SourceTargetTarget am Punkt, von dem der Vektor ausgehtnone
DestinationTargetTarget am Endpunkt des Vektorsnone
normalizeLegt fest, ob der Vektor normalisiert werden sollfalse
multiplierMultipliziert die Länge des Vektors. Du kannst diesen Wert mit ~ randomisieren. Beispiel: 1.0~2.5.1.0
offsetErmöglicht das Einfügen eines manuellen festen Versatzes. Du kannst diesen Wert mit ~ randomisieren. Beispiel: 0~5,0~2,0~10.none

Randomisierung

Sowohl multiplier als auch offset unterstützen Randomisierung mit dem Tilde-Trennzeichen (~):

  • Für multiplier: Verwende das Format min~max (z.B. 1.0~2.5). Bei jeder Skriptausführung wird ein zufälliger Wert zwischen 1.0 und 2.5 (inklusive) ausgewählt.
  • Für offset: Verwende das Format x1~x2,y1~y2,z1~z2 (z.B. 0~5,0~2,0~10). Jede Komponente (X, Y, Z) wird unabhängig randomisiert.

Randomisierungswerte werden bei jeder Vektorberechnung neu generiert, was dynamische und vielfältige Effekte ermöglicht.

Beispiel
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

Schießt ein Huhn


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

Schießt einen Pfeil


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

Spawnt einen Zombie 2 Blöcke hinter dem Spieler, relativ zum Boss.


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

Erstellt eine animierte Flammensphäre, die zum Spawnort schrumpft.

Wie es funktioniert:

  • Die Zone erfasst alle Spieler innerhalb einer 6-Block-Sphäre um den Boss-Spawnort.
  • Partikel spawnen an zufälligen Punkten in der Sphäre (coverage: 0.9 bedeutet, 90% der Punkte werden verwendet).
  • Jeder Partikel bewegt sich von seinem Spawnpunkt (ACTION_TARGET mit track: true) zum Boss-Spawnort (SELF_SPAWN).
  • track: true bei SourceTarget bedeutet, dass der Partikel seine Richtung während der Bewegung kontinuierlich aktualisiert.
  • Dies erzeugt einen Einwärts-Bewegungseffekt, sodass die Sphäre zum Zentrum hin zu kollabieren scheint.
  • Der Effekt wiederholt sich 5 Mal (times: 5) mit 38 Ticks zwischen jeder Iteration (repeatEvery: 38).

Reihenfolge der Operationen

Die Reihenfolge der Operationen beim Anwenden der Eigenschaften ist wie folgt:

Vektorberechnung -> normalize -> multiplier -> offset

Technische Hinweise

Vektornormalisierung: Die Normalisierung behält die Richtung des Vektors bei, setzt aber seine Länge auf genau 1.0. Dies ist nützlich, wenn du unabhängig von der Entfernung konsistentes Verhalten benötigst.

Negative Multiplikatoren: Der Multiplikator kann negativ sein, um die Richtung des Vektors umzukehren. Beispielsweise zeigt ein Multiplikator von -1.0 in die entgegengesetzte Richtung.

Versatz-Koordinaten: Der Versatz wird in Weltkoordinaten angewendet, nicht relativ zur Vektorrichtung. Er wird nach allen anderen Berechnungen hinzugefügt.

Welt-Validierung: Quell- und Ziel-Targets müssen sich in derselben Welt befinden. Wenn sie in verschiedenen Welten sind, wird ein Nullvektor (0, 0, 0) zurückgegeben, was dazu führen kann, dass Aktionen fehlschlagen oder sich unerwartet verhalten.

Null-Vektoren: Wenn Targets ungültig sind oder sich in verschiedenen Welten befinden, gibt das System einen Nullvektor zurück. Dies kann dazu führen, dass Entitäten ohne Geschwindigkeit spawnen oder Aktionen keine Wirkung haben.

Geschwindigkeit vs. Position-Kontext: In Aktionskontexten wie SUMMON_ENTITY setzt RelativeVector die Geschwindigkeit (Bewegung) der Entität. In Zielkontexten setzt relativeOffset einen Positionsversatz (Standortanpassung). Das gleiche zugrundeliegende System wird verwendet, aber die Interpretation unterscheidet sich je nach Kontext.

Elite Script Relative Offset

Wofür sind sie gedacht?

Relative Offsets funktionieren ähnlich wie relative Vektoren, mit dem Ziel, Offsets flexibler zu gestalten. Sie ermöglichen es dir, Positionen beim Scripting dynamisch anzupassen, was die Feinabstimmung von Zielpositionen oder Effekten basierend auf dem Kontext erleichtert.

Wie funktionieren Relative Offsets?

Relative Offsets sind additiv, was bedeutet, dass der aufgelöste Offset-Wert zum Basiswert (wie einem Standort oder Vektor) hinzugefügt wird.

Schauen wir uns ein Beispiel an:

Du hast eine ray zone:

  • Target 1 ist SELF (der Boss).
  • Target 2 ist NEARBY_PLAYERS mit einer Reichweite von 10.

Wenn ein Spieler 8 Blöcke entfernt gefunden wird, wird der Strahl 8 Blöcke lang sein und beim Spieler enden.

Nun wenden wir einen Relative Offset an:

Fall 1: normalize = false, multiplier = 1

  • Die ursprüngliche Entfernung ist 8.
  • Offset-Wert wird 8 × 1 = 8.
  • Endgültige Strahlenlänge: 8 + 8 = 16.

Der Strahl geht durch den Spieler hindurch und setzt sich für 8 weitere Blöcke fort.

Fall 2: normalize = false, multiplier = 2

  • Offset-Wert wird 8 × 2 = 16.
  • Endgültige Strahlenlänge: 8 + 16 = 24.

Fall 3: normalize = true, multiplier = 1

  • Die Entfernung wird auf 1 normalisiert.
  • Offset-Wert wird 1 × 1 = 1.
  • Endgültige Strahlenlänge: 8 + 1 = 9.

Fall 4: normalize = true, multiplier = 2

  • Offset-Wert wird 1 × 2 = 2.
  • Endgültige Strahlenlänge: 8 + 2 = 10.

Zusammenfassung

  • normalize = false verwendet die tatsächliche Entfernung zwischen den Targets.
  • normalize = true beginnt immer von einer Basis von 1, unabhängig von der tatsächlichen Entfernung.
  • Der Offset wird immer zum ursprünglichen Wert hinzugefügt.
  • Wenn multiplier auf 0 gesetzt ist, wird der Offset in beiden Fällen (normalize = true und normalize = false) zu 0, wodurch der Relative Offset effektiv deaktiviert wird.

Dieses System ermöglicht es dir, Entfernungen beim Aufbau komplexerer Skill-Logik im EliteMobs-Scripting einfach dynamisch zu erweitern oder zu verkürzen.

Eigenschaften

WertDetailsPflicht?Standardwert
SourceTargetTarget am Punkt, von dem der Vektor ausgehtnone
DestinationTargetTarget am Endpunkt des Vektorsnone
normalizeLegt fest, ob der Vektor normalisiert werden sollfalse
multiplierMultipliziert die Länge des Vektors. Du kannst diesen Wert mit ~ randomisieren. Beispiel: 1.0~2.5.1.0
Beispiel
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

Dies erstellt einen statischen Strahl zwischen dem Boss und dem Spieler, mit einem Relative Offset, der den Strahl um 5 Blöcke über den Spieler hinaus verlängert. Beachte, dass reguläre Offsets auch auf Target und Target2 angewendet werden, um sicherzustellen, dass der Strahl von der Mitte des Bosses zur Mitte des Spielers gezogen wird, anstatt von ihren Füßen.

Hinweis: Obwohl dieses Beispiel Relative Offset auf einer Zone verwendet, sind Relative Offsets nicht auf Zonen beschränkt - sie können auch auf andere Targets angewendet werden.