예제 #1
0
    def handle_movement_status(world_session, socket, reader):
        movement_fmt = '<QfffffffffI'
        try:
            transport_guid, transport_x, transport_y, transport_z, transport_o, x, y, z, o, pitch, flags = \
                unpack(movement_fmt, reader.data)

            movement_data = PacketWriter.get_packet(
                OpCode(reader.opcode),
                pack(movement_fmt, transport_guid, transport_x, transport_y,
                     transport_z, transport_o, x, y, z, o, pitch, flags))
            socket.sendall(movement_data)

            world_session.player_mgr.transport_id = transport_guid

            world_session.player_mgr.transport_x = transport_x
            world_session.player_mgr.transport_y = transport_y
            world_session.player_mgr.transport_z = transport_z
            world_session.player_mgr.transport_orientation = transport_o

            world_session.player_mgr.location.x = x
            world_session.player_mgr.location.y = y
            world_session.player_mgr.location.z = z
            world_session.player_mgr.orientation = o

            world_session.player_mgr.pitch = pitch
            world_session.player_mgr.movement_flags = flags

        except error:
            Logger.error('Error while handling %s, skipping.' %
                         OpCode(reader.opcode))

        return 0
예제 #2
0
 def get_handler_from_packet(opcode):
     try:
         opcode_name = OpCode(opcode)
         if opcode_name in HANDLER_DEFINITIONS:
             return HANDLER_DEFINITIONS.get(OpCode(opcode))
         else:
             Logger.warning('Received %s OpCode but is not handled.' % opcode_name)
     except ValueError:
         Logger.error('Received unknown OpCode (%u)' % opcode)
     return None
예제 #3
0
 def get_handler_from_packet(world_session, opcode):
     try:
         opcode_name = OpCode(opcode)
         if opcode_name in HANDLER_DEFINITIONS:
             return HANDLER_DEFINITIONS.get(OpCode(opcode)), 1
         else:
             Logger.warning('[%s] Received %s OpCode but is not handled.' %
                            (world_session.client_address[0], opcode_name))
     except ValueError:
         return None, -1
     return None, 0
예제 #4
0
 def get_handler_from_packet(world_session, opcode):
     try:
         opcode = OpCode(opcode)
         if opcode in HANDLER_DEFINITIONS:
             return HANDLER_DEFINITIONS.get(OpCode(opcode)), True
         Logger.warning(
             f'[{world_session.client_address[0]}] Received {opcode.name} OpCode but is not handled.'
         )
     except ValueError:
         # No handler, OpCode not found
         return None, False
     # No handler, but OpCode found
     return None, True
예제 #5
0
    def handle_movement_status(world_session, socket, reader):
        movement_fmt = '<QfffffffffI'

        if not world_session.player_mgr.is_teleporting and len(
                reader.data
        ) >= 48:  # Avoid handling malformed movement packets
            try:
                transport_guid, transport_x, transport_y, transport_z, transport_o, x, y, z, o, pitch, flags = \
                    unpack(movement_fmt, reader.data[:48])

                world_session.player_mgr.transport_id = transport_guid

                world_session.player_mgr.transport_x = transport_x
                world_session.player_mgr.transport_y = transport_y
                world_session.player_mgr.transport_z = transport_z
                world_session.player_mgr.transport_orientation = transport_o

                world_session.player_mgr.location.x = x
                world_session.player_mgr.location.y = y
                world_session.player_mgr.location.z = z
                world_session.player_mgr.location.o = o

                world_session.player_mgr.pitch = pitch
                world_session.player_mgr.movement_flags = flags

                movement_data = pack('<Q%us' % len(reader.data),
                                     world_session.player_mgr.guid,
                                     reader.data)

                GridManager.send_surrounding(PacketWriter.get_packet(
                    OpCode(reader.opcode), movement_data),
                                             world_session.player_mgr,
                                             include_self=False)
                GridManager.update_object(world_session.player_mgr)
                world_session.player_mgr.sync_player()

                if reader.opcode == OpCode.MSG_MOVE_JUMP and \
                        world_session.player_mgr.stand_state != StandState.UNIT_DEAD and \
                        world_session.player_mgr.stand_state != StandState.UNIT_STANDING:
                    world_session.player_mgr.stand_state = StandState.UNIT_STANDING
                    world_session.player_mgr.flagged_for_update = True

            except (AttributeError, error):
                Logger.error('Error while handling %s, skipping. Data: %s' %
                             (OpCode(reader.opcode), reader.data))

        return 0
