#ifndef BLANK_SERVER_SERVER_HPP
#define BLANK_SERVER_SERVER_HPP
+#include "../app/Config.hpp"
+#include "../shared/CLI.hpp"
+#include "../world/World.hpp"
+#include "../world/WorldManipulator.hpp"
+
+#include <cstdint>
+#include <memory>
#include <list>
#include <SDL_net.h>
namespace blank {
-class World;
+class ChunkIndex;
+class CLIContext;
+class CommandService;
+class Model;
+class Player;
+class WorldSave;
namespace server {
class ClientConnection;
-class Server {
-
-public:
- struct Config {
- Uint16 port = 12354;
- };
+class Server
+: public WorldManipulator {
public:
- Server(const Config &, World &);
+ Server(const Config::Network &, World &, const World::Config &, const WorldSave &);
~Server();
+ // wait for data to arrive for at most dt milliseconds
+ void Wait(int dt) noexcept;
+ // true if there's data waiting to be handled
+ bool Ready() noexcept;
void Handle();
void Update(int dt);
UDPpacket &GetPacket() noexcept { return serv_pack; }
World &GetWorld() noexcept { return world; }
+ const WorldSave &GetWorldSave() noexcept { return save; }
+
+ void SetPlayerModel(const Model &) noexcept;
+ bool HasPlayerModel() const noexcept;
+ const Model &GetPlayerModel() const noexcept;
+
+ Player *JoinPlayer(const std::string &name);
+
+ void SetBlock(Chunk &, int, const Block &) override;
+
+ /// for use by client connections when they receive a line from the player
+ void DispatchMessage(CLIContext &, const std::string &);
+
+ /// send message to all connected clients
+ void DistributeMessage(std::uint8_t type, std::uint32_t ref, const std::string &msg);
private:
void HandlePacket(const UDPpacket &);
ClientConnection &GetClient(const IPaddress &);
+ void SendAll();
+
private:
UDPsocket serv_sock;
UDPpacket serv_pack;
+ SDLNet_SocketSet serv_set;
std::list<ClientConnection> clients;
World &world;
+ ChunkIndex &spawn_index;
+ const WorldSave &save;
+ const Model *player_model;
+
+ CLI cli;
+ std::unique_ptr<CommandService> cmd_srv;
};