[Bazaar] Further refinements for instanced bazaar (#4544)

Resolves
- Parcels being delivered with incorrect item
- Inspecting an item from the bazaar window showing the incorrect item
This commit is contained in:
Mitch Freeman 2024-11-16 17:14:17 -04:00 committed by GitHub
parent 9967384ab8
commit 4977a7c2e0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 13 additions and 12 deletions

View File

@ -164,37 +164,35 @@ public:
return UpdateOne(db, m); return UpdateOne(db, m);
} }
static Trader GetItemBySerialNumber(Database &db, uint32 serial_number) static Trader GetItemBySerialNumber(Database &db, uint32 serial_number, uint32 trader_id)
{ {
Trader e{}; Trader e{};
const auto trader_item = GetWhere( const auto trader_item = GetWhere(
db, db,
fmt::format("`item_sn` = '{}' LIMIT 1", serial_number) fmt::format("`char_id` = '{}' AND `item_sn` = '{}' LIMIT 1", trader_id, serial_number)
); );
if (trader_item.empty()) { if (trader_item.empty()) {
return e; return e;
} }
else {
return trader_item.at(0); return trader_item.at(0);
}
} }
static Trader GetItemBySerialNumber(Database &db, std::string serial_number) static Trader GetItemBySerialNumber(Database &db, std::string serial_number, uint32 trader_id)
{ {
Trader e{}; Trader e{};
auto sn = Strings::ToUnsignedBigInt(serial_number); auto sn = Strings::ToUnsignedBigInt(serial_number);
const auto trader_item = GetWhere( const auto trader_item = GetWhere(
db, db,
fmt::format("`item_sn` = '{}' LIMIT 1", sn) fmt::format("`char_id` = '{}' AND `item_sn` = '{}' LIMIT 1", trader_id, sn)
); );
if (trader_item.empty()) { if (trader_item.empty()) {
return e; return e;
} }
else {
return trader_item.at(0); return trader_item.at(0);
}
} }
static int UpdateActiveTransaction(Database &db, uint32 id, bool status) static int UpdateActiveTransaction(Database &db, uint32 id, bool status)

View File

@ -3235,7 +3235,10 @@ void Client::SendBulkBazaarTraders()
void Client::DoBazaarInspect(const BazaarInspect_Struct &in) void Client::DoBazaarInspect(const BazaarInspect_Struct &in)
{ {
auto items = TraderRepository::GetWhere(database, fmt::format("item_sn = {}", in.serial_number)); auto items = TraderRepository::GetWhere(
database, fmt::format("`char_id` = '{}' AND `item_sn` = '{}'", in.trader_id, in.serial_number)
);
if (items.empty()) { if (items.empty()) {
LogInfo("Failed to find item with serial number [{}]", in.serial_number); LogInfo("Failed to find item with serial number [{}]", in.serial_number);
return; return;
@ -3304,7 +3307,7 @@ std::string Client::DetermineMoneyString(uint64 cp)
void Client::BuyTraderItemOutsideBazaar(TraderBuy_Struct *tbs, const EQApplicationPacket *app) void Client::BuyTraderItemOutsideBazaar(TraderBuy_Struct *tbs, const EQApplicationPacket *app)
{ {
auto in = (TraderBuy_Struct *) app->pBuffer; auto in = (TraderBuy_Struct *) app->pBuffer;
auto trader_item = TraderRepository::GetItemBySerialNumber(database, tbs->serial_number); auto trader_item = TraderRepository::GetItemBySerialNumber(database, tbs->serial_number, tbs->trader_id);
if (!trader_item.id) { if (!trader_item.id) {
LogTrading("Attempt to purchase an item outside of the Bazaar trader_id <red>[{}] item serial_number " LogTrading("Attempt to purchase an item outside of the Bazaar trader_id <red>[{}] item serial_number "
"<red>[{}] The Traders data was outdated.", "<red>[{}] The Traders data was outdated.",