マインクラフト(統合版)のサーバーを立ててしばらく経った

きっかけ

マインクラフト(統合版)のサーバーを立てて3ヶ月半くらい経った。

もともと Splatoon 3 を一緒に遊んでいる人達が集まっている discord サーバーがあった。そろそろ Splatoon 3 の発売から 2 年が経とうかという 2024 年の夏、そこに集まっている人たちもなんとなく Splatoon 3 以外のこともしたいなぁという気持ちになってきていた。
もともと Splatoon 3 を遊ぶことを目的として集っている人たちではあったけど、 Splatoon 3 以外のゲームでもそこにいる人達と一緒に遊べるといいよね、という感じで、そこにいる面々で遊べるいい感じのゲームを模索するというのが続いていた。

そんなある日、ふとメンバーの1人がマインクラフトが遊びたいと言った。んだったと思う。
もともと Splatoon 3 を遊んでいる人たちが集まっている discord サーバーなので、Switch のマインクラフトを使って遊ぶ人もいると考えられるので統合版を一緒に遊ぶのが良いだろうということになった。
その際に問題になるのはみんなが一緒に遊ぶためのサーバーの用意である。

マインクラフト統合版のサーバーでメジャーどころというと、Minecraft Realms という公式のサーバがあるし、これを使うのが一般的なように思う。
これは 3人以上が一緒に遊ぶとなると、月額 7.99 ドルかかるし、10人以上は同時に接続できない。
Discord のサーバーの参加人数から言って、ピークで10人以上接続する可能性はあるし、接続できない人が出てくるとさみしいので上限人数に制限があるのはなんだか嫌だなぁと思った。
あと、大人にとって 7.99 ドルって大した額じゃないけど、毎月誰かにそれを負担してもらうのもなぁと思うし、みんなが遊ばなくなったときに、いつまで課金して維持し続けるかなど、ちょっと悩んでしまう所も多い。

なので、家の録画サーバーの性能が割と余裕があるので、そこでサーバーをホストすればいいのではないか、という気持ちになったのでやってみることにした。もともと、自分の子どもとその友達たちが一緒に遊ぶマインクラフトのサーバーがほしいと言っていたりとかして、やりたいなぁと思っていたいので。
その過程で、自前でマインクラフト統合版のサーバーを立てても、子どもやらが触ることが想定されている Switch 版では、自前で立てたものにつなぐことができないという制約があることを知っていた。
でも、色々調べてたら、この制約を回避する方法がある事がわかった。

というわけで、やってみることにした。

やったこと

大きく分けて以下のことをやった。

  1. マインクラフト統合版のサーバーを立てる
  2. Switch からの接続を可能にするための制約回避方法を用意する
  3. ログイン・ログアウト時に discord に書き込む bot を作る
  4. 自動バックアップの仕組みを作る
  5. マインクラフトにアップデートがあったら discord に書き込む機能を bot に追加する

以上の仕組みが、ここに書いてある録画サーバで動いている。

マインクラフト統合版のサーバーを立てる

この docker image が定期的にメンテナンスされているように見えたので、使うことにした。
https://hub.docker.com/r/itzg/minecraft-bedrock-server

docker image を動かすにあたっては、この docker image の元になっている github のレポジトリに、docker-compose.yml があるので、これをほぼそのまま使うことにした。

ただし、外向けのポート番号は変更してある。これは、後述の制約回避方法を使う仕組みを動かす際にポート番号が重複してしまい、重複回避方法側はポート番号を変更することが多分できないためである。

Switch からの接続を可能にするための制約回避方法を用意する

Switch 版等の家庭用 CS 機のマインクラフトでは、自前で立てた統合版サーバーにつなぐことができないという制約が一般にある。
この制約は、 BedrockConnect というサーバーに一旦接続することで回避する事ができる。
https://github.com/Pugmatt/BedrockConnect

BedrockConnect に接続するためには、Switch が参照する DNS サーバーを設定したり、通常のサーバーの接続方法とは異なる方法を使う必要がある。
これは若干面倒だし、公式のドキュメントは英語だしでハードルが高そうなので、接続するのに最低限必要な設定項目や手順をまとめた google document を作って共有した。

ここまではやろうと思い立ったその日のうちにできた。

ログイン・ログアウト時に discord に書き込む bot を作る

誰かがログインしてたら自分もログインして一緒に遊ぼう、みたいなことを思えるかなと思ったので、マインクラフトを起動しなくても、誰かがログインしているかを簡単に確認できるようにするため、ログイン・ログアウト時に discord に書き込む bot を作った。

