X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fnet%2FPacket.hpp;h=09db0dfd1b0ceb4c69d23eae752d58af8f55a10d;hb=38a4cffc0b6aa58e49d24c06aad7bee14cb6515d;hp=87dececf9957f7c12ef960d59d6b0b7086ba802a;hpb=8e7e042296946ba2aed73b77ab02feb267eb17d4;p=blank.git diff --git a/src/net/Packet.hpp b/src/net/Packet.hpp index 87decec..09db0df 100644 --- a/src/net/Packet.hpp +++ b/src/net/Packet.hpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace blank { @@ -54,8 +55,16 @@ struct Packet { std::size_t length; std::uint8_t *data; + /// WARNING: do not use these if the data doesn not + /// point into a real packet's payload + const Packet &GetPacket() const noexcept { + return *reinterpret_cast(data - sizeof(Header)); + } + const Header &GetHeader() const noexcept { + return GetPacket().header; + } std::uint16_t Seq() const noexcept { - return reinterpret_cast(data - sizeof(Header))->header.ctrl.seq; + return GetHeader().ctrl.seq; } template @@ -149,6 +158,35 @@ struct Packet { void ReadPlayerState(EntityState &) const noexcept; }; + struct ChunkBegin : public Payload { + static constexpr std::uint8_t TYPE = 9; + static constexpr std::size_t MAX_LEN = 24; + + void WriteTransmissionId(std::uint32_t) noexcept; + void ReadTransmissionId(std::uint32_t &) const noexcept; + void WriteFlags(std::uint32_t) noexcept; + void ReadFlags(std::uint32_t &) const noexcept; + void WriteChunkCoords(const glm::ivec3 &) noexcept; + void ReadChunkCoords(glm::ivec3 &) const noexcept; + void WriteDataSize(std::uint32_t) noexcept; + void ReadDataSize(std::uint32_t &) const noexcept; + }; + + struct ChunkData : public Payload { + static constexpr std::uint8_t TYPE = 10; + static constexpr std::size_t MAX_LEN = MAX_PAYLOAD_LEN; + static constexpr std::size_t MAX_DATA_LEN = MAX_LEN - 12; + + void WriteTransmissionId(std::uint32_t) noexcept; + void ReadTransmissionId(std::uint32_t &) const noexcept; + void WriteDataOffset(std::uint32_t) noexcept; + void ReadDataOffset(std::uint32_t &) const noexcept; + void WriteDataSize(std::uint32_t) noexcept; + void ReadDataSize(std::uint32_t &) const noexcept; + void WriteData(const std::uint8_t *, std::size_t len) noexcept; + void ReadData(std::uint8_t *, std::size_t maxlen) const noexcept; + }; + template PayloadType As() {