ハードコアを複数人でクリア、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についてはこちらをどうぞ。