Bloxrooms Script (October 2026) – Artifacts:

PUBLISHEDUPDATED
1 Available ScriptFree

Skipping the slow grind in Bloxrooms script is the only way to stay ahead while everyone else is still stumbling around in the dark.

Endless rooms and misremembered levels mean you are constantly scavenging for artifacts and trying to survive creepy entities that refuse to follow the rules.

Let us check out the working code and see how the script handles the chaos.

Bloxrooms Script – Artifacts: & More

Artifacts: & MoreFree
Artifacts:An inventory panel showing Owned, Total Value and Top Item.Sell All needs a second click to confirm.Teleport:Unlock All shows a progress bar.
--// Library
local LIBRARY_URL = "https://raw.githubusercontent.com/EvolWareOfc/ProjectRetroSlop/refs/heads/main/UI/v0.0.2"

local Library
do
	local ok, result = pcall(function()
		return loadstring(game:HttpGet(LIBRARY_URL))()
	end)
	if not ok or type(result) ~= "table" then
		error("[Bloxrooms] RetroSlop didn't load (" .. tostring(result) .. "). Set LIBRARY_URL to the RAW link of RetroSlop.lua.", 0)
	end
	Library = result
end

Library.Folder = "BloxroomsHub"
local Flags = Library.Flags

--// Services
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 ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalPlayer = Players.LocalPlayer

--// Settings
local CFG = {
	PlayerESP = false,
	EntityESP = true,
	ArtifactESP = true,
	EscapeESP = true,
	ArtifactSpawnESP = false,
	MaxDistance = 600,
	ShowDistance = true,
	ShowRarity = true,

	SpeedEnabled = false,
	WalkSpeed = 18,
	FlyEnabled = false,
	FlySpeed = 40,
	Noclip = false,
	InfiniteJump = false,
	Fullbright = false,
	SilentFeet = true,
	InfiniteStamina = true,
	InstantPrompts = true,

	AutoCollect = false,
	AutoFarm = false,
	AutoCollectRange = 18,
	AutoFarmDelay = 0.55,
	UnlockTPDelay = 0.35,
}

local ESP = {}
local flyBV, flyBG
local flying = false
local lastEmptyNotify = 0
local unlockRunning = false
local savedLighting = nil
local promptConnection = nil

local COLORS = {
	Good = Color3.fromRGB(180, 255, 25),
	Warn = Color3.fromRGB(255, 208, 0),
	Bad = Color3.fromRGB(255, 90, 100),
	Muted = Color3.fromRGB(216, 222, 228),
}

--// Remotes
local Shared = ReplicatedStorage:WaitForChild("Shared")
local Remotes = Shared:WaitForChild("Remotes")
local ArtifactsRF = Remotes:WaitForChild("Artifacts")
local CollectArtifact = ArtifactsRF:WaitForChild("CollectArtifact")
local GetInventory = ArtifactsRF:FindFirstChild("GetInventory")
local ShopRF = Remotes:WaitForChild("Shop")
local SellAllArtifacts = ShopRF:FindFirstChild("SellAllArtifacts")
local CodesRF = Remotes:WaitForChild("Codes")
local RedeemCode = CodesRF:WaitForChild("RedeemCode")
local LocationsRF = Remotes:FindFirstChild("Locations")
local FastTravel = LocationsRF and LocationsRF:FindFirstChild("FastTravel")

--// Helpers
local function notify(title, content, style)
	Library:Notify({ Title = title, Content = content, Style = style or "Info", Duration = 2.8 })
end

local function camera()
	return Workspace.CurrentCamera
end

local function hrp(plr)
	local c = (plr or LocalPlayer).Character
	return c and c:FindFirstChild("HumanoidRootPart")
end

local function hum(plr)
	local c = (plr or LocalPlayer).Character
	return c and c:FindFirstChildOfClass("Humanoid")
end

local function alive(plr)
	local h = hum(plr)
	return h and h.Health > 0
end

local function getPart(obj)
	if not obj then
		return nil
	end
	if obj:IsA("BasePart") then
		return obj
	end
	if obj:IsA("Model") then
		if obj.PrimaryPart then
			return obj.PrimaryPart
		end
		local r = obj:FindFirstChild("HumanoidRootPart") or obj:FindFirstChild("PickupAnchor")
		if r then
			return r
		end
	end
	return obj:FindFirstChildWhichIsA("BasePart", true)
end

local function tpPos(pos)
	local r = hrp()
	if r and pos then
		r.AssemblyLinearVelocity = Vector3.zero
		r.CFrame = CFrame.new(pos + Vector3.new(0, 4, 0))
	end
end

local function tpObj(obj)
	local p = getPart(obj)
	if p then
		tpPos(p.Position)
		return true
	end
	return false
end

local RARITY_COLORS = {
	Common = Color3.fromRGB(180, 180, 180),
	Uncommon = Color3.fromRGB(80, 200, 120),
	Rare = Color3.fromRGB(70, 140, 255),
	Epic = Color3.fromRGB(180, 90, 255),
	Legendary = Color3.fromRGB(255, 180, 40),
	Mythic = Color3.fromRGB(255, 60, 100),
}
local RARITY_ORDER = { "Common", "Uncommon", "Rare", "Epic", "Legendary", "Mythic" }

local function rarityColor(rarity)
	return RARITY_COLORS[rarity] or Color3.fromRGB(80, 255, 140)
end

--// ESP
local function clearESP(obj)
	local d = ESP[obj]
	if not d then
		return
	end
	pcall(function()
		if d.Highlight then
			d.Highlight:Destroy()
		end
		if d.Billboard then
			d.Billboard:Destroy()
		end
	end)
	ESP[obj] = nil
end

local function clearAllESP()
	for obj in pairs(ESP) do
		clearESP(obj)
	end
end

local function clearKind(kind)
	for obj, data in pairs(ESP) do
		if data.Kind == kind then
			clearESP(obj)
		end
	end
end

