X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fnet%2FPacket.hpp;h=87dececf9957f7c12ef960d59d6b0b7086ba802a;hb=8e7e042296946ba2aed73b77ab02feb267eb17d4;hp=fa35189056d3201ca982539913303e3c0a19ed92;hpb=2b31a783f1bac06c7f6d7adbe5e13e4148c7a815;p=blank.git diff --git a/src/net/Packet.hpp b/src/net/Packet.hpp index fa35189..87decec 100644 --- a/src/net/Packet.hpp +++ b/src/net/Packet.hpp @@ -10,6 +10,7 @@ namespace blank { class Entity; +class EntityState; struct Packet { @@ -21,12 +22,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 +54,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 @@ -72,7 +85,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 +96,59 @@ 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; + }; + template PayloadType As() {