]> git.localhorst.tv Git - blank.git/blobdiff - src/server/net.cpp
fix Location for debug build
[blank.git] / src / server / net.cpp
index 47342ffad130b0a2edc6337797fa458eee9863ec..7947c221beb13d803a9b6c6a0c9d14a56f190e8d 100644 (file)
@@ -633,28 +633,54 @@ Server::Server(
        const WorldSave &save)
 : serv_sock(nullptr)
 , serv_pack{ -1, nullptr, 0 }
+, serv_set(SDLNet_AllocSocketSet(1))
 , clients()
 , world(world)
 , spawn_index(world.Chunks().MakeIndex(wc.spawn, 3))
 , save(save)
 , player_model(nullptr)
 , cli(world) {
+       if (!serv_set) {
+               throw NetError("SDLNet_AllocSocketSet");
+       }
+
        serv_sock = SDLNet_UDP_Open(conf.port);
        if (!serv_sock) {
+               SDLNet_FreeSocketSet(serv_set);
                throw NetError("SDLNet_UDP_Open");
        }
 
+       if (SDLNet_UDP_AddSocket(serv_set, serv_sock) == -1) {
+               SDLNet_UDP_Close(serv_sock);
+               SDLNet_FreeSocketSet(serv_set);
+               throw NetError("SDLNet_UDP_AddSocket");
+       }
+
        serv_pack.data = new Uint8[sizeof(Packet)];
        serv_pack.maxlen = sizeof(Packet);
 }
 
 Server::~Server() {
+       for (ClientConnection &client : clients) {
+               client.Disconnected();
+       }
+       clients.clear();
        world.Chunks().UnregisterIndex(spawn_index);
        delete[] serv_pack.data;
+       SDLNet_UDP_DelSocket(serv_set, serv_sock);
        SDLNet_UDP_Close(serv_sock);
+       SDLNet_FreeSocketSet(serv_set);
 }
 
 
+void Server::Wait(int dt) noexcept {
+       SDLNet_CheckSockets(serv_set, dt);
+}
+
+bool Server::Ready() noexcept {
+       return SDLNet_CheckSockets(serv_set, 0) > 0;
+}
+
 void Server::Handle() {
        int result = SDLNet_UDP_Recv(serv_sock, &serv_pack);
        while (result > 0) {