AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Guild::BankMoveItemData Class Reference
Inheritance diagram for Guild::BankMoveItemData:
Guild::MoveItemData

Public Member Functions

 BankMoveItemData (Guild *guild, Player *player, uint8 container, uint8 slotId)
 
bool IsBank () const override
 
bool InitItem () override
 
bool HasStoreRights (MoveItemData *pOther) const override
 
bool HasWithdrawRights (MoveItemData *pOther) const override
 
void RemoveItem (CharacterDatabaseTransaction trans, MoveItemData *pOther, uint32 splitedAmount) override
 
ItemStoreItem (CharacterDatabaseTransaction trans, Item *pItem) override
 
void LogBankEvent (CharacterDatabaseTransaction trans, MoveItemData *pFrom, uint32 count) const override
 
void LogAction (MoveItemData *pFrom) const override
 
- Public Member Functions inherited from Guild::MoveItemData
 MoveItemData (Guild *guild, Player *player, uint8 container, uint8 slotId)
 
virtual ~MoveItemData ()
 
virtual bool IsBank () const =0
 
virtual bool InitItem ()=0
 
virtual bool CheckItem (uint32 &splitedAmount)
 
virtual bool HasStoreRights (MoveItemData *) const
 
virtual bool HasWithdrawRights (MoveItemData *) const
 
bool CanStore (Item *pItem, bool swap, bool sendError)
 
bool CloneItem (uint32 count)
 
virtual void RemoveItem (CharacterDatabaseTransaction trans, MoveItemData *pOther, uint32 splitedAmount=0)=0
 
virtual ItemStoreItem (CharacterDatabaseTransaction trans, Item *pItem)=0
 
virtual void LogBankEvent (CharacterDatabaseTransaction trans, MoveItemData *pFrom, uint32 count) const =0
 
virtual void LogAction (MoveItemData *pFrom) const
 
void CopySlots (SlotIds &ids) const
 
ItemGetItem (bool isCloned=false) const
 
uint8 GetContainer () const
 
uint8 GetSlotId () const
 

Protected Member Functions

InventoryResult CanStore (Item *pItem, bool swap) override
 
virtual InventoryResult CanStore (Item *pItem, bool swap)=0
 

Private Member Functions

Item_StoreItem (CharacterDatabaseTransaction trans, BankTab *pTab, Item *pItem, ItemPosCount &pos, bool clone) const
 
bool _ReserveSpace (uint8 slotId, Item *pItem, Item *pItemDest, uint32 &count)
 
void CanStoreItemInTab (Item *pItem, uint8 skipSlotId, bool merge, uint32 &count)
 

Additional Inherited Members

- Protected Attributes inherited from Guild::MoveItemData
Guildm_pGuild
 
Playerm_pPlayer
 
uint8 m_container
 
uint8 m_slotId
 
Itemm_pItem
 
Itemm_pClonedItem
 
ItemPosCountVec m_vec
 

Detailed Description

Constructor & Destructor Documentation

◆ BankMoveItemData()

Guild::BankMoveItemData::BankMoveItemData ( Guild guild,
Player player,
uint8  container,
uint8  slotId 
)
inline
657 :
658 MoveItemData(guild, player, container, slotId) { }
MoveItemData(Guild *guild, Player *player, uint8 container, uint8 slotId)
Definition: Guild.h:595

Member Function Documentation

◆ _ReserveSpace()

bool Guild::BankMoveItemData::_ReserveSpace ( uint8  slotId,
Item pItem,
Item pItemDest,
uint32 count 
)
private
943{
944 uint32 requiredSpace = pItem->GetMaxStackCount();
945 if (pItemDest)
946 {
947 // Make sure source and destination items match and destination item has space for more stacks.
948 if (pItemDest->GetEntry() != pItem->GetEntry() || pItemDest->GetCount() >= pItem->GetMaxStackCount())
949 return false;
950 requiredSpace -= pItemDest->GetCount();
951 }
952 // Let's not be greedy, reserve only required space
953 requiredSpace = std::min(requiredSpace, count);
954
955 // Reserve space
956 ItemPosCount pos(slotId, requiredSpace);
957 if (!pos.isContainedIn(m_vec))
958 {
959 m_vec.push_back(pos);
960 count -= requiredSpace;
961 }
962 return true;
963}
std::uint32_t uint32
Definition: Define.h:108
uint32 GetCount() const
Definition: Item.h:263
uint32 GetMaxStackCount() const
Definition: Item.h:265
uint32 GetEntry() const
Definition: Object.h:109
Definition: Player.h:766
ItemPosCountVec m_vec
Definition: Guild.h:636

