プレイヤーディスガイズ
FreeMinecraftModelsは、オンラインの任意のプレイヤーをロード済みモデルにディスガイズできます。ディスガイズはコマンド、公開DisguiseAPI、およびディスガイズされたプレイヤーの透明化とモデルレンダリングを処理するプレイヤーごとのPlayerDisguiseEntityによって駆動されます。
コマンド
| コマンド | 権限 | 備考 |
|---|---|---|
/fmm disguise <modelID> | freeminecraftmodels.disguise.self | 送信者をディスガイズします。プレイヤー専用 |
/fmm disguise <modelID> <player> | freeminecraftmodels.disguise.others | 指名されたプレイヤーをディスガイズします。コンソールから動作 |
/fmm undisguise | freeminecraftmodels.disguise.self | 送信者のディスガイズを解除します。プレイヤー専用 |
/fmm undisguise <player> | freeminecraftmodels.disguise.others | 指名されたプレイヤーのディスガイズを解除します。コンソールから動作 |
/fmm disguiselist | freeminecraftmodels.disguise.others | ディスガイズされているすべてのプレイヤーと、それぞれがディスガイズされているモデルをリストします |
freeminecraftmodels.*ワイルドカードは、OPデフォルトでadmin、deleteall、disguise.self、disguise.othersを付与します。また、個別に登録されているfreeminecraftmodels.bypassregionprotection権限も付与します。
挙動
- すでにディスガイズされているプレイヤーをディスガイズすると、以前のディスガイズがクリーンに置き換えられます — 最初にディスガイズ解除する必要はありません。
- ディスガイズされたプレイヤーは他のプレイヤーから不可視になり、モデルのみが見えます。ディスガイズされたプレイヤー自身は通常通り見えます。
- 透明状態はミルクバケツ、
/effect clear、ビーコンの効果クリア、死亡と再スポーン、および通常であれば効果を剥がすその他のインタラクションやプラグインを経ても持続します(DisguiseEffectListenerによって次のティックで再適用されます)。 - プレイヤーのヒットボックスは変わりません。Mobのターゲティング、衝突、PvPはすべて通常通り機能します。
- ディスガイズはサーバー再起動、
/fmm reload、またはプレイヤーのログアウトを生き延びません — メモリ内で追跡され、DisguiseListeners.onQuitハンドラがPlayerQuitEventでディスガイズを削除します。死亡とワールド変更ではプレイヤーのディスガイズは解除されません。 /fmm reload時、プラグインシャットダウンの一環としてすべてのアクティブなディスガイズが破棄されます。リロード後にプレイヤーを再ディスガイズする必要があります。
ディスガイズのアニメーション
ディスガイズは、通常のモデル付きエンティティのアニメーションステートマシンを使用しません。各ディスガイズは独自のコントローラーを持ち、毎ティックそのプレイヤーの状態を読み取って名前でアニメーションを選択します。
予約されたアニメーション名は5つあり、次の優先順位(上が最優先)で認識されます:
| 優先度 | アニメーション | 種類 | トリガー条件 |
|---|---|---|---|
| 1 | attack | 単発 | プレイヤーが腕を振ったとき |
| 2 | jump | 単発 | プレイヤーが上向きに動きながら地面を離れたとき |
| 3 | sneak | ループ | プレイヤーがスニークしているとき |
| 4 | walk | ループ | プレイヤーが前ティックから約0.01ブロックより多く移動したとき |
| 5 | idle | ループ | 他のいずれにも当てはまらないとき |
知っておくべき挙動:
-
考慮されるのは、モデルが実際に持っているアニメーションだけです。
sneakアニメーションのないモデルは、単にwalkまたはidleへフォールスルーします。 -
単発アニメーションは現在のループに割り込み、固定の**20ティック(1秒)**の間、より優先度の低いアニメーションを抑制します。アニメーションシステムは完了コールバックを公開していないため、これは実際の長さではなく想定される上限です。ループへきれいに復帰させたい場合は、
attackとjumpのアニメーションを1秒以内に収めてください。 -
ループは選択されたアニメーションが実際に変化したときにのみ再発行されるため、歩き続けている間に毎ティック再スタートすることはありません。
-
通常のモデル付きエンティティにおける(現状では機能しない)jumpステートとは異なり、
jumpはディスガイズでは実際に組み込まれています。アニメーションを参照してください。 -
idleアニメーションを持たないディスガイズモデルは、ディスガイズのたびに警告をログに出力します:Disguise model '<model>' has no 'idle' animation — disguised players using this model will freeze on the last animation frame whenever no other action is active.ディスガイズとして使う予定のモデルには、必ず
idleアニメーションを同梱してください。
Bedrockクライアント
ディスガイズは、FMMがカスタムモデルをレンダリングすることに依存しています。config.ymlのsendCustomModelsToBedrockClientsV2: trueがデフォルトで、Bedrockへのモデル送信は最初から有効化されています。これをfalseに設定した(または古いsendCustomModelsToBedrockClients: falseを引き継いだ)場合、Bedrockプレイヤーにはモデルも基底の不可視プレイヤーも見えません — 実質的に、ディスガイズされたプレイヤーが立っている場所には何も見えません。トグルが有効でも、モデルをレンダリングするにはBedrock互換のリソースパックパイプライン(Floodgate + Geyser + 変換済みリソースパック)が必要です。
DisguiseAPI
サードパーティプラグインはcom.magmaguy.freeminecraftmodels.api.DisguiseAPIを介してディスガイズをプログラム的に駆動できます。
import com.magmaguy.freeminecraftmodels.api.DisguiseAPI;
// ディスガイズ(モデルIDがロードされていない場合はfalseを返す)
boolean ok = DisguiseAPI.disguise(player, "dragon");
// ディスガイズ解除(ディスガイズが削除された場合はtrueを返す)
DisguiseAPI.undisguise(player);
// 問い合わせ
boolean isDisguised = DisguiseAPI.isDisguised(player);
String modelID = DisguiseAPI.getDisguiseModelID(player); // ディスガイズされていない場合はnull
// ディスガイズされたすべてのプレイヤーの変更不可なスナップショット
Collection<Player> all = DisguiseAPI.getDisguisedPlayers();
APIはパブリックでリファクタ安全なエントリポイントです。プラグインは内部のDisguiseManagerではなくDisguiseAPIを呼び出すべきです。
一般的なユースケース
- ロールプレイとRPGサーバー: シネマティックやクエストスクリプトのためにプレイヤーをボスモデルにディスガイズします。
- イベントホスティング: アナウンサーを巨大なカスタムモデルにディスガイズします。
- マウントと乗り物: クリエイティブな輸送セットアップのために
/fmm mountと/fmm disguiseを組み合わせます。 - EliteMobs統合: ボススクリプトは、一時的な変身効果のためにイベントをトリガーしたプレイヤーをディスガイズできます。
トラブルシューティング
/fmm disguise dragonを実行しても何も起こりません。
モデルIDはロード済みモデルと正確に一致する必要があります。/fmm adminまたはコマンドのタブ補完でモデル名を確認してください。他プレイヤーを対象とする形式では、モデルやプレイヤーを解決する前にfreeminecraftmodels.disguise.othersをチェックし、権限が不足していることを直接報告します。
/fmm reloadの後、ディスガイズが消えました。
予想された挙動です。すべてのディスガイズはリロード時に破棄されます。自動的にディスガイズを再適用する必要がある場合は、FmmReloadedEventをリッスンしてください。
Bedrockプレイヤーにディスガイズが見えません。 上記のBedrockクライアントを参照してください。
ディスガイズされたプレイヤーが他者に依然として見えています。 透明化はパケットレベルの効果として適用されます。別のプラグインが毎ティック透明化を強制的に削除している場合(一部のアンチチートプラグインはこれを行います)、FMMの再適用と競合する可能性があります。FMMをホワイトリストに登録するか、競合するチェックを無効にしてください。