+void Packet::BlockUpdate::ReadBlockCount(uint32_t &count) const noexcept {
+ Read(count, 12);
+}
+
+void Packet::BlockUpdate::WriteIndex(uint16_t index, uint32_t num) noexcept {
+ uint32_t off = GetSize(num);
+ Write(index, off);
+}
+
+void Packet::BlockUpdate::ReadIndex(uint16_t &index, uint32_t num) const noexcept {
+ uint32_t off = GetSize(num);
+ Read(index, off);
+}
+
+void Packet::BlockUpdate::WriteBlock(const Block &block, uint32_t num) noexcept {
+ uint32_t off = GetSize(num) + 2;
+ Write(block, off);
+}
+
+void Packet::BlockUpdate::ReadBlock(Block &block, uint32_t num) const noexcept {
+ uint32_t off = GetSize(num) + 2;
+ Read(block, off);
+}
+
+void Packet::Message::WriteType(uint8_t type) noexcept {
+ Write(type, 0);
+}
+
+void Packet::Message::ReadType(uint8_t &type) const noexcept {
+ Read(type, 0);
+}
+
+void Packet::Message::WriteReferral(uint32_t ref) noexcept {
+ Write(ref, 1);
+}
+
+void Packet::Message::ReadReferral(uint32_t &ref) const noexcept {
+ Read(ref, 1);
+}
+
+void Packet::Message::WriteMessage(const string &msg) noexcept {
+ WriteString(msg, 5, MAX_MESSAGE_LEN);
+}
+
+void Packet::Message::ReadMessage(string &msg) const noexcept {
+ ReadString(msg, 5, MAX_MESSAGE_LEN);
+}
+
+
+void ConnectionHandler::Handle(const UDPpacket &udp_pack) {
+ const Packet &pack = *reinterpret_cast<const Packet *>(udp_pack.data);
+ switch (pack.Type()) {
+ case Packet::Ping::TYPE:
+ On(Packet::As<Packet::Ping>(udp_pack));
+ break;
+ case Packet::Login::TYPE:
+ On(Packet::As<Packet::Login>(udp_pack));
+ break;
+ case Packet::Join::TYPE:
+ On(Packet::As<Packet::Join>(udp_pack));
+ break;
+ case Packet::Part::TYPE:
+ On(Packet::As<Packet::Part>(udp_pack));
+ break;
+ case Packet::PlayerUpdate::TYPE:
+ On(Packet::As<Packet::PlayerUpdate>(udp_pack));
+ break;
+ case Packet::SpawnEntity::TYPE:
+ On(Packet::As<Packet::SpawnEntity>(udp_pack));
+ break;
+ case Packet::DespawnEntity::TYPE:
+ On(Packet::As<Packet::DespawnEntity>(udp_pack));
+ break;
+ case Packet::EntityUpdate::TYPE:
+ On(Packet::As<Packet::EntityUpdate>(udp_pack));
+ break;
+ case Packet::PlayerCorrection::TYPE:
+ On(Packet::As<Packet::PlayerCorrection>(udp_pack));
+ break;
+ case Packet::ChunkBegin::TYPE:
+ On(Packet::As<Packet::ChunkBegin>(udp_pack));
+ break;
+ case Packet::ChunkData::TYPE:
+ On(Packet::As<Packet::ChunkData>(udp_pack));
+ break;
+ case Packet::BlockUpdate::TYPE:
+ On(Packet::As<Packet::BlockUpdate>(udp_pack));
+ break;
+ case Packet::Message::TYPE:
+ On(Packet::As<Packet::Message>(udp_pack));
+ break;
+ default:
+ // drop unknown or unhandled packets
+ break;
+ }