mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
Small cleanups in item checks code.
This commit is contained in:
parent
b45b075668
commit
7cc704149a
3 changed files with 105 additions and 132 deletions
|
|
@ -285,13 +285,10 @@ class MANGOS_DLL_SPEC Item : public Object
|
||||||
uState = state;
|
uState = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasQuest(uint32 quest_id) const
|
bool hasQuest(uint32 quest_id) const { return GetProto()->StartQuest == quest_id; }
|
||||||
{
|
|
||||||
ItemPrototype const *itemProto = GetProto();
|
|
||||||
return itemProto && itemProto->StartQuest == quest_id;
|
|
||||||
}
|
|
||||||
bool hasInvolvedQuest(uint32 /*quest_id*/) const { return false; }
|
bool hasInvolvedQuest(uint32 /*quest_id*/) const { return false; }
|
||||||
|
bool IsPotion() const { return GetProto()->IsPotion(); }
|
||||||
|
bool IsConjuredConsumable() const { return GetProto()->IsConjuredConsumable(); }
|
||||||
private:
|
private:
|
||||||
uint8 m_slot;
|
uint8 m_slot;
|
||||||
Bag *m_container;
|
Bag *m_container;
|
||||||
|
|
|
||||||
|
|
@ -656,6 +656,9 @@ struct ItemPrototype
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsPotion() const { return Class==ITEM_CLASS_CONSUMABLE && SubClass==ITEM_SUBCLASS_POTION; }
|
||||||
|
bool IsConjuredConsumable() const { return Class == ITEM_CLASS_CONSUMABLE && (Flags & ITEM_FLAGS_CONJURED); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ItemLocale
|
struct ItemLocale
|
||||||
|
|
|
||||||
|
|
@ -754,9 +754,9 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
// if this is ammo then use it
|
// if this is ammo then use it
|
||||||
uint8 msg = CanUseAmmo( pItem->GetProto()->ItemId );
|
uint8 msg = CanUseAmmo( pItem->GetEntry() );
|
||||||
if( msg == EQUIP_ERR_OK )
|
if( msg == EQUIP_ERR_OK )
|
||||||
SetAmmo( pItem->GetProto()->ItemId );
|
SetAmmo( pItem->GetEntry() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -10948,60 +10948,60 @@ void Player::DestroyItem( uint8 bag, uint8 slot, bool update )
|
||||||
void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool unequip_check)
|
void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool unequip_check)
|
||||||
{
|
{
|
||||||
sLog.outDebug( "STORAGE: DestroyItemCount item = %u, count = %u", item, count);
|
sLog.outDebug( "STORAGE: DestroyItemCount item = %u, count = %u", item, count);
|
||||||
Item *pItem;
|
|
||||||
ItemPrototype const *pProto;
|
|
||||||
uint32 remcount = 0;
|
uint32 remcount = 0;
|
||||||
|
|
||||||
// in inventory
|
// in inventory
|
||||||
for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++)
|
for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++)
|
||||||
{
|
{
|
||||||
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
if( pItem && pItem->GetEntry() == item )
|
|
||||||
{
|
{
|
||||||
if( pItem->GetCount() + remcount <= count )
|
if (pItem->GetEntry() == item)
|
||||||
{
|
{
|
||||||
// all items in inventory can unequipped
|
if (pItem->GetCount() + remcount <= count)
|
||||||
remcount += pItem->GetCount();
|
{
|
||||||
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
// all items in inventory can unequipped
|
||||||
|
remcount += pItem->GetCount();
|
||||||
|
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
||||||
|
|
||||||
if(remcount >=count)
|
if (remcount >=count)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
|
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
|
||||||
{
|
{
|
||||||
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
if( pItem && pItem->GetEntry() == item )
|
|
||||||
{
|
{
|
||||||
if( pItem->GetCount() + remcount <= count )
|
if (pItem->GetEntry() == item)
|
||||||
{
|
{
|
||||||
// all keys can be unequipped
|
if (pItem->GetCount() + remcount <= count)
|
||||||
remcount += pItem->GetCount();
|
{
|
||||||
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
// all keys can be unequipped
|
||||||
|
remcount += pItem->GetCount();
|
||||||
|
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
||||||
|
|
||||||
if(remcount >=count)
|
if (remcount >=count)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -11013,27 +11013,28 @@ void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool uneq
|
||||||
{
|
{
|
||||||
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
{
|
{
|
||||||
pItem = pBag->GetItemByPos(j);
|
if(Item* pItem = pBag->GetItemByPos(j))
|
||||||
if( pItem && pItem->GetEntry() == item )
|
|
||||||
{
|
{
|
||||||
// all items in bags can be unequipped
|
if (pItem->GetEntry() == item)
|
||||||
if( pItem->GetCount() + remcount <= count )
|
|
||||||
{
|
{
|
||||||
remcount += pItem->GetCount();
|
// all items in bags can be unequipped
|
||||||
DestroyItem( i, j, update );
|
if (pItem->GetCount() + remcount <= count)
|
||||||
|
{
|
||||||
|
remcount += pItem->GetCount();
|
||||||
|
DestroyItem( i, j, update );
|
||||||
|
|
||||||
if(remcount >=count)
|
if (remcount >=count)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -11043,29 +11044,30 @@ void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool uneq
|
||||||
// in equipment and bag list
|
// in equipment and bag list
|
||||||
for(int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; i++)
|
for(int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; i++)
|
||||||
{
|
{
|
||||||
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
if( pItem && pItem->GetEntry() == item )
|
|
||||||
{
|
{
|
||||||
if( pItem->GetCount() + remcount <= count )
|
if (pItem && pItem->GetEntry() == item)
|
||||||
{
|
{
|
||||||
if(!unequip_check || CanUnequipItem(INVENTORY_SLOT_BAG_0 << 8 | i,false) == EQUIP_ERR_OK )
|
if (pItem->GetCount() + remcount <= count)
|
||||||
{
|
{
|
||||||
remcount += pItem->GetCount();
|
if (!unequip_check || CanUnequipItem(INVENTORY_SLOT_BAG_0 << 8 | i,false) == EQUIP_ERR_OK )
|
||||||
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
{
|
||||||
|
remcount += pItem->GetCount();
|
||||||
|
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
||||||
|
|
||||||
if(remcount >=count)
|
if (remcount >=count)
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ItemRemovedQuestCheck( pItem->GetEntry(), count - remcount );
|
||||||
|
pItem->SetCount( pItem->GetCount() - count + remcount );
|
||||||
|
if (IsInWorld() & update)
|
||||||
|
pItem->SendUpdateToPlayer( this );
|
||||||
|
pItem->SetState(ITEM_CHANGED, this);
|
||||||
|
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -11077,40 +11079,28 @@ void Player::DestroyZoneLimitedItem( bool update, uint32 new_zone )
|
||||||
|
|
||||||
// in inventory
|
// in inventory
|
||||||
for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++)
|
for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++)
|
||||||
{
|
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone))
|
||||||
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
|
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
||||||
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
|
||||||
}
|
|
||||||
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
|
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
|
||||||
{
|
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone))
|
||||||
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
|
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
||||||
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
|
||||||
}
|
|
||||||
|
|
||||||
// in inventory bags
|
// in inventory bags
|
||||||
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 ))
|
||||||
Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
|
||||||
if( pBag )
|
|
||||||
{
|
|
||||||
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
{
|
if (Item* pItem = pBag->GetItemByPos(j))
|
||||||
Item* pItem = pBag->GetItemByPos(j);
|
if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone))
|
||||||
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
|
DestroyItem( i, j, update);
|
||||||
DestroyItem( i, j, update);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// in equipment and bag list
|
// in equipment and bag list
|
||||||
for(int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; i++)
|
for(int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; i++)
|
||||||
{
|
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone))
|
||||||
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
|
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
||||||
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::DestroyConjuredItems( bool update )
|
void Player::DestroyConjuredItems( bool update )
|
||||||
|
|
@ -11121,40 +11111,23 @@ void Player::DestroyConjuredItems( bool update )
|
||||||
|
|
||||||
// in inventory
|
// in inventory
|
||||||
for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++)
|
for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++)
|
||||||
{
|
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if (pItem->IsConjuredConsumable())
|
||||||
if( pItem && pItem->GetProto() &&
|
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
||||||
(pItem->GetProto()->Class == ITEM_CLASS_CONSUMABLE) &&
|
|
||||||
(pItem->GetProto()->Flags & ITEM_FLAGS_CONJURED) )
|
|
||||||
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
|
||||||
}
|
|
||||||
|
|
||||||
// in inventory bags
|
// in inventory bags
|
||||||
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 ))
|
||||||
Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
|
||||||
if( pBag )
|
|
||||||
{
|
|
||||||
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
|
||||||
{
|
if (Item* pItem = pBag->GetItemByPos(j))
|
||||||
Item* pItem = pBag->GetItemByPos(j);
|
if (pItem->IsConjuredConsumable())
|
||||||
if( pItem && pItem->GetProto() &&
|
DestroyItem( i, j, update);
|
||||||
(pItem->GetProto()->Class == ITEM_CLASS_CONSUMABLE) &&
|
|
||||||
(pItem->GetProto()->Flags & ITEM_FLAGS_CONJURED) )
|
|
||||||
DestroyItem( i, j, update);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// in equipment and bag list
|
// in equipment and bag list
|
||||||
for(int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; i++)
|
for(int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; i++)
|
||||||
{
|
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
|
||||||
Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
|
if (pItem->IsConjuredConsumable())
|
||||||
if( pItem && pItem->GetProto() &&
|
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
||||||
(pItem->GetProto()->Class == ITEM_CLASS_CONSUMABLE) &&
|
|
||||||
(pItem->GetProto()->Flags & ITEM_FLAGS_CONJURED) )
|
|
||||||
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::DestroyItemCount( Item* pItem, uint32 &count, bool update )
|
void Player::DestroyItemCount( Item* pItem, uint32 &count, bool update )
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue