extends Line2D signal node_at_end(node: Node) @export var speed: float = 10.0 var length: float = 1000.0 var transported_objects: Dictionary var belt_stopped: bool = false func _ready() -> void: calculate_length() func calculate_length() -> void: length = 0.0 var first: bool = true var lastPoint: Vector2 for point in points: if first: first = false continue else: length += lastPoint.distance_to(point) lastPoint = point func get_first_object_progress() -> float: var least: float = length for key in transported_objects.keys(): var progress: float = transported_objects.get(key, 0.0) if progress < least: least = progress return least func position_resource(res: Node2D, progress: float) -> void: var first: bool = true var segmentStartPos: Vector2 = Vector2() var segmentStartProg: float = 0.0 res.z_index = 1 for point in points: if first: segmentStartPos = point first = false continue var endProg: float = segmentStartProg + segmentStartPos.distance_to(point) if progress <= endProg: var x: float = (progress - segmentStartProg) / (endProg - segmentStartProg) var pos: Vector2 = segmentStartPos.lerp(point, x) res.position = pos return segmentStartProg = endProg segmentStartPos = point func add_transported_object(res: Node) -> void: if res is Node2D: transported_objects.set(res, 0); func remove_transported_object(res: Node) -> void: if res is Node2D: var progress: float = transported_objects.get(res, 0.0) transported_objects.erase(res) if progress >= length: belt_stopped = false func _process(delta: float) -> void: for key in transported_objects.keys(): var progress: float = transported_objects.get(key, 0.0) if !belt_stopped: progress += speed * delta transported_objects.set(key, progress) position_resource(key, progress) if progress >= length: belt_stopped = true node_at_end.emit(key)