コード例 #1
0
ファイル: Stat_Main.cs プロジェクト: CAWCAWCAW/Statistics
        public void GetData(GetDataEventArgs args)
        {
            PacketTypes type = args.MsgID;
            var player = TShock.Players[args.Msg.whoAmI];

            if (player == null)
            {
                args.Handled = true;
                return;
            }

            if (!player.ConnectionAlive)
            {
                args.Handled = true;
                return;
            }

            using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
            {
                try
                {
                    if (GetDataHandlers.HandlerGetData(type, player, data))
                        args.Handled = true;
                }
                catch (Exception ex)
                {
                    Log.ConsoleError(ex.ToString());
                }
            }
        }
コード例 #2
0
ファイル: VKMain.cs プロジェクト: GitFlip/Votekick
        private void GetData(GetDataEventArgs e)
        {
            PacketTypes type = e.MsgID;
            var player = TShock.Players[e.Msg.whoAmI];
            if (player == null)
            {
                e.Handled = true;
                return;
            }

            if (!player.ConnectionAlive)
            {
                e.Handled = true;
                return;
            }

            using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
            {
                try
                {
                    if (GetDataHandlers.HandlerGetData(type, player, data))
                        e.Handled = true;
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
        }
コード例 #3
0
ファイル: ItemThreshold.cs プロジェクト: Tygra/ItemThreshold
        private void GetData(GetDataEventArgs args)
        {
            if (args.MsgID == PacketTypes.ItemDrop)
            {
                var num = args.Index;
                var TPlayer = Main.player[args.Msg.whoAmI];
                int ItemID = BitConverter.ToInt16(args.Msg.readBuffer, num);
                if (ItemID == 400)
                {
                    if (Exceeded.Contains(args.Msg.whoAmI))
                    {
                        args.Handled = true;
                        return;
                    }

                    if (Thresholds[args.Msg.whoAmI] > Threshold)
                    {
                        Exceeded.Add(args.Msg.whoAmI);
                        Thresholds[args.Msg.whoAmI] = 0;
                        args.Handled = true;
                    }
                    else Thresholds[args.Msg.whoAmI]++;
                }
            }
        }
コード例 #4
0
ファイル: MazesPlugin.cs プロジェクト: Jewsus/Mazes
		void OnGetData(GetDataEventArgs e)
		{
			if (!e.Handled && e.MsgID == PacketTypes.Tile)
			{
				PlayerInfo info = Players[e.Msg.whoAmI];
				if (info.pt != 0)
				{
					int X = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 1);
					int Y = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 5);
					if (X >= 0 && Y >= 0 && X < Main.maxTilesX && Y < Main.maxTilesY)
					{
						if (info.pt == 1)
						{
							info.x = X;
							info.y = Y;
							TShock.Players[e.Msg.whoAmI].SendMessage(String.Format("Set point 1.", X, Y), Color.Yellow);
						}
						else
						{
							info.x2 = X;
							info.y2 = Y;
							TShock.Players[e.Msg.whoAmI].SendMessage(String.Format("Set point 2.", X, Y), Color.Yellow);
						}
						info.pt = 0;
						e.Handled = true;
						TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 3);
					}
				}
			}
		}
