Zum Hauptinhalt springen

Relative Vektoren in Elite Script

Wofür sie gedacht sind​

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

Um einen Spieler zu einem bewegten Boss zu ziehen, berechnest du beispielsweise einen Vektor von der Spielerposition zur Bossposition. Ein fester Vektor kann ihren wechselnden Positionen nicht folgen.

Relative Vektoren können Projektile ausrichten, fallende Blöcke beschleunigen und Blickrichtungen festlegen. Als relative Versätze können sie eine Verstärkung hinter einem Spieler platzieren oder einen Strahl über sein Ziel hinaus verlängern.

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
  • SUMMON_REINFORCEMENT - Setzt die Geschwindigkeit der gespawnten Verstärkung
  • SPAWN_PARTICLE - Liefert den Bewegungsvektor innerhalb des jeweiligen Eintrags unter particles:; das Feld auf Aktionsebene wird dafür nicht verwendet
  • PUSH - Setzt die Stoßgeschwindigkeit
  • SPAWN_FALLING_BLOCK - Setzt die Geschwindigkeit des fallenden Blocks
  • SET_FACING - Setzt die Blickrichtung einer Entität

Andere Aktionen lesen einen gültigen RelativeVector:-Block, verwenden ihn aber nicht. Diese Schlüssel sind unabhängig von Groß-/Kleinschreibung; Partikeleinträge akzeptieren daher RelativeVector: und relativeVector:. Zieltypwerte behalten ihre dokumentierte Großschreibung.

Bei Geschwindigkeitsaktionen hat RelativeVector Vorrang vor vValue; beide werden nicht addiert. PUSH berechnet einen einzigen Vektor für alle ausgewählten Entitäten und wendet ihn einen Tick später an. SET_FACING berechnet ebenfalls eine einzige Richtung für alle ausgewählten Entitäten.

Zum Verändern von Zielpositionen gehört relativeOffset: in einen Zielblock wie Target, FinalTarget, Target2 oder FinalTarget2. Ein relativeOffset: auf Aktionsebene protokolliert Failed to read key relativeOffset .... Es wirkt nur, wenn die Aktion keinen Target-Block hat, weil das Standardziel SELF Zielschlüssel dann direkt aus der Aktion liest. Siehe den Abschnitt zu relativen Versätzen unten.

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 ausgeht✅none
DestinationTargetTarget am Endpunkt des Vektors✅none
normalizeLegt fest, ob der Vektor normalisiert werden soll❌false
multiplierMultipliziert die Länge des Vektors. Du kannst diesen Wert mit ~ randomisieren. Beispiel: 1.0~2.5.❌1.0
offsetFügt einen festen manuellen Versatz hinzu. Du kannst diesen Wert mit ~ randomisieren. Beispiel: 0~5,0~2,0~10.❌0,0,0

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). Dieses Beispiel wählt Werte von 1.0 bis ausschließlich 2.5.
  • 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.

Werte werden bei jeder Berechnung des Vektors neu gewählt. Zufällige Komponenten des Offsets folgen derselben Regel: ab min bis ausschließlich max.

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

Schleudert ein Huhn vom Boss zum angreifenden Spieler.


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 auf den angreifenden Spieler. Bei Projektilentitäten mit einem lebenden Boss verwendet SUMMON_ENTITY dessen Projektilabschuss. Das Projektil startet daher beim Boss, auch wenn das Target der Aktion eine andere Position angibt.


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

Spawnt einen Vanilla-Zombie zwei Blöcke hinter dem Spieler entlang der Linie vom Boss zum Spieler. Trotz des Skriptnamens ist dies keine EliteMobs-Verstärkung. relativeOffset gehört in Target: Es verändert die Spawnposition, nicht die Geschwindigkeit. Die Richtung verwendet die gesamte dreidimensionale Linie, nicht die Blickrichtung des Spielers. Dieser Versatz sucht weder Boden noch freie Kollisionsräume.


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

Erzeugt wiederholte Flammenstöße, die innerhalb einer Kugel um den Spawnort nach innen fliegen. Die Zone selbst schrumpft nicht.

Wie es funktioniert:

  • Die Zone liefert geometrische Punkte innerhalb einer Kugel mit sechs Blöcken Radius. filter: PLAYER beeinflusst die Entitätsauswahl, nicht die hier verwendeten Partikelpositionen.
  • coverage: 0.9 gibt jedem erzeugten Punkt etwa 90 % Auswahlwahrscheinlichkeit. Das track: false der Aktion speichert diese Auswahl für die Wiederholungen dieses Durchlaufs.
  • Der Vektor jedes Partikels zeigt von seiner Spawnposition (ACTION_TARGET) zu einem halben Block unter dem Boss-Spawnort (SELF_SPAWN mit offset: 0,-0.5,0).
  • Der Vektor wird beim Erzeugen des Partikels berechnet. ACTION_TARGET verwendet direkt die von der Aktion übergebene Position; sein verschachteltes track steuert bereits fliegende Partikel nicht nach.
  • Ein relativer Partikelvektor ersetzt x, y, z und setzt amount für gerichtete Emission auf null. speed wird weiterhin an Bukkit übergeben; die Partikelart bestimmt die entstehende Bewegung.
  • Die Aktion läuft fünfmal mit 38 Ticks Abstand, sofern ihre geplante Arbeit nicht abgebrochen wird. Jeder passende Treffer startet einen weiteren Durchlauf, da das Beispiel keinen Cooldown besitzt.