マインクラフトのサーバーに対して、ログイン・ログアウトが行われると、サーバーの標準出力に、その旨が表示される。
その際に “list” というコマンドを標準入力から入力すると、ログインしているユーザーの一覧が表示される。
標準出力を監視しつつ、必要に応じて “list” コマンドを実行し、結果を整形して discord に書き込むことで簡単に作れた。
ちなみに、マインクラフトのサーバーは、 docker コンテナとして動いているため、このコンテナに attach することで、標準入力と標準出力は取得できる。
実装は、golang で書いた。docker に attach をするなら、docker 自体も golang で書かれているし、まぁ golang が楽だろうと思ったので。

自動バックアップの仕組みを作る

ログイン・ログアウト時に discord に書き込む bot を作る過程でユーザのログイン状況を把握できるようになった。
なので、全員がログアウトしたときに、一旦 docker container を停止して、バックアップを取る仕組みを作った。

バックアップの取得には、以前から docker container の volume のバックアップに使っている、下記 docker image を使った。
https://hub.docker.com/r/jareware/docker-volume-backup/tags

最初は、とりあえず全員がログアウトしたらすぐにバックアップを取ってたんだけど、マインクラフトのクライアントの調子が悪そう等の理由で、接続を切ってすぐにログインする場合がぼちぼちあって、そのたびにバックアップを取るのは無駄だなぁと思ったので、誰も接続していない状況が 10 分間続いたらバックアップを取るように変更した。

マインクラフトにアップデートがあったら discord に書き込む機能を bot に追加する

マインクラフトは定期的にアップデートされる。
運用していると、クライアントのアップデートにサーバーが追いつけなかったりとかして、接続できなくなることがぼちぼち起きたので、アップデートがあったら、 discord に書き込む仕組みを作った。
これは、自分がさっさとアップデート作業を開始するためでもある、全員にアップデートがあったということを知らせることで、繋がらなかったときに色々確認してもらうことを促すためでもある。

まとめ

そんなこんなで色々動かして、3ヶ月半くらいええ感じに動いていて、ほぼ毎日誰かがログインして遊んでいる。
ちなみに、自分はサーバーはホストしているものの、あまりマインクラフトという、こう、すごくコツコツとした作業が必要なゲーム自体には興味がイマイチ持てず、たまにログインしては友人たちが作った建物やら機械やらを眺めて、マインクラフトってすごいんだなぁと感心するばかりである。

かなりいろんなことが自動化できて、運用が楽な状態にはなったと思うので、みんなが飽きるまでのんびり運用していこうと思う。

自作レバーレスコントローラーの基板を GP2040 ベースに変えた

2年半前くらいに、自作のレバーレスコントローラーを作った。
そのときには、 pro micro を使って、この上で動くコードはライブラリを利用しつつも主要な部分は自分で書いていた。

2年半時間が経過して、レバーレスコントローラーの自作はかなり一般的になった。
また、Raspberry PI Pico が発売されて、これの上で動くコントローラー用のソフトウェア GP2040 が開発された。
GP2040 は開発体制が変わったのか、オープンソースで開発が続けるコミュニティ版がフォークして、今は、GP2040-CE という名前で開発が続いているように見えた。

自分としてもいつまでも pro micro で動くコードの面倒を見るのはたいへんなので、GP2040-CE に乗り換えることにした。

配線をどうするか

pro micro でレバーレスコントローラーを作っていた頃は、ユニバーサル基板を使って気合いでボタンを配線していた。
でもまぁ、なんかそれも面倒なので、今回は pro micro 用のターミナルブロックを使うことにした。

例えばこういうの。aliexpress で送料も含めて 1000 円以下で買える。

今回は面倒なので、amazon で似たようなものを買った。

GP2040で使うことを想定した PICO Fighting Boardってのもあるみたいで、これも高くはないのだけど、トータルの値段で言えば汎用のターミナルブロックを使うんでいいような気がする。

GP2040-CE への独自機能の移植

pro micro の頃に、ミスタードリラーやテトリスなどのパズルゲームを遊ぶときに、斜め入力が入るのを避けるため、方向キーについて、最後に押したものを優先して入力として扱うような機能を実装して、設定で切り替えられるようにしていた。

GP2040-CE に乗り換えるにあたり、この機能を移植したいと考えた。

