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"
12 #include "signal_handlers.h"
17 DragonnetPeer *client;
19 static volatile bool finished = false;
21 static bool on_recv(unused DragonnetPeer *peer, DragonnetTypeId type, unused void *pkt)
23 while (client_auth.state == AUTH_INIT)
26 return (client_auth.state == AUTH_WAIT) == (type == DRAGONNET_TYPE_ToClientAuth);
29 static void on_disconnect(unused DragonnetPeer *peer)
37 static void on_ToClientAuth(unused DragonnetPeer *peer, ToClientAuth *pkt)
40 client_auth.state = AUTH_SUCCESS;
41 printf("Authenticated successfully\n");
43 client_auth.state = AUTH_INIT;
44 printf("Authentication failed, please try again\n");
48 static void on_ToClientBlock(unused DragonnetPeer *peer, ToClientBlock *pkt)
50 MapBlock *block = map_get_block(client_map.map, pkt->pos, true);
52 map_deserialize_block(block, pkt->data);
53 client_map_block_received(block);
56 static void on_ToClientInfo(unused DragonnetPeer *peer, ToClientInfo *pkt)
58 client_map_set_simulation_distance(pkt->simulation_distance);
62 static void on_ToClientPos(unused DragonnetPeer *peer, ToClientPos *pkt)
64 client_player_set_position(pkt->pos);
67 static void on_ToClientTimeOfDay(unused DragonnetPeer *peer, ToClientTimeOfDay *pkt)
69 set_time_of_day(pkt->time_of_day);
72 int main(int argc, char **argv)
75 fprintf(stderr, "Missing address\n");
79 if (! (client = dragonnet_connect(argv[1]))) {
80 fprintf(stderr, "Failed to connect to server\n");
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;
92 signal_handlers_init();
95 dragonnet_peer_run(client);
97 if (! client_auth_init())
103 dragonnet_peer_shutdown(client);
104 client_auth_deinit();
105 client_player_deinit();
108 pthread_t recv_thread = client->recv_thread;
110 pthread_join(recv_thread, NULL);