60 lines
1.4 KiB
GDScript
60 lines
1.4 KiB
GDScript
extends Marker3D
|
|
|
|
@onready var hat_anchor = self
|
|
var current_hat: Node3D
|
|
var hat_index := 0
|
|
var hat_scenes: Array[PackedScene] = []
|
|
|
|
@export var hats_folder := "res://hat_scenes/"
|
|
@export var cycle_interval := 3.0
|
|
|
|
func _ready():
|
|
load_hat_scenes(hats_folder)
|
|
if hat_scenes.size() > 0:
|
|
equip_hat(hat_scenes[hat_index])
|
|
start_cycling()
|
|
else:
|
|
push_warning("No hat scenes found in: " + hats_folder)
|
|
|
|
func load_hat_scenes(path: String):
|
|
var dir := DirAccess.open(path)
|
|
if dir == null:
|
|
push_error("Could not open hat folder: " + path)
|
|
return
|
|
|
|
dir.list_dir_begin()
|
|
while true:
|
|
var file_name = dir.get_next()
|
|
if file_name == "":
|
|
break
|
|
if dir.current_is_dir():
|
|
continue
|
|
if file_name.ends_with(".tscn"):
|
|
var scene_path = path.path_join(file_name)
|
|
var hat_scene = load(scene_path)
|
|
if hat_scene is PackedScene:
|
|
hat_scenes.append(hat_scene)
|
|
dir.list_dir_end()
|
|
hat_scenes.sort_custom(func(a, b): return a.resource_path < b.resource_path)
|
|
|
|
func start_cycling():
|
|
var timer = Timer.new()
|
|
timer.wait_time = cycle_interval
|
|
timer.autostart = true
|
|
timer.one_shot = false
|
|
timer.timeout.connect(_on_cycle_timeout)
|
|
add_child(timer)
|
|
|
|
func _on_cycle_timeout():
|
|
if hat_scenes.size() == 0:
|
|
return
|
|
hat_index = (hat_index + 1) % hat_scenes.size()
|
|
equip_hat(hat_scenes[hat_index])
|
|
|
|
func equip_hat(scene: PackedScene):
|
|
if current_hat:
|
|
current_hat.queue_free()
|
|
var hat = scene.instantiate()
|
|
hat_anchor.add_child(hat)
|
|
current_hat = hat
|