#define BLANK_SERVER_CLIENTCONNECTION_HPP_
#include "ChunkTransmitter.hpp"
+#include "NetworkCLIFeedback.hpp"
#include "Server.hpp"
#include "../app/IntervalTimer.hpp"
#include "../ui/DirectInput.hpp"
#include "../world/EntityState.hpp"
#include "../world/Player.hpp"
+#include <cstdint>
#include <deque>
#include <list>
#include <memory>
namespace blank {
-class CompositeModel;
+class Model;
namespace server {
Connection &GetConnection() noexcept { return conn; }
bool Disconnected() const noexcept { return conn.Closed(); }
+ Server &GetServer() noexcept { return server; }
+
/// prepare a packet of given type
template<class Type>
Type Prepare() const noexcept {
}
/// send the previously prepared packet
std::uint16_t Send();
- /// send the previously prepared packet of non-default length
+ /// send the previously prepared packet of given payload length
std::uint16_t Send(std::size_t len);
void AttachPlayer(Player &);
ChunkIndex &PlayerChunks() noexcept { return input->GetPlayer().GetChunks(); }
const ChunkIndex &PlayerChunks() const noexcept { return input->GetPlayer().GetChunks(); }
- void SetPlayerModel(const CompositeModel &) noexcept;
+ void SetPlayerModel(const Model &) noexcept;
bool HasPlayerModel() const noexcept;
- const CompositeModel &GetPlayerModel() const noexcept;
+ const Model &GetPlayerModel() const noexcept;
bool ChunkInRange(const glm::ivec3 &) const noexcept;
+ std::uint16_t SendMessage(std::uint8_t type, std::uint32_t from, const std::string &msg);
+
private:
struct SpawnStatus {
// the entity in question
void On(const Packet::Login &) override;
void On(const Packet::Part &) override;
void On(const Packet::PlayerUpdate &) override;
+ void On(const Packet::ChunkBegin &) override;
+ void On(const Packet::Message &) override;
+ void CheckEntities();
bool CanSpawn(const Entity &) const noexcept;
bool CanDespawn(const Entity &) const noexcept;
void SendSpawn(SpawnStatus &);
void SendDespawn(SpawnStatus &);
+ /// true if entity updates are pushed to the client this frame
+ bool SendingUpdates() const noexcept;
void QueueUpdate(SpawnStatus &);
void SendUpdates();
Server &server;
Connection conn;
std::unique_ptr<DirectInput> input;
- const CompositeModel *player_model;
+ std::unique_ptr<NetworkCLIFeedback> cli_ctx;
+ const Model *player_model;
std::list<SpawnStatus> spawns;
unsigned int confirm_wait;
std::vector<SpawnStatus *> entity_updates;
+ unsigned int entity_updates_skipped;
EntityState player_update_state;
std::uint16_t player_update_pack;
- IntervalTimer player_update_timer;
+ CoarseTimer player_update_timer;
std::uint8_t old_actions;
ChunkTransmitter transmitter;
std::deque<glm::ivec3> chunk_queue;
glm::ivec3 old_base;
+ unsigned int chunk_blocks_skipped;
};