public override void Use(Player p, string message) { byte b; Int64 seconds; Player who; Player.UndoPos Pos; int CurrentPos = 0; if (p != null) { p.RedoBuffer.Clear(); } if (message == "") { message = p.name + " 30"; } if (message.Split(' ').Length == 2) { if (message.Split(' ')[1].ToLower() == "all" && p.group.Permission > LevelPermission.Operator) { seconds = 500000; } else { try { seconds = Int64.Parse(message.Split(' ')[1]); } catch { Player.SendMessage(p, "Invalid seconds."); return; } } } else { try { seconds = int.Parse(message); if (p != null) { message = p.name + " " + message; } } catch { seconds = 30; message = message + " 30"; } } //if (message.Split(' ').Length == 1) if (char.IsDigit(message, 0)) { message = p.name + " " + message; } else { message = message + " 30"; } //try { seconds = Convert.ToInt16(message.Split(' ')[1]); } catch { seconds = 2; } if (seconds == 0) { seconds = 5400; } who = Player.Find(message.Split(' ')[0]); if (who != null) { if (p != null) { if (who.group.Permission > p.group.Permission && who != p) { Player.SendMessage(p, "Cannot undo a user of higher or equal rank"); return; } if (who != p && p.group.Permission < LevelPermission.Operator) { Player.SendMessage(p, "Only an OP+ may undo other people's actions"); return; } if (p.group.Permission < LevelPermission.Builder && seconds > 120) { Player.SendMessage(p, "Guests may only undo 2 minutes."); return; } else if (p.group.Permission < LevelPermission.AdvBuilder && seconds > 300) { Player.SendMessage(p, "Builders may only undo 300 seconds."); return; } else if (p.group.Permission < LevelPermission.Operator && seconds > 1200) { Player.SendMessage(p, "AdvBuilders may only undo 600 seconds."); return; } else if (p.group.Permission == LevelPermission.Operator && seconds > 5400) { Player.SendMessage(p, "Operators may only undo 5400 seconds."); return; } } for (CurrentPos = who.UndoBuffer.Count - 1; CurrentPos >= 0; --CurrentPos) { try { Pos = who.UndoBuffer[CurrentPos]; Level foundLevel = Level.FindExact(Pos.mapName); b = foundLevel.GetTile(Pos.x, Pos.y, Pos.z); if (Pos.timePlaced.AddSeconds(seconds) >= DateTime.Now) { if (b == Pos.newtype || Block.Convert(b) == Block.water || Block.Convert(b) == Block.lava) { foundLevel.Blockchange(Pos.x, Pos.y, Pos.z, Pos.type, true); Pos.newtype = Pos.type; Pos.type = b; if (p != null) { p.RedoBuffer.Add(Pos); } who.UndoBuffer.RemoveAt(CurrentPos); } } else { break; } } catch { } } if (p != who) { Player.GlobalChat(p, who.color + who.name + Server.DefaultColor + "'s actions for the past &b" + seconds + " seconds were undone.", false); } else { Player.SendMessage(p, "Undid your actions for the past &b" + seconds + Server.DefaultColor + " seconds."); } return; } else if (message.Split(' ')[0].ToLower() == "physics") { if (p.group.Permission < LevelPermission.AdvBuilder) { Player.SendMessage(p, "Reserved for Adv+"); return; } else if (p.group.Permission < LevelPermission.Operator && seconds > 1200) { Player.SendMessage(p, "AdvBuilders may only undo 1200 seconds."); return; } else if (p.group.Permission == LevelPermission.Operator && seconds > 5400) { Player.SendMessage(p, "Operators may only undo 5400 seconds."); return; } Command.all.Find("pause").Use(p, "120"); Level.UndoPos uP; ushort x, y, z; if (p.level.UndoBuffer.Count != Server.physUndo) { for (CurrentPos = p.level.currentUndo; CurrentPos >= 0; CurrentPos--) { try { uP = p.level.UndoBuffer[CurrentPos]; b = p.level.GetTile(uP.location); if (uP.timePerformed.AddSeconds(seconds) >= DateTime.Now) { if (b == uP.newType || Block.Convert(b) == Block.water || Block.Convert(b) == Block.lava) { p.level.IntToPos(uP.location, out x, out y, out z); p.level.Blockchange(p, x, y, z, uP.oldType, true); } } else { break; } } catch { } } } else { for (CurrentPos = p.level.currentUndo; CurrentPos != p.level.currentUndo + 1; CurrentPos--) { try { if (CurrentPos < 0) { CurrentPos = p.level.UndoBuffer.Count - 1; } uP = p.level.UndoBuffer[CurrentPos]; b = p.level.GetTile(uP.location); if (uP.timePerformed.AddSeconds(seconds) >= DateTime.Now) { if (b == uP.newType || Block.Convert(b) == Block.water || Block.Convert(b) == Block.lava) { p.level.IntToPos(uP.location, out x, out y, out z); p.level.Blockchange(p, x, y, z, uP.oldType, true); } } else { break; } } catch { } } } Command.all.Find("pause").Use(p, ""); Player.GlobalMessage("Physics were undone &b" + seconds + Server.DefaultColor + " seconds"); } else { if (p != null) { if (p.group.Permission < LevelPermission.Operator) { Player.SendMessage(p, "Reserved for OP+"); return; } if (seconds > 5400 && p.group.Permission == LevelPermission.Operator) { Player.SendMessage(p, "Only SuperOPs may undo more than 90 minutes."); return; } } bool FoundUser = false; try { DirectoryInfo di; string[] fileContent; p.RedoBuffer.Clear(); if (Directory.Exists("extra/undo/" + message.Split(' ')[0])) { di = new DirectoryInfo("extra/undo/" + message.Split(' ')[0]); for (int i = di.GetFiles("*.undo").Length - 1; i >= 0; i--) { fileContent = File.ReadAllText("extra/undo/" + message.Split(' ')[0] + "/" + i + ".undo").Split(' '); if (!undoBlah(fileContent, seconds, p)) { break; } } FoundUser = true; } if (Directory.Exists("extra/undoPrevious/" + message.Split(' ')[0])) { di = new DirectoryInfo("extra/undoPrevious/" + message.Split(' ')[0]); for (int i = di.GetFiles("*.undo").Length - 1; i >= 0; i--) { fileContent = File.ReadAllText("extra/undoPrevious/" + message.Split(' ')[0] + "/" + i + ".undo").Split(' '); if (!undoBlah(fileContent, seconds, p)) { break; } } FoundUser = true; } if (FoundUser) { Player.GlobalChat(p, Server.FindColor(message.Split(' ')[0]) + message.Split(' ')[0] + Server.DefaultColor + "'s actions for the past &b" + seconds + Server.DefaultColor + " seconds were undone.", false); } else { Player.SendMessage(p, "Could not find player specified."); } } catch (Exception e) { Server.ErrorLog(e); } } }
public override void Use(Player p, string message) { if (message == "") { if (p != null) { message = p.level.name + " 30"; } else { message = Server.mainLevel + " 30"; } } int foundNum = 0; Level foundLevel; if (message.IndexOf(' ') == -1) { try { foundNum = int.Parse(message); if (p != null) { foundLevel = p.level; } else { foundLevel = Server.mainLevel; } } catch { foundNum = 30; foundLevel = Level.Find(message); } } else { try { foundNum = int.Parse(message.Split(' ')[1]); foundLevel = Level.Find(message.Split(' ')[0]); } catch { Player.SendMessage(p, "Invalid input"); return; } } if (foundLevel == null) { Player.SendMessage(p, "Could not find entered level."); return; } try { if (foundLevel.physPause) { foundLevel.physThread.Resume(); foundLevel.physResume = DateTime.Now; foundLevel.physPause = false; Player.GlobalMessage("Physics on " + foundLevel.name + " were re-enabled."); } else { foundLevel.physThread.Suspend(); foundLevel.physResume = DateTime.Now.AddSeconds(foundNum); foundLevel.physPause = true; Player.GlobalMessage("Physics on " + foundLevel.name + " were temporarily disabled."); foundLevel.physTimer.Elapsed += delegate { if (DateTime.Now > foundLevel.physResume) { foundLevel.physPause = false; try { foundLevel.physThread.Resume(); } catch (Exception e) { Server.ErrorLog(e); } Player.GlobalMessage("Physics on " + foundLevel.name + " were re-enabled."); foundLevel.physTimer.Stop(); foundLevel.physTimer.Dispose(); } }; foundLevel.physTimer.Start(); } } catch (Exception e) { Server.ErrorLog(e); } }
private void Window_Load(object sender, EventArgs e) { thisWindow = this; MaximizeBox = false; this.Text = "<server name here>"; this.Icon = new Icon(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("MCSong.Lawl.ico")); txtHost.Text = Server.ZallState; this.Show(); this.BringToFront(); WindowState = FormWindowState.Normal; s = new Server(); s.OnLog += WriteLine; s.OnLogAdmin += WriteAdmin; s.OnLogOp += WriteOp; s.OnLogPublic += WritePublic; s.OnCommand += newCommand; s.OnError += newError; s.OnSystem += newSystem; foreach (TabPage tP in tabControl1.TabPages) tabControl1.SelectTab(tP); tabControl1.SelectTab(tabControl1.TabPages[0]); s.HeartBeatFail += HeartBeatFail; s.OnURLChange += UpdateUrl; s.OnPlayerListChange += UpdateClientList; s.OnSettingsUpdate += SettingsUpdate; s.Start(); notifyIcon1.Text = ("MCSong Server: " + Server.name); this.notifyIcon1.ContextMenuStrip = this.iconContext; this.notifyIcon1.Icon = this.Icon; this.notifyIcon1.Visible = true; this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseClick); System.Timers.Timer MapTimer = new System.Timers.Timer(10000); MapTimer.Elapsed += delegate { UpdateMapList("'"); }; MapTimer.Start(); System.Timers.Timer maintTimer = new System.Timers.Timer(10000); maintTimer.Elapsed += delegate { lblMaintenance.Visible = Server.maintenanceMode; lblMaintenance.Update(); }; maintTimer.Start(); //if (File.Exists(Logger.ErrorLogPath)) //txtErrors.Lines = File.ReadAllLines(Logger.ErrorLogPath); changelogUpdate(); SettingsUpdate(); }
public static void Main(string[] args) { if (Process.GetProcessesByName("MCSong").Length != 1) { foreach (Process pr in Process.GetProcessesByName("MCSong")) { if (pr.MainModule.BaseAddress == Process.GetCurrentProcess().MainModule.BaseAddress) if (pr.Id != Process.GetCurrentProcess().Id) pr.Kill(); } } PidgeonLogger.Init(); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(Program.GlobalExHandler); Application.ThreadException += new ThreadExceptionEventHandler(Program.ThreadExHandler); bool skip = false; remake: try { if (!File.Exists("Viewmode.cfg") || skip) { StreamWriter SW = new StreamWriter(File.Create("Viewmode.cfg")); SW.WriteLine("#This file controls how the console window is shown to the server host"); SW.WriteLine("#cli: True or False (Determines whether a CLI interface is used) (Set True if on Mono)"); SW.WriteLine("#high-quality: True or false (Determines whether the GUI interface uses higher quality objects)"); SW.WriteLine(); SW.WriteLine("cli = false"); SW.WriteLine("high-quality = true"); SW.Flush(); SW.Close(); SW.Dispose(); } if (File.ReadAllText("Viewmode.cfg") == "") { skip = true; goto remake; } string[] foundView = File.ReadAllLines("Viewmode.cfg"); if (foundView[0][0] != '#') { skip = true; goto remake; } if (foundView[4].Split(' ')[2].ToLower() == "true") { Server s = new Server(); s.OnLog += Console.WriteLine; s.OnCommand += Console.WriteLine; s.OnSystem += Console.WriteLine; s.Start(); Console.Title = Server.name + " - MCSong Version: " + Server.Version; usingConsole = true; handleComm(Console.ReadLine()); //Application.Run(); } else { IntPtr hConsole = GetConsoleWindow(); if (IntPtr.Zero != hConsole) { ShowWindow(hConsole, 0); } UpdateCheck(true); if (foundView[5].Split(' ')[2].ToLower() == "true") { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); } updateTimer.Elapsed += delegate { UpdateCheck(); }; updateTimer.Start(); Application.Run(new MCSong.GUI.Window()); } } catch (Exception e) { Server.ErrorLog(e); return; } }