【Minecraft】1人でもプレイヤーが死亡したらワールドを再生成する

先日のこれを、以下の記事で書いている通りプラグインとの抱き合わせでちゃんと作った。

mstudy-diary.hatenablog.com

プレイヤー死亡時にspigotのサーバーログlatest.logにキーワードを出力するプラグインを設置し、
スクリプトでそれを拾って再生成操作を行う。

プラグインはこちら。

github.com

スクリプトはこちら。パスはご自由に。

#!/bin/sh

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

# screenの名前
SCREEN_NAME=Minecraft

# ワールド名
WORLD_NAME=HARDCORE_WORLD

#ワールドパス
WORLD_PASS=minecraft-spigot
#バックアップワールドパス
BK_WORLD_PASS=bk_minecraft-spigot

#スクリプトログパス
SCRIPT_LOG=logs/shellresult.log
SCRIPT_LOG_NUMBER=numberOfPlayears.log

#マイクラログパス
SPIGOT_LOG=${WORLD_PASS}/logs/latest.log

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

echo START >> ${SCRIPT_LOG}

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

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

    echo notMyPID >> ${SCRIPT_LOG}
    exit

fi

echo shellStart >> ${SCRIPT_LOG}

#死亡確認。これがプラグインから吐かれるキーワード
isDeath=`grep -q "PLAYERDEATH\!" ${SPIGOT_LOG} && echo OK`

#サーバー停止中かどうか。
#サーバーを再起動するごとにlatest.logはリフレッシュされるが、タイミングによってリフレッシュ前に当シェルが動いてしまわないため
isNotStopping=`grep -q "Stopping the server" ${SPIGOT_LOG} && echo NG`

#死亡したプレイヤーが存在してサーバー停止中じゃない場合
if [ "${isDeath}" = "OK" ] && [ "${isNotStopping}" != "NG" ]; then
    
  #人数チェック
  echo checkPlayears >> ${SCRIPT_LOG}
    screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "list\015"'
    grep 'There are . of' ${SPIGOT_LOG} | tail -n 1 > ${SCRIPT_LOG_NUMBER}
    isNoPlayears=`grep -q 'There are 0 of' ${SCRIPT_LOG_NUMBER} && echo OK`
    
    if [ "${isNoPlayears}" = "OK" ]; then
    #0人だったらワールド再生成
  #人数チェックをしないと、1人死んだあと他のメンバーが遊んでいても問答無用でサーバーが止められて余韻がないので・・
    echo createNewWorld >> ${SCRIPT_LOG}

    screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "stop\015"'
    
    mv ${SCRIPT_LOG_NUMBER} ${SCRIPT_LOG_NUMBER}.`date "+%Y%m%d_%H%M%S"`

    sleep 30
    
  #ワールドディレクトリを無理矢理削除してしまうので、丸ごとコピーしておく
    cp -r ${WORLD_PASS} ${BK_WORLD_PASS}

    rm -rf ${WORLD_PASS}/${WORLD_NAME}
    rm -rf ${WORLD_PASS}/${WORLD_NAME}_nether
    rm -rf ${WORLD_PASS}/${WORLD_NAME}_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"'

  #コピーしたバックアップデータをzip化しておく。容量がきついので
    zip ${BK_WORLD_PASS}.`date "+%Y%m%d_%H%M%S"`.zip ${BK_WORLD_PASS}
    rm -rf ${BK_WORLD_PASS}

    echo success >> ${SCRIPT_LOG}

fi
fi