diff --git a/project/objects/player.tscn b/project/objects/player.tscn index c2b0bf38..6ffd2a7a 100644 --- a/project/objects/player.tscn +++ b/project/objects/player.tscn @@ -154,8 +154,8 @@ func property_move_toward(property : String, target, speed) -> float: set(property, new_value) return new_value -func _process(delta: float) -> void: - var speed : float = abs(body.velocity.x) + abs(body.velocity.z) +func _physics_process(delta: float) -> void: + var speed : float = Vector2(body.velocity.x, body.velocity.z).length() set(\"parameters/Speed/scale\", clamp(speed / full_speed, 0.0, 1.0)) var deceleration_distance : float = 0.0 if behaviour_tree.get_world_move_input().dot(body.velocity) > 0.0 else clamp(speed / min_skid_speed, 0.0, 1.0) property_move_toward(\"parameters/Decelerating/blend_amount\", deceleration_distance, delta * min_skid_speed) @@ -215,10 +215,10 @@ resource_name = "PlayerLedgeHangAction" script/source = "extends PlayerAction var wall_normal : Vector3 +var distance_from_hang_point : Vector3 func _enter() -> int: blackboard.anim.set(\"parameters/Ledge/request\", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE) - blackboard.anim.set(\"parameters/Air/blend_amount\", 0.0) wall_normal = body.get_wall_normal() wall_normal = Vector3(wall_normal.x, 0, wall_normal.z).normalized() blackboard.character.look_at(blackboard.character.global_position - wall_normal) @@ -226,29 +226,44 @@ func _enter() -> int: func _execute() -> int: if get_status() == Running: - var diff : Vector3 = blackboard.hang_ray.get_collision_point() - blackboard.hang_ray.global_position - body.velocity = Vector3.ZERO - body.global_position = body.global_position.lerp(body.global_position + diff, 0.25) - var input_dot_wall : float = wall_normal.dot(blackboard.get_world_move_input()) - if diff.length() < 0.05 and input_dot_wall < -0.5: - return Success - if body.is_on_floor() or input_dot_wall > 0.5: - blackboard.anim.set(\"parameters/Ledge/request\", AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT); - return Fail + maintain_animation_state() + distance_from_hang_point = blackboard.hang_ray.get_collision_point() - blackboard.hang_ray.global_position + update_physics_state() + return check_input_changes() return get_status() func _exit(): %LedgeHangTimer.start() + +func maintain_animation_state(): + blackboard.anim.set(\"parameters/Air/blend_amount\", 0.0) + blackboard.anim.set(\"parameters/Wall/blend_amount\", 0.0) + +func update_physics_state(): + body.velocity = Vector3.ZERO + body.global_position = body.global_position.lerp(body.global_position + distance_from_hang_point, 0.25) + +func check_input_changes(): + var input_dot_wall : float = wall_normal.dot(blackboard.get_world_move_input()) + if distance_from_hang_point.length() < 0.05 and input_dot_wall < -0.5: + return Success + if body.is_on_floor() or input_dot_wall > 0.5: + blackboard.anim.set(\"parameters/Ledge/request\", AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT); + return Fail + return get_status() " [sub_resource type="GDScript" id="GDScript_i8sra"] resource_name = "PlayerLedgeClimbAnimation" script/source = "extends PlayerAnimationAction -func _exit(): +func _execute() ->int: blackboard.anim.set(\"parameters/Wall/blend_amount\", 0.0) blackboard.anim.set(\"parameters/Air/blend_amount\", 0.0) - blackboard.anim.set(\"parameters/Ledge/request\", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT) + return get_status() + +func _exit(): + blackboard.anim.set(\"parameters/Ledge/request\", AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT) " [sub_resource type="GDScript" id="GDScript_nmc1l"] @@ -263,7 +278,7 @@ script/source = "extends PlayerAction func _enter() -> int: var flat_wall := Vector3(body.get_wall_normal().x, 0, body.get_wall_normal().z) var input_into_wall := blackboard.get_world_move_input().normalized().dot(body.get_wall_normal()) < -0.7 - if body.is_on_wall_only() and input_into_wall: + if body.is_on_wall_only() and input_into_wall and not blackboard.hang_ray.is_colliding(): if Input.is_action_just_pressed(\"jump\"): body.velocity = flat_wall * jump_normal_force body.velocity.y = jump_vertical_force @@ -300,7 +315,7 @@ func _enter() -> int: var flat_velocity := Vector2(body.velocity.x, body.velocity.z) var input_velocity_dot : float = blackboard.get_world_move_input().normalized().dot(body.velocity.normalized()) var ground_velocity := Vector3(body.velocity.x, 0, body.velocity.z) - if body.is_on_wall_only() and input_velocity_dot > 0.01 and ground_velocity.length() >= min_ground_speed and flat_velocity.length() > -body.velocity.y * 4.0: + if body.is_on_wall_only() and input_velocity_dot > 0.01 and ground_velocity.length() >= min_ground_speed and flat_velocity.length() > -body.velocity.y * 4.0 and not blackboard.hang_ray.is_colliding(): if Input.is_action_just_pressed(\"jump\") and run_time > min_run_time: var wall_flat := Vector3(body.get_wall_normal().x, 0, body.get_wall_normal().z) body.velocity = wall_flat * jump_normal_force + (ground_velocity + blackboard.get_world_move_input()).normalized() * jump_input_force * ground_velocity.length()