]> git.lizzy.rs Git - dragonblocks_alpha.git/blobdiff - src/server/server.c
refactoring
[dragonblocks_alpha.git] / src / server / server.c
index 1a84a521113e453455a8a037050b66c75020f9df..f4bfaa104918a73642fc179a7d8c7b59b78f0a65 100644 (file)
@@ -1,17 +1,19 @@
+#define _GNU_SOURCE // don't worry, GNU extensions are only used when available
+#include <dragonnet/addr.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <dragonnet/addr.h>
+#include <pthread.h>
 #include "interrupt.h"
 #include "server/database.h"
 #include "server/server.h"
-#include "server/server_map.h"
 #include "server/server_player.h"
-#include "util.h"
+#include "server/server_terrain.h"
 
 DragonnetListener *server;
 
-static bool on_recv(DragonnetPeer *peer, DragonnetTypeId type, unused void *pkt)
+static bool on_recv(DragonnetPeer *peer, DragonnetTypeId type, __attribute__((unused)) void *pkt)
 {
+       // this is recv thread, so we don't need lock_auth
        return ((ServerPlayer *) peer->extra)->auth != (type == DRAGONNET_TYPE_ToServerAuth);
 }
 
@@ -22,71 +24,78 @@ static void on_ToServerAuth(DragonnetPeer *peer, ToServerAuth *pkt)
 }
 
 // set a node on the map
-static void on_ToServerSetnode(unused DragonnetPeer *peer, ToServerSetnode *pkt)
+static void on_ToServerSetnode(__attribute__((unused)) DragonnetPeer *peer, ToServerSetnode *pkt)
 {
-       map_set_node(server_map.map, pkt->pos, map_node_create(pkt->node, (Blob) {0, NULL}), false, NULL);
+       terrain_set_node(server_terrain, pkt->pos,
+               terrain_node_create(pkt->node, (Blob) {0, NULL}),
+               false, NULL);
 }
 
 // update player's position
-static void on_ToServerPos(DragonnetPeer *peer, ToServerPos *pkt)
+static void on_ToServerPosRot(DragonnetPeer *peer, ToServerPosRot *pkt)
 {
        ServerPlayer *player = peer->extra;
 
-       pthread_rwlock_wrlock(&player->pos_lock);
+       pthread_rwlock_wrlock(&player->lock_pos);
        player->pos = pkt->pos;
-       database_update_player_pos(player->name, player->pos);
-       pthread_rwlock_unlock(&player->pos_lock);
+       player->rot = pkt->rot;
+
+       // this is recv thread, no lock_auth needed
+       database_update_player_pos_rot(player->name, player->pos, player->rot);
+       pthread_rwlock_unlock(&player->lock_pos);
 }
 
-// tell server map manager client requested the block
-static void on_ToServerRequestBlock(DragonnetPeer *peer, ToServerRequestBlock *pkt)
+// tell server map manager client requested the chunk
+static void on_ToServerRequestChunk(DragonnetPeer *peer, ToServerRequestChunk *pkt)
 {
-       server_map_requested_block(peer->extra, pkt->pos);
+       server_terrain_requested_chunk(peer->extra, pkt->pos);
 }
 
 // server entry point
 int main(int argc, char **argv)
 {
+#ifdef __GLIBC__ // check whether bloat is enabled
+       pthread_setname_np(pthread_self(), "main");
+#endif // __GLIBC__
+
        if (argc < 2) {
-               fprintf(stderr, "Missing address\n");
+               fprintf(stderr, "[error] missing address\n");
                return EXIT_FAILURE;
        }
 
-       if (! (server = dragonnet_listener_new(argv[1]))) {
-               fprintf(stderr, "Failed to listen to connections\n");
+       if (!(server = dragonnet_listener_new(argv[1]))) {
+               fprintf(stderr, "[error] failed to listen to connections\n");
                return EXIT_FAILURE;
        }
 
        char *address = dragonnet_addr_str(server->laddr);
-       printf("Listening on %s\n", address);
+       printf("[info] listening on %s\n", address);
        free(address);
 
        server->on_connect = &server_player_add;
        server->on_disconnect = &server_player_remove;
        server->on_recv = &on_recv;
-       server->on_recv_type[DRAGONNET_TYPE_ToServerAuth] =         (void *) &on_ToServerAuth;
-       server->on_recv_type[DRAGONNET_TYPE_ToServerSetnode] =      (void *) &on_ToServerSetnode;
-       server->on_recv_type[DRAGONNET_TYPE_ToServerPos] =          (void *) &on_ToServerPos;
-       server->on_recv_type[DRAGONNET_TYPE_ToServerRequestBlock] = (void *) &on_ToServerRequestBlock;
+       server->on_recv_type[DRAGONNET_TYPE_ToServerAuth        ] = (void *) &on_ToServerAuth;
+       server->on_recv_type[DRAGONNET_TYPE_ToServerSetnode     ] = (void *) &on_ToServerSetnode;
+       server->on_recv_type[DRAGONNET_TYPE_ToServerPosRot      ] = (void *) &on_ToServerPosRot;
+       server->on_recv_type[DRAGONNET_TYPE_ToServerRequestChunk] = (void *) &on_ToServerRequestChunk;
 
        interrupt_init();
-
-       if (! database_init())
+       if (!database_init())
                return EXIT_FAILURE;
-
-       server_map_init();
+       server_terrain_init();
        server_player_init();
 
-       server_map_prepare_spawn();
+       server_terrain_prepare_spawn();
        dragonnet_listener_run(server);
 
-       flag_wait(interrupt);
+       flag_slp(&interrupt);
 
-       printf("Shutting down\n");
+       printf("[info] shutting down\n");
        dragonnet_listener_close(server);
 
        server_player_deinit();
-       server_map_deinit();
+       server_terrain_deinit();
        database_deinit();
        interrupt_deinit();