1 #define _GNU_SOURCE // don't worry, GNU extensions are only used when available
2 #include <dragonnet/addr.h>
7 #include "server/database.h"
8 #include "server/server.h"
9 #include "server/server_player.h"
10 #include "server/server_terrain.h"
12 DragonnetListener *server;
14 static bool on_recv(DragonnetPeer *peer, DragonnetTypeId type, __attribute__((unused)) void *pkt)
16 // this is recv thread, so we don't need lock_auth
17 return ((ServerPlayer *) peer->extra)->auth != (type == DRAGONNET_TYPE_ToServerAuth);
20 static void on_ToServerAuth(DragonnetPeer *peer, ToServerAuth *pkt)
22 if (server_player_auth(peer->extra, pkt->name))
26 // set a node on the map
27 static void on_ToServerSetnode(__attribute__((unused)) DragonnetPeer *peer, ToServerSetnode *pkt)
29 terrain_set_node(server_terrain, pkt->pos,
30 terrain_node_create(pkt->node, (Blob) {0, NULL}),
34 // update player's position
35 static void on_ToServerPosRot(DragonnetPeer *peer, ToServerPosRot *pkt)
37 ServerPlayer *player = peer->extra;
39 pthread_rwlock_wrlock(&player->lock_pos);
40 player->pos = pkt->pos;
41 player->rot = pkt->rot;
43 // this is recv thread, no lock_auth needed
44 database_update_player_pos_rot(player->name, player->pos, player->rot);
45 pthread_rwlock_unlock(&player->lock_pos);
48 // tell server map manager client requested the chunk
49 static void on_ToServerRequestChunk(DragonnetPeer *peer, ToServerRequestChunk *pkt)
51 server_terrain_requested_chunk(peer->extra, pkt->pos);
55 int main(int argc, char **argv)
57 #ifdef __GLIBC__ // check whether bloat is enabled
58 pthread_setname_np(pthread_self(), "main");
62 fprintf(stderr, "[error] missing address\n");
66 if (!(server = dragonnet_listener_new(argv[1]))) {
67 fprintf(stderr, "[error] failed to listen to connections\n");
71 char *address = dragonnet_addr_str(server->laddr);
72 printf("[info] listening on %s\n", address);
75 server->on_connect = &server_player_add;
76 server->on_disconnect = &server_player_remove;
77 server->on_recv = &on_recv;
78 server->on_recv_type[DRAGONNET_TYPE_ToServerAuth ] = (void *) &on_ToServerAuth;
79 server->on_recv_type[DRAGONNET_TYPE_ToServerSetnode ] = (void *) &on_ToServerSetnode;
80 server->on_recv_type[DRAGONNET_TYPE_ToServerPosRot ] = (void *) &on_ToServerPosRot;
81 server->on_recv_type[DRAGONNET_TYPE_ToServerRequestChunk] = (void *) &on_ToServerRequestChunk;
86 server_terrain_init();
89 server_terrain_prepare_spawn();
90 dragonnet_listener_run(server);
94 printf("[info] shutting down\n");
95 dragonnet_listener_close(server);
97 server_player_deinit();
98 server_terrain_deinit();
102 dragonnet_listener_delete(server);