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
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
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
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
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
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
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
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
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