GP2040-CE は、オープンソースである。
なので、ビルド環境さえ整えてしまえば独自の機能を追加できる。
しかも、ソースコードを眺めていたところ追加機能を作りやすいように、プラグイン用のインタフェースがコード内に用意されていることが確認できた。

なのでさっと作った。

この機能が欲しい人居るんだろうか。いればプルリクエスト送ってもてもいいのかもしれないけど、、

GP2040-CE は、2023年の頭くらいにいくつかの git submodule に分割された。
その影響で、変更が複数のレポジトリにまたがる形となって若干面倒ではあった。

あと、Build 手順のドキュメントが古く、2023年4月1日時点では、書いてある通りにビルドすることはできなかった。
けど、 issue に手順をアップデートする予定があることが記載されているので、そのうち改善されると思う。

人に自作 hitbox を作ってあげた。あと連射性能の計測をした。

1ヶ月に1回は更新したい本blogは、無事3ヶ月更新が空きました。
今年もよろしくおねがいします。

で、以前に自作 hitbox を作ったというエントリを書いたのですが、その後友人にほぼ同様のものを実費+おこづかいで作ってあげました。
少しミスもあったんですが、全体的に自分用のものを作ったときと比べて随分工作精度が上がった気がします。
ソフトウェアも使い回せるし、作れば作るほどうまくなっていって良さそうなのでは?という気持ちがあります。

ボタンの色がなんかスゴイですが、友人の希望によりこの色です。すでに友人の手元にこれは行ったのですが、気に入ってくれているようです。よかった。

で、最近、STEAM版の Mr.Driller アンコールのフレーム落ちの対策ができて、またやる気が高まってきたので、コントローラーの連射速度の調整をしました。

やはり以前のエントリで、コマンドの入力フレームを計測するために、Unityでソフトを書いたという内容を書いたのですが、これを改造して、秒間何回連射しているのか計測できるようにしました。

コントローラーの中には sparkfun pro micro を用いており、タイマー用のライブラリには MsTimer2 を使っています。
MsTimer2 でタイマを設定するインタフェース MsTimer2::set(unsigned long ms, void (*f)()) では、割り込み周期のミリ秒単位での指定と、タイマが切れた際に呼び出す関数の指定ができるようになっています。
ゲームでは60フレームが用いられることがありますが、 60フレームの際の 1フレームの時間は、おそよ16.6666ms であり、ボタンの on と off をそれぞれのフレームで交互に入力するためには、その2倍の 33.3333ms 周期でボタンの押し下げと離しを行う必要があります。しかし、MsTimer2::set(unsigned long ms, void (*f)())の時間は ms 単位であるため、正確に指定することはできず、やむなく 34ms としました。

34msごとにボタンを押すと、1秒あたりおよそ 29.41 回の連射になるのですが、これが正しく unity で書いたソフトから検出することができ、pro micro や OS のレベルで遅延が起こり、入力が抜けてしまうということはないということが確認できました。

これ以上速度をあげようと思うと、ライブラリを用いず、自力でタイマーを叩く必要が出てくるので、そのへんはおいおいやるかもしれないしこれで満足してやらないかもしれないです。
どうしようかなぁ。

レバーレスコントローラー(hitbox あるいはガフロコンって呼ばれるもの)を作った。格ゲーにおける優位性をちょっと測定した。

ふと、手元にあった、ピンの少ない Sparkfun Pro Micro 互換機で、ゲーム用のコントローラーを作ってみたらそれなりに作れたので、通常通りにピンが付いている Sparkfun Pro Micro を買ったり、ドリルを買ったりホールソーを買ったり、ボタンを買ったりしてレバーレスコントローラー自作してみました。


本 blog エントリではこの自作したレバーレスコントローラを自作レバーレスコントローラーと呼びます。また、製品として売られているレバーレスコントローラである HitBox を hitbox と呼びます。

普通、レバーレスコントローラーを作る場合には、あり物のコントローラーの基板を乗っ取ったり、あるいは Brook の UNIVERSAL FIGHTING BOARD を基板として使うのが定番のようです。Brook の UNIVERSAL FIGHTING BOARDは12000円くらいします。でも今回は、既存のコントローラーの基板やBrook の UNIVERSAL FIGHTING BOARD の代わりに Sparkfun Pro Micro とこれの上で動く自作のプログラムで代用したので、2000円くらいで済ますことができました。もしも Pro Micro 安い互換機を使えば更に安くすることができますね。

