71 lines
2.0 KiB
GDScript
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)
|