X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fnet%2FPacket.hpp;h=7dede0d87d61d0cdb9e1d142fd6694350fe9d025;hb=56069d41c1553d87a8759713ef391d3a908adc0e;hp=87dececf9957f7c12ef960d59d6b0b7086ba802a;hpb=8e7e042296946ba2aed73b77ab02feb267eb17d4;p=blank.git diff --git a/src/net/Packet.hpp b/src/net/Packet.hpp index 87decec..7dede0d 100644 --- a/src/net/Packet.hpp +++ b/src/net/Packet.hpp @@ -5,10 +5,12 @@ #include #include #include +#include namespace blank { +class Block; class Entity; class EntityState; @@ -54,8 +56,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 @@ -63,8 +73,28 @@ struct Packet { template void Read(T &, size_t off) const noexcept; + void Write(const glm::quat &, size_t off) noexcept; + void Read(glm::quat &, size_t off) const noexcept; + void Write(const EntityState &, size_t off) noexcept; + void Read(EntityState &, size_t off) const noexcept; + void Write(const EntityState &, const glm::ivec3 &, size_t off) noexcept; + void Read(EntityState &, const glm::ivec3 &, size_t off) const noexcept; + void WriteString(const std::string &src, std::size_t off, std::size_t maxlen) noexcept; void ReadString(std::string &dst, std::size_t off, std::size_t maxlen) const noexcept; + + void WritePackB(const glm::ivec3 &, size_t off) noexcept; + void ReadPackB(glm::ivec3 &, size_t off) const noexcept; + + void WritePackN(float, size_t off) noexcept; + void ReadPackN(float &, size_t off) const noexcept; + void WritePackN(const glm::vec3 &, size_t off) noexcept; + void ReadPackN(glm::vec3 &, size_t off) const noexcept; + + void WritePackU(float, size_t off) noexcept; + void ReadPackU(float &, size_t off) const noexcept; + void WritePackU(const glm::vec3 &, size_t off) noexcept; + void ReadPackU(glm::vec3 &, size_t off) const noexcept; }; struct Ping : public Payload { @@ -82,7 +112,7 @@ struct Packet { struct Join : public Payload { static constexpr std::uint8_t TYPE = 2; - static constexpr std::size_t MAX_LEN = 100; + static constexpr std::size_t MAX_LEN = 78; void WritePlayer(const Entity &) noexcept; void ReadPlayerID(std::uint32_t &) const noexcept; @@ -98,19 +128,25 @@ struct Packet { struct PlayerUpdate : public Payload { static constexpr std::uint8_t TYPE = 4; - static constexpr std::size_t MAX_LEN = 64; - - void WritePlayer(const Entity &) noexcept; - void ReadPlayerState(EntityState &) const noexcept; + static constexpr std::size_t MAX_LEN = 50; + + void WritePredictedState(const EntityState &) noexcept; + void ReadPredictedState(EntityState &) const noexcept; + void WriteMovement(const glm::vec3 &) noexcept; + void ReadMovement(glm::vec3 &) const noexcept; + void WriteActions(std::uint8_t) noexcept; + void ReadActions(std::uint8_t &) const noexcept; + void WriteSlot(std::uint8_t) noexcept; + void ReadSlot(std::uint8_t &) const noexcept; }; struct SpawnEntity : public Payload { static constexpr std::uint8_t TYPE = 5; - static constexpr std::size_t MAX_LEN = 132; + static constexpr std::size_t MAX_LEN = 110; void WriteEntity(const Entity &) noexcept; void ReadEntityID(std::uint32_t &) const noexcept; - void ReadSkeletonID(std::uint32_t &) const noexcept; + void ReadModelID(std::uint32_t &) const noexcept; void ReadEntity(Entity &) const noexcept; }; @@ -124,24 +160,26 @@ struct Packet { struct EntityUpdate : public Payload { static constexpr std::uint8_t TYPE = 7; - static constexpr std::size_t MAX_LEN = 452; + static constexpr std::size_t MAX_LEN = 460; - static constexpr std::uint32_t MAX_ENTITIES = 7; + static constexpr std::uint32_t MAX_ENTITIES = 12; static constexpr std::size_t GetSize(std::uint32_t num) noexcept { - return 4 + (num * 64); + return 16 + (num * 37); } void WriteEntityCount(std::uint32_t) noexcept; void ReadEntityCount(std::uint32_t &) const noexcept; + void WriteChunkBase(const glm::ivec3 &) noexcept; + void ReadChunkBase(glm::ivec3 &) const noexcept; - void WriteEntity(const Entity &, std::uint32_t) noexcept; + void WriteEntity(const Entity &, const glm::ivec3 &, std::uint32_t) noexcept; void ReadEntityID(std::uint32_t &, std::uint32_t) const noexcept; - void ReadEntityState(EntityState &, std::uint32_t) const noexcept; + void ReadEntityState(EntityState &, const glm::ivec3 &, std::uint32_t) const noexcept; }; struct PlayerCorrection : public Payload { static constexpr std::uint8_t TYPE = 8; - static constexpr std::size_t MAX_LEN = 66; + static constexpr std::size_t MAX_LEN = 44; void WritePacketSeq(std::uint16_t) noexcept; void ReadPacketSeq(std::uint16_t &) const noexcept; @@ -149,6 +187,76 @@ 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; + + static constexpr std::size_t GetSize(std::size_t data_len) noexcept { + return data_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; + }; + + struct BlockUpdate : public Payload { + static constexpr std::uint8_t TYPE = 11; + static constexpr std::size_t MAX_LEN = 484; + + static constexpr std::uint32_t MAX_BLOCKS = 78; + static constexpr std::size_t GetSize(std::uint32_t num) noexcept { + return 16 + (num * 6); + } + + void WriteChunkCoords(const glm::ivec3 &) noexcept; + void ReadChunkCoords(glm::ivec3 &) const noexcept; + void WriteBlockCount(std::uint32_t) noexcept; + void ReadBlockCount(std::uint32_t &) const noexcept; + + void WriteIndex(std::uint16_t, std::uint32_t) noexcept; + void ReadIndex(std::uint16_t &, std::uint32_t) const noexcept; + void WriteBlock(const Block &, std::uint32_t) noexcept; + void ReadBlock(Block &, std::uint32_t) const noexcept; + }; + + struct Message : public Payload { + static constexpr std::uint8_t TYPE = 12; + static constexpr std::size_t MAX_LEN = 455; + + static constexpr std::size_t MAX_MESSAGE_LEN = 450; + static std::size_t GetSize(const std::string &msg) noexcept { + return 5 + std::min(msg.size() + 1, MAX_MESSAGE_LEN); + } + + void WriteType(std::uint8_t) noexcept; + void ReadType(std::uint8_t &) const noexcept; + void WriteReferral(std::uint32_t) noexcept; + void ReadReferral(std::uint32_t &) const noexcept; + void WriteMessage(const std::string &) noexcept; + void ReadMessage(std::string &) const noexcept; + }; + template PayloadType As() {