コード例 #5
0
ファイル: SignProtect.cs プロジェクト: bippity/SignProtect
        public void GetData(GetDataEventArgs e)
        {
            if (e.MsgID == PacketTypes.SignNew)
            {
                if (enabled)
                {
                    try
                    {
                        using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                        {
                            var reader = new BinaryReader(data);
                            int x = reader.ReadInt16();
                            int y = reader.ReadInt16();
                            reader.Close();

                            int id = Terraria.Sign.ReadSign(x, y);
                            TSPlayer player = TShock.Players[e.Msg.whoAmI];

                            if (!player.Group.HasPermission("signprotect.edit"))
                            {
                                player.SendErrorMessage("[SignProtect] You do not have permission to edit this sign.");
                                e.Handled = true;
                                return;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                    }
                }
            }
        }
コード例 #6
0
ファイル: Plugin.cs プロジェクト: WhiteXZ/Slime2Infinity
        private void OnGetData(GetDataEventArgs e)
        {
            if (e.MsgID != PacketTypes.NpcStrike)
            {
                return;
            }

            using (MemoryStream data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length - 1))
            {
                var id = data.ReadInt16();
                var dmg = data.ReadInt16();
                data.ReadSingle();
                data.ReadByte();
                data.ReadByte();

                if (id < 0 || id > Main.maxNPCs)
                {
                    return;
                }

                NPC npc = Main.npc[id];
                if (npc == null)
                {
                    return;
                }

                if (npc.type != NPCID.KingSlime || !npc.active)
                {
                    return;
                }
                if (dmg <= 0)
                {
                    return;
                }

                if (Main.rand == null)
                {
                    Main.rand = new Random((int)DateTime.Now.Ticks);
                }

                for (int i = 0; i < 20; i++)
                {
                    int amt = 4 + Main.rand.Next(1, 5);

                    for (int j = 0; j < amt; j++)
                    {
                        int x = (int)npc.position.X + Main.rand.Next(-80, 81);
                        int y = (int)npc.position.Y + Main.rand.Next(-80, 81);
                        NPC.NewNPC(x, y, NPCID.BlueSlime, 0);
                    }
                }
            }
        }
コード例 #7
0
ファイル: WorldEdit.cs プロジェクト: Marcus101RR/WorldEdit
		void OnGetData(GetDataEventArgs e)
		{
			if (!e.Handled && e.MsgID == PacketTypes.Tile)
			{
				PlayerInfo info = TShock.Players[e.Msg.whoAmI].GetPlayerInfo();
				if (info.Point != 0)
				{
					using (var reader = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
					{
						reader.ReadByte();
						int x = reader.ReadInt16();
						int y = reader.ReadInt16();
						if (x >= 0 && y >= 0 && x < Main.maxTilesX && y < Main.maxTilesY)
						{
							if (info.Point == 1)
							{
								info.X = x;
								info.Y = y;
								TShock.Players[e.Msg.whoAmI].SendInfoMessage("Set point 1.");
							}
							else if (info.Point == 2)
							{
								info.X2 = x;
								info.Y2 = y;
								TShock.Players[e.Msg.whoAmI].SendInfoMessage("Set point 2.");
							}
							else if (info.Point == 3)
							{
								List<string> regions = TShock.Regions.InAreaRegionName(x, y).ToList();
								if (regions.Count == 0)
								{
									TShock.Players[e.Msg.whoAmI].SendErrorMessage("No region exists there.");
									return;
								}
								Region curReg = TShock.Regions.GetRegionByName(regions[0]);
								info.X = curReg.Area.Left;
								info.Y = curReg.Area.Top;
								info.X2 = curReg.Area.Right;
								info.Y2 = curReg.Area.Bottom;
								TShock.Players[e.Msg.whoAmI].SendInfoMessage("Set region.");
							}
							info.Point = 0;
							e.Handled = true;
							TShock.Players[e.Msg.whoAmI].SendTileSquare(x, y, 3);
						}
					}
				}
			}
		}
コード例 #8
0
        private void OnGetData(GetDataEventArgs args)
        {
            if (args.Handled)
                return;

            TSPlayer tsplr = TShock.Players[args.Msg.whoAmI];

            if (args.MsgID == PacketTypes.Teleport)
            {
                if (tsplr.CurrentRegion != null && Database.IsNoTpRegion(tsplr.CurrentRegion.Name))
                {
                    tsplr.SendErrorMessage("You cannot teleport while in this region!");
                    tsplr.Teleport(tsplr.X, tsplr.Y);
                }
            }
        }
コード例 #9
0
ファイル: AntiWoF.cs プロジェクト: MarioE/AntiWoF
 void OnGetData(GetDataEventArgs e)
 {
     if (!e.Handled)
     {
         if (e.MsgID == PacketTypes.NpcItemStrike)
         {
             NPC npc = Main.npc[BitConverter.ToInt16(e.Msg.readBuffer, e.Index)];
             Player plr = Main.player[e.Msg.readBuffer[e.Index + 2]];
             if (npc.realLife >= 0)
             {
                 npc = Main.npc[npc.realLife];
             }
             if (npc.active && npc.type == 113)
             {
                 double dmg = Main.CalculateDamage(plr.inventory[plr.selectedItem].damage, npc.defense);
                 if (npc.life - dmg <= 0)
                 {
                     NetMessage.SendData(25, -1, -1, "Wall of Flesh has been defeated!", 255, 175, 75, 255);
                     npc.active = false;
                     e.Handled = true;
                 }
             }
         }
         else if (e.MsgID == PacketTypes.NpcStrike)
         {
             NPC npc = Main.npc[BitConverter.ToInt16(e.Msg.readBuffer, e.Index)];
             if (npc.realLife >= 0)
             {
                 npc = Main.npc[npc.realLife];
             }
             if (npc.active && npc.type == 113)
             {
                 double dmg = Main.CalculateDamage(BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2), npc.defense);
                 if (e.Msg.readBuffer[e.Index + 9] != 0)
                 {
                     dmg *= 2;
                 }
                 if (npc.life - dmg <= 0)
                 {
                     NetMessage.SendData(25, -1, -1, "Wall of Flesh has been defeated!", 255, 175, 75, 255);
                     npc.active = false;
                     e.Handled = true;
                 }
             }
         }
     }
 }
コード例 #10
0
 private void OnGetData(GetDataEventArgs e)
 {
     if (e.MsgID == PacketTypes.ItemDrop)
     {
         if (!e.Handled)
         {
             TSPlayer player = TShock.Players[e.Msg.whoAmI];
             if (!player.Group.HasPermission("geldar.admin"))
             {
                 player.SendErrorMessage("You are not allowed to drop items on the server!");
                 player.SendErrorMessage("Rebind your drop key to avoid the destruction of more items.");
                 player.SendErrorMessage("We will not refund any lost items");
             }
             e.Handled = true;
             return;
         }
     }
 }
コード例 #11
0
ファイル: main.cs プロジェクト: UB1AFU/RodHealer
        private void OnGetData(GetDataEventArgs e)
        {
            if (e.Handled)
                return;

            if (e.MsgID == PacketTypes.Teleport)
            {
                TSPlayer player = TShock.Players[e.Msg.whoAmI];
                if (player != null)
                {
                    if (player.Group.HasPermission("rodhealer.ignoredamage"))
                    {
                        List<int> buffs = new List<int>(player.TPlayer.buffType);
                        if (buffs.Contains(88))
                        {
                            player.Heal(player.TPlayer.statLifeMax2 / 7);
                        }
                    }
                }
            }
        }
コード例 #12
0
ファイル: HoneySucks.cs プロジェクト: Jewsus/HoneySucks
        void OnGetData(GetDataEventArgs args)
        {
            if (!doesHoneySuck)
                return;

            if (!args.Handled && args.MsgID == PacketTypes.Tile)
            {
                using (var reader = new BinaryReader(new MemoryStream(args.Msg.readBuffer, args.Index, args.Length)))
                {
                    var action = reader.ReadByte();
                    var x = reader.ReadInt16();
                    var y = reader.ReadInt16();
                    var type = reader.ReadUInt16();

                    //when this tile is destroyed...
                    if (Main.tile[x, y].type != 225)
                        return;

                    if (action == 0)
                    {
                        //remove the tile from play instead of sending to the graveyard...
                        Main.tile[x, y].active(false);
                        Main.tile[x, y].frameX = -1;
                        Main.tile[x, y].frameY = -1;
                        Main.tile[x, y].liquidType(0);
                        Main.tile[x, y].liquid = 0;
                        Main.tile[x, y].type = 0;
                        TSPlayer.All.SendTileSquare(x, y);
                        TShock.Players[args.Msg.whoAmI].SendTileSquare(x, y);

                        //and special summon honey block to the field
                        Item itm = new Item();
                        itm.SetDefaults(1125);
                        int itemid = Item.NewItem(x * 16, y * 16, itm.width, itm.height, itm.type, 1, true, 0, true);
                        NetMessage.SendData((int)PacketTypes.ItemDrop, -1, -1, "", itemid, 0f, 0f, 0f);
                    }
                }
            }
        }
コード例 #13
0
ファイル: AbsMain.cs プロジェクト: WhiteXZ/AutoBoss
        private void OnGetData(GetDataEventArgs args)
        {
            //Restart boss timers if time is set
            if (args.MsgID != PacketTypes.TimeSet)
            {
                return;
            }

            bool day = config.BossToggles[BattleType.Day];
            bool night = config.BossToggles[BattleType.Night];
            bool special = config.BossToggles[BattleType.Special];

            Timers.StartBosses(day, night, special);
        }
コード例 #14
0
        private void NetHooks_GetData(GetDataEventArgs e)
        {
            if (e == null || this.isDisposed || e.Handled)
            return;

              TSPlayer player = TShock.Players[e.Msg.whoAmI];
              if (player == null)
            return;

              try {
            switch (e.MsgID) {
              case PacketTypes.Tile: {
            if (this.TileEdit == null)
              break;

            int editType = e.Msg.readBuffer[e.Index];
            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y) || editType > 14)
              return;

            int blockType = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5);
            int objectStyle = e.Msg.readBuffer[e.Index + 7];

            e.Handled = this.OnTileEdit(
              new TileEditEventArgs(player, (TileEditType)editType, new DPoint(x, y), (BlockType)blockType, objectStyle
            ));
            break;
              }
              case PacketTypes.PlaceObject: {
            if (this.ObjectPlacement == null && this.TileEdit == null)
              break;

            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y))
              return;

            int blockType = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4);
            int objectStyle = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6);
            int alternative = e.Msg.readBuffer[e.Index + 8];
            int random = ((sbyte) e.Msg.readBuffer[e.Index + 9]);
            bool direction = BitConverter.ToBoolean(e.Msg.readBuffer, e.Index + 10);

            if (this.InvokeTileOnObjectPlacement) {
              e.Handled = this.OnTileEdit(
                new TileEditEventArgs(player, TileEditType.PlaceTile, new DPoint(x, y), (BlockType)blockType, objectStyle
              ));
            }

            if (!e.Handled) {
              e.Handled = this.OnObjectPlacement(
                new ObjectPlacementEventArgs(player, new DPoint(x, y), (BlockType)blockType, objectStyle, alternative, random, direction
              ));
            }

            break;
              }
              // Note: As for TileKill and TileKillNoItem, blockId will be of "1" if the player attempted to destroy
              // a tile but didn't succeed yet, and will be of "0" as the tile is actually destroyed.
              // However, there's one exception with Chests, they will never send their actual destroy packet, except a hack
              // tool is used, it seems.
              case PacketTypes.TileKill: {
            int type = e.Msg.readBuffer[e.Index];
            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y))
              break;

            int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5);

            if (type == 0 || type == 2) { // Chest placement / Dresser Placement
              e.Handled = this.OnChestPlace(new ChestPlaceEventArgs(player, new DPoint(x, y), type, style));
            } else { // Chest kill
              int tileType = TerrariaUtils.Tiles[x, y].type;
              if (tileType != TileID.Containers && tileType != TileID.Dressers)
                break;

              if (this.InvokeTileEditOnChestKill)
                e.Handled = this.OnTileEdit(new TileEditEventArgs(player, TileEditType.TileKill, new DPoint(x, y), 0, 0));

              if (!e.Handled)
                e.Handled = this.OnChestKill(new TileLocationEventArgs(player, new DPoint(x, y)));
            }

            break;
              }
              case PacketTypes.ChestOpen: {
            if (this.ChestOpen == null && this.ChestRename == null)
              break;

            int chestIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4);

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y))
              break;

            int nameLength = e.Msg.readBuffer[e.Index + 6];

            string newName = string.Empty;
            if ((nameLength > 0 && nameLength <= 20) || nameLength == 255) { // Name change requested?
              if (nameLength != 255)
                newName = Encoding.UTF8.GetString(e.Msg.readBuffer, e.Index + 8, nameLength);

              e.Handled = this.OnChestRename(new ChestRenameEventArgs(player, chestIndex, newName));
            }

            if (!e.Handled)
              e.Handled = this.OnChestOpen(new ChestOpenEventArgs(player, chestIndex, new DPoint(x, y)));

            break;
              }
              case PacketTypes.ChestGetContents: {
            if (this.ChestGetContents == null)
              break;

            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y) || !Main.tile[x, y].active())
              return;

            e.Handled = this.OnChestGetContents(new TileLocationEventArgs(player, new DPoint(x, y)));
            break;
              }
              case PacketTypes.ChestItem: {
            if (this.ChestModifySlot == null)
              break;

            int chestIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int slotIndex = e.Msg.readBuffer[e.Index + 2];
            int itemStackSize = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);
            ItemPrefix itemPrefix = (ItemPrefix)e.Msg.readBuffer[e.Index + 5];
            ItemType itemType = (ItemType)BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6);

            if (chestIndex >= Main.chest.Length || slotIndex > 39)
              break;

            e.Handled = this.OnChestModifySlot(new ChestModifySlotEventArgs(
              player, chestIndex, slotIndex, new ItemData(itemPrefix, itemType, itemStackSize)
            ));
            break;
              }
              case PacketTypes.SignNew: {
            if (this.SignEdit == null)
              break;

            int signIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4);
            string newText;
            using (MemoryStream stream = new MemoryStream(e.Msg.readBuffer, e.Index + 6, e.Length - 7))
              newText = new BinaryReader(stream).ReadString();

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y) || !Main.tile[x, y].active())
              return;

            e.Handled = this.OnSignEdit(new SignEditEventArgs(player, signIndex, new DPoint(x, y), newText));
            break;
              }
              case PacketTypes.SignRead: {
            if (this.SignRead == null)
              break;

            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y))
              break;

            e.Handled = this.OnSignRead(new TileLocationEventArgs(player, new DPoint(x, y)));
            break;
              }
              case PacketTypes.HitSwitch: {
            if (this.HitSwitch == null)
              break;

            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y) || !Main.tile[x, y].active())
              return;

            // For some reason, TShock doesn't handle this packet so we just do our own checks.
            if (TShock.CheckIgnores(player))
              return;
            if (TShock.CheckRangePermission(player, x, y, 32))
              return;

            e.Handled = this.OnHitSwitch(new TileLocationEventArgs(player, new DPoint(x, y)));
            break;
              }
              case PacketTypes.SpawnBossorInvasion: {
            if (this.BossSpawn == null)
              break;

            //int playerIndex = BitConverter.ToInt32(e.Msg.readBuffer, e.Index);
            int bossType = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);

            e.Handled = this.OnBossSpawn(new BossSpawnEventArgs(player, (BossType)bossType));
            break;
              }
              case PacketTypes.ItemDrop:
              case PacketTypes.UpdateItemDrop: {
            if (this.ItemUpdate == null)
              break;

            int itemIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            float x = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 2);
            float y = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 6);
            float velocityX = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 10);
            float velocityY = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 14);
            int itemStackSize = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 18);
            ItemPrefix itemPrefix = (ItemPrefix)e.Msg.readBuffer[e.Index + 20];
            bool noDelay = (e.Msg.readBuffer[e.Index + 21] != 0);
            ItemType itemType = (ItemType)BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 22);

            // If it is actually an item pick up, then ensure a valid item index.
            if (itemType == 0 && (itemIndex < 0 || itemIndex >= Main.item.Length))
              break;

            e.Handled = this.OnItemUpdate(new ItemUpdateEventArgs(
              player, itemIndex, new Vector2(x, y), new Vector2(velocityX, velocityY),
              noDelay, new ItemData(itemPrefix, itemType, itemStackSize)
            ));
            break;
              }
              case PacketTypes.ItemOwner: {
            if (this.ItemOwner == null)
              break;

            int itemIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int newOwnerPlayerIndex = e.Msg.readBuffer[e.Index + 2];
            TSPlayer newOwner;
            if (newOwnerPlayerIndex < 255)
              newOwner = TShock.Players[newOwnerPlayerIndex];
            else
              break;

            e.Handled = this.OnItemOwner(new ItemOwnerEventArgs(player, itemIndex, newOwner));
            break;
              }
              case PacketTypes.ForceItemIntoNearestChest: {
            if (this.QuickStackNearby == null)
              break;

            int slotIndex = e.Msg.readBuffer[e.Index];
            if (slotIndex >= TSPlayer.Server.TPlayer.inventory.Length)
              break;

            e.Handled = this.OnQuickStackNearby(new PlayerSlotEventArgs(player, slotIndex));
            break;
              }
              case PacketTypes.PlayerSlot: {
            if (this.PlayerModifySlot == null)
              break;

            //byte playerIndex = e.Msg.readBuffer[e.Index];
            int slotIndex = e.Msg.readBuffer[e.Index + 1];
            int itemStackSize = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
            ItemPrefix itemPrefix = (ItemPrefix)e.Msg.readBuffer[e.Index + 4];
            ItemType itemType = (ItemType)BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5);

            Player tServerPlayer = TSPlayer.Server.TPlayer;
            if (slotIndex >= tServerPlayer.inventory.Length + tServerPlayer.bank.item.Length + tServerPlayer.bank2.item.Length)
              break;

            e.Handled = this.OnPlayerModifySlot(new PlayerModifySlotEventArgs(
              player, slotIndex, new ItemData(itemPrefix, itemType, itemStackSize)
            ));
            break;
              }
              case PacketTypes.LiquidSet: {
            if (this.LiquidSet == null)
              break;

            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y))
              break;

            int liquidAmount = e.Msg.readBuffer[e.Index + 4];
            LiquidKind liquidKind = (LiquidKind)e.Msg.readBuffer[e.Index + 5];

            e.Handled = this.OnLiquidSet(new LiquidSetEventArgs(player, new DPoint(x, y), liquidAmount, liquidKind));
            break;
              }
              case PacketTypes.DoorUse: {
            if (this.DoorUse == null)
              break;

            byte action = e.Msg.readBuffer[e.Index];
            int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
            int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);

            if (!TerrariaUtils.Tiles.IsValidCoord(x, y))
              break;

            int direction = e.Msg.readBuffer[e.Index + 5];

            Direction actualDirection = Direction.Right;
            if (direction == 0)
              actualDirection = Direction.Left;

            e.Handled = this.OnDoorUse(new DoorUseEventArgs(player, new DPoint(x, y), (DoorAction)action, actualDirection));
            break;
              }
              case PacketTypes.PlayerSpawn: {
            if (this.PlayerSpawn == null)
              break;

            int playerIndex = e.Msg.readBuffer[e.Index];
            int spawnX = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
            int spawnY = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);

            if (!TerrariaUtils.Tiles.IsValidCoord(spawnX, spawnY))
              break;

            e.Handled = this.OnPlayerSpawn(new PlayerSpawnEventArgs(player, new DPoint(spawnX, spawnY)));
            break;
              }
              // Note: Also door unlock
              case PacketTypes.ChestUnlock: {
            if (this.ChestUnlock == null)
              break;

            UnlockType unlockType = (UnlockType)e.Msg.readBuffer[e.Index];
            int chestX = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
            int chestY = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);

            if (!TerrariaUtils.Tiles.IsValidCoord(chestX, chestY))
              break;

            e.Handled = this.OnChestUnlock(new UnlockEventArgs(player, new DPoint(chestX, chestY), unlockType));
            break;
              }
              case PacketTypes.ChatText: {
            if (this.ChatText == null)
              break;

            short playerIndex = e.Msg.readBuffer[e.Index];
            if (playerIndex != e.Msg.whoAmI)
              break;

            int colorR = e.Msg.readBuffer[e.Index + 1];
            int colorG = e.Msg.readBuffer[e.Index + 2];
            int colorB = e.Msg.readBuffer[e.Index + 3];
            string text = Encoding.UTF8.GetString(e.Msg.readBuffer, e.Index + 4, e.Length - 5);

            e.Handled = this.OnChatText(new ChatTextEventArgs(player, new Color(colorR, colorG, colorB), text));
            break;
              }
              case PacketTypes.TileSendSquare: {
            if (this.SendTileSquare == null)
              break;

            int size = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int tileX = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
            int tileY = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4);

            if (!TerrariaUtils.Tiles.IsValidCoord(tileX, tileY))
              break;

            e.Handled = this.OnSendTileSquare(new SendTileSquareEventArgs(player, new DPoint(tileX, tileY), size));
            break;
              }
              case PacketTypes.PaintTile: {
            if (this.TilePaint == null)
              break;

            int tileX = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int tileY = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);

            if (!TerrariaUtils.Tiles.IsValidCoord(tileX, tileY))
              break;

            int color = e.Msg.readBuffer[e.Index + 8];

            e.Handled = this.OnTilePaint(new TilePaintEventArgs(player, new DPoint(tileX, tileY), (PaintColor)color));
            break;
              }
              case PacketTypes.PlayerKillMe: {
            if (this.PlayerDeath == null)
              break;

            int playerIndex = e.Msg.readBuffer[e.Index];
            int direction = e.Msg.readBuffer[e.Index + 1];
            int dmg = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
            bool pvp = e.Msg.readBuffer[e.Index + 4] != 0;
            string deathText = Encoding.UTF8.GetString(e.Msg.readBuffer, e.Index + 6, e.Length - 7);

            e.Handled = this.OnPlayerDeath(new PlayerDeathEventArgs(player, direction, dmg, pvp, deathText));
            break;
              }
              case PacketTypes.Teleport: {
            if (this.Teleport == null)
              break;

            BitsByte flags = e.Msg.readBuffer[e.Index];
            int playerIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
            float x = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 3);
            float y = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 7);
            Vector2 destLocation = new Vector2(x, y);

            TeleportType tpType = TeleportType.PlayerToPos;
            if (flags[0])
              tpType = TeleportType.NpcToPos;
            if (flags[1]) {
              if (flags[0])
                tpType = TeleportType.Unknown;
              else
                tpType = TeleportType.PlayerNearPlayerWormhole;
            }

            e.Handled = this.OnTeleport(new TeleportEventArgs(player, destLocation, tpType));
            break;
              }
              case PacketTypes.NpcStrike: {
            if (this.NpcTookDamage == null)
              break;

            int npcIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
            int damage = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
            float knockback = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 4);
            int hitDirection = e.Msg.readBuffer[e.Index + 8] - 1; // 1 left, -1 right
            bool isCritical = (e.Msg.readBuffer[e.Index + 9] == 1);

            e.Handled = this.OnNpcTookDamage(new NpcTookDamageEventArgs(player, npcIndex, damage, knockback, hitDirection, isCritical));
            break;
              }
            }
              } catch (Exception ex) {
            ServerApi.LogWriter.PluginWriteLine(
              this.Plugin, string.Format("Internal error on handling data packet {0}. Exception details: \n{1}", e.MsgID, ex), TraceLevel.Error
            );
              }
        }
