Elite Script 相対ベクトル
用途
相対ベクトルは、特定の動的な位置に対して相対的なベクトルです。
たとえば、動くボスへプレイヤーを引き寄せるには、プレイヤーの位置からボスの位置へ向かうベクトルを計算します。固定ベクトルでは変化する位置を追えません。
相対ベクトルは、投射物の照準、落下ブロックの射出、エンティティの向きに使えます。相対オフセットとして使えば、プレイヤーの先に増援を配置したり、対象を越えてレイを延ばしたりできます。
使用コンテキスト
相対ベクトルは、YAMLキー RelativeVector: を使用するアクションコンテキストで使用されます。以下のようなアクションが含まれます:
SUMMON_ENTITY- スポーンされたエンティティの速度(移動方向とスピード)を設定SUMMON_REINFORCEMENT- スポーンした増援の速度を設定SPAWN_PARTICLE- 個々のparticles:エントリ内で移動ベクトルを指定。アクション直下の項目はこの用途には使われませんPUSH- プッシュ速度を設定SPAWN_FALLING_BLOCK- 落下ブロックの速度を設定SET_FACING- エンティティが向く方向を設定
他のアクションも有効な RelativeVector: ブロックを解析しますが、使用しません。これらのキーは大文字小文字を区別しないため、パーティクルでは RelativeVector: と relativeVector: の両方を使えます。ターゲットタイプの値は文書どおり大文字で指定します。
速度を設定するアクションでは RelativeVector が vValue より優先され、両者は加算されません。PUSH は選択した全エンティティに対して 1 つのベクトルを計算し、1 ティック後に適用します。SET_FACING も全対象に対して 1 つの方向を計算します。
ターゲット位置を調整する場合は、Target、FinalTarget、Target2、FinalTarget2 などのターゲットブロック内に relativeOffset: を置きます。アクション直下では Failed to read key relativeOffset ... が記録されます。効果があるのはアクションに Target ブロックがない場合だけで、その場合はデフォルトの SELF ターゲットがアクション自体からターゲット用キーを読み取るためです。下記の相対オフセットの説明を参照してください。
ベクトルの仕組み
ベクトルが何であるか、またはどのように機能するかを知らない、または覚えていない場合は、ベクトルをある点から別の点を指す矢印と考えることができます。
そのため、ベクトルのプロパティの1つは長さです。この長さは重要です。矢の場合、この長さは矢が射出される速度であり、特定の位置からオフセット点を取得しようとする場合は、その点からの距離です。遠くにあるものはより大きなベクトル長を持ち、近いものはより短い長さを持ちます。
一部のメカニクスでは、方向だけを取得したいため、2点間の距離に依存したくない場合があります。幸いなことに、ベクトルの正規化を使用できます。これにより、方向は保持されますが、長さが1.0に変更されることが保証されます。その後、乗数を使用してベクトルを簡単に変更し、提供するオフセットや与える速度に満足するまで調整できます。
プロパティ
| 値 | 詳細 | 必須? | デフォルト値 |
|---|---|---|---|
SourceTarget | ベクトルが始まる点でのターゲット | ✅ | none |
DestinationTarget | ベクトルの終点でのターゲット | ✅ | none |
normalize | ベクトルを正規化するかどうかを設定します | ❌ | false |
multiplier | ベクトルの長さを乗算します。~を使用してこの値をランダム化できます。例: 1.0~2.5。 | ❌ | 1.0 |
offset | 固定オフセットを加算します。~ でランダム化できます。例:0~5,0~2,0~10。 | ❌ | 0,0,0 |
ランダム化
multiplier と offset の両方で、チルダ(~)区切り文字を使用したランダム化がサポートされています:
- 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)は独立してランダム化されます。
値はベクトルを計算するたびに抽選されます。オフセットの各ランダム成分にも、min 以上 max 未満という同じ規則が適用されます。
例
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
攻撃したプレイヤーへ矢を射出します。ボスが生存している場合、投射物エンティティに対する SUMMON_ENTITY はボスの投射物発射機能を使います。そのため、アクションの Target が別の位置でも投射物はボスから発射されます。
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
ボスからプレイヤーへの直線上で、プレイヤーを 2 ブロック越えた位置に通常のゾンビをスポーンします。スクリプト名にかかわらず、EliteMobs の増援ではありません。relativeOffset は Target の内側に置き、速度ではなく出現位置を変えます。方向はプレイヤーの向きではなく三次元の直線を使い、地面や衝突を調べません。
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 ブロックの球体内の幾何学的な点を提供します。
filter: PLAYERはエンティティ選択に作用し、ここで使うパーティクル位置には作用しません。 coverage: 0.9は生成された各点を約 90% の確率で選びます。アクションのtrack: falseにより、この選択はその実行の繰り返しで再利用されます。- 各パーティクルのベクトルは、生成位置(
ACTION_TARGET)からボスのスポーン位置の半ブロック下(SELF_SPAWNとoffset: 0,-0.5,0)へ向かいます。 - ベクトルは各パーティクルの生成時に計算します。
ACTION_TARGETはアクションが渡した位置を直接使い、内部のtrack設定で飛行中のパーティクルを誘導することはありません。 - 相対パーティクルベクトルは
x、y、zを置き換え、方向付き放出のためamountをゼロにします。speedは引き続き Bukkit に渡され、実際の動きはパーティクルの種類によります。 - 予定された処理がキャンセルされなければ、38 ティック間隔で 5 回実行します。この例にはクールダウンがないため、条件を満たす攻撃ごとに別の実行が始まります。
演算の順序
プロパティを適用する際の演算の順序は次のとおりです:
ベクトル計算 -> normalize -> multiplier -> offset
技術的な注意事項
ベクトルの正規化:非ゼロベクトルの方向を維持し、乗数とオフセットの適用前に長さを 1.0 にします。
負の乗数: 乗数を負にすることで、ベクトルの方向を逆転させることができます。例えば、乗数 -1.0 は反対方向を指します。
オフセット座標: オフセットはベクトルの方向ではなく、ワールド座標で適用されます。他のすべての計算の後に追加されます。
ワールドの検証: ソースターゲットとデスティネーションターゲットは同じワールドにある必要があります。異なるワールドにある場合、ゼロベクトル(0, 0, 0)が返され、アクションが失敗したり予期しない動作をしたりする可能性があります。
対象の欠落:解決した始点または終点の集合が空なら、乗数とオフセットの適用前にゼロベクトルを返します。イベントに直接の対象がない場合の DIRECT_TARGET の端点もこれに含まれます。SourceTarget または DestinationTarget ブロックが欠けている場合は、引き続きエラーになります。
有効な始点と終点が同じ位置なら、ベクトルの長さはゼロになります。normalize: true でもゼロのままなので、相対ベクトル自身の offset だけが残ります。対象が複数の位置に解決される場合は最初の位置を使い、最も近い対象である保証はありません。方向を明確にするには DIRECT_TARGET などの単一対象を使ってください。
ACTION_TARGET:アクションが渡す位置を使い、内部のターゲット設定 offset、relativeOffset、track を無視します。パーティクルではその生成位置、エンティティと落下ブロックでは指定した出現位置、増援の速度では生成された増援の位置です。PUSH と SET_FACING では各選択エンティティではなくボスの位置です。ターゲットの relativeOffset 内では、そのターゲットの通常の offset を適用した後の、オフセット対象の位置です。
速度と位置のコンテキスト: SUMMON_ENTITY のようなアクションコンテキストでは、RelativeVector はエンティティの速度(移動)を設定します。ターゲットコンテキストでは、relativeOffset は位置オフセット(場所の調整)を設定します。同じ基盤システムが使用されますが、コンテキストによって解釈が異なります。
relativeOffset は SELF、SELF_SPAWN、DIRECT_TARGET、LOCATION、LOCATIONS などに適用し、ゾーンの始点や終点にも使えます。ZONE_FULL / ZONE_BORDER では、サンプリングされた各ゾーン位置をずらします。LANDING_LOCATION と INHERIT_SCRIPT_TARGET には効果がありません。対象オフセットのルールを参照してください。
Elite Script 相対オフセット
用途
相対オフセットは相対ベクトルと同様に機能しますが、オフセットに柔軟性を追加することを目的としています。スクリプト作成時に位置を動的に調整できるため、コンテキストに基づいてターゲット位置やエフェクトを微調整しやすくなります。
相対オフセットの仕組み
相対オフセットは加算的です。つまり、オフセットが解決される値は、基本値(位置やベクトルなど)に追加されます。
例を詳しく見てみましょう:
ray zone があるとします:
Target 1はSELF(ボス)です。Target 2はイベントが渡したプレイヤーを指すDIRECT_TARGETです。
プレイヤーが 8 ブロック先におり、両位置が同じワールド内で、他のオフセットはないとします。相対オフセットの SourceTarget を SELF、DestinationTarget を DIRECT_TARGET にし、その relativeOffset を Target2 に配置します。以下は終点までの距離の例です。描画されるレイの点はレイ設定にも左右されます。
それでは、相対オフセットを適用してみましょう:
ケース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が計算済み変位を消せるのは、その変位が有限の場合だけです。相対ベクトル自身のoffsetはその後も加算され、対象の通常のoffsetも別に残ります。相対オフセットを無効にするにはブロックを削除してください。
このシステムにより、EliteMobsスクリプティングでより複雑なスキルロジックを構築する際に、距離を動的に拡張または縮小することが簡単にできます。
プロパティ
| 値 | 詳細 | 必須? | デフォルト値 |
|---|---|---|---|
SourceTarget | ベクトルが始まる点でのターゲット | ✅ | none |
DestinationTarget | ベクトルの終点でのターゲット | ✅ | none |
normalize | ベクトルを正規化するかどうかを設定します | ❌ | false |
multiplier | ベクトルの長さを乗算します。~を使用してこの値をランダム化できます。例: 1.0~2.5。 | ❌ | 1.0 |
offset | normalize と multiplier の後で固定ベクトルを加算します。~ でランダム化できます。例:0~5,0~2,0~10。 | ❌ | 0,0,0 |
relativeOffset と RelativeVector は同じコードで解析され、同じ 5 つのキーを受け付けます。
例
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
レイの終点は、ボスからプレイヤーへの直線上でプレイヤーを 5 ブロック越えた位置になります。通常のオフセットは両端を足元から 1 ブロック上げるだけで、エンティティの中心を自動計算しません。STATIC_RAY は形状名であり、対象位置を固定する指定ではありません。既定の track: true では繰り返しごとに対象を再計算します。固定表示にするには、アクションの Target.track: false で生成したレイ位置をキャッシュしてください。この例は 1 ティック間隔で 400 回の実行を要求し、条件を満たす攻撃ごとに別の繰り返しを開始できます。
注意: この例ではゾーンで相対オフセットを使用していますが、相対オフセットはゾーンに限定されず、他のターゲットにも適用できることに注意してください。