-- SharkFly LocalScript (fly only) -- Place in StarterPlayerScripts local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local Player = Players.LocalPlayer if not Player then warn("Script must run as a LocalScript (place in StarterPlayerScripts or StarterGui).") return end local playerGui = Player:WaitForChild("PlayerGui", 5) if not playerGui then warn("PlayerGui not found.") return end -- GUI local gui = Instance.new("ScreenGui") gui.Name = "SharkFlyGUI" gui.ResetOnSpawn = false gui.Parent = playerGui local function makeFrame(props) local f = Instance.new("Frame") f.Size = props.Size or UDim2.new(0,300,0,200) f.Position = props.Position or UDim2.new(0.02,0,0.02,0) f.BackgroundColor3 = props.BackgroundColor3 or Color3.fromRGB(30,30,30) f.BorderSizePixel = 0 f.Parent = gui return f end local main = makeFrame({Size=UDim2.new(0,320,0,200)}) local title = Instance.new("TextLabel", main) title.Size = UDim2.new(1,0,0,28) title.BackgroundTransparency = 1 title.Text = "Fly Script — E to toggle" title.TextColor3 = Color3.fromRGB(255,255,255) title.TextScaled = true local status = Instance.new("TextLabel", main) status.Size = UDim2.new(1,0,0,22) status.Position = UDim2.new(0,0,0,28) status.BackgroundTransparency = 1 status.Text = "Status: OFF" status.TextColor3 = Color3.fromRGB(200,200,200) status.TextScaled = true local speedLabel = Instance.new("TextLabel", main) speedLabel.Size = UDim2.new(0.5, -10, 0, 20) speedLabel.Position = UDim2.new(0, 8, 0, 52) speedLabel.BackgroundTransparency = 1 speedLabel.Text = "Speed:" speedLabel.TextColor3 = Color3.fromRGB(200,200,200) speedLabel.TextXAlignment = Enum.TextXAlignment.Left local speedBox = Instance.new("TextBox", main) speedBox.Size = UDim2.new(0.5, -16, 0, 24) speedBox.Position = UDim2.new(0.5, 0, 0, 50) speedBox.Text = "50" speedBox.ClearTextOnFocus = false speedBox.TextScaled = true speedBox.TextColor3 = Color3.fromRGB(0,0,0) speedBox.BackgroundColor3 = Color3.fromRGB(230,230,230) speedBox.BorderSizePixel = 0 speedBox.PlaceholderText = "positive number" local toggleBtn = Instance.new("TextButton", main) toggleBtn.Size = UDim2.new(0,110,0,34) toggleBtn.Position = UDim2.new(0.05,0,1,-48) toggleBtn.Text = "Enable" toggleBtn.BackgroundColor3 = Color3.fromRGB(50,120,50) toggleBtn.TextColor3 = Color3.fromRGB(255,255,255) toggleBtn.BorderSizePixel = 0 local unloadBtn = Instance.new("TextButton", main) unloadBtn.Size = UDim2.new(0,110,0,34) unloadBtn.Position = UDim2.new(0.5,0,1,-48) unloadBtn.Text = "Unload" unloadBtn.BackgroundColor3 = Color3.fromRGB(120,40,40) unloadBtn.TextColor3 = Color3.fromRGB(255,255,255) unloadBtn.BorderSizePixel = 0 main.Active = true main.Draggable = true -- state local flySpeed = 50 local flying = false local bv, bg, renderConn local function setStatus() status.Text = "Status: " .. (flying and "ON" or "OFF") speedBox.Text = tostring(math.floor(flySpeed)) toggleBtn.Text = (flying and "Disable" or "Enable") toggleBtn.BackgroundColor3 = (flying and Color3.fromRGB(140,40,40) or Color3.fromRGB(50,120,50)) end local function enableFly(enable) local char = Player and Player.Character if not char or not char:FindFirstChild("HumanoidRootPart") then return end local hrp = char.HumanoidRootPart if enable then if bv and bv.Parent then bv:Destroy() end if bg and bg.Parent then bg:Destroy() end if renderConn then renderConn:Disconnect() renderConn = nil end bv = Instance.new("BodyVelocity") bv.MaxForce = Vector3.new(9e9,9e9,9e9) bv.Velocity = Vector3.new(0,0,0) bv.Parent = hrp bg = Instance.new("BodyGyro") bg.MaxTorque = Vector3.new(9e9,9e9,9e9) bg.P = 9e4 bg.Parent = hrp renderConn = RunService.RenderStepped:Connect(function() if not flying then return end local cam = workspace.CurrentCamera if not cam then return end local look = cam.CFrame.LookVector local dir = look if dir.Magnitude > 0 then dir = dir.Unit end local target = dir * flySpeed if target ~= target then target = Vector3.new(0,0,0) end bv.Velocity = target bg.CFrame = CFrame.new(hrp.Position, hrp.Position + cam.CFrame.LookVector) end) else if renderConn then renderConn:Disconnect() renderConn = nil end if bv and bv.Parent then bv:Destroy() end if bg and bg.Parent then bg:Destroy() end bv, bg = nil, nil end end toggleBtn.MouseButton1Click:Connect(function() flying = not flying enableFly(flying) setStatus() end) unloadBtn.MouseButton1Click:Connect(function() flying = false enableFly(false) if gui and gui.Parent then gui:Destroy() end end) local function parseAndSetSpeed(text) local n = tonumber(text) if not n or n <= 0 then speedBox.Text = tostring(math.floor(math.max(1, flySpeed))) return end if n > 1e8 then n = 1e8 end flySpeed = n setStatus() end speedBox.FocusLost:Connect(function(enterPressed) parseAndSetSpeed(speedBox.Text) end) speedBox:GetPropertyChangedSignal("Text"):Connect(function() local n = tonumber(speedBox.Text) if n and n > 0 then flySpeed = n end end) local keyConn = UserInputService.InputBegan:Connect(function(input, gp) if gp then return end if input.KeyCode == Enum.KeyCode.E then flying = not flying enableFly(flying) setStatus() end end) Players.PlayerRemoving:Connect(function(p) if p == Player then if renderConn then renderConn:Disconnect() end if bv and bv.Parent then bv:Destroy() end if bg and bg.Parent then bg:Destroy() end if gui and gui.Parent then gui:Destroy() end end end) setStatus()