예제 #6
0
    def handle_movement_status(world_session, socket, reader):
        # Avoid handling malformed movement packets, or handling them while no player or player teleporting
        if world_session.player_mgr and len(reader.data) >= 48:
            try:
                transport_guid, transport_x, transport_y, transport_z, transport_o, x, y, z, o, pitch, flags = \
                    unpack('<Q9fI', reader.data[:48])

                # Hacky way to prevent random teleports when colliding with elevators
                # Also acts as a rudimentary teleport cheat detection
                if not world_session.player_mgr.pending_taxi_destination and world_session.player_mgr.location.distance(
                        x=x, y=y, z=z) > 64:
                    Logger.anticheat(
                        f'Preventing coordinate desync from player {world_session.player_mgr.player.name} ({world_session.player_mgr.guid}).'
                    )
                    world_session.player_mgr.teleport(
                        world_session.player_mgr.map_,
                        world_session.player_mgr.location)

                    return 0

                # Send movement info to SpellManager until movement handling is merged to update system
                if flags & 0xF != 0:  # MoveFlags.MOVEFLAG_MOVE_MASK | MoveFlags.MOVEFLAG_STRAFE_MASK
                    world_session.player_mgr.spell_manager.flag_as_moved()

                world_session.player_mgr.transport_id = transport_guid

                world_session.player_mgr.transport.x = transport_x
                world_session.player_mgr.transport.y = transport_y
                world_session.player_mgr.transport.z = transport_z
                world_session.player_mgr.transport.o = transport_o

                world_session.player_mgr.location.x = x
                world_session.player_mgr.location.y = y
                world_session.player_mgr.location.z = z
                world_session.player_mgr.location.o = o

                world_session.player_mgr.pitch = pitch
                world_session.player_mgr.movement_flags = flags

                if flags & MoveFlags.MOVEFLAG_SPLINE_MOVER:
                    world_session.player_mgr.movement_spline = MovementManager.MovementSpline.from_bytes(
                        reader.data[48:])

                movement_data = pack(f'<Q{len(reader.data)}s',
                                     world_session.player_mgr.guid,
                                     reader.data)

                GridManager.send_surrounding(PacketWriter.get_packet(
                    OpCode(reader.opcode), movement_data),
                                             world_session.player_mgr,
                                             include_self=False)
                GridManager.update_object(world_session.player_mgr)
                world_session.player_mgr.sync_player()

                # Get up if you jump while not standing
                if reader.opcode == OpCode.MSG_MOVE_JUMP and \
                        world_session.player_mgr.stand_state != StandState.UNIT_DEAD and \
                        world_session.player_mgr.stand_state != StandState.UNIT_STANDING:
                    world_session.player_mgr.stand_state = StandState.UNIT_STANDING
                    world_session.player_mgr.set_dirty()

            except (AttributeError, error):
                Logger.error(
                    f'Error while handling {OpCode(reader.opcode).name}, skipping. Data: {reader.data}'
                )

        return 0