コード例 #15
0
        void OnGetData(GetDataEventArgs e)
        {
            #region PlayerHP
            try
            {
                if (e.MsgID == PacketTypes.PlayerHp)
                {
                    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        var reader = new BinaryReader(data);
                        var playerID = reader.ReadByte();
                        var HP = reader.ReadInt16();
                        var MaxHP = reader.ReadInt16();

                        if (Utils.GetPlayers((int)playerID) != null)
                        {
                            var player = Utils.GetPlayers((int)playerID);

                            if (player.isHeal)
                            {
                                if (HP <= MaxHP / 2)
                                {
                                    player.TSPlayer.Heal(500);
                                    player.TSPlayer.SendSuccessMessage("You just got healed!");
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception x)
            {
                Log.ConsoleError(x.ToString());
            }
            #endregion

            #region PlayerMana
            //else if (e.MsgID == PacketTypes.PlayerMana)
            //{

            //    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
            //    {
            //        var reader = new BinaryReader(data);
            //        var playerID = reader.ReadByte();
            //        var Mana = reader.ReadInt16();
            //        var MaxMana = reader.ReadInt16();

            //        var player = Utils.GetPlayers((int)playerID);

            //        if (player.isHeal)
            //        {
            //            Item star = TShockAPI.TShock.Utils.GetItemById(184);
            //            if (Mana <= MaxMana / 2)
            //            {
            //                TShock.Players[playerID].GiveItem(star.type, star.name, star.width, star.height, star.maxStack);
            //                player.TSPlayer.SendSuccessMessage("Your mana has been restored!!");
            //            }
            //        }
            //    }
            //}
            #endregion

            #region PlayerDamage
            if (e.MsgID == PacketTypes.PlayerDamage)
            {
                try
                {
                    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        var reader = new BinaryReader(data);
                        var ply = reader.ReadByte();
                        var hitDirection = reader.ReadByte();
                        var damage = reader.ReadInt16();

                        if ((damage > config.maxDamage || damage < 0) && !TShock.Players[e.Msg.whoAmI].Group.HasPermission("ignorecheatdetection") && e.Msg.whoAmI != ply)
                        {
                            if (config.maxDamageBan)
                            {
                                TShockAPI.TShock.Utils.Ban(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit.");
                            }
                            else if (config.maxDamageKick)
                            {
                                TShockAPI.TShock.Utils.Kick(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit.");
                            }
                            if (config.maxDamageIgnore)
                            {
                                e.Handled = true;
                            }

                        }
                        //if (viewAll[ply])
                        //{
                        //    e.Handled = true;         //Should remove invincibility while /view'ing people
                        //}
                    }
                }
                catch (Exception x)
                {
                    Log.ConsoleError(x.ToString());
                }
            }
            #endregion

            #region NPCStrike
            if (e.MsgID == PacketTypes.NpcStrike)
            {
                try
                {
                    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        var reader = new BinaryReader(data);
                        var npcID = reader.ReadInt16();
                        var damage = reader.ReadInt16();
                        if ((damage > config.maxDamage || damage < 0) && !TShock.Players[e.Msg.whoAmI].Group.HasPermission("ignorecheatdetection"))
                        {

                            if (config.maxDamageBan)
                            {
                                TShockAPI.TShock.Utils.Ban(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit.");
                            }
                            else if (config.maxDamageKick)
                            {
                                TShockAPI.TShock.Utils.Kick(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit.");
                            }
                            if (config.maxDamageIgnore)
                            {
                                e.Handled = true;
                            }
                        }
                    }
                }
                catch (Exception x)
                {
                    Log.ConsoleError(x.ToString());
                }
            }
            #endregion

            #region PlayerTeam
            try
            {
                if (e.MsgID == PacketTypes.PlayerTeam)
                {
                    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        var reader = new BinaryReader(data);
                        var ply = reader.ReadByte();
                        var team = reader.ReadByte();

                        if (Utils.GetPlayers((int)ply) != null)
                        {
                            var player = Utils.GetPlayers((int)ply);

                            try
                            {
                                switch (team)
                                {
                                    case 1:
                                        if (config.redPass != "")
                                        {
                                            if ((!player.accessRed) && (TShock.Players[ply].Group.Name != "superadmin"))
                                            {
                                                e.Handled = true;
                                                TShock.Players[ply].SendMessage("This team is locked, use /teamunlock red [password] to access it.", Color.Red);
                                                TShock.Players[ply].SetTeam(0);
                                            }
                                        }
                                        break;

                                    case 2:
                                        if (config.greenPass != "")
                                        {
                                            if ((!player.accessGreen) && (TShock.Players[ply].Group.Name != "superadmin"))
                                            {
                                                e.Handled = true;
                                                TShock.Players[ply].SendMessage("This team is locked, use /teamunlock green [password] to access it.", Color.Red);
                                                TShock.Players[ply].SetTeam(0);
                                            }
                                        }
                                        break;

                                    case 3:
                                        if (config.bluePass != "")
                                        {
                                            if ((!player.accessBlue) && (TShock.Players[ply].Group.Name != "superadmin"))
                                            {
                                                e.Handled = true;
                                                TShock.Players[ply].SendMessage("This team is locked, use /teamunlock blue [password] to access it.", Color.Red);
                                                TShock.Players[ply].SetTeam(0);
                                            }
                                        }
                                        break;

                                    case 4:
                                        if (config.yellowPass != "")
                                        {
                                            if ((!player.accessYellow) && (TShock.Players[ply].Group.Name != "superadmin"))
                                            {
                                                e.Handled = true;
                                                TShock.Players[ply].SendMessage("This team is locked, use /teamunlock yellow [password] to access it.", Color.Red);
                                                TShock.Players[ply].SetTeam(0);
                                            }
                                        }
                                        break;
                                }
                            }
                            catch (Exception x)
                            {
                                Log.ConsoleError(x.ToString());
                            }
                        }
                    }
                }
            }
            catch (Exception x)
            {
                Log.ConsoleError(x.ToString());
            }
            #endregion
        }
コード例 #16
0
        void OnGetData(GetDataEventArgs e)
        {
            if (!e.Handled)
            {
                int plr = e.Msg.whoAmI;
                using (var reader = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    switch (e.MsgID)
                    {
                        case PacketTypes.ChestGetContents:
                            {
                                if (Infos[plr].TransactionsLeft > 0)
                                {
                                    e.Handled = true;
                                    return;
                                }
                                int x = reader.ReadInt16();
                                int y = reader.ReadInt16();
                                Task.Factory.StartNew(() => GetChest(x, y, plr)).LogExceptions();
                                e.Handled = true;
                            }
                            break;
                        case PacketTypes.ChestItem:
                            {
                                reader.ReadInt16();
                                byte slot = reader.ReadByte();
                                if (slot > 40)
                                    return;

                                int stack = reader.ReadInt16();
                                byte prefix = reader.ReadByte();
                                int netID = reader.ReadInt16();
                                Infos[plr].TransactionsLeft++;
                                Task.Factory.StartNew(() => ModChest(plr, slot, netID, stack, prefix)).LogExceptions();
                                e.Handled = true;
                            }
                            break;
                        case PacketTypes.ChestOpen:
                            {
                                int action = reader.ReadInt16();
                                int x = reader.ReadInt16();
                                int y = reader.ReadInt16();

                                if (action == -1)
                                {
                                    if (Infos[plr].TransactionsLeft > 0)
                                    {
                                        //user closed the chest, but still have items transferring, close when it finishes.
                                        Infos[plr].ShouldCloseAfterTransactions = true;
                                    }
                                    else
                                    {
                                        Infos[plr].X = -1;
                                        Infos[plr].Y = -1;
                                    }
                                }
                                else if (Infos[plr].TransactionsLeft > 0)
                                {
                                    //the user is still transfering items, they shouldnt be allowed to open another chest until that finishes.
                                    return;
                                }
            #if !MULTI_USE
                                if (Infos.Any(p => p.X == x && p.Y == y))
                                {
                                    //chest is in use, ignore
                                    TShock.Players[plr].SendErrorMessage("This chest is currently open by someone else.");
                                    return;
                                }
            #endif
                                int length = reader.ReadByte();

                                if (length != 0 && length <= 20 && length != 255)
                                    TShock.Players[plr].SendData(PacketTypes.ChestName, "", 0, x, y);
                            }
                            break;
                        case PacketTypes.TileKill:
                            {
                                if (Infos[plr].TransactionsLeft > 0)
                                {
                                    return;
                                }

                                byte action = reader.ReadByte();
                                int x = reader.ReadInt16();
                                int y = reader.ReadInt16();
                                int style = reader.ReadInt16();

                                if (action == 0)
                                {
                                    if (TShock.Regions.CanBuild(x, y, TShock.Players[plr]))
                                    {
                                        Task.Factory.StartNew(() => PlaceChest(x, y, plr)).LogExceptions();
                                        WorldGen.PlaceChest(x, y, 21, false, style);
                                        NetMessage.SendData((int)PacketTypes.TileKill, -1, plr, "", 0, x, y, style, 1);
                                        NetMessage.SendData((int)PacketTypes.TileKill, plr, -1, "", 0, x, y, style, 0);
                                        e.Handled = true;
                                    }
                                }
                                else if (TShock.Regions.CanBuild(x, y, TShock.Players[plr]) && Main.tile[x, y].type == 21)
                                {
                                    if (Main.tile[x, y].frameY % 36 != 0)
                                        y--;
                                    if (Main.tile[x, y].frameX % 36 != 0)
                                        x--;
                                    Task.Factory.StartNew(() => KillChest(x, y, plr)).LogExceptions();
                                    e.Handled = true;
                                }
                            }
                            break;
                    }
                }
            }
        }
コード例 #17
0
        /// <summary>
        /// Occurs when a packet gets sent from a client to the server.
        /// </summary>
        /// <param name="args">Arguments.</param>
        void Net_GetData(GetDataEventArgs args)
        {
            Chain incomingChain = null;
            string packetInfo = null;
            Stopwatch processTimer = null;

            if (enabled == false || (incomingChain = GetIncomingChain()) == null) {
                return;
            }

            processTimer = new Stopwatch();
            processTimer.Start();
            packetInfo = string.Format("{0} len {1} from client slot {2}", args.MsgID.ToString("X"), args.Length, args.Msg.whoAmI);

            THLog.Debug("Packet in: " + packetInfo);
            incomingChain.ProcessChain(ref args, false);
            if (args.Handled == false) {
                THLog.Debug("Packet out: " + packetInfo);
                Interlocked.Increment(ref packetCounter);
            } else {
                Interlocked.Increment(ref handledCounter);
            }

            processTimer.Stop();
            UpdateProcessorStats(processTimer.ElapsedMilliseconds);

            THLog.Debug("Chain process time: {0}ms", processTimer.ElapsedMilliseconds);
        }
コード例 #18
0
ファイル: History.cs プロジェクト: loohney/History
        void OnGetData(GetDataEventArgs e)
        {
            if (!e.Handled)
            {
                switch (e.MsgID)
                {
                    case PacketTypes.PlaceItemFrame:
                        //TSPlayer.All.SendInfoMessage("Placing item frame!");
                        break;
                    case PacketTypes.PlaceTileEntity:
                        //TSPlayer.All.SendInfoMessage("Placing tile entity!");
                        break;
                    case PacketTypes.UpdateTileEntity:
                        //TSPlayer.All.SendInfoMessage("Updating tile entity!");
                        break;
                    case PacketTypes.Tile:
                        {
                            byte etype = e.Msg.readBuffer[e.Index];
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);
                            ushort type = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index + 5);
                            byte style = e.Msg.readBuffer[e.Index + 7];
                            if (type == 1 && (etype == 0 || etype == 4))
                            {
                                if (Main.tile[X, Y].type == 21 || Main.tile[X, Y].type == 88)
                                    return; //Chests and dressers handled separately
                                //else if (Main.tile[X, Y].type == 2699)
                                    //TSPlayer.All.SendInfoMessage("Weapon rack place");
                                    }
                            //DEBUG
                            //TSPlayer.All.SendInfoMessage($"Type: {type}");
                            if (X >= 0 && Y >= 0 && X < Main.maxTilesX && Y < Main.maxTilesY)
                            {
                                if (AwaitingHistory[e.Msg.whoAmI])
                                {
                                    AwaitingHistory[e.Msg.whoAmI] = false;
                                    TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5);
                                    //DEBUG
                                    //TSPlayer.All.SendInfoMessage($"X: {X}, Y: {Y}, FrameX: {Main.tile[X, Y].frameX}, FrameY: {Main.tile[X, Y].frameY}");
                                    e.Handled = true;
                                    //END DEBUG
                                    if (type == 0 && (etype == 0 || etype == 4))
                                        adjustFurniture(ref X, ref Y, ref style);
                                    CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI]));
                                    e.Handled = true;
                                }
                                else if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y))
                                {
                                    //effect only
                                    adjustFurniture(ref X, ref Y, ref style);
                                    if (type == 1 && (etype == 0 || etype == 2 || etype == 4))
                                        return;
                                    logEdit(etype, Main.tile[X, Y], X, Y, type, TShock.Players[e.Msg.whoAmI].User.Name, new List<Vector2>(), style);
                                }
                            }
                        }
                        break;
                    case PacketTypes.PlaceObject:
                        {
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
                            ushort type = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index + 4);
                            int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6);
                            //DEBUG:
                            //TSPlayer.All.SendInfoMessage($"Style: {style}");
                            int alt = (byte)e.Msg.readBuffer[e.Index + 8];
                            //TSPlayer.All.SendInfoMessage($"Alternate: {alt}");
                            int rand = (sbyte)e.Msg.readBuffer[e.Index + 9];
                            //TSPlayer.All.SendInfoMessage($"Random: {rand}");
                            bool dir = BitConverter.ToBoolean(e.Msg.readBuffer, e.Index + 10);
                            if (X >= 0 && Y >= 0 && X < Main.maxTilesX && Y < Main.maxTilesY)
                            {
                                if (AwaitingHistory[e.Msg.whoAmI])
                                {
                                    AwaitingHistory[e.Msg.whoAmI] = false;
                                    TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5);
                                    CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI]));
                                    e.Handled = true;
                                }
                                else if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y))
                                {
                                    logEdit(1, Main.tile[X, Y], X, Y, type, TShock.Players[e.Msg.whoAmI].User.Name, new List<Vector2>(), (byte)style, alt, rand, dir);
                                }
                            }
                        }
                        break;
                    //chest delete
                    case PacketTypes.TileKill:
                        {
                            byte flag = e.Msg.readBuffer[e.Index];
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);
                            int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5);
                            byte style2 = (byte)style;
                            if (X >= 0 && Y >= 0 && X < Main.maxTilesX && Y < Main.maxTilesY)
                            {
                                //PlaceChest
                                if (flag == 0 && regionCheck(TShock.Players[e.Msg.whoAmI], X, Y))
                                {
                                    if (AwaitingHistory[e.Msg.whoAmI])
                                    {
                                        AwaitingHistory[e.Msg.whoAmI] = false;
                                        TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5);
                                        CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI]));
                                        e.Handled = true;
                                    }
                                    else if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y))
                                    {
                                        logEdit(1, Main.tile[X, Y], X, Y, 21, TShock.Players[e.Msg.whoAmI].User.Name, new List<Vector2>(), style2);
                                    }
                                    return;
                                }
                                //KillChest
                                if (flag == 1 && regionCheck(TShock.Players[e.Msg.whoAmI], X, Y) && Main.tile[X, Y].type == 21)
                                {
                                    if (AwaitingHistory[e.Msg.whoAmI])
                                    {
                                        AwaitingHistory[e.Msg.whoAmI] = false;
                                        TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5);
                                        adjustFurniture(ref X, ref Y, ref style2);
                                        CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI]));
                                        e.Handled = true;
                                        return;
                                    }
                                    adjustFurniture(ref X, ref Y, ref style2);
                                    Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 0, Main.tile[X, Y].type, style2, Main.tile[X, Y].color());
                                    return;
                                }
                                //PlaceDresser
                                if (flag == 2 && regionCheck(TShock.Players[e.Msg.whoAmI], X, Y))
                                {
                                    if (AwaitingHistory[e.Msg.whoAmI])
                                    {
                                        AwaitingHistory[e.Msg.whoAmI] = false;
                                        TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5);
                                        CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI]));
                                        e.Handled = true;
                                    }
                                    else if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y))
                                    {
                                        logEdit(1, Main.tile[X, Y], X, Y, 88, TShock.Players[e.Msg.whoAmI].User.Name, new List<Vector2>(), style2);
                                    }
                                    return;
                                }
                                //KillDresser
                                if (flag == 3 && regionCheck(TShock.Players[e.Msg.whoAmI], X, Y) && Main.tile[X, Y].type == 88)
                                {
                                    if (AwaitingHistory[e.Msg.whoAmI])
                                    {
                                        AwaitingHistory[e.Msg.whoAmI] = false;
                                        TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5);
                                        adjustFurniture(ref X, ref Y, ref style2);
                                        CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI]));
                                        e.Handled = true;
                                        return;
                                    }
                                    adjustFurniture(ref X, ref Y, ref style2);
                                    Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 0, Main.tile[X, Y].type, style2, Main.tile[X, Y].color());
                                    return;
                                }

                            }
                        }
                        break;
                    case PacketTypes.PaintTile:
                        {
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
                            byte color = e.Msg.readBuffer[e.Index + 4];
                            if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y))
                            {
                                Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 25, color, 0, Main.tile[X, Y].color());
                            }
                        }
                        break;
                    case PacketTypes.PaintWall:
                        {
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
                            byte color = e.Msg.readBuffer[e.Index + 4];
                            if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y))
                            {
                                Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 26, color, 0, Main.tile[X, Y].wallColor());
                            }
                        }
                        break;
                    case PacketTypes.SignNew:
                        {
                            ushort signI = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index);
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4);
                            byte s = 0;
                            adjustFurniture(ref X, ref Y, ref s); //Adjust coords so history picks it up, readSign() adjusts back to origin anyway
                            Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 27, data: signI, text: Main.sign[signI].text);
                        }
                        break;
                }
            }
        }
