64 lines
1.5 KiB
GDScript
64 lines
1.5 KiB
GDScript
class_name MagneticSkillComponent
|
|
extends Node
|
|
|
|
@export var magnetic_area: Area2D
|
|
@export var root: Node2D
|
|
@export var magnetic_move_duration: float = 1.25
|
|
|
|
var collectables_to_pickup: Array = []
|
|
|
|
|
|
func has_component_in_children(node: Node, component_name: String) -> bool:
|
|
if not node:
|
|
return false
|
|
|
|
if node.has_node(component_name):
|
|
return true
|
|
|
|
for child in node.get_children():
|
|
if has_component_in_children(child, component_name):
|
|
return true
|
|
|
|
return false
|
|
|
|
|
|
func _ready() -> void:
|
|
if not magnetic_area:
|
|
printerr("No magnetic_area assigned!")
|
|
return
|
|
|
|
magnetic_area.body_entered.connect(on_magnetic_area_body_entered)
|
|
magnetic_area.area_entered.connect(on_magnetic_area_area_entered)
|
|
|
|
|
|
func _process(_delta: float) -> void:
|
|
for collectable in collectables_to_pickup:
|
|
if not is_instance_valid(collectable):
|
|
collectables_to_pickup.erase(collectable)
|
|
continue
|
|
|
|
move_collectable_to_root(collectable)
|
|
|
|
|
|
func on_magnetic_area_body_entered(_body: Node2D) -> void:
|
|
pass
|
|
|
|
|
|
func on_magnetic_area_area_entered(area: Area2D) -> void:
|
|
if not has_component_in_children(area, "Collectable"):
|
|
return
|
|
|
|
if not collectables_to_pickup.has(area):
|
|
collectables_to_pickup.append(area)
|
|
|
|
|
|
func move_collectable_to_root(collectable: Node2D) -> void:
|
|
if not is_instance_valid(collectable):
|
|
return
|
|
|
|
var direction: Vector2 = (root.global_position - collectable.global_position).normalized()
|
|
var speed: float = direction.length() / magnetic_move_duration
|
|
|
|
collectable.global_position += direction.normalized() * speed
|
|
|