local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local Debris = game:GetService("Debris") local player = Players.LocalPlayer local camera = workspace.CurrentCamera local wingsuitStats = { Enabled = false, OnCooldown = false, Stamina = 100, MaxStamina = 100, MinSpeed = 40, MaxSpeed = 250, CurrentSpeed = 60, CooldownTime = 5, TPWalkSpeed = 1 } local grappleForce = 25 local maxDistance = 215 local targetPos = nil local cooldownGrapple = false local cooldownDash = false if not UserInputService.TouchEnabled then return end local screenGui = Instance.new("ScreenGui") screenGui.Name = "GrappleGui" screenGui.ResetOnSpawn = false screenGui.Parent = player:WaitForChild("PlayerGui") local staminaBarFrame = Instance.new("Frame") staminaBarFrame.Size = UDim2.new(0, 15, 0, 200) staminaBarFrame.Position = UDim2.new(1, -50, 0.5, -100) staminaBarFrame.BackgroundColor3 = Color3.fromRGB(0, 0, 0) staminaBarFrame.BackgroundTransparency = 0.5 staminaBarFrame.Visible = false staminaBarFrame.Parent = screenGui local staminaFill = Instance.new("Frame") staminaFill.Size = UDim2.new(1, 0, 1, 0) staminaFill.BackgroundColor3 = Color3.fromRGB(0, 255, 255) staminaFill.BorderSizePixel = 0 staminaFill.Parent = staminaBarFrame local cooldownLabel = Instance.new("TextLabel") cooldownLabel.Size = UDim2.new(0, 80, 0, 40) cooldownLabel.BackgroundTransparency = 1 cooldownLabel.TextColor3 = Color3.fromRGB(255, 50, 50) cooldownLabel.Font = Enum.Font.SourceSansBold cooldownLabel.TextSize = 25 cooldownLabel.Text = "" cooldownLabel.Visible = false cooldownLabel.Parent = screenGui local function makeDraggable(btn) local dragging, dragStart, startPos btn.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true dragStart = input.Position startPos = btn.Position end end) btn.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement) then local delta = input.Position - dragStart btn.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end) end local function createButton(name, pos, color, text) local btn = Instance.new("TextButton") btn.Name = name btn.Size = UDim2.new(0, 80, 0, 40) btn.Position = pos btn.BackgroundColor3 = color btn.Text = text btn.TextColor3 = Color3.new(1,1,1) btn.Font = Enum.Font.SourceSansBold btn.TextSize = 18 Instance.new("UICorner", btn).CornerRadius = UDim.new(0,10) btn.Parent = screenGui makeDraggable(btn) return btn end local fireBtn = createButton("Fire", UDim2.new(1, -100, 1, -150), Color3.fromRGB(50,50,50), "Fire") local dashBtn = createButton("Dash", UDim2.new(1, -190, 1, -150), Color3.fromRGB(50,50,50), "Dash") local wingsuitBtn = createButton("Wingsuit", UDim2.new(1, -280, 1, -150), Color3.fromRGB(50, 150, 50), "Wingsuit OFF") local crossV = Instance.new("Frame") crossV.Size = UDim2.new(0, 2, 0, 20); crossV.Position = UDim2.new(0.5, -1, 0.5, -10) crossV.BackgroundColor3 = Color3.new(1,1,1); crossV.Parent = screenGui local crossH = Instance.new("Frame") crossH.Size = UDim2.new(0, 20, 0, 2); crossH.Position = UDim2.new(0.5, -10, 0.5, -1) crossH.BackgroundColor3 = Color3.new(1,1,1); crossH.Parent = screenGui fireBtn.Activated:Connect(function() if cooldownGrapple or not targetPos then return end local char = player.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if not hrp then return end local direction = (targetPos - hrp.Position).Unit local bv = Instance.new("BodyVelocity") bv.MaxForce = Vector3.new(50000,50000,50000) bv.Velocity = direction * (grappleForce * 6) + Vector3.new(0, 30, 0) bv.Parent = hrp Debris:AddItem(bv, 0.15) cooldownGrapple = true task.delay(1, function() cooldownGrapple = false end) end) dashBtn.Activated:Connect(function() if cooldownDash then return end local char = player.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if not hrp then return end local bv = Instance.new("BodyVelocity") bv.MaxForce = Vector3.new(40000,40000,40000) bv.Velocity = camera.CFrame.LookVector * 60 + Vector3.new(0, 20, 0) bv.Parent = hrp Debris:AddItem(bv, 0.1) cooldownDash = true task.delay(2, function() cooldownDash = false end) end) wingsuitBtn.Activated:Connect(function() if wingsuitStats.OnCooldown then return end wingsuitStats.Enabled = not wingsuitStats.Enabled wingsuitBtn.Text = "Wingsuit " .. (wingsuitStats.Enabled and "ON" or "OFF") wingsuitBtn.BackgroundColor3 = wingsuitStats.Enabled and Color3.fromRGB(50, 200, 50) or Color3.fromRGB(50, 150, 50) staminaBarFrame.Visible = wingsuitStats.Enabled end) RunService.Heartbeat:Connect(function() local char = player.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") local hum = char and char:FindFirstChild("Humanoid") if not hrp or not hum then return end local rayParams = RaycastParams.new() rayParams.FilterDescendantsInstances = {char} local ray = workspace:Raycast(camera.CFrame.Position, camera.CFrame.LookVector * maxDistance, rayParams) if ray then targetPos = ray.Position crossV.BackgroundColor3 = Color3.new(1,0,0) crossH.BackgroundColor3 = Color3.new(1,0,0) else targetPos = nil crossV.BackgroundColor3 = Color3.new(1,1,1) crossH.BackgroundColor3 = Color3.new(1,1,1) end if hum.MoveDirection.Magnitude > 0 then hrp.CFrame = hrp.CFrame + (hum.MoveDirection * wingsuitStats.TPWalkSpeed) end if wingsuitStats.Enabled then local camLook = camera.CFrame.LookVector if camLook.Y < -0.1 then wingsuitStats.CurrentSpeed = math.min(wingsuitStats.CurrentSpeed + 2, wingsuitStats.MaxSpeed) wingsuitStats.Stamina = math.min(wingsuitStats.Stamina + 0.4, wingsuitStats.MaxStamina) elseif camLook.Y > 0.1 then wingsuitStats.CurrentSpeed = math.max(wingsuitStats.CurrentSpeed - 1.8, wingsuitStats.MinSpeed) wingsuitStats.Stamina = math.max(wingsuitStats.Stamina - 1.5, 0) end hrp.AssemblyLinearVelocity = camLook * wingsuitStats.CurrentSpeed staminaFill.Size = UDim2.new(1, 0, wingsuitStats.Stamina / wingsuitStats.MaxStamina, 0) staminaFill.Position = UDim2.new(0, 0, 1 - (wingsuitStats.Stamina / wingsuitStats.MaxStamina), 0) if wingsuitStats.Stamina <= 0 then wingsuitStats.Enabled = false wingsuitStats.OnCooldown = true staminaBarFrame.Visible = false wingsuitBtn.Text = "COOLDOWN" wingsuitBtn.BackgroundColor3 = Color3.fromRGB(150, 50, 50) cooldownLabel.Visible = true cooldownLabel.Position = UDim2.new(wingsuitBtn.Position.X.Scale, wingsuitBtn.Position.X.Offset, wingsuitBtn.Position.Y.Scale, wingsuitBtn.Position.Y.Offset - 45) task.spawn(function() for i = 5, 1, -1 do cooldownLabel.Text = i .. "s" task.wait(1) end wingsuitStats.OnCooldown = false wingsuitStats.Stamina = 100 cooldownLabel.Visible = false wingsuitBtn.Text = "Wingsuit OFF" wingsuitBtn.BackgroundColor3 = Color3.fromRGB(50, 150, 50) end) end end hum.WalkSpeed = 16 workspace.Gravity = 40 end)