1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【マインクラフト(統合版)】Websocketサーバーを使って「いなずまの弓」を作ってみました

Last updated at Posted at 2024-07-11

はじめに

以下のように矢を放った方向へ稲妻を落とせます。
いなずまの弓

👇空を見上げるアングルではこんなイメージ

矢を放ったタイミングで稲妻を落とすので、近距離/遠距離の同時攻撃が可能なチート装備です。
自分がダメージを受けないギリギリのところへ落とすようにしているのでサバイバルモードでも安心です。

地上だけではなく以下の場所でも使える事を確認しています。

  • 水中
  • 洞窟
  • ネザー
  • エンド

何故か雲がないのにネザーやエンドでも使えるようです。

操作に慣れてくれば矢で牽制しながら稲妻を落とせるので帯電クリーパーやピグリンも量産し放題でしょう。

山の中で連発しすぎると大火事になりますのでご注意を。

動作環境

プラットフォーム
Windows10
マインクラフト(統合版)
Windows Edition v1.21.2
socket-manager
v1.13.3
言語
PHP v8.2.4(v8.1.0以降)

導入方法

動作環境は以下のコマンドでインストール(ダウンロード)できます。

> composer create-project socket-manager/contents-project <インストール先のディレクトリ名>

インストール後のディレクトリ構成は以下のようになっています。

/app
    /client             Webブラウザ用クライアント
        /jquery         jQuery版
        /react          React版
    /packs              マインクラフト適用データ
        /behavior_packs ビヘイビアパック
        /resource_packs リソースパック
    /InitClass          初期化クラス
    /UnitParameter      UNITパラメータクラス
    /ProtocolUnits      プロトコルUNIT定義クラス
    /CommandUnits       コマンドUNIT定義クラス
    /MainClass          メイン処理クラス
/logs                   ログ出力用
/setting                設定ファイル用

専用コンテンツを有効にするためapp/packsディレクトリにビヘイビアパック/リソースパックなどのアドオンパックを同梱しています。

このディレクトリの中身をそのまま統合版ゲームデータのディレクトリにコピーしてお使いください。

アドオンパックの適用方法については以下のページでご紹介しています。

「いなずまの弓」を取得

上記のアドオンパックを適用しておけば、以下の方法でユニークアイテムとして「いなずまの弓」が手に入ります。

ショップで購入する場合

以下のショップで購入できます。

コマンドで取得する場合

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。

Websocketサーバーへの接続

例えばマインクラフト用のWebsocketサーバーを起ち上げる場合にはプロジェクトルートで以下のようにコマンドを実行すれば起動します。

> php worker app:minecraft-chat-server [<ポート番号>]

マインクラフトはUWPアプリのためlocalhost(127.0.0.1)で利用する場合は以下のコマンドを実行してループバックアドレスへのアクセスを許可しておく必要があります(一度設定しておけば以降はそのまま使用できます)。

> CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.MinecraftUWP_8wekyb3d8bbwe"

マインクラフトからWebsocketサーバーへ接続する時はチャット画面で以下のように入力します。

入力書式
> /wsserver localhost:<ポート番号>/<ユーザー名>

上記のユーザー名はマインクラフト内のユーザー名でなくても構いません。
あくまでWebsocketサーバー内で使用する名前です。

接続が完了すれば画面左上に上記のようなメッセージが表示されます。
接続後は「いなずまの弓」を含めた各種コンテンツが使えるようになります。

この環境は以下のページでご紹介したデモ環境を引き継いでいますのでWebブラウザとのチャット機能もそのまま使えます。

app/clientディレクトリにはデモ環境と同じくjQuery版とReact版のHTMLファイル(chat.html)が入っていますのでお好きな方をブラウザにドラッグ&ドロップしてお使いください。

サーバーサイドの実装

今回の主要な実装ポイントは以下3点です。

setting/minecraft.php
return [
    'subscribe_types' =>
    [
        'ItemUsed'
    ]
];

サブスクライブイベントは上記の設定ファイルへ登録します(複数登録可)。
サブスクライブイベントの処理内容については以下の記事をご覧ください。

このサブスクライブイベントを登録しておく事で、弓を使ったイベントを検知してマインクラフトがWebsocketサーバーへイベントデータを送信してくれます。


app/InitClass/InitForMinecraft.php
public function getCommandDispatcher()
{
    return function(ParameterForMinecraft $p_param, $p_dat): ?string
    {
        $minecraft = $p_param->isMinecraft();
        if($minecraft === true)
        {
            
            
            
            if(isset($p_dat['data']['header']['eventName']) && $p_dat['data']['header']['eventName'] === 'ItemUsed')
            {
                if($p_dat['data']['body']['item']['id'] === 'bow')
                {
                    return CommandQueueEnumForMinecraft::ITEM_USED->value;
                }
            }
            
            
            
        }
    }
}

受信したイベントデータをコマンド名へ変換する処理を上記のコマンドディスパッチャーへ追加します。

ここではbowというアイテム名を検知しています。


app/CommandUnits/CommandForMinecraft.php
protected function getItemUsedStart()
{
    return function(ParameterForMinecraft $p_param): ?string
    {
        $p_param->logWriter('debug', ['MINECRAFT ITEM_USED:START' => 'START']);

        if($rcv['data']['body']['item']['aux'] !== 401)
        {
            return null;
        }

        // 受信データの取得
        $rcv = $p_param->getRecvData();
        $x = (float)$rcv['data']['body']['player']['position']['x'];
        $y = (float)$rcv['data']['body']['player']['position']['y'];
        $x = (float)$rcv['data']['body']['player']['position']['z'];
        $y_rot = (float)$rcv['data']['body']['player']['yRot'];
        $y_rot_abs = abs($y_rot);

        // Z座標の計算
        $z = cos(deg2rad($y_rot_abs)) * 5;

        // X座標の計算
        $x = sin(deg2rad($y_rot_abs)) * 5;
        if($y_rot > 0)
        {
            $x = -$x;
        }

        // コマンド送信
        $cmd_data = $p_param->getCommandDataForSummonThunder($x, 0, $z, $rcv['data']['body']['item']['id']);
        $data =
        [
            'data' => $cmd_data
        ];
        $p_param->setSendStack($data);

        return null;
    };
}

コマンド名に紐づけた処理(関数)を上記のファイルへ実装します。

処理の冒頭でauxの数字を判定していますが、このauxがないと全ての弓アイテム使用時に発動してしまいます。「いなずまの弓」のauxデータ値(401)はビヘイビアパックで定義しています。ここでは受信した座標データと三角関数を使って稲妻を落とす座標を計算した後、マインクラフトへsummonコマンドを送信しています。

おわりに

このページではsocket-managerフレームワークを使う上でのお決まりの書き方は省略しています。
実装内容の詳細は他のコンテンツも含めて以下のページでご紹介していますのでご興味のある方はご覧ください。

以下のページでご紹介している「いなずまの矢」や「はかいの矢」とコンボで使用する事も可能です。


Websocketサーバー上でイベントが取得できるようになっただけでもかなり負担が減らせるので助かります。 座標計算等の処理もサーバーサイドのスクリプトで自由に組める事と、WebブラウザをUIとして使えるメリットも大きいと思います。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?