7 static bool disconnect_handler(Client *client, bool good)
10 server_disconnect_client(client, DISCO_NO_SEND, NULL);
14 static bool send_map(Client *client)
16 for (size_t s = 0; s < client->server->map->sectors.siz; s++) {
17 MapSector *sector = map_get_sector_raw(client->server->map, s);
18 for (size_t b = 0; b < sector->blocks.siz; b++)
19 if (! (write_u32(client->fd, CC_BLOCK) && map_serialize_block(client->fd, map_get_block_raw(sector, b))))
25 static bool auth_handler(Client *client, bool good)
27 char *name = read_string(client->fd, NAME_MAX);
37 u8 success = list_put(&client->server->clients, name, client);
39 printf("Authentication %s: %s -> %s\n", success ? "success" : "failure", client->address, name);
43 client->state = CS_ACTIVE;
44 mapgen_start_thread(client);
49 pthread_mutex_lock(&client->mtx);
50 bool ret = write_u32(client->fd, CC_AUTH) && write_u8(client->fd, success) && (success ? send_map(client) : true);
51 pthread_mutex_unlock(&client->mtx);
56 static bool setnode_handler(Client *client, bool good)
60 if (! read_v3s32(client->fd, &pos))
65 if (! map_deserialize_node(client->fd, &node))
69 map_set_node(client->server->map, pos, node);
74 static bool kick_handler(Client *client, bool good)
76 char *target_name = read_string(client->fd, NAME_MAX);
82 Client *target = list_get(&client->server->clients, target_name);
84 server_disconnect_client(target, 0, "kicked");
91 CommandHandler command_handlers[SERVER_COMMAND_COUNT] = {
93 {&disconnect_handler, "DISCONNECT", CS_CREATED | CS_ACTIVE},
94 {&auth_handler, "AUTH", CS_CREATED},
95 {&setnode_handler, "SETNODE", CS_ACTIVE},
96 {&kick_handler, "KICK", CS_ACTIVE},