拡張パック(追加パック)の編集の仕方
識別子・ファイル名・UUID・名乗るスクリプトまで、
ぶつからないように付け替えた一式ができます。
■ 名乗るスクリプト
BP/scripts/main.js に、これだけ書いてあります。
import { system } from “@minecraft/server”;
const PAYLOAD = {
pack: “春咲製作所”,
models: [
{ role: “signal”,
id: “harusaki:signal_visual”,
name: “春咲製作所 車両用”,
desc: “1990年代の分離型”,
icon: “textures/ui/harusaki_signal” },
],
};
for (const t of [20, 100, 300]) {
system.runTimeout(() => {
try { system.sendScriptEvent(“aoiro:register”, JSON.stringify(PAYLOAD)); } catch {}
}, t);
}
本体より先に動いても届くように、少し間を空けて3回送っています。
■ 一覧に出す名前の付け方
pack は、パックの名前です。32字まで。あなたの名前をそのまま出します。
name は、カードに大きく出る名前です。32字まで。
碧臨製作所の標準モデルは「碧臨製作所 車両用」のように、
作った所と種類を並べて書いています。同じ形にすると一覧で揃います。
desc は、名前の下に小さく出る説明です。64字まで。
省くと、パックの名前が代わりに出ます。
icon は、一覧に出す絵です。2の冪の大きさ(256かける256など)の
UI テクスチャを指します。省くと絵なしで並びます。
id は、名前空間と名前をコロンでつないだ形だけを受け付けます。
aoiro で始まる id は、乗っ取り防止のため無視されます。
role に書けるのは、signal、ped、spole、pole、arm、plate、sign、pbox の8つです。
何度名乗っても構いません。同じ id は上書きされます。
1回の scriptevent に載せられる文字数には限りがあるので、
モデルが多いときは2回3回に分けて送ってください。
ワールドに入ったとき、チャットに
「拡張パック〇〇のモデル〇件を読み込みました」と出れば、名乗りは届いています。
■ ファイル名と識別子を、必ず全部変える
ここがいちばん多い失敗です。
第1部と違い、拡張パックでは本体を上書きしてはいけません。
中の識別子だけ変えても、ファイル名が RP/entity/signal_visual.entity.json
のままだと、本体の同じ名前のファイルが消えたのと同じになります。
結果、あなたのモデルは出るのに本体の信号機が描けなくなる、という
いちばん厄介な壊れ方をします。しかも自分のワールドでは気づきにくい。
ファイル名にも名前空間を付けてください。
エンティティ定義、ジオメトリ、レンダーコントローラ、アニメーション、
テクスチャ、すべてです。
中の識別子も同じ理由で全部別名にします。
geometry で始まるもの、controller.render で始まるもの、
animation で始まるものの3種類です。
1つでも本体と同じ名前が残っていると、そこだけ本体を上書きしてしまいます。
素材のパックは、この付け替えを済ませた状態で渡しています。
■ 見た目エンティティに持たせるもの
信号機・歩行者用・標示板・地名表は、ブロックは本体のままで、
見た目のエンティティだけが入れ替わります。
ビヘイビアパックのエンティティ定義に、本体と同じ名前のプロパティを
持たせてください。名前が1つでも欠けると、その項目だけ反映されません。
車両用が持つのは、モデルの形を選ぶ aoiro:model(0が横型、1が横型と矢印、
2が縦型)、灯火の色の aoiro:light(0が消灯、1が青、2が黄、3が赤)、
持っている矢印の aoiro:arrows(1が左、2が直進、4が右のビット和)、
矢印の箱を付けるかの aoiro:arrowon、いま光っている矢印の aoiro:arrowlit、
腕の長さの aoiro:arm、向きの aoiro:yaw です。
歩行者用は、残り時間バー・スピーカー・板・押ボタンの表示ぶんだけ多くなります。
本体の BP/entities/ped_visual.json に合わせてください。
すべてのプロパティに client_sync を true で付けてください。
これが無いと、サーバー側で値を変えても画面に反映されません。
minecraft:physics は、重力なし・当たり判定なしにしてください。
入れ忘れると、ブロックの当たり判定に押し出されて、
置いた位置からじわじわずれていきます。
素材のパックは、本体の定義を写して名前の頭だけ付け替えたものなので、
プロパティも物理も本体とまったく同じに揃っています。
■ ブロックに持たせるもの
柱・腕金・押ボタン箱は、ブロックごと置き換わります。
本体と同じブロック状態を持たせてください。
持っていない状態があっても、本体は「向きだけ」「何も指定しない」の順に
置き換えを試すので落ちませんが、段や延長は引き継げなくなります。
腕金に要るのは、段の aoiro:level(0から2)、留め具の aoiro:clamp、
左右の伸ばし棒の aoiro:extp と aoiro:extm、それから向きです。
信号柱に要るのは、天板の aoiro:top と根元の aoiro:base です。
腕金は、上側の桁の中心高さを本体と同じにすると、
支持ワイヤーが桁にぴったり付きます。段ごとに10.0、17.0、23.5ピクセルです。
ずらすと見た目が少しずれます。
天板と根元は、柱のモデルの中に入れてください。
本体の柱は、1つのモデルに shaft、base、cap の3本のボーンを持たせ、
ブロック状態で出し隠ししています。
この2つの状態さえ持たせておけば、本体が自動で切り替えます。
積み上げたときに天板が上だけに付くのも、これでやっています。
耐久値も合わせておくことをおすすめします。
本体のブロックは、採掘に50秒、爆破耐性1200と、黒曜石なみに硬くしてあります。
サバイバルで壊されないためです。
拡張パックの柱だけ柔らかいと、そこだけ壊されます。
■ 本体が面倒を見てくれること
拡張パックのブロックでも、本体は次を自動でやります。
電線と支持ワイヤーの接続先として扱うこと。柱として認識します。
腕金の先端の割り出しと、延長棒の自動更新。
信号機や制御盤の「柱に向ける」の相手として扱うこと。
腕金をタップしたときの、段と延長の直し。
第3部 ARD(描画距離突破)を自分のモデルにも入れる
統合版はエンティティを、およそ64から73ブロックで描くのをやめます。
判定はエンティティ本体の位置で行われるので、
モデルの visible_bounds(見えているとみなす箱)をいくら大きくしても
越えられません。
本体はこれを ARD(描画距離突破)で越えています。
プレイヤーのすぐそばに透明な身代わり(虚像)を湧かせ、
モデルだけを本物の位置まで運んで描く方式です。

