-- [[ 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 ]] do local qot = queue_on_teleport or (syn and syn.queue_on_teleport) local checks = { { "getrawmetatable", getrawmetatable }, { "setreadonly", setreadonly }, { "newcclosure", newcclosure }, { "getnamecallmethod", getnamecallmethod }, { "getgc", getgc }, { "queue_on_teleport", qot }, } local missing, report = {}, "[VR Hands No-VR] UNC test:\n" for _, c in ipairs(checks) do local ok = type(c[2]) == "function" report = report .. (" [%s] %s\n"):format(ok and "+" or "-", c[1]) if not ok then table.insert(missing, c[1]) end end print(report) if #missing > 0 then warn("[VR Hands No-VR] Missing functions: " .. table.concat(missing, ", ")) warn("[VR Hands No-VR] Executor not supported - aborting (no teleport).") return end print("[VR Hands No-VR] UNC test passed - launching.") end local Players = game:GetService("Players") local TeleportService = game:GetService("TeleportService") local hrs = [==[ local VRService = game:GetService("VRService") local UIS = game:GetService("UserInputService") local RunService = game:GetService("RunService") local Players = game:GetService("Players") local identity = CFrame.identity do local mt = getrawmetatable(game) local oldIndex = mt.__index local oldNamecall = mt.__namecall setreadonly(mt, false) mt.__index = newcclosure(function(self, k) if k == "VREnabled" and (self == VRService or self == UIS) then return true end return oldIndex(self, k) end) mt.__namecall = newcclosure(function(self, ...) if self == VRService then local m = getnamecallmethod() if m == "GetUserCFrameEnabled" then return true end if m == "GetUserCFrame" then return identity end end return oldNamecall(self, ...) end) setreadonly(mt, true) end task.spawn(function() local function ensureFolder(p, n) local f = p:FindFirstChild(n) if not f then f = Instance.new("Folder"); f.Name = n; f.Parent = p end return f end local function ensurePart(p, n) local x = p:FindFirstChild(n) if not x then x = Instance.new("Part"); x.Name = n x.Anchored = true; x.CanCollide = false; x.Transparency = 1 x.Size = Vector3.new(1,1,1); x.Parent = p end return x end local function populate(cam) if not cam then return end ensurePart(ensureFolder(cam, "VRCoreEffectParts"), "Cursor") ensurePart(ensureFolder(cam, "VRCorePanelParts"), "BottomBar_Part") end populate(workspace.CurrentCamera) workspace:GetPropertyChangedSignal("CurrentCamera"):Connect(function() populate(workspace.CurrentCamera) end) local t0 = os.clock() while os.clock() - t0 < 30 do populate(workspace.CurrentCamera) task.wait(0.1) end end) _G.NoVR_HUD_Visible = true task.spawn(function() local lp = Players.LocalPlayer while not lp do task.wait() lp = Players.LocalPlayer end local uid = tostring(lp.UserId) local vrPlayers = workspace:WaitForChild("VRPlayers", 60) if not vrPlayers then warn("[NoVR] no VRPlayers") return end local rig = vrPlayers:WaitForChild(uid, 60) if not rig then warn("[NoVR] The server did not issue a rig") return end rig:WaitForChild("VRHead", 20) rig:WaitForChild("LeftHand", 20) rig:WaitForChild("RightHand", 20) local scaleVal = rig:FindFirstChild("VRScale") local cam = workspace.CurrentCamera local S = { reach = 0.55, spread = 0.34, height = -0.25, sens = 0.0025, moveK = 0.16, look = true, scale = 10, slowFactor = 0.3, } local ok, VRUtils = pcall(function() return require(lp.PlayerScripts.ClientLoader.PlayerModule.VRModule.VRUtils) end) if ok and type(VRUtils) == "table" then VRUtils.GetUserCFrame = function(uc, scale) scale = scale or cam.HeadScale if scale <= 1 then scale = math.max((scaleVal and scaleVal.Value or 1) * 60, 6) end if uc == Enum.UserCFrame.LeftHand then local c = CFrame.new(-S.spread, S.height, -S.reach) return c.Rotation + c.Position * scale elseif uc == Enum.UserCFrame.RightHand then local c = CFrame.new(S.spread, S.height, -S.reach) return c.Rotation + c.Position * scale end return identity end else warn("[NoVR] failed to intercept VRUtils") end local vrm, Input for _ = 1, 250 do for _, o in pairs(getgc(true)) do if type(o) == "table" and rawget(o,"HeadsetPart") ~= nil and rawget(o,"Input") ~= nil and rawget(o,"CharacterScale") ~= nil and rawget(o,"DataManager") ~= nil then vrm = o; Input = rawget(o,"Input"); break end end if Input then break end for _, o in pairs(getgc(true)) do if type(o) == "table" and rawget(o,"directionLateral") ~= nil and rawget(o,"rFist") ~= nil and rawget(o,"turnDirection") ~= nil then Input = o; break end end if Input then break end task.wait(0.1) end if not Input then warn("[NoVR] Input object not found - gestures will not work") end task.spawn(function() for _ = 1, 100 do pcall(function() RunService:UnbindFromRenderStep("Inputs") end) task.wait(0.1) end end) pcall(function() local pmMT = getrawmetatable(vrm.PropManager) if pmMT and rawget(pmMT, "GetBestGrabPartInRadius") then local orig = pmMT.GetBestGrabPartInRadius setreadonly(pmMT, false) pmMT.GetBestGrabPartInRadius = function(self, root, prox, radius, scale, ...) return orig(self, root, prox, (radius or 0) * 3.5, scale, ...) end setreadonly(pmMT, true) end local cmMT = getrawmetatable(vrm.CharacterManager) if cmMT and rawget(cmMT, "GetClosestCharacterInRadius") then local orig = cmMT.GetClosestCharacterInRadius setreadonly(cmMT, false) cmMT.GetClosestCharacterInRadius = function(self, pos, radius, ...) return orig(self, pos, (radius or 0) * 3.5, ...) end setreadonly(cmMT, true) end end) local function setScale(n) n = math.clamp(math.floor(n + 0.5), 1, 10) S.scale = n if scaleVal then pcall(function() scaleVal.Value = n / 10 end) end if vrm and vrm.DataManager and vrm.DataManager.SettingsManager then pcall(function() vrm.DataManager.SettingsManager:SetValue("vrscale", n) end) end end setScale(10) cam.HeadLocked = true local yaw, pitch do local lv = cam.CFrame.LookVector yaw = math.atan2(-lv.X, -lv.Z) pitch = math.asin(math.clamp(lv.Y, -1, 1)) end local camPos = cam.CFrame.Position local keys = {} local mouseDown = { L = false, R = false } local function setLook(v) S.look = v UIS.MouseBehavior = v and Enum.MouseBehavior.LockCenter or Enum.MouseBehavior.Default UIS.MouseIconEnabled = not v end setLook(true) -- ============ POSE LOCK SYSTEM ============ local poseData = { [Enum.KeyCode.R] = { name = "LeftPoint", side = "L", locked = false, held = false, apply = function() if Input then Input.lFist=1; Input.lIndex=0; Input.lThumb=1 end end, release = function() if Input then Input.lFist=0; Input.lIndex=0; Input.lThumb=0 end end }, [Enum.KeyCode.F] = { name = "LeftThumbsUp", side = "L", locked = false, held = false, apply = function() if Input then Input.lFist=1; Input.lIndex=1; Input.lThumb=1 end end, release = function() if Input then Input.lFist=0; Input.lIndex=0; Input.lThumb=0 end end }, [Enum.KeyCode.T] = { name = "RightPoint", side = "R", locked = false, held = false, apply = function() if Input then Input.rFist=1; Input.rIndex=0; Input.rThumb=1 end end, release = function() if Input then Input.rFist=0; Input.rIndex=0; Input.rThumb=0 end end }, [Enum.KeyCode.G] = { name = "RightThumbsUp", side = "R", locked = false, held = false, apply = function() if Input then Input.rFist=1; Input.rIndex=1; Input.rThumb=1 end end, release = function() if Input then Input.rFist=0; Input.rIndex=0; Input.rThumb=0 end end }, [Enum.KeyCode.One] = { name = "LeftFingerPoke", side = "L", locked = false, held = false, apply = function() if Input then Input.lFist=1; Input.lIndex=0; Input.lThumb=0 end end, release = function() if Input then Input.lFist=0; Input.lIndex=0; Input.lThumb=0 end end }, [Enum.KeyCode.Three] = { name = "RightFingerPoke", side = "R", locked = false, held = false, apply = function() if Input then Input.rFist=1; Input.rIndex=0; Input.rThumb=0 end end, release = function() if Input then Input.rFist=0; Input.rIndex=0; Input.rThumb=0 end end }, } local function anyPoseKeyHeld(side) for _, pose in pairs(poseData) do if pose.held and pose.side == side then return true end end return false end local function anyPoseLocked(side) for _, pose in pairs(poseData) do if pose.locked and pose.side == side then return true end end return false end -- ========================================== local hudLabel = nil UIS.InputBegan:Connect(function(io, gameProcessed) if gameProcessed then return end if io.UserInputType == Enum.UserInputType.Keyboard then keys[io.KeyCode] = true if io.KeyCode == Enum.KeyCode.LeftAlt then setLook(not S.look) end if io.KeyCode == Enum.KeyCode.Equals then setScale(S.scale + 1) end if io.KeyCode == Enum.KeyCode.Minus then setScale(S.scale - 1) end if io.KeyCode == Enum.KeyCode.RightControl then _G.NoVR_HUD_Visible = not _G.NoVR_HUD_Visible if hudLabel then hudLabel.Visible = _G.NoVR_HUD_Visible end end if Input and io.KeyCode == Enum.KeyCode.E then Input.rIndex = 1; Input.rFist = 0; Input.rThumb = 0 end if Input and io.KeyCode == Enum.KeyCode.Q then Input.lIndex = 1; Input.lFist = 0; Input.lThumb = 0 end local pose = poseData[io.KeyCode] if pose then pose.held = true if not pose.locked then pose.apply() end end elseif io.UserInputType == Enum.UserInputType.MouseButton1 then mouseDown.L = true if anyPoseKeyHeld("L") then for _, pose in pairs(poseData) do if pose.held and pose.side == "L" then pose.locked = true end end elseif anyPoseLocked("L") then for _, pose in pairs(poseData) do if pose.locked and pose.side == "L" then pose.locked = false pose.release() end end else if Input then Input.lFist = 1; Input.lIndex = 1 end end elseif io.UserInputType == Enum.UserInputType.MouseButton2 then mouseDown.R = true if anyPoseKeyHeld("R") then for _, pose in pairs(poseData) do if pose.held and pose.side == "R" then pose.locked = true end end elseif anyPoseLocked("R") then for _, pose in pairs(poseData) do if pose.locked and pose.side == "R" then pose.locked = false pose.release() end end else if Input then Input.rFist = 1; Input.rIndex = 1 end end end end) UIS.InputEnded:Connect(function(io, gameProcessed) if io.UserInputType == Enum.UserInputType.Keyboard then keys[io.KeyCode] = false if Input and io.KeyCode == Enum.KeyCode.E then Input.rIndex = 0 end if Input and io.KeyCode == Enum.KeyCode.Q then Input.lIndex = 0 end local pose = poseData[io.KeyCode] if pose then pose.held = false if not pose.locked then pose.release() end end elseif io.UserInputType == Enum.UserInputType.MouseButton1 then mouseDown.L = false if not anyPoseKeyHeld("L") and not anyPoseLocked("L") then if Input then Input.lFist = 0; Input.lIndex = 0 end end elseif io.UserInputType == Enum.UserInputType.MouseButton2 then mouseDown.R = false if not anyPoseKeyHeld("R") and not anyPoseLocked("R") then if Input then Input.rFist = 0; Input.rIndex = 0 end end end end) UIS.InputChanged:Connect(function(io) if io.UserInputType == Enum.UserInputType.MouseWheel then S.reach = math.clamp(S.reach - io.Position.Z * 0.07, 0.15, 2.5) end end) local function isTyping() return UIS:GetFocusedTextBox() ~= nil end RunService:BindToRenderStep("NoVR_Control", Enum.RenderPriority.Camera.Value + 1, function(dt) if S.look and not isTyping() then local d = UIS:GetMouseDelta() yaw = yaw - d.X * S.sens pitch = math.clamp(pitch - d.Y * S.sens, -1.45, 1.45) UIS.MouseBehavior = Enum.MouseBehavior.LockCenter elseif isTyping() then UIS.MouseBehavior = Enum.MouseBehavior.Default UIS.MouseIconEnabled = true end local rot = CFrame.fromEulerAnglesYXZ(pitch, yaw, 0) local hs = cam.HeadScale; if hs <= 1 then hs = S.scale * 6 end local spd = (10 + S.scale * 4) * hs * S.moveK if keys[Enum.KeyCode.LeftControl] and not isTyping() then spd = spd * S.slowFactor end local mv = Vector3.zero if not isTyping() then if keys[Enum.KeyCode.W] then mv += Vector3.new(0,0,-1) end if keys[Enum.KeyCode.S] then mv += Vector3.new(0,0, 1) end if keys[Enum.KeyCode.A] then mv += Vector3.new(-1,0,0) end if keys[Enum.KeyCode.D] then mv += Vector3.new( 1,0,0) end if keys[Enum.KeyCode.Space] then mv += Vector3.new(0, 1,0) end if keys[Enum.KeyCode.LeftShift] then mv += Vector3.new(0,-1,0) end else for k in pairs(keys) do keys[k] = false end end if mv.Magnitude > 0 then camPos = camPos + (rot * mv.Unit) * spd * dt end cam.CameraType = Enum.CameraType.Scriptable cam.CFrame = CFrame.new(camPos) * rot if Input then Input.directionLateral = Vector2.zero Input.directionVertical = 0 Input.turnDirection = 0 for _, pose in pairs(poseData) do if pose.locked then pose.apply() end end end end) pcall(function() local gui = Instance.new("ScreenGui") gui.Name = "NoVR_HUD" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.Parent = lp:WaitForChild("PlayerGui") local lbl = Instance.new("TextLabel", gui) lbl.AnchorPoint = Vector2.new(0, 1) lbl.Position = UDim2.new(0, 10, 1, -10) lbl.Size = UDim2.new(0, 510, 0, 420) lbl.BackgroundColor3 = Color3.fromRGB(0, 0, 0) lbl.BackgroundTransparency = 0.25 lbl.BorderSizePixel = 0 lbl.TextColor3 = Color3.fromRGB(255, 255, 255) lbl.TextXAlignment = Enum.TextXAlignment.Left lbl.TextYAlignment = Enum.TextYAlignment.Top lbl.Font = Enum.Font.Code lbl.TextSize = 14 lbl.RichText = true lbl.Visible = _G.NoVR_HUD_Visible hudLabel = lbl local stroke = Instance.new("UIStroke", lbl) stroke.Color = Color3.fromRGB(0, 0, 0) stroke.Thickness = 1.2 stroke.Transparency = 0.3 -- ============ DRAG SYSTEM (SMOOTH) ============ local TweenService = game:GetService("TweenService") lbl.Active = true lbl.Selectable = false local dragging = false local dragStart = nil local startPos = nil lbl.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = lbl.Position local changedConn changedConn = input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false if changedConn then changedConn:Disconnect() end end end) end end) UIS.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local delta = input.Position - dragStart local targetPos = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) TweenService:Create( lbl, TweenInfo.new(0.15, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), { Position = targetPos } ):Play() end end) -- ============================================== local function pad(text, width) local len = #text if len >= width then return text end return text .. string.rep(" ", width - len) end -- ============ HIGHLIGHT HELPER ============ local HL_COLOR = "#ffff00" -- bright yellow when pressed local function keyHeld(kc) return keys[kc] == true end local function hl(isPressed, normalColor) if isPressed then return HL_COLOR end return normalColor end -- =========================================== RunService.Heartbeat:Connect(function() if not lbl.Visible then return end local COL = 33 local LOCKED_COLOR = "#00ffff" local LOCKED_TAG = " [LOCKED]" local function poseLine(keyCode, label, defaultColor) local pose = poseData[keyCode] if pose.locked then local plainText = label .. LOCKED_TAG local coloredText = string.format( '%s%s', LOCKED_COLOR, label, LOCKED_TAG ) return coloredText, #plainText else local color = hl(keyHeld(keyCode), defaultColor) return string.format('%s', color, label), #label end end local function rowRawFixed(leftText, leftLen, rightText, rightLen) local padSpaces = math.max(1, COL - leftLen) return string.format( ' %s%s| %s\n', leftText, string.rep(" ", padSpaces), rightText ) end local L, R = "#ffffff", "#ffffff" local function row(leftText, rightText, leftColor, rightColor) local padded = pad(leftText, COL) return string.format( ' %s| %s\n', leftColor, padded, rightColor, rightText ) end local LH, RH = "#00ff88", "#ff8844" local slowIndicator = keys[Enum.KeyCode.LeftControl] and ' [SLOW]' or "" -- Pose lines (already handle their own highlight) local lR, lRlen = poseLine(Enum.KeyCode.R, "R = Point (thumb up)", L) local rT, rTlen = poseLine(Enum.KeyCode.T, "T = Point (thumb up)", R) local lF, lFlen = poseLine(Enum.KeyCode.F, "F = Thumbs Up", L) local rG, rGlen = poseLine(Enum.KeyCode.G, "G = Thumbs Up", R) local l1, l1len = poseLine(Enum.KeyCode.One, "1 = Finger Poke", L) local r3, r3len = poseLine(Enum.KeyCode.Three, "3 = Finger Poke", R) -- LMB / RMB grab rows (highlight if mouse held) local lmbColor = hl(mouseDown.L, L) local rmbColor = hl(mouseDown.R, R) -- Q / E pinch rows local qColor = hl(keyHeld(Enum.KeyCode.Q), L) local eColor = hl(keyHeld(Enum.KeyCode.E), R) -- Movement + general keys local wasd_any = keyHeld(Enum.KeyCode.W) or keyHeld(Enum.KeyCode.A) or keyHeld(Enum.KeyCode.S) or keyHeld(Enum.KeyCode.D) or keyHeld(Enum.KeyCode.Space) or keyHeld(Enum.KeyCode.LeftShift) local mouseLineColor = hl(wasd_any, "#ffffff") local wheelLineColor = "#ffffff" -- LeftAlt handled below local ctrlColor = hl(keyHeld(Enum.KeyCode.LeftControl), "#ffffff") lbl.Text = ' Original by @Bac0nH1ckOff\n'.. ' Edited by @Kazuu\n'.. ' [VR Hands :: No-VR]\n'.. ' ------------------------------------------------------------\n'.. row("-- LEFT HAND --", "-- RIGHT HAND --", LH, RH).. row("LMB = Grab (left)", "RMB = Grab (right)", lmbColor, rmbColor).. row("Q = Pinch player", "E = Pinch player", qColor, eColor).. rowRawFixed(lR, lRlen, rT, rTlen).. rowRawFixed(lF, lFlen, rG, rGlen).. rowRawFixed(l1, l1len, r3, r3len).. row("Hold + LMB = LOCK", "Hold + RMB = LOCK", L, R).. row("LMB again = UNLOCK", "RMB again = UNLOCK", L, R).. ' ------------------------------------------------------------\n'.. ' -- GENERAL --\n'.. (' Mouse = Look Around | WASD = Fly | Space/Shift = Up/Down\n'):format(mouseLineColor).. (' Wheel = Hand Reach | +/- = Size (%d/10) | LeftAlt = Free Cursor\n') :format(wheelLineColor, math.floor(S.scale)).. (' LeftCtrl = Slow Fly Mode'):format(ctrlColor)..slowIndicator..'\n'.. ' Wanna move this menu? Tap LeftAlt, then drag it anywhere.\n'.. ' Heads up: The FIRST time you press LeftAlt, tap it twice.\n'.. ' After that first double-tap, one tap works every time.\n'.. ' Press RightCtrl anytime to hide or show this menu.' end) end) print("[NoVR] control active.") end) ]==] if queue_on_teleport then queue_on_teleport(hrs) elseif syn and syn.queue_on_teleport then syn.queue_on_teleport(hrs) end TeleportService:Teleport(game.PlaceId, Players.LocalPlayer)