#include "InteractiveState.hpp"
#include "../app/State.hpp"
#include "../net/Client.hpp"
-#include "../net/PacketHandler.hpp"
+#include "../net/ConnectionHandler.hpp"
+#include <map>
#include <memory>
class MasterState
: public State
-, public PacketHandler {
+, public ConnectionHandler {
public:
MasterState(
void Update(int dt) override;
void Render(Viewport &) override;
+ void OnPacketLost(std::uint16_t) override;
+ void OnTimeout() override;
+
void On(const Packet::Join &) override;
void On(const Packet::Part &) override;
+ void On(const Packet::SpawnEntity &) override;
+ void On(const Packet::DespawnEntity &) override;
+ void On(const Packet::EntityUpdate &) override;
+ void On(const Packet::PlayerCorrection &) override;
+
+private:
+ /// flag entity as updated by given packet
+ /// returns false if the update should be ignored
+ bool UpdateEntity(std::uint32_t id, std::uint16_t seq);
+ /// drop update information or given entity
+ void ClearEntity(std::uint32_t id);
private:
Environment &env;
InitialState init_state;
+ int login_packet;
+
+ struct UpdateStatus {
+ std::uint16_t last_packet;
+ int last_update;
+ };
+ std::map<std::uint32_t, UpdateStatus> update_status;
+ IntervalTimer update_timer;
+
};
}