private void OnSendTileSquare(TSPlayer player, BinaryReader reader) { var size = reader.ReadUInt16(); if (size != 1) { return; } reader.ReadInt16(); reader.ReadInt16(); var tile = new NetTile(reader.BaseStream); if (tile.Type == TileID.Mannequin || tile.Type == TileID.Womannequin) { var baseFrameX = tile.FrameX / 100; ILookup <int, Item> lookup; if (tile.FrameY == 0) { lookup = _headSlotLookup; } else if (tile.FrameY == 18) { lookup = _bodySlotLookup; } else { lookup = _legSlotLookup; } var armorItem = lookup[baseFrameX].FirstOrDefault(); if (armorItem != null) { var balanceSheet = player.GetOrCreateBalanceSheet(); balanceSheet.AddTransaction(Transaction.WorldSlot, armorItem.type, -1); } } else if (tile.Type == TileID.WeaponsRack) { var baseFrameX = tile.FrameX - 5000 * (tile.FrameX / 5000); // When placing a weapon an a weapon rack, the client will send two SendTileSquare packets; the first // gives the item ID, and the second gives the item prefix. We know which one is the item ID since the // base frameX is over 100. if (baseFrameX > 100) { player.SetWeaponRackItemId(baseFrameX - 100); } else { var balanceSheet = player.GetOrCreateBalanceSheet(); var weaponRackItemId = player.GetWeaponRackItemId(); balanceSheet.AddTransaction(Transaction.WorldSlot, weaponRackItemId, -1, (byte)baseFrameX); } } }