@tool class_name GameStateOverrider extends Area3D @export var do_save: bool = true @export var cooldown: float = 30.0 @export_group("Chapter") @export_custom(PROPERTY_HINT_GROUP_ENABLE, "") var override_chapter_index: bool = true @export var chapter_override_if_higher: bool = true @export var chapter_index: int = 0 @export_group("Level") @export_custom(PROPERTY_HINT_GROUP_ENABLE, "") var override_level: bool = true @export var level_loader: LevelLoader @export_group("Spawnpoint") @export_custom(PROPERTY_HINT_GROUP_ENABLE, "") var override_spawnpoint_id: bool = true @export var spawnpoint: PlayerSpawnPoint @export_group("Player") @export_custom(PROPERTY_HINT_GROUP_ENABLE, "") var override_player: bool = true @export var use_player_transform: bool = true #@export var player_must_be_on_floor: bool = true var cooldown_timer := Timer.new() # Called when the node enters the scene tree for the first time. func _ready() -> void: if not Engine.is_editor_hint(): cooldown_timer.one_shot = true cooldown_timer.timeout.connect(_on_cooldown_timeout) add_child(cooldown_timer) body_entered.connect(_on_body_entered) func override_game_state() -> void: if not cooldown_timer.is_stopped(): return if override_chapter_index: if not chapter_override_if_higher or chapter_index > GameGlobals.game_state.chapter_index: GameGlobals.game_state.chapter_index = chapter_index if override_spawnpoint_id: GameGlobals.game_state.spawnpoint_id = spawnpoint.spawn_id if override_player: GameGlobals.game.store_player_transform() GameGlobals.game_state.use_player_transform = use_player_transform if override_level: GameGlobals.game_state.level_id = level_loader.level_id if do_save: GameGlobals.request_save() if cooldown > 0.0: cooldown_timer.start(cooldown) func _on_body_entered(body: Node3D) -> void: if body == GameGlobals.get_player(): override_game_state() func _on_cooldown_timeout() -> void: for body: Node3D in get_overlapping_bodies(): _on_body_entered(body)