[Feature] Add Alternate Bazaar Search Approach (#4600)

* Add Alternate Bazaar Search

This adds an alternate bazaar search allowing multinstance bazaar searching and traders above 600.  Allows searches based on Bazaar Shard

* Update worldserver.cpp

---------

Co-authored-by: Mitch Freeman <neckkola@gmail.com>
Co-authored-by: Akkadius <akkadius1@gmail.com>
This commit is contained in:
Mitch Freeman
2025-01-19 21:02:53 -04:00
committed by GitHub
parent f21cc170df
commit 37a7b7fc41
7 changed files with 166 additions and 13 deletions
+1 -1
View File
@@ -295,7 +295,7 @@ public:
void SendBazaarDone(uint32 trader_id);
void SendBulkBazaarTraders();
void SendBulkBazaarBuyers();
void DoBazaarInspect(const BazaarInspect_Struct &in);
void DoBazaarInspect(BazaarInspect_Struct &in);
void SendBazaarDeliveryCosts();
static std::string DetermineMoneyString(uint64 copper);
+20
View File
@@ -15535,6 +15535,26 @@ void Client::Handle_OP_TraderBuy(const EQApplicationPacket *app)
// Client has elected to buy an item from a Trader
//
auto in = (TraderBuy_Struct *) app->pBuffer;
if (RuleB(Bazaar, UseAlternateBazaarSearch) && in->trader_id >= TraderRepository::TRADER_CONVERT_ID) {
auto trader = TraderRepository::GetTraderByInstanceAndSerialnumber(
database,
in->trader_id - TraderRepository::TRADER_CONVERT_ID,
in->serial_number
);
if (!trader.trader_id) {
LogTrading("Unable to convert trader id for {} and serial number {}. Trader Buy aborted.",
in->trader_id - TraderRepository::TRADER_CONVERT_ID,
in->serial_number
);
return;
}
in->trader_id = trader.trader_id;
strn0cpy(in->seller_name, trader.trader_name.c_str(), sizeof(in->seller_name));
}
auto trader = entity_list.GetClientByID(in->trader_id);
switch (in->method) {
+57 -6
View File
@@ -3222,11 +3222,42 @@ void Client::SendBulkBazaarTraders()
return;
}
auto results = TraderRepository::GetDistinctTraders(
database,
GetInstanceID(),
EQ::constants::StaticLookup(ClientVersion())->BazaarTraderLimit
);
TraderRepository::BulkTraders_Struct results{};
if (RuleB(Bazaar, UseAlternateBazaarSearch))
{
if (GetZoneID() == Zones::BAZAAR) {
results = TraderRepository::GetDistinctTraders(database, GetInstanceID());
}
uint32 number = 1;
auto shards = CharacterDataRepository::GetInstanceZonePlayerCounts(database, Zones::BAZAAR);
for (auto const &shard: shards) {
if (GetZoneID() != Zones::BAZAAR || (GetZoneID() == Zones::BAZAAR && GetInstanceID() != shard.instance_id)) {
TraderRepository::DistinctTraders_Struct t{};
t.entity_id = 0;
t.trader_id = TraderRepository::TRADER_CONVERT_ID + shard.instance_id;
t.trader_name = fmt::format("Bazaar Shard {}", number);
t.zone_id = Zones::BAZAAR;
t.zone_instance_id = shard.instance_id;
results.count += 1;
results.name_length += t.trader_name.length() + 1;
results.traders.push_back(t);
}
number++;
}
}
else {
results = TraderRepository::GetDistinctTraders(
database,
GetInstanceID(),
EQ::constants::StaticLookup(ClientVersion())->BazaarTraderLimit
);
}
SetTraderCount(results.count);
SetTraderCount(results.count);
@@ -3251,8 +3282,28 @@ void Client::SendBulkBazaarTraders()
QueuePacket(outapp.get());
}
void Client::DoBazaarInspect(const BazaarInspect_Struct &in)
void Client::DoBazaarInspect(BazaarInspect_Struct &in)
{
if (RuleB(Bazaar, UseAlternateBazaarSearch)) {
if (in.trader_id >= TraderRepository::TRADER_CONVERT_ID) {
auto trader = TraderRepository::GetTraderByInstanceAndSerialnumber(
database,
in.trader_id - TraderRepository::TRADER_CONVERT_ID,
fmt::format("{}", in.serial_number).c_str()
);
if (!trader.trader_id) {
LogTrading("Unable to convert trader id for {} and serial number {}. Trader Buy aborted.",
in.trader_id - TraderRepository::TRADER_CONVERT_ID,
in.serial_number
);
return;
}
in.trader_id = trader.trader_id;
}
}
auto items = TraderRepository::GetWhere(
database, fmt::format("`char_id` = '{}' AND `item_sn` = '{}'", in.trader_id, in.serial_number)
);
+23 -3
View File
@@ -3926,16 +3926,36 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
out->action = AddTraderToBazaarWindow;
if (c.second->GetTraderCount() <
EQ::constants::StaticLookup(c.second->ClientVersion())->BazaarTraderLimit) {
if (RuleB(Bazaar, UseAlternateBazaarSearch)) {
if (out->zone_id == Zones::BAZAAR &&
out->zone_instance_id == c.second->GetInstanceID()) {
c.second->IncrementTraderCount();
c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED);
}
}
else {
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);
if (c.second->GetTraderCount() <=
EQ::constants::StaticLookup(c.second->ClientVersion())->BazaarTraderLimit) {
if (RuleB(Bazaar, UseAlternateBazaarSearch)) {
if (out->zone_id == Zones::BAZAAR &&
out->zone_instance_id == c.second->GetInstanceID()) {
c.second->DecrementTraderCount();
c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED);
}
}
else {
c.second->DecrementTraderCount();
c.second->QueuePacket(outapp, true, Mob::CLIENT_CONNECTED);
}
}
break;
}
default: {