local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local Debris = game:GetService("Debris") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") -- Variables local humanoid, rootPart local lastDashTime = 0 local connections = {} local cooldownTime = 4 local isOnCooldown = false -- Create ScreenGui local screenGui = Instance.new("ScreenGui") screenGui.Name = "DashGui" screenGui.ResetOnSpawn = false screenGui.Parent = playerGui -- Create the Dash button (higher position) local dashButton = Instance.new("TextButton") dashButton.Name = "DashButton" dashButton.Size = UDim2.new(0, 100, 0, 50) dashButton.Position = UDim2.new(1, -110, 1, -240) -- Higher above the Jump button dashButton.BackgroundColor3 = Color3.fromRGB(0, 170, 255) dashButton.TextColor3 = Color3.fromRGB(255, 255, 255) dashButton.Text = "Dash" dashButton.Font = Enum.Font.GothamBold dashButton.TextSize = 24 dashButton.BorderSizePixel = 2 dashButton.BorderColor3 = Color3.fromRGB(0, 0, 0) dashButton.BackgroundTransparency = 0.3 dashButton.Parent = screenGui -- Update button appearance during cooldown local function updateButton(cooldownLeft) if cooldownLeft > 0 then dashButton.Text = string.format("Dash (%.1fs)", cooldownLeft) dashButton.BackgroundTransparency = 0.7 dashButton.Active = false else dashButton.Text = "Dash" dashButton.BackgroundTransparency = 0.3 dashButton.Active = true isOnCooldown = false end end -- Setup character function local function setupCharacter(char) -- Disconnect old connections for _, conn in ipairs(connections) do conn:Disconnect() end connections = {} local hum = char:WaitForChild("Humanoid") local rootp = char:WaitForChild("HumanoidRootPart") humanoid = hum rootPart = rootp -- Connect StateChanged for no fall damage (extended window for longer dash) local stateConn = hum.StateChanged:Connect(function(oldState, newState) if newState == Enum.HumanoidStateType.Landed and tick() - lastDashTime < 5 then hum.Health = hum.MaxHealth end end) table.insert(connections, stateConn) end -- Dash function local function performDash() if isOnCooldown then return end isOnCooldown = true lastDashTime = tick() -- Get the direction the player is facing/moving local moveDirection = humanoid.MoveDirection if moveDirection.Magnitude == 0 then local camera = workspace.CurrentCamera moveDirection = (camera.CFrame.LookVector * Vector3.new(1, 0, 1)).Unit end if moveDirection.Magnitude > 0 then moveDirection = moveDirection.Unit -- Target position 60 studs forward (much farther!) local targetPosition = rootPart.Position + (moveDirection * 60) -- BodyPosition for precise, smooth dash with height hold local bodyPosition = Instance.new("BodyPosition") bodyPosition.MaxForce = Vector3.new(400000, 200000, 400000) bodyPosition.Position = targetPosition bodyPosition.P = 15000 bodyPosition.D = 2000 bodyPosition.Parent = rootPart -- Longer duration for epic 60-stud dash Debris:AddItem(bodyPosition, 0.8) -- DASH EFFECT: Trail (extended for longer dash) local attach0 = Instance.new("Attachment") attach0.Name = "DashAttach0" attach0.Position = Vector3.new(0, 0.5, 0.5) attach0.Parent = rootPart local attach1 = Instance.new("Attachment") attach1.Name = "DashAttach1" attach1.Position = Vector3.new(0, -0.5, -1.5) attach1.Parent = rootPart local trail = Instance.new("Trail") trail.Attachment0 = attach0 trail.Attachment1 = attach1 trail.Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, Color3.fromRGB(135, 206, 250)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(70, 130, 255)), ColorSequenceKeypoint.new(1, Color3.fromRGB(0, 100, 200)) }) trail.Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 0.1), NumberSequenceKeypoint.new(0.7, 0.3), NumberSequenceKeypoint.new(1, 1) }) trail.Lifetime = 0.8 -- Matches dash duration trail.MinLength = 0.1 trail.FaceCamera = true trail.Parent = rootPart Debris:AddItem(trail, 1.2) Debris:AddItem(attach0, 1.2) Debris:AddItem(attach1, 1.2) -- AIR EFFECT: Particle burst (more intense for long dash) local effectAttach = Instance.new("Attachment") effectAttach.Position = Vector3.new(0, 0, -1) effectAttach.Parent = rootPart local pe = Instance.new("ParticleEmitter") pe.Texture = "rbxasset://textures/particles/smoke_main.dds" pe.Lifetime = NumberRange.new(0.3, 0.7) pe.Rate = 0 pe.SpreadAngle = Vector2.new(90, 90) pe.Speed = NumberRange.new(8, 20) pe.VelocityInheritance = 0.4 pe.Acceleration = Vector3.new(0, -100, 0) pe.Color = ColorSequence.new(Color3.fromRGB(200, 220, 255)) pe.Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 0.4), NumberSequenceKeypoint.new(1, 1) }) pe.LightEmission = 0.3 pe.Parent = effectAttach -- Non-blocking burst emit (more particles) spawn(function() pe:Emit(40) task.wait(0.15) pe:Emit(30) task.wait(0.15) pe:Emit(25) task.wait(0.2) pe:Emit(20) end) Debris:AddItem(effectAttach, 2) end -- Non-blocking cooldown timer spawn(function() for i = cooldownTime, 0, -0.1 do updateButton(i) task.wait(0.1) end updateButton(0) end) end -- Connect button click dashButton.MouseButton1Click:Connect(performDash) -- Optional: Q key to dash UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end if input.KeyCode == Enum.KeyCode.Q then performDash() end end) -- Handle character setup player.CharacterAdded:Connect(setupCharacter) if player.Character then setupCharacter(player.Character) end -- Initial button state updateButton(0)