Bashで書かれたMinecraftサーバーについての考察
- BashでMinecraftサーバーを書くことについての考察。
- 以前に2009年のクラシックプロトコルで試みたが、Bashでのバイナリデータ解析に限界を感じた。
readとxxdを使ってデータを読み、16進ダンプを出力する方法を考案した。
- Bashはヌルバイトを無視し、検出する方法がないため、データが破損する可能性がある。
Bashでヌルバイトを読む
ddとxxdを使って、ヌルバイトを含むバイナリデータを処理する方法を発見した。
- この方法により、パターンマッチングやデータ抽出などを行える。
ncatを使ってMinecraftのデフォルトTCPポートで待ち受けし、接続が来るとメインシェルスクリプト(mc.sh)を実行する。
プロトコルは実のところあまり良くない
- Minecraftサーバーが機能するために最初に実装すべきものは、サーバー一覧ピングパケットである。
- VarIntやVarLongのようなデータ型の実装の難しさを説明している。
- LEB128エンコーディング方式を使ってVarInt/VarLongの数値を実装した。
- IEEE754浮動小数点数の実装に苦労し、
awkを使って解決した。
"Position"データ型
- Mojangが作ったPositionデータ型は、64ビットのLong値にX、Y、Z座標を格納する。
- このデータ型はBashでも簡単に実装できる。
Named Binary Tag
- NBTはMojangが作った、バイナリデータのためのJSONのような形式である。
- NBTパーサーの実装をほぼ完成させたが、プロジェクトディレクトリをtmpfsとして使っており、システムクラッシュによってコードを失った。
実際のサーバー作成
- 数学的な部分を超えて、実際にサーバーを作る面白い部分に到達する。
- クライアントがサーバーに参加するには、ハンドシェイク過程を完了し、いくつかのパケットを送る必要がある。
- Join GameパケットとChunkパケット内のデータ構造が最大の障害である。
"プラグイン"システム
- 単純なチャンクを超えてサーバーがより多くのことをできるようにするため、オーバーライド可能な関数である
フックと、サーバーがユーザーコードをロードできるオプションを作った。
- これにより、世界の見た目を変えることから、マウスを動かすとプレイヤーがチクタク音を出すことまで、さまざまな機能を実装できる。
Witchcraftの特異な点
- Bashには小数点数を扱う際の制限がある。
- マルチプレイヤーは完全には動作しない。
- Witchcraftはマルチスレッドサーバーだが、スレッド間通信のためにハックを使っている。
- データ交換速度が遅い。
- 最新のBusyBox(1.35.0)がインストールされている場合にのみ実行できる。
FAQ
- ブロックIDはどこから来るのか、「WitchCraft」という名前の由来などについての質問と回答。
リソース
- Witchcraftリポジトリ、wiki.vgのプロトコル文書などのリソースリンクを提供。
GN⁺の意見
- このプロジェクトは、Bashの限界を乗り越えようとする開発者の創造性と問題解決能力を示している。
- BashでMinecraftサーバーを実装するのは非常に非効率的かもしれないが、このような実験的アプローチは新しい解決策を見つける助けになる可能性がある。
- この技術を実際のゲームサーバーに適用することは推奨されないが、スクリプト言語の限界を理解し、それを乗り越える方法を学ぶうえで有用かもしれない。
- 類似の機能を提供する、より効率的なサーバー実装としては、JavaやC++で書かれたMinecraftサーバーがある。
- このプロジェクトは、Bashを使って複雑なネットワークプロトコルを扱う方法を理解するのに役立つ教育資料になり得る。
1件のコメント
Hacker Newsの意見
スクリプト可能なMinecraftサーバーについての経験
負の指数への理解
真のハッカーサイトへの称賛
bashへの愛着
bashプログラミングへの驚き
カスタムサーバー作成への疑問
Minecraftへの賛辞
Minecraft実装への感嘆