X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fnet%2FPacket.hpp;h=ba078585c0c06dae4ed5ad488b9123dfd7ecbaef;hb=ae5a7e7d8517fac406a88e9bf98fd3d5bb1728b9;hp=bb6140d5952cef743c69fe4d2ff3365123491d7b;hpb=51a0b19601cb4b044c7eee1782aa85fc3a399d33;p=blank.git diff --git a/src/net/Packet.hpp b/src/net/Packet.hpp index bb6140d..ba07858 100644 --- a/src/net/Packet.hpp +++ b/src/net/Packet.hpp @@ -5,11 +5,13 @@ #include #include #include +#include namespace blank { class Entity; +class EntityState; struct Packet { @@ -25,7 +27,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 { @@ -53,6 +55,10 @@ struct Packet { std::size_t length; std::uint8_t *data; + std::uint16_t Seq() const noexcept { + return reinterpret_cast(data - sizeof(Header))->header.ctrl.seq; + } + template void Write(const T &, size_t off) noexcept; template @@ -81,7 +87,7 @@ struct Packet { void WritePlayer(const Entity &) noexcept; void ReadPlayerID(std::uint32_t &) const noexcept; - void ReadPlayer(Entity &) const noexcept; + void ReadPlayerState(EntityState &) const noexcept; void WriteWorldName(const std::string &) noexcept; void ReadWorldName(std::string &) const noexcept; }; @@ -96,15 +102,16 @@ struct Packet { static constexpr std::size_t MAX_LEN = 64; void WritePlayer(const Entity &) noexcept; - void ReadPlayer(Entity &) const noexcept; + void ReadPlayerState(EntityState &) const noexcept; }; struct SpawnEntity : public Payload { static constexpr std::uint8_t TYPE = 5; - static constexpr std::size_t MAX_LEN = 128; + 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; }; @@ -130,7 +137,46 @@ struct Packet { void WriteEntity(const Entity &, std::uint32_t) noexcept; void ReadEntityID(std::uint32_t &, std::uint32_t) const noexcept; - void ReadEntity(Entity &, 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; };