예제 #7
0
    def handle_movement_status(world_session, socket, reader):
        # Avoid handling malformed movement packets, or handling them while no player or player teleporting
        if world_session.player_mgr and not world_session.player_mgr.is_teleporting and len(reader.data) >= 48:
            try:
                transport_guid, transport_x, transport_y, transport_z, transport_o, x, y, z, o, pitch, flags = \
                    unpack('<Q9fI', reader.data[:48])

                # Hacky way to prevent random teleports when colliding with elevators
                # Also acts as a rudimentary teleport cheat detection
                if not world_session.player_mgr.pending_taxi_destination and world_session.player_mgr.location.distance(
                        x=x, y=y, z=z) > 64:
                    Logger.anticheat("Preventing coordinate desync from player %s (%s)." %
                                     (world_session.player_mgr.player.name, world_session.player_mgr.guid))
                    world_session.player_mgr.teleport(world_session.player_mgr.map_,
                                                      world_session.player_mgr.location)

                    return 0

                world_session.player_mgr.transport_id = transport_guid

                world_session.player_mgr.transport.x = transport_x
                world_session.player_mgr.transport.y = transport_y
                world_session.player_mgr.transport.z = transport_z
                world_session.player_mgr.transport.o = transport_o

                world_session.player_mgr.location.x = x
                world_session.player_mgr.location.y = y
                world_session.player_mgr.location.z = z
                world_session.player_mgr.location.o = o

                world_session.player_mgr.pitch = pitch
                world_session.player_mgr.movement_flags = flags

                if flags & MoveFlags.MOVEFLAG_SPLINE_MOVER:
                    world_session.player_mgr.movement_spline = MovementManager.MovementSpline.from_bytes(
                        reader.data[48:])

                movement_data = pack('<Q%us' % len(reader.data),
                                     world_session.player_mgr.guid,
                                     reader.data)

                GridManager.send_surrounding(PacketWriter.get_packet(OpCode(reader.opcode), movement_data),
                                             world_session.player_mgr, include_self=False)
                GridManager.update_object(world_session.player_mgr)
                world_session.player_mgr.sync_player()

                # Hackfix for client not sending CMSG_ATTACKSWING.
                # m_combat.m_attackSent getting stuck in true: https://i.imgur.com/LLasM8i.png
                # if reader.opcode == OpCode.MSG_MOVE_STOP or \
                #        reader.opcode == OpCode.MSG_MOVE_STOP_PITCH or \
                #        reader.opcode == OpCode.MSG_MOVE_STOP_STRAFE or \
                #        reader.opcode == OpCode.MSG_MOVE_STOP_TURN:
                #    data = pack('<2QI', world_session.player_mgr.guid, 0, 0)
                #    socket.sendall(PacketWriter.get_packet(OpCode.SMSG_ATTACKSTOP, data))

                # Get up if you jump while not standing
                if reader.opcode == OpCode.MSG_MOVE_JUMP and \
                        world_session.player_mgr.stand_state != StandState.UNIT_DEAD and \
                        world_session.player_mgr.stand_state != StandState.UNIT_STANDING:
                    world_session.player_mgr.stand_state = StandState.UNIT_STANDING
                    world_session.player_mgr.set_dirty()

            except (AttributeError, error):
                Logger.error('Error while handling %s, skipping. Data: %s' % (OpCode(reader.opcode), reader.data))

        return 0
예제 #8
0
    def handle_movement_status(world_session, socket,
                               reader: PacketReader) -> int:
        # Avoid handling malformed movement packets, or handling them while no player or player teleporting.
        if world_session.player_mgr and len(reader.data) >= 48:
            try:
                transport_guid, transport_x, transport_y, transport_z, transport_o, x, y, z, o, pitch, flags = \
                    unpack('<Q9fI', reader.data[:48])

                # Hacky way to prevent random teleports when colliding with elevators
                # Also acts as a rudimentary teleport cheat detection
                if not world_session.player_mgr.pending_taxi_destination and \
                        world_session.player_mgr.location.distance(x=x, y=y, z=z) > 64:
                    Logger.anticheat(
                        f'Preventing coordinate desync from player {world_session.player_mgr.player.name} '
                        f'({world_session.player_mgr.guid}).')
                    world_session.player_mgr.teleport(
                        world_session.player_mgr.map_,
                        world_session.player_mgr.location,
                        is_instant=True)

                    return 0

                jumped = reader.opcode == OpCode.MSG_MOVE_JUMP

                # Movement and jump actions.
                if flags & (MoveFlags.MOVEFLAG_MOVE_MASK
                            | MoveFlags.MOVEFLAG_STRAFE_MASK) or jumped:
                    # Don't mark player as moved if only jumping.
                    if not jumped:
                        world_session.player_mgr.set_has_moved(True)

                    # Cancel looting if moved.
                    if world_session.player_mgr.loot_selection:
                        world_session.player_mgr.send_loot_release(
                            world_session.player_mgr.loot_selection)
                    world_session.player_mgr.spell_manager.check_spell_interrupts(
                        moved=True)
                    world_session.player_mgr.aura_manager.check_aura_interrupts(
                        moved=True)

                # Turn actions.
                if flags & MoveFlags.MOVEFLAG_TURN_MASK:
                    world_session.player_mgr.spell_manager.check_spell_interrupts(
                        turned=True)

                world_session.player_mgr.transport_id = transport_guid

                world_session.player_mgr.transport.x = transport_x
                world_session.player_mgr.transport.y = transport_y
                world_session.player_mgr.transport.z = transport_z
                world_session.player_mgr.transport.o = transport_o

                world_session.player_mgr.location.x = x
                world_session.player_mgr.location.y = y
                world_session.player_mgr.location.z = z
                world_session.player_mgr.location.o = o

                world_session.player_mgr.pitch = pitch
                world_session.player_mgr.movement_flags = flags

                if flags & MoveFlags.MOVEFLAG_SPLINE_MOVER:
                    world_session.player_mgr.movement_spline = MovementManager.MovementSpline.from_bytes(
                        reader.data[48:])

                # Broadcast player movement to surroundings.
                movement_data = pack(f'<Q{len(reader.data)}s',
                                     world_session.player_mgr.guid,
                                     reader.data)
                movement_packet = PacketWriter.get_packet(
                    OpCode(reader.opcode), movement_data)
                MapManager.send_surrounding(movement_packet,
                                            world_session.player_mgr,
                                            include_self=False)

                # Get up if you jump while not standing.
                if jumped and world_session.player_mgr.stand_state != StandState.UNIT_DEAD and \
                        world_session.player_mgr.stand_state != StandState.UNIT_STANDING:
                    world_session.player_mgr.set_stand_state(
                        StandState.UNIT_STANDING)

            except (AttributeError, error):
                Logger.error(
                    f'Error while handling {OpCode(reader.opcode).name}, skipping. Data: {reader.data}'
                )

        return 0
