-- [[ 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 ]] --[[ STUDIO TEST TOOLKIT (LocalScript) WHERE: StarterPlayer > StarterPlayerScripts (insert a LocalScript, paste this in) RUN: Roblox Studio > Test tab > Play USE: your own place file / private copy in Studio only. HOW TO READ IT: every feature is one small function (setFly, setNoclip, ...). Start with CONFIG below, then read the functions one at a time. Open the Output window (View > Output) to see print() messages. ]] local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local Lighting = game:GetService("Lighting") local Workspace = game:GetService("Workspace") local player = Players.LocalPlayer -------------------------------------------------------------------- -- CONFIG: change these to match the names you see in Explorer -------------------------------------------------------------------- local CONFIG = { FlySpeed = 60, WalkSpeed = 40, -- Instant prompts + auto-open only touch prompts whose name (or a parent's -- name) contains this word. Use "" to affect every prompt. ChestKeyword = "chest", AutoOpenRange = 200, -- studs -- ESP: name keyword -> highlight color. Keywords match anywhere in a name, -- so "ore" also matches "core". Make them more specific if you get noise. ESP = { ore = Color3.fromRGB(255, 200, 0), chest = Color3.fromRGB(80, 255, 120), mine = Color3.fromRGB(120, 180, 255), }, KillAuraRange = 25, EnemyFolderName = "Enemies", -- TODO: the Workspace folder that holds enemies in your copy } -------------------------------------------------------------------- -- HELPERS -------------------------------------------------------------------- local function getChar() local char = player.Character if not char then return nil end local hum = char:FindFirstChildOfClass("Humanoid") local hrp = char:FindFirstChild("HumanoidRootPart") if hum and hrp then return char, hum, hrp end return nil end -- Does this instance, or one of its 3 parents, have the keyword in its name? local function nameMatches(inst, keyword) if keyword == "" then return true end local current = inst for _ = 1, 4 do if not current or current == Workspace then break end if string.find(string.lower(current.Name), keyword, 1, true) then return true end current = current.Parent end return false end local function promptPosition(prompt) local p = prompt.Parent if not p then return nil end if p:IsA("BasePart") then return p.Position elseif p:IsA("Attachment") then return p.WorldPosition elseif p:IsA("Model") then return p:GetPivot().Position end return nil end -------------------------------------------------------------------- -- STATE (declared up here so the respawn handler at the bottom can use it) -------------------------------------------------------------------- local flying = false local speedOn = false -------------------------------------------------------------------- -- INSTANT PROMPTS: HoldDuration = 0 means "no holding needed" -------------------------------------------------------------------- local instantOn = false local originalHold = {} -- prompt -> its original HoldDuration local function applyInstant(prompt) if instantOn and nameMatches(prompt, CONFIG.ChestKeyword) then if originalHold[prompt] == nil then originalHold[prompt] = prompt.HoldDuration end prompt.HoldDuration = 0 end end Workspace.DescendantAdded:Connect(function(d) if d:IsA("ProximityPrompt") then applyInstant(d) end end) local function setInstant(on) instantOn = on if on then for _, d in ipairs(Workspace:GetDescendants()) do if d:IsA("ProximityPrompt") then applyInstant(d) end end else for prompt, original in pairs(originalHold) do if prompt.Parent then prompt.HoldDuration = original end end originalHold = {} end end -------------------------------------------------------------------- -- FLY: set our own velocity every frame, steered by the camera -------------------------------------------------------------------- local flyConn local controls pcall(function() local playerModule = require(player:WaitForChild("PlayerScripts"):WaitForChild("PlayerModule")) controls = playerModule:GetControls() end) local function setFly(on) flying = on if flyConn then flyConn:Disconnect() flyConn = nil end local _, hum = getChar() if hum then hum.PlatformStand = on end if not on then return end flyConn = RunService.Heartbeat:Connect(function() local char, _, root = getChar() if not char then return end local cam = Workspace.CurrentCamera local move = controls and controls:GetMoveVector() or Vector3.zero -- move.Z is negative when pushing forward, so this points where the camera looks local dir = cam.CFrame:VectorToWorldSpace(Vector3.new(move.X, 0, move.Z)) if UserInputService:IsKeyDown(Enum.KeyCode.Space) then dir = dir + Vector3.yAxis end if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then dir = dir - Vector3.yAxis end root.AssemblyLinearVelocity = dir * CONFIG.FlySpeed -- zero input = hover end) end -------------------------------------------------------------------- -- NOCLIP: turn CanCollide off on every character part, every physics step -------------------------------------------------------------------- local noclipConn local savedCollide = {} -- part -> original CanCollide local function setNoclip(on) if noclipConn then noclipConn:Disconnect() noclipConn = nil end if on then noclipConn = RunService.Stepped:Connect(function() local char = getChar() if not char then return end for _, part in ipairs(char:GetDescendants()) do if part:IsA("BasePart") then if savedCollide[part] == nil then savedCollide[part] = part.CanCollide end part.CanCollide = false end end end) else for part, original in pairs(savedCollide) do if part.Parent then part.CanCollide = original end end savedCollide = {} end end -------------------------------------------------------------------- -- SPEED -------------------------------------------------------------------- local function setSpeed(on) speedOn = on local _, hum = getChar() if hum then hum.WalkSpeed = on and CONFIG.WalkSpeed or 16 end end -------------------------------------------------------------------- -- FULLBRIGHT: back up the lighting settings, then restore them when off -------------------------------------------------------------------- local lightingBackup = {} local function setFullbright(on) if on then lightingBackup = { Brightness = Lighting.Brightness, ClockTime = Lighting.ClockTime, FogEnd = Lighting.FogEnd, Ambient = Lighting.Ambient, GlobalShadows = Lighting.GlobalShadows, } Lighting.Brightness = 2 Lighting.ClockTime = 14 Lighting.FogEnd = 1e6 Lighting.Ambient = Color3.new(1, 1, 1) Lighting.GlobalShadows = false else for prop, value in pairs(lightingBackup) do Lighting[prop] = value end end end -------------------------------------------------------------------- -- ESP: put a Highlight on anything whose name contains a CONFIG.ESP keyword -- (Roblox only draws about 31 Highlights at once) -------------------------------------------------------------------- local espOn = false local espObjects = setmetatable({}, { __mode = "k" }) -- target -> Highlight local function espColorFor(inst) local lowered = string.lower(inst.Name) for keyword, color in pairs(CONFIG.ESP) do if string.find(lowered, keyword, 1, true) then return color end end return nil end local function tryAddESP(inst) if not espOn or espObjects[inst] then return end if not (inst:IsA("Model") or inst:IsA("BasePart")) then return end if Players:GetPlayerFromCharacter(inst) then return end -- skip if a parent already has a highlight local p = inst.Parent while p and p ~= Workspace do if espObjects[p] then return end p = p.Parent end local color = espColorFor(inst) if not color then return end local hl = Instance.new("Highlight") hl.Name = "StudioTestESP" hl.Adornee = inst hl.FillColor = color hl.FillTransparency = 0.6 hl.OutlineColor = color hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop hl.Parent = inst espObjects[inst] = hl end Workspace.DescendantAdded:Connect(tryAddESP) local function setESP(on) espOn = on if on then for _, d in ipairs(Workspace:GetDescendants()) do tryAddESP(d) end else for _, hl in pairs(espObjects) do hl:Destroy() end table.clear(espObjects) end end -------------------------------------------------------------------- -- AUTO-OPEN CHESTS: teleport next to the nearest matching prompt and trigger it. -- prompt:InputHoldBegin() / InputHoldEnd() is the official way to "press" a prompt. -------------------------------------------------------------------- local autoOpenOn = false local opened = setmetatable({}, { __mode = "k" }) local function setAutoOpen(on) autoOpenOn = on if not on then table.clear(opened) return end task.spawn(function() while autoOpenOn do local _, _, root = getChar() if root then local bestPrompt, bestPos, bestDist for _, d in ipairs(Workspace:GetDescendants()) do if d:IsA("ProximityPrompt") and d.Enabled and not opened[d] and nameMatches(d, CONFIG.ChestKeyword) then local pos = promptPosition(d) if pos then local dist = (pos - root.Position).Magnitude if dist <= CONFIG.AutoOpenRange and (not bestDist or dist < bestDist) then bestPrompt, bestPos, bestDist = d, pos, dist end end end end if bestPrompt then opened[bestPrompt] = true root.CFrame = CFrame.new(bestPos + Vector3.new(0, 3, 0)) task.wait(0.2) bestPrompt:InputHoldBegin() task.wait(bestPrompt.HoldDuration + 0.1) bestPrompt:InputHoldEnd() end end task.wait(1) -- scanning the whole Workspace is slow, so don't do it every frame end end) end -------------------------------------------------------------------- -- KILL AURA (skeleton): finds enemies in range, then calls dealDamage(). -- YOU fill in dealDamage() for your copy. -------------------------------------------------------------------- local killAuraOn = false local function dealDamage(enemy) -- TODO: replace with however your copy deals damage. -- In Explorer, open the sword/pickaxe Tool and read its scripts. They usually -- fire a RemoteEvent, e.g.: -- game.ReplicatedStorage.Remotes.Hit:FireServer(enemy) -- Changing Humanoid.Health from a client only changes YOUR view, not the server's. print("would damage:", enemy.Name) end local function setKillAura(on) killAuraOn = on if not on then return end task.spawn(function() while killAuraOn do local _, _, root = getChar() local folder = Workspace:FindFirstChild(CONFIG.EnemyFolderName) if root and folder then for _, enemy in ipairs(folder:GetChildren()) do local eRoot = enemy:IsA("Model") and (enemy.PrimaryPart or enemy:FindFirstChild("HumanoidRootPart")) if eRoot and (eRoot.Position - root.Position).Magnitude <= CONFIG.KillAuraRange then dealDamage(enemy) end end end task.wait(0.25) end end) end -------------------------------------------------------------------- -- RESPAWN: re-apply settings that live on the character -------------------------------------------------------------------- player.CharacterAdded:Connect(function(char) local hum = char:WaitForChild("Humanoid") if flying then hum.PlatformStand = true end if speedOn then hum.WalkSpeed = CONFIG.WalkSpeed end end) -------------------------------------------------------------------- -- GUI: one toggle button per feature, plus a keyboard shortcut -------------------------------------------------------------------- local gui = Instance.new("ScreenGui") gui.Name = "StudioTestToolkit" gui.ResetOnSpawn = false gui.Parent = player:WaitForChild("PlayerGui") local frame = Instance.new("Frame") frame.Position = UDim2.fromOffset(10, 80) frame.Size = UDim2.fromOffset(190, 0) frame.AutomaticSize = Enum.AutomaticSize.Y frame.BackgroundColor3 = Color3.fromRGB(20, 20, 20) frame.BackgroundTransparency = 0.3 frame.Parent = gui local layout = Instance.new("UIListLayout") layout.Padding = UDim.new(0, 4) layout.Parent = frame local function addToggle(label, setter, key) local state = false local btn = Instance.new("TextButton") btn.Size = UDim2.new(1, 0, 0, 30) btn.Font = Enum.Font.GothamMedium btn.TextSize = 14 btn.TextColor3 = Color3.new(1, 1, 1) btn.Parent = frame local function refresh() btn.Text = label .. (state and ": ON" or ": OFF") .. " [" .. key.Name .. "]" btn.BackgroundColor3 = state and Color3.fromRGB(40, 140, 80) or Color3.fromRGB(60, 60, 60) end local function toggle() state = not state setter(state) refresh() end btn.Activated:Connect(toggle) -- works for mouse and touch UserInputService.InputBegan:Connect(function(input, gameProcessed) if not gameProcessed and input.KeyCode == key then toggle() end end) refresh() end addToggle("Fly", setFly, Enum.KeyCode.F) addToggle("Noclip", setNoclip, Enum.KeyCode.N) addToggle("Speed", setSpeed, Enum.KeyCode.G) addToggle("Fullbright", setFullbright, Enum.KeyCode.B) addToggle("ESP", setESP, Enum.KeyCode.V) addToggle("Instant prompts", setInstant, Enum.KeyCode.H) addToggle("Auto-open chests", setAutoOpen, Enum.KeyCode.J) addToggle("Kill aura (skeleton)", setKillAura, Enum.KeyCode.K) print("Studio Test Toolkit loaded.")