2026-05-10 22:29:56 +08:00
|
|
|
extends Node
|
|
|
|
|
|
2026-05-11 13:21:51 +08:00
|
|
|
@export var marker_path := "res://leanclr/live_reload.txt"
|
|
|
|
|
@export var attached_assembly_name := ""
|
|
|
|
|
@export var reload_type_name := ""
|
|
|
|
|
@export var script_owner_path: NodePath
|
|
|
|
|
@export var reload_poll_seconds := 0.25
|
|
|
|
|
|
2026-05-10 22:29:56 +08:00
|
|
|
@onready var hot_reload_host: Node = get_node("../LiveHotReloadHost")
|
|
|
|
|
|
2026-05-11 13:21:51 +08:00
|
|
|
var _elapsed := 0.0
|
|
|
|
|
|
2026-05-10 22:29:56 +08:00
|
|
|
func _ready() -> void:
|
2026-05-11 13:21:51 +08:00
|
|
|
if hot_reload_host != null:
|
|
|
|
|
hot_reload_host.set_script_owner_path(script_owner_path)
|
|
|
|
|
reload_from_marker()
|
|
|
|
|
set_process(reload_poll_seconds > 0.0)
|
2026-05-10 22:29:56 +08:00
|
|
|
set_process_input(true)
|
|
|
|
|
|
2026-05-11 13:21:51 +08:00
|
|
|
func _process(delta: float) -> void:
|
|
|
|
|
_elapsed += delta
|
|
|
|
|
if _elapsed >= reload_poll_seconds:
|
|
|
|
|
_elapsed = 0.0
|
|
|
|
|
reload_from_marker()
|
|
|
|
|
|
2026-05-10 22:29:56 +08:00
|
|
|
func _input(event: InputEvent) -> void:
|
|
|
|
|
if hot_reload_host != null:
|
|
|
|
|
hot_reload_host.forward_input(event)
|
2026-05-11 13:21:51 +08:00
|
|
|
|
|
|
|
|
func reload_from_marker() -> void:
|
|
|
|
|
if hot_reload_host == null:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
var assembly_name := attached_assembly_name
|
|
|
|
|
if marker_path != "" and FileAccess.file_exists(marker_path):
|
|
|
|
|
assembly_name = FileAccess.get_file_as_string(marker_path).strip_edges()
|
|
|
|
|
if assembly_name == "":
|
|
|
|
|
assembly_name = attached_assembly_name
|
|
|
|
|
|
|
|
|
|
if assembly_name == "" or assembly_name == hot_reload_host.get_loaded_assembly_name():
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if assembly_name == attached_assembly_name:
|
|
|
|
|
hot_reload_host.use_attached_script(assembly_name)
|
|
|
|
|
else:
|
|
|
|
|
hot_reload_host.reload_assembly(assembly_name, reload_type_name)
|