ちなみに、今回作った自作レバーレスコントローラーで使ったSparkfun Pro Micro は2000円くらいで、それ以外のボタンやケースやら配線のためのもろもろが6000円で、合計8000円くらいでした。ちなみに、 PC と Nintendo Switch で使えることは確認済みでです。一方 PS4 では使えないことを確認しています。でも、PS4でそんなにゲーム遊ばないから、今回はこれで良いということにしています。

レバーレスコントローラーと SOCD (Simultaneous Opposite Cardinal Direction/反対方向同時入力)

今回、わざわざ Pro Micro を使ったのは、安く仕上げるためであると同時に、コントローラーの挙動を細かく変更するためでもあります。

レバーレスコントローラーの作成にあたっては、SOCD(Simultaneous Opposite Cardinal Direction/反対方向同時入力)に対する考慮が必要となります。
SOCDとは、通常、レバーや十字キーでは入力できない、左右の同時押しあるいは上下の同時押しをどのように扱うかについてのアルゴリズムのことです。

格闘ゲームにおける SOCD

hitbox では、左右同時押しは横方向はニュートラルとして扱い、上下の同時押しは上入力として扱われます。格闘ゲーム向けのにおいては、この hitbox の SOCD の扱いが、デファクトスタンダードとなっているようです。
Brook の UNIVERSAL FIGHTING BOARDは、ジャンパピンを用いた設定により、hitbox と同等とすることが可能です。

レバーレスコントローラーの格闘ゲームプレイ上の利点の定量化

格闘ゲームにおいて、レバーレスコントローラーによる操作は、一部レバーを用いた従来のコントローラーよりも高速に可能であるとして、多くのプレイヤーが現在利用していることがインターネットを検索することによって確認できます。
しかしながら具体的にはどの程度有利であるかについては、レバーレスコントローラと従来のレバーによるコントローラそれぞれの操作の習熟度に伴い個々人で異なること、またその簡易な計測方法が存在しないことといった理由で、計測が行われてこなかったのではないかと考えました。

そこで今回、キーディスプレイおよび各入力の継続フレームの表示のみを行うプログラムを unity を用いて作成し、これを用いて測定を行える環境を作りました。

まだ十分な回数をこなせておらず、統計として不十分なので、いくつかの測定結果及び感想を書いておきます。
なお、自作レバーレスコントローラーの SOCD は、hitbox に準拠した設定としています。また、比較対象に使っている通常のレバーありコントローラーには、 RAP V4 隼を用いました。

計測対象 自作レバーレスコントローラー レバーありコントローラー
←ため→ のニュートラル経過フレーム数 0フレームあるいは1フレーム 1から3フレーム。8割くらい2フレーム。
標準的な昇龍拳入力開始から完成まで(623入力) 7フレームくらい 7フレームくらい
昇龍拳のhitbox 向け入力開始から完成まで(639入力) 大体6フレームくらいだけど4フレームで完成したときもあった やってない

回数をこなした統計は、また追々測って行こうと思います。

あと、すでにレバーレスコントローラーの操作になれた人のフレーム情報も見てみたいので、汎用的な作りにして配ったりしたい。
今は、とりあえず図り始められる環境を作ることを優先して、PC環境依存でベタ書きになっていて人に配れたものではないので。

格闘ゲーム以外における SOCD

現在、製品として入手可能な hitbox を始めとするレバーレスコントローラーは格闘ゲーム用に使うことを想定している事が多いですが、もちろん他のゲームに使うことも出来ます。
ただし、他の種類のゲームに用いるときには、 SOCD の扱いは格闘ゲームとは別の考え方をするべきなのではないかと考えています。
通常 SOCD は、左右の同時押しあるいは上下の同時押しを考慮しますが、斜めの入力を行う必要がなく上下左右の4方向の入力のみを想定するテトリスなどのパズルゲームでは、格闘ゲームでの利用を想定した SOCD とは異なるアルゴリズムがより適しているのではないかと考えていました。例えば、上下左右の4方向をすべて排他し、最後に押されたものを優先するのが良いのではないかと考えました。
このような SOCD についての挙動の変更は、既存のコントローラの基板や Brook の UNIVERSAL FIGHTING BOARD では実現不可能であるため、これを自由にコントロールするために、Pro Microで自作する必要がありました。

格闘ゲーム以外においてはどうするのが良いのかについても追々考えていきたいですね。

ミスタードリラーアンコール(Steam版)のワールドトリルツアーで世界記録を出した (2020年8月14日時点)

