Files
CybelovZOVod/addons/system/ConfigManager.gd
T

90 lines
4.5 KiB
GDScript
Raw Normal View History

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