Files
2026-07-21 00:27:17 +07:00

60 lines
2.2 KiB
GDScript

extends State
class_name DashState
var stateName : String = "Dash"
var cR : CharacterBody3D
var dash_timer : float = 0.0
func enter(charRef : CharacterBody3D):
cR = charRef
# 1. Задаем таймер длительности дэша из настроек игрока
dash_timer = cR.dash_duration
cR.dash_cooldown_timer = cR.dash_cooldown
cR.is_dashing = true
# 2. Определяем направление рывка
# Если игрок бежал — дэшим в сторону бега. Если стоял — строго вперед, куда смотрит камера
cR.dash_direction = cR.moveDirection
if cR.dash_direction == Vector3.ZERO:
cR.dash_direction = -cR.camHolder.global_transform.basis.z
cR.dash_direction.y = 0 # Чтобы не улетать в небо
cR.dash_direction = cR.dash_direction.normalized()
# 3. Включаем сочный эффект FOV на камере игрока
if cR.player_camera:
var tween = create_tween()
tween.tween_property(cR.player_camera, "fov", cR.normal_fov + 15.0, 0.1)
func physics_update(delta : float):
# Отсчитываем время действия дэша
dash_timer -= delta
if dash_timer <= 0:
# Рывок окончен! Возвращаем FOV камеры назад
cR.is_dashing = false
if cR.player_camera:
var tween = create_tween()
tween.tween_property(cR.player_camera, "fov", cR.normal_fov, 0.15)
# Плавно переходим обратно в ходьбу, бег или воздух в зависимости от того, где мы оказались
if cR.is_on_floor():
if cR.walkOrRun == "RunState":
transitioned.emit(self, "RunState")
else:
transitioned.emit(self, "WalkState")
else:
transitioned.emit(self, "InairState")
return
# Принудительно толкаем физическое тело игрока во время рывка
cR.velocity.x = cR.dash_direction.x * cR.dash_speed
cR.velocity.z = cR.dash_direction.z * cR.dash_speed
# Применяем гравитацию (опционально, чтобы игрок мог дэшиться в воздухе и плавно падать)
cR.gravityApply(delta)
cR.modifyPhysicsProperties()