#pragma once #include #include #include namespace wowee { namespace network { class Packet { public: Packet() = default; explicit Packet(uint16_t opcode); Packet(uint16_t opcode, const std::vector& data); Packet(uint16_t opcode, std::vector&& data); void writeUInt8(uint8_t value); void writeUInt16(uint16_t value); void writeUInt32(uint32_t value); void writeUInt64(uint64_t value); void writeFloat(float value); void writeString(const std::string& value); void writeBytes(const uint8_t* data, size_t length); uint8_t readUInt8(); uint16_t readUInt16(); uint32_t readUInt32(); uint64_t readUInt64(); float readFloat(); std::string readString(); uint16_t getOpcode() const { return opcode; } const std::vector& getData() const { return data; } size_t getReadPos() const { return readPos; } size_t getSize() const { return data.size(); } size_t getRemainingSize() const { return data.size() - readPos; } bool hasFullPackedGuid() const { if (readPos >= data.size()) return false; uint8_t mask = data[readPos]; size_t guidBytes = 1; for (int bit = 0; bit < 8; ++bit) if (mask & (1u << bit)) ++guidBytes; return getRemainingSize() >= guidBytes; } void setReadPos(size_t pos) { readPos = pos; } private: uint16_t opcode = 0; std::vector data; size_t readPos = 0; }; } // namespace network } // namespace wowee