]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/client.c
Fix problems with release build
[dragonblocks_alpha.git] / src / client / client.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include "client/client.h"
6 #include "client/client_auth.h"
7 #include "client/client_map.h"
8 #include "client/client_player.h"
9 #include "client/game.h"
10 #include "client/input.h"
11 #include "day.h"
12 #include "signal_handlers.h"
13 #include "perlin.h"
14 #include "types.h"
15 #include "util.h"
16
17 DragonnetPeer *client;
18
19 static volatile bool finished = false;
20
21 static bool on_recv(unused DragonnetPeer *peer, DragonnetTypeId type, unused void *pkt)
22 {
23         while (client_auth.state == AUTH_INIT)
24                 sched_yield();
25
26         return (client_auth.state == AUTH_WAIT) == (type == DRAGONNET_TYPE_ToClientAuth);
27 }
28
29 static void on_disconnect(unused DragonnetPeer *peer)
30 {
31         interrupted = true;
32
33         while (! finished)
34                 sched_yield();
35 }
36
37 static void on_ToClientAuth(unused DragonnetPeer *peer, ToClientAuth *pkt)
38 {
39         if (pkt->success) {
40                 client_auth.state = AUTH_SUCCESS;
41                 printf("Authenticated successfully\n");
42         } else {
43                 client_auth.state = AUTH_INIT;
44                 printf("Authentication failed, please try again\n");
45         }
46 }
47
48 static void on_ToClientBlock(unused DragonnetPeer *peer, ToClientBlock *pkt)
49 {
50         MapBlock *block = map_get_block(client_map.map, pkt->pos, true);
51
52         map_deserialize_block(block, pkt->data);
53         client_map_block_received(block);
54 }
55
56 static void on_ToClientInfo(unused DragonnetPeer *peer, ToClientInfo *pkt)
57 {
58         client_map_set_simulation_distance(pkt->simulation_distance);
59         seed = pkt->seed;
60 }
61
62 static void on_ToClientPos(unused DragonnetPeer *peer, ToClientPos *pkt)
63 {
64         client_player_set_position(pkt->pos);
65 }
66
67 static void on_ToClientTimeOfDay(unused DragonnetPeer *peer, ToClientTimeOfDay *pkt)
68 {
69         set_time_of_day(pkt->time_of_day);
70 }
71
72 int main(int argc, char **argv)
73 {
74         if (argc < 2) {
75                 fprintf(stderr, "Missing address\n");
76                 return EXIT_FAILURE;
77         }
78
79         if (! (client = dragonnet_connect(argv[1]))) {
80                 fprintf(stderr, "Failed to connect to server\n");
81                 return EXIT_FAILURE;
82         }
83
84         client->on_disconnect = &on_disconnect;
85         client->on_recv = &on_recv;
86         client->on_recv_type[DRAGONNET_TYPE_ToClientAuth     ] = (void *) &on_ToClientAuth;
87         client->on_recv_type[DRAGONNET_TYPE_ToClientBlock    ] = (void *) &on_ToClientBlock;
88         client->on_recv_type[DRAGONNET_TYPE_ToClientInfo     ] = (void *) &on_ToClientInfo;
89         client->on_recv_type[DRAGONNET_TYPE_ToClientPos      ] = (void *) &on_ToClientPos;
90         client->on_recv_type[DRAGONNET_TYPE_ToClientTimeOfDay] = (void *) &on_ToClientTimeOfDay;
91
92         signal_handlers_init();
93         client_map_init();
94         client_player_init();
95         dragonnet_peer_run(client);
96
97         if (! client_auth_init())
98                 return EXIT_FAILURE;
99
100         if (! game())
101                 return EXIT_FAILURE;
102
103         dragonnet_peer_shutdown(client);
104         client_auth_deinit();
105         client_player_deinit();
106         client_map_deinit();
107
108         pthread_t recv_thread = client->recv_thread;
109         finished = true;
110         pthread_join(recv_thread, NULL);
111
112         return EXIT_SUCCESS;
113 }