local function addESP(obj, color, name, kind)
	if ESP[obj] then
		return
	end
	local part = getPart(obj)
	if not part then
		return
	end
	local adornee = obj:IsA("Model") and obj or part

	local hl = Instance.new("Highlight")
	hl.Adornee = adornee
	hl.FillColor = color
	hl.OutlineColor = Color3.new(1, 1, 1)
	hl.FillTransparency = 0.62
	hl.OutlineTransparency = 0
	hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
	hl.Parent = adornee

	local bb = Instance.new("BillboardGui")
	bb.Adornee = part
	bb.Size = UDim2.fromOffset(200, 36)
	bb.StudsOffset = Vector3.new(0, 2.6, 0)
	bb.AlwaysOnTop = true
	bb.Parent = part

	local label = Instance.new("TextLabel")
	label.Size = UDim2.fromScale(1, 1)
	label.BackgroundTransparency = 1
	label.Font = Enum.Font.GothamBlack
	label.TextSize = 13
	label.TextColor3 = color
	label.TextStrokeTransparency = 0
	label.Text = name
	label.Parent = bb

	ESP[obj] = {
		Highlight = hl,
		Billboard = bb,
		Label = label,
		Part = part,
		Name = name,
		Kind = kind or "generic",
	}
end

--// Artifacts
local function isArtifact(obj)
	if not obj then
		return false
	end
	return obj:GetAttribute("ArtifactSpawnId") ~= nil or obj:GetAttribute("ArtifactId") ~= nil
end

local function artifactFolders()
	local list = {}
	local spawns = Workspace:FindFirstChild("ArtifactSpawns")
	if spawns then
		local active = spawns:FindFirstChild("ActiveArtifacts")
		if active then
			table.insert(list, active)
		end
		local common = spawns:FindFirstChild("Common")
		if common then
			table.insert(list, common)
		end
	end
	local dropped = Workspace:FindFirstChild("DroppedArtifacts")
	if dropped then
		table.insert(list, dropped)
	end
	local newnew = Workspace:FindFirstChild("ARTIFACTSNEWNEW")
	if newnew then
		table.insert(list, newnew)
	end
	return list
end

local function countArtifacts()
	local n = 0
	for _, folder in ipairs(artifactFolders()) do
		for _, child in ipairs(folder:GetChildren()) do
			if isArtifact(child) then
				n += 1
			end
		end
	end
	return n
end

local function artifactName(obj)
	return tostring(obj:GetAttribute("ArtifactDisplayName") or obj:GetAttribute("ArtifactId") or obj.Name)
end

local function collectOne(obj)
	if not isArtifact(obj) then
		return false
	end
	local id = obj:GetAttribute("ArtifactId") or obj:GetAttribute("ArtifactDisplayName") or obj.Name
	local spawnId = obj:GetAttribute("ArtifactSpawnId") or obj.Name
	local ok, res = pcall(function()
		return CollectArtifact:InvokeServer(id, spawnId)
	end)
	return ok and type(res) == "table" and res.Success
end

local function nearestArtifact()
	local root = hrp()
	if not root then
		return nil, nil
	end
	local best, bestDist, bestPart = nil, math.huge, nil
	for _, folder in ipairs(artifactFolders()) do
		for _, child in ipairs(folder:GetChildren()) do
			if isArtifact(child) then
				local p = getPart(child)
				if p then
					local d = (root.Position - p.Position).Magnitude
					if d < bestDist then
						bestDist, best, bestPart = d, child, p
					end
				end
			end
		end
	end
	return best, bestPart
end

local function inventoryValue()
	if not GetInventory then
		notify("Inventory", "GetInventory remote missing", "Error")
		return nil
	end
	local ok, data = pcall(function()
		return GetInventory:InvokeServer()
	end)
	if not ok or type(data) ~= "table" then
		notify("Inventory", "Failed to fetch inventory", "Error")
		return nil
	end

	local artifacts = data.Artifacts or (data.Payload and data.Payload.Artifacts) or data
	if type(artifacts) ~= "table" then
		notify("Inventory", "Could not read artifacts", "Error")
		return nil
	end

	local totalValue, totalCount, rows = 0, 0, {}
	for _, entry in ipairs(artifacts) do
		local count = tonumber(entry.Count) or 0
		local value = tonumber(entry.Value) or 0
		if count > 0 then
			totalCount += count
			totalValue += count * value
			table.insert(rows, {
				Name = entry.Name or entry.Id or "Unknown",
				Count = count,
				Value = value,
				Rarity = entry.Rarity or "Common",
			})
		end
	end
	table.sort(rows, function(a, b)
		return (a.Count * a.Value) > (b.Count * b.Value)
	end)
	return totalValue, totalCount, rows
end

local function sellAll()
	if not SellAllArtifacts then
		notify("Shop", "SellAllArtifacts remote missing", "Error")
		return
	end
	local ok = pcall(function()
		return SellAllArtifacts:InvokeServer()
	end)
	notify("Shop", ok and "Sold all artifacts" or "Sell all failed", ok and "Success" or "Error")
end

--// Entities
local KNOWN_ENTITIES = {
	"Builderman", "Roblox", "Shedletsky", "Coolkid", "1x1x1x1", "DenisDaily", "666",
}

local function entitiesFolder()
	return Workspace:FindFirstChild("Entities")
end

local function listEntities()
	local out = {}
	local folder = entitiesFolder()
	if not folder then
		return out
	end
	for _, child in ipairs(folder:GetChildren()) do
		if child:IsA("Model") or child:IsA("BasePart") then
			table.insert(out, child)
		end
	end
	table.sort(out, function(a, b)
		return a.Name < b.Name
	end)
	return out
end

local function isEntity(model)
	if not model or not model:IsA("Model") then
		return false
	end
	if Players:GetPlayerFromCharacter(model) then
		return false
	end
	local folder = entitiesFolder()
	if folder and model:IsDescendantOf(folder) then
		return true
	end
	return model:GetAttribute("CollectionId") ~= nil or model:HasTag("Entity")
end

--// Escape
local function getActiveEscapes()
	local out = {}
	local folder = Workspace:FindFirstChild("Escapes")
	if not folder then
		return out
	end
	for _, child in ipairs(folder:GetChildren()) do
		if child.Name == "Escape" and child:GetAttribute("EscapeActive") == true then
			table.insert(out, child)
		end
	end
	return out
end

local function escapeOpen()
	return Workspace:GetAttribute("EscapeExitOpen") == true
end

local function escapeCFrame()
	local cf = Workspace:GetAttribute("EscapeExitCFrame")
	if typeof(cf) == "CFrame" then
		return cf
	end
	return nil
end

