]> git.localhorst.tv Git - blank.git/blobdiff - src/net/net.cpp
merge common parts of pre- and unload states
[blank.git] / src / net / net.cpp
index fa9c381f15d4961dbf9ae6578c101e408fe99dfd..58875e7d0a62e6f584050d67d78fdb6a9a4c73c9 100644 (file)
@@ -26,6 +26,7 @@ constexpr size_t Packet::EntityUpdate::MAX_LEN;
 constexpr size_t Packet::PlayerCorrection::MAX_LEN;
 constexpr size_t Packet::ChunkBegin::MAX_LEN;
 constexpr size_t Packet::ChunkData::MAX_LEN;
+constexpr size_t Packet::BlockUpdate::MAX_LEN;
 
 Connection::Connection(const IPaddress &addr)
 : handler(nullptr)
@@ -211,6 +212,8 @@ const char *Packet::Type2String(uint8_t t) noexcept {
                        return "ChunkBegin";
                case ChunkData::TYPE:
                        return "ChunkData";
+               case BlockUpdate::TYPE:
+                       return "BlockUpdate";
                default:
                        return "Unknown";
        }
@@ -284,14 +287,67 @@ void Packet::Join::ReadWorldName(string &name) const noexcept {
        ReadString(name, 68, 32);
 }
 
-void Packet::PlayerUpdate::WritePlayer(const Entity &player) noexcept {
-       Write(player.GetState(), 0);
+void Packet::PlayerUpdate::WritePredictedState(const EntityState &state) noexcept {
+       Write(state, 0);
 }
 
-void Packet::PlayerUpdate::ReadPlayerState(EntityState &state) const noexcept {
+void Packet::PlayerUpdate::ReadPredictedState(EntityState &state) const noexcept {
        Read(state, 0);
 }
 
+void Packet::PlayerUpdate::WriteMovement(const glm::vec3 &mov) noexcept {
+       glm::ivec3 conv = clamp(glm::ivec3(mov * 32767.0f), -32767, 32767);
+       Write(int16_t(conv.x), 64);
+       Write(int16_t(conv.y), 66);
+       Write(int16_t(conv.z), 68);
+}
+
+void Packet::PlayerUpdate::ReadMovement(glm::vec3 &mov) const noexcept {
+       int16_t x, y, z;
+       Read(x, 64);
+       Read(y, 66);
+       Read(z, 68);
+       mov = glm::vec3(x, y, z) * .00003051850947599719f;
+}
+
+void Packet::PlayerUpdate::WritePitch(float pitch) noexcept {
+       int16_t conv = pitch * 20860.12008116853786870640f;
+       Write(conv, 70);
+}
+
+void Packet::PlayerUpdate::ReadPitch(float &pitch) const noexcept {
+       int16_t conv = 0;
+       Read(conv, 70);
+       pitch = conv * .00004793836258415163f;
+}
+
+void Packet::PlayerUpdate::WriteYaw(float yaw) noexcept {
+       int16_t conv = yaw * 10430.06004058426893435320f;
+       Write(conv, 72);
+}
+
+void Packet::PlayerUpdate::ReadYaw(float &yaw) const noexcept {
+       int16_t conv = 0;
+       Read(conv, 72);
+       yaw = conv * .00009587672516830326f;
+}
+
+void Packet::PlayerUpdate::WriteActions(uint8_t actions) noexcept {
+       Write(actions, 74);
+}
+
+void Packet::PlayerUpdate::ReadActions(uint8_t &actions) const noexcept {
+       Read(actions, 74);
+}
+
+void Packet::PlayerUpdate::WriteSlot(uint8_t slot) noexcept {
+       Write(slot, 75);
+}
+
+void Packet::PlayerUpdate::ReadSlot(uint8_t &slot) const noexcept {
+       Read(slot, 75);
+}
+
 void Packet::SpawnEntity::WriteEntity(const Entity &e) noexcept {
        Write(e.ID(), 0);
        if (e.GetModel()) {
@@ -351,19 +407,19 @@ void Packet::EntityUpdate::ReadEntityCount(uint32_t &count) const noexcept {
 }
 
 void Packet::EntityUpdate::WriteEntity(const Entity &entity, uint32_t num) noexcept {
-       uint32_t off = GetSize(num);;
+       uint32_t off = GetSize(num);
 
        Write(entity.ID(), off);
        Write(entity.GetState(), off + 4);
 }
 
 void Packet::EntityUpdate::ReadEntityID(uint32_t &id, uint32_t num) const noexcept {
-       uint32_t off = GetSize(num);;
+       uint32_t off = GetSize(num);
        Read(id, off);
 }
 
 void Packet::EntityUpdate::ReadEntityState(EntityState &state, uint32_t num) const noexcept {
-       uint32_t off = GetSize(num);;
+       uint32_t off = GetSize(num);
        Read(state, off + 4);
 }
 
@@ -449,6 +505,42 @@ void Packet::ChunkData::ReadData(uint8_t *d, size_t l) const noexcept {
        memcpy(d, &data[12], len);
 }
 
+void Packet::BlockUpdate::WriteChunkCoords(const glm::ivec3 &coords) noexcept {
+       Write(coords, 0);
+}
+
+void Packet::BlockUpdate::ReadChunkCoords(glm::ivec3 &coords) const noexcept {
+       Read(coords, 0);
+}
+
+void Packet::BlockUpdate::WriteBlockCount(uint32_t count) noexcept {
+       Write(count, 12);
+}
+
+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 ConnectionHandler::Handle(const UDPpacket &udp_pack) {
        const Packet &pack = *reinterpret_cast<const Packet *>(udp_pack.data);
@@ -486,6 +578,9 @@ void ConnectionHandler::Handle(const UDPpacket &udp_pack) {
                case Packet::ChunkData::TYPE:
                        On(Packet::As<Packet::ChunkData>(udp_pack));
                        break;
+               case Packet::BlockUpdate::TYPE:
+                       On(Packet::As<Packet::BlockUpdate>(udp_pack));
+                       break;
                default:
                        // drop unknown or unhandled packets
                        break;