From 143777cf5ce2a376356c6b2df55e6ef608b392dc Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 13 Apr 2021 18:04:05 -0400 Subject: [PATCH] Core/Guild: Implement new guild bank swap item opcodes Port From (https://github.com/TrinityCore/TrinityCore/pull/26351) --- Source/Framework/Constants/Network/Opcodes.cs | 9 + Source/Game/Handlers/GuildHandler.cs | 175 ++++++++++++++++-- .../Game/Networking/Packets/GuildPackets.cs | 153 ++++++++++++--- 3 files changed, 294 insertions(+), 43 deletions(-) diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index a591573f4..3b8574639 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -341,6 +341,15 @@ namespace Framework.Constants GuildBankRemainingWithdrawMoneyQuery = 0x3084, GuildBankSetTabText = 0x3087, GuildBankTextQuery = 0x3088, + GuildBankTransferItemToBank = 0x34bd, + GuildBankTransferItemToPlayer = 0x34be, + GuildBankMoveItemInBank = 0x34c1, + GuildBankCombineItemStackWithBank = 0x34c2, + GuildBankTransferItemStackToBank = 0x34c3, + GuildBankCombineItemStackWithPlayer = 0x34c4, + GuildBankTransferItemStackToPlayer = 0x34c5, + GuildBankTransferItemToPlayerAutostore = 0x34c6, + GuildBankCombineItemStackInBank = 0x34c7, GuildBankUpdateTab = 0x34cb, GuildBankWithdrawMoney = 0x34cd, GuildChallengeUpdateRequest = 0x307c, diff --git a/Source/Game/Handlers/GuildHandler.cs b/Source/Game/Handlers/GuildHandler.cs index 6b3f5e621..3318bdd26 100644 --- a/Source/Game/Handlers/GuildHandler.cs +++ b/Source/Game/Handlers/GuildHandler.cs @@ -287,29 +287,172 @@ namespace Game } } - //[WorldPacketHandler(ClientOpcodes.GuildBankSwapItems)] - void HandleGuildBankSwapItems(GuildBankSwapItems packet) + [WorldPacketHandler(ClientOpcodes.GuildBankTransferItemToBank)] + void HandleGuildBankTransferItemToBank(GuildBankTransferItem guildBankTransferItem) + { + if (!GetPlayer().GetGameObjectIfCanInteractWith(guildBankTransferItem.Banker, GameObjectTypes.GuildBank)) + return; + + Guild guild = GetPlayer().GetGuild(); + if (guild == null) + return; + + byte playerBag = InventorySlots.Bag0; + + if (guildBankTransferItem.HasBag) + playerBag = guildBankTransferItem.PlayerBag; + + if (!Player.IsInventoryPos(playerBag, guildBankTransferItem.PlayerSlot)) + GetPlayer().SendEquipError(InventoryResult.InternalBagError); + else + guild.SwapItemsWithInventory(GetPlayer(), false, guildBankTransferItem.BankTab, guildBankTransferItem.BankSlot, playerBag, guildBankTransferItem.PlayerSlot, 0); + } + + [WorldPacketHandler(ClientOpcodes.GuildBankTransferItemToPlayer)] + void HandleGuildBankTransferItemToPlayer(GuildBankTransferItem guildBankTransferItem) + { + if (!GetPlayer().GetGameObjectIfCanInteractWith(guildBankTransferItem.Banker, GameObjectTypes.GuildBank)) + return; + + Guild guild = GetPlayer().GetGuild(); + if (guild == null) + return; + + byte playerBag = InventorySlots.Bag0; + + if (guildBankTransferItem.HasBag) + playerBag = guildBankTransferItem.PlayerBag; + + if (!Player.IsInventoryPos(playerBag, guildBankTransferItem.PlayerSlot)) + GetPlayer().SendEquipError(InventoryResult.InternalBagError); + else + guild.SwapItemsWithInventory(GetPlayer(), true, guildBankTransferItem.BankTab, guildBankTransferItem.BankSlot, playerBag, guildBankTransferItem.PlayerSlot, 0); + } + + [WorldPacketHandler(ClientOpcodes.GuildBankMoveItemInBank)] + void HandleGuildBankMoveItemInBank(GuildBankMoveItemInBank guildBankMoveItemInBank) + { + if (!GetPlayer().GetGameObjectIfCanInteractWith(guildBankMoveItemInBank.Banker, GameObjectTypes.GuildBank)) + return; + + Guild guild = GetPlayer().GetGuild(); + if (guild == null) + return; + + guild.SwapItems(GetPlayer(), guildBankMoveItemInBank.BankTab, guildBankMoveItemInBank.BankSlot, guildBankMoveItemInBank.NewBankTab, guildBankMoveItemInBank.NewBankSlot, 0); + } + + [WorldPacketHandler(ClientOpcodes.GuildBankCombineItemStackWithBank)] + void HandleGuildBankCombineItemStackWithBank(GuildBankCombineItemStack guildBankCombineItemStack) + { + if (!GetPlayer().GetGameObjectIfCanInteractWith(guildBankCombineItemStack.Banker, GameObjectTypes.GuildBank)) + return; + + Guild guild = GetPlayer().GetGuild(); + if (guild == null) + return; + + byte playerBag = InventorySlots.Bag0; + + if (guildBankCombineItemStack.HasBag) + playerBag = guildBankCombineItemStack.PlayerBag; + + if (!Player.IsInventoryPos(playerBag, guildBankCombineItemStack.PlayerSlot)) + GetPlayer().SendEquipError(InventoryResult.InternalBagError); + else + guild.SwapItemsWithInventory(GetPlayer(), false, guildBankCombineItemStack.BankTab, guildBankCombineItemStack.BankSlot, playerBag, guildBankCombineItemStack.PlayerSlot, guildBankCombineItemStack.StackCount); + } + + [WorldPacketHandler(ClientOpcodes.GuildBankCombineItemStackWithPlayer)] + void HandleGuildBankCombineItemStackWithPlayer(GuildBankCombineItemStack guildBankCombineItemStack) + { + if (!GetPlayer().GetGameObjectIfCanInteractWith(guildBankCombineItemStack.Banker, GameObjectTypes.GuildBank)) + return; + + Guild guild = GetPlayer().GetGuild(); + if (guild == null) + return; + + byte playerBag = InventorySlots.Bag0; + + if (guildBankCombineItemStack.HasBag) + playerBag = guildBankCombineItemStack.PlayerBag; + + if (!Player.IsInventoryPos(playerBag, guildBankCombineItemStack.PlayerSlot)) + GetPlayer().SendEquipError(InventoryResult.InternalBagError); + else + guild.SwapItemsWithInventory(GetPlayer(), true, guildBankCombineItemStack.BankTab, guildBankCombineItemStack.BankSlot, playerBag, guildBankCombineItemStack.PlayerSlot, guildBankCombineItemStack.StackCount); + } + + [WorldPacketHandler(ClientOpcodes.GuildBankTransferItemStackToBank)] + void HandleGuildBankTransferItemStackToBank(GuildBankTransferItemStack guildBankTransferItemStack) + { + if (!GetPlayer().GetGameObjectIfCanInteractWith(guildBankTransferItemStack.Banker, GameObjectTypes.GuildBank)) + return; + + Guild guild = GetPlayer().GetGuild(); + if (guild == null) + return; + + byte playerBag = InventorySlots.Bag0; + + if (guildBankTransferItemStack.HasBag) + playerBag = guildBankTransferItemStack.PlayerBag; + + if (!Player.IsInventoryPos(playerBag, guildBankTransferItemStack.PlayerSlot)) + GetPlayer().SendEquipError(InventoryResult.InternalBagError); + else + guild.SwapItemsWithInventory(GetPlayer(), false, guildBankTransferItemStack.BankTab, guildBankTransferItemStack.BankSlot, playerBag, guildBankTransferItemStack.PlayerSlot, guildBankTransferItemStack.StackCount); + } + + [WorldPacketHandler(ClientOpcodes.GuildBankTransferItemStackToPlayer)] + void HandleGuildBankTransferItemStackToPlayer(GuildBankTransferItemStack guildBankTransferItemStack) + { + if (!GetPlayer().GetGameObjectIfCanInteractWith(guildBankTransferItemStack.Banker, GameObjectTypes.GuildBank)) + return; + + Guild guild = GetPlayer().GetGuild(); + if (guild == null) + return; + + byte playerBag = InventorySlots.Bag0; + + if (guildBankTransferItemStack.HasBag) + playerBag = guildBankTransferItemStack.PlayerBag; + + if (!Player.IsInventoryPos(playerBag, guildBankTransferItemStack.PlayerSlot)) + GetPlayer().SendEquipError(InventoryResult.InternalBagError); + else + guild.SwapItemsWithInventory(GetPlayer(), true, guildBankTransferItemStack.BankTab, guildBankTransferItemStack.BankSlot, playerBag, guildBankTransferItemStack.PlayerSlot, guildBankTransferItemStack.StackCount); + } + + [WorldPacketHandler(ClientOpcodes.GuildBankTransferItemToPlayerAutostore)] + void HandleGuildBankTransferItemToPlayerAutoStore(GuildBankTransferItemAutoStore packet) { if (!GetPlayer().GetGameObjectIfCanInteractWith(packet.Banker, GameObjectTypes.GuildBank)) return; Guild guild = GetPlayer().GetGuild(); - if (!guild) + if (guild == null) return; - if (packet.BankOnly) - { - guild.SwapItems(GetPlayer(), packet.BankTab1, packet.BankSlot1, packet.BankTab, packet.BankSlot, (uint)packet.StackCount); - } + if (GetPlayer().GetInventorySlotCount() == 0) + GetPlayer().SendEquipError(InventoryResult.BagFull); else - { - // Player <-> Bank - // Allow to work with inventory only - if (!Player.IsInventoryPos(packet.ContainerSlot, packet.ContainerItemSlot) && !packet.AutoStore) - GetPlayer().SendEquipError(InventoryResult.InternalBagError); - else - guild.SwapItemsWithInventory(GetPlayer(), packet.ToSlot != 0, packet.BankTab, packet.BankSlot, packet.ContainerSlot, packet.ContainerItemSlot, (uint)packet.StackCount); - } + guild.SwapItemsWithInventory(GetPlayer(), true, packet.BankTab, packet.BankSlot, 0, 0, 0); + } + + [WorldPacketHandler(ClientOpcodes.GuildBankCombineItemStackInBank)] + void HandleGuildBankCombineItemStackInBank(GuildBankCombineItemStackInBank packet) + { + if (!GetPlayer().GetGameObjectIfCanInteractWith(packet.Banker, GameObjectTypes.GuildBank)) + return; + + Guild guild = GetPlayer().GetGuild(); + if (guild == null) + return; + + guild.SwapItems(GetPlayer(), packet.BankTab, packet.BankSlot, packet.NewBankTab, packet.NewBankSlot, packet.StackCount); } [WorldPacketHandler(ClientOpcodes.GuildBankBuyTab)] @@ -365,7 +508,7 @@ namespace Game void HandleGuildSetRankPermissions(GuildSetRankPermissions packet) { Guild guild = GetPlayer().GetGuild(); - if (!guild) + if (guild == null) return; Guild.GuildBankRightsAndSlots[] rightsAndSlots = new Guild.GuildBankRightsAndSlots[GuildConst.MaxBankTabs]; diff --git a/Source/Game/Networking/Packets/GuildPackets.cs b/Source/Game/Networking/Packets/GuildPackets.cs index bfb6d2951..acadb44ef 100644 --- a/Source/Game/Networking/Packets/GuildPackets.cs +++ b/Source/Game/Networking/Packets/GuildPackets.cs @@ -1076,44 +1076,143 @@ namespace Game.Networking.Packets public bool FullUpdate; } - public class GuildBankSwapItems : ClientPacket + public class GuildBankTransferItem : ClientPacket { - public GuildBankSwapItems(WorldPacket packet) : base(packet) { } + public GuildBankTransferItem(WorldPacket packet) : base(packet) { } public override void Read() { Banker = _worldPacket.ReadPackedGuid(); BankTab = _worldPacket.ReadUInt8(); BankSlot = _worldPacket.ReadUInt8(); - ItemID = _worldPacket.ReadUInt32(); - BankTab1 = _worldPacket.ReadUInt8(); - BankSlot1 = _worldPacket.ReadUInt8(); - ItemID1 = _worldPacket.ReadUInt32(); - BankItemCount = _worldPacket.ReadInt32(); - ContainerSlot = _worldPacket.ReadUInt8(); - ContainerItemSlot = _worldPacket.ReadUInt8(); - ToSlot = _worldPacket.ReadUInt8(); - StackCount = _worldPacket.ReadInt32(); + PlayerSlot = _worldPacket.ReadUInt8(); + HasBag = _worldPacket.HasBit(); _worldPacket.ResetBitPos(); - BankOnly = _worldPacket.HasBit(); - AutoStore = _worldPacket.HasBit(); + + if (HasBag) + PlayerBag = _worldPacket.ReadUInt8(); } public ObjectGuid Banker; - public int StackCount; - public int BankItemCount; - public uint ItemID; - public uint ItemID1; - public byte ToSlot; - public byte BankSlot; - public byte BankSlot1; public byte BankTab; - public byte BankTab1; - public byte ContainerSlot; - public byte ContainerItemSlot; - public bool AutoStore; - public bool BankOnly; + public byte BankSlot; + public byte PlayerSlot; + public bool HasBag; + public byte PlayerBag; + } + + class GuildBankMoveItemInBank : ClientPacket + { + public GuildBankMoveItemInBank(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Banker = _worldPacket.ReadPackedGuid(); + BankTab = _worldPacket.ReadUInt8(); + BankSlot = _worldPacket.ReadUInt8(); + NewBankTab = _worldPacket.ReadUInt8(); + NewBankSlot = _worldPacket.ReadUInt8(); + } + + public ObjectGuid Banker; + public byte BankTab; + public byte BankSlot; + public byte NewBankTab; + public byte NewBankSlot; + } + class GuildBankCombineItemStack : ClientPacket + { + public GuildBankCombineItemStack(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Banker = _worldPacket.ReadPackedGuid(); + BankTab = _worldPacket.ReadUInt8(); + BankSlot = _worldPacket.ReadUInt8(); + PlayerSlot = _worldPacket.ReadUInt8(); + StackCount = _worldPacket.ReadUInt32(); + + HasBag = _worldPacket.HasBit(); + _worldPacket.ResetBitPos(); + + if (HasBag) + PlayerBag = _worldPacket.ReadUInt8(); + } + + public ObjectGuid Banker; + public byte BankTab; + public byte BankSlot; + public byte PlayerSlot; + public uint StackCount; + public bool HasBag; + public byte PlayerBag; + } + + class GuildBankTransferItemStack : ClientPacket + { + public GuildBankTransferItemStack(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Banker = _worldPacket.ReadPackedGuid(); + BankTab = _worldPacket.ReadUInt8(); + BankSlot = _worldPacket.ReadUInt8(); + PlayerSlot = _worldPacket.ReadUInt8(); + StackCount = _worldPacket.ReadUInt32(); + + HasBag = _worldPacket.HasBit(); + _worldPacket.ResetBitPos(); + + if (HasBag) + PlayerBag = _worldPacket.ReadUInt8(); + } + + public ObjectGuid Banker; + public byte BankTab; + public byte BankSlot; + public byte PlayerSlot; + public uint StackCount; + public bool HasBag; + public byte PlayerBag; + } + + class GuildBankTransferItemAutoStore : ClientPacket + { + public GuildBankTransferItemAutoStore(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Banker = _worldPacket.ReadPackedGuid(); + BankTab = _worldPacket.ReadUInt8(); + BankSlot = _worldPacket.ReadUInt8(); + } + + public ObjectGuid Banker; + public byte BankTab; + public byte BankSlot; + } + + class GuildBankCombineItemStackInBank : ClientPacket + { + public GuildBankCombineItemStackInBank(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Banker = _worldPacket.ReadPackedGuid(); + BankTab = _worldPacket.ReadUInt8(); + BankSlot = _worldPacket.ReadUInt8(); + NewBankTab = _worldPacket.ReadUInt8(); + NewBankSlot = _worldPacket.ReadUInt8(); + StackCount = _worldPacket.ReadUInt32(); + } + + public ObjectGuid Banker; + public byte BankTab; + public byte BankSlot; + public byte NewBankTab; + public byte NewBankSlot; + public uint StackCount; } public class GuildBankLogQuery : ClientPacket @@ -1513,7 +1612,7 @@ namespace Game.Networking.Packets public class GuildBankItemInfo { - public ItemInstance Item; + public ItemInstance Item = new(); public int Slot; public int Count; public int EnchantmentID; @@ -1576,4 +1675,4 @@ namespace Game.Networking.Packets public List MemberList = new(); public Optional Item; } -} +} \ No newline at end of file