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()