public void Save(bool Override = false, bool clearPhysics = false) { if (blocks == null) { return; } string path = LevelInfo.LevelPath(name); if (LevelSave != null) { LevelSave(this); } OnLevelSaveEvent.Call(this); if (cancelsave1) { cancelsave1 = false; return; } if (cancelsave) { cancelsave = false; return; } try { if (!Directory.Exists("levels")) { Directory.CreateDirectory("levels"); } if (!Directory.Exists("levels/level properties")) { Directory.CreateDirectory("levels/level properties"); } if (changed || !File.Exists(path) || Override || (physicschanged && clearPhysics)) { if (clearPhysics) { ClearPhysics(); } if (File.Exists(path)) { if (File.Exists(path + ".prev")) { File.Delete(path + ".prev"); } File.Copy(path, path + ".prev"); File.Delete(path); } LvlFile.Save(this, path + ".backup"); File.Copy(path + ".backup", path); SaveSettings(this); Server.s.Log(string.Format("SAVED: Level \"{0}\". ({1}/{2}/{3})", name, players.Count, PlayerInfo.Online.Count, Server.players)); changed = false; } else { Server.s.Log("Skipping level save for " + name + "."); } } catch (OutOfMemoryException e) { Server.ErrorLog(e); if (Server.mono) { Process[] prs = Process.GetProcesses(); foreach (Process pr in prs) { if (pr.ProcessName == "MCGalaxy") { pr.Kill(); } } } else { Command.all.Find("restart").Use(null, ""); } } catch (Exception e) { Server.s.Log("FAILED TO SAVE :" + name); Player.GlobalMessage("FAILED TO SAVE :" + name); Server.ErrorLog(e); } GC.Collect(); GC.WaitForPendingFinalizers(); }
void PhysicsLoop() { int wait = speedPhysics; while (true) { if (!PhysicsEnabled) { Thread.Sleep(500); continue; } try { if (wait > 0) { Thread.Sleep(wait); } if (physics == 0 || ListCheck.Count == 0) { lastCheck = 0; wait = speedPhysics; if (physics == 0) { break; } continue; } DateTime start = DateTime.UtcNow; if (physics > 0) { CalcPhysics(); } TimeSpan delta = DateTime.UtcNow - start; wait = speedPhysics - (int)delta.TotalMilliseconds; if (wait < (int)(-overload * 0.75f)) { if (wait < -overload) { if (!Server.physicsRestart) { setPhysics(0); } ClearPhysics(); Player.GlobalMessage("Physics shutdown on &b" + name); Server.s.Log("Physics shutdown on " + name); if (PhysicsStateChanged != null) { PhysicsStateChanged(this, PhysicsState.Stopped); } wait = speedPhysics; } else { Player[] online = PlayerInfo.Online.Items; foreach (Player p in online) { if (p.level != this) { continue; } Player.SendMessage(p, "Physics warning!"); } Server.s.Log("Physics warning on " + name); if (PhysicsStateChanged != null) { PhysicsStateChanged(this, PhysicsState.Warning); } } } } catch { wait = speedPhysics; } } physicssate = false; physThread.Abort(); }
void Listener_OnPublic(UserInfo user, string channel, string message) { message = CP437Reader.ConvertToRaw(message); //string allowedchars = "1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./!@#$%^*()_+QWERTYUIOPASDFGHJKL:\"ZXCVBNM<>? "; //string msg = message; RemoveVariables(ref message); RemoveWhitespace(ref message); //if (message.Contains("^UGCS")) //{ // Server.UpdateGlobalSettings(); // return; //} if (message.Contains("^IPGET ")) { Player[] players = PlayerInfo.Online.Items; foreach (Player p in players) { if (p.name == message.Split(' ')[1]) { if (Server.UseGlobalChat && IsConnected()) { if (Player.IsLocalIpAddress(p.ip)) { connection.Sender.PublicMessage(channel, "^IP " + p.name + ": " + Server.IP); connection.Sender.PublicMessage(channel, "^PLAYER IS CONNECTING THROUGH A LOCAL IP."); } else { connection.Sender.PublicMessage(channel, "^IP " + p.name + ": " + p.ip); } } } } } if (message.Contains("^SENDRULES ")) { Player who = PlayerInfo.Find(message.Split(' ')[1]); if (who != null) { Command.all.Find("gcrules").Use(who, ""); } } if (message.Contains("^GETINFO ")) { if (message.Split(' ')[1] == Server.GlobalChatNick()) { if (Server.UseGlobalChat && IsConnected()) { connection.Sender.PublicMessage(channel, "^NAME: " + Server.name); connection.Sender.PublicMessage(channel, "^MOTD: " + Server.motd); connection.Sender.PublicMessage(channel, "^VERSION: " + Server.VersionString); connection.Sender.PublicMessage(channel, "^URL: " + Server.URL); connection.Sender.PublicMessage(channel, "^PLAYERS: " + PlayerInfo.Online.Count + "/" + Server.players); } } } //for RoboDash's anti advertise/swear in #globalchat if (message.Contains("^ISASERVER ")) { if (Server.GlobalChatNick() == message.Split(' ')[1]) { connection.Sender.PublicMessage(channel, "^IMASERVER"); } } if (message.StartsWith("^")) { return; } message = message.MCCharFilter(); if (String.IsNullOrEmpty(message)) { return; } if (OnNewRecieveGlobalMessage != null) { OnNewRecieveGlobalMessage(user.Nick, message); } if (Server.Devs.CaselessContains(message.Split(':')[0]) && !message.StartsWith("[Dev]") && !message.StartsWith("[Developer]")) { message = "[Dev]" + message; } else if (Server.Mods.CaselessContains(message.Split(':')[0]) && !message.StartsWith("[Mod]") && !message.StartsWith("[Moderator]")) { message = "[Mod]" + message; } /*try { * if(GUI.GuiEvent != null) * GUI.GuiEvents.GlobalChatEvent(this, "> " + user.Nick + ": " + message); } * catch { Server.s.Log(">[Global] " + user.Nick + ": " + message); }*/ Player.GlobalMessage(String.Format("%G>[Global] {0}: &f{1}", user.Nick, Server.profanityFilter ? ProfanityFilter.Parse(message) : message), true); }