59 lines
1.8 KiB
GDScript3
59 lines
1.8 KiB
GDScript3
|
extends Path3D
|
||
|
|
||
|
@export var speed: float = 1.0
|
||
|
@export var item_offset: Vector3 = Vector3(0,1,0)
|
||
|
|
||
|
var transported_items: Dictionary[Item, PackedFloat64Array] = {}
|
||
|
|
||
|
@onready var producer: Producer = $Producer
|
||
|
@onready var multimesh: MultiMeshInstance3D = $MultiMeshInstance3D
|
||
|
|
||
|
var test_timer: float = 0
|
||
|
@onready var test_item: Item = load("res://items/metal.tres")
|
||
|
|
||
|
func _process(delta: float) -> void:
|
||
|
test_timer += delta
|
||
|
if test_timer >= 2.0:
|
||
|
test_timer -= 2.0
|
||
|
add_item(test_item)
|
||
|
|
||
|
var belt_moving: bool = check_items_at_end()
|
||
|
if belt_moving:
|
||
|
for transported_item_type in transported_items.keys():
|
||
|
var offsets: PackedFloat64Array = transported_items[transported_item_type]
|
||
|
multimesh.multimesh.instance_count = offsets.size()
|
||
|
for i in range(offsets.size()):
|
||
|
offsets[i] += (delta * speed)
|
||
|
position_item(i, transported_item_type, offsets[i])
|
||
|
|
||
|
func add_item(item: Item) -> void:
|
||
|
var offsets: PackedFloat64Array
|
||
|
if transported_items.has(item):
|
||
|
offsets = transported_items[item]
|
||
|
else:
|
||
|
offsets = []
|
||
|
offsets.append(0.0)
|
||
|
transported_items[item] = offsets
|
||
|
|
||
|
func check_items_at_end() -> bool:
|
||
|
var length: float = curve.get_baked_length()
|
||
|
var belt_moving: bool = true
|
||
|
for transported_item_type in transported_items.keys():
|
||
|
var offsets: PackedFloat64Array = transported_items[transported_item_type]
|
||
|
var to_delete: Array[int] = []
|
||
|
for i in range(offsets.size()):
|
||
|
if offsets[i] >= length:
|
||
|
var sent: bool = producer.send_item(transported_item_type)
|
||
|
if !sent:
|
||
|
belt_moving = false
|
||
|
else:
|
||
|
to_delete.append(i)
|
||
|
for d in to_delete:
|
||
|
offsets.remove_at(d)
|
||
|
return belt_moving
|
||
|
|
||
|
func position_item(instance: int, item: Item, offset: float) -> void:
|
||
|
var trans: Transform3D = curve.sample_baked_with_rotation(offset).translated_local(item_offset)
|
||
|
multimesh.multimesh.set_instance_transform(instance, trans)
|
||
|
|