add human dresses
This commit is contained in:
59
core/ai/agents/human/dress_human.gd
Normal file
59
core/ai/agents/human/dress_human.gd
Normal file
@@ -0,0 +1,59 @@
|
||||
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
|
||||
Reference in New Issue
Block a user