-- [[ 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)