Skip to content

UI表示と演出パケット (Forms, Toast, Title, Camera)

プロキシ(MITM)やカスタムサーバーにおいて、クライアントに任意のパケットを差し込んで送信(インジェクション)することで、画面へのGUIフォーム表示トースト通知タイトル・アクションバーボスバーカメラの揺れや演出などを自由に実行できます。


1. Toast(トースト通知)

実績解除やリソースパック読み込み時に画面右上に表示されるポップアップ通知です。

go
// packet.ToastRequest
_ = clientConn.WritePacket(&packet.ToastRequest{
    Title:   "§aプロキシ通知",
    Message: "§fテレポート機能を有効化しました",
})

2. Modal Form(GUIポップアップ画面)

Bedrock Edition 特有のダイアログ画面を表示する機能です。 3種類のフォーム(modal, form, custom_form)が存在し、すべて JSON データを packet.ModalFormRequest に渡すことで開きます。

A. Modal Form(2択ダイアログ)

「はい / いいえ」などの2つのボタンを持つ確認ダイアログです。

go
const myModalFormID = uint32(1001)

// フォームを開かせる
_ = clientConn.WritePacket(&packet.ModalFormRequest{
    FormID: myModalFormID,
    FormData: []byte(`{
        "type": "modal",
        "title": "確認",
        "content": "ホーム地点にテレポートしますか?",
        "button1": "テレポートする",
        "button2": "キャンセル"
    }`),
})

// レスポンスの受信処理 (ReadPacket 側)
if resp, ok := pk.(*packet.ModalFormResponse); ok && resp.FormID == myModalFormID {
    if data, ok := resp.ResponseData.Value(); ok {
        // "true" (button1) または "false" (button2)
        if string(data) == "true" {
            log.Println("ユーザーが承認しました")
        }
    }
}

B. Simple Form(ボタン選択リスト)

複数のボタンが並ぶメニュー画面です。画像アイコンも指定可能です。

go
const myMenuFormID = uint32(1002)

_ = clientConn.WritePacket(&packet.ModalFormRequest{
    FormID: myMenuFormID,
    FormData: []byte(`{
        "type": "form",
        "title": "メニュー",
        "content": "移動先を選択してください:",
        "buttons": [
            { "text": "ロビー" },
            { "text": "サバイバル" },
            { "text": "ミニゲーム" }
        ]
    }`),
})

// レスポンス処理
if resp, ok := pk.(*packet.ModalFormResponse); ok && resp.FormID == myMenuFormID {
    if data, ok := resp.ResponseData.Value(); ok {
        // 押されたボタンのインデックス ("0", "1", "2")
        log.Printf("選択ボタン番号: %s", string(data))
    }
}

C. Custom Form(入力フォーム)

テキストボックス、スライダー、ドロップダウン、トグルスイッチなどを自由に並べられる高機能フォームです。

go
const myCustomFormID = uint32(1003)

_ = clientConn.WritePacket(&packet.ModalFormRequest{
    FormID: myCustomFormID,
    FormData: []byte(`{
        "type": "custom_form",
        "title": "プレイヤー設定",
        "content": [
            { "type": "label", "text": "各種設定を行ってください" },
            { "type": "input", "text": "ニックネーム", "placeholder": "名前を入力" },
            { "type": "toggle", "text": "夜間暗視を有効化", "default": true },
            { "type": "slider", "text": "移動速度", "min": 1, "max": 10, "default": 2 }
        ]
    }`),
})

// レスポンス処理: JSON 配列 (例: [null, "Gopher", true, 2]) が返る

3. タイトル・サブタイトル・アクションバー (SetTitle)

画面中央に大きく表示されるタイトルや、ホットバーの上に小さく表示されるアクションバーテキストです。

go
// 1. タイトルの表示時間設定 (tick単位: 20 ticks = 1秒)
_ = clientConn.WritePacket(&packet.SetTitle{
    ActionType:      packet.TitleActionSetDurations,
    FadeInDuration:  10, // 0.5秒
    RemainDuration:  40, // 2秒
    FadeOutDuration: 10, // 0.5秒
})

// 2. メインタイトルの送信
_ = clientConn.WritePacket(&packet.SetTitle{
    ActionType: packet.TitleActionSetTitle,
    Text:       "§6§lVICTORY!",
})

// 3. サブタイトルの送信
_ = clientConn.WritePacket(&packet.SetTitle{
    ActionType: packet.TitleActionSetSubtitle,
    Text:       "§7ゲームに勝利しました",
})

// 4. アクションバー(ホットバー上)の表示
_ = clientConn.WritePacket(&packet.SetTitle{
    ActionType: packet.TitleActionSetActionBar,
    Text:       "§a現在の座標: X: 100, Y: 64, Z: -200",
})

4. 効果音の再生 (PlaySound)

任意のサウンドエフェクト(バニラの効果音やカスタム音)をクライアントで再生します。

go
_ = clientConn.WritePacket(&packet.PlaySound{
    SoundName: "random.levelup", // レベルアップ音
    Position:  clientConn.GameData().PlayerPosition,
    Volume:    1.0,
    Pitch:     1.0,
    LoopCount: -1,
})

5. ボスバーの表示 (BossEvent)

画面上部にドラゴンやウィザーのようなHPバー(タイトル・色・進捗度)を表示します。

go
_ = clientConn.WritePacket(&packet.BossEvent{
    BossEntityUniqueID: clientConn.GameData().EntityUniqueID, // プレイヤー自身をダミーボスに指定可能
    PlayerUniqueID:     clientConn.GameData().EntityUniqueID,
    EventType:          packet.BossEventShow,
    BossBarTitle:       "§c§lボスバトル進行中",
    HealthPercentage:   0.75, // 75%
    Colour:             packet.BossEventColourRed,
    Overlay:            packet.BossEventOverlayProgress,
})

6. カメラの揺れ演出 (CameraShake)

爆発や地震のようなカメラの画面揺れ(Positional / Rotational)を発生させます。

go
_ = clientConn.WritePacket(&packet.CameraShake{
    Intensity: 0.5, // 揺れの強さ (最大 4.0)
    Duration:  2.0, // 2秒間
    Type:      packet.CameraShakeTypePositional,
    Action:    packet.CameraShakeActionAdd,
})

7. サーバー転送 (Transfer)

クライアントを別の Bedrock サーバー(ロビーや別サーバー)へリダイレクト転送します。

go
_ = clientConn.WritePacket(&packet.Transfer{
    Address: "hub.example.com",
    Port:    19132,
})

Released under the MIT License.