From 9967384ab8831e322778b71f8583c5aa96fdcbbf Mon Sep 17 00:00:00 2001 From: Mitch Freeman <65987027+neckkola@users.noreply.github.com> Date: Thu, 14 Nov 2024 21:44:03 -0400 Subject: [PATCH] [Fix] Fix for mult-instanced bazaar zones (#4541) * Enable bazaar for multiple instances. * Enable buyer for multiple instances. * Update to buyer/barter for multiple instances and attuned items. --- common/eq_packet_structs.h | 1 + world/zoneserver.cpp | 18 +++++++++++++++--- zone/trading.cpp | 9 +++++++++ zone/worldserver.cpp | 1 + 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index e9b80aaf0..322bdf639 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -3221,6 +3221,7 @@ struct BuyerMessaging_Struct { char item_name[64]; uint32 slot; uint32 seller_quantity; + uint32 purchase_method; // 0 direct merchant, 1 via /barter window }; struct BuyerAddBuyertoBarterWindow_Struct { diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index c54164594..b00afb4b7 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -1755,7 +1755,11 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { return; } - zoneserver_list.SendPacket(Zones::BAZAAR, pack); + auto trader = client_list.FindCLEByCharacterID(in->trader_buy_struct.trader_id); + if (trader) { + zoneserver_list.SendPacket(trader->zone(), trader->instance(), pack); + } + break; } case ServerOP_BuyerMessaging: { @@ -1775,12 +1779,20 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { break; } case Barter_SellItem: { - zoneserver_list.SendPacket(Zones::BAZAAR, pack); + auto buyer = client_list.FindCharacter(in->buyer_name); + if (buyer) { + zoneserver_list.SendPacket(buyer->zone(), buyer->instance(), pack); + } + break; } case Barter_FailedTransaction: case Barter_BuyerTransactionComplete: { - zoneserver_list.SendPacket(in->zone_id, pack); + auto seller = client_list.FindCharacter(in->seller_name); + if (seller) { + zoneserver_list.SendPacket(seller->zone(), seller->instance(), pack); + } + break; } default: diff --git a/zone/trading.cpp b/zone/trading.cpp index ac142319e..7a8abc2e9 100644 --- a/zone/trading.cpp +++ b/zone/trading.cpp @@ -2606,6 +2606,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) data->zone_id = GetZoneID(); data->slot = sell_line.slot; data->seller_quantity = sell_line.seller_quantity; + data->purchase_method = sell_line.purchase_method; strn0cpy(data->item_name, sell_line.item_name, sizeof(data->item_name)); strn0cpy(data->buyer_name, sell_line.buyer_name.c_str(), sizeof(data->buyer_name)); strn0cpy(data->seller_name, GetCleanName(), sizeof(data->seller_name)); @@ -4252,6 +4253,14 @@ bool Client::DoBarterSellerChecks(BuyerLineSellItem_Struct &sell_line) Message(Chat::Red, "The item that you are trying to sell is augmented. Please remove augments first"); } + if (sell_item && !sell_item->IsDroppable()) { + seller_error = true; + LogTradingDetail("Seller item [{}] is non-tradeable therefore cannot be sold.", + sell_line.item_name + ); + Message(Chat::Red, "The item that you are trying to sell is non-tradeable and therefore cannot be sold."); + } + if (seller_error) { LogTradingDetail("Seller Error [{}] Barter Sell/Buy Transaction Failed.", seller_error); SendBarterBuyerClientMessage(sell_line, Barter_SellerTransactionComplete, Barter_Failure, Barter_Failure); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 76e24c962..acfb686df 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -4044,6 +4044,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) sell_line.buyer_name = in->buyer_name; sell_line.seller_quantity = in->seller_quantity; sell_line.slot = in->slot; + sell_line.purchase_method = in->purchase_method; strn0cpy(sell_line.item_name, in->item_name, sizeof(sell_line.item_name)); uint64 total_cost = (uint64) sell_line.item_cost * (uint64) sell_line.seller_quantity;