Kelsidavis-WoWee/src/network/packet.cpp
Kelsi 43caf7b5e6 refactor: add Packet::writePackedGuid, remove redundant static methods
Add writePackedGuid() to Packet class for read/write symmetry. Remove
now-redundant UpdateObjectParser::readPackedGuid and
MovementPacket::writePackedGuid static methods. Replace 6 internal
readPackedGuid calls, 9 writePackedGuid calls, and 1 inline 14-line
transport GUID write with Packet method calls.
2026-03-25 14:06:42 -07:00

127 lines
3 KiB
C++

#include "network/packet.hpp"
#include <cstring>
#include <utility>
namespace wowee {
namespace network {
Packet::Packet(uint16_t opcode) : opcode(opcode) {}
Packet::Packet(uint16_t opcode, const std::vector<uint8_t>& data)
: opcode(opcode), data(data), readPos(0) {}
Packet::Packet(uint16_t opcode, std::vector<uint8_t>&& data)
: opcode(opcode), data(std::move(data)), readPos(0) {}
void Packet::writeUInt8(uint8_t value) {
data.push_back(value);
}
void Packet::writeUInt16(uint16_t value) {
data.push_back(value & 0xFF);
data.push_back((value >> 8) & 0xFF);
}
void Packet::writeUInt32(uint32_t value) {
data.push_back(value & 0xFF);
data.push_back((value >> 8) & 0xFF);
data.push_back((value >> 16) & 0xFF);
data.push_back((value >> 24) & 0xFF);
}
void Packet::writeUInt64(uint64_t value) {
writeUInt32(value & 0xFFFFFFFF);
writeUInt32((value >> 32) & 0xFFFFFFFF);
}
void Packet::writeFloat(float value) {
uint32_t bits = 0;
std::memcpy(&bits, &value, sizeof(float));
writeUInt32(bits);
}
void Packet::writeString(const std::string& value) {
for (char c : value) {
data.push_back(static_cast<uint8_t>(c));
}
data.push_back(0); // Null terminator
}
void Packet::writeBytes(const uint8_t* bytes, size_t length) {
data.insert(data.end(), bytes, bytes + length);
}
uint8_t Packet::readUInt8() {
if (readPos >= data.size()) return 0;
return data[readPos++];
}
uint16_t Packet::readUInt16() {
uint16_t value = 0;
value |= readUInt8();
value |= (readUInt8() << 8);
return value;
}
uint32_t Packet::readUInt32() {
uint32_t value = 0;
value |= readUInt8();
value |= (readUInt8() << 8);
value |= (readUInt8() << 16);
value |= (readUInt8() << 24);
return value;
}
uint64_t Packet::readUInt64() {
uint64_t value = readUInt32();
value |= (static_cast<uint64_t>(readUInt32()) << 32);
return value;
}
float Packet::readFloat() {
// Read as uint32 and reinterpret as float
uint32_t bits = readUInt32();
float value;
std::memcpy(&value, &bits, sizeof(float));
return value;
}
uint64_t Packet::readPackedGuid() {
uint8_t mask = readUInt8();
if (mask == 0) return 0;
uint64_t guid = 0;
for (int i = 0; i < 8; ++i) {
if (mask & (1 << i))
guid |= static_cast<uint64_t>(readUInt8()) << (i * 8);
}
return guid;
}
void Packet::writePackedGuid(uint64_t guid) {
uint8_t mask = 0;
uint8_t guidBytes[8];
int count = 0;
for (int i = 0; i < 8; ++i) {
uint8_t byte = static_cast<uint8_t>((guid >> (i * 8)) & 0xFF);
if (byte != 0) {
mask |= (1 << i);
guidBytes[count++] = byte;
}
}
writeUInt8(mask);
for (int i = 0; i < count; ++i)
writeUInt8(guidBytes[i]);
}
std::string Packet::readString() {
std::string result;
while (readPos < data.size()) {
uint8_t c = data[readPos++];
if (c == 0) break;
result += static_cast<char>(c);
}
return result;
}
} // namespace network
} // namespace wowee