]> git.localhorst.tv Git - blank.git/blobdiff - src/net/Packet.hpp
transmit chunks from server to client
[blank.git] / src / net / Packet.hpp
index bd9dd86436a68ff0c08c548b8dd8b2031aa06ee2..ba078585c0c06dae4ed5ad488b9123dfd7ecbaef 100644 (file)
@@ -5,11 +5,13 @@
 #include <ostream>
 #include <string>
 #include <SDL_net.h>
+#include <glm/glm.hpp>
 
 
 namespace blank {
 
 class Entity;
+class EntityState;
 
 struct Packet {
 
@@ -21,12 +23,20 @@ struct Packet {
                std::uint16_t seq;
                std::uint16_t ack;
                std::uint32_t hist;
+
+               // 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); }
        };
 
        struct Header {
                std::uint32_t tag;
                TControl ctrl;
                std::uint8_t type;
+               std::uint8_t reserved1;
+               std::uint8_t reserved2;
+               std::uint8_t reserved3;
        } header;
 
        static constexpr std::size_t MAX_PAYLOAD_LEN = 500 - sizeof(Header);
@@ -45,6 +55,10 @@ struct Packet {
                std::size_t length;
                std::uint8_t *data;
 
+               std::uint16_t Seq() const noexcept {
+                       return reinterpret_cast<const Packet *>(data - sizeof(Header))->header.ctrl.seq;
+               }
+
                template<class T>
                void Write(const T &, size_t off) noexcept;
                template<class T>
@@ -72,7 +86,8 @@ struct Packet {
                static constexpr std::size_t MAX_LEN = 100;
 
                void WritePlayer(const Entity &) noexcept;
-               void ReadPlayer(Entity &) const noexcept;
+               void ReadPlayerID(std::uint32_t &) const noexcept;
+               void ReadPlayerState(EntityState &) const noexcept;
                void WriteWorldName(const std::string &) noexcept;
                void ReadWorldName(std::string &) const noexcept;
        };
@@ -82,6 +97,88 @@ struct Packet {
                static constexpr std::size_t MAX_LEN = 0;
        };
 
+       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;
+       };
+
+       struct SpawnEntity : public Payload {
+               static constexpr std::uint8_t TYPE = 5;
+               static constexpr std::size_t MAX_LEN = 132;
+
+               void WriteEntity(const Entity &) noexcept;
+               void ReadEntityID(std::uint32_t &) const noexcept;
+               void ReadSkeletonID(std::uint32_t &) const noexcept;
+               void ReadEntity(Entity &) const noexcept;
+       };
+
+       struct DespawnEntity : public Payload {
+               static constexpr std::uint8_t TYPE = 6;
+               static constexpr std::size_t MAX_LEN = 4;
+
+               void WriteEntityID(std::uint32_t) noexcept;
+               void ReadEntityID(std::uint32_t &) const noexcept;
+       };
+
+       struct EntityUpdate : public Payload {
+               static constexpr std::uint8_t TYPE = 7;
+               static constexpr std::size_t MAX_LEN = 452;
+
+               static constexpr std::uint32_t MAX_ENTITIES = 7;
+               static constexpr std::size_t GetSize(std::uint32_t num) noexcept {
+                       return 4 + (num * 64);
+               }
+
+               void WriteEntityCount(std::uint32_t) noexcept;
+               void ReadEntityCount(std::uint32_t &) const noexcept;
+
+               void WriteEntity(const Entity &, std::uint32_t) noexcept;
+               void ReadEntityID(std::uint32_t &, std::uint32_t) const noexcept;
+               void ReadEntityState(EntityState &, std::uint32_t) const noexcept;
+       };
+
+       struct PlayerCorrection : public Payload {
+               static constexpr std::uint8_t TYPE = 8;
+               static constexpr std::size_t MAX_LEN = 66;
+
+               void WritePacketSeq(std::uint16_t) noexcept;
+               void ReadPacketSeq(std::uint16_t &) const noexcept;
+               void WritePlayer(const Entity &) noexcept;
+               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<class PayloadType>
        PayloadType As() {
@@ -105,7 +202,7 @@ struct Packet {
                pack.Tag();
                pack.Type(PayloadType::TYPE);
 
-               udp_pack.len = sizeof(Header) + PayloadType::TYPE;
+               udp_pack.len = sizeof(Header) + PayloadType::MAX_LEN;
 
                PayloadType result;
                result.length = PayloadType::MAX_LEN;