4 ポイント 投稿者 GN⁺ 2024-03-04 | 1件のコメント | WhatsAppで共有

Bashで書かれたMinecraftサーバーについての考察

  • BashでMinecraftサーバーを書くことについての考察。
  • 以前に2009年のクラシックプロトコルで試みたが、Bashでのバイナリデータ解析に限界を感じた。
  • readxxdを使ってデータを読み、16進ダンプを出力する方法を考案した。
  • Bashはヌルバイトを無視し、検出する方法がないため、データが破損する可能性がある。

Bashでヌルバイトを読む

  • ddxxdを使って、ヌルバイトを含むバイナリデータを処理する方法を発見した。
  • この方法により、パターンマッチングやデータ抽出などを行える。
  • 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件のコメント

 
GN⁺ 2024-03-04
Hacker Newsの意見
  • スクリプト可能なMinecraftサーバーについての経験

    JavaとBedrock(ScraM)向けのスクリプト可能なMinecraftサーバーに関する作業経験が豊富なあるユーザーは、これを印象的だと評価している。文中で"duckduckgoing"という単語を使ったことに星を付けたいとも述べている。この議論には92件のコメントがある。

  • 負の指数への理解

    負の指数、つまり2^(-n)が1/(2^n)に等しいことに触れつつ、著者が自分の2^-1 = 0.5という例を思い出せず、awkに助けを求めたことに驚きを示している。ctypes.shライブラリを使っていれば、bashからlibm、poll()、select()などにアクセスできただろうとも提案している。

  • 真のハッカーサイトへの称賛

    これこそ本物のハッカーサイトだとして、非常に素晴らしいと称賛している。

  • bashへの愛着

    bashが好きで、vimやluaと同じくらい気に入っていると述べている。2MB未満の単一バイナリであり、多くの人が考えるよりはるかに高機能だと強調している。shellcheckと良い習慣を使えば、bashも読みやすく安全になりうるとも述べている。追加機能が必要な場合でも、FFIなどの複雑な方法を使わずにC/C++でユーティリティを足せるし、pip/npmなどを使って大量の不透明な依存関係を持ち込む必要もないと説明している。

  • bashプログラミングへの驚き

    bashプログラミングには詳しくないが、実際にはどれほど高機能なのかに驚きを示している。

  • カスタムサーバー作成への疑問

    商用ゲーム向けにカスタムサーバーを書くことが、いまでも一般的なのか気にしている。

  • Minecraftへの賛辞

    Minecraftを、Quake以降で最も偉大なゲームの1つだと評価している。

  • Minecraft実装への感嘆

    Minecraftがこのように実装されていることについて多くの記事を読んできたが、これは本当に驚くべきもので、おそらくこれまで読んだ中で最も優れた技術的説明の1つだと感嘆している。最高水準だと称賛している。