72 lines
2.4 KiB
GDScript
72 lines
2.4 KiB
GDScript
|
extends Node3D
|
||
|
|
||
|
@onready var npc_pcam: PhantomCamera3D = %NPCPhantomCamera3D
|
||
|
@onready var dialogueArea: Area3D = %NPCInteractionArea3D
|
||
|
@onready var dialogueLabel3D: Label3D = %NPCDialogueExampleLabel
|
||
|
|
||
|
@onready var player: CharacterBody3D = %PlayerCharacterBody3D
|
||
|
|
||
|
@onready var move_to_location: Vector3 = %MoveToLocation.get_global_position()
|
||
|
|
||
|
var dialogue_label_initial_position: Vector3
|
||
|
var dialogue_label_initial_rotation: Vector3
|
||
|
|
||
|
var tween: Tween
|
||
|
var tween_duration: float = 0.9
|
||
|
var tween_transition: Tween.TransitionType = Tween.TRANS_QUAD
|
||
|
|
||
|
var interactable: bool
|
||
|
var is_interacting: bool
|
||
|
|
||
|
func _ready() -> void:
|
||
|
dialogueArea.connect("area_entered", _interactable)
|
||
|
dialogueArea.connect("area_exited", _not_interactable)
|
||
|
|
||
|
dialogueLabel3D.set_visible(false)
|
||
|
|
||
|
dialogue_label_initial_position = dialogueLabel3D.get_global_position()
|
||
|
dialogue_label_initial_rotation = dialogueLabel3D.get_global_rotation()
|
||
|
|
||
|
npc_pcam.tween_completed.connect(_on_tween_started)
|
||
|
|
||
|
|
||
|
|
||
|
func _on_tween_started() -> void:
|
||
|
player.movement_enabled = false
|
||
|
|
||
|
|
||
|
func _interactable(area_3D: Area3D) -> void:
|
||
|
if area_3D.get_parent() is CharacterBody3D:
|
||
|
dialogueLabel3D.set_visible(true)
|
||
|
interactable = true
|
||
|
|
||
|
var tween: Tween = get_tree().create_tween().set_trans(tween_transition).set_ease(Tween.EASE_IN_OUT).set_loops()
|
||
|
tween.tween_property(dialogueLabel3D, "global_position", dialogue_label_initial_position - Vector3(0, -0.2, 0), tween_duration)
|
||
|
tween.tween_property(dialogueLabel3D, "position", dialogue_label_initial_position, tween_duration)
|
||
|
|
||
|
|
||
|
func _not_interactable(area_3D: Area3D) -> void:
|
||
|
if area_3D.get_parent() is CharacterBody3D:
|
||
|
dialogueLabel3D.set_visible(false)
|
||
|
interactable = false
|
||
|
|
||
|
|
||
|
func _input(event) -> void:
|
||
|
if not interactable: return
|
||
|
|
||
|
if event is InputEventKey and event.pressed:
|
||
|
if event.keycode == KEY_F:
|
||
|
var tween: Tween = get_tree().create_tween() \
|
||
|
.set_parallel(true) \
|
||
|
.set_trans(Tween.TRANS_QUART) \
|
||
|
.set_ease(Tween.EASE_IN_OUT)
|
||
|
if not is_interacting:
|
||
|
npc_pcam.priority = 20
|
||
|
tween.tween_property(player, "global_position", move_to_location, 0.6).set_trans(tween_transition)
|
||
|
tween.tween_property(dialogueLabel3D, "rotation", Vector3(deg_to_rad(-20), deg_to_rad(53), 0), 0.6).set_trans(tween_transition)
|
||
|
else:
|
||
|
npc_pcam.priority = 0
|
||
|
tween.tween_property(dialogueLabel3D, "rotation", dialogue_label_initial_rotation, 0.9)
|
||
|
player.movement_enabled = true
|
||
|
is_interacting = !is_interacting
|