References Item::GetCount(), Object::GetEntry(), Item::GetMaxStackCount(), and ItemPosCount::isContainedIn().

◆ _StoreItem()

Item * Guild::BankMoveItemData::_StoreItem ( CharacterDatabaseTransaction  trans,
BankTab pTab,
Item pItem,
ItemPosCount pos,
bool  clone 
) const
private
910{
911 uint8 slotId = uint8(pos.pos);
912 uint32 count = pos.count;
913 if (Item* pItemDest = pTab->GetItem(slotId))
914 {
915 pItemDest->SetCount(pItemDest->GetCount() + count);
916 pItemDest->FSetState(ITEM_CHANGED);
917 pItemDest->SaveToDB(trans);
918 if (!clone)
919 {
920 pItem->RemoveFromWorld();
921 pItem->DeleteFromDB(trans);
922 delete pItem;
923 }
924 return pItemDest;
925 }
926
927 if (clone)
928 pItem = pItem->CloneItem(count);
929 else
930 pItem->SetCount(count);
931
932 if (pItem && pTab->SetItem(trans, slotId, pItem))
933 return pItem;
934
935 return nullptr;
936}
std::uint8_t uint8
Definition: Define.h:110
@ ITEM_CHANGED
Definition: Item.h:204
Definition: Item.h:214
Item * CloneItem(uint32 count, Player const *player=nullptr) const
Definition: Item.cpp:1120
void SetCount(uint32 value)
Definition: Item.h:264
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:520
virtual void RemoveFromWorld()
Definition: Object.cpp:166
uint32 count
Definition: Player.h:770
uint16 pos
Definition: Player.h:769

References Item::CloneItem(), ItemPosCount::count, Item::DeleteFromDB(), Guild::BankTab::GetItem(), ITEM_CHANGED, ItemPosCount::pos, Object::RemoveFromWorld(), Item::SetCount(), and Guild::BankTab::SetItem().

◆ CanStore()

InventoryResult Guild::BankMoveItemData::CanStore ( Item pItem,
bool  swap 
)
overrideprotectedvirtual

Implements Guild::MoveItemData.

986{
987 LOG_DEBUG("guild", "GUILD STORAGE: CanStore() tab = {}, slot = {}, item = {}, count = {}",
988 m_container, m_slotId, pItem->GetEntry(), pItem->GetCount());
989 uint32 count = pItem->GetCount();
990 // Soulbound items cannot be moved
991 if (pItem->IsSoulBound())
993
994 // Make sure destination bank tab exists
997
998 // Slot explicitely specified. Check it.
999 if (m_slotId != NULL_SLOT)
1000 {
1001 Item* pItemDest = m_pGuild->_GetItem(m_container, m_slotId);
1002 // Ignore swapped item (this slot will be empty after move)
1003 if ((pItemDest == pItem) || swap)
1004 pItemDest = nullptr;
1005
1006 if (!_ReserveSpace(m_slotId, pItem, pItemDest, count))
1008
1009 if (count == 0)
1010 return EQUIP_ERR_OK;
1011 }
1012
1013 // Slot was not specified or it has not enough space for all the items in stack
1014 // Search for stacks to merge with
1015 if (pItem->GetMaxStackCount() > 1)
1016 {
1017 CanStoreItemInTab(pItem, m_slotId, true, count);
1018 if (count == 0)
1019 return EQUIP_ERR_OK;
1020 }
1021
1022 // Search free slot for item
1023 CanStoreItemInTab(pItem, m_slotId, false, count);
1024 if (count == 0)
1025 return EQUIP_ERR_OK;
1026
1027 return EQUIP_ERR_BANK_FULL;
1028}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:171
@ EQUIP_ERR_BANK_FULL
Definition: Item.h:92
@ EQUIP_ERR_CANT_DROP_SOULBOUND
Definition: Item.h:65
@ EQUIP_ERR_OK
Definition: Item.h:41
@ EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG
Definition: Item.h:56
@ EQUIP_ERR_ITEM_CANT_STACK
Definition: Item.h:60
@ NULL_SLOT
Definition: Unit.h:211
bool IsSoulBound() const
Definition: Item.h:230
uint8 _GetPurchasedTabsSize() const
Definition: Guild.h:819
Item * _GetItem(uint8 tabId, uint8 slotId) const
Definition: Guild.cpp:2622
uint8 m_slotId
Definition: Guild.h:633
Guild * m_pGuild
Definition: Guild.h:630
uint8 m_container
Definition: Guild.h:632
bool _ReserveSpace(uint8 slotId, Item *pItem, Item *pItemDest, uint32 &count)
Definition: Guild.cpp:942
void CanStoreItemInTab(Item *pItem, uint8 skipSlotId, bool merge, uint32 &count)
Definition: Guild.cpp:965