コード例 #19
0
ファイル: BH.cs プロジェクト: bippity/BountyHunt
        private void OnGetData(GetDataEventArgs args)
        {
            var player = Utils.GetPlayer(args.Msg.whoAmI);

            #region ItemDrop
            if (args.MsgID == PacketTypes.ItemDrop)
            {
                if (args.Handled || !player.listingReward)
                    return;

                using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
                {
                    Int16 id = data.ReadInt16();
                    float posx = data.ReadSingle();
                    float posy = data.ReadSingle();
                    float velx = data.ReadSingle();
                    float vely = data.ReadSingle();
                    Int16 stacks = data.ReadInt16();
                    int prefix = data.ReadByte();
                    bool nodelay = data.ReadBoolean();
                    Int16 netid = data.ReadInt16();

                    Item item = new Item();
                    item.SetDefaults(netid);

                    Console.WriteLine(String.Join(", ", id, stacks, prefix, netid));

                    if (stacks == 0)
                        return;

                    player.droppedItems.Add(new BHItem(netid, stacks, prefix));
                    player.TSPlayer.SendInfoMessage("{0} {1}{2} has been added to bounty rewards.",
                        stacks,
                        (prefix == 0) ? "" : TShock.Utils.GetPrefixByIdOrName(prefix.ToString())[0].ToString() + " ",
                        item.name);
                    args.Handled = true;
                }
            }
            #endregion

            #region PlayerDamage
            if (args.MsgID == PacketTypes.PlayerDamage)
            {
                if (args.Handled)
                    return;

                using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
                {
                    var playerID = data.ReadByte();
                    var hitDirection = data.ReadByte();
                    var damage = data.ReadInt16();
                    var pvp = data.ReadBoolean();
                    var crit = data.ReadBoolean();

                    Utils.GetPlayer(playerID).killingPlayer = (args.Msg.whoAmI != playerID) ? Utils.GetPlayer(args.Msg.whoAmI) : null;
                }
            }
            #endregion

            #region KillMe
            if (args.MsgID == PacketTypes.PlayerKillMe)
            {
                if (args.Handled)
                    return;

                using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
                {
                    var playerId = data.ReadByte();
                    var hitDirection = data.ReadByte();
                    var damage = data.ReadInt16();
                    var pvp = data.ReadBoolean();

                    var plr = Utils.GetPlayer(playerId);

                    if (plr.killingPlayer != null)
                    {
                        var killer = plr.killingPlayer;
                        if (pvp)
                        {
                            if (Utils.CheckVictimWasTarget(plr.name, killer.activeBounties))
                            {
                                List<Bounty> completedBounties = new List<Bounty>();
                                foreach (Bounty bounty in killer.activeBounties.Keys)
                                {
                                    if (bounty.target == plr.name)
                                    {
                                        for (int i = 0; i < bounty.reward.Count - 1; i++)
                                        {
                                            Item item = new Item();
                                            item.SetDefaults(bounty.reward[i].id);
                                            killer.TSPlayer.GiveItem(item.netID, item.name, item.width, item.height, bounty.reward[i].stack, bounty.reward[i].prefix);
                                        }
                                        if (bounty.reward[bounty.reward.Count - 1].money != 0)
                                        {
                                            SEconomyPlugin.Instance.WorldAccount.TransferToAsync(
                                                SEconomyPlugin.Instance.GetBankAccount(killer.TSPlayer.UserAccountName),
                                                bounty.reward[bounty.reward.Count - 1].money,
                                                Wolfje.Plugins.SEconomy.Journal.BankAccountTransferOptions.AnnounceToReceiver,
                                                String.Format("for the bounty rewards.", bounty.reward[bounty.reward.Count - 1].money),
                                                String.Format("BountyHunt: " + "receiving money for reward."));
                                        }
                                        completedBounties.Add(bounty);
                                    }
                                }
                                for (int i = 0; i < completedBounties.Count; i++)
                                {
                                    foreach (var hunter in completedBounties[i].hunter)
                                    {
                                        var foundplr = TShock.Utils.FindPlayer(hunter);
                                        foundplr[0].SendInfoMessage("{0} completed {1}, a bounty you accepted.", killer.name, completedBounties[i].name);
                                        foundplr[0].SendInfoMessage("{0} will be removed from your accepted bounties.", completedBounties[i].name);
                                    }
                                    bounties.Remove(completedBounties[i]);
                                    dbManager.DeleteBounty(completedBounties[i]);
                                }
                            }
                            if (Utils.CheckVictimWasHunter(plr.name, plr.activeBounties))
                            {
                                List<Bounty> failedBounties = new List<Bounty>();
                                foreach (Bounty bounty in plr.activeBounties.Keys)
                                {
                                    if (bounty.target == killer.name)
                                    {
                                        plr.activeBounties[bounty]++;
                                        if (config.MaxAttemptsPerBounty != 0 && plr.activeBounties[bounty] >= config.MaxAttemptsPerBounty)
                                        {
                                            failedBounties.Add(bounty);
                                        }
                                        if (config.HunterDeathPenalty != 0)
                                        {
                                            SEconomyPlugin.Instance.GetBankAccount(plr.TSPlayer.UserAccountName).TransferToAsync(
                                                SEconomyPlugin.Instance.WorldAccount,
                                                config.HunterDeathPenalty,
                                                Wolfje.Plugins.SEconomy.Journal.BankAccountTransferOptions.AnnounceToSender,
                                                String.Format("dying to your bounty target."),
                                                String.Format("BountyHunt: " + "lost money for death on the hunt."));
                                            if (config.AddDeathPenaltyToRewards)
                                                bounties[bounties.IndexOf(bounty)].reward[bounties[bounties.IndexOf(bounty)].reward.Count].money += config.HunterDeathPenalty;
                                        }
                                    }
                                }
                                for (int i = 0; i < failedBounties.Count; i++)
                                {
                                    plr.TSPlayer.SendErrorMessage("You have failed the {0} bounty {1} time(s).", failedBounties[i].name, plr.activeBounties[failedBounties[i]]);
                                    plr.TSPlayer.SendErrorMessage("{0} will be removed from your accept bounties, and can no longer be accepted by you.", failedBounties[i]);

                                    foreach (Bounty bounty in bounties)
                                    {
                                        if (bounty == failedBounties[i])
                                        {
                                            bounty.hunter.Remove(plr.name);
                                            bounty.failures.Add(plr.name);
                                            dbManager.UpdateHunters(bounty);
                                            dbManager.UpdateFailures(bounty);
                                        }
                                    }
                                }
                            }
                        }
                        plr.killingPlayer = null;
                    }
                }
            }
            #endregion
        }
