PythonでMinecraftのサーバーを......?
Minecraftのサーバーに自分で独自機能を実装したい!
そんな時は皆さんJavaでプラグインを書いたりするでしょう。
しかしJavaができない人はどうすれば......?
Javaを勉強して書けるようになれ!というのは至極まっとうでぐうの音も出ない正論です。
ですが手段はまだ残されています。Pythonを使うのです!
MCRconというライブラリ
PythonにはMCRconというライブラリがあります。(https://pypi.org/project/mcrcon/)
その名の通りMinecraftサーバーに実装されているRconという機能を手軽に利用できるようにするライブラリです。
MCRconを使う
MCRconを使えばサーバーの外からマインクラフトのサーバーにコマンドを簡単に送り込むことができます。
with MCRcon('サーバーのアドレス','Rconのパスワード',ポート) as mcr:
mcr.command('tellraw @a "hello world"')
たったこれだけで全員にhello worldと発言することができるのです。
ですがプラグインのように複雑な処理などはできません。
あくまで利用できるのは対象のマインクラフトサーバーに実装されたコマンドのみです。
(プラグインのコマンドには対応)
しかしこれだけでも十分すぎると言えるでしょう。
何故ならマインクラフト内でコマンドブロックやスコアボードを利用してえっせほいせと書いていた計算やターゲットエンティティの指定などの処理をPythonで行うことができるのですから!
コマンドを実行する間隔を空けるにも/scheduleやレッドストーン回路を用いる必要はないのです。
time.sleep
を一行書いておしまい!
いやあ何でもできそうに思えてきましたね。
MCRcon + Subprocess = 独自コマンド
MCRconのさわり心地が分かったところで本題に入ります。
Subprocessは分かりますよね?そうですいろんなことができるやつです。
今までサーバーのJavaファイルを動かすためにjava
から始まるコマンドで始動させてきたと思います。
今回は独自コマンドを実装するということで、その方法で動かしては少し都合が悪いので先述のsubprocessを代わりに用いることにします。
server = subprocess.Popen(['java','-Xms4G','-Xmx4G','-jar','spigot-1.18.2.jar','--nogui'],stdout=subprocess.PIPE,stderr=subprocess.STDOUT,shell=True,text=True,encoding='shift-jis')
for i in server.stdout:
print(i,end="")
たったこれだけのコードでJarファイルからの標準出力をもらい、映し出すことができました。
(上記のコードは Windows で動かす場合のものです。Linuxでは shell=True
など書かなくてもよい要素がちらほら含まれています。)
この i にはサーバーコンソールの一行一行が文字列として詰め込まれています。
さて、ここまで来て勘のいい方は察しがついたでしょう。
そうです、ここで得た標準出力を正規表現などを用いてごにょごにょ処理して、プレイヤーが独自コマンドを実行したかどうかを判定するのです!
そして条件に当てはまったらMCRconでコマンドを送る......
Javaに触れたことがない方ならこちらの方が楽なのではないでしょうか。
夢は広がりますね。
さいごに
便利だぞ!というような口調で書いてきましたが実際のところ
・コマンドのサジェストに出ない
・連続して大量のコマンドを流すとエラーが起きる(詳細不明)
など短所も少なからずあります。
これらを理解したうえで独自機能を実装してみましょう!
それでは!