local function tpActiveEscape()
	if escapeOpen() then
		local cf = escapeCFrame()
		if cf then
			tpPos(cf.Position)
			notify("Escape", "Teleported to the open exit", "Success")
			return
		end
	end
	local actives = getActiveEscapes()
	if #actives > 0 then
		local door = actives[1]:FindFirstChild("Door", true)
		if (door and tpObj(door)) or tpObj(actives[1]) then
			notify("Escape", "Teleported to the active escape", "Success")
			return
		end
	end
	notify("Escape", "No active exit found", "Warning")
end

--// Locations & Still Lifes
local LOCATION_NAMES = {
	"ChaosCanyon", "Cheese", "ClassicHouse", "Doomspire", "ElephantHotel",
	"FakeRobloxia", "FakeSuburban", "FloodEscape2", "Highschool", "KohlsAdmin",
	"LumberTycoon", "MiniHQ", "PartyExe", "PizzaPlace", "PizzaPlaceTown",
	"PoliceStation", "RedCity", "SFOTH", "SpeakerRooms", "StarterCabin",
	"StartingZone", "TeaPotRoom", "Visuals", "ZombieAttack", "Christmas",
}

local STILL_LIFE_NAMES = {
	"Guide", "Subject_0", "Piggy", "Flamingo", "Doge", "Cop",
	"Prisoner", "PizzaGuy", "Highschooler", "ClassicHouseNoob",
	"DoomspireNoob", "EthanGamer", "Jeff", "Michael",
}

local CODES = { "1M", "UPDATE1", "500K" }

local function findLocation(name)
	local root = Workspace:FindFirstChild("LocationDiscovery")
	if not root then
		return nil
	end
	for _, folderName in ipairs({ "Destinations", "Zones" }) do
		local folder = root:FindFirstChild(folderName)
		if folder then
			local exact = folder:FindFirstChild(name)
			if exact then
				return exact
			end
			for _, child in ipairs(folder:GetChildren()) do
				local compact = string.gsub(child.Name, "%s+", "")
				if string.lower(compact) == string.lower(name) or string.lower(child.Name) == string.lower(name) then
					return child
				end
			end
		end
	end
	return nil
end

local function allLocations()
	local out, seen = {}, {}
	local root = Workspace:FindFirstChild("LocationDiscovery")
	if not root then
		return out
	end
	for _, folderName in ipairs({ "Destinations", "Zones" }) do
		local folder = root:FindFirstChild(folderName)
		if folder then
			for _, child in ipairs(folder:GetChildren()) do
				if not seen[child.Name] then
					seen[child.Name] = true
					table.insert(out, child)
				end
			end
		end
	end
	table.sort(out, function(a, b)
		return a.Name < b.Name
	end)
	return out
end

local function stillLifeNPCs()
	local out = {}
	local folder = Workspace:FindFirstChild("StillLifes")
	if folder then
		for _, child in ipairs(folder:GetChildren()) do
			table.insert(out, child)
		end
	end
	table.sort(out, function(a, b)
		return a.Name < b.Name
	end)
	return out
end

local function stillLifeAreas()
	local out = {}
	local npc = Workspace:FindFirstChild("NpcAreas")
	local sl = npc and npc:FindFirstChild("StillLifes")
	if sl then
		for _, child in ipairs(sl:GetChildren()) do
			if child.Name ~= "Template" then
				table.insert(out, child)
			end
		end
	end
	table.sort(out, function(a, b)
		return a.Name < b.Name
	end)
	return out
end

local function tryFastTravel(name)
	if FastTravel then
		local ok = pcall(function()
			FastTravel:InvokeServer(name)
		end)
		if ok then
			notify("Fast Travel", name, "Success")
			return true
		end
	end
	local loc = findLocation(name)
	if loc and tpObj(loc) then
		notify("Location", name, "Success")
		return true
	end
	notify("Location", name .. " not found", "Warning")
	return false
end

local function redeem(code)
	code = code and string.gsub(code, "^%s*(.-)%s*$", "%1") or ""
	if code == "" then
		notify("Codes", "Enter a code first", "Warning")
		return
	end
	local ok = pcall(function()
		return RedeemCode:InvokeServer(code)
	end)
	notify(ok and "Code Redeemed" or "Code Failed", ok and code or ("Couldn't redeem " .. code), ok and "Success" or "Error")
end

--// Movement
local function forCharacterDescendants(callback)
	local char = LocalPlayer.Character
	if not char then
		return
	end
	for _, d in ipairs(char:GetDescendants()) do
		callback(d)
	end
end

local function silentFeet()
	forCharacterDescendants(function(d)
		if d:IsA("Sound") then
			local n = string.lower(d.Name)
			if string.find(n, "foot") or string.find(n, "step") or string.find(n, "walk") or string.find(n, "run") then
				d.Volume = 0
			end
		end
	end)
end

local function infiniteStamina()
	forCharacterDescendants(function(d)
		if d:IsA("NumberValue") or d:IsA("IntValue") then
			local n = string.lower(d.Name)
			if string.find(n, "stamina") or string.find(n, "energy") then
				d.Value = 999
			end
		end
	end)
end

local function startFly()
	if flying then
		return
	end
	local r = hrp()
	if not r then
		return
	end
	flying = true
	flyBV = Instance.new("BodyVelocity")
	flyBV.MaxForce = Vector3.new(9e9, 9e9, 9e9)
	flyBV.Velocity = Vector3.zero
	flyBV.Parent = r
	flyBG = Instance.new("BodyGyro")
	flyBG.MaxTorque = Vector3.new(9e9, 9e9, 9e9)
	flyBG.P = 18000
	flyBG.Parent = r
end

local function stopFly()
	flying = false
	if flyBV then
		flyBV:Destroy()
		flyBV = nil
	end
	if flyBG then
		flyBG:Destroy()
		flyBG = nil
	end
end

local function setFullbright(enabled)
	if enabled then
		if not savedLighting then
			savedLighting = {
				Brightness = Lighting.Brightness,
				ClockTime = Lighting.ClockTime,
				FogEnd = Lighting.FogEnd,
				GlobalShadows = Lighting.GlobalShadows,
				Ambient = Lighting.Ambient,
			}
		end
	elseif savedLighting then
		for property, value in savedLighting do
			Lighting[property] = value
		end
		savedLighting = nil
	end
end

