#ifndef BLANK_CLIENT_CLIENTSTATE_HPP_
#define BLANK_CLIENT_CLIENTSTATE_HPP_
-#include "InitialState.hpp"
-#include "InteractiveState.hpp"
#include "../app/State.hpp"
-#include "../net/Client.hpp"
#include "../net/ConnectionHandler.hpp"
+#include "Client.hpp"
+#include "InitialState.hpp"
+#include "InteractiveState.hpp"
+#include "../app/Config.hpp"
+
+#include <map>
#include <memory>
public:
MasterState(
Environment &,
- const World::Config &,
- const Interface::Config &,
- const Client::Config &
+ Config &,
+ const World::Config &
);
Client &GetClient() noexcept { return client; }
Environment &GetEnv() noexcept { return env; }
+ Config &GetConfig() noexcept { return config; }
+ const Config &GetConfig() const noexcept { return config; }
+
World::Config &GetWorldConf() noexcept { return world_conf; }
const World::Config &GetWorldConf() const noexcept { return world_conf; }
- const Interface::Config &GetInterfaceConf() const noexcept { return intf_conf; }
- const Client::Config &GetClientConf() const noexcept { return client_conf; }
void Quit();
void On(const Packet::SpawnEntity &) override;
void On(const Packet::DespawnEntity &) override;
void On(const Packet::EntityUpdate &) override;
+ void On(const Packet::PlayerCorrection &) override;
+ void On(const Packet::ChunkBegin &) override;
+ void On(const Packet::ChunkData &) override;
+ void On(const Packet::BlockUpdate &) 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;
+ Config &config;
World::Config world_conf;
- const Interface::Config &intf_conf;
- const Client::Config &client_conf;
std::unique_ptr<InteractiveState> state;
Client client;
int login_packet;
+ struct UpdateStatus {
+ std::uint16_t last_packet;
+ int last_update;
+ };
+ std::map<std::uint32_t, UpdateStatus> update_status;
+ IntervalTimer update_timer;
+
};
}