示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
            }
        }