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);
static constexpr std::size_t MAX_LEN = 100;
void WritePlayer(const Entity &) noexcept;
+ void ReadPlayerID(std::uint32_t &) const noexcept;
void ReadPlayer(Entity &) const noexcept;
void WriteWorldName(const std::string &) noexcept;
void ReadWorldName(std::string &) const noexcept;
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 ReadPlayer(Entity &) const noexcept;
+ };
+
+ struct SpawnEntity : public Payload {
+ static constexpr std::uint8_t TYPE = 5;
+ static constexpr std::size_t MAX_LEN = 128;
+
+ void WriteEntity(const Entity &) noexcept;
+ void ReadEntityID(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 ReadEntity(Entity &, std::uint32_t) const noexcept;
+ };
+
template<class PayloadType>
PayloadType As() {
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;