58 lines
1.5 KiB
GDScript
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()
|