]> git.localhorst.tv Git - blank.git/blobdiff - src/net/Packet.hpp
better stability of collision response
[blank.git] / src / net / Packet.hpp
index c4a8ae350299ff111abfcd47cf5228e09679eb9e..7b9b69e447289efbd2831503f5e3ea2689ce64e4 100644 (file)
@@ -5,10 +5,12 @@
 #include <ostream>
 #include <string>
 #include <SDL_net.h>
+#include <glm/glm.hpp>
 
 
 namespace blank {
 
+class Block;
 class Entity;
 class EntityState;
 
@@ -26,7 +28,7 @@ struct Packet {
                // true if this contains an ack for given (remote) seq
                bool Acks(std::uint16_t) const noexcept;
                std::uint16_t AckBegin() const noexcept { return ack; }
-               std::uint16_t AckEnd() const noexcept { return ack + std::uint16_t(33); }
+               std::uint16_t AckEnd() const noexcept { return ack - std::uint16_t(33); }
        };
 
        struct Header {
@@ -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<const Packet *>(data - sizeof(Header));
+               }
+               const Header &GetHeader() const noexcept {
+                       return GetPacket().header;
+               }
                std::uint16_t Seq() const noexcept {
-                       return reinterpret_cast<const Packet *>(data - sizeof(Header))->header.ctrl.seq;
+                       return GetHeader().ctrl.seq;
                }
 
                template<class T>
@@ -98,10 +108,20 @@ 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 = 76;
+
+               void WritePredictedState(const EntityState &) noexcept;
+               void ReadPredictedState(EntityState &) const noexcept;
+               void WriteMovement(const glm::vec3 &) noexcept;
+               void ReadMovement(glm::vec3 &) const noexcept;
+               void WritePitch(float) noexcept;
+               void ReadPitch(float &) const noexcept;
+               void WriteYaw(float) noexcept;
+               void ReadYaw(float &) 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 {
@@ -124,11 +144,11 @@ 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 = 480;
 
                static constexpr std::uint32_t MAX_ENTITIES = 7;
                static constexpr std::size_t GetSize(std::uint32_t num) noexcept {
-                       return 4 + (num * 64);
+                       return 4 + (num * 68);
                }
 
                void WriteEntityCount(std::uint32_t) noexcept;
@@ -149,6 +169,55 @@ 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;
+       };
+
+       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;
+       };
+
 
        template<class PayloadType>
        PayloadType As() {