60 lines
1.8 KiB
GDScript
60 lines
1.8 KiB
GDScript
extends Node
|
|
|
|
@export var farmers: Array[Node3D]
|
|
@export var colors: Array[Color]
|
|
|
|
@export var main_anim_player: AnimationPlayer
|
|
var dress_anim_player: AnimationPlayer
|
|
|
|
func _ready() -> void:
|
|
if farmers.is_empty():
|
|
return
|
|
|
|
for farmer in farmers:
|
|
if farmer:
|
|
farmer.hide()
|
|
|
|
var selected_farmer = farmers.pick_random()
|
|
if selected_farmer:
|
|
selected_farmer.show()
|
|
|
|
dress_anim_player = selected_farmer.get_node_or_null("AnimationPlayer")
|
|
|
|
if main_anim_player and dress_anim_player:
|
|
main_anim_player.current_animation_changed.connect(_on_animation_sync)
|
|
main_anim_player.animation_started.connect(_on_animation_sync)
|
|
|
|
if main_anim_player.current_animation != "":
|
|
_on_animation_sync(main_anim_player.current_animation)
|
|
dress_anim_player.seek(main_anim_player.current_animation_position)
|
|
|
|
if colors.size() > 0:
|
|
var parts_to_color = ["pants", "shirt"]
|
|
var shared_color = colors.pick_random()
|
|
|
|
for part_name in parts_to_color:
|
|
var piece_node = _find_mesh_case_insensitive(selected_farmer, part_name)
|
|
|
|
if piece_node:
|
|
var mat = StandardMaterial3D.new()
|
|
mat.albedo_color = shared_color
|
|
|
|
piece_node.set_surface_override_material(0, mat)
|
|
|
|
func _on_animation_sync(anim_name: StringName) -> void:
|
|
if dress_anim_player and dress_anim_player.has_animation(anim_name):
|
|
dress_anim_player.play(anim_name)
|
|
dress_anim_player.speed_scale = main_anim_player.speed_scale
|
|
|
|
func _find_mesh_case_insensitive(parent: Node, part_name: String) -> MeshInstance3D:
|
|
var target = part_name.to_lower()
|
|
for child in parent.get_children():
|
|
if child.name.to_lower().contains(target) and child is MeshInstance3D:
|
|
return child
|
|
|
|
var found = _find_mesh_case_insensitive(child, target)
|
|
if found:
|
|
return found
|
|
|
|
return null
|