diff --git a/Models/Furniture/ShowroomChair.glb b/Models/Furniture/ShowroomChair.glb new file mode 100644 index 0000000..63fcc5b Binary files /dev/null and b/Models/Furniture/ShowroomChair.glb differ diff --git a/Models/Furniture/ShowroomChair.glb.import b/Models/Furniture/ShowroomChair.glb.import new file mode 100644 index 0000000..07d7323 --- /dev/null +++ b/Models/Furniture/ShowroomChair.glb.import @@ -0,0 +1,42 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://denf02jj7iwwf" +path="res://.godot/imported/ShowroomChair.glb-6d16deb7dd516b5ca70bd68f3f731803.scn" + +[deps] + +source_file="res://Models/Furniture/ShowroomChair.glb" +dest_files=["res://.godot/imported/ShowroomChair.glb-6d16deb7dd516b5ca70bd68f3f731803.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 diff --git a/Scenes/GUI/MainMenu.tscn b/Scenes/GUI/MainMenu.tscn index f1f8e3e..fbb6b43 100644 --- a/Scenes/GUI/MainMenu.tscn +++ b/Scenes/GUI/MainMenu.tscn @@ -575,7 +575,8 @@ Move: W, A, S, D Jump: Space Crouch: Right Control Run: Right Shift -Toggle Flashlight: E +Pick Up Object: E +Toggle Flashlight: F Open Curtains: C Debug Info: F3 Open Menu: ESC diff --git a/Scenes/Props/Physics/ShowroomChair.tscn b/Scenes/Props/Physics/ShowroomChair.tscn new file mode 100644 index 0000000..cb0da3d --- /dev/null +++ b/Scenes/Props/Physics/ShowroomChair.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=5 format=3 uid="uid://db8vuekpyg0fl"] + +[ext_resource type="PackedScene" uid="uid://denf02jj7iwwf" path="res://Models/Furniture/ShowroomChair.glb" id="1_hq6j1"] + +[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_lbe82"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_lbe82"] +size = Vector3(0.55, 0.6, 0.55) + +[sub_resource type="BoxShape3D" id="BoxShape3D_domyf"] +size = Vector3(0.05, 0.6, 0.55) + +[node name="ShowroomChair" type="Node3D"] + +[node name="RigidBody3D" type="RigidBody3D" parent="."] +mass = 5.0 +physics_material_override = SubResource("PhysicsMaterial_lbe82") + +[node name="Model" parent="RigidBody3D" instance=ExtResource("1_hq6j1")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) + +[node name="CollisionShape3D5" type="CollisionShape3D" parent="RigidBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.2, 0) +shape = SubResource("BoxShape3D_lbe82") + +[node name="CollisionShape3D6" type="CollisionShape3D" parent="RigidBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.3, 0.4, 0) +shape = SubResource("BoxShape3D_domyf") diff --git a/Scripts/Player/Player.gd b/Scripts/Player/Player.gd index 66d82a3..fa6decb 100644 --- a/Scripts/Player/Player.gd +++ b/Scripts/Player/Player.gd @@ -36,6 +36,17 @@ var walk_vel: Vector3 # Walking velocity var grav_vel: Vector3 # Gravity velocity var jump_vel: Vector3 # Jumping velocity +var throwForce = 2 +var followSpeed = 25.0 +var followDistance = 1.5 +var maxDistanceFromCamera = 5.0 + +var heldObject: RigidBody3D +var hrx: float = 0 +var hry: float = 0 +var hrz: float = 0 + +@onready var interactRay = $Camera/Interact @onready var camera: Camera3D = $Camera func _ready() -> void: @@ -102,6 +113,7 @@ func _unhandled_input(event: InputEvent) -> void: camera_sens = 3 func _physics_process(delta: float) -> void: + handle_holding_objects() if (interact): if Input.is_action_just_pressed(&"freeroam_jump"): jumping = true elif Input.is_action_just_pressed(&"freeroam_crouch"): @@ -189,3 +201,37 @@ func _jump(delta: float) -> Vector3: return jump_vel jump_vel = Vector3.ZERO if is_on_floor() or is_on_ceiling_only() else jump_vel.move_toward(Vector3.ZERO, gravity * delta) return jump_vel + +func set_held_object(body): + if body is RigidBody3D: + heldObject = body + hrx = heldObject.rotation.x + hry = heldObject.rotation.y + hrz = heldObject.rotation.z + +func drop_held_object(): + heldObject = null + +func throw_held_object(): + var obj = heldObject + drop_held_object() + obj.apply_central_impulse(-camera.global_basis.z * throwForce * 10) + +func handle_holding_objects(): + if Input.is_action_just_pressed("freeroam_throw_prop"): + if heldObject != null: throw_held_object() + + if Input.is_action_just_pressed("freeroam_pickup_prop"): + if heldObject != null: drop_held_object() + elif interactRay.is_colliding(): set_held_object(interactRay.get_collider()) + + if heldObject != null: + var targetPos = camera.global_transform.origin + (camera.global_basis * Vector3(0, 0, -followDistance)) # 2.5 units in front of camera + var objectPos = heldObject.global_transform.origin + heldObject.linear_velocity = (targetPos - objectPos) * followSpeed + heldObject.rotation.x = hrx + heldObject.rotation.y = hry + heldObject.rotation.z = hrz + + if heldObject.global_position.distance_to(camera.global_position) > maxDistanceFromCamera: + drop_held_object() diff --git a/Scripts/Player/Player.tscn b/Scripts/Player/Player.tscn index 62708d8..41fe705 100644 --- a/Scripts/Player/Player.tscn +++ b/Scripts/Player/Player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=9 format=3 uid="uid://cdk6hwb4hi2wc"] +[gd_scene load_steps=10 format=3 uid="uid://cdk6hwb4hi2wc"] [ext_resource type="Script" uid="uid://b0c02p6ckmpdq" path="res://Scripts/Player/Player.gd" id="1_2f8j2"] [ext_resource type="PackedScene" uid="uid://cd67bfok34xhy" path="res://Scenes/GUI/InGameMenu.tscn" id="2_0s4r2"] @@ -7,6 +7,7 @@ [ext_resource type="AudioStream" uid="uid://bfeslo2ldb40t" path="res://UI/Sounds/flashlight_size_change.wav" id="5_gfoho"] [ext_resource type="AudioStream" uid="uid://8uh608yamqpj" path="res://UI/Sounds/flashlight_on.wav" id="6_gfoho"] [ext_resource type="AudioStream" uid="uid://bwwl6h7uyog64" path="res://UI/Sounds/flashlight_off.wav" id="7_7v0xc"] +[ext_resource type="Script" uid="uid://b1f0pnt5r8fbx" path="res://Scripts/Player/PropPusher.gd" id="8_7v0xc"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ejydr"] radius = 0.3 @@ -34,6 +35,10 @@ spot_range = 1000.0 spot_angle = 30.0 spot_angle_attenuation = 0.25 +[node name="Interact" type="RayCast3D" parent="Camera"] +target_position = Vector3(0, 0, -2.5) +hit_back_faces = false + [node name="DebugMenu" parent="." instance=ExtResource("3_ejydr")] visible = false mouse_filter = 2 @@ -55,3 +60,8 @@ volume_db = -5.0 [node name="FlashlightOffSFX" type="AudioStreamPlayer" parent="."] stream = ExtResource("7_7v0xc") volume_db = -5.0 + +[node name="PropPusher" type="Node" parent="." node_paths=PackedStringArray("controller")] +script = ExtResource("8_7v0xc") +controller = NodePath("..") +enabled = true diff --git a/Scripts/Player/PropPusher.gd b/Scripts/Player/PropPusher.gd new file mode 100644 index 0000000..a5567ac --- /dev/null +++ b/Scripts/Player/PropPusher.gd @@ -0,0 +1,14 @@ +extends Node + +@export var controller : CharacterBody3D +@export_range(0.0, 500.0, 0.1) var force : float = 1 +@export var enabled : bool = false + +func _physics_process(_delta: float) -> void: + if enabled and controller.get_slide_collision_count() > 0: + var collision = controller.get_last_slide_collision() + if collision.get_collider() is RigidBody3D: + var direction = -collision.get_normal() + var speed = clamp(controller.velocity.length(), 1.0, 10.0) + var impulse_position = collision.get_position() - collision.get_collider().global_position + collision.get_collider().apply_impulse(direction * speed * force, impulse_position) diff --git a/Scripts/Player/PropPusher.gd.uid b/Scripts/Player/PropPusher.gd.uid new file mode 100644 index 0000000..e2d0c1a --- /dev/null +++ b/Scripts/Player/PropPusher.gd.uid @@ -0,0 +1 @@ +uid://b1f0pnt5r8fbx diff --git a/project.godot b/project.godot index eae2692..a22eac7 100644 --- a/project.godot +++ b/project.godot @@ -499,8 +499,8 @@ freeroam_run={ } freeroam_toggle_flashlight={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":true,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":8,"pressure":0.0,"pressed":false,"script":null) ] } freeroam_transport_play_pause={ @@ -560,10 +560,23 @@ freeroam_flashlight_zoom_reset={ "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":3,"canceled":false,"pressed":false,"double_click":false,"script":null) ] } +freeroam_pickup_prop={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":false,"script":null) +] +} +freeroam_throw_prop={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(258, 19),"global_position":Vector2(267, 67),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":5,"axis_value":1.0,"script":null) +] +} [physics] 3d/physics_engine="Jolt Physics" +common/physics_interpolation=true [rendering]