mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
Avoid access to bag item prototype for getting bag size, use related item update field instead as more fast source.
This commit is contained in:
parent
3162a8dc61
commit
6f6ec21b72
5 changed files with 112 additions and 202 deletions
|
|
@ -37,30 +37,25 @@ Bag::Bag( ): Item()
|
||||||
|
|
||||||
Bag::~Bag()
|
Bag::~Bag()
|
||||||
{
|
{
|
||||||
for(int i = 0; i<MAX_BAG_SIZE; i++)
|
for(int i = 0; i < MAX_BAG_SIZE; ++i)
|
||||||
{
|
if (m_bagslot[i])
|
||||||
if(m_bagslot[i]) delete m_bagslot[i];
|
delete m_bagslot[i];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bag::AddToWorld()
|
void Bag::AddToWorld()
|
||||||
{
|
{
|
||||||
Item::AddToWorld();
|
Item::AddToWorld();
|
||||||
|
|
||||||
for(int i = 0; i<MAX_BAG_SIZE; i++)
|
for(uint32 i = 0; i < GetBagSize(); ++i)
|
||||||
{
|
|
||||||
if(m_bagslot[i])
|
if(m_bagslot[i])
|
||||||
m_bagslot[i]->AddToWorld();
|
m_bagslot[i]->AddToWorld();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bag::RemoveFromWorld()
|
void Bag::RemoveFromWorld()
|
||||||
{
|
{
|
||||||
for(int i = 0; i<MAX_BAG_SIZE; i++)
|
for(uint32 i = 0; i < GetBagSize(); ++i)
|
||||||
{
|
|
||||||
if(m_bagslot[i])
|
if(m_bagslot[i])
|
||||||
m_bagslot[i]->RemoveFromWorld();
|
m_bagslot[i]->RemoveFromWorld();
|
||||||
}
|
|
||||||
|
|
||||||
Item::RemoveFromWorld();
|
Item::RemoveFromWorld();
|
||||||
}
|
}
|
||||||
|
|
@ -109,7 +104,7 @@ bool Bag::LoadFromDB(uint32 guid, uint64 owner_guid, QueryResult *result)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// cleanup bag content related item value fields (its will be filled correctly from `character_inventory`)
|
// cleanup bag content related item value fields (its will be filled correctly from `character_inventory`)
|
||||||
for (uint32 i = 0; i < GetProto()->ContainerSlots; i++)
|
for (int i = 0; i < MAX_BAG_SIZE; ++i)
|
||||||
{
|
{
|
||||||
SetUInt64Value(CONTAINER_FIELD_SLOT_1 + (i*2), 0);
|
SetUInt64Value(CONTAINER_FIELD_SLOT_1 + (i*2), 0);
|
||||||
if (m_bagslot[i])
|
if (m_bagslot[i])
|
||||||
|
|
@ -125,21 +120,16 @@ bool Bag::LoadFromDB(uint32 guid, uint64 owner_guid, QueryResult *result)
|
||||||
void Bag::DeleteFromDB()
|
void Bag::DeleteFromDB()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_BAG_SIZE; i++)
|
for (int i = 0; i < MAX_BAG_SIZE; i++)
|
||||||
{
|
|
||||||
if (m_bagslot[i])
|
if (m_bagslot[i])
|
||||||
{
|
|
||||||
m_bagslot[i]->DeleteFromDB();
|
m_bagslot[i]->DeleteFromDB();
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item::DeleteFromDB();
|
Item::DeleteFromDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Bag::GetFreeSlots() const
|
uint32 Bag::GetFreeSlots() const
|
||||||
{
|
{
|
||||||
uint32 ContainerSlots=GetProto()->ContainerSlots;
|
|
||||||
uint32 slots = 0;
|
uint32 slots = 0;
|
||||||
for (uint8 i=0; i <ContainerSlots; i++)
|
for (uint32 i=0; i < GetBagSize(); i++)
|
||||||
if (!m_bagslot[i])
|
if (!m_bagslot[i])
|
||||||
++slots;
|
++slots;
|
||||||
|
|
||||||
|
|
@ -176,30 +166,26 @@ void Bag::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target ) co
|
||||||
{
|
{
|
||||||
Item::BuildCreateUpdateBlockForPlayer( data, target );
|
Item::BuildCreateUpdateBlockForPlayer( data, target );
|
||||||
|
|
||||||
for (int i = 0; i < MAX_BAG_SIZE; i++)
|
for (uint32 i = 0; i < GetBagSize(); ++i)
|
||||||
{
|
|
||||||
if(m_bagslot[i])
|
if(m_bagslot[i])
|
||||||
m_bagslot[i]->BuildCreateUpdateBlockForPlayer( data, target );
|
m_bagslot[i]->BuildCreateUpdateBlockForPlayer( data, target );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the bag is empty returns true
|
// If the bag is empty returns true
|
||||||
bool Bag::IsEmpty() const
|
bool Bag::IsEmpty() const
|
||||||
{
|
{
|
||||||
uint32 ContainerSlots=GetProto()->ContainerSlots;
|
for(uint32 i = 0; i < GetBagSize(); ++i)
|
||||||
for(uint32 i=0; i < ContainerSlots; i++)
|
if (m_bagslot[i])
|
||||||
if (m_bagslot[i]) return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Bag::GetItemCount( uint32 item, Item* eItem ) const
|
uint32 Bag::GetItemCount( uint32 item, Item* eItem ) const
|
||||||
{
|
{
|
||||||
uint32 ContainerSlots=GetProto()->ContainerSlots;
|
|
||||||
|
|
||||||
Item *pItem;
|
Item *pItem;
|
||||||
uint32 count = 0;
|
uint32 count = 0;
|
||||||
for(uint32 i=0; i < ContainerSlots; i++)
|
for(uint32 i=0; i < GetBagSize(); ++i)
|
||||||
{
|
{
|
||||||
pItem = m_bagslot[i];
|
pItem = m_bagslot[i];
|
||||||
if( pItem && pItem != eItem && pItem->GetEntry() == item )
|
if( pItem && pItem != eItem && pItem->GetEntry() == item )
|
||||||
|
|
@ -208,7 +194,7 @@ uint32 Bag::GetItemCount( uint32 item, Item* eItem ) const
|
||||||
|
|
||||||
if(eItem && eItem->GetProto()->GemProperties)
|
if(eItem && eItem->GetProto()->GemProperties)
|
||||||
{
|
{
|
||||||
for(uint32 i=0; i < ContainerSlots; i++)
|
for(uint32 i=0; i < GetBagSize(); ++i)
|
||||||
{
|
{
|
||||||
pItem = m_bagslot[i];
|
pItem = m_bagslot[i];
|
||||||
if( pItem && pItem != eItem && pItem->GetProto()->Socket[0].Color )
|
if( pItem && pItem != eItem && pItem->GetProto()->Socket[0].Color )
|
||||||
|
|
@ -221,29 +207,18 @@ uint32 Bag::GetItemCount( uint32 item, Item* eItem ) const
|
||||||
|
|
||||||
uint8 Bag::GetSlotByItemGUID(uint64 guid) const
|
uint8 Bag::GetSlotByItemGUID(uint64 guid) const
|
||||||
{
|
{
|
||||||
uint32 ContainerSlots=GetProto()->ContainerSlots;
|
for(uint32 i = 0; i < GetBagSize(); ++i)
|
||||||
|
|
||||||
for(uint32 i=0;i<ContainerSlots;i++)
|
|
||||||
{
|
|
||||||
if(m_bagslot[i] != 0)
|
if(m_bagslot[i] != 0)
|
||||||
if(m_bagslot[i]->GetGUID() == guid)
|
if(m_bagslot[i]->GetGUID() == guid)
|
||||||
return i;
|
return i;
|
||||||
}
|
|
||||||
return NULL_SLOT;
|
return NULL_SLOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adds an item to a bag slot
|
|
||||||
// - slot can be NULL_SLOT, in that case function searchs for a free slot
|
|
||||||
// - Return values: 0 - item not added
|
|
||||||
// 1 - item added to a free slot (and perhaps to a stack)
|
|
||||||
// 2 - item added to a stack (item should be deleted)
|
|
||||||
Item* Bag::GetItemByPos( uint8 slot ) const
|
Item* Bag::GetItemByPos( uint8 slot ) const
|
||||||
{
|
{
|
||||||
ItemPrototype const *pBagProto = GetProto();
|
if( slot < GetBagSize() )
|
||||||
if( pBagProto )
|
return m_bagslot[slot];
|
||||||
{
|
|
||||||
if( slot < pBagProto->ContainerSlots )
|
|
||||||
return m_bagslot[slot];
|
|
||||||
}
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ class Bag : public Item
|
||||||
uint8 GetSlotByItemGUID(uint64 guid) const;
|
uint8 GetSlotByItemGUID(uint64 guid) const;
|
||||||
bool IsEmpty() const;
|
bool IsEmpty() const;
|
||||||
uint32 GetFreeSlots() const;
|
uint32 GetFreeSlots() const;
|
||||||
|
uint32 GetBagSize() const { return GetUInt32Value(CONTAINER_FIELD_NUM_SLOTS); }
|
||||||
|
|
||||||
// DB operations
|
// DB operations
|
||||||
// overwrite virtual Item::SaveToDB
|
// overwrite virtual Item::SaveToDB
|
||||||
|
|
|
||||||
|
|
@ -859,12 +859,12 @@ bool ChatHandler::HandleItemMoveCommand(const char* args)
|
||||||
srcslot = (uint8)atoi(pParam1);
|
srcslot = (uint8)atoi(pParam1);
|
||||||
dstslot = (uint8)atoi(pParam2);
|
dstslot = (uint8)atoi(pParam2);
|
||||||
|
|
||||||
uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcslot);
|
|
||||||
uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstslot);
|
|
||||||
|
|
||||||
if(srcslot==dstslot)
|
if(srcslot==dstslot)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcslot);
|
||||||
|
uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstslot);
|
||||||
|
|
||||||
m_session->GetPlayer()->SwapItem( src, dst );
|
m_session->GetPlayer()->SwapItem( src, dst );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -3828,10 +3828,9 @@ void Player::DurabilityLossAll(double percent, bool inventory)
|
||||||
|
|
||||||
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
||||||
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
if(ItemPrototype const *pBagProto = pBag->GetProto())
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
if(Item* pItem = GetItemByPos( i, j ))
|
||||||
if(Item* pItem = GetItemByPos( i, j ))
|
DurabilityLoss(pItem,percent);
|
||||||
DurabilityLoss(pItem,percent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3873,10 +3872,9 @@ void Player::DurabilityPointsLossAll(int32 points, bool inventory)
|
||||||
|
|
||||||
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
||||||
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
if(ItemPrototype const *pBagProto = pBag->GetProto())
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
if(Item* pItem = GetItemByPos( i, j ))
|
||||||
if(Item* pItem = GetItemByPos( i, j ))
|
DurabilityPointsLoss(pItem,points);
|
||||||
DurabilityPointsLoss(pItem,points);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8009,24 +8007,19 @@ uint8 Player::CanUnequipItems( uint32 item, uint32 count ) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Bag *pBag;
|
Bag *pBag;
|
||||||
ItemPrototype const *pBagProto;
|
|
||||||
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
||||||
{
|
{
|
||||||
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
||||||
if( pBag )
|
if( pBag )
|
||||||
{
|
{
|
||||||
pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
pItem = GetItemByPos( i, j );
|
||||||
|
if( pItem && pItem->GetEntry() == item )
|
||||||
{
|
{
|
||||||
pItem = GetItemByPos( i, j );
|
tempcount += pItem->GetCount();
|
||||||
if( pItem && pItem->GetEntry() == item )
|
if( tempcount >= count )
|
||||||
{
|
return EQUIP_ERR_OK;
|
||||||
tempcount += pItem->GetCount();
|
|
||||||
if( tempcount >= count )
|
|
||||||
return EQUIP_ERR_OK;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8117,15 +8110,11 @@ Item* Player::GetItemByGuid( uint64 guid ) const
|
||||||
Bag *pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
Bag *pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
||||||
if( pBag )
|
if( pBag )
|
||||||
{
|
{
|
||||||
ItemPrototype const *pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
Item* pItem = pBag->GetItemByPos( j );
|
||||||
{
|
if( pItem && pItem->GetGUID() == guid )
|
||||||
Item* pItem = pBag->GetItemByPos( j );
|
return pItem;
|
||||||
if( pItem && pItem->GetGUID() == guid )
|
|
||||||
return pItem;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8134,15 +8123,11 @@ Item* Player::GetItemByGuid( uint64 guid ) const
|
||||||
Bag *pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
Bag *pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
||||||
if( pBag )
|
if( pBag )
|
||||||
{
|
{
|
||||||
ItemPrototype const *pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
Item* pItem = pBag->GetItemByPos( j );
|
||||||
{
|
if( pItem && pItem->GetGUID() == guid )
|
||||||
Item* pItem = pBag->GetItemByPos( j );
|
return pItem;
|
||||||
if( pItem && pItem->GetGUID() == guid )
|
|
||||||
return pItem;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8300,17 +8285,14 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const
|
||||||
{
|
{
|
||||||
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
{
|
{
|
||||||
if(ItemPrototype const *pBagProto = pBag->GetProto())
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
Item* pItem = GetItemByPos( i, j );
|
||||||
|
if( pItem && pItem->GetEntry() == item )
|
||||||
{
|
{
|
||||||
Item* pItem = GetItemByPos( i, j );
|
tempcount += pItem->GetCount();
|
||||||
if( pItem && pItem->GetEntry() == item )
|
if( tempcount >= count )
|
||||||
{
|
return true;
|
||||||
tempcount += pItem->GetCount();
|
|
||||||
if( tempcount >= count )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8332,17 +8314,14 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const
|
||||||
{
|
{
|
||||||
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
{
|
{
|
||||||
if(ItemPrototype const *pBagProto = pBag->GetProto())
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
Item* pItem = GetItemByPos( i, j );
|
||||||
|
if( pItem && pItem->GetEntry() == item )
|
||||||
{
|
{
|
||||||
Item* pItem = GetItemByPos( i, j );
|
tempcount += pItem->GetCount();
|
||||||
if( pItem && pItem->GetEntry() == item )
|
if( tempcount >= count )
|
||||||
{
|
return true;
|
||||||
tempcount += pItem->GetCount();
|
|
||||||
if( tempcount >= count )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8420,22 +8399,15 @@ bool Player::HasItemTotemCategory( uint32 TotemCategory ) const
|
||||||
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
|
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Bag *pBag;
|
|
||||||
ItemPrototype const *pBagProto;
|
|
||||||
for(uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
|
for(uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
|
||||||
{
|
{
|
||||||
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if(Bag *pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
if( pBag )
|
|
||||||
{
|
{
|
||||||
pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); ++j)
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; ++j)
|
pItem = GetItemByPos( i, j );
|
||||||
{
|
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
|
||||||
pItem = GetItemByPos( i, j );
|
return true;
|
||||||
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8529,7 +8501,7 @@ uint8 Player::_CanStoreItem_InBag( uint8 bag, ItemPosCountVec &dest, ItemPrototy
|
||||||
if( !ItemCanGoIntoBag(pProto,pBagProto) )
|
if( !ItemCanGoIntoBag(pProto,pBagProto) )
|
||||||
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
|
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
|
||||||
|
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
{
|
{
|
||||||
// skip specific slot already processed in first called _CanStoreItem_InSpecificSlot
|
// skip specific slot already processed in first called _CanStoreItem_InSpecificSlot
|
||||||
if(j==skip_slot)
|
if(j==skip_slot)
|
||||||
|
|
@ -9036,23 +9008,14 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
|
||||||
|
|
||||||
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
||||||
{
|
{
|
||||||
Bag *pBag;
|
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
ItemPrototype const *pBagProto;
|
|
||||||
|
|
||||||
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
|
||||||
if( pBag )
|
|
||||||
{
|
{
|
||||||
pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
|
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
pItem2 = GetItemByPos( i, j );
|
||||||
|
if (pItem2 && !pItem2->IsInTrade())
|
||||||
{
|
{
|
||||||
pItem2 = GetItemByPos( i, j );
|
inv_bags[i-INVENTORY_SLOT_BAG_START][j] = pItem2->GetCount();
|
||||||
if (pItem2 && !pItem2->IsInTrade())
|
|
||||||
{
|
|
||||||
inv_bags[i-INVENTORY_SLOT_BAG_START][j] = pItem2->GetCount();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -9119,18 +9082,14 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
|
||||||
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, t );
|
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, t );
|
||||||
if( pBag )
|
if( pBag )
|
||||||
{
|
{
|
||||||
pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
pItem2 = GetItemByPos( t, j );
|
||||||
|
if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_bags[t-INVENTORY_SLOT_BAG_START][j] + pItem->GetCount() <= pProto->Stackable )
|
||||||
{
|
{
|
||||||
pItem2 = GetItemByPos( t, j );
|
inv_bags[t-INVENTORY_SLOT_BAG_START][j] += pItem->GetCount();
|
||||||
if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_bags[t-INVENTORY_SLOT_BAG_START][j] + pItem->GetCount() <= pProto->Stackable )
|
b_found = true;
|
||||||
{
|
break;
|
||||||
inv_bags[t-INVENTORY_SLOT_BAG_START][j] += pItem->GetCount();
|
|
||||||
b_found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -9169,7 +9128,7 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
|
||||||
if( pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER) &&
|
if( pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER) &&
|
||||||
ItemCanGoIntoBag(pProto,pBagProto) )
|
ItemCanGoIntoBag(pProto,pBagProto) )
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
{
|
{
|
||||||
if( inv_bags[t-INVENTORY_SLOT_BAG_START][j] == 0 )
|
if( inv_bags[t-INVENTORY_SLOT_BAG_START][j] == 0 )
|
||||||
{
|
{
|
||||||
|
|
@ -9203,17 +9162,13 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
|
||||||
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, t );
|
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, t );
|
||||||
if( pBag )
|
if( pBag )
|
||||||
{
|
{
|
||||||
pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
if( pBagProto && ItemCanGoIntoBag(pProto,pBagProto))
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
if( inv_bags[t-INVENTORY_SLOT_BAG_START][j] == 0 )
|
||||||
{
|
{
|
||||||
if( inv_bags[t-INVENTORY_SLOT_BAG_START][j] == 0 )
|
inv_bags[t-INVENTORY_SLOT_BAG_START][j] = 1;
|
||||||
{
|
b_found = true;
|
||||||
inv_bags[t-INVENTORY_SLOT_BAG_START][j] = 1;
|
break;
|
||||||
b_found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -10307,40 +10262,33 @@ void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool uneq
|
||||||
}
|
}
|
||||||
|
|
||||||
// in inventory bags
|
// in inventory bags
|
||||||
Bag *pBag;
|
|
||||||
ItemPrototype const *pBagProto;
|
|
||||||
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
|
||||||
{
|
{
|
||||||
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if(Bag *pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
if( pBag )
|
|
||||||
{
|
{
|
||||||
pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
pItem = pBag->GetItemByPos(j);
|
||||||
|
if( pItem && pItem->GetEntry() == item )
|
||||||
{
|
{
|
||||||
pItem = pBag->GetItemByPos(j);
|
// all items in bags can be unequipped
|
||||||
if( pItem && pItem->GetEntry() == item )
|
if( pItem->GetCount() + remcount <= count )
|
||||||
{
|
{
|
||||||
// all items in bags can be unequipped
|
remcount += pItem->GetCount();
|
||||||
if( pItem->GetCount() + remcount <= count )
|
DestroyItem( i, j, update );
|
||||||
{
|
|
||||||
remcount += pItem->GetCount();
|
|
||||||
DestroyItem( i, j, update );
|
|
||||||
|
|
||||||
if(remcount >=count)
|
if(remcount >=count)
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pProto = pItem->GetProto();
|
|
||||||
ItemRemovedQuestCheck( pItem->GetEntry(), count - remcount );
|
|
||||||
pItem->SetCount( pItem->GetCount() - count + remcount );
|
|
||||||
if( IsInWorld() && update )
|
|
||||||
pItem->SendUpdateToPlayer( this );
|
|
||||||
pItem->SetState(ITEM_CHANGED, this);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pProto = pItem->GetProto();
|
||||||
|
ItemRemovedQuestCheck( pItem->GetEntry(), count - remcount );
|
||||||
|
pItem->SetCount( pItem->GetCount() - count + remcount );
|
||||||
|
if( IsInWorld() && update )
|
||||||
|
pItem->SendUpdateToPlayer( this );
|
||||||
|
pItem->SetState(ITEM_CHANGED, this);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -10402,15 +10350,11 @@ void Player::DestroyZoneLimitedItem( bool update, uint32 new_zone )
|
||||||
Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
||||||
if( pBag )
|
if( pBag )
|
||||||
{
|
{
|
||||||
ItemPrototype const *pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
Item* pItem = pBag->GetItemByPos(j);
|
||||||
{
|
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
|
||||||
Item* pItem = pBag->GetItemByPos(j);
|
DestroyItem( i, j, update);
|
||||||
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
|
|
||||||
DestroyItem( i, j, update);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -10446,17 +10390,13 @@ void Player::DestroyConjuredItems( bool update )
|
||||||
Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
||||||
if( pBag )
|
if( pBag )
|
||||||
{
|
{
|
||||||
ItemPrototype const *pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
Item* pItem = pBag->GetItemByPos(j);
|
||||||
{
|
if( pItem && pItem->GetProto() &&
|
||||||
Item* pItem = pBag->GetItemByPos(j);
|
(pItem->GetProto()->Class == ITEM_CLASS_CONSUMABLE) &&
|
||||||
if( pItem && pItem->GetProto() &&
|
(pItem->GetProto()->Flags & ITEM_FLAGS_CONJURED) )
|
||||||
(pItem->GetProto()->Class == ITEM_CLASS_CONSUMABLE) &&
|
DestroyItem( i, j, update);
|
||||||
(pItem->GetProto()->Flags & ITEM_FLAGS_CONJURED) )
|
|
||||||
DestroyItem( i, j, update);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -11104,15 +11044,11 @@ void Player::RemoveAllEnchantments(EnchantmentSlot slot)
|
||||||
Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
||||||
if( pBag )
|
if( pBag )
|
||||||
{
|
{
|
||||||
ItemPrototype const *pBagProto = pBag->GetProto();
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
if( pBagProto )
|
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBagProto->ContainerSlots; j++)
|
Item* pItem = pBag->GetItemByPos(j);
|
||||||
{
|
if( pItem && pItem->GetEnchantmentId(slot) )
|
||||||
Item* pItem = pBag->GetItemByPos(j);
|
pItem->ClearEnchantment(slot);
|
||||||
if( pItem && pItem->GetEnchantmentId(slot) )
|
|
||||||
pItem->ClearEnchantment(slot);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -319,8 +319,7 @@ bool ChatHandler::HandleGetItemState(const char* args)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Bag *bag = (Bag*)item;
|
Bag *bag = (Bag*)item;
|
||||||
const ItemPrototype *proto = bag->GetProto();
|
for (uint8 j = 0; j < bag->GetBagSize(); ++j)
|
||||||
for (uint8 j = 0; j < proto->ContainerSlots; ++j)
|
|
||||||
{
|
{
|
||||||
Item* item = bag->GetItemByPos(j);
|
Item* item = bag->GetItemByPos(j);
|
||||||
if (item && item->GetState() == state)
|
if (item && item->GetState() == state)
|
||||||
|
|
@ -416,8 +415,7 @@ bool ChatHandler::HandleGetItemState(const char* args)
|
||||||
if(item->IsBag())
|
if(item->IsBag())
|
||||||
{
|
{
|
||||||
Bag *bag = (Bag*)item;
|
Bag *bag = (Bag*)item;
|
||||||
const ItemPrototype *proto = bag->GetProto();
|
for (uint8 j = 0; j < bag->GetBagSize(); ++j)
|
||||||
for (uint8 j = 0; j < proto->ContainerSlots; ++j)
|
|
||||||
{
|
{
|
||||||
Item* item = bag->GetItemByPos(j);
|
Item* item = bag->GetItemByPos(j);
|
||||||
if (!item) continue;
|
if (!item) continue;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue