Files
Dawn-Godot/overworld/entity/EntityInteractingArea.gd
T

58 lines
1.5 KiB
GDScript

class_name EntityInteractingArea extends Area3D
var interactableAreas:Array[EntityInteractableArea] = []
@export var entity:Entity
func hasInteraction() -> bool:
return interactableAreas.size() > 0
func interact() -> void:
for area in interactableAreas:
if !area.isInteractable():
continue
area.onInteract(self.entity)
break
func _enter_tree() -> void:
self.area_entered.connect(_onAreaEntered)
self.area_exited.connect(_onAreaExited)
func _exit_tree() -> void:
self.area_entered.disconnect(_onAreaEntered)
self.area_exited.disconnect(_onAreaExited)
func _process(_delta:float) -> void:
if entity.movementType != Entity.MovementType.PLAYER:
return
if UI.INTERACT_INDICATOR and UI.INTERACT_INDICATOR.visible:
UI.INTERACT_INDICATOR.updateWorldPosition()
func _getBestInteractable() -> Entity:
for area in interactableAreas:
if area.isInteractable():
return area.entity
return null
func _updateIndicator() -> void:
if entity.movementType != Entity.MovementType.PLAYER:
return
if UI.INTERACT_INDICATOR == null:
return
var best:Entity = _getBestInteractable()
if best:
UI.INTERACT_INDICATOR.setEntity(best)
else:
UI.INTERACT_INDICATOR.clear()
func _onAreaEntered(area:Area3D) -> void:
if area is EntityInteractableArea:
if area.entity == entity:
return
interactableAreas.append(area)
_updateIndicator()
func _onAreaExited(area:Area3D) -> void:
interactableAreas.erase(area)
_updateIndicator()