コード例 #20
0
        internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length)
        {
            if (Main.netMode == 2)
            {
                switch ((PacketTypes)msgId)
                {
                case PacketTypes.ConnectRequest:
                    if (this.InvokeServerConnect(buffer.whoAmI))
                    {
                        Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                        return(true);
                    }

                    break;

                case PacketTypes.ContinueConnecting2:
                    if (this.InvokeServerJoin(buffer.whoAmI))
                    {
                        Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                        return(true);
                    }

                    break;

                case PacketTypes.ChatText:
                    var text = "";
                    using (var stream = new MemoryStream(buffer.readBuffer))
                    {
                        stream.Position = index;
                        using (var reader = new BinaryReader(stream))
                        {
                            reader.ReadByte();
                            reader.ReadRGB();
                            text = reader.ReadString();
                        }
                    }

                    if (this.InvokeServerChat(buffer, buffer.whoAmI, @text))
                    {
                        return(true);
                    }

                    break;

                //Making sure packet length is 38, otherwise it's not a valid UUID packet length.
                //We copy the bytes of the UUID then convert it to string. Then validating the GUID so its the correct format.
                //Then the bytes get hashed, and set as ClientUUID (and gets written in DB for auto-login)
                //length minus 2 = 36, the length of a UUID.
                case PacketTypes.ClientUUID:
                    if (length == 38)
                    {
                        byte[] uuid = new byte[length - 2];
                        Buffer.BlockCopy(buffer.readBuffer, index + 1, uuid, 0, length - 2);
                        Guid guid = new Guid();
                        if (Guid.TryParse(Encoding.Default.GetString(uuid, 0, uuid.Length), out guid))
                        {
                            SHA512 shaM   = new SHA512Managed();
                            var    result = shaM.ComputeHash(uuid);
                            Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2"));
                            return(true);
                        }
                    }
                    Netplay.Clients[buffer.whoAmI].ClientUUID = "";
                    return(true);
                }
            }

            GetDataEventArgs args = new GetDataEventArgs
            {
                MsgID  = (PacketTypes)msgId,
                Msg    = buffer,
                Index  = index,
                Length = length
            };

            this.NetGetData.Invoke(args);

            msgId  = (byte)args.MsgID;
            index  = args.Index;
            length = args.Length;
            return(args.Handled);
        }
コード例 #21
0
        internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length)
        {
            if (Main.netMode == 2)
            {
                // A critical server crash/corruption bug was reported by @bartico6 on GitHub.
                // If a packet length comes in at extreme values, the server can enter infinite loops, deadlock, and corrupt the world.
                // As a result, we take the following action: disconnect the player and log the attempt as soon as we can.
                // The length 1000 was chosen as an arbitrarily large number for all packets. It may need to be tuned later.
                if (length > 1000)
                {
                    RemoteClient currentClient = Netplay.Clients[buffer.whoAmI];
                    string       name          = String.IsNullOrWhiteSpace(currentClient.Name) ? "Unknown" : currentClient.Name;
                    ServerApi.LogWriter.ServerWriteLine("Disconnecting " + name + " (" + currentClient.Socket.GetRemoteAddress() + ") for attempted packet length overflow crash/DoS attempt.", TraceLevel.Error);
                    Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                    return(true);
                }

                switch ((PacketTypes)msgId)
                {
                case PacketTypes.ConnectRequest:
                    if (this.InvokeServerConnect(buffer.whoAmI))
                    {
                        Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                        return(true);
                    }

                    break;

                case PacketTypes.ContinueConnecting2:
                    if (this.InvokeServerJoin(buffer.whoAmI))
                    {
                        Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                        return(true);
                    }

                    break;

                case PacketTypes.LoadNetModule:
                    using (var stream = new MemoryStream(buffer.readBuffer))
                    {
                        stream.Position = index;
                        using (var reader = new BinaryReader(stream))
                        {
                            ushort moduleId = reader.ReadUInt16();
                            //LoadNetModule is now used for sending chat text.
                            //Read the module ID to determine if this is in fact the text module
                            if (moduleId == Terraria.Net.NetManager.Instance.GetId <Terraria.GameContent.NetModules.NetTextModule>())
                            {
                                //Then deserialize the message from the reader
                                Terraria.Chat.ChatMessage msg = Terraria.Chat.ChatMessage.Deserialize(reader);

                                if (InvokeServerChat(buffer, buffer.whoAmI, @msg.Text, msg.CommandId))
                                {
                                    return(true);
                                }
                            }
                        }
                    }

                    break;

                //Making sure packet length is 38, otherwise it's not a valid UUID packet length.
                //We copy the bytes of the UUID then convert it to string. Then validating the GUID so its the correct format.
                //Then the bytes get hashed, and set as ClientUUID (and gets written in DB for auto-login)
                //length minus 2 = 36, the length of a UUID.
                case PacketTypes.ClientUUID:
                    if (length == 38)
                    {
                        byte[] uuid = new byte[length - 2];
                        Buffer.BlockCopy(buffer.readBuffer, index + 1, uuid, 0, length - 2);
                        Guid guid = new Guid();
                        if (Guid.TryParse(Encoding.Default.GetString(uuid, 0, uuid.Length), out guid))
                        {
                            SHA512 shaM   = new SHA512Managed();
                            var    result = shaM.ComputeHash(uuid);
                            Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2"));
                            return(true);
                        }
                    }
                    Netplay.Clients[buffer.whoAmI].ClientUUID = "";
                    return(true);
                }
            }

            GetDataEventArgs args = new GetDataEventArgs
            {
                MsgID  = (PacketTypes)msgId,
                Msg    = buffer,
                Index  = index,
                Length = length
            };

            this.NetGetData.Invoke(args);

            msgId  = (byte)args.MsgID;
            index  = args.Index;
            length = args.Length;
            return(args.Handled);
        }
