-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local LocalPlayer = Players.LocalPlayer local Camera = workspace.CurrentCamera local Character = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait() local Torso = Character:WaitForChild("Torso") local RightArm = Character:WaitForChild("Right Arm") local LeftArm = Character:WaitForChild("Left Arm") local RightLeg = Character:WaitForChild("Right Leg") local LeftLeg = Character:WaitForChild("Left Leg") -- Prevent unanchored parts from going to sleep settings().Physics.AllowSleep = false -- Step 1: Break character welds locally to take full ownership of limbs local joints = {"Right Shoulder", "Left Shoulder", "Right Hip", "Left Hip"} for _, jointName in pairs(joints) do local joint = Character:FindFirstChild(jointName, true) if joint then joint:Destroy() end end -- Step 2: Create BodyPosition forces for physical network replication local function createForce(part) part.Velocity = Vector3.new(0, 30, 0) local bodyPos = Instance.new("BodyPosition") bodyPos.MaxForce = Vector3.new(math.huge, math.huge, math.huge) bodyPos.P = 12000 bodyPos.Parent = part return bodyPos end local rightHandForce = createForce(RightArm) local leftHandForce = createForce(LeftArm) local rightLegForce = createForce(RightLeg) local leftLegForce = createForce(LeftLeg) -- Step 3: Create Mobile UI Touch Joysticks local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "VRJoystickGui" ScreenGui.ResetOnSpawn = false ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") local function buildJoystick(name, positionX) local Background = Instance.new("Frame") Background.Name = name .."_Bg" Background.Size = UDim2.new(0, 110, 0, 110) Background.Position = positionX Background.BackgroundColor3 = Color3.fromRGB(0, 0, 0) Background.BackgroundTransparency = 0.6 Background.BorderSizePixel = 0 local Corner = Instance.new("UICorner") Corner.CornerRadius = UDim.new(1, 0) Corner.Parent = Background local Stick = Instance.new("ImageButton") Stick.Name = "Stick" Stick.Size = UDim2.new(0, 45, 0, 45) Stick.Position = UDim2.new(0.5, -22, 0.5, -22) Stick.BackgroundColor3 = Color3.fromRGB(255, 255, 255) Stick.BackgroundTransparency = 0.2 local StickCorner = Instance.new("UICorner") StickCorner.CornerRadius = UDim.new(1, 0) StickCorner.Parent = Stick Stick.Parent = Background Background.Parent = ScreenGui local dragging = false local inputObject = nil local offset = Vector2.new(0, 0) Stick.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then dragging = true inputObject = input end end) UserInputService.InputChanged:Connect(function(input) if dragging and input == inputObject then local center = Background.AbsolutePosition + (Background.AbsoluteSize / 2) local inputPos = Vector2.new(input.Position.X, input.Position.Y) local direction = inputPos - center local distance = math.clamp(direction.Magnitude, 0, 45) local unitDir = direction.Magnitude > 0 and direction.Unit or Vector2.new(0, 0) Stick.Position = UDim2.new(0.5, (unitDir.X * distance) - 22, 0.5, (unitDir.Y * distance) - 22) offset = unitDir * (distance / 45) end end) UserInputService.InputEnded:Connect(function(input) if input == inputObject then dragging = false Stick.Position = UDim2.new(0.5, -22, 0.5, -22) offset = Vector2.new(0, 0) end end) return function() return offset end end local getLeftOffset = buildJoystick("LeftHand", UDim2.new(0.05, 0, 0.65, 0)) local getRightOffset = buildJoystick("RightHand", UDim2.new(0.80, 0, 0.65, 0)) -- Step 4: Tracking, Idle Sway, & Leg Physics Loop RunService.RenderStepped:Connect(function() if Character and Torso and RightArm and LeftArm and RightLeg and LeftLeg then -- FIXED: Focus purely on flat horizontal directions to kill the floor-staring bug local flatCamLook = Vector3.new(Camera.CFrame.LookVector.X, 0, Camera.CFrame.LookVector.Z).Unit local rightVector = Camera.CFrame.RightVector local leftJoy = getLeftOffset() local rightJoy = getRightOffset() -- Organic micro-sway vectors for realism when idle local currentTime = tick() local leftIdleX = math.sin(currentTime * 2) * 0.15 local leftIdleY = math.cos(currentTime * 2.5) * 0.12 local rightIdleX = math.cos(currentTime * 1.8) * 0.15 local rightIdleY = math.sin(currentTime * 2.2) * 0.12 -- Map joystick offsets + idle movement values to target coordinates local leftTargetPos = Torso.Position + (flatCamLook * 1.5) + (rightVector * -1.2) + Vector3.new((leftJoy.X * 1.5) + leftIdleX, (-leftJoy.Y * 1.5) + leftIdleY, 0) local rightTargetPos = Torso.Position + (flatCamLook * 1.5) + (rightVector * 1.2) + Vector3.new((rightJoy.X * 1.5) + rightIdleX, (-rightJoy.Y * 1.5) + rightIdleY, 0) rightHandForce.Position = rightTargetPos leftHandForce.Position = leftTargetPos -- Step 5: Procedural Floaty Leg Walking Physics local cycle = math.sin(tick() * 12) * 1.2 local isMoving = Torso.Velocity.Magnitude > 2 if isMoving then rightLegForce.Position = Torso.Position + (flatCamLook * cycle) + (rightVector * 0.5) - Vector3.new(0, 2.8, 0) leftLegForce.Position = Torso.Position + (flatCamLook * -cycle) + (rightVector * -0.5) - Vector3.new(0, 2.8, 0) else rightLegForce.Position = Torso.Position + (rightVector * 0.5) - Vector3.new(0, 3, 0) leftLegForce.Position = Torso.Position + (rightVector * -0.5) - Vector3.new(0, 3, 0) end end end)