aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-10-08 01:01:53 +0200
committermetamuffin <metamuffin@disroot.org>2025-10-08 01:01:53 +0200
commitfe711a11cfcfeca06c085a56f2e1d5f68a049337 (patch)
tree42d6bd6ef076b95ab86e64dda36552e45fd34a11
parent4e655f4e648b64b6f416da7183a8d555745fa163 (diff)
downloadhurrycurry-fe711a11cfcfeca06c085a56f2e1d5f68a049337.tar
hurrycurry-fe711a11cfcfeca06c085a56f2e1d5f68a049337.tar.bz2
hurrycurry-fe711a11cfcfeca06c085a56f2e1d5f68a049337.tar.zst
Unhook setting callbacks when hooking node is freed
-rw-r--r--client/gui/components/blur_setup.gd2
-rw-r--r--client/gui/menus/game.gd2
-rw-r--r--client/gui/menus/settings/dropdown_setting.gd2
-rw-r--r--client/gui/menus/settings/game_setting.gd2
-rw-r--r--client/gui/menus/settings/input/input_manager.gd2
-rw-r--r--client/gui/menus/settings/input/input_setting.gd2
-rw-r--r--client/gui/menus/settings/number_setting.gd2
-rw-r--r--client/gui/menus/settings/range_setting.gd2
-rw-r--r--client/gui/menus/settings/text_setting.gd2
-rw-r--r--client/gui/menus/settings/toggle_setting.gd2
-rw-r--r--client/gui/overlays/debug/debug.gd2
-rw-r--r--client/gui/overlays/overlays.gd2
-rw-r--r--client/map/auto_setup/environment_setup.gd6
-rw-r--r--client/map/auto_setup/light_setup.gd2
-rw-r--r--client/map/map.gd2
-rw-r--r--client/player/controllable_player.gd2
-rw-r--r--client/player/onscreen_controls/controls.gd2
-rw-r--r--client/player/player.gd2
-rw-r--r--client/system/settings.gd50
19 files changed, 52 insertions, 38 deletions
diff --git a/client/gui/components/blur_setup.gd b/client/gui/components/blur_setup.gd
index 6034aa7f..b24a94d8 100644
--- a/client/gui/components/blur_setup.gd
+++ b/client/gui/components/blur_setup.gd
@@ -18,7 +18,7 @@ class_name BlurSetup
func _ready():
update(Settings.read("graphics.ui_blur"))
- Settings.hook_changed("graphics.ui_blur", "main", update)
+ Settings.hook_changed("graphics.ui_blur", self, update)
func update(state):
material.set_shader_parameter("enable_blur", state)
diff --git a/client/gui/menus/game.gd b/client/gui/menus/game.gd
index e0ab5de7..82eff30c 100644
--- a/client/gui/menus/game.gd
+++ b/client/gui/menus/game.gd
@@ -25,7 +25,7 @@ func _ready():
get_tree().get_root().go_back_requested.connect(open_ingame_menu)
super()
transition.set_loading_text(tr("c.menu.game.connecting"))
- Settings.hook_changed_init("gameplay.first_person", "mouse_lock", func (_a): update_mouse_capture())
+ Settings.hook_changed_init("gameplay.first_person", self, func (_a): update_mouse_capture())
func _input(_event):
if Input.is_action_just_pressed("ui_menu"):
diff --git a/client/gui/menus/settings/dropdown_setting.gd b/client/gui/menus/settings/dropdown_setting.gd
index bf4c3d48..0d6f5ddc 100644
--- a/client/gui/menus/settings/dropdown_setting.gd
+++ b/client/gui/menus/settings/dropdown_setting.gd
@@ -27,7 +27,7 @@ func create_row():
row.value_node = OptionButton.new()
row.value_node.clip_text = true
for i in options: row.value_node.add_item(tr(nskey + "." + i))
- Settings.hook_changed_init(key, "preview",
+ Settings.hook_changed_init(key, row.value_node,
func(value):
if is_instance_valid(row):
row.value_node.select(options.find(value))
diff --git a/client/gui/menus/settings/game_setting.gd b/client/gui/menus/settings/game_setting.gd
index d0b38b34..07d39d98 100644
--- a/client/gui/menus/settings/game_setting.gd
+++ b/client/gui/menus/settings/game_setting.gd
@@ -35,7 +35,7 @@ func create_row():
if hide_reset(): row.hide_reset = true
else:
row.reset.connect(func(): Settings.write(key, default))
- Settings.hook_changed_init(key, "preview_reset", func (_value):
+ Settings.hook_changed_init(key, row, func (_value):
if is_instance_valid(row): row.set_reset_disabled(is_default())
)
return row
diff --git a/client/gui/menus/settings/input/input_manager.gd b/client/gui/menus/settings/input/input_manager.gd
index b0b80a39..4647659f 100644
--- a/client/gui/menus/settings/input/input_manager.gd
+++ b/client/gui/menus/settings/input/input_manager.gd
@@ -25,7 +25,7 @@ enum EventType {
func action_list() -> Array: # Array[String]
return InputMap.get_actions().filter(func isBuiltIn(k: String): return !k.begins_with("ui_")).map(func (x): return str(x))
-func update_input_map(action: String):
+func update_input_map(_value, action: String):
if not action in action_list(): return
InputMap.action_erase_events(action)
for event in Settings.read("input.%s" % action):
diff --git a/client/gui/menus/settings/input/input_setting.gd b/client/gui/menus/settings/input/input_setting.gd
index 2fb4af3d..8a494865 100644
--- a/client/gui/menus/settings/input/input_setting.gd
+++ b/client/gui/menus/settings/input/input_setting.gd
@@ -27,7 +27,7 @@ func create_row():
row.value_node = INPUT_VALUE_NODE_SCENE.instantiate()
# Manual initial update without update() since that needs to wait for _ready
row.value_node.value = Settings.read(key)
- Settings.hook_changed(key, "preview",
+ Settings.hook_changed(key, row.value_node,
func(value):
if is_instance_valid(row):
row.value_node.value = value
diff --git a/client/gui/menus/settings/number_setting.gd b/client/gui/menus/settings/number_setting.gd
index 48dd0a82..0301895c 100644
--- a/client/gui/menus/settings/number_setting.gd
+++ b/client/gui/menus/settings/number_setting.gd
@@ -32,7 +32,7 @@ func create_row():
input.max_value = max_value
input.value_changed.connect(func(value): Settings.write(key, value as int))
- Settings.hook_changed_init(key, "preview",
+ Settings.hook_changed_init(key, input,
func(v):
if is_instance_valid(input):
input.value = v
diff --git a/client/gui/menus/settings/range_setting.gd b/client/gui/menus/settings/range_setting.gd
index 2d7e88b4..89a213e0 100644
--- a/client/gui/menus/settings/range_setting.gd
+++ b/client/gui/menus/settings/range_setting.gd
@@ -35,7 +35,7 @@ func create_row():
row.value_node.max_value = max_value
row.value_node.tick_count = abs(max_value - min_value) if tick_count == null else tick_count
row.value_node.step = 0 if smooth else (1 if tick_count == null else abs(max_value - min_value) / (tick_count - 1))
- Settings.hook_changed_init(key, "preview",
+ Settings.hook_changed_init(key, row.value_node,
func(value):
if is_instance_valid(row):
row.value_node.value = value
diff --git a/client/gui/menus/settings/text_setting.gd b/client/gui/menus/settings/text_setting.gd
index de0ef218..9a873629 100644
--- a/client/gui/menus/settings/text_setting.gd
+++ b/client/gui/menus/settings/text_setting.gd
@@ -27,7 +27,7 @@ func create_row():
var input := LineEdit.new()
input.placeholder_text = placeholder
input.text_changed.connect(func(text): Settings.write(key, text))
- Settings.hook_changed_init(key, "preview",
+ Settings.hook_changed_init(key, input,
func(text):
if is_instance_valid(input):
var pos = input.caret_column
diff --git a/client/gui/menus/settings/toggle_setting.gd b/client/gui/menus/settings/toggle_setting.gd
index fa60ca74..0a9a62c1 100644
--- a/client/gui/menus/settings/toggle_setting.gd
+++ b/client/gui/menus/settings/toggle_setting.gd
@@ -23,7 +23,7 @@ func create_row():
var row = super()
row.value_node = CheckButton.new()
row.value_node.pressed.connect(func(): Settings.write(key, row.value_node.button_pressed))
- Settings.hook_changed_init(key, "preview",
+ Settings.hook_changed_init(key, row.value_node,
func(value):
if is_instance_valid(row):
row.value_node.button_pressed = value
diff --git a/client/gui/overlays/debug/debug.gd b/client/gui/overlays/debug/debug.gd
index 3a37a1b7..74175f2c 100644
--- a/client/gui/overlays/debug/debug.gd
+++ b/client/gui/overlays/debug/debug.gd
@@ -16,7 +16,7 @@
extends RichTextLabel
func _ready():
- Settings.hook_changed_init("graphics.debug_info", "main", func (v):
+ Settings.hook_changed_init("graphics.debug_info", self, func (v):
visible = v
RenderingServer.viewport_set_measure_render_time(get_viewport().get_viewport_rid(), visible)
)
diff --git a/client/gui/overlays/overlays.gd b/client/gui/overlays/overlays.gd
index 9971ea53..b7d1bb21 100644
--- a/client/gui/overlays/overlays.gd
+++ b/client/gui/overlays/overlays.gd
@@ -17,7 +17,7 @@ extends Control
class_name Overlays
func _ready():
- Settings.hook_changed_init("ui.hide_overlays", "main", func (v): visible = not v)
+ Settings.hook_changed_init("ui.hide_overlays", self, func (v): visible = not v)
func _input(_event):
if Input.is_action_just_pressed("toggle_overlay"):
diff --git a/client/map/auto_setup/environment_setup.gd b/client/map/auto_setup/environment_setup.gd
index 7b6c5c8a..2dc5ea36 100644
--- a/client/map/auto_setup/environment_setup.gd
+++ b/client/map/auto_setup/environment_setup.gd
@@ -22,9 +22,9 @@ func set_sky(sky_name: String):
environment.sky.sky_material = load("res://map/environment/presets/%s_sky.tres" % sky_name)
func _ready():
- Settings.hook_changed_init("graphics.ssao", "main", func (x): environment.ssao_enabled = x)
- Settings.hook_changed_init("graphics.gi", "main", func (x): environment.sdfgi_enabled = x == "sdfgi" and allow_sdfgi)
- Settings.hook_changed_init("graphics.glow", "main", func (x): environment.glow_enabled = x)
+ Settings.hook_changed_init("graphics.ssao", self, func (x): environment.ssao_enabled = x)
+ Settings.hook_changed_init("graphics.gi", self, func (x): environment.sdfgi_enabled = x == "sdfgi" and allow_sdfgi)
+ Settings.hook_changed_init("graphics.glow", self, func (x): environment.glow_enabled = x)
if !Global.on_vulkan():
environment.environment.tonemap_exposure = 0.5
diff --git a/client/map/auto_setup/light_setup.gd b/client/map/auto_setup/light_setup.gd
index 0d71f54b..e63a6ab9 100644
--- a/client/map/auto_setup/light_setup.gd
+++ b/client/map/auto_setup/light_setup.gd
@@ -20,7 +20,7 @@ class_name LightSetup
var shadows_enabled: bool
func _ready():
- Settings.hook_changed_init("graphics.shadows", "main", apply_settings)
+ Settings.hook_changed_init("graphics.shadows", self, apply_settings)
func set_visible_(val: bool):
if completely_disable_light_if_shadows_disabled and not shadows_enabled:
diff --git a/client/map/map.gd b/client/map/map.gd
index f6cb2f82..150520d7 100644
--- a/client/map/map.gd
+++ b/client/map/map.gd
@@ -62,7 +62,7 @@ func clear_tile(pos: Vector2i):
@onready var voxelgi: VoxelGI = $VoxelGI
func _ready():
- Settings.hook_changed("graphics.gi", "main", apply_gi_setting)
+ Settings.hook_changed("graphics.gi", self, apply_gi_setting)
floor_node.material_override = preload("res://map/tiles/floor_material.tres")
for fm in tile_factory.floor_meshers.values():
add_child(fm.mesh_instance)
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd
index 3a64743b..90c32ede 100644
--- a/client/player/controllable_player.gd
+++ b/client/player/controllable_player.gd
@@ -60,7 +60,7 @@ func _ready():
add_child(onscreen_controls)
add_child(marker)
super()
- Settings.hook_changed_init("gameplay.first_person", "hide_head", func(fps):
+ Settings.hook_changed_init("gameplay.first_person", self, func(fps):
character.head_default.visible = not fps
character.username_tag.visible = not fps
)
diff --git a/client/player/onscreen_controls/controls.gd b/client/player/onscreen_controls/controls.gd
index 3f38e7c2..a1dc3e32 100644
--- a/client/player/onscreen_controls/controls.gd
+++ b/client/player/onscreen_controls/controls.gd
@@ -24,7 +24,7 @@ extends CanvasLayer
var touch_enabled := false
func _ready():
- Settings.hook_changed_init("ui.touch_controls", "main", apply_touch)
+ Settings.hook_changed_init("ui.touch_controls", self, apply_touch)
Global.using_touch_change.connect(func f(_x): apply_touch(Settings.read("ui.touch_controls"))) # throw away useless argument
Global.hand_count_change.connect(apply_hand_count)
apply_hand_count(Global.hand_count)
diff --git a/client/player/player.gd b/client/player/player.gd
index 828a4495..18ebcc7f 100644
--- a/client/player/player.gd
+++ b/client/player/player.gd
@@ -113,7 +113,7 @@ func _ready():
clear_item_timer.timeout.connect(clear_item_message)
clear_effect_timer.timeout.connect(clear_effect)
- Settings.hook_changed_init("gameplay.usernames", "main", update_username_tag)
+ Settings.hook_changed_init("gameplay.usernames", self, update_username_tag)
func update_position(new_position: Vector2, new_rotation: float, new_boosting: bool):
position_ = new_position
diff --git a/client/system/settings.gd b/client/system/settings.gd
index e7f3e2f7..e7f718fb 100644
--- a/client/system/settings.gd
+++ b/client/system/settings.gd
@@ -115,6 +115,7 @@ static func load(path: String):
var f = FileAccess.open(path, FileAccess.READ)
changed = JSON.parse_string(f.get_as_text())
tree.load(changed)
+ setup_static_hooks()
static func save():
var changed = {}
@@ -128,11 +129,25 @@ static func trigger_hook(key: String, value):
change_hooks[key][slot].callv([value] if value != null else [])
if key.find(".") != -1: trigger_hook(key.rsplit(".", false, 1)[0], key.rsplit(".", false, 1)[1])
-static func hook_changed(key: String, slot: String, callable: Callable):
+# slot: String | Node
+static func hook_changed(key: String, slot, callable: Callable):
+ var slot_id = 0
+ if slot is Node:
+ slot_id = slot.get_instance_id()
+ slot.tree_exiting.connect(_unhook_changed.bind(key, slot_id))
+ elif slot is String:
+ slot_id = slot.hash()
+ else:
+ push_error("hook_changed called with invalid slot")
+ return
if not change_hooks.has(key): change_hooks[key] = {}
- change_hooks[key][slot] = callable
+ change_hooks[key][slot_id] = callable
+
+static func _unhook_changed(key: String, slot_id: int):
+ change_hooks[key].erase(slot_id)
-static func hook_changed_init(key: String, slot: String, callable: Callable):
+# slot: String | Node
+static func hook_changed_init(key: String, slot, callable: Callable):
hook_changed(key, slot, callable)
callable.call(read(key))
@@ -147,18 +162,20 @@ static func get_category_dict(prefix: String):
static func launch_setup():
Global.focused_menu.submenu("res://gui/menus/setup/setup.tscn")
-static var change_hooks = {
- "input": { "static": h_input },
- "graphics.aa": { "static": h_aa },
- "graphics.taa": { "static": h_taa },
- "graphics.fullscreen": { "static": h_fullscreen },
- "ui.scale_mode": { "static": h_scale_mode },
- "ui.scale_factor": { "static": h_scale_factor },
- "ui.language": { "static": h_language },
- "audio.master_volume": { "static": h_volume_master },
- "audio.music_volume": { "static": h_volume_music },
- "audio.sfx_volume": { "static": h_volume_sfx },
-}
+static var change_hooks = {}
+
+static func setup_static_hooks():
+ for action in InputManager.action_list():
+ hook_changed_init("input.%s" % action, "static", InputManager.update_input_map.bind(action))
+ hook_changed_init("graphics.aa", "static", h_aa)
+ hook_changed_init("graphics.taa", "static", h_taa)
+ hook_changed_init("graphics.fullscreen", "static", h_fullscreen)
+ hook_changed_init("ui.scale_mode", "static", h_scale_mode)
+ hook_changed_init("ui.scale_factor", "static", h_scale_factor)
+ hook_changed_init("ui.language", "static", h_language)
+ hook_changed_init("audio.master_volume", "static", h_volume_master)
+ hook_changed_init("audio.music_volume", "static", h_volume_music)
+ hook_changed_init("audio.sfx_volume", "static", h_volume_sfx)
static func h_aa(_mode):
Global.configure_viewport_aa(Global.get_viewport())
@@ -186,9 +203,6 @@ static func h_language(language: String):
if language == "system": language = OS.get_locale_language()
TranslationServer.set_locale(language)
-static func h_input(key: String):
- InputManager.update_input_map(key)
-
static func h_fullscreen(mode: String):
match mode:
"keep": pass