public override void Execute() { ply.SendMessage("Starting Rollback: Radius:" + args.radius + " Since: " + args.since, Color.Green); var database = LogTile.DB; String query = "SELECT * FROM LogTile WHERE X BETWEEN @0 AND @1 AND Y BETWEEN @2 and @3 AND Date > @4 ORDER BY id ASC;"; var events = new List <TileEvent>(); using (var reader = database.QueryReader(query, ply.TileX - args.radius, ply.TileX + args.radius, ply.TileY - args.radius, ply.TileY + args.radius, (LogTile.helper.GetTime() - args.since))) { while (reader.Read()) { var e = new TileEvent(reader.Get <int>("X"), reader.Get <int>("Y"), LogTile.helper.INTtoString(reader.Get <int>("IP")), reader.Get <string>("Name"), LogTile.helper.getAction(reader.Get <int>("Action")), reader.Get <int>("TileType"), (long)reader.Get <int>("Date")); events.Add(e); } } List <TileEvent> rollback = new List <TileEvent>(); foreach (var ev in events) { if (!rollback.Contains(ev)) { rollback.Add(ev); } } foreach (var evt in rollback) { if (LogTile.helper.getAction(evt.GetAction()) == Action.BREAK) { Main.tile[evt.GetX(), evt.GetY()].type = (byte)evt.GetTileType(); Main.tile[evt.GetX(), evt.GetY()].active = true; } else { Main.tile[evt.GetX(), evt.GetY()].active = false; } TSPlayer.All.SendTileSquare(evt.GetX(), evt.GetY(), 1); } ply.SendMessage("Rollback Complete: Tiles Rolled Back: " + rollback.Count, Color.Green); }
public override void Execute() { var database = LogTile.DB; String query = "SELECT * FROM LogTile WHERE X BETWEEN @0 AND @1 AND Y BETWEEN @2 and @3 AND Date > @4 ORDER BY id DESC;"; var events = new List <TileEvent>(); using (var reader = database.QueryReader(query, ply.TileX - args.radius, ply.TileX + args.radius, ply.TileY - args.radius, ply.TileY + args.radius, (LogTile.helper.GetTime() - args.since))) { while (reader.Read()) { var e = new TileEvent(reader.Get <int>("X"), reader.Get <int>("Y"), LogTile.helper.INTtoString(reader.Get <int>("IP")), reader.Get <string>("Name"), LogTile.helper.getAction(reader.Get <int>("Action")), reader.Get <int>("TileType"), reader.Get <int>("Date")); events.Add(e); } } if (args.page <= 0) { ply.SendMessage("There are " + Math.Ceiling(events.Count / 7.0) + " pages. (" + events.Count + "edits)"); for (var i = 0; i < Math.Min(6, events.Count); i++) { ply.SendMessage(events[i].parseEvent()); } } else if (events.Count > 0) { for (var i = ((args.page - 1) * 7) - 1; i < Math.Min(args.page * 7 - 1, events.Count); i++) { ply.SendMessage(events[i].parseEvent()); } } else { ply.SendMessage("No results found.", Color.Green); } ply.SendMessage("Edits made: " + events.Count, Color.Green); }
private void ParseData(GetDataEventArgs args) { try { PacketTypes packet = args.MsgID; using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length)) { TSPlayer player = TShock.Players[args.Msg.whoAmI]; var name = player.Name; if (player.IsLoggedIn) { name = player.UserAccountName; } switch (packet) { case PacketTypes.Tile: { byte type = data.ReadInt8(); int x = data.ReadInt32(); int y = data.ReadInt32(); bool fail = true; Action act; if (type == 0 || type == 2 || type == 4) { act = Action.BREAK; } else if (type == 1 || type == 3) { act = Action.PLACE; } else { act = Action.ERROR; } byte tileType = 0; if (act == Action.BREAK) { tileType = Main.tile[x, y].type; fail = data.ReadBoolean(); } else if (act == Action.PLACE) { tileType = data.ReadInt8(); fail = false; } if (act != Action.ERROR && !fail) { TileEvent evt = new TileEvent(x, y, name, player.IP, act, tileType, LogTile.helper.GetTime()); queue.Enqueue(evt); } break; } case PacketTypes.TileKill: { int x = data.ReadInt32(); int y = data.ReadInt32(); TileEvent evt = new TileEvent(x, y, name, player.IP, Action.BREAK, 0x15, LogTile.helper.GetTime()); queue.Enqueue(evt); break; } case PacketTypes.ChestOpen: { int chestID = data.ReadInt16(); int x = data.ReadInt32(); int y = data.ReadInt32(); int curChest = 0; if (!chestMap.TryGetValue(player, out curChest)) // chest being opened { chestMap.Add(player, chestID); itemMap.Add(player, Main.chest[chestID].item); } else // chest is being closed { chestMap.Remove(player); itemMap.Remove(player); } break; } case PacketTypes.ChestItem: { int chestID = data.ReadInt16(); byte itemSlot = data.ReadInt8(); byte stack = data.ReadInt8(); int curChest = 0; int type = itemMap[player][itemSlot].type; if (LogTile.enableDebugOutput) { Console.WriteLine(type); } Item[] curItems = Main.chest[chestID].item; if (LogTile.enableDebugOutput) { Console.WriteLine(curItems[itemSlot].type); } itemMap.Remove(player); itemMap.Add(player, curItems); break; } case PacketTypes.ChestGetContents: { int x = data.ReadInt32(); int y = data.ReadInt32(); if (LogTile.enableDebugOutput) { Console.WriteLine("GETChestContents: (" + x + ", " + y + ")"); } break; } case PacketTypes.SignNew: { int id = data.ReadInt16(); int x = data.ReadInt32(); int y = data.ReadInt32(); string text = data.ReadString(); break; } } } } catch (Exception e) { Console.WriteLine(e.Message); } }