local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local player = Players.LocalPlayer local character = player.Character or player.CharacterAdded:Wait() -- переменные для обновления local humanoid local hrp local camera = workspace.CurrentCamera -- ======================= НАСТРОЙКИ ======================= local KEY = Enum.KeyCode.Z local SETTINGS = { MOVE_SPEED = 40, JUMP_POWER = 60, TRAIL_INTERVAL = 0.12, FALL_ACCEL = 196, MAX_FALL_SPEED = 80, } local PROJ_SETTINGS = { SIZE = Vector3.new(2, 5, 1), COLOR = Color3.fromRGB(180, 70, 255), MATERIAL = Enum.Material.Neon, } local TRAIL_SETTINGS = { SIZE = Vector3.new(2, 5, 1), COLOR = Color3.fromRGB(150, 50, 200), MATERIAL = Enum.Material.Neon, } -- ======================= ПЕРЕМЕННЫЕ ======================= local isActive = false local projPart = nil local trailTimer = 0 local savedPositions = {} local savedTrails = {} local velocityY = 0 local canJump = true -- обновить ссылки на Humanoid и HRP local function setupCharacter(char) character = char humanoid = char:WaitForChild("Humanoid") hrp = char:WaitForChild("HumanoidRootPart") end setupCharacter(character) -- отслеживаем респавн player.CharacterAdded:Connect(function(char) setupCharacter(char) -- если способность была активна — завершить её корректно if isActive then endProjection() end end) -- создаёт физическую часть для проекции local function createProjPart(cframe) local p = Instance.new("Part", workspace) p.Size = PROJ_SETTINGS.SIZE p.CFrame = cframe p.Anchored = false p.CanCollide = true p.Material = PROJ_SETTINGS.MATERIAL p.Color = PROJ_SETTINGS.COLOR p.CustomPhysicalProperties = PhysicalProperties.new(0.5,0.3,0.5) p.Name = "ProjectionPart" return p end -- создаёт визуальный след (часть) local function createTrail(cframe) local t = Instance.new("Part", workspace) t.Size = TRAIL_SETTINGS.SIZE t.CFrame = cframe t.Anchored = true t.CanCollide = false t.Material = TRAIL_SETTINGS.MATERIAL t.Color = TRAIL_SETTINGS.COLOR t.Name = "ProjectionTrail" table.insert(savedTrails, t) return t end -- начало способности function startProjection() if isActive then return end if not humanoid or not hrp then return end isActive = true trailTimer = 0 velocityY = 0 canJump = true savedPositions = {} savedTrails = {} humanoid.WalkSpeed = 0 humanoid.JumpPower = 0 hrp.Anchored = true projPart = createProjPart(hrp.CFrame) end -- конец способности function endProjection() if not isActive then return end isActive = false if projPart then for _, cf in ipairs(savedPositions) do if hrp then hrp.CFrame = cf task.wait(0.03) end end end if humanoid and hrp then humanoid.WalkSpeed = 16 humanoid.JumpPower = 50 hrp.Anchored = false end if projPart then projPart:Destroy() projPart = nil end for _, trailPart in ipairs(savedTrails) do if trailPart and trailPart.Parent then trailPart:Destroy() end end savedTrails = {} savedPositions = {} end -- ввод UserInputService.InputBegan:Connect(function(input, gp) if gp then return end if input.KeyCode == KEY then startProjection() end end) UserInputService.InputEnded:Connect(function(input, gp) if gp then return end if input.KeyCode == KEY then endProjection() end end) -- главный цикл RunService.Heartbeat:Connect(function(delta) if not isActive or not projPart then return end local look = camera.CFrame.LookVector local right = camera.CFrame.RightVector local moveVec = Vector3.new() if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveVec = moveVec + Vector3.new(look.X, 0, look.Z) end if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveVec = moveVec - Vector3.new(look.X, 0, look.Z) end if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveVec = moveVec - Vector3.new(right.X, 0, right.Z) end if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveVec = moveVec + Vector3.new(right.X, 0, right.Z) end if moveVec.Magnitude > 0 then moveVec = moveVec.Unit * SETTINGS.MOVE_SPEED end if UserInputService:IsKeyDown(Enum.KeyCode.Space) and canJump then velocityY = SETTINGS.JUMP_POWER canJump = false end velocityY = velocityY - SETTINGS.FALL_ACCEL * delta if velocityY < -SETTINGS.MAX_FALL_SPEED then velocityY = -SETTINGS.MAX_FALL_SPEED end local newPos = projPart.Position + Vector3.new(moveVec.X * delta, velocityY * delta, moveVec.Z * delta) projPart.CFrame = CFrame.new(newPos) if projPart.Position.Y <= (hrp and hrp.Position.Y or 0) + 0.1 then velocityY = 0 canJump = true end trailTimer = trailTimer + delta if trailTimer >= SETTINGS.TRAIL_INTERVAL then table.insert(savedPositions, projPart.CFrame) createTrail(projPart.CFrame) trailTimer = 0 end end)