mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-31 04:56:20 +00:00
Pass 4 - Start Trader working
This commit is contained in:
@@ -3729,13 +3729,34 @@ struct Trader_Struct {
|
||||
/*648*/ uint32 item_cost[EQ::invtype::BAZAAR_SIZE];
|
||||
};
|
||||
|
||||
struct Trader3_Struct {
|
||||
struct TraderItems_Struct {
|
||||
std::string serial_number;
|
||||
uint32 item_id;
|
||||
uint64 item_cost;
|
||||
|
||||
template<class Archive>
|
||||
void serialize(Archive &archive)
|
||||
{
|
||||
archive(
|
||||
CEREAL_NVP(serial_number),
|
||||
CEREAL_NVP(item_id),
|
||||
CEREAL_NVP(item_cost)
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
struct TraderClientMessaging_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];
|
||||
/*008*/ std::vector<TraderItems_Struct> items;
|
||||
|
||||
template<class Archive>
|
||||
void serialize(Archive &archive)
|
||||
{
|
||||
archive(
|
||||
CEREAL_NVP(action),
|
||||
CEREAL_NVP(items)
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
struct ClickTrader_Struct {
|
||||
|
||||
@@ -160,6 +160,7 @@ EQ::ItemInstance::ItemInstance(const ItemInstance& copy)
|
||||
|
||||
m_serial_number2 = copy.m_serial_number2;
|
||||
if (copy.GetSerialNumber2().empty()) {
|
||||
LogError("Creating Serial Number as part of Clone command");
|
||||
CreateSerialNumber2();
|
||||
}
|
||||
|
||||
|
||||
+28
-18
@@ -4115,27 +4115,37 @@ namespace RoF2
|
||||
break;
|
||||
}
|
||||
case ListTraderItems: {
|
||||
ENCODE_LENGTH_EXACT(Trader3_Struct);
|
||||
SETUP_DIRECT_ENCODE(Trader3_Struct, structs::ClickTrader_Struct);
|
||||
LogTrading("(RoF2) action <green>[{}]", action);
|
||||
|
||||
eq->action = structs::RoF2BazaarTraderBuyerActions::ListTraderItems;
|
||||
std::transform(
|
||||
std::begin(emu->serial_number),
|
||||
std::end(emu->serial_number),
|
||||
std::begin(eq->items),
|
||||
[&](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,
|
||||
std::begin(eq->item_cost)
|
||||
);
|
||||
EQApplicationPacket *in = *p;
|
||||
*p = nullptr;
|
||||
|
||||
FINISH_ENCODE();
|
||||
TraderClientMessaging_Struct tcm{};
|
||||
EQ::Util::MemoryStreamReader ss(reinterpret_cast<char *>(in->pBuffer), in->size);
|
||||
cereal::BinaryInputArchive ar(ss);
|
||||
{ ar(tcm); }
|
||||
|
||||
auto buffer = new char[4404]{}; //4404 is the fixed size of the packet for 200 item limit of RoF2
|
||||
auto pos = buffer;
|
||||
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, pos, structs::RoF2BazaarTraderBuyerActions::ListTraderItems);
|
||||
for (auto const &t: tcm.items) {
|
||||
strn0cpy(pos, t.serial_number.data(), t.serial_number.length() + 1);
|
||||
pos += 3600;
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, pos, t.item_cost);
|
||||
pos -= 3604 - 18;
|
||||
}
|
||||
|
||||
for (int i = tcm.items.size(); i < EQ::invtype::BAZAAR_SIZE; i++) {
|
||||
strn0cpy(pos, "0000000000000000", 18);
|
||||
pos += 18;
|
||||
}
|
||||
|
||||
safe_delete_array(in->pBuffer);
|
||||
in->pBuffer = reinterpret_cast<unsigned char *>(buffer);
|
||||
in->size = 4404;
|
||||
|
||||
dest->FastQueuePacket(&in);
|
||||
break;
|
||||
}
|
||||
case TraderAck2: {
|
||||
|
||||
Reference in New Issue
Block a user