Small cleanups in item checks code. Author: VladimirMangos

--HG--
branch : trunk
This commit is contained in:
megamage
2009-03-14 20:02:33 -06:00
parent 9041286aa2
commit ef5d01d66d
3 changed files with 105 additions and 132 deletions
+3 -6
View File
@@ -287,13 +287,10 @@ class TRINITY_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;
+3
View File
@@ -658,6 +658,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
+99 -126
View File
@@ -814,9 +814,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() );
} }
} }
} }
@@ -11252,60 +11252,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;
} }
} }
} }
@@ -11317,27 +11317,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;
} }
} }
} }
@@ -11347,29 +11348,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;
} }
} }
} }
@@ -11381,40 +11383,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 )
@@ -11425,40 +11415,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 )