MagicNStuff/source/src/core/game_state_overrider.gd

71 lines
2.0 KiB
GDScript

@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)