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"
13 #include "interrupt.h"
18 DragonnetPeer *client;
21 static bool on_recv(unused DragonnetPeer *peer, DragonnetTypeId type, unused void *pkt)
23 return (client_auth.state == AUTH_WAIT) == (type == DRAGONNET_TYPE_ToClientAuth);
26 static void on_disconnect(unused DragonnetPeer *peer)
32 static void on_ToClientAuth(unused DragonnetPeer *peer, ToClientAuth *pkt)
35 client_auth.state = AUTH_SUCCESS;
36 printf("Authenticated successfully\n");
38 client_auth.state = AUTH_INIT;
39 printf("Authentication failed, please try again\n");
43 static void on_ToClientBlock(unused DragonnetPeer *peer, ToClientBlock *pkt)
45 MapBlock *block = map_get_block(client_map.map, pkt->pos, true);
47 map_deserialize_block(block, pkt->data);
48 ((MapBlockExtraData *) block->extra)->all_air = (pkt->data.siz == 0);
49 client_map_block_received(block);
52 static void on_ToClientInfo(unused DragonnetPeer *peer, ToClientInfo *pkt)
54 client_map_set_simulation_distance(pkt->simulation_distance);
58 static void on_ToClientPos(unused DragonnetPeer *peer, ToClientPos *pkt)
60 client_player_set_position(pkt->pos);
63 static void on_ToClientTimeOfDay(unused DragonnetPeer *peer, ToClientTimeOfDay *pkt)
65 set_time_of_day(pkt->time_of_day);
68 int main(int argc, char **argv)
71 fprintf(stderr, "Missing address\n");
75 if (! (client = dragonnet_connect(argv[1]))) {
76 fprintf(stderr, "Failed to connect to server\n");
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;
88 finish = flag_create();
93 dragonnet_peer_run(client);
95 if (! client_auth_init())
101 dragonnet_peer_shutdown(client);
102 client_auth_deinit();
103 client_player_deinit();
107 pthread_t recv_thread = client->recv_thread;
110 pthread_join(recv_thread, NULL);