local function setInstantPrompts(enabled)
	if promptConnection then
		promptConnection:Disconnect()
		promptConnection = nil
	end
	if not enabled then
		return
	end
	for _, d in ipairs(Workspace:GetDescendants()) do
		if d:IsA("ProximityPrompt") then
			d.HoldDuration = 0
		end
	end
	promptConnection = Library:Track(Workspace.DescendantAdded:Connect(function(d)
		if d:IsA("ProximityPrompt") then
			d.HoldDuration = 0
		end
	end))
end

--// Window
local Window = Library:CreateWindow({
	Title = "Bloxrooms",
	Subtitle = "Made By Evol • v0.1.4",
	Theme = "Amber",
	Width = 640,
	Height = 480,
	ToggleKey = Enum.KeyCode.LeftControl,
	IntroText = "Loading Bloxrooms Hub...",
	MobileButtonText = "BR",
})

local Tabs = {
	Info = Window:CreateTab({ Name = "Info" }),
	ESP = Window:CreateTab({ Name = "ESP" }),
	Player = Window:CreateTab({ Name = "Player" }),
	Artifacts = Window:CreateTab({ Name = "Artifacts" }),
	Escape = Window:CreateTab({ Name = "Escape" }),
	Codes = Window:CreateTab({ Name = "Codes" }),
	Utility = Window:CreateTab({ Name = "Utility" }),
	Teleport = Window:CreateTab({ Name = "Teleport" }),
}

--// Info tab
local InfoSection = Tabs.Info:CreateSection("Game Info")
InfoSection:AddParagraph({
	Title = "Bloxrooms",
	Content = "v0.1.4 • Escapes • Rarity ESP • Sell All • Fast Travel\nPlaceId 90477253860739\nMade by Evol",
})

local LiveStatus = Tabs.Info:CreateSection("Live Status"):AddStats({
	Rows = { "Escape Open", "World Event", "Blackout", "Artifacts Out", "Entities" },
})

local function yesNo(value, goodWhenTrue)
	if value then
		return "Yes", goodWhenTrue and COLORS.Good or COLORS.Bad
	end
	return "No", COLORS.Muted
end

local function refreshLiveStatus()
	LiveStatus:Set("Escape Open", yesNo(escapeOpen(), true))
	LiveStatus:Set("World Event", yesNo(Workspace:GetAttribute("WorldEventActive"), true))
	LiveStatus:Set("Blackout", yesNo(Workspace:GetAttribute("EventBlackout"), false))

	local arts = countArtifacts()
	LiveStatus:Set("Artifacts Out", arts, arts > 0 and COLORS.Good or COLORS.Muted)

	local ents = #listEntities()
	LiveStatus:Set("Entities", ents, ents > 0 and COLORS.Bad or COLORS.Muted)
end

--// ESP tab
local VisualsSection = Tabs.ESP:CreateSection("Visuals")

VisualsSection:AddToggle({
	Name = "Player ESP",
	Flag = "PlayerESP",
	Default = CFG.PlayerESP,
	Callback = function(v)
		CFG.PlayerESP = v
	end,
})

VisualsSection:AddToggle({
	Name = "Entity ESP",
	Description = "Real entity names",
	Flag = "EntityESP",
	Default = CFG.EntityESP,
	Callback = function(v)
		CFG.EntityESP = v
	end,
})

VisualsSection:AddToggle({
	Name = "Artifact ESP",
	Description = "Spawned artifacts only, coloured by rarity",
	Flag = "ArtifactESP",
	Default = CFG.ArtifactESP,
	Callback = function(v)
		CFG.ArtifactESP = v
	end,
})

VisualsSection:AddToggle({
	Name = "Active Escape ESP",
	Flag = "EscapeESP",
	Default = CFG.EscapeESP,
	Callback = function(v)
		CFG.EscapeESP = v
	end,
})

VisualsSection:AddToggle({
	Name = "Spawn Markers ESP",
	Description = "Artifact spawn points, not actual loot",
	Flag = "ArtifactSpawnESP",
	Default = CFG.ArtifactSpawnESP,
	Callback = function(v)
		CFG.ArtifactSpawnESP = v
	end,
})

local LabelSection = Tabs.ESP:CreateSection("Labels")

LabelSection:AddToggle({
	Name = "Show Artifact Rarity",
	Flag = "ShowRarity",
	Default = CFG.ShowRarity,
	Callback = function(v)
		CFG.ShowRarity = v
		clearKind("artifact")
	end,
})

LabelSection:AddToggle({
	Name = "Show Distance",
	Flag = "ShowDistance",
	Default = CFG.ShowDistance,
	Callback = function(v)
		CFG.ShowDistance = v
	end,
})

LabelSection:AddSlider({
	Name = "Max Distance",
	Flag = "MaxDistance",
	Min = 100,
	Max = 2000,
	Default = CFG.MaxDistance,
	Increment = 10,
	Suffix = "studs",
	Callback = function(v)
		CFG.MaxDistance = v
	end,
})

do
	local parts = {}
	for _, rarity in RARITY_ORDER do
		table.insert(parts, string.format('<font color="#%s">%s</font>', RARITY_COLORS[rarity]:ToHex(), string.upper(rarity)))
	end
	LabelSection:AddLabel({ Text = table.concat(parts, "  ·  "), RichText = true, Size = 13 })
end

LabelSection:AddButton({
	Name = "Clear All ESP",
	Style = "Locked",
	Callback = clearAllESP,
})

--// Player tab
local MovementSection = Tabs.Player:CreateSection("Movement")

MovementSection:AddToggle({
	Name = "Speed",
	Flag = "SpeedEnabled",
	Keybind = true,
	Default = CFG.SpeedEnabled,
	Callback = function(v)
		CFG.SpeedEnabled = v
		if not v then
			local h = hum()
			if h then
				h.WalkSpeed = 16
			end
		end
	end,
})

MovementSection:AddSlider({
	Name = "Walk Speed",
	Tooltip = "Capped at 28 to stay safe",
	Flag = "WalkSpeed",
	Min = 16,
	Max = 28,
	Default = CFG.WalkSpeed,
	Callback = function(v)
		CFG.WalkSpeed = v
	end,
})

MovementSection:AddToggle({
	Name = "Fly",
	Description = "WASD to move, Space up, Shift down",
	Flag = "FlyEnabled",
	Keybind = true,
	Default = CFG.FlyEnabled,
	Callback = function(v)
		CFG.FlyEnabled = v
	end,
})

