1 #include <dragonnet/addr.h>
2 #include <dragonnet/init.h>
7 #include "common/init.h"
8 #include "common/interrupt.h"
9 #include "server/database.h"
10 #include "server/server.h"
11 #include "server/server_item.h"
12 #include "server/server_player.h"
13 #include "server/server_terrain.h"
15 DragonnetListener *server;
17 static bool on_recv(DragonnetPeer *peer, DragonnetTypeId type, __attribute__((unused)) void *pkt)
19 // this is recv thread, so we don't need lock_auth
20 return ((ServerPlayer *) peer->extra)->auth != (type == DRAGONNET_TYPE_ToServerAuth);
23 static void on_ToServerAuth(DragonnetPeer *peer, ToServerAuth *pkt)
25 if (server_player_auth(peer->extra, pkt->name))
29 static void on_ToServerInteract(DragonnetPeer *peer, ToServerInteract *pkt)
31 ServerPlayer *player = peer->extra;
32 pthread_mutex_lock(&player->mtx_inv);
34 ItemStack *stack = pkt->left ? &player->inventory.left : &player->inventory.right;
35 if (server_item_def[stack->type].use)
36 server_item_def[stack->type].use(player, stack, pkt->pointed, pkt->pos);
38 pthread_mutex_unlock(&player->mtx_inv);
41 // update player's position
42 static void on_ToServerPosRot(DragonnetPeer *peer, ToServerPosRot *pkt)
44 server_player_move(peer->extra, pkt->pos, pkt->rot);
47 // tell server map manager client requested the chunk
48 static void on_ToServerRequestChunk(DragonnetPeer *peer, ToServerRequestChunk *pkt)
50 server_terrain_requested_chunk(peer->extra, pkt->pos);
54 int main(int argc, char **argv)
56 dragonblocks_init(argc);
58 if (!(server = dragonnet_listener_new(argv[1]))) {
59 fprintf(stderr, "[error] failed to listen to connections\n");
63 printf("[info] listening on %s\n", server->address);
65 server->on_connect = &server_player_add;
66 server->on_disconnect = &server_player_remove;
67 server->on_recv = &on_recv;
68 server->on_recv_type[DRAGONNET_TYPE_ToServerAuth ] = (void *) &on_ToServerAuth;
69 server->on_recv_type[DRAGONNET_TYPE_ToServerInteract ] = (void *) &on_ToServerInteract;
70 server->on_recv_type[DRAGONNET_TYPE_ToServerPosRot ] = (void *) &on_ToServerPosRot;
71 server->on_recv_type[DRAGONNET_TYPE_ToServerRequestChunk] = (void *) &on_ToServerRequestChunk;
77 server_terrain_init();
80 server_terrain_prepare_spawn();
81 dragonnet_listener_run(server);
85 printf("[info] shutting down\n");
86 dragonnet_listener_close(server);
88 server_player_deinit();
89 server_terrain_deinit();
93 dragonnet_listener_delete(server);