def update_player_map_data(prev_x_offset, prev_z_offset, new_x_offset, new_z_offset, player, tp_packet): curr_time = time.time() player.loading = True init_splash_screen = helpers.gen_chat_packet("Loading map...", 100) end_splash_screen = helpers.gen_chat_packet("Map loaded!", 100) init_loading_text = helpers.gen_chat_packet("Loading...", 1) end_loading_text = helpers.gen_chat_packet("", 1) use_bbu = helpers.get_extension_state(player, ('BulkBlockUpdate', 1)) player.add_packet(init_splash_screen) if helpers.get_extension_state(player, ('MessageTypes', 1)): player.add_packet(init_loading_text) fast_packets_to_send = calc_bbu_map_change_packets(prev_x_offset, prev_z_offset, new_x_offset, new_z_offset, use_bbu) for result in fast_packets_to_send: for packet in result: player.add_packet(packet) if tp_packet is not None: player.add_packet(tp_packet) if helpers.get_extension_state(player, ('MessageTypes', 1)): player.add_packet(end_loading_text) player.add_packet(end_splash_screen) player.last_teleport_time = time.time() player.loading = False print("took", time.time() - curr_time)
def update(data): delay = config.UPDATE_DELAY players = data.players ping_counter = 0 save_counter = 0 while not data.shutdown: try: if ping_counter == 5: handle_ping(players) ping_counter = 0 else: ping_counter += 1 if save_counter == 30000: map_handler.save_all_maps() maps_saved_msg = helpers.gen_chat_packet("Maps autosaved.", 0) data.chat_broadcast_queue.put((maps_saved_msg, '**autosaves')) save_counter = 0 else: save_counter += 1 handle_update_player_positions(players) handle_setblocks(data, players) handle_broadcast_chat(data, players) #send_player_packets(players) handle_player_removals(players) except Exception as e: print("bg update exception:", e) raise Exception time.sleep(delay)
def update(data): players = data.players ping_counter = 0 save_counter = 0 try: if ping_counter == 5: handle_ping(players) ping_counter = 0 else: ping_counter += 1 if save_counter == config.AUTOSAVE_INTERVAL: map_handler.save_all_maps() maps_saved_msg = helpers.gen_chat_packet("Maps autosaved.", 0) data.chat_broadcast_queue.put((maps_saved_msg, '**autosaves')) save_counter = 0 else: save_counter += 1 handle_update_player_positions(players) handle_setblocks(data, players) handle_broadcast_chat(data, players) #send_player_packets(players) handle_player_removals(players) except Exception as e: print("bg update exception:", e) raise Exception
def command_handle_tp(player, args, proto_inst): name = args[0] players_matched = get_players(name, proto_inst) if len(players_matched) > 1: players_list = '' for curr_player in players_matched: players_list += curr_player.username + " " info = helpers.handle_gen_chat_packets( r"More than 1 player matched: &6" + players_list, 0, 0) for packet in info: player.add_packet(packet) elif len(players_matched) == 1: dest_player = players_matched[0] is_long = helpers.get_extension_state(player, ('ExtEntityPositions', 1)) tp_packet = helpers.gen_pos_packet(-1, dest_player.xpos, dest_player.ypos, dest_player.zpos, dest_player.yaw, dest_player.pitch, is_long) player.add_packet(tp_packet) player.teleport_to(dest_player) if not (player.x_offset == dest_player.x_offset and player.z_offset == dest_player.z_offset): map_handler.get_player_tp_map_data(player, dest_player) player.teleport_to(dest_player) else: info = helpers.gen_chat_packet("No such player found.", 0) player.add_packet(info)
def command_handle_help(player, args, proto_inst): if (len(args) > 0): commandName = args[0] if (not commandName in commands): player.add_packet(helpers.gen_chat_packet("No such command: " + commandName, 0)) return helpString = commands[commandName][3] player.add_packet(helpers.gen_chat_packet(helpString, 0)) return player.add_packet(helpers.gen_chat_packet("--- Commands: ---", 0)) for key, value in commands.items(): helpString = value[3] player.add_packet(helpers.gen_chat_packet(helpString, 0)) player.add_packet(helpers.gen_chat_packet("---", 0))
def finish_server_handshake(proto_inst): handle_send_server_ident(proto_inst) helpers.send_map(map_handler.get_initial_map_compressed(), config.map_dims.x, config.map_dims.y, config.map_dims.z, proto_inst) handle_set_init_pos(proto_inst) if helpers.get_extension_state(proto_inst.player, ('MessageTypes', 1)): proto_inst.transport.write(helpers.gen_chat_packet('Curr pos:', 12)) handle_reconnect(proto_inst) handle_spawn_other_players(proto_inst) proto_inst.factory.data.players.append(proto_inst.player) handle_inform_player_spawn(proto_inst)
def handle_update_player_positions(players): for player in players: curr_x_pos = player.x_offset + (player.xpos // 32) - config.map_dims.x // 2 curr_z_pos = player.z_offset + (player.zpos // 32) - config.map_dims.z // 2 if helpers.get_extension_state(player, ('MessageTypes', 1)): player.add_packet( helpers.gen_chat_packet( "(" + str(curr_x_pos) + ", " + str(curr_z_pos) + ")", 11)) for curr_player in players: if player != curr_player: loc_packet = helpers.gen_relative_pos_packet( player, curr_player) curr_player.add_packet(loc_packet)
def handle_player_disconnects(proto_inst): if proto_inst.player in proto_inst.factory.data.players: proto_inst.factory.data.players.remove(proto_inst.player) proto_inst.factory.data.taken_ids.remove(proto_inst.player.get_ID()) print("player disconnected!") player_despawn_packet = helpers.gen_despawn_packet( proto_inst.player.get_ID()) disconnected_info_packet = helpers.gen_chat_packet( proto_inst.player.username + " disconnected!", 0) proto_inst.factory.data.chat_broadcast_queue.put( (disconnected_info_packet, '**disconnections')) for player in proto_inst.factory.data.players: player.add_packet(player_despawn_packet)
def command_handle_kick(player, args, proto_inst): name = args[0] reason = "" if (len(args) > 1): reason = " (" + " ".join(args[1:]) + ")" players_matched = get_players(name, proto_inst) if len(players_matched) > 1: players_list = '' for curr_player in players_matched: players_list += curr_player.username + " " info = helpers.handle_gen_chat_packets(r"More than 1 player matched: &6" + players_list, 0, 0) for packet in info: player.add_packet(packet) elif len(players_matched) == 1: helpers.disconnect_protocol(players_matched[0].proto_inst, "kicked by " + player.username + reason) else: info = helpers.gen_chat_packet("No such player found.", 0) player.add_packet(info)
def handle_command(player, commandName, args, proto_inst): if (not commandName in commands): player.add_packet(helpers.gen_chat_packet("No such command: " + commandName, 0)) return command = commands[commandName] function = command[0] argumentNum = command[1] permissionLevel = command[2] if (permissionLevel >= 1 and not player.is_op): handle_player_not_op(player) return if (len(args) < argumentNum): command_handle_help(player, [commandName], proto_inst) return # Call command function function(player, args, proto_inst)
def handle_inform_player_spawn(proto_inst): spawn_chat_packet = helpers.gen_chat_packet( proto_inst.player.username + " connected!", 0) proto_inst.factory.data.chat_broadcast_queue.put( (spawn_chat_packet, '**connections'))
def command_handle_save(player, args, proto_inst): map_handler.save_all_maps() save_info = helpers.gen_chat_packet("All maps saved!", 0) proto_inst.factory.data.chat_broadcast_queue.put((save_info, '**saves'))
def handle_player_not_op(player): info_packet = helpers.gen_chat_packet("You are not an operator!", 0) player.add_packet(info_packet)