57 lines
1.6 KiB
GDScript
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)
|