
KeylessUniversal

-- 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)
endNo comments yet for this script.



