3 #include <dragonnet/addr.h>
4 #include "server/database.h"
5 #include "server/server.h"
6 #include "server/server_map.h"
7 #include "server/server_player.h"
8 #include "signal_handlers.h"
11 DragonnetListener *server;
13 static bool on_recv(DragonnetPeer *peer, DragonnetTypeId type, unused void *pkt)
15 return ((ServerPlayer *) peer->extra)->auth != (type == DRAGONNET_TYPE_ToServerAuth);
18 static void on_ToServerAuth(DragonnetPeer *peer, ToServerAuth *pkt)
20 if (server_player_auth(peer->extra, pkt->name))
24 // set a node on the map
25 static void on_ToServerSetnode(unused DragonnetPeer *peer, ToServerSetnode *pkt)
27 map_set_node(server_map.map, pkt->pos, map_node_create(pkt->node, (Blob) {0, NULL}), false, NULL);
30 // update player's position
31 static void on_ToServerPos(DragonnetPeer *peer, ToServerPos *pkt)
33 ServerPlayer *player = peer->extra;
35 pthread_rwlock_wrlock(&player->pos_lock);
36 player->pos = pkt->pos;
37 database_update_player_pos(player->name, player->pos);
38 pthread_rwlock_unlock(&player->pos_lock);
41 // tell server map manager client requested the block
42 static void on_ToServerRequestBlock(DragonnetPeer *peer, ToServerRequestBlock *pkt)
44 server_map_requested_block(peer->extra, pkt->pos);
48 int main(int argc, char **argv)
51 fprintf(stderr, "Missing address\n");
55 if (! (server = dragonnet_listener_new(argv[1]))) {
56 fprintf(stderr, "Failed to listen to connections\n");
60 char *address = dragonnet_addr_str(server->laddr);
61 printf("Listening on %s\n", address);
64 server->on_connect = &server_player_add;
65 server->on_disconnect = &server_player_remove;
66 server->on_recv = &on_recv;
67 server->on_recv_type[DRAGONNET_TYPE_ToServerAuth] = (void *) &on_ToServerAuth;
68 server->on_recv_type[DRAGONNET_TYPE_ToServerSetnode] = (void *) &on_ToServerSetnode;
69 server->on_recv_type[DRAGONNET_TYPE_ToServerPos] = (void *) &on_ToServerPos;
70 server->on_recv_type[DRAGONNET_TYPE_ToServerRequestBlock] = (void *) &on_ToServerRequestBlock;
72 signal_handlers_init();
77 server_map_prepare_spawn();
78 dragonnet_listener_run(server);
83 printf("Shutting down\n");
85 dragonnet_listener_close(server);
88 server_player_deinit();
90 dragonnet_listener_delete(server);