extends Unit class_name Citizen @onready var body: Sprite3D = $Body @onready var hands: Sprite3D = $Body/Hands var task: Task = null var working: bool = false func _ready() -> void: held_item_meshinstance = $"Body/Hands/Held Item" func _process(delta: float) -> void: super(delta) var camera: Camera3D if Engine.is_editor_hint(): camera = EditorInterface.get_editor_viewport_3d(0).get_camera_3d() else: camera = get_viewport().get_camera_3d() var facing_direction: Vector3 = -global_basis.z var camera_local_facing: Vector3 = facing_direction * camera.global_basis var facing_away: bool = camera_local_facing.z < 0 var facing_right: bool = camera_local_facing.x > 0 body.frame = 1 if facing_away else 0 #hands.frame = 1 if facing_away else 0 body.flip_h = facing_right hands.flip_h = facing_right if !working and task != null: working = true var ok: bool = await task.execute(self) if !ok: CitizenManager._instance.add_task(task) task = null working = false func assign_task(t: Task) -> void: task = t func is_idle() -> bool: return task == null func put_item_in_building_materials(building: Building) -> bool: building._add_build_material(held_item) held_item = null return true func put_item_in_building_storage(building: Building) -> bool: if building.consumer == null: return false if !building.consumer.offer_item(held_item): return false held_item = null return true func build_building(building: Building) -> bool: var build_action: UnitAction.BuildAction = UnitAction.BuildAction.new() build_action.building = building action = build_action var ok: bool = await wait_for_task_update() == TaskStatus.DONE return ok