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()