/* * Copyright (C) 2012-2018 CypherCore * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ using Framework.Constants; using Framework.Dynamic; using Game.Entities; using System.Collections.Generic; using System.Linq; namespace Game.Network.Packets { public class BuyBackItem : ClientPacket { public BuyBackItem(WorldPacket packet) : base(packet) { } public override void Read() { VendorGUID = _worldPacket.ReadPackedGuid(); Slot = _worldPacket.ReadUInt32(); } public ObjectGuid VendorGUID; public uint Slot; } public class BuyItem : ClientPacket { public BuyItem(WorldPacket packet) : base(packet) { Item = new ItemInstance(); } public override void Read() { VendorGUID = _worldPacket.ReadPackedGuid(); ContainerGUID = _worldPacket.ReadPackedGuid(); Quantity = _worldPacket.ReadInt32(); Muid = _worldPacket.ReadUInt32(); Slot = _worldPacket.ReadUInt32(); Item.Read(_worldPacket); ItemType = (ItemVendorType)_worldPacket.ReadBits(2); } public ObjectGuid VendorGUID; public ItemInstance Item; public uint Muid; public uint Slot; public ItemVendorType ItemType; public int Quantity; public ObjectGuid ContainerGUID; } public class BuySucceeded : ServerPacket { public BuySucceeded() : base(ServerOpcodes.BuySucceeded) { } public override void Write() { _worldPacket.WritePackedGuid(VendorGUID); _worldPacket.WriteUInt32(Muid); _worldPacket.WriteUInt32(NewQuantity); _worldPacket.WriteUInt32(QuantityBought); } public ObjectGuid VendorGUID; public uint Muid; public uint QuantityBought; public uint NewQuantity; } public class BuyFailed : ServerPacket { public BuyFailed() : base(ServerOpcodes.BuyFailed) { } public override void Write() { _worldPacket.WritePackedGuid(VendorGUID); _worldPacket.WriteUInt32(Muid); _worldPacket.WriteUInt8(Reason); } public ObjectGuid VendorGUID; public uint Muid; public BuyResult Reason = BuyResult.CantFindItem; } public class GetItemPurchaseData : ClientPacket { public GetItemPurchaseData(WorldPacket packet) : base(packet) { } public override void Read() { ItemGUID = _worldPacket.ReadPackedGuid(); } public ObjectGuid ItemGUID; } class SetItemPurchaseData : ServerPacket { public SetItemPurchaseData() : base(ServerOpcodes.SetItemPurchaseData, ConnectionType.Instance) { } public override void Write() { _worldPacket.WritePackedGuid(ItemGUID); Contents.Write(_worldPacket); _worldPacket.WriteUInt32(Flags); _worldPacket.WriteUInt32(PurchaseTime); } public uint PurchaseTime; public uint Flags; public ItemPurchaseContents Contents = new ItemPurchaseContents(); public ObjectGuid ItemGUID; } class ItemPurchaseRefund : ClientPacket { public ItemPurchaseRefund(WorldPacket packet) : base(packet) { } public override void Read() { ItemGUID = _worldPacket.ReadPackedGuid(); } public ObjectGuid ItemGUID; } class ItemPurchaseRefundResult : ServerPacket { public ItemPurchaseRefundResult() : base(ServerOpcodes.ItemPurchaseRefundResult, ConnectionType.Instance) { } public override void Write() { _worldPacket.WritePackedGuid(ItemGUID); _worldPacket.WriteUInt8(Result); _worldPacket.WriteBit(Contents.HasValue); _worldPacket.FlushBits(); if (Contents.HasValue) Contents.Value.Write(_worldPacket); } public byte Result; public ObjectGuid ItemGUID; public Optional Contents; } class ItemExpirePurchaseRefund : ServerPacket { public ItemExpirePurchaseRefund() : base(ServerOpcodes.ItemExpirePurchaseRefund, ConnectionType.Instance) { } public override void Write() { _worldPacket.WritePackedGuid(ItemGUID); } public ObjectGuid ItemGUID; } public class RepairItem : ClientPacket { public RepairItem(WorldPacket packet) : base(packet) { } public override void Read() { NpcGUID = _worldPacket.ReadPackedGuid(); ItemGUID = _worldPacket.ReadPackedGuid(); UseGuildBank = _worldPacket.HasBit(); } public ObjectGuid NpcGUID; public ObjectGuid ItemGUID; public bool UseGuildBank; } public class SellItem : ClientPacket { public SellItem(WorldPacket packet) : base(packet) { } public override void Read() { VendorGUID = _worldPacket.ReadPackedGuid(); ItemGUID = _worldPacket.ReadPackedGuid(); Amount = _worldPacket.ReadUInt32(); } public ObjectGuid VendorGUID; public ObjectGuid ItemGUID; public uint Amount; } public class ItemTimeUpdate : ServerPacket { public ItemTimeUpdate() : base(ServerOpcodes.ItemTimeUpdate) { } public override void Write() { _worldPacket.WritePackedGuid(ItemGuid); _worldPacket.WriteUInt32(DurationLeft); } public ObjectGuid ItemGuid; public uint DurationLeft; } public class SetProficiency : ServerPacket { public SetProficiency() : base(ServerOpcodes.SetProficiency, ConnectionType.Instance) { } public override void Write() { _worldPacket.WriteUInt32(ProficiencyMask); _worldPacket.WriteUInt8(ProficiencyClass); } public uint ProficiencyMask; public byte ProficiencyClass; } public class InventoryChangeFailure : ServerPacket { public InventoryChangeFailure() : base(ServerOpcodes.InventoryChangeFailure) { } public override void Write() { _worldPacket.WriteInt8(BagResult); _worldPacket.WritePackedGuid(Item[0]); _worldPacket.WritePackedGuid(Item[1]); _worldPacket.WriteUInt8(ContainerBSlot); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_WRONG_BAG_TYPE_2 switch (BagResult) { case InventoryResult.CantEquipLevelI: case InventoryResult.PurchaseLevelTooLow: _worldPacket.WriteUInt32(Level); break; case InventoryResult.EventAutoequipBindConfirm: _worldPacket.WritePackedGuid(SrcContainer); _worldPacket.WriteInt32(SrcSlot); _worldPacket.WritePackedGuid(DstContainer); break; case InventoryResult.ItemMaxLimitCategoryCountExceededIs: case InventoryResult.ItemMaxLimitCategorySocketedExceededIs: case InventoryResult.ItemMaxLimitCategoryEquippedExceededIs: _worldPacket.WriteInt32(LimitCategory); break; } } public InventoryResult BagResult; public byte ContainerBSlot; public ObjectGuid SrcContainer; public ObjectGuid DstContainer; public int SrcSlot; public int LimitCategory; public int Level; public ObjectGuid[] Item = new ObjectGuid[2]; } public class SplitItem : ClientPacket { public SplitItem(WorldPacket packet) : base(packet) { } public override void Read() { Inv = new InvUpdate(_worldPacket); FromPackSlot = _worldPacket.ReadUInt8(); FromSlot = _worldPacket.ReadUInt8(); ToPackSlot = _worldPacket.ReadUInt8(); ToSlot = _worldPacket.ReadUInt8(); Quantity = _worldPacket.ReadInt32(); } public byte ToSlot; public byte ToPackSlot; public byte FromPackSlot; public int Quantity; public InvUpdate Inv; public byte FromSlot; } public class SwapInvItem : ClientPacket { public SwapInvItem(WorldPacket packet) : base(packet) { } public override void Read() { Inv = new InvUpdate(_worldPacket); Slot2 = _worldPacket.ReadUInt8(); Slot1 = _worldPacket.ReadUInt8(); } public InvUpdate Inv; public byte Slot1; // Source Slot public byte Slot2; // Destination Slot } public class SwapItem : ClientPacket { public SwapItem(WorldPacket packet) : base(packet) { } public override void Read() { Inv = new InvUpdate(_worldPacket); ContainerSlotB = _worldPacket.ReadUInt8(); ContainerSlotA = _worldPacket.ReadUInt8(); SlotB = _worldPacket.ReadUInt8(); SlotA = _worldPacket.ReadUInt8(); } public InvUpdate Inv; public byte SlotA; public byte ContainerSlotB; public byte SlotB; public byte ContainerSlotA; } public class AutoEquipItem : ClientPacket { public AutoEquipItem(WorldPacket packet) : base(packet) { } public override void Read() { Inv = new InvUpdate(_worldPacket); PackSlot = _worldPacket.ReadUInt8(); Slot = _worldPacket.ReadUInt8(); } public byte Slot; public InvUpdate Inv; public byte PackSlot; } class AutoEquipItemSlot : ClientPacket { public AutoEquipItemSlot(WorldPacket packet) : base(packet) { } public override void Read() { Inv = new InvUpdate(_worldPacket); Item = _worldPacket.ReadPackedGuid(); ItemDstSlot = _worldPacket.ReadUInt8(); } public ObjectGuid Item; public byte ItemDstSlot; public InvUpdate Inv; } public class AutoStoreBagItem : ClientPacket { public AutoStoreBagItem(WorldPacket packet) : base(packet) { } public override void Read() { Inv = new InvUpdate(_worldPacket); ContainerSlotB = _worldPacket.ReadUInt8(); ContainerSlotA = _worldPacket.ReadUInt8(); SlotA = _worldPacket.ReadUInt8(); } public byte ContainerSlotB; public InvUpdate Inv; public byte ContainerSlotA; public byte SlotA; } public class DestroyItem : ClientPacket { public DestroyItem(WorldPacket packet) : base(packet) { } public override void Read() { Count = _worldPacket.ReadUInt32(); ContainerId = _worldPacket.ReadUInt8(); SlotNum = _worldPacket.ReadUInt8(); } public uint Count; public byte SlotNum; public byte ContainerId; } public class SellResponse : ServerPacket { public SellResponse() : base(ServerOpcodes.SellResponse) { } public override void Write() { _worldPacket.WritePackedGuid(VendorGUID); _worldPacket.WritePackedGuid(ItemGUID); _worldPacket.WriteUInt8(Reason); } public ObjectGuid VendorGUID; public ObjectGuid ItemGUID; public SellResult Reason = SellResult.Unk; } class ItemPushResult : ServerPacket { public ItemPushResult() : base(ServerOpcodes.ItemPushResult) { } public override void Write() { _worldPacket.WritePackedGuid(PlayerGUID); _worldPacket.WriteUInt8(Slot); _worldPacket.WriteInt32(SlotInBag); _worldPacket.WriteInt32(QuestLogItemID); _worldPacket.WriteUInt32(Quantity); _worldPacket.WriteUInt32(QuantityInInventory); _worldPacket.WriteUInt32(DungeonEncounterID); _worldPacket.WriteInt32(BattlePetSpeciesID); _worldPacket.WriteInt32(BattlePetBreedID); _worldPacket.WriteUInt32(BattlePetBreedQuality); _worldPacket.WriteInt32(BattlePetLevel); _worldPacket.WritePackedGuid(ItemGUID); _worldPacket.WriteBit(Pushed); _worldPacket.WriteBit(Created); _worldPacket.WriteBits((uint)DisplayText, 3); _worldPacket.WriteBit(IsBonusRoll); _worldPacket.WriteBit(IsEncounterLoot); _worldPacket.FlushBits(); Item.Write(_worldPacket); } public ObjectGuid PlayerGUID; public byte Slot; public int SlotInBag; public ItemInstance Item; public int QuestLogItemID;// Item ID used for updating quest progress // only set if different than real ID (similar to CreatureTemplate.KillCredit) public uint Quantity; public uint QuantityInInventory; public int DungeonEncounterID; public int BattlePetSpeciesID; public int BattlePetBreedID; public uint BattlePetBreedQuality; public int BattlePetLevel; public ObjectGuid ItemGUID; public bool Pushed; public DisplayType DisplayText; public bool Created; public bool IsBonusRoll; public bool IsEncounterLoot; public enum DisplayType { Hidden = 0, Normal = 1, EncounterLoot = 2 } } class ReadItem : ClientPacket { public ReadItem(WorldPacket packet) : base(packet) { } public override void Read() { PackSlot = _worldPacket.ReadUInt8(); Slot = _worldPacket.ReadUInt8(); } public byte PackSlot; public byte Slot; } class ReadItemResultFailed : ServerPacket { public ReadItemResultFailed() : base(ServerOpcodes.ReadItemResultFailed) { } public override void Write() { _worldPacket.WritePackedGuid(Item); _worldPacket.WriteUInt32(Delay); _worldPacket.WriteBits(Subcode, 2); _worldPacket.FlushBits(); } public ObjectGuid Item; public byte Subcode; public uint Delay; } class ReadItemResultOK : ServerPacket { public ReadItemResultOK() : base(ServerOpcodes.ReadItemResultOk) { } public override void Write() { _worldPacket.WritePackedGuid(Item); } public ObjectGuid Item; } class WrapItem : ClientPacket { public WrapItem(WorldPacket packet) : base(packet) { } public override void Read() { Inv = new InvUpdate(_worldPacket); } public InvUpdate Inv; } class EnchantmentLog : ServerPacket { public EnchantmentLog() : base(ServerOpcodes.EnchantmentLog) { } public override void Write() { _worldPacket.WritePackedGuid(Caster); _worldPacket.WritePackedGuid(Owner); _worldPacket.WritePackedGuid(ItemGUID); _worldPacket.WriteUInt32(ItemID); _worldPacket.WriteUInt32(Enchantment); _worldPacket.WriteUInt32(EnchantSlot); } public ObjectGuid Caster; public ObjectGuid Owner; public ObjectGuid ItemGUID; public uint ItemID; public uint EnchantSlot; public uint Enchantment; } class CancelTempEnchantment : ClientPacket { public CancelTempEnchantment(WorldPacket packet) : base(packet) { } public override void Read() { Slot = _worldPacket.ReadInt32(); } public int Slot; } class ItemCooldown : ServerPacket { public ItemCooldown() : base(ServerOpcodes.ItemCooldown) { } public override void Write() { _worldPacket.WritePackedGuid(ItemGuid); _worldPacket.WriteUInt32(SpellID); _worldPacket.WriteUInt32(Cooldown); } public ObjectGuid ItemGuid; public uint SpellID; public uint Cooldown; } class ItemEnchantTimeUpdate : ServerPacket { public ItemEnchantTimeUpdate() : base(ServerOpcodes.ItemEnchantTimeUpdate, ConnectionType.Instance) { } public override void Write() { _worldPacket.WritePackedGuid(ItemGuid); _worldPacket.WriteUInt32(DurationLeft); _worldPacket.WriteUInt32(Slot); _worldPacket.WritePackedGuid(OwnerGuid); } public ObjectGuid OwnerGuid; public ObjectGuid ItemGuid; public uint DurationLeft; public uint Slot; } class UseCritterItem : ClientPacket { public UseCritterItem(WorldPacket packet) : base(packet) { } public override void Read() { ItemGuid = _worldPacket.ReadPackedGuid(); } public ObjectGuid ItemGuid; } class UpgradeItem : ClientPacket { public UpgradeItem(WorldPacket packet) : base(packet) { } public override void Read() { ItemMaster = _worldPacket.ReadPackedGuid(); ItemGUID = _worldPacket.ReadPackedGuid(); UpgradeID = _worldPacket.ReadInt32(); ContainerSlot = _worldPacket.ReadInt32(); Slot = _worldPacket.ReadInt32(); } public ObjectGuid ItemMaster; public ObjectGuid ItemGUID; public int ContainerSlot; public int UpgradeID; public int Slot; } class ItemUpgradeResult : ServerPacket { public ItemUpgradeResult() : base(ServerOpcodes.ItemUpgradeResult) { } public override void Write() { _worldPacket.WriteBit(Success); _worldPacket.FlushBits(); } public bool Success; } class SocketGems : ClientPacket { public SocketGems(WorldPacket packet) : base(packet) { } public override void Read() { ItemGuid = _worldPacket.ReadPackedGuid(); for (int i = 0; i < ItemConst.MaxGemSockets; ++i) GemItem[i] = _worldPacket.ReadPackedGuid(); } public ObjectGuid ItemGuid; public ObjectGuid[] GemItem = new ObjectGuid[ItemConst.MaxGemSockets]; } class SocketGemsResult : ServerPacket { public SocketGemsResult() : base(ServerOpcodes.SocketGems, ConnectionType.Instance) { } public override void Write() { _worldPacket.WritePackedGuid(Item); } public ObjectGuid Item; } class SortBags : ClientPacket { public SortBags(WorldPacket packet) : base(packet) { } public override void Read() { } } class SortBankBags : ClientPacket { public SortBankBags(WorldPacket packet) : base(packet) { } public override void Read() { } } class SortReagentBankBags : ClientPacket { public SortReagentBankBags(WorldPacket packet) : base(packet) { } public override void Read() { } } class SortBagsResult : ServerPacket { public SortBagsResult() : base(ServerOpcodes.SortBagsResult, ConnectionType.Instance) { } public override void Write() { } } class RemoveNewItem : ClientPacket { public RemoveNewItem(WorldPacket packet) : base(packet) { } public override void Read() { ItemGuid = _worldPacket.ReadPackedGuid(); } public ObjectGuid ItemGuid { get; set; } } class CharacterInventoryOverflowWarning : ServerPacket { public CharacterInventoryOverflowWarning() : base(ServerOpcodes.CharacterInventoryOverflowWarning) { } public override void Write() { } } //Structs public class ItemBonusInstanceData { public void Write(WorldPacket data) { data.WriteUInt8(Context); data.WriteUInt32(BonusListIDs.Count); foreach (uint bonusID in BonusListIDs) data.WriteUInt32(bonusID); } public void Read(WorldPacket data) { Context = data.ReadUInt8(); uint bonusListIdSize = data.ReadUInt32(); BonusListIDs = new List(); for (uint i = 0u; i < bonusListIdSize; ++i) { uint bonusId = data.ReadUInt32(); BonusListIDs.Add(bonusId); } } public override int GetHashCode() { return Context.GetHashCode() ^ BonusListIDs.GetHashCode(); } public override bool Equals(object obj) { if (obj is ItemBonusInstanceData) return (ItemBonusInstanceData)obj == this; return false; } public static bool operator ==(ItemBonusInstanceData left, ItemBonusInstanceData right) { if (left.Context != right.Context) return false; if (left.BonusListIDs.Count != right.BonusListIDs.Count) return false; return left.BonusListIDs.SequenceEqual(right.BonusListIDs); } public static bool operator !=(ItemBonusInstanceData left, ItemBonusInstanceData right) { return !(left == right); } public byte Context; public List BonusListIDs = new List(); } public class ItemInstance { public ItemInstance() { } public ItemInstance(Item item) { ItemID = item.GetEntry(); RandomPropertiesSeed = item.GetItemSuffixFactor(); RandomPropertiesID = (uint)item.GetItemRandomPropertyId(); var bonusListIds = item.GetDynamicValues(ItemDynamicFields.BonusListIds); if (!bonusListIds.Empty()) { ItemBonus.HasValue = true; ItemBonus.Value.BonusListIDs.AddRange(bonusListIds); ItemBonus.Value.Context = (byte)item.GetUInt32Value(ItemFields.Context); } uint mask = item.GetUInt32Value(ItemFields.ModifiersMask); if (mask != 0) { Modifications.HasValue = true; for (int i = 0; mask != 0; mask >>= 1, ++i) { if ((mask & 1) != 0) Modifications.Value.Insert(i, (int)item.GetModifier((ItemModifier)i)); } } } public ItemInstance(Loots.LootItem lootItem) { ItemID = lootItem.itemid; RandomPropertiesSeed = lootItem.randomSuffix; if (lootItem.randomPropertyId.Type != ItemRandomEnchantmentType.BonusList) RandomPropertiesID = lootItem.randomPropertyId.Id; if (!lootItem.BonusListIDs.Empty()) { ItemBonus.HasValue = true; ItemBonus.Value.BonusListIDs = lootItem.BonusListIDs; ItemBonus.Value.Context = lootItem.context; } if (lootItem.upgradeId != 0) { Modifications.HasValue = true; Modifications.Value.Insert((int)ItemModifier.UpgradeId, (int)lootItem.upgradeId); } } public ItemInstance(VoidStorageItem voidItem) { ItemID = voidItem.ItemEntry; RandomPropertiesSeed = voidItem.ItemSuffixFactor; if (voidItem.ItemRandomPropertyId.Type != ItemRandomEnchantmentType.BonusList) RandomPropertiesID = voidItem.ItemRandomPropertyId.Id; if (voidItem.ItemUpgradeId != 0 || voidItem.FixedScalingLevel != 0 || voidItem.ArtifactKnowledgeLevel != 0) { Modifications.HasValue = true; if (voidItem.ItemUpgradeId != 0) Modifications.Value.Insert((int)ItemModifier.UpgradeId, (int)voidItem.ItemUpgradeId); if (voidItem.FixedScalingLevel != 0) Modifications.Value.Insert((int)ItemModifier.ScalingStatDistributionFixedLevel, (int)voidItem.FixedScalingLevel); if (voidItem.ArtifactKnowledgeLevel != 0) Modifications.Value.Insert((int)ItemModifier.ArtifactKnowledgeLevel, (int)voidItem.ArtifactKnowledgeLevel); } if (!voidItem.BonusListIDs.Empty()) { ItemBonus.HasValue = true; ItemBonus.Value.Context = voidItem.Context; ItemBonus.Value.BonusListIDs = voidItem.BonusListIDs; } } public ItemInstance(ItemDynamicFieldGems gem) { ItemID = gem.ItemId; ItemBonusInstanceData bonus = new ItemBonusInstanceData(); bonus.Context = gem.Context; foreach (ushort bonusListId in gem.BonusListIDs) if (bonusListId != 0) bonus.BonusListIDs.Add(bonusListId); if (bonus.Context != 0 || !bonus.BonusListIDs.Empty()) ItemBonus.Set(bonus); } public void Write(WorldPacket data) { data.WriteUInt32(ItemID); data.WriteUInt32(RandomPropertiesSeed); data.WriteUInt32(RandomPropertiesID); data.WriteBit(ItemBonus.HasValue); data.WriteBit(Modifications.HasValue); data.FlushBits(); if (ItemBonus.HasValue) ItemBonus.Value.Write(data); if (Modifications.HasValue) Modifications.Value.Write(data); } public void Read(WorldPacket data) { ItemID = data.ReadUInt32(); RandomPropertiesSeed = data.ReadUInt32(); RandomPropertiesID = data.ReadUInt32(); ItemBonus.HasValue = data.HasBit(); Modifications.HasValue = data.HasBit(); data.ResetBitPos(); if (ItemBonus.HasValue) ItemBonus.Value.Read(data); if (Modifications.HasValue) Modifications.Value.Read(data); } public override int GetHashCode() { return ItemID.GetHashCode() ^ RandomPropertiesSeed.GetHashCode() ^ RandomPropertiesID.GetHashCode() ^ ItemBonus.GetHashCode() ^ Modifications.GetHashCode(); } public override bool Equals(object obj) { if (obj is ItemInstance) return (ItemInstance)obj == this; return false; } public static bool operator ==(ItemInstance left, ItemInstance right) { if (left.ItemID != right.ItemID || left.RandomPropertiesID != right.RandomPropertiesID || left.RandomPropertiesSeed != right.RandomPropertiesSeed) return false; if (left.ItemBonus.HasValue != right.ItemBonus.HasValue || left.Modifications.HasValue != right.Modifications.HasValue) return false; if (left.Modifications.HasValue && left.Modifications.Value != right.Modifications.Value) return false; if (left.ItemBonus.HasValue && left.ItemBonus.Value != right.ItemBonus.Value) return false; return true; } public static bool operator !=(ItemInstance left, ItemInstance right) { return !(left == right); } public uint ItemID; public uint RandomPropertiesSeed; public uint RandomPropertiesID; public Optional ItemBonus; public Optional Modifications; } public class ItemEnchantData { public ItemEnchantData(int id, uint expiration, int charges, byte slot) { ID = id; Expiration = expiration; Charges = charges; Slot = slot; } public void Write(WorldPacket data) { data.WriteInt32(ID); data.WriteUInt32(Expiration); data.WriteInt32(Charges); data.WriteUInt8(Slot); } public int ID; public uint Expiration; public int Charges; public byte Slot; } public class ItemGemData { public void Write(WorldPacket data) { data.WriteUInt8(Slot); Item.Write(data); } public void Read(WorldPacket data) { Slot = data.ReadUInt8(); Item.Read(data); } public byte Slot; public ItemInstance Item = new ItemInstance(); } public struct InvUpdate { public InvUpdate(WorldPacket data) { Items = new List(); int size = data.ReadBits(2); for (int i = 0; i < size; ++i) { var item = new InvItem { ContainerSlot = data.ReadUInt8(), Slot = data.ReadUInt8() }; Items.Add(item); } } public List Items; public struct InvItem { public byte ContainerSlot; public byte Slot; } } struct ItemPurchaseRefundItem { public void Write(WorldPacket data) { data.WriteUInt32(ItemID); data.WriteUInt32(ItemCount); } public uint ItemID; public uint ItemCount; } struct ItemPurchaseRefundCurrency { public void Write(WorldPacket data) { data.WriteUInt32(CurrencyID); data.WriteUInt32(CurrencyCount); } public uint CurrencyID; public uint CurrencyCount; } class ItemPurchaseContents { public void Write(WorldPacket data) { data.WriteUInt64(Money); for (int i = 0; i < 5; ++i) Items[i].Write(data); for (int i = 0; i < 5; ++i) Currencies[i].Write(data); } public ulong Money; public ItemPurchaseRefundItem[] Items = new ItemPurchaseRefundItem[5]; public ItemPurchaseRefundCurrency[] Currencies = new ItemPurchaseRefundCurrency[5]; } }