2020年6月11日に、SwitchとSteamでミスタードリラーアンコールが発売された。
日本ではミスタードリラーアンコールという名称だが、海外ではミスタードリラー ドリルランドという名称で販売されており、内容としては2002年にゲームキューブ向けに発売されたミスタードリラー ドリルランドの移植である。
Steamの方はSwitchを始めとする据え置き型ゲーム機のように世代交代により遊べなくなる可能性が低く、かつPCで利用可能なアケコンがすでに手元にあるという理由で、自分はSteam版を購入した。

ミスタードリラーアンコールには、現代向けに難易度を低く調整したカジュアルモードと、2002年のドリルランドと同様の難易度になっているクラシックモードがある。
自分は、カジュアルモードとクラシックモード両方のワールドドリルツアー Level2 (1000m) で1位を取ることができた。

一度 6月27日にクラシックモード ワールドドリルツアー Level2 (1000m) で1位になった。このときには、PS3用の連射付きのFighting Commander 3 Pro というパッドで遊んでいた。

で、寝て起きたら2位になっていた。
パッドで遊ぶのは辛いと分かっていたので、サンワのレバーを取り寄せて、RAP V4 隼という普段使っているアケコンののレバーを交換し、4方向にガイドを設定してこれを使うようになった。
RAP V4 隼は、隼レバーと呼ばれるレバーが使われているのだけれど、これは8方向専用のレバーであり、サンワのレバーのようにガイドを回転させて4方向にしたりできない。きょう日アケコンを買うのなんて格ゲー遊ぶ人が大部分といえばそりゃまぁそうなんだけど、なんだかパズルゲーム勢がないがしろにされているようで辛いよ。
↓はお家に届いたサンワのレバー。

で、1位まで220点差まで詰めたものの

その後、更に高いスコアを出した人が現れ3位に転落。
で、この頃から体調が非常に悪くなり、ゲームに対するモチベもじゃんじゃん下がって、仕事以外では布団に寝そべって youtube を眺めるばっかりの生活がしばらく続いた。
なお、youtube では最近は Bad Gear というグルーブボックス的な音楽機材を扱うやつばかり見ている。
あと、最近は各ゲーマーがtwitchなどでストリーミングしたもののバックアップが youtube に上がっていたりして、それを見たりもしていた。
最近はウメハラ氏が、Hit Box というレバーを廃して、上下左右をボタンで入力するコントローラーを使っている、みたいな情報が入ってきたりして、ふーん。と思ったりしていた。

8月に入って体調も改善してきた。
ドリラーを遊びたいけど、わざわざPCのキーボードを机の上から退けて、アケコンを机の上に置くのが面倒だな、という気持ちになっていた。
そんなとき、ふとウメハラ氏が使っているという Hit Box のことを思い出した。
いっそのことキーボードで遊んじゃえばいいじゃん、Hit Box みたいなもんじゃん。と思った。
アケコンを4方向レバーに換装したとはいえ、方向を変える度に何フレームかニュートラルに入った状態になりロスが生じている。でも、キーボードで遊べばそのロスを減らせる可能性があるのでは?と気づいた。

自分は ergodox ez というファームウェアが書き換え可能なキーボードをかれこれ3年弱使っている。なので、ファームウェアを書き換えて、ゲームを遊びやすい配置にキーをアサインし直した。あと、掘りボタンの連射速度が早くなるようにギリギリまで調整した。(ergodox ez のファームウェアであるところの qmk において、キーの自動連射を実装したくて、かつ日本語を読める人は殆ど存在しないと思うのでこれについてはここでは詳しく説明しません。興味ある人はtwitterで聞いてください。)

で、キーボードによる1回目のクリアで2位になり、2回目のクリアで1位になった。

その後、1位になった時の記録は超えていないけど、4方向レバーに換装したアケコンを使っていたときと比べて平均的にスコアが伸びている感じはあるので、キーボードでのプレイに移行したのには効果があったのかな、と思っている。

あと、カジュアルモード ワールドドリルツアー Level2 (1000m) も初回のクリアで1位を取った。

一番ベーシックなモードであるワールドドリルツアーの1000mでいいスコアが出れば個人的にはもう思い残すことはないので、このあとはのんびり色々遊んでいこうと思う。

自分の好きなゲームが発売されて、それを思い切り遊ぶためにアケコンのレバー取り替えたり、キーボードのファームウェアいじったりと工夫して、それでちゃんとスコアも伸ばすことができて、なんだかいい人生だなって思ったよ。