예제 #9
0
    def handle_movement_status(world_session, socket, reader):
        movement_fmt = '<QfffffffffI'

        if not world_session.player_mgr.is_teleporting and len(
                reader.data
        ) >= 48:  # Avoid handling malformed movement packets
            try:
                transport_guid, transport_x, transport_y, transport_z, transport_o, x, y, z, o, pitch, flags = \
                    unpack(movement_fmt, reader.data[:48])

                # Hacky way to prevent random teleports when colliding with elevators
                # Also acts as a rudimentary teleport cheat detection
                if world_session.player_mgr.location.distance(x=x, y=y,
                                                              z=z) > 64:
                    Logger.anticheat(
                        "Preventing coordinate desync from player %s (%s)." %
                        (world_session.player_mgr.player.name,
                         world_session.player_mgr.guid))
                    world_session.player_mgr.teleport(
                        world_session.player_mgr.map_,
                        world_session.player_mgr.location)

                    return 0

                world_session.player_mgr.transport_id = transport_guid

                world_session.player_mgr.transport.x = transport_x
                world_session.player_mgr.transport.y = transport_y
                world_session.player_mgr.transport.z = transport_z
                world_session.player_mgr.transport.o = transport_o

                world_session.player_mgr.location.x = x
                world_session.player_mgr.location.y = y
                world_session.player_mgr.location.z = z
                world_session.player_mgr.location.o = o

                world_session.player_mgr.pitch = pitch
                world_session.player_mgr.movement_flags = flags

                movement_data = pack('<Q%us' % len(reader.data),
                                     world_session.player_mgr.guid,
                                     reader.data)

                GridManager.send_surrounding(PacketWriter.get_packet(
                    OpCode(reader.opcode), movement_data),
                                             world_session.player_mgr,
                                             include_self=False)
                GridManager.update_object(world_session.player_mgr)
                world_session.player_mgr.sync_player()

                if reader.opcode == OpCode.MSG_MOVE_JUMP and \
                        world_session.player_mgr.stand_state != StandState.UNIT_DEAD and \
                        world_session.player_mgr.stand_state != StandState.UNIT_STANDING:
                    world_session.player_mgr.stand_state = StandState.UNIT_STANDING
                    world_session.player_mgr.flagged_for_update = True

            except (AttributeError, error):
                Logger.error('Error while handling %s, skipping. Data: %s' %
                             (OpCode(reader.opcode), reader.data))

        return 0