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.
This commit is contained in:
Kelsi 2026-03-25 14:06:42 -07:00
parent 2c79d82446
commit 43caf7b5e6
7 changed files with 36 additions and 78 deletions

View file

@ -283,12 +283,12 @@ public:
/** Read a packed GUID from the packet */
virtual uint64_t readPackedGuid(network::Packet& packet) {
return UpdateObjectParser::readPackedGuid(packet);
return packet.readPackedGuid();
}
/** Write a packed GUID to the packet */
virtual void writePackedGuid(network::Packet& packet, uint64_t guid) {
MovementPacket::writePackedGuid(packet, guid);
packet.writePackedGuid(guid);
}
};

View file

@ -449,7 +449,6 @@ struct MovementInfo {
*/
class MovementPacket {
public:
static void writePackedGuid(network::Packet& packet, uint64_t guid);
static void writeMovementPayload(network::Packet& packet, const MovementInfo& info);
/**
@ -526,14 +525,6 @@ public:
*/
static bool parse(network::Packet& packet, UpdateObjectData& data);
/**
* Read packed GUID from packet
*
* @param packet Packet to read from
* @return GUID value
*/
static uint64_t readPackedGuid(network::Packet& packet);
/**
* Parse a single update block
*

View file

@ -28,6 +28,7 @@ public:
uint64_t readUInt64();
float readFloat();
uint64_t readPackedGuid();
void writePackedGuid(uint64_t guid);
std::string readString();
uint16_t getOpcode() const { return opcode; }

View file

@ -10064,7 +10064,7 @@ void GameHandler::useEquipmentSet(uint32_t setId) {
network::Packet pkt(wire);
for (int slot = 0; slot < 19; ++slot) {
uint64_t itemGuid = es->itemGuids[slot];
MovementPacket::writePackedGuid(pkt, itemGuid);
pkt.writePackedGuid(itemGuid);
uint8_t srcBag = 0xFF;
uint8_t srcSlot = 0;
if (itemGuid != 0) {
@ -10125,7 +10125,7 @@ void GameHandler::saveEquipmentSet(const std::string& name, const std::string& i
pkt.writeString(iconName);
for (int slot = 0; slot < 19; ++slot) {
uint64_t guid = getEquipSlotGuid(slot);
MovementPacket::writePackedGuid(pkt, guid);
pkt.writePackedGuid(guid);
}
// Track pending save so SMSG_EQUIPMENT_SET_SAVED can add the new set locally
pendingSaveSetName_ = name;
@ -15562,7 +15562,7 @@ void GameHandler::handleForceSpeedChange(network::Packet& packet, const char* na
if (legacyGuidAck) {
ack.writeUInt64(playerGuid);
} else {
MovementPacket::writePackedGuid(ack, playerGuid);
ack.writePackedGuid(playerGuid);
}
ack.writeUInt32(counter);
@ -15652,7 +15652,7 @@ void GameHandler::handleForceMoveRootState(network::Packet& packet, bool rooted)
if (legacyGuidAck) {
ack.writeUInt64(playerGuid); // CMaNGOS expects full GUID for root/unroot ACKs
} else {
MovementPacket::writePackedGuid(ack, playerGuid);
ack.writePackedGuid(playerGuid);
}
ack.writeUInt32(counter);
@ -15712,7 +15712,7 @@ void GameHandler::handleForceMoveFlagChange(network::Packet& packet, const char*
if (legacyGuidAck) {
ack.writeUInt64(playerGuid);
} else {
MovementPacket::writePackedGuid(ack, playerGuid);
ack.writePackedGuid(playerGuid);
}
ack.writeUInt32(counter);
@ -15763,7 +15763,7 @@ void GameHandler::handleMoveSetCollisionHeight(network::Packet& packet) {
if (legacyGuidAck) {
ack.writeUInt64(playerGuid);
} else {
MovementPacket::writePackedGuid(ack, playerGuid);
ack.writePackedGuid(playerGuid);
}
ack.writeUInt32(counter);
@ -15815,7 +15815,7 @@ void GameHandler::handleMoveKnockBack(network::Packet& packet) {
if (legacyGuidAck) {
ack.writeUInt64(playerGuid);
} else {
MovementPacket::writePackedGuid(ack, playerGuid);
ack.writePackedGuid(playerGuid);
}
ack.writeUInt32(counter);
@ -22518,7 +22518,7 @@ void GameHandler::handleTeleportAck(network::Packet& packet) {
if (legacyGuidAck) {
ack.writeUInt64(playerGuid); // CMaNGOS/VMaNGOS expects full GUID for Classic/TBC
} else {
MovementPacket::writePackedGuid(ack, playerGuid);
ack.writePackedGuid(playerGuid);
}
ack.writeUInt32(counter);
ack.writeUInt32(moveTime);

View file

@ -2282,7 +2282,7 @@ bool TurtlePacketParsers::parseMonsterMove(network::Packet& packet, MonsterMoveD
auto looksLikeWotlkMonsterMove = [&](network::Packet& probe) -> bool {
const size_t probeStart = probe.getReadPos();
uint64_t guid = UpdateObjectParser::readPackedGuid(probe);
uint64_t guid = probe.readPackedGuid();
if (guid == 0) {
probe.setReadPos(probeStart);
return false;

View file

@ -728,23 +728,6 @@ bool PongParser::parse(network::Packet& packet, PongData& data) {
return true;
}
void MovementPacket::writePackedGuid(network::Packet& packet, uint64_t guid) {
uint8_t mask = 0;
uint8_t guidBytes[8];
int guidByteCount = 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[guidByteCount++] = byte;
}
}
packet.writeUInt8(mask);
for (int i = 0; i < guidByteCount; i++) {
packet.writeUInt8(guidBytes[i]);
}
}
void MovementPacket::writeMovementPayload(network::Packet& packet, const MovementInfo& info) {
// Movement packet format (WoW 3.3.5a) payload:
// uint32 flags
@ -772,20 +755,7 @@ void MovementPacket::writeMovementPayload(network::Packet& packet, const Movemen
// 3.3.5a ordering: transport block appears before pitch/fall/jump.
if (info.hasFlag(MovementFlags::ONTRANSPORT)) {
// Write packed transport GUID
uint8_t transMask = 0;
uint8_t transGuidBytes[8];
int transGuidByteCount = 0;
for (int i = 0; i < 8; i++) {
uint8_t byte = static_cast<uint8_t>((info.transportGuid >> (i * 8)) & 0xFF);
if (byte != 0) {
transMask |= (1 << i);
transGuidBytes[transGuidByteCount++] = byte;
}
}
packet.writeUInt8(transMask);
for (int i = 0; i < transGuidByteCount; i++) {
packet.writeUInt8(transGuidBytes[i]);
}
packet.writePackedGuid(info.transportGuid);
// Write transport local position
packet.writeFloat(info.transportX);
@ -827,7 +797,7 @@ network::Packet MovementPacket::build(Opcode opcode, const MovementInfo& info, u
// Movement packet format (WoW 3.3.5a):
// packed GUID + movement payload
writePackedGuid(packet, playerGuid);
packet.writePackedGuid(playerGuid);
writeMovementPayload(packet, info);
// Detailed hex dump for debugging
@ -856,26 +826,6 @@ network::Packet MovementPacket::build(Opcode opcode, const MovementInfo& info, u
return packet;
}
uint64_t UpdateObjectParser::readPackedGuid(network::Packet& packet) {
// Read packed GUID format:
// First byte is a mask indicating which bytes are present
uint8_t mask = packet.readUInt8();
if (mask == 0) {
return 0;
}
uint64_t guid = 0;
for (int i = 0; i < 8; ++i) {
if (mask & (1 << i)) {
uint8_t byte = packet.readUInt8();
guid |= (static_cast<uint64_t>(byte) << (i * 8));
}
}
return guid;
}
bool UpdateObjectParser::parseMovementBlock(network::Packet& packet, UpdateBlock& block) {
// WoW 3.3.5a UPDATE_OBJECT movement block structure:
// 1. UpdateFlags (1 byte, sometimes 2)
@ -950,7 +900,7 @@ bool UpdateObjectParser::parseMovementBlock(network::Packet& packet, UpdateBlock
if (moveFlags & 0x00000200) { // MOVEMENTFLAG_ONTRANSPORT
if (rem() < 1) return false;
block.onTransport = true;
block.transportGuid = readPackedGuid(packet);
block.transportGuid = packet.readPackedGuid();
if (rem() < 21) return false; // 4 floats + uint32 + uint8
block.transportX = packet.readFloat();
block.transportY = packet.readFloat();
@ -1121,7 +1071,7 @@ bool UpdateObjectParser::parseMovementBlock(network::Packet& packet, UpdateBlock
else if (updateFlags & UPDATEFLAG_POSITION) {
// Transport position update (UPDATEFLAG_POSITION = 0x0100)
if (rem() < 1) return false;
uint64_t transportGuid = readPackedGuid(packet);
uint64_t transportGuid = packet.readPackedGuid();
if (rem() < 32) return false; // 8 floats
block.x = packet.readFloat();
block.y = packet.readFloat();
@ -1164,7 +1114,7 @@ bool UpdateObjectParser::parseMovementBlock(network::Packet& packet, UpdateBlock
// Target GUID (for units with target)
if (updateFlags & UPDATEFLAG_HAS_TARGET) {
if (rem() < 1) return false;
/*uint64_t targetGuid =*/ readPackedGuid(packet);
/*uint64_t targetGuid =*/ packet.readPackedGuid();
}
// Transport time
@ -1323,7 +1273,7 @@ bool UpdateObjectParser::parseUpdateBlock(network::Packet& packet, UpdateBlock&
case UpdateType::VALUES: {
// Partial update - changed fields only
if (packet.getReadPos() >= packet.getSize()) return false;
block.guid = readPackedGuid(packet);
block.guid = packet.readPackedGuid();
LOG_DEBUG(" VALUES update for GUID: 0x", std::hex, block.guid, std::dec);
return parseUpdateFields(packet, block);
@ -1342,7 +1292,7 @@ bool UpdateObjectParser::parseUpdateBlock(network::Packet& packet, UpdateBlock&
case UpdateType::CREATE_OBJECT2: {
// Create new object with full data
if (packet.getReadPos() >= packet.getSize()) return false;
block.guid = readPackedGuid(packet);
block.guid = packet.readPackedGuid();
LOG_DEBUG(" CREATE_OBJECT for GUID: 0x", std::hex, block.guid, std::dec);
// Read object type
@ -1418,7 +1368,7 @@ bool UpdateObjectParser::parse(network::Packet& packet, UpdateObjectData& data)
}
for (uint32_t i = 0; i < count; ++i) {
uint64_t guid = readPackedGuid(packet);
uint64_t guid = packet.readPackedGuid();
data.outOfRangeGuids.push_back(guid);
LOG_DEBUG(" Out of range: 0x", std::hex, guid, std::dec);
}

View file

@ -97,6 +97,22 @@ uint64_t Packet::readPackedGuid() {
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()) {