コード例 #22
0
        private static void OnGetData(GetDataEventArgs e)
        {
            if (e.Handled)
            return;

              using (var reader = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
            switch (e.MsgID) {
              #region Sign Edit

              case PacketTypes.SignNew: {
              reader.ReadInt16();
              var x = reader.ReadInt16();
              var y = reader.ReadInt16();
              var text = reader.ReadString();
              var id = Sign.ReadSign(x, y);
              if (id < 0 || Main.sign[id] == null) return;
              x = (short)Main.sign[id].x;
              y = (short)Main.sign[id].y;
              if (OnSignNew(x, y, text, e.Msg.whoAmI)) {
                e.Handled = true;
                TShock.Players[e.Msg.whoAmI].SendData(PacketTypes.SignNew, "", id);
                TShock.Players[e.Msg.whoAmI].SendErrorMessage("This sign is protected from modifications.");
              }
            }
            break;

              #endregion

              #region Sign Read

              case PacketTypes.SignRead: {
              var x = reader.ReadInt16();
              var y = reader.ReadInt16();
              var id = Sign.ReadSign(x, y);
              if (id < 0 || Main.sign[id] == null) return;
              x = (short)Main.sign[id].x;
              y = (short)Main.sign[id].y;
              var text = Main.sign[id].text;
              if (OnSignOpen(x, y, text, e.Msg.whoAmI)) {
                e.Handled = true;
                TShock.Players[e.Msg.whoAmI].SendErrorMessage("This sign is protected from viewing");
              }
            }
            break;

              #endregion

              #region Tile Modify

              case PacketTypes.Tile: {
              var action = reader.ReadByte();
              var x = reader.ReadInt16();
              var y = reader.ReadInt16();
              var type = reader.ReadUInt16();

              if (Main.tile[x, y].type != 55) return;

              var id = Sign.ReadSign(x, y);
              if (id < 0 || Main.sign[id] == null) return;
              x = (short)Main.sign[id].x;
              y = (short)Main.sign[id].y;
              var text = Main.sign[id].text;

              bool handle;
              if (action == 0 && type == 0)
                handle = OnSignKill(x, y, text, e.Msg.whoAmI);
              else
                handle = OnSignHit(x, y, text, e.Msg.whoAmI);

              if (handle) {
                e.Handled = true;
                TShock.Players[e.Msg.whoAmI].SendTileSquare(x, y);
              }
            }
            break;

              #endregion
            }
        }
コード例 #23
0
ファイル: Main.cs プロジェクト: Enerdy/Sign-Editor
        void OnGetData(GetDataEventArgs args)
        {
            var ply = args.Msg.whoAmI;
            if (args.MsgID == PacketTypes.SignRead && Memory[ply].Active)
            {
                using (var reader = new BinaryReader(new MemoryStream(args.Msg.readBuffer, args.Index, args.Length)))
                {
                    int x = reader.ReadInt16();
                    int y = reader.ReadInt16();
                    int signID = Sign.ReadSign(x, y);

                    Sign sign = UsingInfiniteSigns ? Utils.DbGetSign(x, y) : Main.sign[signID];
                    if (sign == null)
                        TShock.Log.Debug("Utils.DbGetSign(int x, int y) returned null.");
                    else
                    {
                        switch (Memory[ply].Action)
                        {
                            case SignAction.LOAD:
                                if (UsingInfiniteSigns)
                                {
                                    var text = FileTools.Load(Memory[ply].File);
                                    if (!Utils.DbSetSignText(sign.x, sign.y, text))
                                    {
                                        TShock.Players[ply].PluginErrorMessage(
                                            "Failed to load to InfiniteSigns sign.");
                                        break;
                                    }
                                }
                                else
                                {
                                    Sign.TextSign(signID, FileTools.Load(Memory[ply].File));
                                }
                                TShock.Players[ply].PluginInfoMessage("Loaded file '{0}' to sign.", Memory[ply].File);
                                break;
                            case SignAction.SAVE:
                                if (FileTools.Save(Memory[ply].File, sign.text))
                                {
                                    TShock.Players[ply].PluginInfoMessage("Saved sign's contents to file '{0}'.", Memory[ply].File);
                                }
                                else
                                {
                                    TShock.Players[ply].PluginErrorMessage(
                                        "Failed to save to file. Check logs for details.");
                                }
                                break;
                            case SignAction.COPY:
                                Memory[ply].Clipboard = sign.text;
                                TShock.Players[ply].PluginInfoMessage(
                                    "Copied sign's contents to clipboard.");
                                break;
                            case SignAction.PASTE:
                            case SignAction.PERSISTENT:
                                if (UsingInfiniteSigns)
                                {
                                    var text = Memory[ply].Clipboard;
                                    if (!Utils.DbSetSignText(sign.x, sign.y, text))
                                    {
                                        TShock.Players[ply].PluginErrorMessage(
                                            "Failed to paste to InfiniteSigns sign.");
                                        break;
                                    }
                                }
                                else
                                {
                                    Sign.TextSign(signID, Memory[ply].Clipboard);
                                }
                                TShock.Players[ply].PluginInfoMessage("Pasted selection.");
                                break;
                        }
                        Memory[ply].Active = Memory[ply].Action == SignAction.PERSISTENT;
                        args.Handled = true;
                    }
                }
            }
        }
コード例 #24
0
		internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length)
		{
			if (Main.netMode == 2)
			{
				switch ((PacketTypes) msgId)
				{
					case PacketTypes.ConnectRequest:
						if (this.InvokeServerConnect(buffer.whoAmI))
						{
							Netplay.Clients[buffer.whoAmI].PendingTermination = true;
							return true;
						}

						break;
					case PacketTypes.ContinueConnecting2:
						if (this.InvokeServerJoin(buffer.whoAmI))
						{
							Netplay.Clients[buffer.whoAmI].PendingTermination = true;
							return true;
						}

						break;
					case PacketTypes.ChatText:
						var text = "";
						using(var stream = new MemoryStream(buffer.readBuffer))
						{
							stream.Position = index;
							using(var reader = new BinaryReader(stream))
							{
								reader.ReadByte();
								reader.ReadRGB();
								text = reader.ReadString();
							}
						}

						if (this.InvokeServerChat(buffer, buffer.whoAmI, @text))
									return true;

						break;

					case PacketTypes.ClientUUID:
						byte[] uuid = new byte[length - 5];
						Buffer.BlockCopy(buffer.readBuffer, index + 4, uuid, 0, length - 5);
						SHA512 shaM = new SHA512Managed();
						var result = shaM.ComputeHash(uuid);
						Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2"));;
						return true;
				}
			}

			GetDataEventArgs args = new GetDataEventArgs
			{
				MsgID = (PacketTypes)msgId, 
				Msg = buffer, 
				Index = index, 
				Length = length
			};

			this.NetGetData.Invoke(args);

			msgId = (byte)args.MsgID;
			index = args.Index;
			length = args.Length;
			return args.Handled;
		}
コード例 #25
0
        internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length)
        {
            if (Main.netMode != 2 && msgId == (byte)PacketTypes.ChatText && length > 3)
            {
                byte   playerID = buffer.readBuffer[index];
                Color  color    = new Color(buffer.readBuffer[index + 1] << 16, buffer.readBuffer[index + 2] << 8, buffer.readBuffer[index + 3]);
                string @string  = Encoding.UTF8.GetString(buffer.readBuffer, index + 4, length - 5);
                this.InvokeClientChatReceived(playerID, color, @string);
            }

            if (Main.netMode == 2)
            {
                switch ((PacketTypes)msgId)
                {
                case PacketTypes.ConnectRequest:
                    if (this.InvokeServerConnect(buffer.whoAmI))
                    {
                        Netplay.serverSock[buffer.whoAmI].kill = true;
                        return(true);
                    }

                    break;

                case PacketTypes.ContinueConnecting2:
                    if (this.InvokeServerJoin(buffer.whoAmI))
                    {
                        Netplay.serverSock[buffer.whoAmI].kill = true;
                        return(true);
                    }

                    break;

                case PacketTypes.ChatText:
                    var text = "";
                    using (var stream = new MemoryStream(buffer.readBuffer))
                    {
                        stream.Position = index;
                        using (var reader = new BinaryReader(stream))
                        {
                            reader.ReadByte();
                            reader.ReadRGB();
                            text = reader.ReadString();
                        }
                    }

                    if (this.InvokeServerChat(buffer, buffer.whoAmI, @text))
                    {
                        return(true);
                    }

                    break;

                case PacketTypes.ClientUUID:
                    byte[] uuid = new byte[length - 5];
                    Buffer.BlockCopy(buffer.readBuffer, index + 4, uuid, 0, length - 5);
                    SHA512 shaM   = new SHA512Managed();
                    var    result = shaM.ComputeHash(uuid);
                    Netplay.serverSock[buffer.whoAmI].clientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2"));;
                    return(true);

                    break;
                }
            }

            GetDataEventArgs args = new GetDataEventArgs
            {
                MsgID  = (PacketTypes)msgId,
                Msg    = buffer,
                Index  = index,
                Length = length
            };

            this.NetGetData.Invoke(args);

            msgId  = (byte)args.MsgID;
            index  = args.Index;
            length = args.Length;
            return(args.Handled);
        }
コード例 #26
0
ファイル: TShock.cs プロジェクト: B-BOB/TShock
        /// <summary>OnGetData - Called when the server gets raw data packets.</summary>
        /// <param name="e">e - The GetDataEventArgs object.</param>
        private void OnGetData(GetDataEventArgs e)
        {
            if (e.Handled)
                return;

            PacketTypes type = e.MsgID;

            Debug.WriteLine("Recv: {0:X}: {2} ({1:XX})", e.Msg.whoAmI, (byte)type, type);

            var player = Players[e.Msg.whoAmI];
            if (player == null || !player.ConnectionAlive)
            {
                e.Handled = true;
                return;
            }

            if (player.RequiresPassword && type != PacketTypes.PasswordSend)
            {
                e.Handled = true;
                return;
            }

            if ((player.State < 10 || player.Dead) && (int)type > 12 && (int)type != 16 && (int)type != 42 && (int)type != 50 &&
                (int)type != 38 && (int)type != 21 && (int)type != 22)
            {
                e.Handled = true;
                return;
            }

            int length = e.Length - 1;
            if (length < 0)
            {
                length = 0;
            }
            using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length - 1))
            {
                // Exceptions are already handled
                e.Handled = GetDataHandlers.HandlerGetData(type, player, data);
            }
        }
コード例 #27
0
        public void OnGetData(GetDataEventArgs e)
        {
            if (e.Handled)
            {
                return;
            }
            switch (e.MsgID)
            {
                #region Sign Edit
                case PacketTypes.SignNew:
                    {
                        int X = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 2);
                        int Y = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 6);
                        string text = Encoding.UTF8.GetString(e.Msg.readBuffer, e.Index + 10, e.Length - 11);

                        int id = Terraria.Sign.ReadSign(X, Y);
                        if (id < 0 || Main.sign[id] == null) return;
                        X = Main.sign[id].x;
                        Y = Main.sign[id].y;
                        if (OnSignEdit(X, Y, text, e.Msg.whoAmI))
                        {
                            e.Handled = true;
                            TShock.Players[e.Msg.whoAmI].SendData(PacketTypes.SignNew, "", id);
                        }
                    }
                    break;
                #endregion

                #region Tile Modify
                case PacketTypes.Tile:
                    {
                        int X = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 1);
                        int Y = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 5);

                        if (Main.tile[X, Y].type != 55) return;

                        int id = Terraria.Sign.ReadSign(X, Y);
                        if (id < 0 || Main.sign[id] == null) return;
                        X = Main.sign[id].x;
                        Y = Main.sign[id].y;
                        string text = Main.sign[id].text;

                        bool handle = false;
                        if (e.Msg.readBuffer[e.Index] == 0 && e.Msg.readBuffer[e.Index + 9] == 0)
                            handle = OnSignKill(X, Y, text, e.Msg.whoAmI);
                        else
                            handle = OnSignHit(X, Y, text, e.Msg.whoAmI);

                        if (handle)
                        {
                            e.Handled = true;
                            TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y);
                        }
                    }
                    break;
                #endregion
            }
        }
コード例 #28
0
ファイル: InfiniteSigns.cs プロジェクト: MarioE/InfiniteSigns
        void OnGetData(GetDataEventArgs e)
        {
            if (!e.Handled)
            {
                using (var reader = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    switch (e.MsgID)
                    {
                        case PacketTypes.SignNew:
                            {
                                reader.ReadInt16();
                                int x = reader.ReadInt16();
                                int y = reader.ReadInt16();
                                string text = reader.ReadString();
                                Task.Factory.StartNew(() => ModSign(x, y, e.Msg.whoAmI, text));
                                e.Handled = true;
                            }
                            break;
                        case PacketTypes.SignRead:
                            {
                                int x = reader.ReadInt16();
                                int y = reader.ReadInt16();
                                Task.Factory.StartNew(() => GetSign(x, y, e.Msg.whoAmI));
                                e.Handled = true;
                            }
                            break;
                        case PacketTypes.Tile:
                            {
                                byte action = reader.ReadByte();
                                int x = reader.ReadInt16();
                                int y = reader.ReadInt16();
                                ushort type = reader.ReadUInt16();

                                if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY)
                                    return;

                                if (action == 0 && type == 0)
                                {
                                    if (Sign.Nearby(x, y))
                                    {
                                        Task.Factory.StartNew(() => KillSign(x, y, e.Msg.whoAmI));
                                        e.Handled = true;
                                    }
                                }
                                else if (action == 1 && (type == 55 || type == 85))
                                {
                                    if (TShock.Regions.CanBuild(x, y, TShock.Players[e.Msg.whoAmI]))
                                    {
                                        WorldGen.PlaceSign(x, y, type);
                                        NetMessage.SendData(17, -1, e.Msg.whoAmI, "", 1, x, y, type);
                                        if (Main.tile[x, y].frameY != 0)
                                            y--;
                                        if (Main.tile[x, y].frameX % 36 != 0)
                                            x--;
                                        Task.Factory.StartNew(() => PlaceSign(x, y, e.Msg.whoAmI));
                                        e.Handled = true;
                                    }
                                }
                            }
                            break;
                    }
                }
            }
        }
