-- [[ JOYSTICK OPTIMISÉ - NO CAMERA GLITCH ]] local Players = game:GetService("Players") local LP = Players.LocalPlayer local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local Camera = workspace.CurrentCamera -- Nettoyage local oldUI = LP.PlayerGui:FindFirstChild("PremiumControlsFix") if oldUI then oldUI:Destroy() end local UI = Instance.new("ScreenGui", LP.PlayerGui) UI.Name = "PremiumControlsFix" UI.ResetOnSpawn = false UI.DisplayOrder = 100 -- --- CONTENEUR DE CAPTURE (BLOQUE LA CAMÉRA) --- local CaptureZone = Instance.new("TextButton", UI) CaptureZone.Size = UDim2.new(0, 200, 0, 200) CaptureZone.Position = UDim2.new(0.15, -100, 0.75, -100) CaptureZone.BackgroundTransparency = 1 CaptureZone.Text = "" -- Important pour capturer le tactile -- --- VISUEL DU JOYSTICK --- local JoyMain = Instance.new("Frame", CaptureZone) JoyMain.Size = UDim2.new(0, 120, 0, 120) JoyMain.Position = UDim2.new(0.5, -60, 0.5, -60) JoyMain.BackgroundColor3 = Color3.fromRGB(30, 30, 30) JoyMain.BackgroundTransparency = 0.5 local corner = Instance.new("UICorner", JoyMain) corner.CornerRadius = UDim.new(1, 0) local Stick = Instance.new("Frame", JoyMain) Stick.Size = UDim2.new(0, 50, 0, 50) Stick.Position = UDim2.new(0.5, -25, 0.5, -25) Stick.BackgroundColor3 = Color3.new(1, 1, 1) Instance.new("UICorner", Stick).CornerRadius = UDim.new(1, 0) -- --- BOUTON SAUT (INDÉPENDANT) --- local JumpBtn = Instance.new("TextButton", UI) JumpBtn.Size = UDim2.new(0, 80, 0, 80) JumpBtn.Position = UDim2.new(0.85, -40, 0.75, -40) JumpBtn.BackgroundColor3 = Color3.fromRGB(40, 40, 40) JumpBtn.BackgroundTransparency = 0.4 JumpBtn.Text = "JUMP" JumpBtn.TextColor3 = Color3.new(1, 1, 1) JumpBtn.Font = Enum.Font.GothamBold Instance.new("UICorner", JumpBtn).CornerRadius = UDim.new(1, 0) JumpBtn.MouseButton1Click:Connect(function() if LP.Character and LP.Character:FindFirstChild("Humanoid") then LP.Character.Humanoid.Jump = true end end) -- --- LOGIQUE DE MOUVEMENT --- local isDragging = false local inputPos = Vector2.new(0,0) CaptureZone.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then isDragging = true end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then isDragging = false Stick:TweenPosition(UDim2.new(0.5, -25, 0.5, -25), "Out", "Quad", 0.1, true) end end) RunService.RenderStepped:Connect(function() local char = LP.Character local hum = char and char:FindFirstChild("Humanoid") if isDragging and hum then local mousePos = UserInputService:GetMouseLocation() local center = JoyMain.AbsolutePosition + (JoyMain.AbsoluteSize / 2) local diff = Vector2.new(mousePos.X - center.X, mousePos.Y - center.Y) local dist = math.min(diff.Magnitude, 55) local angle = math.atan2(diff.Y, diff.X) -- Update visuel du stick Stick.Position = UDim2.new(0.5, (math.cos(angle) * dist) - 25, 0.5, (math.sin(angle) * dist) - 25) -- Calcul de direction RELATIF à la caméra local moveDir = (Camera.CFrame.RightVector * math.cos(angle)) + (Camera.CFrame.LookVector * -math.sin(angle)) hum:Move(Vector3.new(moveDir.X, 0, moveDir.Z), false) end end)