-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathextra-minecraft.html
More file actions
386 lines (308 loc) · 22.1 KB
/
extra-minecraft.html
File metadata and controls
386 lines (308 loc) · 22.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>マインクラフトの通信仕様 | SOCKET-MANAGER Framework For PHP</title>
<meta name="description" content="マインクラフト統合版とPHPのWebSocket通信の仕様を詳細解説。サブスクライブデータ、コマンドデータ、イベント処理など、実装に必要な技術情報を豊富なコード例と共に紹介。" />
<meta content="PHP,ソケット通信,websocket,マインクラフト,チャット,ソケットマネージャー" name="keywords">
<link rel="canonical" href="https://socket-manager.github.io/document/extra-minecraft.html" />
<script async src="https://www.googletagmanager.com/gtag/js?id=G-LF9W695NNW"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-LF9W695NNW');
</script>
<link rel="icon" href="https://socket-manager.github.io/document/favicon.ico" type="image/x-icon" />
<link type="text/css" rel="stylesheet" href="./css/common.css" media="all" />
<script src="./js/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="./js/common.js"></script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": "SOCKET-MANAGER Framework - マインクラフトの通信仕様",
"description": "マインクラフト統合版とPHPのWebSocket通信の仕様を詳細解説。サブスクライブデータ、コマンドデータ、イベント処理など、実装に必要な技術情報を豊富なコード例と共に紹介。",
"keywords": "マインクラフト, 統合版, WebSocket, PHP, ソケットマネージャー",
"articleSection": ["Technical Documentation", "Server Development", "PHP Programming"],
"image": "https://socket-manager.github.io/document/img/extra-minecraft/file.png",
"author": {
"@type": "Person",
"name": "SOCKET-MANAGER開発チーム"
},
"publisher": {
"@type": "Organization",
"name": "SOCKET-MANAGER",
"logo": {
"@type": "ImageObject",
"url": "https://socket-manager.github.io/document/logo.png",
"width": 355,
"height": 50
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://socket-manager.github.io/document/extra-minecraft.html"
},
"url": "https://socket-manager.github.io/document/extra-minecraft.html",
"breadcrumb": {
"@type": "BreadcrumbList",
"itemListElement": [{
"@type": "ListItem",
"position": 1,
"name": "Framework Top",
"item": "https://socket-manager.github.io/document/"
},{
"@type": "ListItem",
"position": 2,
"name": "マインクラフトの通信仕様",
"item": "https://socket-manager.github.io/document/extra-minecraft.html"
}]
},
"isPartOf": {
"@type": "WebSite",
"name": "フレームワークのご紹介",
"url": "https://socket-manager.github.io/document/"
}
}
</script>
</head>
<body>
<div class="layout">
<div class="menu" role="navigation" aria-label="ページメニュー">
<h2 class="menu-title">SOCKET-MANAGER</h2>
<h4 class="menu-reference menu-page-title-bottom"><a href="./reference/" target="_blank">>> Reference</a></h4>
<h2 class="menu-label">MAIN-MENU</h2>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./">▶フレームワークのご紹介</a></h3>
<h3 class="menu-page-title-link"><a href="./event-handler.html">▶イベントハンドラについて</a></h3>
</div>
<h3 class="menu-label-sub">IMPLEMENT</h3>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./init-class.html">▶初期化クラス</a></h3>
<h3 class="menu-page-title-link"><a href="./unit-parameter.html">▶UNITパラメータクラス</a></h3>
<h3 class="menu-page-title-link"><a href="./protocol-unit.html">▶プロトコルUNITクラス</a></h3>
<h3 class="menu-page-title-link"><a href="./command-unit.html">▶コマンドUNITクラス</a></h3>
<h3 class="menu-page-title-link"><a href="./main.html">▶メイン処理クラス</a></h3>
<h3 class="menu-page-title-link"><a href="./setting.html">▶設定ファイル</a></h3>
<h3 class="menu-page-title-link"><a href="./message.html">▶メッセージファイル</a></h3>
</div>
<div class="menu-line"></div>
<div class="menu-text">
<h3 class="menu-page-title-link-for-runtime-manager"><a href="./runtime-manager/" target="_blank">>> ランタイムライブラリ</a></h3>
<h3 class="menu-page-title-link-for-runtime-manager"><a href="./simple-socket/" target="_blank">>> シンプルソケット機能</a></h3>
</div>
<h3 class="menu-label-sub">ADVANCED</h3>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./architecture.html">▶アーキテクチャ</a></h3>
<h3 class="menu-page-title-link"><a href="./event.html">▶イベント駆動アーキテクチャ</a></h3>
<h3 class="menu-page-title-link"><a href="./ipc.html">▶IPC(プロセス間通信)</a></h3>
<h3 class="menu-page-title-link"><a href="./multi-server.html">▶マルチサーバーの構成</a></h3>
<h3 class="menu-page-title-link"><a href="./tcp-and-udp.html">▶TCP/UDP通信について</a></h3>
<h3 class="menu-page-title-link"><a href="./laravel.html">▶Laravelと連携する</a></h3>
<h3 class="menu-page-title-link"><a href="./system-setting.html">▶システム設定ファイル</a></h3>
<h3 class="menu-page-title-link"><a href="./custom-command.html">▶カスタムコマンド作成機能</a></h3>
</div>
<h3 class="menu-label-sub">OTHER-PROJECT</h3>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./new-project.html">▶新規開発環境</a></h3>
<h3 class="menu-page-title-link"><a href="./websocket.html">▶Websocketサーバー開発環境</a></h3>
<h3 class="menu-page-title-link"><a href="./dev-ops.html">▶フレームワークのDevOps環境</a></h3>
</div>
<div class="menu-line"></div>
<div class="menu-text">
<h3 class="menu-page-title-link-for-minecraft"><a href="./minecraft-contents/" target="_blank">>> マインクラフト専用環境</a></h3>
<h3 class="menu-page-title-link-for-launcher"><a href="./launcher/" target="_blank">>> GUI & CLI ランチャー</a></h3>
<h3 class="menu-page-title-link-for-rest-api"><a href="./rest-api/" target="_blank">>> REST-APIサーバー開発環境</a></h3>
</div>
<h2 class="menu-label">EXTRA-MENU</h2>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./extra-demo.html">▶デモサーバーの種類</a></h3>
<h3 class="menu-page-title-link"><a href="./extra-demo-command.html">▶デモのコマンド仕様</a></h3>
<h3 class="menu-page-title-link"><a href="./extra-demo-setting.html">▶デモの設定ファイル</a></h3>
<h3 class="menu-page-title">▼マインクラフトの通信仕様</h3>
<ul>
<li><a href="./extra-minecraft.html#begin">はじめに</a></li>
</ul>
<ul>
<li><a href="./extra-minecraft.html#file">ファイル構成</a></li>
</ul>
<ul>
<li><a href="./extra-minecraft.html#send">マインクラフトへの送信データ</a></li>
</ul>
<ul>
<li><a href="./extra-minecraft.html#command-analysis">コマンド部の解釈</a></li>
</ul>
<ul>
<li><a href="./extra-minecraft.html#command-unique">マインクラフト用のコマンド</a></li>
</ul>
<ul>
<li><a href="./extra-minecraft.html#last">おわりに</a></li>
</ul>
<h3 class="menu-page-title-link"><a href="./extra-close-frame.html">▶切断フレームの検証</a></h3>
</div>
<h2 class="menu-label">PHP-TECHNIQUE</h2>
<div class="menu-text">
<h3 class="menu-page-title-link"><a href="./php-pass-by-reference.html">▶参照渡し</a></h3>
<h3 class="menu-page-title-link"><a href="./php-phpdoc.html">▶PHPDocのフォーマット</a></h3>
</div>
<div class="menu-dummy-for-framework"></div>
</div>
<div class="main" role="main">
<h1>【マインクラフトの通信仕様】</h1>
<a id="begin"></a>
<h2 class="subtitle">はじめに</h2>
<div class="text-block">
世に出回っているようなブロードキャストタイプのサーバー(いわゆるエコーサーバー)を利用するとサーバーやネットワークに負荷をかけるとともにマインクラフトのようなサブスクライブイベントを採用しているようなクライアント相手では無限ループになる可能性もあるので対応できません。その為今回はコマンドタイプのサーバーを採用しています。<br /><br />
<font><a href="./index.html" target="_blank">▶フレームワークのご紹介</a></font>のページで実行しているデモ環境は、Websocketサーバーの最小構成モデルとする目的で作った環境なのでチャット機能しか実装していませんが、マインクラフト専用のコンテンツを実装するための環境を<font><a href="./minecraft-contents/index.html" target="_blank">▶マインクラフトの環境</a></font>のページでご紹介していますので、今後の追加実装はそちらがメインになります。<br /><br />
Websocketサーバーを介す事で独自のゲーム内のイベントを取得できたり、サーバーサイドからコマンドを発行する事もできますので今後の追加実装の応用の幅が拡がります。<br />
このページでは、そのWebsocketサーバーと連携できる統合版マインクラフトの今後の拡張を見据えて特有の構造やメカニズムを押さえておくためにまとめています。
</div><br />
<a id="file"></a>
<h2 class="subtitle">ファイル構成</h2>
<div class="text-block">
マインクラフト専用コンテンツのプロジェクト環境(contents-project)はデモ環境(demo-project)を引き継いで構築しています。<br />
Websocketサーバーを使っている事には変わりはないので、基本的な構造はデモ版のWebsocketサーバーや<font><a href="./websocket.html" target="_blank">▶Websocket開発環境</a></font>のページでご紹介している内容とほぼ同じです。<br />
そのためサーバーサイドではWebsocketサーバーを構成するクラスファイルを継承して以下の構成で実装しています。<br />
<div class="img-block">
<a href="./img/extra-minecraft/file.png" target="_blank"><img class="img-zoomout" src="./img/extra-minecraft/file.png" fetchpriority="high" loading="eager" alt="マインクラフト用の継承クラス" /></a>
</div>
マインクラフト版のサーバーでは上記の色がついている部分のファイルを直接使ってマインクラフト独自の処理を実装しています。<br />
</div><br />
<a id="send"></a>
<h2 class="subtitle">マインクラフトへの送信データ</h2>
<div class="text-block">
送信データには2種類のJSONデータがあります。マインクラフト向けのJSONデータは少々複雑なため以下のようにUNITパラメータクラスでメソッド化しています。<br />
<pre color-change="php" aria-label="サブスクライブデータの生成">
/**
* マインクラフトへ送信するサブスクライブデータを取得
*
* @param string $p_eve サブスクライブするイベント名
* @return array 送信データ
*/
public function getSubscribeData(string $p_eve): array
{
// UUIDの取得
$uuidv4 = $this->getUuidv4();
// サブスクライブエントリデータ
$w_ret =
[
"header" =>
[
"version" => 1, // プロトコルのバージョンを指定。現時点では1で問題ない
"requestId" => $uuidv4, // UUIDv4を指定
"messageType" => "commandRequest", // "commandRequest" を指定
"messagePurpose" => "subscribe", // "subscribe" を指定
],
"body" =>
[
"eventName" => $p_eve // イベント名を指定。
]
];
return $w_ret;
}
</pre><br />
サブスクライブデータというのは、マインクラフト側で発生したイベントをWebsocketサーバー側へ配信してもらうための予約データのようなものです。<br />
<code>$p_eve</code>引数でイベントの種類を指定するのですが、例えばデモ環境では<code>PlayerMessage</code>のみ使用していますのでプレイヤーがメッセージを送信した時のみイベントデータが配信されます。<br /><br />
※デモ環境での使用は限定的ですが<font><a href="./minecraft-contents/index.html" target="_blank">▶マインクラフトの環境</a></font>のコンテンツページでは、実際に使用している受信イベントのデータ形式を掲載していますので、そちらも合わせてご覧ください。<br />
<pre color-change="php" aria-label="コマンドデータの生成">
/**
* マインクラフトへ送信するコマンドデータを取得
*
* @param string $p_cmd コマンド文字列
* @param string $p_typ 処理タイプ文字列('response'コマンドで利用)
* @return array 送信データ
*/
protected function getCommandData(string $p_cmd, string $p_typ = null): array
{
// UUIDの取得
$uuidv4 = $this->getUuidv4();
// サブスクライブエントリデータ
$w_ret =
[
"header" =>
[
"version" => 1,
"requestId" => $uuidv4, // UUIDv4を生成して指定
"messageType" => "commandRequest", // commandRequestを指定
"messagePurpose" => "commandRequest", // commandRequestを指定
],
"body" =>
[
"origin" =>
[
"type" => "player"
],
"version" => 1,
"commandLine" => $p_cmd, // マイクラで実行したいコマンドを指定
]
];
// 待ち受けるレスポンス情報を設定
$this->setAwaitResponse($uuidv4, $p_typ);
return $w_ret;
}
</pre><br />
こちらはマインクラフトのコマンドを実行するためのデータです。実際のコマンド文字列は<code>$p_cmd</code>引数で指定します。<br />
デモ環境では<code>title</code>コマンド(チャットメッセージ用)と<code>msg</code>コマンド(ウィスパー)のみ使用しています。
</div><br />
<a id="command-analysis"></a>
<h2 class="subtitle">コマンド部の解釈</h2>
<div class="text-block">
デモ環境の場合、前項のサブスクライブ登録によりマインクラフトから送信されるチャットデータはブラウザ側で解釈できるコマンドに変換する必要があります。<br />
<font><a href="./architecture.html" target="_blank">▶アーキテクチャ</a></font>ページの図を引用すると以下のコマンドディスパッチャーの部分でコマンド変換を行っています。<br />
<div class="img-block">
<a href="./img/architecture/recv_flow.png" target="_blank"><img class="img-zoomout" src="./img/architecture/recv_flow.png" loading="lazy" alt="受信データを解析してコマンドディスパッチャーが処理を振り分ける概念図" /></a>
</div>
変換を行っているコマンドの種類は以下の通り。<br />
<dl>
<dt>■マインクラフトからの通常のチャットデータ</dt>
<dd><code>message</code>コマンドへ変換</dd>
<dt>■マインクラフトからのプライベートチャットデータ</dt>
<dd><code><コメント>#<ユーザー名></code>の形式で送信されたデータを<code>private</code>コマンドへ変換</dd>
<dt>■マインクラフトからの退室要求</dt>
<dd><code>$exit</code>の文字列が送信されたデータを<code>exit</code>コマンドへ変換</dd>
</dl>
※コマンドの詳細については<font><a href="./extra-demo-command.html" target="_blank">▶デモのコマンド仕様</a></font>のページを参照。
</div><br />
<a id="command-unique"></a>
<h2 class="subtitle">マインクラフト用のコマンド</h2>
<div class="text-block">
デモ環境のコマンド部で実装しているマインクラフト特有のものは以下の2種類です。<br />
<dl>
<dt>■entrance-waiting</dt>
<dd>
マインクラフトからの再接続では動作が不安定な事もあり、openingハンドシェイク後にアライブチェックを行うようにしています。<br />
通信が不通の状態でアライブチェックを行うとマインクラフト側で強制切断されるので、この動作はフェイルセーフの役割を担っています。<br />
このアライブチェックの間の待機状態を作るのがこのコマンドです。
</dd>
<dt>■response</dt>
<dd>
マインクラフトへのコマンド送信後には必ずレスポンスが返ってきます。<br />
現状はエラー処理のレスポンス受信後に切断シーケンスを走らせるのが目的ですが、マインクラフトではコマンド送信時に必ずuuidを付与する事になっているので、このuuidでコマンドとレスポンスの紐づけを行っています。<br />
</dd>
</dl>
</div><br />
<a id="last"></a>
<h2 class="subtitle">おわりに</h2>
<div class="text-block">
現状のマインクラフトの切断処理については色々と問題があります。<br />
<code>entrance-waiting</code>コマンドはそれを賄うためのものですが<font><a href="./extra-close-frame.html#minecraft" target="_blank">▶切断フレームの検証⇒マインクラフトの場合</a></font>のページで詳しくまとめていますので一度ご覧ください。<br /><br />
また、マインクラフトからの接続の判定は当初<code>User-Agent</code>で行う予定でしたが、openingハンドシェイクには載っていない事が判明しましたので、現状は<code>User-Agent</code>の有り無しで判定するようにしています。<br /><br />
サブスクライブデータの登録は「デモ環境」「マインクラフトの環境」共に以下の設定ファイルで登録可能です。<br />
<pre color-change="php" aria-label="setting/minecraft.php">
return [
/**
* @var array 設定するサブスクライブタイプ(複数指定可)
*/
'subscribe_types' =>
[
'PlayerMessage'
]
];
</pre><br />
</div>
</div>
</div>
</body>
</html>