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