diff --git a/Scenes/Prefabs/DoubleBeds.tscn b/Scenes/Prefabs/DoubleBeds.tscn index eda8f29..6f46ca5 100644 --- a/Scenes/Prefabs/DoubleBeds.tscn +++ b/Scenes/Prefabs/DoubleBeds.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=3 uid="uid://0t0cvsitlfmm"] +[gd_scene load_steps=19 format=3 uid="uid://0t0cvsitlfmm"] [ext_resource type="Script" uid="uid://c61rr6to3q566" path="res://Scripts/build_object.gd" id="1_nn5da"] [ext_resource type="ArrayMesh" uid="uid://cahq2fdeqqwhx" path="res://Blends/Mobel/DoubleBeds.obj" id="2_8ssp7"] @@ -8,6 +8,7 @@ [ext_resource type="Shader" uid="uid://c08eg1piwoy3t" path="res://Shaders/outline.gdshader" id="5_c1046"] [ext_resource type="Texture2D" uid="uid://kl1jplui8wfq" path="res://Blends/Mobel/textures/Material.003 Base Color.png" id="5_sp2kd"] [ext_resource type="Script" uid="uid://fjdtka5s1dxi" path="res://Scripts/objects/DoubleBeds.gd" id="8_c1046"] +[ext_resource type="PackedScene" uid="uid://f7nkbsrxy4r6" path="res://Scenes/Prefabs/PersonPos.tscn" id="9_k1k40"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_dn7et"] render_priority = 0 @@ -79,3 +80,13 @@ shape = SubResource("SphereShape3D_c1046") [node name="CSGSphere3D" type="CSGSphere3D" parent="ActionNode/Area3d"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.839141, 0.470829) radius = 0.886475 + +[node name="PersonPos1" parent="ActionNode" instance=ExtResource("9_k1k40")] +transform = Transform3D(0.0323901, -0.298156, -0.00732965, 0.298245, 0.0323998, 0, 0.000791598, -0.00728678, 0.29991, -0.0940391, -1.07055, -1.60941) +visible = false + +[node name="Timer" type="Timer" parent="ActionNode"] +wait_time = 4.0 +one_shot = true + +[connection signal="timeout" from="ActionNode/Timer" to="ActionNode" method="_on_timer_timeout"] diff --git a/Scenes/Prefabs/Person.tscn b/Scenes/Prefabs/Person.tscn index e168812..a61c877 100644 --- a/Scenes/Prefabs/Person.tscn +++ b/Scenes/Prefabs/Person.tscn @@ -29,5 +29,10 @@ shape = SubResource("ConvexPolygonShape3D_dbviw") avoidance_enabled = true debug_enabled = true +[node name="Timer" type="Timer" parent="."] +wait_time = 4.0 +one_shot = true + [connection signal="navigation_finished" from="NavigationAgent3D" to="." method="_on_navigation_agent_3d_navigation_finished"] [connection signal="target_reached" from="NavigationAgent3D" to="." method="_on_navigation_agent_3d_target_reached"] +[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"] diff --git a/Scenes/Prefabs/PersonPos.tscn b/Scenes/Prefabs/PersonPos.tscn new file mode 100644 index 0000000..a2e301e --- /dev/null +++ b/Scenes/Prefabs/PersonPos.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=5 format=3 uid="uid://f7nkbsrxy4r6"] + +[ext_resource type="ArrayMesh" uid="uid://dwd6ylq5xn6kj" path="res://Blends/Person/Person.obj" id="1_njeso"] +[ext_resource type="Shader" uid="uid://bm15rdsdxldwl" path="res://Shaders/shirt.gdshader" id="2_hdsev"] +[ext_resource type="Script" uid="uid://cstn6v7wfnwwb" path="res://Scripts/person_pos.gd" id="3_q4csl"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_q4csl"] +render_priority = 0 +shader = ExtResource("2_hdsev") +shader_parameter/shirt_color = Vector3(0, 0, 0) + +[node name="PersonPos" type="MeshInstance3D"] +transform = Transform3D(0.3, 0, 0, 0, 0.3, 0, 0, 0, 0.3, 0, 0, 0) +mesh = ExtResource("1_njeso") +surface_material_override/1 = SubResource("ShaderMaterial_q4csl") +script = ExtResource("3_q4csl") diff --git a/Scripts/Interactable.gd b/Scripts/Interactable.gd index 898b6c4..e64eeab 100644 --- a/Scripts/Interactable.gd +++ b/Scripts/Interactable.gd @@ -1,6 +1,8 @@ class_name Interactable extends Node +signal action_stoped + var can_pick: bool var can_store: bool @@ -8,12 +10,41 @@ var stored_objects: Array var max_person_using var persons_using: Array +var persons_position: Array -func action(person, object): +func start_action(person, object): print("action!") + +func stop_action(person, object): + person.is_in_action = false + var pose = find_pose(person) + pose.remove_person() + person.visible = true + action_stoped.emit() + func add_person_using(person): persons_using.append(person) func remove_person_using(person): persons_using.erase(person) + + +func set_person_pos(person): + for pose in persons_position: + if pose.is_free: + pose.set_person(person) + + +func find_pose(person): + return persons_position[persons_position.find(person)] + +func can_be_used(): + var used_poses = 0 + for pose in persons_position: + if !pose.is_free: + used_poses += 1 + if used_poses < max_person_using: + return true + else: + return false diff --git a/Scripts/global_script.gd b/Scripts/global_script.gd index 96be5bb..2fb6169 100644 --- a/Scripts/global_script.gd +++ b/Scripts/global_script.gd @@ -12,4 +12,4 @@ func _ready() -> void: interact.connect(_on_interact) func _on_interact(person, object): - object.ActionNode.action(person, object) + object.ActionNode.start_action(person, object) diff --git a/Scripts/objects/DoubleBeds.gd b/Scripts/objects/DoubleBeds.gd index 15a5ed6..233b58f 100644 --- a/Scripts/objects/DoubleBeds.gd +++ b/Scripts/objects/DoubleBeds.gd @@ -1,26 +1,17 @@ extends Interactable -var transform_pos1: Vector3 -var transform_rot1: Vector3 - -var transform_pos2: Vector3 -var transform_rot2: Vector3 - func _init() -> void: can_pick = false can_store = false max_person_using = 2 - transform_pos1 = Vector3(-0.18,-0.753,-0.275) - transform_rot1 = Vector3(84.2,-90.0, 0) - transform_pos2 = Vector3(-0.18,1.226,-0.275) - transform_rot2 = Vector3(84.2,-90.0, 0) +func _ready() -> void: + persons_position.append($PersonPos1) -func action(person, object): - person.global_position = object.to_global(transform_pos1) - person.rotation = transform_rot1 - print(person.position) +func start_action(person, object): + person.visible = false + set_person_pos(person) print(str(person) + " is sleeping") - + PersonAction.sleep(person, object, self) diff --git a/Scripts/person.gd b/Scripts/person.gd index 0dda4cd..06a01e7 100644 --- a/Scripts/person.gd +++ b/Scripts/person.gd @@ -8,6 +8,12 @@ var meshI: MeshInstance3D var start_pos: Vector3 var target_object: Node3D +var is_in_action: bool +var action: Interactable + +var is_target_reached: bool + +var timer: Timer func _ready() -> void: nav_agent = $NavigationAgent3D meshI = $MeshInstance3D @@ -19,11 +25,15 @@ func _ready() -> void: start_pos = global_position + is_in_action = false + + timer = $Timer #nav_agent.target_position = Vector3(-15.955,3.486,-58.942) func _physics_process(delta: float) -> void: var new_velocity = global_position.direction_to(nav_agent.get_next_path_position()) * 5.0 - look_at(nav_agent.target_position) + if !is_target_reached: + look_at(nav_agent.target_position) velocity = new_velocity move_and_slide() @@ -42,19 +52,30 @@ func set_random_shirt(): func set_target(object): - target_object = object + + #if !is_in_action and object.ActionNode.can_be_used(): + if !is_in_action: + target_object = object #nav_agent.target_position = target_object.ActionNode.global_position func set_target_position(): + is_target_reached = false var newPos = target_object.ActionNode.global_position newPos.y = self.position.y nav_agent.target_position = newPos - + print(target_object.ActionNode.can_be_used()) #nav_agent.target_position = start_pos func _on_navigation_agent_3d_target_reached() -> void: if target_object != null: + is_target_reached = true nav_agent.target_position = self.global_position Global.interact.emit(self, target_object) pass + + +func _on_timer_timeout() -> void: + if action != null: + print("action stoped") + action.stop_action(self,target_object) diff --git a/Scripts/person_action.gd b/Scripts/person_action.gd new file mode 100644 index 0000000..c2655f6 --- /dev/null +++ b/Scripts/person_action.gd @@ -0,0 +1,9 @@ +extends Node + + +func sleep(person, object, action): + person.action = action + person.timer.wait_time = 2.0 + person.timer.one_shot = true + person.timer.start() + person.timer.timeout.connect(person._on_timer_timeout) diff --git a/Scripts/person_action.gd.uid b/Scripts/person_action.gd.uid new file mode 100644 index 0000000..a4c4e6b --- /dev/null +++ b/Scripts/person_action.gd.uid @@ -0,0 +1 @@ +uid://dpvx655hc86ct diff --git a/Scripts/person_pos.gd b/Scripts/person_pos.gd new file mode 100644 index 0000000..864bd23 --- /dev/null +++ b/Scripts/person_pos.gd @@ -0,0 +1,20 @@ +extends MeshInstance3D + +var is_free: bool +var person: CharacterBody3D +var shirt_shader: ShaderMaterial + + +func _init() -> void: + is_free = true +func set_person(newPerson): + self.person = newPerson + self.shirt_shader = newPerson.shirt_shader + self.set_surface_override_material(1,self.shirt_shader) + self.visible = true + +func get_person(): + return person + +func remove_person(): + self.visible = false diff --git a/Scripts/person_pos.gd.uid b/Scripts/person_pos.gd.uid new file mode 100644 index 0000000..2f55562 --- /dev/null +++ b/Scripts/person_pos.gd.uid @@ -0,0 +1 @@ +uid://cstn6v7wfnwwb diff --git a/project.godot b/project.godot index d4d6aed..59f86f3 100644 --- a/project.godot +++ b/project.godot @@ -19,6 +19,7 @@ config/icon="res://icon.svg" Global="*res://Scripts/global_script.gd" BuildManager="*res://Scripts/build_manager.gd" +PersonAction="*res://Scripts/person_action.gd" [editor_plugins]