コード例 #29
0
        internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length)
        {
            if (Main.netMode == 2)
            {
                switch ((PacketTypes)msgId)
                {
                case PacketTypes.ConnectRequest:
                    if (this.InvokeServerConnect(buffer.whoAmI))
                    {
                        Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                        return(true);
                    }

                    break;

                case PacketTypes.ContinueConnecting2:
                    if (this.InvokeServerJoin(buffer.whoAmI))
                    {
                        Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                        return(true);
                    }

                    break;

                case PacketTypes.ChatText:
                    var text = "";
                    using (var stream = new MemoryStream(buffer.readBuffer))
                    {
                        stream.Position = index;
                        using (var reader = new BinaryReader(stream))
                        {
                            reader.ReadByte();
                            reader.ReadRGB();
                            text = reader.ReadString();
                        }
                    }

                    if (this.InvokeServerChat(buffer, buffer.whoAmI, @text))
                    {
                        return(true);
                    }

                    break;

                case PacketTypes.ClientUUID:
                    byte[] uuid = new byte[length - 5];
                    Buffer.BlockCopy(buffer.readBuffer, index + 4, uuid, 0, length - 5);
                    SHA512 shaM   = new SHA512Managed();
                    var    result = shaM.ComputeHash(uuid);
                    Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2"));;
                    return(true);
                }
            }

            GetDataEventArgs args = new GetDataEventArgs
            {
                MsgID  = (PacketTypes)msgId,
                Msg    = buffer,
                Index  = index,
                Length = length
            };

            this.NetGetData.Invoke(args);

            msgId  = (byte)args.MsgID;
            index  = args.Index;
            length = args.Length;
            return(args.Handled);
        }
コード例 #30
0
ファイル: Main.cs プロジェクト: ja450n/Vault
 public void OnGetData(GetDataEventArgs e)
 {
     try
     {
         if (e.MsgID == PacketTypes.PlayerUpdate)
         {
             byte plyID = e.Msg.readBuffer[e.Index];
             byte flags = e.Msg.readBuffer[e.Index + 1];
             var player = PlayerList[plyID];
             if (player != null && player.LastState != flags)
             {
                 player.LastState = flags;
                 player.IdleCount = 0;
             }
         }
     }
     catch (Exception ex) { Log.ConsoleError(ex.ToString()); }
 }
コード例 #31
0
		private void OnGetData(GetDataEventArgs e)
		{
			if (e.Handled)
			{
				return;
			}

			TSPlayer tsplayer = TShock.Players[e.Msg.whoAmI];
			if (tsplayer == null)
			{
				return;
			}

			switch (e.MsgID)
			{
				#region Packet 45 - PlayerKillMe

				case PacketTypes.PlayerKillMe:
					if (tsplayer.Group.HasPermission(Permissions.TpBack))
					{
						tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position);
					}
					return;

				case PacketTypes.Teleport:
					{
						if (tsplayer.Group.HasPermission(Permissions.TpBack))
						{
							using (MemoryStream ms = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
							{
								BitsByte flags = (byte)ms.ReadByte();

								int type = 0;
								if (flags[1])
								{
									type = 2;
								}

								if (type == 0 && tsplayer.Group.HasPermission(TShockAPI.Permissions.rod))
								{
									tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position);
								}
								else if (type == 2 && tsplayer.Group.HasPermission(TShockAPI.Permissions.wormhole))
								{
									tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position);
								}
							}
						}
					}
					return;

				#endregion
			}
		}
コード例 #32
0
ファイル: HookManager.cs プロジェクト: Z0kc/TShockMobile
        internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length)
        {
            if (Main.netMode == 2)
            {
                // A critical server crash/slow-down bug was exploited in which a 0-length
                // packet is sent, causing all NetGetData handlers to throw exceptions.
                // Because a packet's header is 2 bytes of length + 1 byte of packet type,
                // all packets must contain at least 3 bytes.
                // Ideally this check should occur in an OTAPI modification.
                if (length < 1)
                {
                    RemoteClient currentClient = Netplay.Clients[buffer.whoAmI];
                    Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                    return(true);
                }

                // A critical server crash/corruption bug was reported by @bartico6 on GitHub.
                // If a packet length comes in at extreme values, the server can enter infinite loops, deadlock, and corrupt the world.
                // As a result, we take the following action: disconnect the player and log the attempt as soon as we can.
                // The length 1000 was chosen as an arbitrarily large number for all packets. It may need to be tuned later.
                if (length > 1000)
                {
                    RemoteClient currentClient = Netplay.Clients[buffer.whoAmI];
                    Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                    return(true);
                }

                switch ((PacketTypes)msgId)
                {
                case PacketTypes.ConnectRequest:
                    if (this.InvokeServerConnect(buffer.whoAmI))
                    {
                        Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                        return(true);
                    }

                    break;

                case PacketTypes.ContinueConnecting2:
                    if (this.InvokeServerJoin(buffer.whoAmI))
                    {
                        Netplay.Clients[buffer.whoAmI].PendingTermination = true;
                        return(true);
                    }

                    break;

                case PacketTypes.ChatText:
                    var text = "";
                    using (var stream = new MemoryStream(buffer.readBuffer))
                    {
                        stream.Position = index;
                        using (var reader = new BinaryReader(stream))
                        {
                            reader.ReadByte();
                            reader.ReadRGB();
                            text = reader.ReadString();
                        }
                    }

                    if (this.InvokeServerChat(buffer, buffer.whoAmI, @text))
                    {
                        return(true);
                    }

                    break;

                //Making sure packet length is 38, otherwise it's not a valid UUID packet length.
                //We copy the bytes of the UUID then convert it to string. Then validating the GUID so its the correct format.
                //Then the bytes get hashed, and set as ClientUUID (and gets written in DB for auto-login)
                //length minus 2 = 36, the length of a UUID.
                case PacketTypes.ClientUUID:
                    if (length == 38)
                    {
                        byte[] uuid = new byte[length - 2];
                        Buffer.BlockCopy(buffer.readBuffer, index + 1, uuid, 0, length - 2);
                        Guid guid = new Guid();
                        if (Guid.TryParse(Encoding.Default.GetString(uuid, 0, uuid.Length), out guid))
                        {
                            SHA512 shaM   = new SHA512Managed();
                            var    result = shaM.ComputeHash(uuid);
                            Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2"));
                            return(true);
                        }
                    }
                    Netplay.Clients[buffer.whoAmI].ClientUUID = "";
                    return(true);
                }
            }

            GetDataEventArgs args = new GetDataEventArgs
            {
                MsgID  = (PacketTypes)msgId,
                Msg    = buffer,
                Index  = index,
                Length = length
            };

            this.NetGetData.Invoke(args);

            msgId  = (byte)args.MsgID;
            index  = args.Index;
            length = args.Length;
            return(args.Handled);
        }
コード例 #33
0
ファイル: WorldEconomy.cs プロジェクト: LoveOryks/SEconomy
        /// <summary>
        /// Occurs when the server has received a message from the client.
        /// </summary>
        protected void NetHooks_GetData(GetDataEventArgs args)
        {
            byte[] bufferSegment = null;
            Terraria.Player player = null;

            if ((player = Terraria.Main.player.ElementAtOrDefault(args.Msg.whoAmI)) == null) {
                return;
            }

            bufferSegment = new byte[args.Length];
            System.Array.Copy(args.Msg.readBuffer, args.Index, bufferSegment, 0, args.Length);

            if (args.MsgID == PacketTypes.NpcStrike) {
                Terraria.NPC npc = null;
                Packets.DamageNPC dmgPacket = Packets.PacketMarshal.MarshalFromBuffer<Packets.DamageNPC>(bufferSegment);

                if (dmgPacket.NPCID < 0 || dmgPacket.NPCID > Terraria.Main.npc.Length
                    || args.Msg.whoAmI < 0 || dmgPacket.NPCID > Terraria.Main.player.Length) {
                    return;
                }

                if ((npc = Terraria.Main.npc.ElementAtOrDefault(dmgPacket.NPCID)) == null) {
                    return;
                }

                AddNPCDamage(npc, player, dmgPacket.Damage, Convert.ToBoolean(dmgPacket.CrititcalHit));
            }
        }
