diff --git a/zone/inventory.cpp b/zone/inventory.cpp index 60ab0cd33..30d19b6f0 100644 --- a/zone/inventory.cpp +++ b/zone/inventory.cpp @@ -4679,10 +4679,7 @@ bool Client::PutItemInInventoryWithStacking(EQ::ItemInstance *inst) }; std::vector queue; - auto free_id = GetInv().FindFirstFreeSlotThatFitsItem(inst->GetItem()); - auto quantity = inst->GetCharges(); // 2 - auto remaining_quantity = 0; - auto item_size = inst->GetItem()->Size; + auto quantity = inst->GetCharges(); for (int i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; i++) { auto inv_inst = GetInv().GetItem(i); diff --git a/zone/trading.cpp b/zone/trading.cpp index a7f8d3706..88fbfbd42 100644 --- a/zone/trading.cpp +++ b/zone/trading.cpp @@ -1373,8 +1373,8 @@ static void BazaarAuditTrail(const char *seller, const char *buyer, const char * void Client::BuyTraderItem(const EQApplicationPacket *app) { - auto in = reinterpret_cast(app->pBuffer); - auto trader = entity_list.GetClientByID(in->trader_id); + auto in = reinterpret_cast(app->pBuffer); + auto trader = entity_list.GetClientByID(in->trader_id); if (!trader || !trader->IsTrader()) { Message(Chat::Red, "The trader could not be found."); @@ -1408,6 +1408,12 @@ void Client::BuyTraderItem(const EQApplicationPacket *app) quantity ); + if (CheckLoreConflict(inst_copy->GetItem())) { + MessageString(Chat::Red, DUPLICATE_LORE); + TradeRequestFailed(app); + return; + } + if (in->price * quantity <= 0) { Message(Chat::Red, "Internal error. Aborting trade. Please report this to the ServerOP. Error code is 1"); trader->Message(Chat::Red, "Internal error. Aborting trade. Please report this to the ServerOP. Error code is 1"); @@ -1446,40 +1452,18 @@ void Client::BuyTraderItem(const EQApplicationPacket *app) return; } - LogTrading("Customer Paid: [{}] in Copper", total_cost); - - uint32 platinum = total_cost / 1000; - total_cost -= platinum * 1000; - uint32 gold = total_cost / 100; - total_cost -= gold * 100; - uint32 silver = total_cost / 10; - total_cost -= silver * 10; - uint32 copper = total_cost; - - LogTrading("Trader Received: [{}] Platinum, [{}] Gold, [{}] Silver, [{}] Copper", platinum, gold, silver, copper); - ReturnTraderReq(app, quantity, buy_inst->GetID()); - - if (CheckLoreConflict(buy_inst->GetItem())) { - MessageString(Chat::Red, DUPLICATE_LORE); - TradeRequestFailed(app); - return; - } - if (!trader->RemoveItemByItemUniqueId(buy_inst->GetUniqueID(), quantity)) { + AddMoneyToPP(total_cost, true); Message(Chat::Red, "The Trader no longer has the item. Please refresh the merchant window."); TradeRequestFailed(app); return; } - trader->AddMoneyToPP(copper, silver, gold, platinum, true); - - // if (buy_inst->IsStackable() && !TryStacking(buy_inst, ItemPacketTrade, false, false)) { - // MessageString(Chat::Red, HOW_CAN_YOU_BUY_MORE, trader->GetCleanName()); - // TradeRequestFailed(app); - // return; - // } + trader->AddMoneyToPP(total_cost, true); if (!PutItemInInventoryWithStacking(inst_copy.get())) { + trader->TakeMoneyFromPP(total_cost, true); + trader->PutItemInInventoryWithStacking(buy_inst); MessageString(Chat::Red, HOW_CAN_YOU_BUY_MORE, trader->GetCleanName()); TradeRequestFailed(app); return; @@ -1498,6 +1482,11 @@ void Client::BuyTraderItem(const EQApplicationPacket *app) strn0cpy(data->item_unique_id, buy_inst->GetUniqueID().data(), sizeof(data->item_unique_id)); trader->QueuePacket(trader_packet.get()); + QueuePacket(app); + + LogTrading("Customer Paid: [{}] in Copper", total_cost); + LogTrading("Trader Received: [{}] in Copper", total_cost); + if (merchant_quantity > quantity) { std::unique_ptr vendor_inst(buy_inst ? buy_inst->Clone() : nullptr); vendor_inst->SetMerchantCount(merchant_quantity - quantity);