56 lines
2.3 KiB
GDScript
56 lines
2.3 KiB
GDScript
extends StaticBody3D
|
|||
|
|
|
||
|
|
@export_file("*.tscn") var next_scene_path: String = ""
|
||
|
|
var is_triggered: bool = false
|
||
|
|
var detect_area: Area3D = null
|
||
|
|
|
||
|
|
@export var results_screen_scene: PackedScene
|
||
|
|
|
||
|
|
func _ready() -> void:
|
||
|
|
detect_area = $DetectArea
|
||
|
|
|
||
|
|
func _physics_process(delta: float) -> void:
|
||
|
|
if is_triggered or detect_area == null:
|
||
|
|
return
|
||
|
|
|
||
|
|
var overlapping_stuff: Array = []
|
||
|
|
overlapping_stuff.append_array(detect_area.get_overlapping_bodies())
|
||
|
|
overlapping_stuff.append_array(detect_area.get_overlapping_areas())
|
||
|
|
|
||
|
|
for node in overlapping_stuff:
|
||
|
|
if node == self or node == detect_area or node is StaticBody3D or "CSG" in node.name:
|
||
|
|
continue
|
||
|
|
|
||
|
|
var is_real_player = node.name == "PlayerCharacter"
|
||
|
|
if not is_real_player and node.get_parent():
|
||
|
|
is_real_player = node.get_parent().name == "PlayerCharacter"
|
||
|
|
|
||
|
|
if is_real_player:
|
||
|
|
is_triggered = true
|
||
|
|
print("[УРОВЕНЬ] МГНОВЕННЫЙ ФИНИШ! Полностью блокирую камеру и открываю курсор...")
|
||
|
|
|
||
|
|
# Отключаем сам триггер
|
||
|
|
set_physics_process(false)
|
||
|
|
|
||
|
|
# Находим корневой узел игрока
|
||
|
|
var main_player = node if node.name == "PlayerCharacter" else node.get_parent()
|
||
|
|
|
||
|
|
# --- МГНОВЕННАЯ ЗАМОРОЗКА ИНПУТОВ КАМЕРЫ И ОРУЖИЯ ---
|
||
|
|
# Переводим игрока в режим PROCESS_MODE_DISABLED.
|
||
|
|
# Это мгновенно отключает у него функции _process, _physics_process и ВСЕ _input функции мыши!
|
||
|
|
# Камера намертво каменеет в ту же секунду, без необходимости кликать кнопками.
|
||
|
|
if main_player:
|
||
|
|
main_player.process_mode = Node.PROCESS_MODE_DISABLED
|
||
|
|
# ----------------------------------------------------
|
||
|
|
|
||
|
|
# Аппаратно освобождаем мышь для клика по кнопке "Далее"
|
||
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
||
|
|
|
||
|
|
# Спавним экран результатов в корень игры
|
||
|
|
if results_screen_scene:
|
||
|
|
var results_instance = results_screen_scene.instantiate()
|
||
|
|
get_tree().get_root().add_child(results_instance)
|
||
|
|
if results_instance.has_method("show_results"):
|
||
|
|
results_instance.show_results(next_scene_path)
|
||
|
|
return
|