From d8753ef5d74d6312e29baac6b95394f7ee0f24e5 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Fri, 10 Sep 2021 10:04:14 +0200 Subject: [PATCH] Core/Vendors: allow players to interact with vendors that do not have any items to sell --- src/server/game/Entities/Creature/Creature.h | 1 + src/server/game/Entities/Player/Player.cpp | 11 +---------- src/server/game/Handlers/ItemHandler.cpp | 3 +++ 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index f4190e6cc7..f8fe53ceb0 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -53,6 +53,7 @@ typedef std::list VendorItemCounts; #define CREATURE_Z_ATTACK_RANGE 3 #define MAX_VENDOR_ITEMS 150 // Limitation in 4.x.x item count in SMSG_VENDOR_INVENTORY +static constexpr uint8 VENDOR_INVENTORY_REASON_INVENTORY_EMPTY = 1; //used for handling non-repeatable random texts typedef std::vector CreatureTextRepeatIds; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 61953fc326..b3ff989ccc 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -13814,16 +13814,6 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool if (!isDead()) canTalk = false; break; - case GOSSIP_OPTION_VENDOR: - { - VendorItemData const* vendorItems = creature->GetVendorItems(); - if (!vendorItems || vendorItems->Empty()) - { - TC_LOG_ERROR("sql.sql", "Creature %s (Entry: %u GUID: %u DB GUID: %u) has UNIT_NPC_FLAG_VENDOR set, but has an empty trading item list.", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUID().GetCounter(), creature->GetSpawnId()); - canTalk = false; - } - break; - } case GOSSIP_OPTION_LEARNDUALSPEC: case GOSSIP_OPTION_DUALSPEC_INFO: if (!(GetSpecsCount() == 1 && creature->CanResetTalents(this) && !(getLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL)))) @@ -13864,6 +13854,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool case GOSSIP_OPTION_PETITIONER: case GOSSIP_OPTION_TABARDDESIGNER: case GOSSIP_OPTION_AUCTIONEER: + case GOSSIP_OPTION_VENDOR: break; // no checks case GOSSIP_OPTION_OUTDOORPVP: if (!sOutdoorPvPMgr->CanTalkTo(this, creature, itr->second)) diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index a67a8cb669..4182d4b8e5 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -710,6 +710,9 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid) // Resize vector to real size (some items can be skipped due to checks) packet.Items.resize(count); + if (!count) + packet.Reason = VENDOR_INVENTORY_REASON_INVENTORY_EMPTY; + SendPacket(packet.Write()); }