Reihenfolge der Operationen​

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

Vektorberechnung -> normalize -> multiplier -> offset

Technische Hinweise​

Vektornormalisierung: Bei einem Vektor mit Länge ungleich null bleibt die Richtung erhalten und die Länge wird vor Multiplikator und Versatz auf 1.0 gesetzt.

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.

Fehlende Ziele: Eine leere aufgelöste Quell- oder Zielmenge liefert vor Multiplikator und Versatz einen Nullvektor. Das gilt auch für einen DIRECT_TARGET-Endpunkt, wenn das Ereignis kein direktes Ziel hat. Ein fehlender SourceTarget- oder DestinationTarget-Block verursacht weiterhin einen Fehler.

Fallen gültige Quell- und Zielpositionen zusammen, hat der Vektor die Länge null. normalize: true lässt ihn bei null, sodass nur der eigene offset des relativen Vektors übrig bleibt. Löst ein Ziel mehrere Positionen auf, verwendet der relative Vektor die erste aufgelöste Position, ohne Garantie auf das nächste Ziel. Verwende DIRECT_TARGET, wenn die Richtung eindeutig sein muss.

ACTION_TARGET: Verwendet eine von der Aktion übergebene Position und umgeht deren verschachtelte Zielparameter offset, relativeOffset und track. Für Partikel ist dies die Partikelposition, für Entitäten und fallende Blöcke die angeforderte Spawnposition und für Verstärkungsgeschwindigkeit die Position der gespawnten Verstärkung. Bei PUSH und SET_FACING ist es die Bossposition, nicht die Position jeder ausgewählten Entität. Im relativeOffset eines Ziels ist es die zu versetzende Position, nach dem einfachen offset dieses Ziels.

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.

Wende relativeOffset auf Ziele wie SELF, SELF_SPAWN, DIRECT_TARGET, LOCATION oder LOCATIONS an, auch wenn es den Ursprung oder Endpunkt einer Zone festlegt. Bei ZONE_FULL / ZONE_BORDER verschiebt es jeden abgetasteten Zonenstandort. Auf LANDING_LOCATION und INHERIT_SCRIPT_TARGET wirkt es nicht. Siehe die Regeln für Zielversätze.

Relativer Versatz in Elite Script

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 DIRECT_TARGET, der vom Ereignis übergebene Spieler.

Angenommen, der Spieler ist acht Blöcke entfernt, beide Positionen liegen in derselben Welt und es gibt keine weiteren Versätze. Verwende SELF als SourceTarget und DIRECT_TARGET als DestinationTarget des relativen Versatzes und füge diesen relativeOffset zu Target2 hinzu. Die Beispiele beschreiben die Entfernung zum Endpunkt; die gezeichneten Strahlpunkte hängen zusätzlich von den Strahleinstellungen ab.

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 bei einem gültigen Vektor mit Länge ungleich null mit Länge 1.
  • Der Offset wird immer zum ursprünglichen Wert hinzugefügt.
  • Ein multiplier von null entfernt den berechneten Versatz nur, wenn er endlich ist. Der eigene offset des relativen Vektors wird weiterhin danach addiert; der gewöhnliche offset des Ziels bleibt separat. Entferne den Block, um den relativen Versatz zu deaktivieren.

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 ausgeht✅none
DestinationTargetTarget am Endpunkt des Vektors✅none
normalizeLegt fest, ob der Vektor normalisiert werden soll❌false
multiplierMultipliziert die Länge des Vektors. Du kannst diesen Wert mit ~ randomisieren. Beispiel: 1.0~2.5.❌1.0
offsetFügt nach normalize und multiplier einen festen Vektor hinzu. Du kannst diesen Wert mit ~ randomisieren. Beispiel: 0~5,0~2,0~10.❌0,0,0

relativeOffset und RelativeVector werden vom exakt selben Code geparst und akzeptieren daher dieselben fünf Schlüssel.

Beispiel
eliteScript:
MakeStaticRay:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: STATIC_RAY
Target:
targetType: SELF
offset: 0,1,0
Target2:
targetType: DIRECT_TARGET
offset: 0,1,0
relativeOffset:
sourceTarget:
targetType: SELF
destinationTarget:
targetType: DIRECT_TARGET
multiplier: 5
normalize: true
Actions:
- action: SPAWN_PARTICLE
Target:
targetType: ZONE_FULL
particles:
- particle: ELECTRIC_SPARK
amount: 1
repeatEvery: 1
times: 400

Der Endpunkt dieses Strahls liegt fünf Blöcke hinter dem Spieler entlang der Linie vom Boss zum Spieler. Die gewöhnlichen Versätze heben beide Endpunkte einen Block über die Füße; die Entitätsmitte wird nicht automatisch berechnet. STATIC_RAY bezeichnet die Form, keine eingefrorene Zielaufnahme: Mit dem Standard track: true berechnet die Aktion ihre Ziele bei Wiederholungen neu. Setze Target.track: false in der Aktion, um die erzeugten Strahlpositionen für eine feste Darstellung zwischenzuspeichern. Das Beispiel fordert 400 Durchläufe im Abstand von einem Tick an; jeder passende Treffer kann eine weitere Serie starten.

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.