メインコンテンツまでスキップ

Elite Script 相対ベクトル

用途

相対ベクトルは、特定の動的な位置に対して相対的なベクトルです。

これを最もよく説明するために、次のケースを考えてみましょう: パワーの一部として、プレイヤーをボスに向かって押したいとします。ボスとプレイヤーは戦闘中に移動するため、特定のベクトルに依存してこの効果を実現することはできません。プレイヤーからボスに向かうベクトルが必要になります。(プレイヤーからボスに向かう矢印付きの短い線を想像してください。)

相対ベクトルは非常に多くの方法で使用できるため、すべてをリストアップすることは不可能ですが、その中には以下のようなものがあります: 特定のプレイヤーやモブに向けてエンティティ(発射物など)を射出する; プレイヤーの背後に援軍をスポーンする; 特定の方向に落下ブロックを射出する; プレイヤーに向けて光線を発射する、などです。

使用コンテキスト

相対ベクトルは、YAMLキー RelativeVector: を使用するアクションコンテキストで使用されます。以下のようなアクションが含まれます:

  • SUMMON_ENTITY - スポーンされたエンティティの速度(移動方向とスピード)を設定
  • SPAWN_PARTICLE - パーティクルの移動方向を設定
  • PUSH - プッシュ速度を設定
  • SPAWN_FALLING_BLOCK - 落下ブロックの速度を設定
  • SET_FACING - エンティティが向く方向を設定

ターゲットコンテキスト(ターゲット位置の修正)の場合は、代わりに relativeOffset: を使用してください。relativeOffset の動作の違いについては、以下の Elite Script 相対オフセット セクションを参照してください。

ベクトルの仕組み

ベクトルが何であるか、またはどのように機能するかを知らない、または覚えていない場合は、ベクトルをある点から別の点を指す矢印と考えることができます。

そのため、ベクトルのプロパティの1つは長さです。この長さは重要です。矢の場合、この長さは矢が射出される速度であり、特定の位置からオフセット点を取得しようとする場合は、その点からの距離です。遠くにあるものはより大きなベクトル長を持ち、近いものはより短い長さを持ちます。

一部のメカニクスでは、方向だけを取得したいため、2点間の距離に依存したくない場合があります。幸いなことに、ベクトルの正規化を使用できます。これにより、方向は保持されますが、長さが1.0に変更されることが保証されます。その後、乗数を使用してベクトルを簡単に変更し、提供するオフセットや与える速度に満足するまで調整できます。

プロパティ

詳細必須?デフォルト値
SourceTargetベクトルが始まる点でのターゲットnone
DestinationTargetベクトルの終点でのターゲットnone
normalizeベクトルを正規化するかどうかを設定しますfalse
multiplierベクトルの長さを乗算します。~を使用してこの値をランダム化できます。例: 1.0~2.51.0
offsetこのオフセットに手動の固定オフセットを挿入できます。~を使用してこの値をランダム化できます。例: 0~5,0~2,0~10none

ランダム化

multiplieroffset の両方で、チルダ(~)区切り文字を使用したランダム化がサポートされています:

  • 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%のポイントが使用されることを意味します)。
  • 各パーティクルはスポーンポイント(track: trueのACTION_TARGET)からボスのスポーン位置(SELF_SPAWN)に向かって移動します。
  • SourceTargetの track: true は、パーティクルが移動中に方向を継続的に更新することを意味します。
  • これにより内向きの動きの効果が生まれ、球体が中心に向かって崩壊するように見えます。
  • エフェクトは5回繰り返され(times: 5)、各反復の間に38ティックの間隔があります(repeatEvery: 38)。

演算の順序

プロパティを適用する際の演算の順序は次のとおりです:

ベクトル計算 -> normalize -> multiplier -> offset

技術的な注意事項

ベクトルの正規化: 正規化はベクトルの方向を保持しながら、長さを正確に1.0に設定します。距離に関係なく一貫した動作が必要な場合に便利です。

負の乗数: 乗数を負にすることで、ベクトルの方向を逆転させることができます。例えば、乗数 -1.0 は反対方向を指します。

オフセット座標: オフセットはベクトルの方向ではなく、ワールド座標で適用されます。他のすべての計算の後に追加されます。

ワールドの検証: ソースターゲットとデスティネーションターゲットは同じワールドにある必要があります。異なるワールドにある場合、ゼロベクトル(0, 0, 0)が返され、アクションが失敗したり予期しない動作をしたりする可能性があります。

ゼロベクトル: ターゲットが無効であるか異なるワールドにある場合、システムはゼロベクトルを返します。これにより、エンティティが速度なしでスポーンしたり、アクションが効果を持たなくなったりする可能性があります。

速度と位置のコンテキスト: SUMMON_ENTITY のようなアクションコンテキストでは、RelativeVector はエンティティの速度(移動)を設定します。ターゲットコンテキストでは、relativeOffset位置オフセット(場所の調整)を設定します。同じ基盤システムが使用されますが、コンテキストによって解釈が異なります。

Elite Script 相対オフセット

用途

相対オフセットは相対ベクトルと同様に機能しますが、オフセットに柔軟性を追加することを目的としています。スクリプト作成時に位置を動的に調整できるため、コンテキストに基づいてターゲット位置やエフェクトを微調整しやすくなります。

相対オフセットの仕組み

相対オフセットは加算的です。つまり、オフセットが解決される値は、基本値(位置やベクトルなど)に追加されます。

例を詳しく見てみましょう:

ray zone があるとします:

  • Target 1SELF(ボス)です。
  • Target 2 は範囲10の NEARBY_PLAYERS です。

プレイヤーが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から始まります。
  • オフセットは常に元の値に追加されます。
  • multiplier0 に設定され、normalize = true の場合、オフセットは 0 になり(1 × 0 = 0 のため)、normalize = false の場合もオフセットは 0 になります(任意の数に 0 を掛けると 0 になるため)。両方のケースで相対オフセットが事実上無効になります。

このシステムにより、EliteMobsスクリプティングでより複雑なスキルロジックを構築する際に、距離を動的に拡張または縮小することが簡単にできます。

プロパティ

詳細必須?デフォルト値
SourceTargetベクトルが始まる点でのターゲットnone
DestinationTargetベクトルの終点でのターゲットnone
normalizeベクトルを正規化するかどうかを設定しますfalse
multiplierベクトルの長さを乗算します。~を使用してこの値をランダム化できます。例: 1.0~2.51.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ブロック超えて光線が延長されます。通常のオフセットも TargetTarget2 に適用され、光線が足元からではなく、ボスの中心からプレイヤーの中心へ描画されるようにします。

注意: この例ではゾーンで相対オフセットを使用していますが、相対オフセットはゾーンに限定されず、他のターゲットにも適用できることに注意してください。