Files
Dawn-Godot/ui/component/InteractIndicator.gd
T

57 lines
1.6 KiB
GDScript

class_name InteractIndicator extends PanelContainer
var _entity:Entity = null
func _enter_tree() -> void:
UI.interactIndicator = self
func _exit_tree() -> void:
if UI.interactIndicator == self:
UI.interactIndicator = null
func _ready() -> void:
visible = false
DialogueManager.dialogue_started.connect(_onDialogueStarted)
DialogueManager.dialogue_ended.connect(_onDialogueEnded)
func setEntity(entity:Entity) -> void:
if is_instance_valid(_entity):
_entity.tree_exiting.disconnect(_onEntityExiting)
_entity = entity
_entity.tree_exiting.connect(_onEntityExiting)
visible = _canShow()
if visible:
updateWorldPosition()
func clear() -> void:
if is_instance_valid(_entity):
_entity.tree_exiting.disconnect(_onEntityExiting)
_entity = null
visible = false
func _canShow() -> bool:
return _entity != null and not UI.dialogueActive
func _onEntityExiting() -> void:
_entity = null
visible = false
func _onDialogueStarted(_resource:DialogueResource) -> void:
visible = false
func _onDialogueEnded(_resource:DialogueResource) -> void:
visible = _canShow()
if visible:
updateWorldPosition()
func updateWorldPosition() -> void:
var camera:Camera3D = get_viewport().get_camera_3d()
if camera == null:
return
var worldPos:Vector3 = _entity.global_position + Vector3(0, 2.5, 0)
var screenPos:Vector2 = camera.unproject_position(worldPos)
var viewportSize:Vector2 = get_viewport().get_visible_rect().size
position = screenPos - size * 0.5
position.x = clamp(position.x, 0.0, viewportSize.x - size.x)
position.y = clamp(position.y, 0.0, viewportSize.y - size.y)