class_name MountDetector #trouve le pokemon montable le plus proche du joueur. Pas de node ni d'etat : MountRider l'appelle avec ses reglages #(mount_range, max_height_diff), donc ils restent modifiables dans l'inspecteur, y compris en cours de partie. static func find_candidate(player : PlayerCharacter, mount_range : float, max_height_diff : float) -> SentPokemon: var best : SentPokemon = null var best_dist : float = mount_range for node in player.get_tree().get_nodes_in_group(SentPokemon.GROUP): var s := node as SentPokemon if s == null or s.is_queued_for_deletion() or s.rider != null: continue if !is_rideable_here(s): continue var diff : Vector3 = s.global_position - player.global_position if absf(diff.y) > max_height_diff: continue var dist : float = Vector2(diff.x, diff.z).length() if dist <= best_dist: best_dist = dist best = s return best static func is_rideable_here(s : SentPokemon) -> bool: var p : MountProfile = MountRegistry.get_profile(s.pokemon.species) if p == null: return false #sur terre : une monture terrestre, ou volante (qui pourra decoller). Une monture aquatique seule reste a quai. return p.can_use_surface(MountProfile.Surface.GROUND) or p.can_use_surface(MountProfile.Surface.AIR)