예제 #1
0
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)
예제 #2
0
파일: bg_threads.py 프로젝트: vexyl/PyPoc2
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)
예제 #3
0
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
예제 #4
0
파일: commands.py 프로젝트: Odd0002/PyPoc2
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)
예제 #5
0
파일: commands.py 프로젝트: vexyl/PyPoc2
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))
예제 #6
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)
예제 #7
0
파일: bg_threads.py 프로젝트: vexyl/PyPoc2
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)
예제 #8
0
파일: bg_threads.py 프로젝트: vexyl/PyPoc2
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)
예제 #9
0
파일: commands.py 프로젝트: vexyl/PyPoc2
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)
예제 #10
0
파일: commands.py 프로젝트: vexyl/PyPoc2
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)
예제 #11
0
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'))
예제 #12
0
파일: commands.py 프로젝트: Odd0002/PyPoc2
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'))
예제 #13
0
파일: commands.py 프로젝트: Odd0002/PyPoc2
def handle_player_not_op(player):
    info_packet = helpers.gen_chat_packet("You are not an operator!", 0)
    player.add_packet(info_packet)