-- [[ 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 ]] --[[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=6aab338f67057626de2bece0"))() end) end) --[[rscripts:analytics:end]] -- Pets Universe | @hidevin -- UI: ObsidianUltra | Style: UI_STYLE.json | Features: GAME_FEATURES.md -- Game: Pets Universe ([NEW] Pets Universe!) | Universe 10759638075 | Place 74629631798007 -- Verified live 2026-09-16: window renders, no console errors, EquipBest + BuyUpgrade remotes OK. -- Update 2026-09-17: +Auto Golden Pets, +Auto Claim Playtime Rewards/Egg, Anti-AFK now reports AutoRejoinService activity. 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 VirtualUser = game:GetService("VirtualUser") local LocalPlayer = Players.LocalPlayer local Options = Library.Options local Toggles = Library.Toggles pcall(function() Library.Scheme.BackgroundColor = Color3.fromRGB(13, 13, 13) Library.Scheme.MainColor = Color3.fromRGB(40, 40, 40) Library.Scheme.OutlineColor = Color3.fromRGB(58, 58, 58) Library.Scheme.AccentColor = Color3.fromRGB(88, 101, 242) Library.Scheme.FontColor = Color3.fromRGB(255, 255, 255) end) local Window = Library:CreateWindow({ Title = "@hidevin", Footer = { "Pets Universe | ", { Text = "Leave a like on Rscripts if it works. @hidevin", Copyable = true } }, CopyableFooter = true, DisableSearch = true, ToggleKeybind = Enum.KeyCode.RightShift, Minimizable = true, CornerRadius = 10, ShowCustomCursor = true, NotifySide = "Right", }) pcall(function() Window:SetCornerRadius(10) end) local Tabs = { Main = Window:AddTab({ Name = "Main", Description = "Overview", SingleColumn = true }), Farming = Window:AddTab({ Name = "Farming", Description = "Resource collecting" }), Inventory = Window:AddTab({ Name = "Inventory", Description = "Eggs, pets and upgrades" }), Rebirth = Window:AddTab({ Name = "Rebirth", Description = "Moon rebirth" }), Settings = Window:AddTab({ Name = "Settings", Description = "Configure the menu" }), } local SafeGet = require(ReplicatedStorage.Modules.SafeGetService) local function GetSvc(name, methods) local ok, svc = pcall(SafeGet.Get, name, methods) if ok and svc then return svc end return nil end local EGG_LIST = { "Basic Egg", "Sprout Egg", "Grassy Egg", "Dried Egg", "Frost Egg", "Zombie Egg", "Castle Egg", "Universe Egg", "Mushroom Egg" } local MODE_LIST = { "Single", "Half", "Max" } local WORLD_LIST = { "Spawn", "BirchForest", "TreasureDunes", "FrozenAlley", "HauntedHouse", "PetKingdom", "EnchantedGrove", "TheMoon" } -- Moon shop keys (module Order arrays, verified live) local MOON_INC_LIST = { "Damage", "MoreGems", "TapPower", "PetAttackSpeed", "CritDmg", "ChestTier", "Blackhole", "AstralBeeChance", "AstralBeeVariant" } local MOON_PERM_LIST = { "CoinMultiplier", "RubiesMultiplier", "GemsMultiplier", "LuckMultiplier", "HatchSpeedMultiplier", "CritChance", "EggHatch", "PetEquip" } -- Item Crafting recipes (potions II, charms II/III), read live from ItemCraftConfig local CRAFT_IDS = {} pcall(function() local cfg = require(ReplicatedStorage.Modules:FindFirstChild("ItemCraftConfig")) for _, r in ipairs(cfg.Recipes) do if type(r.Id) == "string" then table.insert(CRAFT_IDS, r.Id) end end table.sort(CRAFT_IDS) end) if #CRAFT_IDS == 0 then CRAFT_IDS = { "Potion_Coins", "Potion_Rubies", "Potion_Luck", "Potion_Critical", "Potion_Hatch" } end local ITEM_LIST = { "Apple", "Banana", "Blueberry", "Kiwi", "Mango", "Taco", "CoinsPotion", "CoinsPotion2", "RubiesPotion", "RubiesPotion2", "LuckPotion", "LuckPotion2", "HatchSpeedPotion", "HatchSpeedPotion2", "CriticalPotion", "CriticalPotion2", "Ball", "Bone", "Cookie", "Squeaky", } do Tabs.Main:AddPlayerInfo("MainBanner", { Title = "Welcome, @hidevin", Description = { "Pets Universe - farming and inventory automation", "Farming = breakables | Inventory = hatch, upgrades, worlds" }, ThumbnailType = "HeadShot", Height = 84, }) local Info = Tabs.Main:AddGroupbox({ Name = "Session", Side = 1 }) Info:AddLabel("Game: Pets Universe", true) local clockLbl = Info:AddLabel("SessionTime: 00:00", true) local startT = os.clock() task.spawn(function() while not Library.Unloaded do task.wait(1) local el = math.floor(os.clock() - startT) local mm = string.format("%02d:%02d", math.floor(el / 60), el % 60) pcall(function() clockLbl:SetText("SessionTime: " .. mm) end) end end) end do local BreakTab = Tabs.Farming:AddSubTab("Breakables") local PlayTab = Tabs.Farming:AddSubTab("Playtime") local G = BreakTab:AddLeftGroupbox("Breakables") G:AddToggle("AutoClickBreakables", { Text = "Auto Click Breakables", Default = false, Tooltip = "Clicks nearest + built-in auto" }) G:AddSlider("ClickDelay", { Text = "Click Delay", Default = 100, Min = 50, Max = 1000, Rounding = 0, Suffix = "ms" }) G:AddDropdown("TargetMode", { Text = "Target", Values = { "Nearest", "Gems First", "Alien Egg" }, Default = 1 }) G:AddToggle("TpToEgg", { Text = "Teleport to Alien Egg", Default = true }) local eggLbl = G:AddLabel("Alien Egg: unknown", true) G:AddLabel("Game caps clicks at 10/s - below 100ms gives no extra speed. Fruits skipped.", true) local SKIP_BREAKABLES = { Apple = true, Banana = true, Blueberry = true, Kiwi = true, Mango = true, Taco = true } local ALIEN_NAMES = { AlienEventEgg = true, UFOEgg = true } local function isAlienEgg(m) if not (m and m:IsA("Model")) then return false end if ALIEN_NAMES[m.Name] then return true end -- spawned egg may be renamed: MaxHP attribute + ClickDetector is unique to it if m:GetAttribute("MaxHP") ~= nil and m:FindFirstChildWhichIsA("ClickDetector", true) then return true end return false end local function eggPart(egg) if not (egg and egg.Parent) then return nil end if egg:IsA("Model") then return egg.PrimaryPart or egg:FindFirstChildWhichIsA("BasePart", true) end return egg:IsA("BasePart") and egg or nil end local alienRef = nil local eggAway, eggHome, eggPos = false, nil, nil local function scanEgg() local found = nil for nm in pairs(ALIEN_NAMES) do local m = workspace:FindFirstChild(nm, true) if m and eggPart(m) then found = m break end end if not found then -- server state wake-up: event active but egg under another name local active = false pcall(function() local svc = GetSvc("AlienEventService") local st = svc and svc.GetState and svc.GetState() active = st ~= nil and st ~= "Idle" end) if active then local br = workspace:FindFirstChild("Breakables") if br then for _, d in ipairs(br:GetDescendants()) do if d:IsA("ClickDetector") then local m = d.Parent if m and m:IsA("Model") and not SKIP_BREAKABLES[m.Name] and m:GetAttribute("MaxHP") ~= nil then found = m break end end end end end end alienRef = found if not found and eggAway then -- event over: head back where we came from (e.g. hatching spot), -- unless the player already moved off on their own eggAway = false pcall(function() local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if hrp and eggHome and eggPos and (hrp.Position - eggPos).Magnitude < 120 then hrp.CFrame = eggHome hrp.Velocity = Vector3.zero hrp.RotVelocity = Vector3.zero end end) end local txt = "Alien Egg: not spawned" if alienRef then local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") local epp = eggPart(alienRef) if hrp and epp then txt = string.format("Alien Egg: %d studs", math.floor((epp.Position - hrp.Position).Magnitude)) else txt = "Alien Egg: spawned" end end pcall(function() eggLbl:SetText(txt) end) end -- instant wake-up on the server's spawn announcement (payload ignored) pcall(function() local eggsFolder = ReplicatedStorage:WaitForChild("Remotes"):WaitForChild("Eggs") for _, rn in ipairs({ "AlienEggAnnounce", "AlienEggFall", "AlienEggUI" }) do local r = eggsFolder:FindFirstChild(rn) if r then r.OnClientEvent:Connect(function() task.spawn(scanEgg) end) end end end) task.spawn(function() while not Library.Unloaded do pcall(scanEgg) task.wait(2) end end) G:AddLabel("Uses fireclickdetector on nearest + SetAutoBreaking.", true) local function setBuiltInAuto(on) local svc = GetSvc("BreakableAreaService") if svc and svc.SetAutoBreaking then pcall(function() svc.SetAutoBreaking:Fire(on) end) end end Toggles.AutoClickBreakables:OnChanged(function() local on = Toggles.AutoClickBreakables.Value setBuiltInAuto(on) if not on then return end task.spawn(function() while Toggles.AutoClickBreakables.Value and not Library.Unloaded do local delayMs = Options.ClickDelay and Options.ClickDelay.Value or 100 local mode = Options.TargetMode and Options.TargetMode.Value or "Nearest" pcall(function() local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") local folder = workspace:FindFirstChild("Breakables") if not folder or not hrp then return end local function eggPartLocal() if not (alienRef and alienRef.Parent) then return nil end return eggPart(alienRef) end -- ride to the egg whenever one is live (any mode); loot needs proximity. -- remembers home so we can return after the event (e.g. back to hatching). if Toggles.TpToEgg.Value then local epp = eggPartLocal() if epp then if not eggAway then eggAway = true eggHome = hrp.CFrame eggPos = epp.Position end if (epp.Position - hrp.Position).Magnitude > 40 then hrp.CFrame = epp.CFrame + Vector3.new(0, 3, 8) pcall(function() hrp.Velocity = Vector3.zero hrp.RotVelocity = Vector3.zero end) end end end local cands = {} local seen = {} for _, det in ipairs(folder:GetDescendants()) do if det:IsA("ClickDetector") then -- egg detectors can sit on nested parts: climb to the model local m = det.Parent while m and not m:IsA("Model") do m = m.Parent end if m and m:IsA("Model") and m:IsDescendantOf(folder) and not SKIP_BREAKABLES[m.Name] and not seen[m] then seen[m] = true local pp = m.PrimaryPart or m:FindFirstChildWhichIsA("BasePart", true) if pp then local kind = "normal" if m.Name == "AlienEventEgg" or m.Name == "UFOEgg" or m:GetAttribute("MaxHP") ~= nil then kind = "alien" elseif m.Name:match("^RTier") then kind = "gem" end table.insert(cands, { det = det, d = (pp.Position - hrp.Position).Magnitude, kind = kind }) end end end end -- egg can spawn outside the Breakables folder if alienRef and alienRef.Parent and not alienRef:IsDescendantOf(folder) then local det = alienRef:IsA("Model") and alienRef:FindFirstChildWhichIsA("ClickDetector", true) or nil local epp = eggPart() if det and epp then table.insert(cands, { det = det, d = (epp.Position - hrp.Position).Magnitude, kind = "alien" }) end end if #cands == 0 then return end local pick = nil -- timed world event always wins when present do local bestD = math.huge for _, c in ipairs(cands) do if c.kind == "alien" and c.d < bestD then pick, bestD = c, c.d end end end if not pick and mode == "Gems First" then local bestD = math.huge for _, c in ipairs(cands) do if c.kind == "gem" and c.d < bestD then pick, bestD = c, c.d end end end if not pick and mode ~= "Alien Egg" then local bestD = math.huge for _, c in ipairs(cands) do if c.d < bestD then pick, bestD = c, c.d end end end if pick then pcall(fireclickdetector, pick.det) end end) task.wait(math.clamp(delayMs / 1000, 0.1, 1)) end setBuiltInAuto(false) end) end) local R = PlayTab:AddLeftGroupbox("Playtime Rewards") R:AddToggle("AutoClaimPlaytime", { Text = "Auto Claim Playtime Rewards", Default = false, Tooltip = "ClaimGift:Fire(Gift1..Gift9) every 5s" }) R:AddLabel("Claims all 9 playtime gifts when ready.", true) local E = PlayTab:AddRightGroupbox("Playtime Egg") E:AddToggle("AutoClaimPartyEgg", { Text = "Auto Claim Playtime Egg", Default = false, Tooltip = "PartyEggService.Claim:Fire() when ready" }) E:AddButton({ Text = "Claim Egg Now", Func = function() local svc = GetSvc("PartyEggService") if svc and svc.Claim then pcall(function() svc.Claim:Fire() end) end end }) E:AddLabel("Requires playtime elapsed (PartyEggModule).", true) Toggles.AutoClaimPlaytime:OnChanged(function() if not Toggles.AutoClaimPlaytime.Value then return end task.spawn(function() while Toggles.AutoClaimPlaytime.Value and not Library.Unloaded do pcall(function() local svc = GetSvc("PlaytimeGiftsService") if svc and svc.ClaimGift then for i = 1, 9 do svc.ClaimGift:Fire("Gift" .. i) end end end) task.wait(5) end end) end) Toggles.AutoClaimPartyEgg:OnChanged(function() if not Toggles.AutoClaimPartyEgg.Value then return end task.spawn(function() while Toggles.AutoClaimPartyEgg.Value and not Library.Unloaded do pcall(function() local ready = true local ok, mod = pcall(require, ReplicatedStorage.Modules:FindFirstChild("PartyEggModule")) if ok and mod and mod.IsReady then ready = mod.IsReady(LocalPlayer) end if ready then local svc = GetSvc("PartyEggService") if svc and svc.Claim then svc.Claim:Fire() end end end) task.wait(5) end end) end) end do local HatchTab = Tabs.Inventory:AddSubTab("Hatching & Pets") local UpgTab = Tabs.Inventory:AddSubTab("Upgrades") local WorldTab = Tabs.Inventory:AddSubTab("Worlds") local ItemsTab = Tabs.Inventory:AddSubTab("Items") local MoonTab = Tabs.Inventory:AddSubTab("Moon & Tree") local function craftOnce(dataFolder, need, machineName, bulkKey, singleKey) -- Server rejects crafts from far away: teleport to the machine, craft, return. pcall(function() local PlayerData = require(ReplicatedStorage.Modules.PlayerData) local PetDisplay = require(ReplicatedStorage.Modules.PetDisplay) local svc = GetSvc("CraftMachinesService") if not svc then return end local folder = PlayerData.Folder(LocalPlayer, "PetsData") local sub = folder and folder:FindFirstChild(dataFolder) if not sub then return end local ready = {} for _, pet in ipairs(sub:GetChildren()) do if PetDisplay.GetAvailable(LocalPlayer, pet.Name) >= need then table.insert(ready, pet.Name) end end if #ready == 0 then return end local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") local map = workspace:FindFirstChild("Map") local machines = map and map:FindFirstChild("Machines") local machine = machines and machines:FindFirstChild(machineName) local pp = machine and (machine.PrimaryPart or machine:FindFirstChildWhichIsA("BasePart", true)) if not hrp or not pp then return end local back = hrp.CFrame local moved = (pp.Position - hrp.Position).Magnitude > 20 if moved then hrp.CFrame = pp.CFrame + Vector3.new(0, 3, 6) pcall(function() hrp.Velocity = Vector3.zero hrp.RotVelocity = Vector3.zero end) task.wait(1) end table.clear(ready) for _, pet in ipairs(sub:GetChildren()) do if PetDisplay.GetAvailable(LocalPlayer, pet.Name) >= need then table.insert(ready, pet.Name) end end if #ready > 0 then table.sort(ready) if svc[bulkKey] then svc[bulkKey]:Fire(ready) elseif svc[singleKey] then for _, name in ipairs(ready) do svc[singleKey]:Fire(name) end end task.wait(1.5) end if moved then pcall(function() local c = LocalPlayer.Character local h = c and c:FindFirstChild("HumanoidRootPart") if h then h.CFrame = back end end) end end) end local function craftGoldensOnce() craftOnce("NormalPetsData", 8, "GoldenMachine", "CraftBulkGolden", "CraftGolden") end local function craftDiamondsOnce() craftOnce("GoldenPetsData", 6, "DiamondMachine", "CraftBulkDiamond", "CraftDiamond") end local H = HatchTab:AddLeftGroupbox("Egg Hatching") H:AddDropdown("SelectedEgg", { Text = "Egg", Values = EGG_LIST, Default = 1 }) H:AddDropdown("HatchMode", { Text = "Mode", Values = MODE_LIST, Default = 3 }) H:AddToggle("AutoHatch", { Text = "Auto Hatch Eggs", Default = false, Tooltip = "Hatch:Fire(egg, mode) every 1s. Stand near egg." }) H:AddLabel("Stand within egg range or hatch is rejected.", true) local P = HatchTab:AddRightGroupbox("Pets") P:AddToggle("AutoEquipBest", { Text = "Auto Equip Best Pets", Default = false }) P:AddSlider("EquipInterval", { Text = "Equip Interval", Default = 10, Min = 1, Max = 60, Rounding = 0, Suffix = "s" }) P:AddButton({ Text = "Equip Best Now", Func = function() local svc = GetSvc("PetsService") if svc and svc.Action then pcall(function() svc.Action:Fire("EquipBest") end) end end }) P:AddToggle("AutoGolden", { Text = "Auto Golden Pets", Default = false, Tooltip = "Bulk-crafts golden when 8+ of same pet" }) P:AddButton({ Text = "Craft Goldens Now", Func = function() craftGoldensOnce() end }) P:AddLabel("Needs 8 of the same pet. Teleports you to the machine briefly.", true) P:AddToggle("AutoDiamond", { Text = "Auto Diamond Pets", Default = false, Tooltip = "Bulk-crafts diamond when 6+ of same golden" }) P:AddButton({ Text = "Craft Diamonds Now", Func = function() craftDiamondsOnce() end }) Toggles.AutoHatch:OnChanged(function() if not Toggles.AutoHatch.Value then return end task.spawn(function() while Toggles.AutoHatch.Value and not Library.Unloaded do pcall(function() local svc = GetSvc("EggHatchService") local egg = Options.SelectedEgg and Options.SelectedEgg.Value or "Basic Egg" local mode = Options.HatchMode and Options.HatchMode.Value or "Max" if svc and svc.Hatch then svc.Hatch:Fire(egg, mode) end end) task.wait(1) end end) end) Toggles.AutoEquipBest:OnChanged(function() if not Toggles.AutoEquipBest.Value then return end task.spawn(function() while Toggles.AutoEquipBest.Value and not Library.Unloaded do pcall(function() local svc = GetSvc("PetsService") if svc and svc.Action then svc.Action:Fire("EquipBest") end end) -- slow swaps keep pets attacking; fast re-equips break them local iv = Options.EquipInterval and Options.EquipInterval.Value or 10 task.wait(math.clamp(iv, 1, 60)) end end) end) Toggles.AutoGolden:OnChanged(function() if not Toggles.AutoGolden.Value then return end task.spawn(function() while Toggles.AutoGolden.Value and not Library.Unloaded do craftGoldensOnce() task.wait(5) end end) end) Toggles.AutoDiamond:OnChanged(function() if not Toggles.AutoDiamond.Value then return end task.spawn(function() while Toggles.AutoDiamond.Value and not Library.Unloaded do craftDiamondsOnce() task.wait(5) end end) end) local U = UpgTab:AddLeftGroupbox("Auto Upgrade") U:AddToggle("UpCoins", { Text = "Coins Boost", Default = false }) U:AddToggle("UpRubies", { Text = "Rubies Boost", Default = false }) U:AddToggle("UpLuck", { Text = "Luck Boost", Default = false }) local U2 = UpgTab:AddRightGroupbox("Speed & Crit") U2:AddToggle("UpHatch", { Text = "Hatch Speed", Default = false }) U2:AddToggle("UpCrit", { Text = "Critical %", Default = false }) U2:AddToggle("UpPetSpeed", { Text = "Pets Speed", Default = false }) U2:AddLabel("Buys with Rubies via BuyUpgrade:Fire(name).", true) local function bindUpgrade(toggleIdx, remoteName) Toggles[toggleIdx]:OnChanged(function() if not Toggles[toggleIdx].Value then return end task.spawn(function() while Toggles[toggleIdx].Value and not Library.Unloaded do pcall(function() local svc = GetSvc("UpgradesService") if svc and svc.BuyUpgrade then svc.BuyUpgrade:Fire(remoteName) end end) task.wait(1) end end) end) end bindUpgrade("UpCoins", "CoinsUpgrades") bindUpgrade("UpRubies", "RubiesUpgrades") bindUpgrade("UpLuck", "LuckUpgrades") bindUpgrade("UpHatch", "HatchSpeedUpgrades") bindUpgrade("UpCrit", "CriticalUpgrades") bindUpgrade("UpPetSpeed", "PetSpeedUpgrades") local W = WorldTab:AddLeftGroupbox("Worlds") W:AddToggle("AutoBuyWorlds", { Text = "Auto Buy Worlds", Default = false, Tooltip = "Purchase:Fire every 1s" }) W:AddDropdown("TeleportWorld", { Text = "Teleport To", Values = WORLD_LIST, Default = 1 }) W:AddButton({ Text = "Teleport", Func = function() local svc = GetSvc("TeleportService") local w = Options.TeleportWorld and Options.TeleportWorld.Value or "Spawn" if svc and svc.GoTo then pcall(function() svc.GoTo:Fire(w) end) end end }) W:AddLabel("Order: BirchForest > TreasureDunes > FrozenAlley > HauntedHouse > PetKingdom > EnchantedGrove > TheMoon (Rubies).", true) Toggles.AutoBuyWorlds:OnChanged(function() if not Toggles.AutoBuyWorlds.Value then return end task.spawn(function() while Toggles.AutoBuyWorlds.Value and not Library.Unloaded do pcall(function() local svc = GetSvc("TeleportService") if svc and svc.Purchase then svc.Purchase:Fire("Bought") svc.Purchase:Fire("BoughtMoon") end end) task.wait(1) end end) end) -- Auto Use Items (fruits, potions, treats). Uses 1 per tick, skips unowned. local function useSelectedItems() pcall(function() local sel = Options.SelectedItems and Options.SelectedItems.Value if sel == nil then return end local names = {} if type(sel) == "table" then for name, on in pairs(sel) do if on then table.insert(names, name) end end elseif type(sel) == "string" then names = { sel } end if #names == 0 then return end local PlayerData = require(ReplicatedStorage.Modules.PlayerData) local svc = GetSvc("ConsumablesService") if not svc or not svc.UseItem then return end local function owned(name) for _, fname in ipairs({ "FruitsData", "PotionsData", "ToysData", "MiscData" }) do local f = PlayerData.Folder(LocalPlayer, fname) local v = f and f:FindFirstChild(name) if v and v:IsA("IntValue") then return v.Value end if v and typeof(v.Value) == "number" then return v.Value end end return 1 -- unknown folder: let server validate end for _, name in ipairs(names) do if owned(name) > 0 then svc.UseItem:Fire(name, 1) end end end) end local I = ItemsTab:AddLeftGroupbox("Auto Use") I:AddDropdown("SelectedItems", { Text = "Items", Values = ITEM_LIST, Default = 1, Multi = true, Searchable = true, SelectAllButtons = true }) I:AddToggle("AutoUseItems", { Text = "Auto Use Selected Items", Default = false, Tooltip = "Uses 1 of each selected item per interval" }) I:AddSlider("UseInterval", { Text = "Use Interval", Default = 60, Min = 10, Max = 300, Rounding = 0, Suffix = "s" }) I:AddButton({ Text = "Use Now", Func = function() useSelectedItems() end }) I:AddLabel("Skips items you own 0 of. Potions re-use after expiry.", true) -- VIP Key crafting: KeyCraftService.Craft(n) turns Upper+Lower halves into keys local function craftKeysOnce() pcall(function() local PlayerData = require(ReplicatedStorage.Modules.PlayerData) local m = PlayerData.Folder(LocalPlayer, "MiscData") local up = m and m:FindFirstChild("VIPUpper") local lo = m and m:FindFirstChild("VIPLower") local n = math.min((up and up.Value) or 0, (lo and lo.Value) or 0) if n > 0 then local svc = GetSvc("KeyCraftService") if svc and svc.Craft then svc.Craft(n) end end end) end local K = ItemsTab:AddRightGroupbox("Key Crafting") K:AddToggle("AutoCraftKeys", { Text = "Auto Craft VIP Keys", Default = false, Tooltip = "Crafts keys from Upper+Lower halves" }) K:AddButton({ Text = "Craft Keys Now", Func = function() craftKeysOnce() end }) K:AddLabel("Uses all matching halves each pass.", true) Toggles.AutoCraftKeys:OnChanged(function() if not Toggles.AutoCraftKeys.Value then return end task.spawn(function() while Toggles.AutoCraftKeys.Value and not Library.Unloaded do craftKeysOnce() task.wait(5) end end) end) Toggles.AutoUseItems:OnChanged(function() if not Toggles.AutoUseItems.Value then return end task.spawn(function() while Toggles.AutoUseItems.Value and not Library.Unloaded do useSelectedItems() local iv = Options.UseInterval and Options.UseInterval.Value or 60 task.wait(math.clamp(iv, 10, 300)) end end) end) -- Items Crafting station: tier-II potions + charm II/III from ItemCraftConfig. -- Only fires affordable recipes (MaxCraftable), capped per request like CraftMax. local function craftStationOnce() pcall(function() local cfg = require(ReplicatedStorage.Modules:FindFirstChild("ItemCraftConfig")) local sel = Options.CraftRecipes and Options.CraftRecipes.Value if sel == nil then return end local ids = {} if type(sel) == "table" then for id, on in pairs(sel) do if on then table.insert(ids, id) end end elseif type(sel) == "string" then ids = { sel } end if #ids == 0 then return end local svc = GetSvc("ItemCraftService", { "DoCraft", "Craft" }) if not svc or not svc.Craft then return end local cap = cfg.MAX_CRAFT_PER_REQUEST or 100 for _, id in ipairs(ids) do local ok, n = pcall(cfg.MaxCraftable, LocalPlayer, id) if ok and type(n) == "number" and n > 0 then svc.Craft(id, math.min(n, cap)) end end end) end local C = ItemsTab:AddLeftGroupbox("Item Crafting") C:AddDropdown("CraftRecipes", { Text = "Recipes", Values = CRAFT_IDS, Default = 1, Multi = true, Searchable = true, SelectAllButtons = true }) C:AddToggle("AutoCraftItems", { Text = "Auto Craft Items", Default = false, Tooltip = "Crafts affordable potions II + charms" }) C:AddButton({ Text = "Craft Now", Func = function() craftStationOnce() end }) C:AddLabel("Crafts max affordable per pass. Server validates costs.", true) Toggles.AutoCraftItems:OnChanged(function() if not Toggles.AutoCraftItems.Value then return end task.spawn(function() while Toggles.AutoCraftItems.Value and not Library.Unloaded do craftStationOnce() task.wait(5) end end) end) -- Moon shops: BuyUpgrade per key, server validates funds (same as kiosk Buy button) local function bindMoonShop(toggleIdx, serviceName, keyList) Toggles[toggleIdx]:OnChanged(function() if not Toggles[toggleIdx].Value then return end task.spawn(function() while Toggles[toggleIdx] and Toggles[toggleIdx].Value and not Library.Unloaded do pcall(function() local svc = GetSvc(serviceName) if svc and svc.BuyUpgrade then for _, key in ipairs(keyList) do svc.BuyUpgrade:Fire(key) end end end) task.wait(2) end end) end) end local MM = MoonTab:AddLeftGroupbox("Moon Upgrades") MM:AddToggle("AutoMoonInc", { Text = "Auto Upgrade Moon Upgrades", Default = false, Tooltip = "Buys all 9 incremental moon upgrades" }) MM:AddToggle("AutoMoonPerm", { Text = "Auto Upgrade Permanent Moon Upgrades", Default = false, Tooltip = "Buys all 8 permanent moon upgrades" }) MM:AddLabel("Requires The Moon unlocked. Server skips what you can't afford.", true) bindMoonShop("AutoMoonInc", "MoonUpgradesService", MOON_INC_LIST) bindMoonShop("AutoMoonPerm", "MoonPermUpgradesService", MOON_PERM_LIST) -- Skill tree: buy affordable nodes in tree order (parents first), max 5 per pass local function buyTreePass() pcall(function() local PlayerData = require(ReplicatedStorage.Modules.PlayerData) local ok, mod = pcall(require, ReplicatedStorage.UpgradeTree:FindFirstChild("UpgradeTreeData")) if not ok or type(mod) ~= "table" then return end local nums = {} for k in pairs(mod) do if type(k) == "number" then table.insert(nums, k) end end table.sort(nums) local byId = {} for _, k in ipairs(nums) do local e = mod[k] if type(e) == "table" and type(e.id) == "string" then byId[e.id] = e end end local stats = PlayerData.Folder(LocalPlayer, "Stats") local rubies = stats and stats:FindFirstChild("Rubies") local bal = (rubies and rubies.Value) or 0 local tree = PlayerData.Folder(LocalPlayer, "TreeData") local svc = GetSvc("UpgradeTreeService") if not svc or not svc.BuyNode then return end local bought = 0 for _, k in ipairs(nums) do if bought >= 5 then break end local e = mod[k] if type(e) == "table" and type(e.id) == "string" and e.id ~= "start" then local owned = tree and tree:FindFirstChild(e.id) if not (owned and owned.Value) then local parentOk = not e.parent or (tree and tree:FindFirstChild(e.parent) and tree:FindFirstChild(e.parent).Value) local cost = tonumber(e.cost) or 0 if parentOk and cost <= bal then svc.BuyNode:Fire(e.id) bought = bought + 1 bal = bal - cost end end end end end) end local ST = MoonTab:AddRightGroupbox("Skill Tree") ST:AddToggle("AutoSkillTree", { Text = "Auto Upgrade Skill Tree", Default = false, Tooltip = "Buys affordable nodes, parents first" }) ST:AddButton({ Text = "Buy Affordable Nodes", Func = function() buyTreePass() end }) ST:AddLabel("Spends Rubies, max 5 nodes per pass.", true) Toggles.AutoSkillTree:OnChanged(function() if not Toggles.AutoSkillTree.Value then return end task.spawn(function() while Toggles.AutoSkillTree.Value and not Library.Unloaded do buyTreePass() task.wait(3) end end) end) end do -- Moon rebirth resets incremental moon upgrades; only fires when the game -- flags ready (all upgrades maxed) and rebirths remain. Pairs well with -- Auto Upgrade Moon Upgrades. local function doMoonRebirth() pcall(function() local cfg = require(ReplicatedStorage.Modules:WaitForChild("MoonUpgradesConfig")) local _, _, _, ready = cfg.GetRebirthProgress(LocalPlayer) if not ready then return end if cfg.HasRebirthsLeft and not cfg.HasRebirthsLeft(LocalPlayer) then return end local svc = GetSvc("MoonRebirthService") if svc and svc.DoRebirth then svc.DoRebirth:Fire() end end) end local RB = Tabs.Rebirth:AddLeftGroupbox("Moon Rebirth") RB:AddToggle("AutoMoonRebirth", { Text = "Auto Moon Rebirth", Default = false, Tooltip = "Rebirths when all moon upgrades are maxed" }) RB:AddButton({ Text = "Rebirth Now", Func = function() doMoonRebirth() end }) RB:AddLabel("Requires all incremental moon upgrades maxed and rebirths left.", true) Toggles.AutoMoonRebirth:OnChanged(function() if not Toggles.AutoMoonRebirth.Value then return end task.spawn(function() while Toggles.AutoMoonRebirth.Value and not Library.Unloaded do doMoonRebirth() task.wait(5) end end) end) end do local M = Tabs.Settings:AddLeftGroupbox("Menu") M:AddToggle("AntiAFK", { Text = "Anti-AFK", Default = true }) M:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", { Default = "RightShift", NoUI = true, Text = "Menu keybind" }) M:AddDropdown("DPIScale", { Text = "DPI Scale", Values = { "50%", "75%", "100%", "125%", "150%", "175%", "200%" }, Default = "100%", Callback = function(v) pcall(function() Library:SetDPIScale(tonumber((v:gsub("%%", "")))) end) end }) M:AddSlider("CornerRadius", { Text = "Corner Radius", Default = 10, Min = 0, Max = 20, Rounding = 0, Callback = function(v) pcall(function() Window:SetCornerRadius(v) end) end }) M:AddButton("Unload", function() Library:Unload() end) Library.ToggleKeybind = Options.MenuKeybind local afkConn = nil local afkGen = 0 -- Triggers found in game scripts: Roblox Idled kick (~20min) + server -- AutoRejoinService.ReportActivity (AfkActivityClient only reports on real -- input, so automation alone still gets flagged). Prevent both: VirtualUser -- KeepAlive exactly like the game's AntyAFKClient + ReportActivity on a -- 20s loop + on every Idled event. local function KeepAlive() pcall(function() VirtualUser:CaptureController() VirtualUser:ClickButton2(Vector2.new()) end) pcall(function() local svc = GetSvc("AutoRejoinService") if svc and svc.ReportActivity then svc.ReportActivity:Fire() end end) end local function setAFK(on) afkGen = afkGen + 1 local gen = afkGen if afkConn then pcall(function() afkConn:Disconnect() end) afkConn = nil end if on then afkConn = LocalPlayer.Idled:Connect(function() KeepAlive() end) task.spawn(function() while gen == afkGen and not Library.Unloaded do KeepAlive() task.wait(20) end end) end end setAFK(true) Toggles.AntiAFK:OnChanged(function() setAFK(Toggles.AntiAFK.Value) end) ThemeManager:SetLibrary(Library) SaveManager:SetLibrary(Library) SaveManager:IgnoreThemeSettings() SaveManager:SetIgnoreIndexes({ "MenuKeybind" }) ThemeManager:SetFolder("hidevin") SaveManager:SetFolder("hidevin/PetsUniverse") SaveManager:BuildConfigSection(Tabs.Settings) ThemeManager:ApplyToTab(Tabs.Settings) SaveManager:LoadAutoloadConfig() end Library:Notify({ Title = "@hidevin", Description = "Pets Universe loaded.", Time = 4, Type = "Success" })