extends Node const SAVE_PATH = "user://settings.cfg" var config = ConfigFile.new() # Базовые значения настроек по умолчанию var mouse_sensitivity: float = 1.0 var volume_sfx: float = 0.45 # Стартовая громкость на 45% func _ready() -> void: # Настраиваем синглтон так, чтобы он работал ВСЕГДА process_mode = Node.PROCESS_MODE_ALWAYS load_settings() apply_volume(volume_sfx) # === БРОНЕБОЙНЫЙ АВТОМАТИЧЕСКИЙ СИНХРОНИЗАТОР КАРТ === # Каждый раз, когда в игре меняется, перезагружается или рестартует сцена уровня (например, после смерти), # этот встроенный сигнал Godot мгновенно вызовет нашу функцию принудительной заливки настроек! get_tree().node_added.connect(_on_node_added_to_scene) # Функция, которая проверяет каждый спавнящийся узел на новой карте func _on_node_added_to_scene(node: Node) -> void: # Если на свежезагруженной карте появился узел камеры, мы СРАЗУ вшиваем в него настройки из файла if "CameraObject" in node.name or node.has_method("update_sensitivity_smooth") or "XAxisSens" in node: # Даем узлу один кадр проснуться и жестко прописываем сохраненную сенсу await get_tree().process_frame if is_instance_valid(node): node.XAxisSens = mouse_sensitivity if "YAxisSens" in node: node.YAxisSens = mouse_sensitivity print("[АВТО-КОНФИГ] Настройки чувствительности мыши успешно внедрены в новую камеру: ", mouse_sensitivity) # Если на карте спавнится музыкальный менеджер, подтягиваем громкость и туда if "MusicManager" in node.name: await get_tree().process_frame if is_instance_valid(node): var target_db = -80.0 if volume_sfx <= 0.005 else linear_to_db(volume_sfx) if "volume" in node: node.volume = volume_sfx if "volume_db" in node: node.volume_db = target_db func save_settings() -> void: config.set_value("audio", "sfx_volume", volume_sfx) config.set_value("input", "mouse_sensitivity", mouse_sensitivity) config.save(SAVE_PATH) print("[КОНФИГ] Настройки сохранены на диск!") func load_settings() -> void: var error = config.load(SAVE_PATH) if error == OK: volume_sfx = config.get_value("audio", "sfx_volume", 0.45) mouse_sensitivity = config.get_value("input", "mouse_sensitivity", 1.0) print("[КОНФИГ] Настройки успешно загружены с диска! Громкость: ", volume_sfx, " | Мышь: ", mouse_sensitivity) else: print("[КОНФИГ] Файла настроек нет, создаю новый...") save_settings() apply_volume(volume_sfx) # Функция аппаратно меняет громкость микшера Godot на шине "Master" и во всей памяти func apply_volume(value: float) -> void: volume_sfx = clamp(value, 0.0, 1.0) # Глушим все аудио-шины микшера var total_buses = AudioServer.get_bus_count() for bus_index in range(total_buses): if volume_sfx <= 0.005: AudioServer.set_bus_mute(bus_index, true) else: AudioServer.set_bus_mute(bus_index, false) var db_value = linear_to_db(volume_sfx) AudioServer.set_bus_volume_db(bus_index, db_value) # Глушим динамические бродячие звуки в оперативной памяти корня игры var target_db = -80.0 if volume_sfx <= 0.005 else linear_to_db(volume_sfx) var global_audio = [] global_audio.append_array(get_tree().get_root().find_children("*", "AudioStreamPlayer3D", true, false)) global_audio.append_array(get_tree().get_root().find_children("*", "AudioStreamPlayer", true, false)) for audio_node in global_audio: if is_instance_valid(audio_node): audio_node.volume_db = target_db # Глушим MusicManager var music_mgr = get_node_or_null("/root/MusicManager") if music_mgr: if "volume" in music_mgr: music_mgr.volume = volume_sfx if "volume_db" in music_mgr: music_mgr.volume_db = target_db for child in music_mgr.find_children("*", "AudioStreamPlayer", true, false): child.volume_db = target_db