From 4047a1c9a8156c2c9dc7a77e8dbc9faa09fae5cf Mon Sep 17 00:00:00 2001 From: derek Date: Tue, 17 Jun 2025 10:32:31 -0500 Subject: [PATCH] rudimentary clamber --- assets/ladder_collision_check.tscn | 2 +- assets/player.tscn | 24 +++++++++++++++++++---- project.godot | 2 +- scenes/02_scene_tester.tscn | 2 +- scripts/PlayerStates.gd | 7 ++++++- scripts/player.gd | 31 ++++++++++++++++++++++++++++++ scripts/player_clamber.gd | 18 +++++++++++++++++ scripts/player_clamber.gd.uid | 1 + scripts/player_crouched.gd | 6 +++--- scripts/player_jumping.gd | 4 ++-- scripts/player_on_foot.gd | 2 +- scripts/player_on_ladder.gd | 11 +++++++++++ scripts/player_wall_running.gd | 4 ++-- 13 files changed, 98 insertions(+), 16 deletions(-) create mode 100644 scripts/player_clamber.gd create mode 100644 scripts/player_clamber.gd.uid diff --git a/assets/ladder_collision_check.tscn b/assets/ladder_collision_check.tscn index aeab1ee..8629266 100644 --- a/assets/ladder_collision_check.tscn +++ b/assets/ladder_collision_check.tscn @@ -18,7 +18,7 @@ shape = SubResource("BoxShape3D_gxu3i") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0) [node name="LadderPlayerPos" type="Marker3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.435783) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.748895) [connection signal="body_entered" from="." to="." method="_on_body_entered"] [connection signal="body_exited" from="." to="." method="_on_body_exited"] diff --git a/assets/player.tscn b/assets/player.tscn index bfa3acf..6d62fc9 100644 --- a/assets/player.tscn +++ b/assets/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=44 format=3 uid="uid://drwae3loscbw7"] +[gd_scene load_steps=45 format=3 uid="uid://drwae3loscbw7"] [ext_resource type="Script" uid="uid://bieeh1iro4ji1" path="res://scripts/player.gd" id="1_x7wms"] [ext_resource type="Script" uid="uid://linvnr16djav" path="res://scripts/PlayerStateMachine.gd" id="2_1npgd"] @@ -12,6 +12,7 @@ [ext_resource type="Script" uid="uid://bgj2bqb5dys41" path="res://scripts/player_wall_running.gd" id="6_1npgd"] [ext_resource type="Script" uid="uid://boyl3qkg4j4vc" path="res://scripts/player_ground_pound.gd" id="7_2asft"] [ext_resource type="AudioStream" uid="uid://bki17g7j4kqn4" path="res://assets/Audio/PickupSound Mixdown 3.wav" id="8_dwqsx"] +[ext_resource type="Script" uid="uid://cl8wpx8g1b5ce" path="res://scripts/player_clamber.gd" id="8_iwgew"] [ext_resource type="Script" uid="uid://bb7u0nnktowwp" path="res://scripts/player_on_ladder.gd" id="8_vgdha"] [ext_resource type="Shader" uid="uid://djbvmc8hurccm" path="res://assets/Shaders/speedlines.gdshader" id="10_5hu7c"] [ext_resource type="AudioStream" uid="uid://dyd272r7n2ecd" path="res://assets/Audio/footsteps-shoes-jump-land-beach-sand-SBA-300118001.wav" id="10_tn0pn"] @@ -148,9 +149,6 @@ initial_state = NodePath("On Foot") [node name="On Foot" type="Node" parent="StateMachine"] script = ExtResource("3_ib4e7") -move_speed = null -move_transition_speed = null -can_climb_new_ladder = null metadata/_custom_type_script = "uid://dk0vg5btak80a" [node name="Crouched" type="Node" parent="StateMachine"] @@ -172,6 +170,9 @@ script = ExtResource("7_2asft") [node name="Stunned" type="Node" parent="StateMachine"] +[node name="Clamber" type="Node" parent="StateMachine"] +script = ExtResource("8_iwgew") + [node name="On Ladder" type="Node" parent="StateMachine"] script = ExtResource("8_vgdha") move_speed = 5.0 @@ -376,6 +377,21 @@ target_position = Vector3(0, 0, 1) [node name="WallJumpTimer" type="Timer" parent="."] one_shot = true +[node name="ClamberMaxRay" type="RayCast3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.797, 0) +target_position = Vector3(0, 0, -1) +collision_mask = 33 + +[node name="ClamberPointRay" type="RayCast3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.987695, -0.600275) +target_position = Vector3(0, -1.995, 0) +collision_mask = 33 + +[node name="ClamberCheckRay" type="RayCast3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.607088, -0.488815) +target_position = Vector3(0, 0, -1) +collision_mask = 33 + [connection signal="tree_entered" from="." to="." method="_on_tree_entered"] [connection signal="body_entered" from="pick_up_detection" to="." method="_on_pick_up_detection_body_entered"] [connection signal="body_entered" from="pick_up_magnet" to="." method="_on_pick_up_magnet_body_entered"] diff --git a/project.godot b/project.godot index 96ba459..0f0d656 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="First Person Test" config/tags=PackedStringArray("fps") -run/main_scene="uid://c6fykssf7paft" +run/main_scene="uid://dsw00ml8rv6xo" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="uid://6svuq1l83al5" diff --git a/scenes/02_scene_tester.tscn b/scenes/02_scene_tester.tscn index 7570c67..c498759 100644 --- a/scenes/02_scene_tester.tscn +++ b/scenes/02_scene_tester.tscn @@ -545,4 +545,4 @@ transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -6.987 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.9686, 0.382905, 12.9928) [node name="LadderCollisionCheck" parent="." instance=ExtResource("29_g3x4f")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.9991, 0.0999999, 12.5151) +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -16.9991, 0.0999999, 13.0221) diff --git a/scripts/PlayerStates.gd b/scripts/PlayerStates.gd index 60e347c..d98be86 100644 --- a/scripts/PlayerStates.gd +++ b/scripts/PlayerStates.gd @@ -15,7 +15,12 @@ func standard_movement(delta): character.velocity.z = lerp(character.velocity.z, character.movement_input().z * move_speed * character.speed_modifiers(),delta * move_transition_speed) func standard_jump(): - return character.JUMP_VELOCITY * character.speed_modifiers() + #first check for clamber, otherwise jump + print("CAN CLAMBER? - ",character.can_clamber()) + if character.can_clamber(): + Transitioned.emit(self,"clamber") + else: + character.velocity.y += character.JUMP_VELOCITY * character.speed_modifiers() func apply_gravity(delta): character.velocity.y -= 9.8 * 1.25 * delta diff --git a/scripts/player.gd b/scripts/player.gd index 7c4a536..869f21e 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -65,6 +65,9 @@ var wall_run_direction # Ladder var current_ladder +# Clamber +var clamber_point + ## GUNS AND AMMO var gun : Node var holstered_gun_id : int @@ -136,6 +139,9 @@ var controlled_elsewhere = false @onready var weapon_select_menu: Control = $Head/Recoil/Camera3D/WeaponSelect @onready var wall_jump_timer: Timer = $WallJumpTimer @onready var remaining_stamina : float = level_control.gamemode.max_stamina +@onready var clamber_max_ray: RayCast3D = $ClamberMaxRay +@onready var clamber_check_ray: RayCast3D = $ClamberCheckRay +@onready var clamber_point_ray: RayCast3D = $ClamberPointRay func _ready(): level_control.player = self @@ -385,6 +391,31 @@ func speed_modifiers(): return speed_multiplier +func can_clamber(): + var clamber_ray_collided = false + const CHECK_RESOLUTION = .1 + const MAX_RAY_POSITION = .607 + const MIN_RAY_POSITION = -.9 + + while clamber_check_ray.position.y > MIN_RAY_POSITION: + if clamber_check_ray.is_colliding(): + clamber_ray_collided = true + break + clamber_check_ray.position.y -= CHECK_RESOLUTION + + clamber_check_ray.position.y = MAX_RAY_POSITION + + if clamber_ray_collided and !clamber_max_ray.is_colliding(): + return true + else: + return false + +func get_clamber_point(): + if clamber_point_ray.is_colliding(): + return clamber_point_ray.get_collision_point() + else: + return clamber_point_ray.global_position + func joypad_walk(): # Joypad right stick look control var dir_out = Vector2(0,0) diff --git a/scripts/player_clamber.gd b/scripts/player_clamber.gd new file mode 100644 index 0000000..de28bce --- /dev/null +++ b/scripts/player_clamber.gd @@ -0,0 +1,18 @@ +extends PlayerState +class_name PlayerClamber + +var clamber_point + +func Enter(): + clamber_point = character.get_clamber_point() + character.standing_collision.disabled = true + character.crouching_collision.disabled = true + +func Physics_Update(delta): + character.velocity = Vector3.ZERO + character.global_position = clamber_point + Vector3(0,1,0) + Transitioned.emit(self,"on foot") + +func Exit(): + character.standing_collision.disabled = false + character.crouching_collision.disabled = false diff --git a/scripts/player_clamber.gd.uid b/scripts/player_clamber.gd.uid new file mode 100644 index 0000000..7d0a329 --- /dev/null +++ b/scripts/player_clamber.gd.uid @@ -0,0 +1 @@ +uid://cl8wpx8g1b5ce diff --git a/scripts/player_crouched.gd b/scripts/player_crouched.gd index 6b6f1f5..2a0fbb8 100644 --- a/scripts/player_crouched.gd +++ b/scripts/player_crouched.gd @@ -17,8 +17,8 @@ func Update(delta): func Physics_Update(delta): if character.is_on_floor(): standard_movement(delta) - else: - Transitioned.emit(self,"in air") + + apply_gravity(delta) if Input.is_action_just_pressed("crouch"): if !character.crouch_check.is_colliding(): @@ -32,7 +32,7 @@ func Physics_Update(delta): if Input.is_action_just_pressed("jump"): if !character.crouch_check.is_colliding(): character.recoil.add_recoil(Vector3(-.2,.03,.03),5,10) - character.velocity.y += character.JUMP_VELOCITY + standard_jump() transition_out_of_crouch() diff --git a/scripts/player_jumping.gd b/scripts/player_jumping.gd index 705648a..dfc9ac4 100644 --- a/scripts/player_jumping.gd +++ b/scripts/player_jumping.gd @@ -18,9 +18,9 @@ func Physics_Update(delta): enable_wall_rays() - if Input.is_action_just_pressed("jump") and character.jumps_remaining > 0: + if Input.is_action_just_pressed("jump") and (character.jumps_remaining > 0 or character.can_clamber()): character.jumps_remaining -= 1 - character.velocity.y += character.JUMP_VELOCITY + standard_jump() if Input.is_action_just_pressed("sprint") and air_dash_left > 0: air_dash_left -= 1 diff --git a/scripts/player_on_foot.gd b/scripts/player_on_foot.gd index cca16d2..0b07c16 100644 --- a/scripts/player_on_foot.gd +++ b/scripts/player_on_foot.gd @@ -16,4 +16,4 @@ func Physics_Update(delta): if Input.is_action_just_pressed("jump"): character.jumps_remaining -= 1 - character.velocity.y += standard_jump() + standard_jump() diff --git a/scripts/player_on_ladder.gd b/scripts/player_on_ladder.gd index 09abd74..1637dab 100644 --- a/scripts/player_on_ladder.gd +++ b/scripts/player_on_ladder.gd @@ -1,11 +1,22 @@ extends PlayerState class_name PlayerOnLadder +var climbing_started = false + +func Enter(): + climbing_started = false + func Physics_Update(delta): character.global_position.x = lerp(character.global_position.x,character.current_ladder.global_position.x,delta * 8) character.global_position.z = lerp(character.global_position.z,character.current_ladder.global_position.z,delta * 8) ladder_movement(delta) + + if !character.is_on_floor() and !climbing_started: + climbing_started = true + + if character.is_on_floor() and climbing_started: + Transitioned.emit(self, "on foot") func ladder_movement(delta): var direction = Input.get_vector("move_down","move_up","move_left","move_right").x diff --git a/scripts/player_wall_running.gd b/scripts/player_wall_running.gd index 06783de..1997c03 100644 --- a/scripts/player_wall_running.gd +++ b/scripts/player_wall_running.gd @@ -16,7 +16,7 @@ func Physics_Update(delta): Transitioned.emit(self,"in air") func wall_jump(): - character.velocity += (Vector3(0,1,0) + character.wall_run_direction).normalized() * 15 + character.velocity += (Vector3(0,1,0) + character.wall_run_direction).normalized() * 15 * character.speed_modifiers() Transitioned.emit(self,"in air") func wall_run_movement(delta): @@ -27,4 +27,4 @@ func wall_run_movement(delta): Transitioned.emit(self,"in air") func wall_run_gravity(delta): - character.velocity.y -= 9.8 * .75 * delta + character.velocity.y -= 9.8 * delta