【Minecraft】ログを取得してワールドを自動的に再生成するスクリプト

ハードコアを複数人でクリア、1人でも死んだら初めからやり直しという企画を前やったときに、
手動でワールドを再生成するのが面倒だったのでスクリプト化してみた。
まだまだスマートじゃなくてアレだけどとりあえず動いたので記録しておく。

スクリプトは、ワールドから人がいなくなったら再生成という形にしているが、
よく考えたら死亡ではなく今日はここまで!って解散したときもワールドが削除されちゃうのでアカンですね。
プラグインとの抱き合わせで、プレイヤーの死亡カウントをログに出力する形にして、
そのログをチェックして実行するやり方に直したい。
(あと誤作動したときのためにワールドをバックアップとかもしたいけど、サーバーの容量の問題もあるので要検討)

2023/6/12 追記
完成版はこちら。
mstudy-diary.hatenablog.com

追記おわり

ファイルを指定している個所は適宜絶対パスにするといいと思います。

#!/bin/sh

# ------------設定箇所-------------

# screenの名前
SCREEN_NAME=Minecraft

# ---------------------------------

#二重起動チェック
pid=`pgrep -ox newWorld.sh`
mypid="$$"

if [ ${mypid} != ${pid} ]; then

#cronで10秒おきに起動しているので、二重起動になっていたら処理を終了
exit

fi

#1人以上入室したあとかどうかを取得したいので、listコマンドを実行
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "list"\015'

#Spigotログの中から、listコマンドの結果行だけを抜粋
grep 'There are . of' latest.log > tmp11.txt
#sedコマンドでログを編集。確認用に毎度ファイル出力してるので汚い。綺麗にしたい
#空白削除
sed 's/ //g' tmp11.txt > tmp12.txt
#[TIMESTAMP]There are X of players~とログが出るので、XだけほしいのでまずX以前を削除 
sed 's/^.*Thereare//g' tmp12.txt > tmp13.txt
#X以降を削除
sed 's/ofamaxof.*//g' tmp13.txt > tmp14.txt
#結果を確認。0以外だったら(1人以上が入出している記録があったら)、変数にOKが返る
numOfPlayers=`grep -q -v 0 tmp14.txt && echo OK`

if [ "${numOfPlayers}" = "OK" ]; then
#1人以上入室していた場合
#1人以上入室した記録があり、かつ現在の人数が0人だったらワールドを再生成したいので、またログをチェック
#listコマンドの結果のうち最終行を取得(同じようなことさっきもやってますね。要修正。)
grep 'There are . of' latest.log | tail -n 1 > tmp21.txt
#さっきと同じく、空白を削除して、人数以外の文字列を削除
sed 's/ //g' tmp21.txt > tmp22.txt
sed 's/^.*Thereare//g' tmp22.txt >tmp23.txt
sed 's/ofamaxof.*//g' tmp23.txt > tmp24.txt

#最終人数が0人だったら再生成OK
numOfPlayers=`grep -q 0 tmp24.txt && echo OK`

#ワールド再生成
if [ "${numOfPlayers}" = "OK" ]; then

#サーバーをとめて、
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "stop\015"'

sleep 30

#worldデータを削除
#spigotのserver.propertiesのlevel-nameでワールドディレクトリが作成される。今回はHARDCORE WORLDにしてるのでそれを指定。
rm -rf 'HARDCORE WORLD'
rm -rf 'HARDCORE WORLD_nether'
rm -rf 'HARDCORE WORLD_the_end'

#削除後に再起動
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "cd minecraft-spigot"\015'
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "./Minecraft_start.sh\015"'

fi

fi

cronの登録内容はこんな感じ。10秒おきに実行します。

* * * * * for i in `seq 0 10 59`;do (sleep ${i}; cd /~/シェルがおいてあるパス && ./newWorld.sh) & done;

cronについてはこちらをどうぞ。

mstudy-diary.hatenablog.com