MovementSection:AddSlider({
	Name = "Fly Speed",
	Flag = "FlySpeed",
	Min = 20,
	Max = 100,
	Default = CFG.FlySpeed,
	Callback = function(v)
		CFG.FlySpeed = v
	end,
})

MovementSection:AddToggle({
	Name = "Noclip",
	Flag = "Noclip",
	Keybind = true,
	Default = CFG.Noclip,
	Callback = function(v)
		CFG.Noclip = v
	end,
})

MovementSection:AddToggle({
	Name = "Infinite Jump",
	Flag = "InfiniteJump",
	Keybind = true,
	Default = CFG.InfiniteJump,
	Callback = function(v)
		CFG.InfiniteJump = v
	end,
})

local StealthSection = Tabs.Player:CreateSection("Stealth")

StealthSection:AddToggle({
	Name = "Silent Footsteps",
	Flag = "SilentFeet",
	Default = CFG.SilentFeet,
	Callback = function(v)
		CFG.SilentFeet = v
	end,
})

StealthSection:AddToggle({
	Name = "Infinite Stamina",
	Flag = "InfiniteStamina",
	Default = CFG.InfiniteStamina,
	Callback = function(v)
		CFG.InfiniteStamina = v
	end,
})

local WorldSection = Tabs.Player:CreateSection("World")

WorldSection:AddToggle({
	Name = "Fullbright",
	Description = "Restores your lighting when turned off",
	Flag = "Fullbright",
	Keybind = true,
	Default = CFG.Fullbright,
	Callback = function(v)
		CFG.Fullbright = v
		setFullbright(v)
	end,
})

--// Artifacts tab
local InventorySection = Tabs.Artifacts:CreateSection("Inventory")

local InventoryStats = InventorySection:AddStats({
	Rows = { "Owned", "Total Value", "Top Item" },
})

InventorySection:AddButton({
	Name = "Check Inventory Value",
	Description = "Full breakdown is printed to the console",
	ButtonText = "Check",
	Style = "Codes",
	Callback = function()
		local total, count, rows = inventoryValue()
		if not total then
			return
		end

		InventoryStats:Set("Owned", count)
		InventoryStats:Set("Total Value", "$" .. total, COLORS.Good)

		if count == 0 then
			InventoryStats:Set("Top Item", nil)
			notify("Inventory", "You own 0 artifacts", "Warning")
			return
		end

		local top = rows[1]
		InventoryStats:Set("Top Item", string.format("%s x%d", top.Name, top.Count), rarityColor(top.Rarity))
		notify("Inventory", "Owned: " .. count .. "  |  Total Value: $" .. total, "Success")

		print("========== INVENTORY ==========")
		for _, row in ipairs(rows) do
			print(string.format(
				"%s x%d | $%d each | $%d (%s)",
				row.Name, row.Count, row.Value, row.Count * row.Value, row.Rarity
			))
		end
	end,
})

InventorySection:AddButton({
	Name = "Sell All Artifacts",
	Description = "Click twice to confirm",
	ButtonText = "Sell All",
	Style = "Locked",
	Confirm = true,
	ConfirmText = "Sure?",
	Callback = sellAll,
})

local FarmSection = Tabs.Artifacts:CreateSection("Farm")

local AutoCollectToggle = FarmSection:AddToggle({
	Name = "Auto Collect",
	Description = "Collects artifacts within range",
	Flag = "AutoCollect",
	Default = CFG.AutoCollect,
	Callback = function(v)
		CFG.AutoCollect = v
	end,
})

FarmSection:AddToggle({
	Name = "Auto Farm",
	Description = "Teleports to each artifact and collects it",
	Flag = "AutoFarm",
	Keybind = true,
	Default = CFG.AutoFarm,
	Callback = function(v)
		CFG.AutoFarm = v
		AutoCollectToggle:SetLocked(v, "Auto Farm is on")
	end,
})

FarmSection:AddSlider({
	Name = "Collect Range",
	Flag = "AutoCollectRange",
	Min = 8,
	Max = 40,
	Default = CFG.AutoCollectRange,
	Suffix = "studs",
	Callback = function(v)
		CFG.AutoCollectRange = v
	end,
})

FarmSection:AddSlider({
	Name = "Farm Delay",
	Tooltip = "Lower is faster but riskier",
	Flag = "AutoFarmDelay",
	Min = 0.3,
	Max = 1.5,
	Increment = 0.05,
	Default = CFG.AutoFarmDelay,
	Suffix = "s",
	Callback = function(v)
		CFG.AutoFarmDelay = v
	end,
})

FarmSection:AddButton({
	Name = "Collect Nearest Artifact",
	ButtonText = "Collect",
	Style = "Claim",
	Callback = function()
		local art = nearestArtifact()
		if art and collectOne(art) then
			notify("Artifacts", "Collected " .. artifactName(art), "Success")
		else
			notify("Artifacts", "No artifact nearby, or collecting failed", "Warning")
		end
	end,
})

FarmSection:AddButton({
	Name = "Check Remaining Artifacts",
	ButtonText = "Check",
	Style = "Codes",
	Callback = function()
		local n = countArtifacts()
		notify("Artifacts", n == 0 and "All artifacts picked up" or (n .. " remaining"), n == 0 and "Success" or "Info")
	end,
})

--// Escape tab
local ExitSection = Tabs.Escape:CreateSection("Exit")

local EscapeStats = ExitSection:AddStats({
	Rows = { "Exit Open", "Open Sequence", "Active Escapes" },
})

local function refreshEscapeStats()
	local open = escapeOpen()
	EscapeStats:Set("Exit Open", open and "Yes" or "No", open and COLORS.Good or COLORS.Muted)
	EscapeStats:Set("Open Sequence", tostring(Workspace:GetAttribute("EscapeOpenSequence") or "—"))
	local count = #getActiveEscapes()
	EscapeStats:Set("Active Escapes", count, count > 0 and COLORS.Good or COLORS.Muted)
end

ExitSection:AddButton({
	Name = "Teleport to Active Escape",
	Style = "Claim",
	Callback = tpActiveEscape,
})