References EQUIP_ERR_BANK_FULL, EQUIP_ERR_CANT_DROP_SOULBOUND, EQUIP_ERR_ITEM_CANT_STACK, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, Item::GetCount(), Object::GetEntry(), Item::GetMaxStackCount(), Item::IsSoulBound(), LOG_DEBUG, and NULL_SLOT.

◆ CanStoreItemInTab()

void Guild::BankMoveItemData::CanStoreItemInTab ( Item pItem,
uint8  skipSlotId,
bool  merge,
uint32 count 
)
private
966{
967 for (uint8 slotId = 0; (slotId < GUILD_BANK_MAX_SLOTS) && (count > 0); ++slotId)
968 {
969 // Skip slot already processed in CanStore (when destination slot was specified)
970 if (slotId == skipSlotId)
971 continue;
972
973 Item* pItemDest = m_pGuild->_GetItem(m_container, slotId);
974 if (pItemDest == pItem)
975 pItemDest = nullptr;
976
977 // If merge skip empty, if not merge skip non-empty
978 if ((pItemDest != nullptr) != merge)
979 continue;
980
981 _ReserveSpace(slotId, pItem, pItemDest, count);
982 }
983}
@ GUILD_BANK_MAX_SLOTS
Definition: Guild.h:46

References GUILD_BANK_MAX_SLOTS.

◆ HasStoreRights()

bool Guild::BankMoveItemData::HasStoreRights ( MoveItemData pOther) const
overridevirtual

Reimplemented from Guild::MoveItemData.

828{
829 ASSERT(pOther);
830 // Do not check rights if item is being swapped within the same bank tab
831 if (pOther->IsBank() && pOther->GetContainer() == m_container)
832 return true;
834}
#define ASSERT
Definition: Errors.h:68
@ GUILD_BANK_RIGHT_DEPOSIT_ITEM
Definition: Guild.h:194
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
Definition: Guild.cpp:2578
Player * m_pPlayer
Definition: Guild.h:631

References ASSERT, Guild::MoveItemData::GetContainer(), GUILD_BANK_RIGHT_DEPOSIT_ITEM, and Guild::MoveItemData::IsBank().

◆ HasWithdrawRights()

bool Guild::BankMoveItemData::HasWithdrawRights ( MoveItemData pOther) const
overridevirtual

Reimplemented from Guild::MoveItemData.

837{
838 ASSERT(pOther);
839 // Do not check rights if item is being swapped within the same bank tab
840 if (pOther->IsBank() && pOther->GetContainer() == m_container)
841 return true;
842
843 int32 slots = 0;
844 if (Member const* member = m_pGuild->GetMember(m_pPlayer->GetGUID()))
846
847 return slots != 0;
848}
std::int32_t int32
Definition: Define.h:104
int32 _GetMemberRemainingSlots(Member const &member, uint8 tabId) const
Definition: Guild.cpp:2538
const Member * GetMember(ObjectGuid guid) const
Definition: Guild.h:384

References ASSERT, Guild::MoveItemData::GetContainer(), and Guild::MoveItemData::IsBank().

◆ InitItem()

bool Guild::BankMoveItemData::InitItem ( )
overridevirtual

Implements Guild::MoveItemData.

822{
824 return (m_pItem != nullptr);
825}
Item * m_pItem
Definition: Guild.h:634

◆ IsBank()

bool Guild::BankMoveItemData::IsBank ( ) const
inlineoverridevirtual

Implements Guild::MoveItemData.

660{ return true; }

◆ LogAction()

