[Fix] Update trader add/remove packets to limits for RoF2 (#4595)

* Update trader add/remove to limit for RoF2

Update trader add/remove to limit for RoF2

* Update for feedback

---------

Co-authored-by: Mitch Freeman <neckkola@gmail.com>
This commit is contained in:
Mitch Freeman 2025-01-19 18:37:09 -04:00 committed by GitHub
parent 035c51944f
commit d47bf687d0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 32 additions and 16 deletions

View File

@ -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;

View File

@ -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<char[]>(p_size);
memset(buffer.get(), 0, p_size);

View File

@ -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()) {