-- [[ 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=6ab5c7b331334ea70a7293e6"))() end) end) --[[rscripts:analytics:end]] --// @hidevin | Kitten Farm | PlaceId lock 77813828595591 if game.PlaceId ~= 77813828595591 then warn("[hidevin] Wrong game. Expected Kitten Farm (77813828595591).") return end 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 Options = Library.Options local Toggles = Library.Toggles --// Design tokens (UI_STYLE.json) --// background #0d0d0d, card #282828, border #3a3a3a +10px, heading #ffffff, label #a0a0a0 --// toggle pill green/blue, slider track #444444 fill #5865F2 white handle 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.FontColor = Color3.fromRGB(255, 255, 255) Library.Scheme.AccentColor = Color3.fromRGB(88, 101, 242) Library.Scheme.BlueColor = Color3.fromRGB(88, 101, 242) if Library.UpdateColorsUsingRegistry then Library:UpdateColorsUsingRegistry() end end) Library.ShowCustomCursor = true local Window = Library:CreateWindow({ Title = "@hidevin", Footer = "Kitten Farm | Leave a like on Rscripts if it works. @hidevin", NotifySide = "Right", ShowCustomCursor = true, DisableSearch = true, EnableSidebarResize = true, Minimizable = true, }) Window:SetCornerRadius(10) local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local LocalPlayer = Players.LocalPlayer --// Tabs (GAME_FEATURES.md mapping; Rebirth shown — Auto Rebirth unlocked) local Tabs = { Main = Window:AddTab("Main", "info"), Farming = Window:AddTab("Farming", "sprout"), Inventory = Window:AddTab("Inventory", "backpack"), Rebirth = Window:AddTab("Rebirth", "refresh-cw"), ["UI Settings"] = Window:AddTab("UI Settings", "settings"), } --// Helpers local function getOwnPlot() local plots = workspace:FindFirstChild("Plots") if not plots then return nil end for _, p in ipairs(plots:GetChildren()) do if p:GetAttribute("Owner") == LocalPlayer.UserId then return p end end return nil end local function getHRP() local c = LocalPlayer.Character return c and c:FindFirstChild("HumanoidRootPart") end local function pressButton(name) local plot = getOwnPlot() if not plot then return false end local buttons = plot:FindFirstChild("Buttons") local btn = buttons and buttons:FindFirstChild(name) local press = btn and btn:FindFirstChild("Press") local hrp = getHRP() if not press or not hrp then return false end pcall(function() firetouchinterest(hrp, press, 1) task.wait(0.08) firetouchinterest(hrp, press, 0) end) return true end local function autoLoop(toggleIdx, fn) task.spawn(function() while not Library.Unloaded do task.wait(1) local t = Toggles[toggleIdx] if t and t.Value then pcall(fn) end end end) end --// Main Tab: info only, no mechanics local MainInfo = Tabs.Main:AddLeftGroupbox("Info") MainInfo:AddLabel("Kitten Farm", true) MainInfo:AddLabel("Session: osDevin", true) local SessionLabel = MainInfo:AddLabel("Uptime: 0s", true, "SessionUptime") local StatusLabel = MainInfo:AddLabel("Status: loading...", true, "StatusInfo") task.spawn(function() local t0 = os.clock() while not Library.Unloaded do task.wait(1) pcall(function() local plot = getOwnPlot() local money = LocalPlayer:FindFirstChild("Money") local yarn = LocalPlayer:FindFirstChild("Yarn") Options.SessionUptime:SetText(string.format("Uptime: %ds", math.floor(os.clock() - t0))) Options.StatusInfo:SetText(string.format( "Plot: %s | Cash: %s | Yarn: %s", plot and plot.Name or "?", money and tostring(money.Value) or "?", yarn and tostring(yarn.Value) or "?" )) end) end end) --// Farming Tab > sub-tabs (mandate: >1 feature per tab) local FarmCollect = Tabs.Farming:AddSubTab("Collecting", "hand") local FarmSell = Tabs.Farming:AddSubTab("Selling", "coins") local CollectBox = FarmCollect:AddLeftGroupbox("Resource Collecting") CollectBox:AddToggle("AutoCollectYarn", { Text = "Auto Collect Yarn", Default = false, Tooltip = "Fires Yarn.Collect for nearby yarn (1s)." }) CollectBox:AddToggle("AutoCollectMoney", { Text = "Auto Collect Money", Default = false, Tooltip = "Touches CollectCash on own plot (1s)." }) local SellBox = FarmSell:AddLeftGroupbox("Selling") SellBox:AddToggle("AutoDepositYarn", { Text = "Auto Deposit Yarn", Default = false, Tooltip = "Touches DepositYarn on own plot (1s)." }) Toggles.AutoCollectYarn:OnChanged(function() end) Toggles.AutoCollectMoney:OnChanged(function() end) Toggles.AutoDepositYarn:OnChanged(function() end) autoLoop("AutoCollectYarn", function() local folder = workspace:FindFirstChild("Yarn") local collect = ReplicatedStorage:FindFirstChild("Remotes") and ReplicatedStorage.Remotes:FindFirstChild("Yarn") and ReplicatedStorage.Remotes.Yarn:FindFirstChild("Collect") if not folder or not collect then return end for _, m in ipairs(folder:GetChildren()) do if not Toggles.AutoCollectYarn.Value then break end pcall(function() collect:FireServer(m.Name) end) end end) autoLoop("AutoCollectMoney", function() pressButton("CollectCash") end) autoLoop("AutoDepositYarn", function() pressButton("DepositYarn") end) --// Inventory Tab > sub-tabs (Purchasing vs Upgrades vs Misc per rule 4) local InvBuy = Tabs.Inventory:AddSubTab("Purchasing", "shopping-cart") local InvUpg = Tabs.Inventory:AddSubTab("Upgrades", "arrow-up") local InvMisc = Tabs.Inventory:AddSubTab("Misc", "package") local BuyBox = InvBuy:AddLeftGroupbox("Kitten Purchasing") BuyBox:AddToggle("AutoBuy1", { Text = "Auto Buy 1 Kitten", Default = false }) BuyBox:AddToggle("AutoBuy5", { Text = "Auto Buy 5 Kittens", Default = false }) BuyBox:AddToggle("AutoBuy25", { Text = "Auto Buy 25 Kittens", Default = false }) BuyBox:AddToggle("AutoBuy100", { Text = "Auto Buy 100 Kittens", Default = false }) local UpgBox = InvUpg:AddLeftGroupbox("Stat Upgrades") UpgBox:AddToggle("AutoUpgradeYarnRate", { Text = "Auto Upgrade Yarn Rate", Default = false, Tooltip = "Maps to 'Auto Upgrade Selling Yarn' (UpgradeYarnRate button, 1s)." }) UpgBox:AddToggle("AutoUpgradeBuyTier", { Text = "Auto Upgrade Buy Tier", Default = false, Tooltip = "Touches UpgradeBuyTier (1s)." }) autoLoop("AutoBuy1", function() pressButton("Buy1") end) autoLoop("AutoBuy5", function() pressButton("Buy5") end) autoLoop("AutoBuy25", function() pressButton("Buy25") end) autoLoop("AutoBuy100", function() pressButton("Buy100") end) autoLoop("AutoUpgradeYarnRate", function() pressButton("UpgradeYarnRate") end) autoLoop("AutoUpgradeBuyTier", function() pressButton("UpgradeBuyTier") end) local MiscBox = InvMisc:AddLeftGroupbox("Misc") MiscBox:AddToggle("AutoMerge", { Text = "Auto Merge", Default = false, Tooltip = "Touches Merge button on own plot (1s)." }) autoLoop("AutoMerge", function() pressButton("Button") end) --// Rebirth Tab (exists — Auto Rebirth unlocked; single feature so no sub-tab split) local RebirthBox = Tabs.Rebirth:AddLeftGroupbox("Rebirth") RebirthBox:AddToggle("AutoRebirth", { Text = "Auto Rebirth", Default = false, Tooltip = "Checks Prestige GetData (Price 1M), fires Prestige when affordable (1s)." }) autoLoop("AutoRebirth", function() local prestige = ReplicatedStorage:FindFirstChild("Remotes") and ReplicatedStorage.Remotes:FindFirstChild("Prestige") local money = LocalPlayer:FindFirstChild("Money") if not prestige or not money then return end local ok, data = pcall(function() return prestige:InvokeServer("GetData") end) if not ok or type(data) ~= "table" then return end if data.Maxed then return end if typeof(data.Price) == "number" and money.Value >= data.Price then pcall(function() prestige:InvokeServer("Prestige") end) end end) --// UI Settings Tab: Anti-AFK (default ON) + Config + Theme + Menu bind local MenuGroup = Tabs["UI Settings"]:AddLeftGroupbox("Menu") MenuGroup:AddToggle("AntiAFK", { Text = "Anti-AFK", Default = true, Tooltip = "Blocks idle kick + rejoin triggers." }) MenuGroup:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", { Default = "RightShift", NoUI = true, Text = "Menu keybind" }) MenuGroup:AddButton("Unload", function() Library:Unload() end) Toggles.AntiAFK:OnChanged(function(v) if v then pcall(function() for _, c in ipairs(getconnections(LocalPlayer.Idled)) do c:Disable() end end) Library:Notify({ Title = "Anti-AFK", Description = "Enabled.", Time = 3, Type = "Success" }) end end) --// enforce default ON at startup task.spawn(function() task.wait(1) pcall(function() if Toggles.AntiAFK.Value then for _, c in ipairs(getconnections(LocalPlayer.Idled)) do c:Disable() end end end) LocalPlayer.Idled:Connect(function() if Toggles.AntiAFK and Toggles.AntiAFK.Value then pcall(function() local vu = getgenv().VirtualUser or cloneref and cloneref(game:GetService("VirtualUser")) if vu then vu:CaptureController(); vu:ClickButton2(Vector2.new()) end end) end end) end) Library.ToggleKeybind = Options.MenuKeybind ThemeManager:SetLibrary(Library) SaveManager:SetLibrary(Library) SaveManager:IgnoreThemeSettings() SaveManager:SetIgnoreIndexes({ "MenuKeybind" }) ThemeManager:SetFolder("hidevin") SaveManager:SetFolder("hidevin/Kitten Farm") SaveManager:BuildConfigSection(Tabs["UI Settings"]) ThemeManager:ApplyToTab(Tabs["UI Settings"]) SaveManager:LoadAutoloadConfig() Library:OnUnload(function() print("[hidevin] Kitten Farm unloaded.") end) Library:Notify({ Title = "@hidevin", Description = "Kitten Farm loaded.", Time = 4, Type = "Success" })