コード例 #34
0
        void OnGetData(GetDataEventArgs e)
        {
            #region PlayerHP
            try
            {
                if (e.MsgID == PacketTypes.PlayerHp)
                {
                    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        var reader = new BinaryReader(data);
                        var playerID = reader.ReadByte();
                        var HP = reader.ReadInt16();
                        var MaxHP = reader.ReadInt16();

                        if (Utils.GetPlayers((int)playerID) != null)
                        {
                            var player = Utils.GetPlayers((int)playerID);

                            if (player.isHeal)
                            {
                                if (HP <= MaxHP / 2)
                                {
                                    player.TSPlayer.Heal(500);
                                    player.TSPlayer.SendSuccessMessage("You just got healed!");
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception x)
            {
                TShock.Log.ConsoleError(x.ToString());
            }
            #endregion

            #region PlayerDamage
            if (e.MsgID == PacketTypes.PlayerDamage)
            {
                try
                {
                    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        var reader = new BinaryReader(data);
                        var ply = reader.ReadByte();
                        var hitDirection = reader.ReadByte();
                        var damage = reader.ReadInt16();

                        if ((damage > config.maxDamage || damage < 0) && !TShock.Players[e.Msg.whoAmI].Group.HasPermission(Permissions.ignoredamagecap) && e.Msg.whoAmI != ply)
                        {
                            if (config.maxDamageBan)
                            {
                                TShockAPI.TShock.Utils.Ban(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit.");
                            }
                            else if (config.maxDamageKick)
                            {
                                TShockAPI.TShock.Utils.Kick(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit.");
                            }
                            if (config.maxDamageIgnore)
                            {
                                e.Handled = true;
                            }

                        }
                    }
                }
                catch (Exception x)
                {
                    TShock.Log.ConsoleError(x.ToString());
                }
            }
            #endregion

            #region NPCStrike
            if (e.MsgID == PacketTypes.NpcStrike)
            {
                try
                {
                    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        var reader = new BinaryReader(data);
                        var npcID = reader.ReadInt16();
                        var damage = reader.ReadInt16();
                        if ((damage > config.maxDamage || damage < 0) && !TShock.Players[e.Msg.whoAmI].Group.HasPermission(Permissions.ignoredamagecap))
                        {

                            if (config.maxDamageBan)
                            {
                                TShockAPI.TShock.Utils.Ban(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit.");
                            }
                            else if (config.maxDamageKick)
                            {
                                TShockAPI.TShock.Utils.Kick(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit.");
                            }
                            if (config.maxDamageIgnore)
                            {
                                e.Handled = true;
                            }
                        }
                    }
                }
                catch (Exception x)
                {
                    TShock.Log.ConsoleError(x.ToString());
                }
            }
            #endregion

            #region PlayerTeam
            try
            {
                if (e.MsgID == PacketTypes.PlayerTeam)
                {
                    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        var reader = new BinaryReader(data);
                        var ply = reader.ReadByte();
                        var team = reader.ReadByte();

                        if (Utils.GetPlayers((int)ply) != null)
                        {
                            var player = Utils.GetPlayers((int)ply);

                            try
                            {
                                switch (team)
                                {
                                    case 1:
                                        if (config.redPass != "")
                                        {
                                            if ((!player.accessRed) && (TShock.Players[ply].Group.Name != "superadmin"))
                                            {
                                                e.Handled = true;
                                                TShock.Players[ply].SendErrorMessage("This team is locked, use {0}teamunlock red [password] to access it.", TShock.Config.CommandSpecifier);
                                                TShock.Players[ply].SetTeam(0);
                                            }
                                        }
                                        break;

                                    case 2:
                                        if (config.greenPass != "")
                                        {
                                            if ((!player.accessGreen) && (TShock.Players[ply].Group.Name != "superadmin"))
                                            {
                                                e.Handled = true;
                                                TShock.Players[ply].SendErrorMessage("This team is locked, use {0}teamunlock green [password] to access it.", TShock.Config.CommandSpecifier);
                                                TShock.Players[ply].SetTeam(0);
                                            }
                                        }
                                        break;

                                    case 3:
                                        if (config.bluePass != "")
                                        {
                                            if ((!player.accessBlue) && (TShock.Players[ply].Group.Name != "superadmin"))
                                            {
                                                e.Handled = true;
                                                TShock.Players[ply].SendErrorMessage("This team is locked, use {0}teamunlock blue [password] to access it.", TShock.Config.CommandSpecifier);
                                                TShock.Players[ply].SetTeam(0);
                                            }
                                        }
                                        break;

                                    case 4:
                                        if (config.yellowPass != "")
                                        {
                                            if ((!player.accessYellow) && (TShock.Players[ply].Group.Name != "superadmin"))
                                            {
                                                e.Handled = true;
                                                TShock.Players[ply].SendErrorMessage("This team is locked, use {0}teamunlock yellow [password] to access it.", TShock.Config.CommandSpecifier);
                                                TShock.Players[ply].SetTeam(0);
                                            }
                                        }
                                        break;
                                }
                            }
                            catch (Exception x)
                            {
                                TShock.Log.ConsoleError(x.ToString());
                            }
                        }
                    }
                }
            }
            catch (Exception x)
            {
                TShock.Log.ConsoleError(x.ToString());
            }
            #endregion

            if (e.MsgID == PacketTypes.ItemDrop)
            {
                try
                {
                    using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        var reader = new BinaryReader(data);
                        var itemid = reader.ReadInt16();
                        if (itemid < 400)
                            return;
                    }

                    List<DateTime> plrinfo = new List<DateTime>();
                    int index = e.Msg.whoAmI;

                    if (itemspam.ContainsKey(index))
                    {
                        plrinfo = itemspam[index];
                        plrinfo.Add(DateTime.Now);

                        if (plrinfo.Count > 10)
                        {
                            while (plrinfo.Count > 0 && (DateTime.Now - plrinfo[0]).TotalSeconds > 20)
                            {
                                plrinfo.RemoveAt(0);
                            }
                            if (plrinfo.Count > 10)
                            {
                                TShock.Players[index].SendData(PacketTypes.Status, "Do not spam items on this server!");
                                e.Handled = true;
                                return;
                            }
                        }
                    }
                    else
                    {
                        itemspam.Add(index, new List<DateTime>() { DateTime.Now });
                    }
                }
                catch
                {

                }
            }
        }
コード例 #35
0
ファイル: History.cs プロジェクト: Zaicon/History
        void OnGetData(GetDataEventArgs e)
        {
            if (!e.Handled)
            {

                switch (e.MsgID)
                {
                    case PacketTypes.PlaceItemFrame:
                        //TSPlayer.All.SendInfoMessage("Placing item frame!");
                        break;
                    case PacketTypes.PlaceTileEntity:
                        //TSPlayer.All.SendInfoMessage("Placing tile entity!");
                        break;
                    case PacketTypes.UpdateTileEntity:
                        //TSPlayer.All.SendInfoMessage("Updating tile entity!");
                        break;
                    case PacketTypes.Tile:
                        {
                            byte etype = e.Msg.readBuffer[e.Index];
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);
                            ushort type = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index + 5);
                            byte style = e.Msg.readBuffer[e.Index + 7];
                            if (type == 1 && (etype == 0 || etype == 4))
                            {
                                if (Main.tile[X, Y].type == 21 || Main.tile[X, Y].type == 88)
                                    return; //Chests and dressers handled separately
                                //else if (Main.tile[X, Y].type == 2699)
                                //TSPlayer.All.SendInfoMessage("Weapon rack place");
                            }
                            //DEBUG
                            //TSPlayer.All.SendInfoMessage($"Type: {type}");

                            TSPlayer ply = TShock.Players[e.Msg.whoAmI];
                            string logName = ply.User == null ? "unregistered" : ply.User.Name;
                            //Checking history now requires build permission in the area due to load order, if needed this could be fixed by having an alternate function check this packet on a higher order.
                            if (AwaitingHistory[e.Msg.whoAmI])
                            {
                                AwaitingHistory[e.Msg.whoAmI] = false;
                                ply.SendTileSquare(X, Y, 5);
                                //DEBUG
                                //TSPlayer.All.SendInfoMessage($"X: {X}, Y: {Y}, FrameX: {Main.tile[X, Y].frameX}, FrameY: {Main.tile[X, Y].frameY}");
                                //END DEBUG
                                if (type == 0 && (etype == 0 || etype == 4))
                                    adjustFurniture(ref X, ref Y, ref style);
                                CommandQueue.Add(new HistoryCommand(X, Y, ply));
                                e.Handled = true;
                            }
                            else
                            {
                                //effect only
                                if (type == 1 && (etype == 0 || etype == 2 || etype == 4))
                                    return;
                                logEdit(etype, Main.tile[X, Y], X, Y, type, logName, new List<Vector2>(), style);
                            }
                        }
                        break;
                    case PacketTypes.PlaceObject:
                        {
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
                            ushort type = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index + 4);
                            int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6);
                            //DEBUG:
                            //TSPlayer.All.SendInfoMessage($"Style: {style}");
                            int alt = (byte)e.Msg.readBuffer[e.Index + 8];
                            //TSPlayer.All.SendInfoMessage($"Alternate: {alt}");
                            int rand = (sbyte)e.Msg.readBuffer[e.Index + 9];
                            //TSPlayer.All.SendInfoMessage($"Random: {rand}");
                            bool dir = BitConverter.ToBoolean(e.Msg.readBuffer, e.Index + 10);

                            TSPlayer ply = TShock.Players[e.Msg.whoAmI];
                            string logName = ply.User == null ? "unregistered" : ply.User.Name;
                            //Checking history now requires build permission in the area due to load order, if needed this could be fixed by having an alternate function check this packet on a higher order.
                            if (AwaitingHistory[e.Msg.whoAmI])
                            {
                                AwaitingHistory[e.Msg.whoAmI] = false;
                                ply.SendTileSquare(X, Y, 5);
                                CommandQueue.Add(new HistoryCommand(X, Y, ply));
                                e.Handled = true;
                            }
                            else
                            {
                                logEdit(1, Main.tile[X, Y], X, Y, type, logName, new List<Vector2>(), (byte)style, alt, rand, dir);
                            }
                        }
                        break;
                    //chest delete
                    case PacketTypes.TileKill:
                        {
                            byte flag = e.Msg.readBuffer[e.Index];
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3);
                            int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5);
                            byte style2 = (byte)style;
                            TSPlayer ply = TShock.Players[e.Msg.whoAmI];
                            string logName = ply.User == null ? "unregistered" : ply.User.Name;
                            //PlaceChest
                            if (flag == 0)
                            {
                                if (AwaitingHistory[e.Msg.whoAmI])
                                {
                                    AwaitingHistory[e.Msg.whoAmI] = false;
                                    ply.SendTileSquare(X, Y, 5);
                                    CommandQueue.Add(new HistoryCommand(X, Y, ply));
                                    e.Handled = true;
                                }
                                else
                                {
                                    logEdit(1, Main.tile[X, Y], X, Y, 21, logName, new List<Vector2>(), style2);
                                }
                                return;
                            }
                            //KillChest
                            if (flag == 1 && Main.tile[X, Y].type == 21)
                            {
                                if (AwaitingHistory[e.Msg.whoAmI])
                                {
                                    AwaitingHistory[e.Msg.whoAmI] = false;
                                    ply.SendTileSquare(X, Y, 5);
                                    adjustFurniture(ref X, ref Y, ref style2);
                                    CommandQueue.Add(new HistoryCommand(X, Y, ply));
                                    e.Handled = true;
                                    return;
                                }
                                adjustFurniture(ref X, ref Y, ref style2);
                                Queue(logName, X, Y, 0, Main.tile[X, Y].type, style2, Main.tile[X, Y].color());
                                return;
                            }
                            //PlaceDresser
                            if (flag == 2)
                            {
                                if (AwaitingHistory[e.Msg.whoAmI])
                                {
                                    AwaitingHistory[e.Msg.whoAmI] = false;
                                    ply.SendTileSquare(X, Y, 5);
                                    CommandQueue.Add(new HistoryCommand(X, Y, ply));
                                    e.Handled = true;
                                }
                                else
                                {
                                    logEdit(1, Main.tile[X, Y], X, Y, 88, logName, new List<Vector2>(), style2);
                                }
                                return;
                            }
                            //KillDresser
                            if (flag == 3 && Main.tile[X, Y].type == 88)
                            {
                                if (AwaitingHistory[e.Msg.whoAmI])
                                {
                                    AwaitingHistory[e.Msg.whoAmI] = false;
                                    ply.SendTileSquare(X, Y, 5);
                                    adjustFurniture(ref X, ref Y, ref style2);
                                    CommandQueue.Add(new HistoryCommand(X, Y, ply));
                                    e.Handled = true;
                                    return;
                                }
                                adjustFurniture(ref X, ref Y, ref style2);
                                Queue(logName, X, Y, 0, Main.tile[X, Y].type, style2, Main.tile[X, Y].color());
                                return;
                            }
                        }
                        break;
                    case PacketTypes.PaintTile:
                        {
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
                            byte color = e.Msg.readBuffer[e.Index + 4];

                            string logName = TShock.Players[e.Msg.whoAmI].User == null ? "unregistered" : TShock.Players[e.Msg.whoAmI].User.Name;
                            Queue(logName, X, Y, 25, color, 0, Main.tile[X, Y].color());
                        }
                        break;
                    case PacketTypes.PaintWall:
                        {
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
                            byte color = e.Msg.readBuffer[e.Index + 4];

                            string logName = TShock.Players[e.Msg.whoAmI].User == null ? "unregistered" : TShock.Players[e.Msg.whoAmI].User.Name;
                            Queue(logName, X, Y, 26, color, 0, Main.tile[X, Y].wallColor());
                        }
                        break;
                    case PacketTypes.SignNew:
                        {
                            ushort signI = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index);
                            int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
                            int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4);
                            byte s = 0;
                            adjustFurniture(ref X, ref Y, ref s); //Adjust coords so history picks it up, readSign() adjusts back to origin anyway
                            string logName = TShock.Players[e.Msg.whoAmI].User == null ? "unregistered" : TShock.Players[e.Msg.whoAmI].User.Name;
                            Queue(logName, X, Y, 27, data: signI, text: Main.sign[signI].text);
                        }
                        break;
                    case PacketTypes.MassWireOperation:
                        {
                            int X1 = BitConverter.ToInt16(e.Msg.readBuffer, e.Index);
                            int Y1 = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2);
                            int X2 = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4);
                            int Y2 = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6);
                            byte toolMode = e.Msg.readBuffer[e.Index + 8];
                            //Modes Red=1, Green=2, Blue=4, Yellow=8, Actuator=16, Cutter=32

                            bool direction = Main.player[e.Msg.whoAmI].direction == 1;
                            TSPlayer ply = TShock.Players[e.Msg.whoAmI];
                            string logName = ply.User == null ? "unregistered" : ply.User.Name;
                            int minX = X1, maxX = X2, minY = Y1, maxY = Y2;
                            int drawX = direction ? minX : maxX;
                            int drawY = direction ? maxY : minY;
                            if (X2 < X1)
                            {
                                minX = X2;
                                maxX = X1;
                            }
                            if (Y2 < Y1)
                            {
                                minY = Y2;
                                maxY = Y1;
                            }
                            int wires = 0, acts = 0;
                            //We count our own wires since the client may only be able to place a few or even none.
                            if ((toolMode & 32) == 0)
                                countPlayerWires(Main.player[e.Msg.whoAmI], ref wires, ref acts);

                            for (int starty = minY; starty <= maxY; starty++)
                            {
                                logAdvancedWire(drawX, starty, toolMode, logName, ref wires, ref acts);
                            }
                            for (int startx = minX; startx <= maxX; startx++)
                            {
                                if (startx == drawX)
                                    continue;
                                logAdvancedWire(startx, drawY, toolMode, logName, ref wires, ref acts);
                            }
                        }
                        break;
                }
            }
        }