#pragma semicolon 1 #include #include #include float g_fUptime; int g_iRestartCountdown; bool g_bForcedRestart; ConVar g_cvarMaxPlayersForControlledRestart; ConVar g_cvarMinPlayersForForcedRestart; ConVar g_cvarMinHoursUptimeForForcedRestart; public Plugin myinfo = { name = "UptimeRestart", author = "Dogan", description = "Display Server Uptime and do controlled Restarts", version = "2.0.0", url = "" }; public void OnPluginStart() { RegAdminCmd("uptime", Command_Uptime, ADMFLAG_GENERIC, "Displays server Uptime"); RegAdminCmd("sm_uptime", Command_Uptime, ADMFLAG_GENERIC, "Displays server Uptime"); g_cvarMaxPlayersForControlledRestart = CreateConVar("sm_maxplayers_controlled_restart", "1", "Max Amount of Players Connected to Server to do a controlled restart in the night", FCVAR_NONE, true, 1.0, true, 64.0); g_cvarMinPlayersForForcedRestart = CreateConVar("sm_minplayers_forced_restart", "55", "Min Amount of Players Connected to Server to do a forced restart in the afternoon", FCVAR_NONE, true, 1.0, true, 64.0); g_cvarMinHoursUptimeForForcedRestart = CreateConVar("sm_minhours_forced_restart", "60", "Min Hours of Uptime to force a forced restart in the afternoon", FCVAR_NONE, true, 1.0, true, 96.0); g_iRestartCountdown = 5; g_bForcedRestart = false; GetUptimeIfControlledRestart(); GetNextmapIfForcedRestart(); AutoExecConfig(true, "plugin.UptimeRestarts"); CreateTimer(60.0, CheckRestart, _, TIMER_REPEAT); CreateTimer(20.0, ForceRestartMessage, _, TIMER_REPEAT); } public void OnMapEnd() { if(!g_bForcedRestart) return; CPrintToChatAll("{red}WARNING:{white} Restarting Server now!"); CPrintToChatAll("{red}WARNING:{white} Restarting Server now!"); CPrintToChatAll("{red}WARNING:{white} Restarting Server now!"); PrintCenterTextAll("WARNING: Restarting Server now!"); char sNextmap[64]; GetNextMap(sNextmap, sizeof(sNextmap)); if(!StrEqual(sNextmap, "")) { File NextmapFile = OpenFile("nextmap.txt", "w"); NextmapFile.WriteLine(sNextmap); delete NextmapFile; } RequestFrame(ForceRestart); } public void GetNextmapIfForcedRestart() { File NextmapFile = OpenFile("nextmap.txt", "r"); if(NextmapFile != null)//There was a nextmap set { char sNextmap[64]; NextmapFile.ReadLine(sNextmap, sizeof(sNextmap)); delete NextmapFile; DeleteFile("nextmap.txt"); ForceChangeLevel(sNextmap, "Set to Map that was next before Force Restart happened"); } } public void GetUptimeIfControlledRestart() { File UptimeFile = OpenFile("uptime.txt", "r"); if(UptimeFile != null)//Server was restarted automatically by this plugin { char sUptime[64]; UptimeFile.ReadLine(sUptime, sizeof(sUptime)); g_fUptime = StringToFloat(sUptime); delete UptimeFile; DeleteFile("uptime.txt"); } else//Server crashed or restarted manually LogToFile("addons/sourcemod/logs/restarts.txt", "Server crashed or was restarted manually."); } public Action Command_Uptime(int client, int args) { float fUptime = GetEngineTime(); char sUptime[64]; int iUptime = RoundFloat(fUptime); int iDays = (iUptime / 86400); int iHours = (iUptime / 3600) % 24; int iMinutes = (iUptime / 60) % 60; int iSeconds = (iUptime % 60); if (iDays) Format(sUptime, sizeof(sUptime), "%d Days %d Hours %d Minutes %d Seconds.", iDays, iHours, iMinutes, iSeconds); else if (iHours) Format(sUptime, sizeof(sUptime), "%d Hours %d Minutes %d Seconds.", iHours, iMinutes, iSeconds); else if (iMinutes) Format(sUptime, sizeof(sUptime), "%d Minutes %d Seconds.", iMinutes, iSeconds); else Format(sUptime, sizeof(sUptime), "%d Seconds.", iSeconds); ReplyToCommand(client, "[SM] Real Server Uptime: %s", sUptime); fUptime = GetEngineTime() + g_fUptime; iUptime = RoundFloat(fUptime); iDays = (iUptime / 86400); iHours = (iUptime / 3600) % 24; iMinutes = (iUptime / 60) % 60; iSeconds = (iUptime % 60); if (iDays) Format(sUptime, sizeof(sUptime), "%d Days %d Hours %d Minutes %d Seconds.", iDays, iHours, iMinutes, iSeconds); else if (iHours) Format(sUptime, sizeof(sUptime), "%d Hours %d Minutes %d Seconds.", iHours, iMinutes, iSeconds); else if (iMinutes) Format(sUptime, sizeof(sUptime), "%d Minutes %d Seconds.", iMinutes, iSeconds); else Format(sUptime, sizeof(sUptime), "%d Seconds.", iSeconds); ReplyToCommand(client, "[SM] Cumulative Server Uptime: %s", sUptime); return Plugin_Handled; } public Action CheckRestart(Handle timer) { if(g_bForcedRestart) return Plugin_Continue; float fMinHoursUptime = g_cvarMinHoursUptimeForForcedRestart.FloatValue * 60.0 * 60.0; int iPlayers = GetClientCount(false); for(int i = 1; i <= MaxClients; i++) { if(IsClientConnected(i) && IsFakeClient(i)) iPlayers--; } if((GetEngineTime() > fMinHoursUptime) && (iPlayers > g_cvarMinPlayersForForcedRestart.IntValue)) { g_bForcedRestart = true; return Plugin_Continue; } if(!IsItRestartTime()) return Plugin_Continue; if(iPlayers > g_cvarMaxPlayersForControlledRestart.IntValue) //jenz's autism bot return Plugin_Continue; float fUptime = GetEngineTime(); g_fUptime = g_fUptime + fUptime; char sUptime[64]; FloatToString(g_fUptime, sUptime, sizeof(sUptime)); File UptimeFile = OpenFile("uptime.txt", "w"); UptimeFile.WriteLine(sUptime); delete UptimeFile; CreateTimer(1.0, RestartCountdown, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); return Plugin_Continue; } stock bool IsItRestartTime() { int iTime = GetTime(); int iHour; char sTime[32]; FormatTime(sTime, sizeof(sTime), "%H", iTime); iHour = StringToInt(sTime[0]); if (iHour >= 3 && iHour < 8) return true; return false; } public Action RestartCountdown(Handle timer) { PrintCenterTextAll("WARNING: Restarting Server in %d.", g_iRestartCountdown); CPrintToChatAll("{red}WARNING:{white} Restarting Server in %d.", g_iRestartCountdown); g_iRestartCountdown--; if(g_iRestartCountdown < 0) { LogToFile("addons/sourcemod/logs/restarts.txt", "Successfully auto-restarted the Server."); ServerCommand("_restart"); return Plugin_Handled; } return Plugin_Handled; //Server is dead by here anyway xD } public void ForceRestart() { LogToFile("addons/sourcemod/logs/restarts.txt", "Successfully force-restarted the Server."); ServerCommand("_restart"); } public Action ForceRestartMessage(Handle timer) { if(!g_bForcedRestart) return Plugin_Continue; CPrintToChatAll("{red}WARNING:{white} Restarting Server when this Map ends!"); CPrintToChatAll("{red}WARNING:{white} Remember to join after couple seconds!"); return Plugin_Continue; }