@echo off setlocal EnableExtensions EnableDelayedExpansion rem Plugin-owned graceful stop for the SCUM dedicated server. rem It announces the shutdown to players, asks the running server to shut down rem through the local RCON listener (port and password come from the UE4SS mod rem config), and waits for SCUMServer.exe to exit on its own. Run only rem terminates the process afterwards when the lifecycle action declares that rem fallback. if "%SERVER_ROOT%"=="" set "SERVER_ROOT=C:\scumserver" set "SERVER_ROOT_WINDOWS=%SERVER_ROOT:/=\%" if "%SERVER_EXECUTABLE_REF%"=="" set "SERVER_EXECUTABLE_REF=SCUM\Binaries\Win64\SCUMServer.exe" if "%SERVER_INSTALL_DIR%"=="" set "SERVER_INSTALL_DIR=%SERVER_ROOT_WINDOWS%" set "SERVER_INSTALL_DIR_WINDOWS=%SERVER_INSTALL_DIR:/=\%" set "SCUM_RCON_PORT_ARG=" if not "%SERVER_STOP_RCON_PORT%"=="" set "SCUM_RCON_PORT_ARG=-Port %SERVER_STOP_RCON_PORT%" if "%SERVER_STOP_SHUTDOWN_COMMAND%"=="" set "SERVER_STOP_SHUTDOWN_COMMAND=Quit" if "%SERVER_STOP_ANNOUNCE%"=="" set "SERVER_STOP_ANNOUNCE=Server shutdown requested by the operator. Save your progress and disconnect." if "%SERVER_STOP_NOTICE_SECONDS%"=="" set "SERVER_STOP_NOTICE_SECONDS=15" if "%SERVER_STOP_TIMEOUT_SECONDS%"=="" set "SERVER_STOP_TIMEOUT_SECONDS=120" if "%SERVER_STOP_RCON_TIMEOUT_MS%"=="" set "SERVER_STOP_RCON_TIMEOUT_MS=10000" set "SCUM_RCON_SCRIPT=%~dp0scum-rcon.ps1" set "SCUM_RCON_CONFIG=%SERVER_INSTALL_DIR_WINDOWS%\ue4ss\Mods\scum_simple_rcon\config.ini" if not exist "%SCUM_RCON_CONFIG%" set "SCUM_RCON_CONFIG=%SERVER_ROOT_WINDOWS%\ue4ss\Mods\scum_simple_rcon\config.ini" call :resolve_scum_exe call :find_running_scum if "%SCUM_RUNNING_PID%"=="" ( echo [scum-stop] SCUM server is not running; nothing to stop. exit /b 0 ) echo [scum-stop] Requesting graceful shutdown of SCUM server pid %SCUM_RUNNING_PID%. if not exist "%SCUM_RCON_SCRIPT%" ( echo [scum-stop] Missing plugin RCON client: %SCUM_RCON_SCRIPT% exit /b 3 ) if not exist "%SCUM_RCON_CONFIG%" ( echo [scum-stop] Missing SCUM RCON configuration: %SCUM_RCON_CONFIG% exit /b 4 ) if not "%SERVER_STOP_NOTICE_SECONDS%"=="0" ( call :send_rcon "Announce %SERVER_STOP_ANNOUNCE%" if errorlevel 1 echo [scum-stop] Player announcement was not delivered; continuing with the shutdown request. timeout /T %SERVER_STOP_NOTICE_SECONDS% /NOBREAK >nul ) call :send_rcon "%SERVER_STOP_SHUTDOWN_COMMAND%" if errorlevel 1 echo [scum-stop] Declared shutdown command was not acknowledged; waiting for the server to exit anyway. call :wait_for_exit if not "%SCUM_EXITED%"=="1" ( echo [scum-stop] SCUM server pid %SCUM_RUNNING_PID% did not exit within %SERVER_STOP_TIMEOUT_SECONDS% seconds of the declared shutdown request. exit /b 2 ) echo [scum-stop] SCUM server shut down gracefully. exit /b 0 :send_rcon if "%~1"=="" exit /b 1 powershell -NoProfile -ExecutionPolicy Bypass -File "%SCUM_RCON_SCRIPT%" -ConfigPath "%SCUM_RCON_CONFIG%" %SCUM_RCON_PORT_ARG% -TimeoutMs %SERVER_STOP_RCON_TIMEOUT_MS% -Command "%~1" exit /b %ERRORLEVEL% :wait_for_exit set "SCUM_EXITED=0" set /A SCUM_WAIT_TICKS=%SERVER_STOP_TIMEOUT_SECONDS%*2 if %SCUM_WAIT_TICKS% LSS 1 set "SCUM_WAIT_TICKS=1" for /L %%A in (1,1,%SCUM_WAIT_TICKS%) do ( call :find_running_scum if "!SCUM_RUNNING_PID!"=="" ( set "SCUM_EXITED=1" goto :wait_done ) timeout /T 1 /NOBREAK >nul ) :wait_done exit /b 0 :find_running_scum set "SCUM_RUNNING_PID=" for /f "usebackq delims=" %%P in (`powershell -NoProfile -ExecutionPolicy Bypass -Command "$target=$env:SCUM_EXE; if (-not $target) { exit 0 }; $full=[IO.Path]::GetFullPath($target); Get-CimInstance Win32_Process -Filter \"name='SCUMServer.exe'\" | Where-Object { $_.ExecutablePath -and ([IO.Path]::GetFullPath($_.ExecutablePath) -ieq $full) } | Select-Object -First 1 -ExpandProperty ProcessId"`) do set "SCUM_RUNNING_PID=%%P" exit /b 0 :resolve_scum_exe set "SCUM_EXE=%SERVER_ROOT_WINDOWS%\%SERVER_EXECUTABLE_REF:/=\%" set "SCUM_EXE_MARKER=%SERVER_ROOT_WINDOWS%\.scum-exe-path" if exist "%SCUM_EXE_MARKER%" set /p SCUM_EXE=<"%SCUM_EXE_MARKER%" if exist "%SCUM_EXE%" exit /b 0 set "SCUM_EXE=%SERVER_ROOT_WINDOWS%\%SERVER_EXECUTABLE_REF:/=\%" if exist "%SCUM_EXE%" exit /b 0 set "SCUM_EXE=%SERVER_INSTALL_DIR_WINDOWS%\%SERVER_EXECUTABLE_REF:/=\%" if exist "%SCUM_EXE%" exit /b 0 set "SCUM_EXE=%SERVER_ROOT_WINDOWS%\steamcmd\steamapps\common\SCUM Server\%SERVER_EXECUTABLE_REF:/=\%" if exist "%SCUM_EXE%" exit /b 0 set "SCUM_EXE=%SERVER_ROOT_WINDOWS%\SCUM Server\%SERVER_EXECUTABLE_REF:/=\%" exit /b 0