void Guild::BankMoveItemData::LogAction ( MoveItemData pFrom) const
overridevirtual

Reimplemented from Guild::MoveItemData.

905{
907}
virtual void LogAction(MoveItemData *pFrom) const
Definition: Guild.cpp:746

References Guild::MoveItemData::LogAction().

◆ LogBankEvent()

void Guild::BankMoveItemData::LogBankEvent ( CharacterDatabaseTransaction  trans,
MoveItemData pFrom,
uint32  count 
) const
overridevirtual

Implements Guild::MoveItemData.

892{
893 ASSERT(pFrom->GetItem());
894 if (pFrom->IsBank())
895 // Bank -> Bank
896 m_pGuild->_LogBankEvent(trans, GUILD_BANK_LOG_MOVE_ITEM, pFrom->GetContainer(), m_pPlayer->GetGUID(),
897 pFrom->GetItem()->GetEntry(), count, m_container);
898 else
899 // Char -> Bank
901 pFrom->GetItem()->GetEntry(), count);
902}
@ GUILD_BANK_LOG_MOVE_ITEM
Definition: Guild.h:202
@ GUILD_BANK_LOG_DEPOSIT_ITEM
Definition: Guild.h:200
uint32 GetEntry() const
Definition: ObjectGuid.h:146
void _LogBankEvent(CharacterDatabaseTransaction trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid playerGuid, uint32 itemOrMoney, uint16 itemStackCount=0, uint8 destTabId=0)
Definition: Guild.cpp:2601

References ASSERT, Guild::MoveItemData::GetContainer(), Object::GetEntry(), Guild::MoveItemData::GetItem(), GUILD_BANK_LOG_DEPOSIT_ITEM, GUILD_BANK_LOG_MOVE_ITEM, and Guild::MoveItemData::IsBank().

◆ RemoveItem()

void Guild::BankMoveItemData::RemoveItem ( CharacterDatabaseTransaction  trans,
MoveItemData pOther,
uint32  splitedAmount 
)
overridevirtual

Implements Guild::MoveItemData.

851{
853 if (splitedAmount)
854 {
855 m_pItem->SetCount(m_pItem->GetCount() - splitedAmount);
857 m_pItem->SaveToDB(trans);
858 }
859 else
860 {
862 m_pItem = nullptr;
863 }
864 // Decrease amount of player's remaining items (if item is moved to different tab or to player)
865 if (!pOther->IsBank() || pOther->GetContainer() != m_container)
867}
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition: Item.cpp:338
void FSetState(ItemUpdateState state)
Definition: Item.h:321
void _RemoveItem(CharacterDatabaseTransaction trans, uint8 tabId, uint8 slotId)
Definition: Guild.cpp:2629
void _UpdateMemberWithdrawSlots(CharacterDatabaseTransaction trans, ObjectGuid guid, uint8 tabId)
Definition: Guild.cpp:2567

References ASSERT, Guild::MoveItemData::GetContainer(), Guild::MoveItemData::IsBank(), and ITEM_CHANGED.

◆ StoreItem()

Item * Guild::BankMoveItemData::StoreItem ( CharacterDatabaseTransaction  trans,
Item pItem 
)
overridevirtual

Implements Guild::MoveItemData.

870{
871 if (!pItem)
872 return nullptr;
873
874 BankTab* pTab = m_pGuild->GetBankTab(m_container);
875 if (!pTab)
876 return nullptr;
877
878 Item* pLastItem = pItem;
879 for (ItemPosCountVec::const_iterator itr = m_vec.begin(); itr != m_vec.end(); )
880 {
881 ItemPosCount pos(*itr);
882 ++itr;
883
884 LOG_DEBUG("guild", "GUILD STORAGE: StoreItem tab = {}, slot = {}, item = {}, count = {}",
885 m_container, m_slotId, pItem->GetEntry(), pItem->GetCount());
886 pLastItem = _StoreItem(trans, pTab, pItem, pos, itr != m_vec.end());
887 }
888 return pLastItem;
889}
BankTab * GetBankTab(uint8 tabId)
Definition: Guild.h:820
Item * _StoreItem(CharacterDatabaseTransaction trans, BankTab *pTab, Item *pItem, ItemPosCount &pos, bool clone) const
Definition: Guild.cpp:909

References Item::GetCount(), Object::GetEntry(), and LOG_DEBUG.