From 08d9c2d4f6651cc22516b9bbecbc705ecabc81b5 Mon Sep 17 00:00:00 2001 From: Mitch Freeman <65987027+neckkola@users.noreply.github.com> Date: Sat, 29 Mar 2025 23:25:49 -0300 Subject: [PATCH] Pass 3 - start to update trader functionality - WIP --- common/eq_packet_structs.h | 9 +++++++++ common/patches/rof2.cpp | 21 +++++++++++++++------ common/patches/rof2_structs.h | 10 +++++----- zone/trading.cpp | 13 ++++++------- 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index cb05be8b2..dac02de2c 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -3729,6 +3729,15 @@ struct Trader_Struct { /*648*/ uint32 item_cost[EQ::invtype::BAZAAR_SIZE]; }; +struct Trader3_Struct { + /*000*/ uint32 action; + /*004*/ uint32 unknown_004; + ///*008*/ uint64 items[EQ::invtype::BAZAAR_SIZE]; + /*008*/ char serial_number[17][EQ::invtype::BAZAAR_SIZE]; + char unknown[1]{}; + /*648*/ uint32 item_cost[EQ::invtype::BAZAAR_SIZE]; +}; + struct ClickTrader_Struct { /*000*/ uint32 action; /*004*/ uint32 unknown_004; diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index c8e8eb6d6..e3aaa977d 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -4115,19 +4115,20 @@ namespace RoF2 break; } case ListTraderItems: { - ENCODE_LENGTH_EXACT(Trader_Struct); - SETUP_DIRECT_ENCODE(Trader_Struct, structs::ClickTrader_Struct); + ENCODE_LENGTH_EXACT(Trader3_Struct); + SETUP_DIRECT_ENCODE(Trader3_Struct, structs::ClickTrader_Struct); LogTrading("(RoF2) action [{}]", action); eq->action = structs::RoF2BazaarTraderBuyerActions::ListTraderItems; std::transform( - std::begin(emu->items), - std::end(emu->items), + std::begin(emu->serial_number), + std::end(emu->serial_number), std::begin(eq->items), - [&](const uint32 x) { + [&](const char* x) { return x; } ); +// std::ranges::copy(emu->serial_number, eq->items.begin(), eq->items.end()); std::copy_n( std::begin(emu->item_cost), EQ::invtype::BAZAAR_SIZE, @@ -6159,7 +6160,15 @@ namespace RoF2 emu->action = TraderOn; std::copy_n(eq->item_cost, RoF2::invtype::BAZAAR_SIZE, emu->item_cost); - std::copy_n(eq->items->serial_number, RoF2::invtype::BAZAAR_SIZE, emu->serial_number); + std::transform( + std::begin(eq->items), + std::end(eq->items), + std::begin(emu->serial_number), + [&](const structs::TraderItemSerial_Struct x) { + return std::string(x.serial_number); + }); + //std::ranges::copy(eq->items->serial_number, emu->serial_number); + //std::copy_n(eq->items->serial_number, RoF2::invtype::BAZAAR_SIZE, emu->serial_number); // std::transform( // std::begin(eq->items), // std::end(eq->items), diff --git a/common/patches/rof2_structs.h b/common/patches/rof2_structs.h index 08e953e13..92f0a1d90 100644 --- a/common/patches/rof2_structs.h +++ b/common/patches/rof2_structs.h @@ -3554,12 +3554,12 @@ struct WhoAllPlayerPart4 { }; struct TraderItemSerial_Struct { - char serial_number[16]; - uint8 unknown_018[2]; + char serial_number[17]; + uint8 unknown_018; - void operator=(uint32 a) { - auto _tmp = fmt::format("{:016}", a); - strn0cpy(this->serial_number, _tmp.c_str(), sizeof(this->serial_number)); + void operator=(const char* a) { + //auto _tmp = fmt::format("{:016}", a); + strn0cpy(this->serial_number, a, sizeof(this->serial_number)); } }; diff --git a/zone/trading.cpp b/zone/trading.cpp index 4fc6c22b4..2b902153a 100644 --- a/zone/trading.cpp +++ b/zone/trading.cpp @@ -756,19 +756,18 @@ bool Client::CheckTradeNonDroppable() void Client::TraderShowItems() { - auto outapp = new EQApplicationPacket(OP_Trader, sizeof(Trader_Struct)); - auto data = (Trader_Struct *) outapp->pBuffer; + auto outapp = new EQApplicationPacket(OP_Trader, sizeof(Trader3_Struct)); + auto data = (Trader3_Struct *) outapp->pBuffer; auto trader_items = TraderRepository::GetWhere(database, fmt::format("`char_id` = '{}'", CharacterID())); uint32 item_limit = trader_items.size() >= GetInv().GetLookup()->InventoryTypeSize.Bazaar ? GetInv().GetLookup()->InventoryTypeSize.Bazaar : trader_items.size(); //FIX - // for (int i = 0; i < item_limit; i++) { - // data->item_cost[i] = trader_items.at(i).item_cost; - // data->items[i] = ClientVersion() == EQ::versions::ClientVersion::RoF2 ? trader_items.at(i).item_sn - // : trader_items.at(i).item_id; - // } + for (int i = 0; i < item_limit; i++) { + data->item_cost[i] = trader_items.at(i).item_cost; + strn0cpy(data->serial_number[i], trader_items.at(i).item_sn.data(), sizeof(data->serial_number[i])); + } data->action = ListTraderItems;