]> git.localhorst.tv Git - blank.git/blobdiff - src/net/ClientConnection.hpp
sync entities with clients
[blank.git] / src / net / ClientConnection.hpp
index 8c5306c07945d4f80d4af15c44400d160508126e..fb6420acfed074959df27449741d3cb80cb5526c 100644 (file)
@@ -4,6 +4,7 @@
 #include "Connection.hpp"
 #include "ConnectionHandler.hpp"
 
+#include <list>
 #include <SDL_net.h>
 
 
@@ -30,15 +31,42 @@ public:
        void DetachPlayer();
        bool HasPlayer() const noexcept { return player; }
        Entity &Player() noexcept { return *player; }
+       const Entity &Player() const noexcept { return *player; }
+
+private:
+       struct SpawnStatus {
+               // the entity in question
+               Entity *const entity = nullptr;
+               // sequence number of the spawn packet or -1 after it's been ack'd
+               std::int32_t spawn_pack = -1;
+               // sequence number of the despawn packet or -1 if no despawn has been sent
+               std::int32_t despawn_pack = -1;
+
+               explicit SpawnStatus(Entity &);
+               ~SpawnStatus();
+       };
+
+private:
+       void OnPacketReceived(std::uint16_t) override;
+       void OnPacketLost(std::uint16_t) override;
 
        void On(const Packet::Login &) override;
        void On(const Packet::Part &) override;
        void On(const Packet::PlayerUpdate &) override;
 
+       bool CanSpawn(const Entity &) const noexcept;
+       bool CanDespawn(const Entity &) const noexcept;
+
+       void SendSpawn(SpawnStatus &);
+       void SendDespawn(SpawnStatus &);
+       void SendUpdate(SpawnStatus &);
+
 private:
        Server &server;
        Connection conn;
        Entity *player;
+       std::list<SpawnStatus> spawns;
+       unsigned int confirm_wait;
 
 };