During slide function collider stretches up instead of going to the lower half of capsule

Godot Version

4.4

Question

` Im trying to implement a slide function that halves your collider and upon ending the slide it returns to normal

extends CharacterBody3D

Parametry ruchu

@export var speed: float = 5.0
@export var jump_force: float = 4.5
@export var gravity: float = 9.8

Przyspieszenie

@export var ground_acceleration: float = 20.0
@export var air_acceleration: float = 5.0
@export var ground_friction: float = 15.0
@export var air_friction: float = 1.0

Slide

@export var slide_speed_multiplier: float = 2.5
@export var slide_duration: float = 1.0
@export var slide_cooldown: float = 0.5
@export var slide_height: float = 0.5
@export var slide_camera_offset: float = -0.5

Wall jump

@export var wall_jump_force: float = 6.0
@export var wall_jump_cooldown: float = 0.3
@export var wall_jump_horizontal_multiplier: float = 1.2

Czułość myszy

@export var mouse_sensitivity: float = 0.002

Referencje

@onready var camera: Camera3D = $Camera3D
@onready var collision_shape: CollisionShape3D = $CollisionShape3D

Zmienne wewnętrzne

var original_height: float
var original_camera_height: float = 0.8
var camera_pitch: float = 0.0
var last_wall_normal: Vector3 = Vector3.ZERO
var wall_jump_timer: float = 0.0
var is_sliding: bool = false
var slide_timer: float = 0.0
var slide_cooldown_timer: float = 0.0

func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
# Ustawienie początkowych wartości na podstawie collidera
original_height = collision_shape.shape.height
original_camera_height = camera.position.y
print("camera: ", original_camera_height)

func _input(event):
if event is InputEventMouseMotion:
rotate_y(-event.relative.x * mouse_sensitivity)
camera_pitch += event.relative.y * mouse_sensitivity
camera_pitch = clamp(camera_pitch, deg_to_rad(-90), deg_to_rad(90))
camera.rotation.x = -camera_pitch

func _physics_process(delta):
# Aktualizacja timerów
wall_jump_timer = max(wall_jump_timer - delta, 0.0)
slide_cooldown_timer = max(slide_cooldown_timer - delta, 0.0)

# Obsługa slide'u
if is_sliding:
	slide_timer -= delta
	if slide_timer <= 0 or not is_on_floor():
		end_slide()

# Wejście w slide
if Input.is_action_just_pressed("slide") and is_on_floor() and slide_cooldown_timer <= 0 and not is_sliding:
	start_slide()

# Grawitacja
if not is_on_floor():
	velocity.y -= gravity * delta

# Kolizje ze ścianami
var is_on_wall = false
if get_last_slide_collision() != null:
	last_wall_normal = get_last_slide_collision().get_normal()
	is_on_wall = last_wall_normal.dot(Vector3.UP) < 0.1 && !is_on_floor()

# Skoki
if Input.is_action_just_pressed("ui_accept"):
	if is_on_floor() and not is_sliding:
		velocity.y = jump_force
	elif is_on_wall && wall_jump_timer <= 0.0:
		var wall_jump_dir = last_wall_normal * wall_jump_horizontal_multiplier
		velocity = Vector3(
			wall_jump_dir.x * wall_jump_force,
			jump_force,
			wall_jump_dir.z * wall_jump_force
		)
		wall_jump_timer = wall_jump_cooldown

# Ruch poziomy
var input_dir = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()

if not is_sliding:
	var target_velocity = direction * speed
	var horizontal_velocity = Vector2(velocity.x, velocity.z)
	var target_horizontal = Vector2(target_velocity.x, target_velocity.z)
	
	if input_dir != Vector2.ZERO:
		var accel = ground_acceleration if is_on_floor() else air_acceleration
		horizontal_velocity = horizontal_velocity.move_toward(target_horizontal, accel * delta)
	else:
		var friction = ground_friction if is_on_floor() else air_friction
		horizontal_velocity = horizontal_velocity.move_toward(Vector2.ZERO, friction * delta)
	
	velocity.x = horizontal_velocity.x
	velocity.z = horizontal_velocity.y

move_and_slide()

func start_slide():
is_sliding = true
slide_timer = slide_duration
slide_cooldown_timer = slide_cooldown

# Zmiana wysokości collidera
var shape = collision_shape.shape.duplicate()
shape.height = slide_height
collision_shape.shape = shape
collision_shape.position.y = slide_height / 2 # Środek geometryczny

# Dostosowanie kameryw
camera.position.y = original_camera_height + slide_camera_offset


# Zastosowanie przyspieszenia
var current_speed = Vector3(velocity.x, 0, velocity.z).length()
var boost = max(speed * slide_speed_multiplier, current_speed)
velocity = velocity.normalized() * boost

func end_slide():
is_sliding = false

# Przywrócenie oryginalnego collidera
var shape = collision_shape.shape.duplicate()
shape.height = original_height
collision_shape.shape = shape
collision_shape.position.y = original_height / 2  # Środek geometryczny
print("po: ", original_height)

# Przywrócenie kamery
camera.position.y = original_camera_height
print("przywrocono kamere do pozycji: ", original_camera_height)

# Sprawdzenie przestrzeni nad głową
var space_check = get_world_3d().direct_space_state
var query = PhysicsRayQueryParameters3D.create(
	global_position + Vector3.UP * 0.1,  # Offset od podłogi
	global_position + Vector3.UP * original_height,
	0xFFFFFFFF  # Maska kolizji
)
if not space_check.intersect_ray(query):
	velocity.y = 0  # Reset prędkości Y
	move_and_collide(Vector3.UP * 0.2)  # Delikatne podniesienie

func _unhandled_input(event):
if event.is_action_pressed(“ui_cancel”):
get_tree().quit()

Could you help me fix this code?
`