diff --git a/zone/client.h b/zone/client.h index b050c34fa..75c48a494 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1130,6 +1130,10 @@ public: void SetTrader(bool status) { trader = status; } uint16 GetTraderID() { return trader_id; } void SetTraderID(uint16 id) { trader_id = id; } + void SetTraderCount(uint32 no) { m_trader_count = no; } + uint32 GetTraderCount() { return m_trader_count; } + void IncrementTraderCount() { m_trader_count += 1; } + void DecrementTraderCount() { m_trader_count > 0 ? m_trader_count -= 1 : m_trader_count = 0; } eqFilterMode GetFilter(eqFilterType filter_id) const { return ClientFilters[filter_id]; } void SetFilter(eqFilterType filter_id, eqFilterMode filter_mode) { ClientFilters[filter_id] = filter_mode; } @@ -1948,6 +1952,7 @@ private: uint8 firstlogon; uint32 mercid; // current merc uint8 mercSlot; // selected merc slot + uint32 m_trader_count{}; uint32 m_buyer_id; uint32 m_barter_time; int32 m_parcel_platinum; diff --git a/zone/trading.cpp b/zone/trading.cpp index 785fd2aec..a64dc33e9 100644 --- a/zone/trading.cpp +++ b/zone/trading.cpp @@ -3225,6 +3225,8 @@ void Client::SendBulkBazaarTraders() EQ::constants::StaticLookup(ClientVersion())->BazaarTraderLimit ); + SetTraderCount(results.count); + auto p_size = 4 + 12 * results.count + results.name_length; auto buffer = std::make_unique(p_size); memset(buffer.get(), 0, p_size); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 768fe4a4f..8112d422c 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -3912,21 +3912,8 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) auto in = (TraderMessaging_Struct *) pack->pBuffer; for (auto const &c: entity_list.GetClientList()) { if (c.second->ClientVersion() >= EQ::versions::ClientVersion::RoF2) { - auto outapp = new EQApplicationPacket(OP_BecomeTrader, sizeof(BecomeTrader_Struct)); - auto out = (BecomeTrader_Struct *) outapp->pBuffer; - switch (in->action) { - case TraderOn: { - out->action = AddTraderToBazaarWindow; - break; - } - case TraderOff: { - out->action = RemoveTraderFromBazaarWindow; - break; - } - default: { - out->action = 0; - } - } + auto outapp = new EQApplicationPacket(OP_BecomeTrader, sizeof(BecomeTrader_Struct)); + auto out = (BecomeTrader_Struct *) outapp->pBuffer; out->entity_id = in->entity_id; out->zone_id = in->zone_id; @@ -3934,7 +3921,29 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) out->trader_id = in->trader_id; strn0cpy(out->trader_name, in->trader_name, sizeof(out->trader_name)); - c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED); + switch (in->action) { + case TraderOn: { + out->action = AddTraderToBazaarWindow; + if (c.second->GetTraderCount() < + EQ::constants::StaticLookup(c.second->ClientVersion())->BazaarTraderLimit) { + c.second->IncrementTraderCount(); + c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED); + } + + break; + } + case TraderOff: { + out->action = RemoveTraderFromBazaarWindow; + c.second->DecrementTraderCount(); + c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED); + break; + } + default: { + out->action = 0; + c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED); + } + } + safe_delete(outapp); } if (zone && zone->GetZoneID() == Zones::BAZAAR && in->instance_id == zone->GetInstanceID()) {