-- MOBILE JOYSTICK 8 HƯỚNG -- MAX SPEED + DEADZONE UI -- FIX FLY (KHÔNG CHẶN BAY LÊN/XUỐNG) local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UIS = game:GetService("UserInputService") local Workspace = game:GetService("Workspace") local player = Players.LocalPlayer local camera = Workspace.CurrentCamera ------------------------------------------------- -- DEADZONE ------------------------------------------------- local DEADZONE = 0.08 ------------------------------------------------- -- UI (DRAGGABLE) ------------------------------------------------- local gui = Instance.new("ScreenGui") gui.Name = "DeadzoneUI" gui.ResetOnSpawn = false gui.Parent = player:WaitForChild("PlayerGui") local frame = Instance.new("Frame") frame.Size = UDim2.fromOffset(220, 120) frame.Position = UDim2.fromScale(0.05, 0.6) frame.BackgroundColor3 = Color3.fromRGB(25, 25, 25) frame.BackgroundTransparency = 0.05 frame.BorderSizePixel = 0 frame.Parent = gui frame.Active = true Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 14) local title = Instance.new("TextLabel") title.Size = UDim2.new(1, 0, 0, 32) title.BackgroundTransparency = 1 title.Text = "Deadzone Setting" title.TextColor3 = Color3.new(1,1,1) title.Font = Enum.Font.GothamBold title.TextSize = 14 title.Parent = frame local box = Instance.new("TextBox") box.Size = UDim2.new(1, -20, 0, 36) box.Position = UDim2.fromOffset(10, 40) box.BackgroundColor3 = Color3.fromRGB(40, 40, 40) box.TextColor3 = Color3.new(1,1,1) box.PlaceholderText = "Deadzone (0.00 - 0.5)" box.Text = tostring(DEADZONE) box.ClearTextOnFocus = false box.Font = Enum.Font.Gotham box.TextSize = 14 box.Parent = frame Instance.new("UICorner", box).CornerRadius = UDim.new(0,10) local hint = Instance.new("TextLabel") hint.Size = UDim2.new(1, -20, 0, 24) hint.Position = UDim2.fromOffset(10, 82) hint.BackgroundTransparency = 1 hint.Text = "Drag UI • Fly safe" hint.TextColor3 = Color3.fromRGB(180,180,180) hint.Font = Enum.Font.Gotham hint.TextSize = 12 hint.Parent = frame -- Drag UI do local dragging, dragStart, startPos frame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = frame.Position end end) frame.InputChanged:Connect(function(input) if dragging and input.UserInputType == Enum.UserInputType.Touch then local delta = input.Position - dragStart frame.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end end) UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) end box.FocusLost:Connect(function() local v = tonumber(box.Text) if v then DEADZONE = math.clamp(v, 0, 0.5) box.Text = string.format("%.3f", DEADZONE) end end) ------------------------------------------------- -- SNAP 8 HƯỚNG (GIỮ TRỤC Y) ------------------------------------------------- local function snap8CameraPreserveY(vec) if vec.Magnitude < DEADZONE then return Vector3.zero end -- giữ Y nếu đang bay local y = vec.Y -- xử lý X/Z theo camera local camForward = Vector3.new(camera.CFrame.LookVector.X, 0, camera.CFrame.LookVector.Z).Unit local camRight = Vector3.new(camera.CFrame.RightVector.X, 0, camera.CFrame.RightVector.Z).Unit local localX = vec:Dot(camRight) local localZ = vec:Dot(camForward) local angle = math.atan2(localZ, localX) local snapped = math.round(angle / (math.pi / 4)) * (math.pi / 4) local flatDir = camRight * math.cos(snapped) + camForward * math.sin(snapped) -- ghép lại Y return Vector3.new(flatDir.X, y, flatDir.Z) end ------------------------------------------------- -- APPLY MOVE ------------------------------------------------- local function onCharacter(char) local humanoid = char:WaitForChild("Humanoid") RunService.RenderStepped:Connect(function() local raw = humanoid.MoveDirection if raw.Magnitude == 0 then return end local dir = snap8CameraPreserveY(raw) if dir.Magnitude > 0 then humanoid:Move(dir, false) -- không xoay camera, không phá fly end end) end player.CharacterAdded:Connect(onCharacter) if player.Character then onCharacter(player.Character) end