ScriptKeyless
auto roll, auto buy, auto equip best, open source, keyless
[⭐] Star RNGDesktop compatibleReal
Description
- Auto Roll Stars based off rarity - Auto Upgrade {Star Luck, Add Pedestals} - Auto Unlock Altars - Auto Buy Stars based off rarity - Auto Place Stars on Altar. - Auto Buy Mutation Merchant Shop Items - Auto Buy Pet Eggs - Auto Buy Gear Shop
GAME[⭐] Star RNG
UPDATEDOct 10, 2026
ACCESSKeyless
PLATFORMDesktop
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. 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 BloxScripts Risk Notice ]]
--[[rscripts:analytics:start]]
-- Script analytics (enabled by the creator on rscripts.net).
-- Runs in its own thread and cannot affect the script below.
task.spawn(function()
pcall(function()
loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6aa8b9674e0196ca2c5db023"))()
end)
end)
--[[rscripts:analytics:end]]
--// Star RNG | @hidevin
local Repo = "https://raw.githubusercontent.com/joustingmatch/ObsidianUltra/main/"
local Library = loadstring(game:HttpGet(Repo .. "Library.lua"))()
local ThemeManager = loadstring(game:HttpGet(Repo .. "addons/ThemeManager.lua"))()
local SaveManager = loadstring(game:HttpGet(Repo .. "addons/SaveManager.lua"))()
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
local VirtualUser = game:GetService("VirtualUser")
local LocalPlayer = Players.LocalPlayer
local Options = Library.Options
local Toggles = Library.Toggles
local RARITIES = {"Common","Uncommon","Rare","Epic","Legendary","Mythic","Exotic","Radiant","Secret","Exalted","Divine","Eternal","Transcendent","Absolute"}
local RARITY_ORDER = {}
for i, r in ipairs(RARITIES) do RARITY_ORDER[r] = i end
local MUTATION_IDS = {"SyringeNeedle","MoonNeedle","CometNeedle","PlanetNeedle","AlienNeedle","GalaxyNeedle","BlackholeNeedle"}
local EGG_NAMES = {"Starlight Egg","Orbit Egg","Nebula Egg","Cosmic Egg","Eclipse Egg","Celestial Egg","Mythic Egg","Apex Egg"}
local GEAR_IDS = {"Energizer","Overloader","Supercharger","Turbocharger"}
local function GetOwnArea()
local map = Workspace:FindFirstChild("RollForStarsMap")
if not map then return nil end
for _, v in ipairs(map:GetChildren()) do
if v.Name:match("^PlayerArea_%d+$") then
local o = v:FindFirstChild("Owner")
if o and o.Value == LocalPlayer then return v end
end
end
return nil
end
local function GetRollPrompt()
local area = GetOwnArea()
if not area then return nil end
local roller = area:FindFirstChild("Roller")
local lever = roller and roller:FindFirstChild("LeverAssembly")
local anchor = lever and lever:FindFirstChild("RollPromptAnchor")
local p = anchor and anchor:FindFirstChildOfClass("ProximityPrompt")
return p
end
local function GetTrashPrompt()
local area = GetOwnArea()
if not area then return nil end
local d = area:FindFirstChild("Dumpster")
d = d and d:FindFirstChild("Dumpster")
if d then return d:FindFirstChild("TrashPrompt") end
return nil
end
local function GetCollectTrigger()
local area = GetOwnArea()
if not area then return nil end
local c = area:FindFirstChild("Collector")
if c then return c:FindFirstChild("CollectTrigger") end
return nil
end
local function GetOwnRollingStars()
local out = {}
local area = GetOwnArea()
if not area then return out end
for _, d in ipairs(area:GetDescendants()) do
if d:IsA("ProximityPrompt") and d.Parent and d.Parent.Name == "RollingStar" then
table.insert(out, {Prompt = d, Star = d.Parent})
end
end
return out
end
local function GetEmptyAltars()
local out = {}
local area = GetOwnArea()
if not area then return out end
local rm = area:FindFirstChild("RegionMarker")
local altars = rm and rm:FindFirstChild("Altars")
if not altars then return out end
for _, a in ipairs(altars:GetChildren()) do
if a:IsA("Model") and a:FindFirstChild("DepositedStar", true) == nil then
table.insert(out, a)
end
end
return out
end
local function FireRemote(name, a, b)
local r
local ok = pcall(function() r = ReplicatedStorage:WaitForChild(name, 5) end)
if not ok or not r then return end
if a == nil then
pcall(function() r:FireServer() end)
elseif b == nil then
pcall(function() r:FireServer(a) end)
else
pcall(function() r:FireServer(a, b) end)
end
end
local function FirePrompt(p)
if p ~= nil and p.Parent ~= nil then
pcall(function() fireproximityprompt(p) end)
end
end
-- Server enforces MaxActivationDistance on prompts (Trash = 10).
-- Teleport into range, fire, restore. Only used where the target is
-- inherently elsewhere (Dumpster); Roll/Buy assume you park at the roller.
local function DoPromptNear(prompt, holdWait)
if prompt == nil or prompt.Parent == nil then return false end
local char = LocalPlayer.Character
local hrp = char and char:FindFirstChild("HumanoidRootPart")
if not hrp then FirePrompt(prompt) return false end
local part = prompt.Parent
while part and not part:IsA("BasePart") do part = part.Parent end
if not part then FirePrompt(prompt) return false end
local maxD = prompt.MaxActivationDistance or 10
if (hrp.Position - part.Position).Magnitude <= (maxD - 1) then
FirePrompt(prompt)
return true
end
local orig = hrp.CFrame
pcall(function() hrp.CFrame = part.CFrame + Vector3.new(0, 3, 0) end)
task.wait(0.35)
FirePrompt(prompt)
task.wait(holdWait or 0.8)
pcall(function() hrp.CFrame = orig end)
return true
end
local function FindStarTool()
local places = {LocalPlayer.Character, LocalPlayer:FindFirstChild("Backpack")}
for _, c in ipairs(places) do
if c then
for _, t in ipairs(c:GetChildren()) do
if t:IsA("Tool") and (t:GetAttribute("StarName") or t:GetAttribute("StarAsset") or t:GetAttribute("StarIncome")) then
return t
end
end
end
end
return nil
end
local function IsSelected(idx, key)
local o = Options[idx]
if not o then return false end
local v = o.Value
if type(v) ~= "table" then return false end
if v[key] ~= nil then return v[key] == true end
for _, k in pairs(v) do if k == key then return true end end
return false
end
-- First star tool whose rarity is in the Trash multi-select.
local function FindTrashTool()
local places = {LocalPlayer.Character, LocalPlayer:FindFirstChild("Backpack")}
for _, c in ipairs(places) do
if c then
for _, t in ipairs(c:GetChildren()) do
if t:IsA("Tool") and t:GetAttribute("StarAsset") then
local r = t:GetAttribute("StarRarity")
if r and IsSelected("TrashRarities", r) then return t end
end
end
end
end
return nil
end
local Window = Library:CreateWindow({
Title = "@hidevin",
Footer = "[⭐] Star RNG | Leave a like on Rscripts if it works. @hidevin",
CopyableFooter = false,
DisableSearch = true,
Minimizable = true,
ShowCustomCursor = true,
NotifySide = "Right",
Animations = {TabSwitch = true, Groupbox = true, Dropdown = true},
})
pcall(function()
Window:SetCornerRadius(10)
Library:SetDPIScale(100)
if Library.Scheme then
Library.Scheme.AccentColor = Color3.fromRGB(88, 101, 242)
end
end)
local Tabs = {
Main = Window:AddTab({Name = "Main", Description = "Overview & status"}),
Farming = Window:AddTab({Name = "Farming", Description = "Place, unlock, collect, sell"}),
Inventory = Window:AddTab({Name = "Inventory", Description = "Roll, buy, upgrade, shops"}),
Settings = Window:AddTab({Name = "Settings", Description = "Configure the menu"}),
}
Tabs.Main:AddPlayerInfo("MainBanner", {
Title = "Welcome, <b>@hidevin</b>",
Description = {"[⭐] Star RNG — roll, place, upgrade", "All Auto loops run on a 1s interval."},
ThumbnailType = "HeadShot",
Height = 84,
})
local MainInfo = Tabs.Main:AddLeftGroupbox("Session")
MainInfo:AddLabel("StatusLabel", {Text = "Status: loading...", DoesWrap = true})
MainInfo:AddLabel("AreaLabel", {Text = "Plot: ...", DoesWrap = true})
MainInfo:AddLabel("SessionLabel", {Text = "Session: 0s", DoesWrap = true})
MainInfo:AddDivider()
MainInfo:AddButton({Text = "Teleport: Base", Func = function() FireRemote("TeleportToBase") end})
MainInfo:AddButton({Text = "Teleport: Market", Func = function() FireRemote("TeleportToMarket") end})
local MainRight = Tabs.Main:AddRightGroupbox("Quick Status")
MainRight:AddLabel("CashLabel", {Text = "Cash: ...", DoesWrap = true})
MainRight:AddLabel("AltarLabel", {Text = "Altars: ...", DoesWrap = true})
MainRight:AddLabel("PedestalLabel", {Text = "Rolling stars: ...", DoesWrap = true})
--// Farming: single tab, no sub-tabs (one feature per group) ----------------
local FarmAuto = Tabs.Farming:AddLeftGroupbox("Automation")
FarmAuto:AddToggle("AutoPlace", {Text = "Auto Place Best Stars", Default = false, Tooltip = "Hits Equip Best (EquipBestStarsEvent). 1s loop."})
FarmAuto:AddToggle("AutoUnlock", {Text = "Auto Unlock Altars", Default = false, Tooltip = "Fires UpgradeAltarEvent. 1s loop."})
FarmAuto:AddToggle("AutoCollect", {Text = "Auto Collect Income", Default = false, Tooltip = "Touches your Collector via firetouchinterest. Works at range. 1s loop."})
local SellBox = Tabs.Farming:AddRightGroupbox("Selling")
SellBox:AddToggle("AutoTrash", {Text = "Auto Trash Stars", Default = false, Tooltip = "Equips a matching star, teleports to Dumpster (prompt needs range), trashes, returns. 1s loop."})
SellBox:AddDropdown("TrashRarities", {Text = "Rarities To Trash", Values = RARITIES, Default = {"Common"}, Multi = true, Searchable = true})
--// Inventory: Roll & Buy combined into one sub-tab -------------------------
local InvRB = Tabs.Inventory:AddSubTab({Name = "Roll & Buy"})
local InvUpg = Tabs.Inventory:AddSubTab({Name = "Upgrades"})
local InvShop = Tabs.Inventory:AddSubTab({Name = "Shops"})
local RollBox = InvRB:AddLeftGroupbox("Auto Roll")
RollBox:AddToggle("AutoRoll", {Text = "Auto Roll Stars", Default = false, Tooltip = "Fires Roll prompt. Park near your roller. 1s loop."})
RollBox:AddDropdown("RollStopRarity", {Text = "Stop On Rarity", Values = RARITIES, Default = 5, Tooltip = "Used with Stop toggle below."})
RollBox:AddToggle("RollStopEnabled", {Text = "Stop Rolling On Target+", Default = false, Tooltip = "Pause rolling when a pedestal star meets/exceeds target rarity."})
local BuyBox = InvRB:AddRightGroupbox("Auto Buy Stars")
BuyBox:AddToggle("AutoBuyStars", {Text = "Auto Buy Stars", Default = false, Tooltip = "Buys pedestal stars matching rarities. 1s loop."})
BuyBox:AddDropdown("BuyStarRarities", {Text = "Rarities To Buy", Values = RARITIES, Default = RARITIES, Multi = true, Searchable = true})
local UpgBox = InvUpg:AddLeftGroupbox("Star Upgrades")
UpgBox:AddToggle("AutoLuck", {Text = "Auto Upgrade Star Luck", Default = false, Tooltip = "UpgradeBoardEvent Luck. 1s loop."})
UpgBox:AddToggle("AutoPedestal", {Text = "Auto Add Pedestals", Default = false, Tooltip = "UpgradeBoardEvent Pedestal. 1s loop."})
local MutBox = InvShop:AddLeftGroupbox("Mutation Merchant")
MutBox:AddToggle("AutoMut", {Text = "Auto Buy Mutation Items", Default = false})
MutBox:AddDropdown("MutItems", {Text = "Items (Multi-Select)", Values = MUTATION_IDS, Default = MUTATION_IDS, Multi = true})
local EggBox = InvShop:AddRightGroupbox("Pet Eggs")
EggBox:AddToggle("AutoEgg", {Text = "Auto Buy Pet Eggs", Default = false})
EggBox:AddDropdown("EggItems", {Text = "Eggs (Multi-Select)", Values = EGG_NAMES, Default = EGG_NAMES, Multi = true})
local GearBox = InvShop:AddLeftGroupbox("Gear Shop")
GearBox:AddToggle("AutoGear", {Text = "Auto Buy Gear", Default = false})
GearBox:AddDropdown("GearItems", {Text = "Gear (Multi-Select)", Values = GEAR_IDS, Default = GEAR_IDS, Multi = true})
GearBox:AddDropdown("GearQty", {Text = "Quantity", Values = {"1", "10"}, Default = 1})
local MenuBox = Tabs.Settings:AddLeftGroupbox("Menu")
MenuBox:AddToggle("AntiAFK", {Text = "Anti-AFK", Default = true, Tooltip = "Fires AFKActivity + anti-idle. Enabled by default."})
MenuBox:AddLabel("MenuKeyLabel"):AddKeyPicker("MenuKeybind", {Default = "RightShift", NoUI = true, Text = "Menu keybind"})
MenuBox:AddDropdown("DPIScale", {Text = "DPI Scale", Values = {"50%","75%","100%","125%","150%","175%","200%"}, Default = "100%", Callback = function(v) Library:SetDPIScale(tonumber((v:gsub("%%","")))) end})
MenuBox:AddSlider("CornerRadius", {Text = "Corner Radius", Default = 10, Min = 0, Max = 20, Rounding = 0, Callback = function(v) Window:SetCornerRadius(v) end})
MenuBox:AddDivider()
MenuBox:AddButton("Unload", function() Library:Unload() end)
Library.ToggleKeybind = Options.MenuKeybind
ThemeManager:SetLibrary(Library)
SaveManager:SetLibrary(Library)
SaveManager:IgnoreThemeSettings()
SaveManager:SetIgnoreIndexes({"MenuKeybind"})
ThemeManager:SetFolder("hidevin")
SaveManager:SetFolder("hidevin/Star RNG")
SaveManager:BuildConfigSection(Tabs.Settings)
ThemeManager:ApplyToTab(Tabs.Settings)
SaveManager:LoadAutoloadConfig()
task.spawn(function()
while not Library.Unloaded do
if Toggles.AutoRoll and Toggles.AutoRoll.Value then
local skip = false
if Toggles.RollStopEnabled and Toggles.RollStopEnabled.Value and Options.RollStopRarity then
local target = Options.RollStopRarity.Value
local ti = RARITY_ORDER[target] or 0
for _, e in ipairs(GetOwnRollingStars()) do
local r = e.Star:GetAttribute("StarRarity")
if r and (RARITY_ORDER[r] or 0) >= ti then skip = true break end
end
end
if not skip then FirePrompt(GetRollPrompt()) end
end
task.wait(1)
end
end)
task.spawn(function()
while not Library.Unloaded do
if Toggles.AutoBuyStars and Toggles.AutoBuyStars.Value then
for _, e in ipairs(GetOwnRollingStars()) do
local r = e.Star:GetAttribute("StarRarity")
if r and IsSelected("BuyStarRarities", r) then FirePrompt(e.Prompt) task.wait(0.2) end
end
end
task.wait(1)
end
end)
task.spawn(function()
while not Library.Unloaded do
if Toggles.AutoPlace and Toggles.AutoPlace.Value then
FireRemote("EquipBestStarsEvent")
end
task.wait(1)
end
end)
task.spawn(function()
while not Library.Unloaded do
if Toggles.AutoUnlock and Toggles.AutoUnlock.Value then FireRemote("UpgradeAltarEvent") end
if Toggles.AutoLuck and Toggles.AutoLuck.Value then FireRemote("UpgradeBoardEvent", "Luck") end
if Toggles.AutoPedestal and Toggles.AutoPedestal.Value then FireRemote("UpgradeBoardEvent", "Pedestal") end
if Toggles.AutoCollect and Toggles.AutoCollect.Value then
local trig = GetCollectTrigger()
local hrp = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
if trig and hrp then
pcall(function()
firetouchinterest(hrp, trig, 0)
task.wait(0.3)
firetouchinterest(hrp, trig, 1)
end)
end
end
task.wait(1)
end
end)
task.spawn(function()
while not Library.Unloaded do
if Toggles.AutoMut and Toggles.AutoMut.Value then
for _, id in ipairs(MUTATION_IDS) do
if IsSelected("MutItems", id) then FireRemote("MutationShopPurchaseEvent", id) task.wait(0.2) end
end
end
if Toggles.AutoEgg and Toggles.AutoEgg.Value then
for i, name in ipairs(EGG_NAMES) do
if IsSelected("EggItems", name) then FireRemote("PurchaseEggEvent", i) task.wait(0.2) end
end
end
if Toggles.AutoGear and Toggles.AutoGear.Value then
local q = 1
if Options.GearQty then q = tonumber(Options.GearQty.Value) or 1 end
for _, id in ipairs(GEAR_IDS) do
if IsSelected("GearItems", id) then FireRemote("ShopPurchaseEvent", id, q) task.wait(0.2) end
end
end
task.wait(1)
end
end)
-- Trash runs solo: equip match, teleport-fire-restore only when needed.
task.spawn(function()
while not Library.Unloaded do
if Toggles.AutoTrash and Toggles.AutoTrash.Value then
local tool = FindTrashTool()
if tool then
if tool.Parent ~= LocalPlayer.Character then
pcall(function()
local h = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
if h then h:EquipTool(tool) end
end)
task.wait(0.4)
end
local held = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Tool")
if held and held:GetAttribute("StarAsset") then
DoPromptNear(GetTrashPrompt(), 0.8)
end
end
end
task.wait(1)
end
end)
do
pcall(function()
LocalPlayer.Idled:Connect(function()
if Toggles.AntiAFK and Toggles.AntiAFK.Value then
VirtualUser:CaptureController()
VirtualUser:ClickButton2(Vector2.new())
end
end)
end)
task.spawn(function()
while not Library.Unloaded do
if Toggles.AntiAFK and Toggles.AntiAFK.Value then FireRemote("AFKActivity") end
task.wait(30)
end
end)
end
do
local t0 = os.clock()
task.spawn(function()
while not Library.Unloaded do
local dt = math.floor(os.clock() - t0)
pcall(function()
local area = GetOwnArea()
local ls = LocalPlayer:FindFirstChild("leaderstats")
local cash = ls and ls:FindFirstChild("Cash")
Options.StatusLabel:SetText("Status: " .. tostring(#GetEmptyAltars()) .. " empty altar(s), " .. tostring(#GetOwnRollingStars()) .. " star(s) on pedestals")
Options.AreaLabel:SetText("Plot: " .. tostring(area and area.Name or "?") .. " | Unlocked: " .. tostring(area and area:GetAttribute("UnlockedAltarCount") or "?"))
Options.SessionLabel:SetText(string.format("Session: %dm %ds", math.floor(dt/60), dt%60))
Options.CashLabel:SetText("Cash: " .. tostring(cash and cash.Value or "?"))
local a2 = GetOwnArea()
local rm = a2 and a2:FindFirstChild("RegionMarker")
local alt = rm and rm:FindFirstChild("Altars")
Options.AltarLabel:SetText("Altars total: " .. tostring(alt and #alt:GetChildren() or "?"))
Options.PedestalLabel:SetText("Rolling stars: " .. tostring(#GetOwnRollingStars()))
end)
task.wait(1)
end
end)
end
Library:Notify({Title = "@hidevin", Description = "Star RNG loaded. Farming single tab; Roll & Buy combined.", Time = 5})
Library:OnUnload(function() print("[@hidevin] Star RNG unloaded") end)
Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place