extends Node3D var toggle = true var interactable = true var wait: bool = false @export var animation_player: AnimationPlayer @onready var Player: Node3D = get_tree().get_first_node_in_group("player") @onready var player_ray: Node3D = get_tree().get_first_node_in_group("player_ray") @onready var Sign: Node3D = get_tree().get_first_node_in_group("open_close_sign") @onready var timer: Node3D = get_tree().get_first_node_in_group("timer") var door_key = {"Door": "pantry_key"} var door_state = {"Door": "door_open", "OpenCloseDoor": "door_open"} func _physics_process(_delta: float) -> void: if self.name == "OpenCloseDoor": if player_ray.is_colliding() and player_ray.get_collider() == self and wait == false: if player_ray.global_rotation_degrees.y >= -90 and player_ray.global_rotation_degrees.y <= 90 and Sign.toggle == true: $"../../InteractLabel".show() if (player_ray.global_rotation_degrees.y < -90 or player_ray.global_rotation_degrees.y > 90) and Sign.toggle == false: $"../../InteractLabel2".show() else: $"../../InteractLabel".hide() $"../../InteractLabel2".hide() func interact(): if interactable == true: if self.is_in_group("locked_door"): for i in Player.keys.size(): if Player.keys[i] == door_key[self.name]: door_animation() else: if self.name == "OpenCloseDoor": ##IF the player is facing a certain direction and the sign facing they can see is open ##THEN play the door animation ##print(Ray.global_rotation_degrees.y) if player_ray.global_rotation_degrees.y >= -90 and player_ray.global_rotation_degrees.y <= 90 and Sign.toggle == true: self_closing_door("forwards") elif (player_ray.global_rotation_degrees.y < -90 or player_ray.global_rotation_degrees.y > 90) and Sign.toggle == false: self_closing_door("backwards") ##Open any non-special and non-locked door else: door_animation() func door_animation(): interactable = false match door_state[self.name]: "door_open": door_state[self.name] = "door_close" "door_close": door_state[self.name] = "door_open" animation_player.play(door_state[self.name]) ## waits for a one second timer to finish before leaving the interactable if loop ## the false statement makes it so when the game is paused the timer is too await get_tree().create_timer(0.5, false).timeout interactable = true func self_closing_door(direction: String): interactable = false wait = true animation_player.play("door_open_" + direction) ## waits for a one second timer to finish before leaving the interactable if loop ## the false statement makes it so when the game is paused the timer is too await get_tree().create_timer(3, false).timeout animation_player.play_backwards("door_open_" + direction) await get_tree().create_timer(0.5, false).timeout interactable = true wait = false