[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.
This commit is contained in:
Mitch Freeman 2024-11-14 21:44:03 -04:00 committed by GitHub
parent d3da2e5501
commit 9967384ab8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 26 additions and 3 deletions

View File

@ -3221,6 +3221,7 @@ struct BuyerMessaging_Struct {
char item_name[64]; char item_name[64];
uint32 slot; uint32 slot;
uint32 seller_quantity; uint32 seller_quantity;
uint32 purchase_method; // 0 direct merchant, 1 via /barter window
}; };
struct BuyerAddBuyertoBarterWindow_Struct { struct BuyerAddBuyertoBarterWindow_Struct {

View File

@ -1755,7 +1755,11 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
return; 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; break;
} }
case ServerOP_BuyerMessaging: { case ServerOP_BuyerMessaging: {
@ -1775,12 +1779,20 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
break; break;
} }
case Barter_SellItem: { 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; break;
} }
case Barter_FailedTransaction: case Barter_FailedTransaction:
case Barter_BuyerTransactionComplete: { 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; break;
} }
default: default:

View File

@ -2606,6 +2606,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app)
data->zone_id = GetZoneID(); data->zone_id = GetZoneID();
data->slot = sell_line.slot; data->slot = sell_line.slot;
data->seller_quantity = sell_line.seller_quantity; 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->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->buyer_name, sell_line.buyer_name.c_str(), sizeof(data->buyer_name));
strn0cpy(data->seller_name, GetCleanName(), sizeof(data->seller_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"); 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 <red>[{}] 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) { if (seller_error) {
LogTradingDetail("Seller Error <red>[{}] Barter Sell/Buy Transaction Failed.", seller_error); LogTradingDetail("Seller Error <red>[{}] Barter Sell/Buy Transaction Failed.", seller_error);
SendBarterBuyerClientMessage(sell_line, Barter_SellerTransactionComplete, Barter_Failure, Barter_Failure); SendBarterBuyerClientMessage(sell_line, Barter_SellerTransactionComplete, Barter_Failure, Barter_Failure);

View File

@ -4044,6 +4044,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
sell_line.buyer_name = in->buyer_name; sell_line.buyer_name = in->buyer_name;
sell_line.seller_quantity = in->seller_quantity; sell_line.seller_quantity = in->seller_quantity;
sell_line.slot = in->slot; 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)); 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; uint64 total_cost = (uint64) sell_line.item_cost * (uint64) sell_line.seller_quantity;