From 1dc61b0e7dbe65ce1c11f37ea9ab72bd9dc077de Mon Sep 17 00:00:00 2001 From: Mitch Freeman Date: Sat, 11 Jan 2025 09:49:37 -0400 Subject: [PATCH 1/2] Update trader add/remove to limit for RoF2 Update trader add/remove to limit for RoF2 --- zone/client.h | 5 +++++ zone/trading.cpp | 2 ++ zone/worldserver.cpp | 27 ++++++++++++++++++--------- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/zone/client.h b/zone/client.h index a60b01b43e..f26bb499c6 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1128,6 +1128,10 @@ class Client : public Mob void SetTrader(bool status) { trader = status; } uint16 GetTraderID() { return trader_id; } void SetTraderID(uint16 id) { trader_id = id; } + void SetNoOfTraders(uint32 no) { m_no_traders = no; } + uint32 GetNoOfTraders() { return m_no_traders; } + void IncrementNoOfTraders() { m_no_traders += 1; } + void DecrementNoOfTraders() { m_no_traders > 0 ? m_no_traders -= 1 : m_no_traders = 0; } eqFilterMode GetFilter(eqFilterType filter_id) const { return ClientFilters[filter_id]; } void SetFilter(eqFilterType filter_id, eqFilterMode filter_mode) { ClientFilters[filter_id] = filter_mode; } @@ -1946,6 +1950,7 @@ class Client : public Mob uint8 firstlogon; uint32 mercid; // current merc uint8 mercSlot; // selected merc slot + uint32 m_no_traders{}; uint32 m_buyer_id; uint32 m_barter_time; int32 m_parcel_platinum; diff --git a/zone/trading.cpp b/zone/trading.cpp index 785fd2aec6..885d392f0b 100644 --- a/zone/trading.cpp +++ b/zone/trading.cpp @@ -3225,6 +3225,8 @@ void Client::SendBulkBazaarTraders() EQ::constants::StaticLookup(ClientVersion())->BazaarTraderLimit ); + SetNoOfTraders(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 768fe4a4fc..e82a71b76f 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -3912,29 +3912,38 @@ 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; + 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; + out->zone_instance_id = in->instance_id; + out->trader_id = in->trader_id; + strn0cpy(out->trader_name, in->trader_name, sizeof(out->trader_name)); + switch (in->action) { case TraderOn: { out->action = AddTraderToBazaarWindow; + if (c.second->GetNoOfTraders() < + EQ::constants::StaticLookup(c.second->ClientVersion())->BazaarTraderLimit) { + c.second->IncrementNoOfTraders(); + c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED); + } + break; } case TraderOff: { out->action = RemoveTraderFromBazaarWindow; + c.second->DecrementNoOfTraders(); + c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED); break; } default: { out->action = 0; + c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED); } } - out->entity_id = in->entity_id; - out->zone_id = in->zone_id; - out->zone_instance_id = in->instance_id; - 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); safe_delete(outapp); } if (zone && zone->GetZoneID() == Zones::BAZAAR && in->instance_id == zone->GetInstanceID()) { From f1d21760c1c4e9249eb1d5f27d7b1794ced969e4 Mon Sep 17 00:00:00 2001 From: Mitch Freeman <65987027+neckkola@users.noreply.github.com> Date: Sat, 18 Jan 2025 09:28:33 -0400 Subject: [PATCH 2/2] Update for feedback --- zone/client.h | 10 +++++----- zone/trading.cpp | 2 +- zone/worldserver.cpp | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/zone/client.h b/zone/client.h index f26bb499c6..0e50b1cc87 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1128,10 +1128,10 @@ class Client : public Mob void SetTrader(bool status) { trader = status; } uint16 GetTraderID() { return trader_id; } void SetTraderID(uint16 id) { trader_id = id; } - void SetNoOfTraders(uint32 no) { m_no_traders = no; } - uint32 GetNoOfTraders() { return m_no_traders; } - void IncrementNoOfTraders() { m_no_traders += 1; } - void DecrementNoOfTraders() { m_no_traders > 0 ? m_no_traders -= 1 : m_no_traders = 0; } + 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; } @@ -1950,7 +1950,7 @@ class Client : public Mob uint8 firstlogon; uint32 mercid; // current merc uint8 mercSlot; // selected merc slot - uint32 m_no_traders{}; + 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 885d392f0b..a64dc33e9d 100644 --- a/zone/trading.cpp +++ b/zone/trading.cpp @@ -3225,7 +3225,7 @@ void Client::SendBulkBazaarTraders() EQ::constants::StaticLookup(ClientVersion())->BazaarTraderLimit ); - SetNoOfTraders(results.count); + SetTraderCount(results.count); auto p_size = 4 + 12 * results.count + results.name_length; auto buffer = std::make_unique(p_size); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index e82a71b76f..8112d422cd 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -3924,9 +3924,9 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) switch (in->action) { case TraderOn: { out->action = AddTraderToBazaarWindow; - if (c.second->GetNoOfTraders() < + if (c.second->GetTraderCount() < EQ::constants::StaticLookup(c.second->ClientVersion())->BazaarTraderLimit) { - c.second->IncrementNoOfTraders(); + c.second->IncrementTraderCount(); c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED); } @@ -3934,7 +3934,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } case TraderOff: { out->action = RemoveTraderFromBazaarWindow; - c.second->DecrementNoOfTraders(); + c.second->DecrementTraderCount(); c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED); break; }