// Called when a world shutdown is initiated. public virtual void OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask) { }
static bool ShutdownServer(StringArguments args, CommandHandler handler, ShutdownMask shutdownMask, ShutdownExitCode defaultExitCode) { if (args.Empty()) { return(false); } string delayStr = args.NextString(); if (delayStr.IsEmpty()) { return(false); } int delay; if (int.TryParse(delayStr, out delay)) { // Prevent interpret wrong arg value as 0 secs shutdown time if ((delay == 0 && (delayStr[0] != '0' || delayStr.Length > 1 && delayStr[1] != '\0')) || delay < 0) { return(false); } } else { delay = (int)Time.TimeStringToSecs(delayStr); if (delay == 0) { return(false); } } string reason = ""; string exitCodeStr = ""; string nextToken; while (!(nextToken = args.NextString()).IsEmpty()) { if (nextToken.IsNumber()) { exitCodeStr = nextToken; } else { reason = nextToken; reason += args.NextString("\0"); break; } } int exitCode = (int)defaultExitCode; if (!exitCodeStr.IsEmpty()) { if (!ParseExitCode(exitCodeStr, out exitCode)) { return(false); } } // Override parameter "delay" with the configuration value if there are still players connected and "force" parameter was not specified if (delay < WorldConfig.GetIntValue(WorldCfg.ForceShutdownThreshold) && !shutdownMask.HasAnyFlag(ShutdownMask.Force) && !IsOnlyUser(handler.GetSession())) { delay = WorldConfig.GetIntValue(WorldCfg.ForceShutdownThreshold); handler.SendSysMessage(CypherStrings.ShutdownDelayed, delay); } Global.WorldMgr.ShutdownServ((uint)delay, shutdownMask, (ShutdownExitCode)exitCode, reason); return(true); }