ExitSection:AddButton({
	Name = "Print Escape Status",
	Description = "Prints the raw values to the console",
	ButtonText = "Print",
	Style = "Codes",
	Callback = function()
		local open = tostring(Workspace:GetAttribute("EscapeExitOpen"))
		local seq = tostring(Workspace:GetAttribute("EscapeOpenSequence"))
		local actives = getActiveEscapes()
		print("EscapeExitOpen:", open)
		print("EscapeOpenSequence:", seq)
		print("Active Escape models:", #actives)
		notify("Escape", "Open = " .. open .. "  |  Active models = " .. #actives)
	end,
})

--// Codes tab
local RedeemSection = Tabs.Codes:CreateSection("Redeem")

RedeemSection:AddInput({
	Name = "Code",
	Description = "Press Enter to redeem",
	Placeholder = "Enter code",
	Flag = "CodeInput",
	Callback = function(text, enterPressed)
		if enterPressed then
			redeem(text)
		end
	end,
})

RedeemSection:AddButton({
	Name = "Redeem Code",
	Style = "Claim",
	Callback = function()
		redeem(Flags.CodeInput)
	end,
})

local KnownCodesSection = Tabs.Codes:CreateSection("Known Codes")

for _, code in ipairs(CODES) do
	KnownCodesSection:AddButton({
		Name = code,
		ButtonText = "Redeem",
		Style = "Codes",
		Callback = function()
			redeem(code)
		end,
	})
end

KnownCodesSection:AddButton({
	Name = "Redeem All Known Codes",
	Style = "Skip",
	Callback = function()
		for _, code in ipairs(CODES) do
			redeem(code)
			task.wait(0.4)
		end
	end,
})

--// Utility tab
local HelpersSection = Tabs.Utility:CreateSection("Helpers")

HelpersSection:AddToggle({
	Name = "Instant Proximity Prompts",
	Description = "Removes hold time from every prompt",
	Flag = "InstantPrompts",
	Default = CFG.InstantPrompts,
	Callback = function(v)
		CFG.InstantPrompts = v
		setInstantPrompts(v)
	end,
})

--// Teleport tab
local QuickSection = Tabs.Teleport:CreateSection("Quick")

QuickSection:AddButton({
	Name = "Nearest Artifact",
	ButtonText = "Go",
	Style = "Codes",
	Callback = function()
		local _, part = nearestArtifact()
		if part then
			tpPos(part.Position)
			notify("Teleport", "Nearest artifact", "Success")
		else
			notify("Teleport", "No artifacts out", "Warning")
		end
	end,
})

QuickSection:AddButton({
	Name = "Active Escape",
	ButtonText = "Go",
	Style = "Codes",
	Callback = tpActiveEscape,
})

QuickSection:AddSlider({
	Name = "Multi-TP Delay",
	Description = "Wait between stops on cycle / unlock runs",
	Flag = "UnlockTPDelay",
	Min = 0.15,
	Max = 1.5,
	Increment = 0.05,
	Default = CFG.UnlockTPDelay,
	Suffix = "s",
	Callback = function(v)
		CFG.UnlockTPDelay = v
	end,
})

-- Entities
local EntitySection = Tabs.Teleport:CreateSection("Entities")

local EntityDropdown = EntitySection:AddDropdown({
	Name = "Entity",
	Options = KNOWN_ENTITIES,
	Default = KNOWN_ENTITIES[1],
	Searchable = true,
	Flag = "EntityTarget",
})
Library.ConfigIgnore.EntityTarget = true

EntitySection:AddButton({
	Name = "Teleport to Entity",
	Style = "Codes",
	Callback = function()
		local name = Flags.EntityTarget
		local folder = entitiesFolder()
		local e = name and folder and folder:FindFirstChild(name)
		if e and tpObj(e) then
			notify("Entity", name, "Success")
		else
			notify("Entity", tostring(name) .. " not found", "Warning")
		end
	end,
})

EntitySection:AddButton({
	Name = "Refresh From Game",
	Description = "Adds any spawned entities to the list",
	ButtonText = "Refresh",
	Style = "Skip",
	Callback = function()
		local names = table.clone(KNOWN_ENTITIES)
		for _, e in ipairs(listEntities()) do
			if not table.find(names, e.Name) then
				table.insert(names, e.Name)
			end
		end
		EntityDropdown:Refresh(names, true)
		notify("Entities", #listEntities() .. " spawned right now")
	end,
})

EntitySection:AddButton({
	Name = "Cycle All Entities",
	ButtonText = "Cycle",
	Style = "Rebirth",
	Callback = function()
		local list = listEntities()
		if #list == 0 then
			notify("Entities", "No entities found", "Warning")
			return
		end
		for i, e in ipairs(list) do
			if Library.Unloaded then
				return
			end
			tpObj(e)
			notify("Entities", string.format("%d/%d  %s", i, #list, e.Name))
			task.wait(CFG.UnlockTPDelay)
		end
		notify("Entities", "Done", "Success")
	end,
})

EntitySection:AddButton({
	Name = "List Entities",
	Description = "Prints them to the console",
	ButtonText = "Print",
	Style = "Claimed",
	Callback = function()
		local list = listEntities()
		print("===== ENTITIES =====")
		for _, e in ipairs(list) do
			print(e.Name, e:GetAttribute("CollectionId") or "")
		end
		notify("Entities", #list .. " found (see console)")
	end,
})

-- Locations
local LocationSection = Tabs.Teleport:CreateSection("Locations")

LocationSection:AddDropdown({
	Name = "Location",
	Options = LOCATION_NAMES,
	Default = LOCATION_NAMES[1],
	Searchable = true,
	Flag = "LocationTarget",
})
Library.ConfigIgnore.LocationTarget = true

LocationSection:AddButton({
	Name = "Travel to Location",
	Style = "Codes",
	Callback = function()
		if Flags.LocationTarget then
			tryFastTravel(Flags.LocationTarget)
		end
	end,
})

local UnlockProgress = LocationSection:AddProgressBar({
	Name = "Unlock Progress",
	Min = 0,
	Max = 1,
	Default = 0,
})
UnlockProgress:SetText("Idle")

LocationSection:AddButton({
	Name = "Unlock All Locations",
	Description = "Teleports through every zone",
	ButtonText = "Unlock",
	Style = "Claim",
	Callback = function()
		if unlockRunning then
			notify("Unlock", "Already running", "Warning")
			return
		end

		local locs = allLocations()
		if #locs == 0 then
			notify("Unlock", "No LocationDiscovery zones found", "Warning")
			return
		end

		unlockRunning = true
		notify("Unlock", "Teleporting through " .. #locs .. " locations...")

		for i, loc in ipairs(locs) do
			if not unlockRunning or Library.Unloaded then
				break
			end
			tpObj(loc)
			UnlockProgress:SetText(string.format("%d / %d  %s", i, #locs, loc.Name))
			UnlockProgress:Set(i / #locs)
			task.wait(CFG.UnlockTPDelay)
		end

		local finished = unlockRunning
		unlockRunning = false
		UnlockProgress:SetText(finished and "Done" or "Stopped")
		notify("Unlock", finished and "Done" or "Stopped", finished and "Success" or "Warning")
	end,
})

LocationSection:AddButton({
	Name = "Stop Unlock",
	ButtonText = "Stop",
	Style = "Locked",
	Callback = function()
		unlockRunning = false
	end,
})

-- Still Lifes / NPCs
local StillLifeSection = Tabs.Teleport:CreateSection("Still Lifes / NPCs")

StillLifeSection:AddDropdown({
	Name = "NPC",
	Options = STILL_LIFE_NAMES,
	Default = STILL_LIFE_NAMES[1],
	Searchable = true,
	Flag = "StillLifeTarget",
})
Library.ConfigIgnore.StillLifeTarget = true

StillLifeSection:AddButton({
	Name = "Teleport to NPC",
	Style = "Codes",
	Callback = function()
		local name = Flags.StillLifeTarget
		local folder = Workspace:FindFirstChild("StillLifes")
		local n = name and folder and folder:FindFirstChild(name)
		if n and tpObj(n) then
			notify("Still Life", name, "Success")
		else
			notify("Still Life", tostring(name) .. " not found", "Warning")
		end
	end,
})

StillLifeSection:AddButton({
	Name = "Visit All Still Lifes + Areas",
	ButtonText = "Visit",
	Style = "Rebirth",
	Callback = function()
		notify("Still Lifes", "Visiting NPCs and areas...")
		for _, n in ipairs(stillLifeNPCs()) do
			if Library.Unloaded then
				return
			end
			tpObj(n)
			task.wait(CFG.UnlockTPDelay)
		end
		for _, a in ipairs(stillLifeAreas()) do
			if Library.Unloaded then
				return
			end
			tpObj(a)
			task.wait(CFG.UnlockTPDelay)
		end
		notify("Still Lifes", "Done", "Success")
	end,
})

--// Settings tab
local SettingsTab = Window:CreateSettingsTab()
SettingsTab:CreateSection("Credits"):AddParagraph({
	Title = "Credits",
	Content = "Made by Evol\nBloxrooms v0.1.4\nDump PlaceId 90477253860739\nUI: Project RetroSlop v" .. Library.Version,
})

--// ESP scan
local function scanESP()
	local cam = camera()
	if not cam then
		return
	end
	local origin = cam.CFrame.Position

	for obj, data in pairs(ESP) do
		if not obj.Parent or not data.Part or not data.Part.Parent then
			clearESP(obj)
		else
			local dist = (origin - data.Part.Position).Magnitude
			local on = dist <= CFG.MaxDistance
			data.Billboard.Enabled = on
			data.Highlight.Enabled = on
			if on then
				data.Label.Text = CFG.ShowDistance and (data.Name .. "  •  " .. math.floor(dist) .. "m") or data.Name
			end
		end
	end

	-- Players
	if CFG.PlayerESP then
		for _, plr in ipairs(Players:GetPlayers()) do
			if plr ~= LocalPlayer and alive(plr) and plr.Character and not ESP[plr.Character] then
				addESP(plr.Character, Color3.fromRGB(0, 170, 255), plr.DisplayName or plr.Name, "player")
			end
		end
	else
		clearKind("player")
	end

	-- Entities
	if CFG.EntityESP then
		local folder = entitiesFolder()
		if folder then
			for _, child in ipairs(folder:GetChildren()) do
				if (child:IsA("Model") or child:IsA("BasePart")) and not ESP[child] then
					addESP(child, Color3.fromRGB(255, 60, 60), child.Name, "entity")
				end
			end
		end
		for _, child in ipairs(Workspace:GetChildren()) do
			if not ESP[child] and isEntity(child) then
				addESP(child, Color3.fromRGB(255, 50, 50), child.Name, "entity")
			end
		end
	else
		clearKind("entity")
	end

	-- Artifacts
	if CFG.ArtifactESP then
		for _, folder in ipairs(artifactFolders()) do
			for _, child in ipairs(folder:GetChildren()) do
				if isArtifact(child) and not ESP[child] then
					local display = artifactName(child)
					local rarity = child:GetAttribute("ArtifactRarity")
					local label = display
					if CFG.ShowRarity and rarity then
						label = display .. " [" .. tostring(rarity) .. "]"
					end
					addESP(child, rarityColor(rarity), label, "artifact")
				end
			end
		end
	else
		clearKind("artifact")
	end

	-- Escapes
	if CFG.EscapeESP then
		for _, esc in ipairs(getActiveEscapes()) do
			local door = esc:FindFirstChild("Door", true) or esc
			if not ESP[door] then
				addESP(door, Color3.fromRGB(255, 220, 50), "EXIT (ACTIVE)", "escape")
			end
		end
	else
		clearKind("escape")
	end

	-- Spawn markers
	if CFG.ArtifactSpawnESP then
		local spawns = Workspace:FindFirstChild("ArtifactSpawns")
		if spawns then
			for _, d in ipairs(spawns:GetDescendants()) do
				if (d:IsA("BasePart") or d:IsA("Model")) and not ESP[d] and not isArtifact(d) then
					if string.find(d.Name, "Spawn") or d:GetAttribute("GeneratedArtifactSpawn") then
						addESP(d, Color3.fromRGB(255, 200, 50), "SPAWN", "spawn")
					end
				end
			end
		end
	else
		clearKind("spawn")
	end
end

--// Background loops
task.spawn(function()
	while not Library.Unloaded do
		task.wait(1)
		if Library.Unloaded then
			break
		end
		local ok, err = pcall(scanESP)
		if not ok then
			warn("[Bloxrooms] ESP scan error: " .. tostring(err))
		end
	end
end)

task.spawn(function()
	while not Library.Unloaded do
		pcall(refreshLiveStatus)
		pcall(refreshEscapeStats)
		task.wait(1.5)
	end
end)

-- Auto collect (in range)
task.spawn(function()
	while not Library.Unloaded do
		task.wait(0.4)
		if not CFG.AutoCollect or CFG.AutoFarm then
			continue
		end
		local root = hrp()
		if not root then
			continue
		end

		local any = false
		for _, folder in ipairs(artifactFolders()) do
			for _, child in ipairs(folder:GetChildren()) do
				if Library.Unloaded or not CFG.AutoCollect then
					break
				end
				if isArtifact(child) then
					any = true
					local p = getPart(child)
					if p and (root.Position - p.Position).Magnitude <= CFG.AutoCollectRange then
						if collectOne(child) then
							notify("Auto Collect", "Collected " .. artifactName(child), "Success")
						end
						task.wait(0.2)
					end
				end
			end
		end

		if not any and os.clock() - lastEmptyNotify > 8 then
			lastEmptyNotify = os.clock()
			notify("Auto Collect", "All artifacts picked up")
		end
	end
end)

-- Auto farm (teleport + collect)
task.spawn(function()
	while not Library.Unloaded do
		task.wait(CFG.AutoFarmDelay)
		if not CFG.AutoFarm then
			continue
		end
		local root = hrp()
		if not root then
			continue
		end

		local art, part = nearestArtifact()
		if art and part then
			root.AssemblyLinearVelocity = Vector3.zero
			root.CFrame = part.CFrame + Vector3.new(0, 3.5, 0)
			task.wait(0.15)
			if collectOne(art) then
				notify("Auto Farm", "Collected " .. artifactName(art), "Success")
			end
		elseif os.clock() - lastEmptyNotify > 8 then
			lastEmptyNotify = os.clock()
			notify("Auto Farm", "All artifacts picked up")
		end
	end
end)

-- Per-frame movement
local characterSweep = 0

Library:Track(RunService.RenderStepped:Connect(function(dt)
	characterSweep += dt
	if characterSweep >= 0.5 then
		characterSweep = 0
		if CFG.SilentFeet then
			silentFeet()
		end
		if CFG.InfiniteStamina then
			infiniteStamina()
		end
	end

	if CFG.SpeedEnabled then
		local h = hum()
		if h then
			h.WalkSpeed = math.clamp(CFG.WalkSpeed, 16, 28)
		end
	end

	if CFG.FlyEnabled then
		if not flying then
			startFly()
		end
		local cam = camera()
		if flyBV and flyBG and cam then
			local cf = cam.CFrame
			local dir = Vector3.zero
			if UserInputService:IsKeyDown(Enum.KeyCode.W) then
				dir += cf.LookVector
			end
			if UserInputService:IsKeyDown(Enum.KeyCode.S) then
				dir -= cf.LookVector
			end
			if UserInputService:IsKeyDown(Enum.KeyCode.A) then
				dir -= cf.RightVector
			end
			if UserInputService:IsKeyDown(Enum.KeyCode.D) then
				dir += cf.RightVector
			end
			if UserInputService:IsKeyDown(Enum.KeyCode.Space) then
				dir += Vector3.yAxis
			end
			if UserInputService:IsKeyDown(Enum.KeyCode.LeftShift) then
				dir -= Vector3.yAxis
			end
			flyBV.Velocity = dir.Magnitude > 0 and dir.Unit * CFG.FlySpeed or Vector3.zero
			flyBG.CFrame = cf
		end
	elseif flying then
		stopFly()
	end

	if CFG.Noclip then
		local char = LocalPlayer.Character
		if char then
			for _, p in ipairs(char:GetChildren()) do
				if p:IsA("BasePart") then
					p.CanCollide = false
				end
			end
		end
	end

	if CFG.Fullbright then
		Lighting.Brightness = 2
		Lighting.ClockTime = 14
		Lighting.FogEnd = 100000
		Lighting.GlobalShadows = false
		Lighting.Ambient = Color3.fromRGB(170, 170, 170)
	end
end))

Library:Track(UserInputService.JumpRequest:Connect(function()
	if CFG.InfiniteJump then
		local h = hum()
		if h then
			h:ChangeState(Enum.HumanoidStateType.Jumping)
		end
	end
end))

Library:Track(LocalPlayer.CharacterAdded:Connect(function()
	stopFly()
end))

--// Cleanup on unload
Library:OnUnload(function()
	unlockRunning = false
	CFG.AutoCollect = false
	CFG.AutoFarm = false
	clearAllESP()
	stopFly()
	setFullbright(false)
	setInstantPrompts(false)
	if CFG.SpeedEnabled then
		local h = hum()
		if h then
			h.WalkSpeed = 16
		end
	end
end)

--// Start
Library:LoadAutoload()

Library:Notify({
	Title = "Bloxrooms",
	Content = "v0.1.4 loaded. Left Ctrl toggles the menu.",
	Style = "Theme",
	Duration = 5,
})
Executor compatibility changes over time. Check current reports before testing.

Copy the code above into a compatible Roblox script executor if you choose to test it.

Bloxrooms Script Status

✓AvailabilityFree
$Price$0
◫CompatibilityDesktop & Mobile
★SafetyVerified

Roblox and game updates can affect compatibility, so the script’s status should be treated as temporary rather than guaranteed.

Frequently Asked Questions

What is a Bloxrooms script?

A Bloxrooms script is third-party Lua code intended to run alongside the Roblox game through a compatible script executor.

What features does this Bloxrooms script include?

Different scripts contain different code. This version includes: Artifacts:, An inventory panel showing Owned, Total Value and Top Item., Sell All needs a second click to confirm., Teleport:, Unlock All shows a progress bar..

How do you use the Bloxrooms script?

Pick a compatible executor such as Hydrogen, MacSploit, AWP.GG, Delta, Fluxus, Codex, launch Roblox and join the game, copy the complete Lua code from the script card above, paste it into the executor’s editor, and click Run or Execute. Compatibility changes over time, so a name here doesn’t guarantee current support.

Can a Bloxrooms script get your Roblox account banned?

Yes. Third-party scripts can violate Roblox rules and may put an account at risk. Only use code from a source you trust, never enter your Roblox password into a script or executor, and test on an alternate account first.

Does the Bloxrooms script work on mobile?

Check whether both the executor and the script support your device and the current Roblox version. Mobile executor support does not guarantee that every script will work.

Check out our Roblox Scripts hub and Roblox Games Directory for more.

Leave a Comment