この仕組みは、いまのところ本体のモデル専用です。
拡張パックのモデルは対象外で、64ブロックほどで消えます。
虚像はモデルごとに一式(包んだジオメトリ、ワールドアニメ、表示の門、
ビヘイビアパックのエンティティ)が必要で、それを本体側で用意しているためです。
本体の信号機を遠くまで出すために、拡張パックの側ですることはありません。
やることがあるのは、自分のモデルも遠くまで出したいときだけです。
■ 必要なもの5つ
1つめは、虚像のビヘイビアパックのエンティティ。
透明な身代わりです。重力なし・当たり判定なし・押されない置物にします。
client_sync のプロパティとして、本物の座標との差(tx、ty、tz)、
プレイヤーの座標との差(px、pz)、同期が始まるまで隠しておく合図(active)
を持たせます。
ここで float は、JSON に必ず小数点を書いてください。64ではなく64.0です。
間違えるとプロパティが全部読み込まれず、虚像が永遠に透明のままになります。
原因が分かりにくい、いちばんの落とし穴です。
2つめは、包んだジオメトリ。
元のモデルを複製して、いちばん上に移動用と回転用のボーンを2つ足します。
元のボーンとキューブは一切いじらず、
親のないボーンに移動用ボーンを親として付けるだけです。
移動と回転は必ず別のボーンに分けてください。
同じボーンでやると、回した状態で動かしたときにモデルが崩れます。
visible_bounds は、動かす距離のぶん大きく取ります。
虚像はプレイヤーのそばにいますが、モデルは遠くへ行くので、
箱が小さいと画面の外と判定されて消えます。本体では400かける400です。
3つめは、ワールドアニメーション。
プロパティを読んで、移動用ボーンを動かします。
ボーンの position の単位は16分の1ブロックなので、値を16倍します。
そしてZだけ符号を反転します。XとYはそのままです。Y回転もそのままです。
4つめは、表示の門(レンダーコントローラ)。
本物とプレイヤーの水平距離が切り替え距離より遠いときだけ描くようにします。
近いうちは本物、遠いときは虚像、と自動で入れ替わります。
出し隠しを部品ごとに書いているモデルでは、
アスタリスクに条件を書くだけでは足りません。すべての行に門を掛けてください。
アスタリスクは、あとの行に負けます。
本体では、灯火1つずつの条件に門を AND で掛けています。
5つめは、追従スクリプト。
プレイヤーごとに、近くの対象を探して虚像を1体ずつ付けます。
毎回、本物との差をプロパティに書き込みます。
押さえるところは3つです。
値が変わったときだけ書くこと。毎回書くと重くなります。
プレイヤーが離れたら係留し直すこと。順番は必ず、
新しく出してから、古いのを消す。逆にすると一瞬消えて見えます。
そして、動かないもの(信号機など)は、係留し直したときだけ位置を書けば十分です。
毎ティック書く必要があるのは、動き続けるものだけです。
■ 状態も遠くで再現するには
いちばん簡単なのは、本物と同じ名前の client_sync プロパティを虚像にも
持たせて、スクリプトで写すことです。
リソースパック側のアニメやレンダーコントローラは、
書き換えずにそのまま動きます。
この投稿が役に立ったら「いいね」や「フォロー」をお願いします!





