diff options
author | IntelligentQuantum <IntelligentQuantum@ProtonMail.Com> | 2020-08-20 13:30:11 +0430 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-20 11:00:11 +0200 |
commit | 5d284f02a7119515330a03dfc240ce80c02c12c3 (patch) | |
tree | c3cec7dfb33c457f7b019a60657d15221f455d8a | |
parent | 07c9debb0d0d502b3d5050f6aa1b90b2960ee5d4 (diff) |
feat(Core/SendListInventory): Add multivendor function (#3172)
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 6 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 6 |
6 files changed, 21 insertions, 10 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0583ec5997..252b1b78ac 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14859,7 +14859,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool break; case GOSSIP_OPTION_VENDOR: { - VendorItemData const* vendorItems = creature->GetVendorItems(); + VendorItemData const* vendorItems = itr->second.ActionMenuID ? sObjectMgr->GetNpcVendorItemList(itr->second.ActionMenuID) : creature->GetVendorItems(); if (!vendorItems || vendorItems->Empty()) { sLog->outErrorDb("Creature %u (Entry: %u) have UNIT_NPC_FLAG_VENDOR but have empty trading item list.", creature->GetGUIDLow(), creature->GetEntry()); @@ -15087,7 +15087,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men break; case GOSSIP_OPTION_VENDOR: case GOSSIP_OPTION_ARMORER: - GetSession()->SendListInventory(guid); + GetSession()->SendListInventory(guid, menuItemData->GossipActionMenuId); break; case GOSSIP_OPTION_STABLEPET: GetSession()->SendStablePet(guid); @@ -16308,7 +16308,7 @@ bool Player::SatisfyQuestStatus(Quest const* qInfo, bool msg) const } bool Player::SatisfyQuestConditions(Quest const* qInfo, bool msg) -{ +{ ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, qInfo->GetQuestId()); if (!sConditionMgr->IsObjectMeetToConditions(this, conditions)) { @@ -22089,7 +22089,7 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32 return false; } - VendorItemData const* vItems = creature->GetVendorItems(); + VendorItemData const* vItems = GetSession()->GetCurrentVendor() ? sObjectMgr->GetNpcVendorItemList(GetSession()->GetCurrentVendor()) : creature->GetVendorItems(); if (!vItems || vItems->Empty()) { SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 9b95727246..92e4b4de36 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8512,8 +8512,9 @@ bool ObjectMgr::RemoveVendorItem(uint32 entry, uint32 item, bool persist /*= tru return true; } -bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 maxcount, uint32 incrtime, uint32 ExtendedCost, Player* player, std::set<uint32>* skip_vendors, uint32 ORnpcflag) const +bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 maxcount, uint32 incrtime, uint32 ExtendedCost, Player* player, std::set<uint32>* /*skip_vendors*/, uint32 /*ORnpcflag*/) const { + /* CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(vendor_entry); if (!cInfo) { @@ -8538,6 +8539,7 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 max } return false; } + */ if (!sObjectMgr->GetItemTemplate(item_id)) { diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 7c22a85407..12094dc5ec 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -887,7 +887,7 @@ void WorldSession::HandleListInventoryOpcode(WorldPacket & recvData) SendListInventory(guid); } -void WorldSession::SendListInventory(uint64 vendorGuid) +void WorldSession::SendListInventory(uint64 vendorGuid, uint32 vendorEntry) { #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_LIST_INVENTORY"); @@ -911,7 +911,9 @@ void WorldSession::SendListInventory(uint64 vendorGuid) if (vendor->HasUnitState(UNIT_STATE_MOVING)) vendor->StopMoving(); - VendorItemData const* items = vendor->GetVendorItems(); + SetCurrentVendor(vendorEntry); + + VendorItemData const* items = vendorEntry ? sObjectMgr->GetNpcVendorItemList(vendorEntry) : vendor->GetVendorItems(); if (!items) { WorldPacket data(SMSG_LIST_INVENTORY, 8 + 1 + 1); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 12c6aebbf9..105affc5b7 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -112,6 +112,7 @@ WorldSession::WorldSession(uint32 id, WorldSocket* sock, AccountTypes sec, uint8 m_TutorialsChanged(false), recruiterId(recruiter), isRecruiter(isARecruiter), + m_currentVendorEntry(0), m_currentBankerGUID(0), timeWhoCommandAllowed(0), _calendarEventCreationCooldown(0) diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 322173c44c..bba6c7ddec 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -226,6 +226,9 @@ class WorldSession std::string const& GetPlayerName() const; std::string GetPlayerInfo() const; + uint32 GetCurrentVendor() const { return m_currentVendorEntry; } + void SetCurrentVendor(uint32 vendorEntry) { m_currentVendorEntry = vendorEntry; } + uint32 GetGuidLow() const; void SetSecurity(AccountTypes security) { _security = security; } std::string const& GetRemoteAddress() { return m_Address; } @@ -270,7 +273,7 @@ class WorldSession void SendTrainerList(uint64 guid); void SendTrainerList(uint64 guid, std::string const& strTitle); - void SendListInventory(uint64 guid); + void SendListInventory(uint64 guid, uint32 vendorEntry = 0); void SendShowBank(uint64 guid); bool CanOpenMailBox(uint64 guid); void SendShowMailBox(uint64 guid); @@ -1031,6 +1034,7 @@ class WorldSession uint32 recruiterId; bool isRecruiter; ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue; + uint32 m_currentVendorEntry; uint64 m_currentBankerGUID; time_t timeWhoCommandAllowed; uint32 _offlineTime; diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index fe94b73fc6..952e6f1963 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -295,7 +295,8 @@ public: return false; } - uint32 vendor_entry = vendor->GetEntry(); + char* addMulti = strtok(nullptr, " "); + uint32 vendor_entry = addMulti ? handler->GetSession()->GetCurrentVendor() : vendor->GetEntry(); if (!sObjectMgr->IsVendorItemValid(vendor_entry, itemId, maxcount, incrtime, extendedcost, handler->GetSession()->GetPlayer())) { @@ -518,7 +519,8 @@ public: } uint32 itemId = atol(pitem); - if (!sObjectMgr->RemoveVendorItem(vendor->GetEntry(), itemId)) + char* addMulti = strtok(NULL, " "); + if (!sObjectMgr->RemoveVendorItem(addMulti ? handler->GetSession()->GetCurrentVendor() : vendor->GetEntry(), itemId)) { handler->PSendSysMessage(LANG_ITEM_NOT_IN_LIST, itemId); handler->SetSentErrorMessage(true); |