extends Node class_name StateSlide var machine: MovementStateMachine var params: MovementParams: get: return machine.params var elapsed: float = 0.0 func enter(_data: Dictionary = {}) -> void: elapsed = 0.0 machine.register_chain_mechanic("slide") # Lower player capsule var player_node = machine.player var shape: CapsuleShape3D = machine.player.shape_owner_get_shape(0, 0) if shape: shape.height = shape.height * 0.5 func exit() -> void: pass func update(delta: float) -> void: elapsed += delta var vel: Vector3 = machine.player.velocity var forward: Vector3 = -machine.player.global_transform.basis.z if forward.length_squared() > 1.0: forward = forward.normalized() vel.x = forward.x * params.slide_speed * machine.get_effective_speed(1.0) vel.z = forward.z * params.slide_speed * machine.get_effective_speed(1.0) vel.x *= pow(params.slide_friction, delta) vel.z *= pow(params.slide_friction, delta) machine.player.velocity = vel machine.player.move_and_slide() if machine.player.is_on_floor(): machine.on_ground = true var speed := Vector3(vel.x, 0.0, vel.z).length() if speed < params.slide_min_speed or elapsed > params.slide_duration: var end_shape: CapsuleShape3D = machine.player.shape_owner_get_shape(0, 0) if end_shape: end_shape.height = end_shape.height * 2.0 machine.register_chain_mechanic("slide_end") machine.switch_to("ground") return else: var fall_shape: CapsuleShape3D = machine.player.shape_owner_get_shape(0, 0) if fall_shape: fall_shape.height = fall_shape.height * 2.0 machine.on_ground = false machine.switch_to("air") if not machine.input_crouch or not machine.input_sprint: var cancel_shape: CapsuleShape3D = machine.player.shape_owner_get_shape(0, 0) if cancel_shape: cancel_shape.height = cancel_shape.height * 2.0 machine.register_chain_mechanic("slide_cancel") machine.switch_to("ground")