]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/server/server.c
Improve diagnostics when invoked from incorrect path
[dragonblocks_alpha.git] / src / server / server.c
1 #include <dragonnet/addr.h>
2 #include <dragonnet/init.h>
3 #include <pthread.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <time.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"
14
15 DragonnetListener *server;
16
17 static bool on_recv(DragonnetPeer *peer, DragonnetTypeId type, __attribute__((unused)) void *pkt)
18 {
19         // this is recv thread, so we don't need lock_auth
20         return ((ServerPlayer *) peer->extra)->auth != (type == DRAGONNET_TYPE_ToServerAuth);
21 }
22
23 static void on_ToServerAuth(DragonnetPeer *peer, ToServerAuth *pkt)
24 {
25         if (server_player_auth(peer->extra, pkt->name))
26                 pkt->name = NULL;
27 }
28
29 static void on_ToServerInteract(DragonnetPeer *peer, ToServerInteract *pkt)
30 {
31         ServerPlayer *player = peer->extra;
32         pthread_mutex_lock(&player->mtx_inv);
33
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);
37
38         pthread_mutex_unlock(&player->mtx_inv);
39 }
40
41 // update player's position
42 static void on_ToServerPosRot(DragonnetPeer *peer, ToServerPosRot *pkt)
43 {
44         server_player_move(peer->extra, pkt->pos, pkt->rot);
45 }
46
47 // tell server map manager client requested the chunk
48 static void on_ToServerRequestChunk(DragonnetPeer *peer, ToServerRequestChunk *pkt)
49 {
50         server_terrain_requested_chunk(peer->extra, pkt->pos);
51 }
52
53 // server entry point
54 int main(int argc, char **argv)
55 {
56         dragonblocks_init(argc);
57
58         if (!(server = dragonnet_listener_new(argv[1]))) {
59                 fprintf(stderr, "[error] failed to listen to connections\n");
60                 return EXIT_FAILURE;
61         }
62
63         printf("[info] listening on %s\n", server->address);
64
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;
72
73         srand(time(0));
74
75         interrupt_init();
76         database_init();
77         server_terrain_init();
78         server_player_init();
79
80         server_terrain_prepare_spawn();
81         dragonnet_listener_run(server);
82
83         flag_slp(&interrupt);
84
85         printf("[info] shutting down\n");
86         dragonnet_listener_close(server);
87
88         server_player_deinit();
89         server_terrain_deinit();
90         database_deinit();
91         interrupt_deinit();
92
93         dragonnet_listener_delete(server);
94         dragonnet_deinit();
95         return EXIT_SUCCESS;
96 }