mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
[11209] Some refactoring in Player::BuyItemFromVendorSlot
This commit is contained in:
parent
d1370941ca
commit
65b631a8e4
4 changed files with 75 additions and 79 deletions
|
|
@ -18818,6 +18818,22 @@ void Player::InitDisplayIds()
|
|||
}
|
||||
}
|
||||
|
||||
void Player::TakeExtendedCost(uint32 extendedCostId, uint32 count)
|
||||
{
|
||||
ItemExtendedCostEntry const* extendedCost = sItemExtendedCostStore.LookupEntry(extendedCostId);
|
||||
|
||||
if (extendedCost->reqhonorpoints)
|
||||
ModifyHonorPoints(-int32(extendedCost->reqhonorpoints * count));
|
||||
if (extendedCost->reqarenapoints)
|
||||
ModifyArenaPoints(-int32(extendedCost->reqarenapoints * count));
|
||||
|
||||
for (uint8 i = 0; i < MAX_EXTENDED_COST_ITEMS; ++i)
|
||||
{
|
||||
if (extendedCost->reqitem[i])
|
||||
DestroyItemCount(extendedCost->reqitem[i], extendedCost->reqitemcount[i] * count, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Return true is the bought item has a max count to force refresh of window by caller
|
||||
bool Player::BuyItemFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot)
|
||||
{
|
||||
|
|
@ -18827,10 +18843,10 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorslot, uin
|
|||
if (!isAlive())
|
||||
return false;
|
||||
|
||||
ItemPrototype const *pProto = ObjectMgr::GetItemPrototype( item );
|
||||
ItemPrototype const *pProto = ObjectMgr::GetItemPrototype(item);
|
||||
if (!pProto)
|
||||
{
|
||||
SendBuyError( BUY_ERR_CANT_FIND_ITEM, NULL, item, 0);
|
||||
SendBuyError(BUY_ERR_CANT_FIND_ITEM, NULL, item, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -18846,7 +18862,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorslot, uin
|
|||
VendorItemData const* tItems = pCreature->GetVendorTemplateItems();
|
||||
if ((!vItems || vItems->Empty()) && (!tItems || tItems->Empty()))
|
||||
{
|
||||
SendBuyError( BUY_ERR_CANT_FIND_ITEM, pCreature, item, 0);
|
||||
SendBuyError(BUY_ERR_CANT_FIND_ITEM, pCreature, item, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -18855,14 +18871,14 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorslot, uin
|
|||
|
||||
if (vendorslot >= vCount+tCount)
|
||||
{
|
||||
SendBuyError( BUY_ERR_CANT_FIND_ITEM, pCreature, item, 0);
|
||||
SendBuyError(BUY_ERR_CANT_FIND_ITEM, pCreature, item, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
VendorItem const* crItem = vendorslot < vCount ? vItems->GetItem(vendorslot) : tItems->GetItem(vendorslot - vCount);
|
||||
if (!crItem) // store diff item (cheating)
|
||||
{
|
||||
SendBuyError( BUY_ERR_CANT_FIND_ITEM, pCreature, item, 0);
|
||||
SendBuyError(BUY_ERR_CANT_FIND_ITEM, pCreature, item, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -18874,28 +18890,30 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorslot, uin
|
|||
ItemPrototype const* crProto = ObjectMgr::GetItemPrototype(crItem->item);
|
||||
if (crProto->Flags & ITEM_FLAG_BOA && crProto->RequiredReputationFaction &&
|
||||
uint32(GetReputationRank(crProto->RequiredReputationFaction)) >= crProto->RequiredReputationRank)
|
||||
converted = item == sObjectMgr.GetItemConvert(crItem->item, getRaceMask());;
|
||||
converted = item == sObjectMgr.GetItemConvert(crItem->item, getRaceMask());
|
||||
|
||||
if(!converted)
|
||||
if (!converted)
|
||||
{
|
||||
SendBuyError(BUY_ERR_CANT_FIND_ITEM, pCreature, item, 0);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 totalCount = pProto->BuyCount * count;
|
||||
|
||||
// check current item amount if it limited
|
||||
if (crItem->maxcount != 0)
|
||||
{
|
||||
if (pCreature->GetVendorItemCurrentCount(crItem) < pProto->BuyCount * count )
|
||||
if (pCreature->GetVendorItemCurrentCount(crItem) < totalCount)
|
||||
{
|
||||
SendBuyError( BUY_ERR_ITEM_ALREADY_SOLD, pCreature, item, 0);
|
||||
SendBuyError(BUY_ERR_ITEM_ALREADY_SOLD, pCreature, item, 0);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (uint32(GetReputationRank(pProto->RequiredReputationFaction)) < pProto->RequiredReputationRank)
|
||||
{
|
||||
SendBuyError( BUY_ERR_REPUTATION_REQUIRE, pCreature, item, 0);
|
||||
SendBuyError(BUY_ERR_REPUTATION_REQUIRE, pCreature, item, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -18923,9 +18941,9 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorslot, uin
|
|||
}
|
||||
|
||||
// item base price
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
for (uint8 i = 0; i < MAX_EXTENDED_COST_ITEMS; ++i)
|
||||
{
|
||||
if(iece->reqitem[i] && !HasItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count)))
|
||||
if (iece->reqitem[i] && !HasItemCount(iece->reqitem[i], iece->reqitemcount[i] * count))
|
||||
{
|
||||
SendEquipError(EQUIP_ERR_VENDOR_MISSING_TURNINS, NULL, NULL);
|
||||
return false;
|
||||
|
|
@ -18933,15 +18951,15 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorslot, uin
|
|||
}
|
||||
|
||||
// check for personal arena rating requirement
|
||||
if( GetMaxPersonalArenaRatingRequirement(iece->reqarenaslot) < iece->reqpersonalarenarating )
|
||||
if (GetMaxPersonalArenaRatingRequirement(iece->reqarenaslot) < iece->reqpersonalarenarating)
|
||||
{
|
||||
// probably not the proper equip err
|
||||
SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK,NULL,NULL);
|
||||
SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, NULL, NULL);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 price = (crItem->ExtendedCost == 0 || pProto->Flags2 & ITEM_FLAG2_EXT_COST_REQUIRES_GOLD) ? pProto->BuyPrice * count : 0;
|
||||
uint32 price = (crItem->ExtendedCost == 0 || pProto->Flags2 & ITEM_FLAG2_EXT_COST_REQUIRES_GOLD) ? pProto->BuyPrice * count : 0;
|
||||
|
||||
// reputation discount
|
||||
if (price)
|
||||
|
|
@ -18949,102 +18967,75 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorslot, uin
|
|||
|
||||
if (GetMoney() < price)
|
||||
{
|
||||
SendBuyError( BUY_ERR_NOT_ENOUGHT_MONEY, pCreature, item, 0);
|
||||
SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, pCreature, item, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
Item* pItem = NULL;
|
||||
|
||||
if ((bag == NULL_BAG && slot == NULL_SLOT) || IsInventoryPos(bag, slot))
|
||||
{
|
||||
ItemPosCountVec dest;
|
||||
uint8 msg = CanStoreNewItem( bag, slot, dest, item, pProto->BuyCount * count );
|
||||
uint8 msg = CanStoreNewItem(bag, slot, dest, item, totalCount);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
SendEquipError( msg, NULL, NULL, item );
|
||||
SendEquipError(msg, NULL, NULL, item);
|
||||
return false;
|
||||
}
|
||||
|
||||
ModifyMoney( -(int32)price );
|
||||
if (uint32 extendedCostId = crItem->ExtendedCost)
|
||||
{
|
||||
ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(extendedCostId);
|
||||
if (iece->reqhonorpoints)
|
||||
ModifyHonorPoints( - int32(iece->reqhonorpoints * count));
|
||||
if (iece->reqarenapoints)
|
||||
ModifyArenaPoints( - int32(iece->reqarenapoints * count));
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
if (iece->reqitem[i])
|
||||
DestroyItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count), true);
|
||||
}
|
||||
}
|
||||
ModifyMoney(-int32(price));
|
||||
|
||||
if (Item *it = StoreNewItem( dest, item, true ))
|
||||
{
|
||||
uint32 new_count = pCreature->UpdateVendorItemCurrentCount(crItem,pProto->BuyCount * count);
|
||||
if (crItem->ExtendedCost)
|
||||
TakeExtendedCost(crItem->ExtendedCost, count);
|
||||
|
||||
WorldPacket data(SMSG_BUY_ITEM, (8+4+4+4));
|
||||
data << pCreature->GetObjectGuid();
|
||||
data << uint32(vendorslot+1); // numbered from 1 at client
|
||||
data << uint32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF);
|
||||
data << uint32(count);
|
||||
GetSession()->SendPacket(&data);
|
||||
|
||||
SendNewItem(it, pProto->BuyCount*count, true, false, false);
|
||||
}
|
||||
pItem = StoreNewItem(dest, item, true);
|
||||
}
|
||||
else if (IsEquipmentPos(bag, slot))
|
||||
{
|
||||
if (pProto->BuyCount * count != 1)
|
||||
if (totalCount != 1)
|
||||
{
|
||||
SendEquipError( EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, NULL, NULL );
|
||||
SendEquipError(EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, NULL, NULL);
|
||||
return false;
|
||||
}
|
||||
|
||||
uint16 dest;
|
||||
uint8 msg = CanEquipNewItem( slot, dest, item, false );
|
||||
uint8 msg = CanEquipNewItem(slot, dest, item, false);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
SendEquipError( msg, NULL, NULL, item );
|
||||
SendEquipError(msg, NULL, NULL, item);
|
||||
return false;
|
||||
}
|
||||
|
||||
ModifyMoney( -(int32)price );
|
||||
if (uint32 extendedCostId = crItem->ExtendedCost)
|
||||
{
|
||||
ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(extendedCostId);
|
||||
if (iece->reqhonorpoints)
|
||||
ModifyHonorPoints( - int32(iece->reqhonorpoints));
|
||||
if (iece->reqarenapoints)
|
||||
ModifyArenaPoints( - int32(iece->reqarenapoints));
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
if(iece->reqitem[i])
|
||||
DestroyItemCount(iece->reqitem[i], iece->reqitemcount[i], true);
|
||||
}
|
||||
}
|
||||
ModifyMoney(-int32(price));
|
||||
|
||||
if (Item *it = EquipNewItem( dest, item, true ))
|
||||
{
|
||||
uint32 new_count = pCreature->UpdateVendorItemCurrentCount(crItem,pProto->BuyCount * count);
|
||||
if (crItem->ExtendedCost)
|
||||
TakeExtendedCost(crItem->ExtendedCost, count);
|
||||
|
||||
WorldPacket data(SMSG_BUY_ITEM, (8+4+4+4));
|
||||
data << pCreature->GetObjectGuid();
|
||||
data << uint32(vendorslot + 1); // numbered from 1 at client
|
||||
data << uint32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF);
|
||||
data << uint32(count);
|
||||
GetSession()->SendPacket(&data);
|
||||
|
||||
SendNewItem(it, pProto->BuyCount*count, true, false, false);
|
||||
pItem = EquipNewItem(dest, item, true);
|
||||
|
||||
if (pItem)
|
||||
AutoUnequipOffhandIfNeed();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SendEquipError( EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, NULL, NULL );
|
||||
SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, NULL, NULL);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!pItem)
|
||||
return false;
|
||||
|
||||
uint32 new_count = pCreature->UpdateVendorItemCurrentCount(crItem, totalCount);
|
||||
|
||||
WorldPacket data(SMSG_BUY_ITEM, 8+4+4+4);
|
||||
data << pCreature->GetObjectGuid();
|
||||
data << uint32(vendorslot + 1); // numbered from 1 at client
|
||||
data << uint32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF);
|
||||
data << uint32(count);
|
||||
GetSession()->SendPacket(&data);
|
||||
|
||||
SendNewItem(pItem, totalCount, true, false, false);
|
||||
|
||||
return crItem->maxcount != 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue