-- [[ 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=6ab597c458c192ebddcd5ac0"))() end) end) --[[rscripts:analytics:end]] -- Hamster Village | @hidevin -- Game lock: never run outside Hamster Village universe if game.GameId ~= 10739044772 then warn("[hidevin] Wrong game. This script only runs in Hamster Village (10739044772).") 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 Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local Workspace = game:GetService("Workspace") local VirtualUser = game:GetService("VirtualUser") local LocalPlayer = Players.LocalPlayer local Remotes = ReplicatedStorage:WaitForChild("Remotes") local GetData = Remotes:WaitForChild("GetData") -- Design tokens (UI_STYLE.json) local ACCENT = Color3.fromRGB(88, 101, 242) -- #5865F2 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 = ACCENT Library.Scheme.FontColor = Color3.fromRGB(255, 255, 255) end) local Window = Library:CreateWindow({ Title = "@hidevin", Footer = "Hamster Village | Leave a like on Rscripts if it works. @hidevin", NotifySide = "Right", ShowCustomCursor = true, DisableSearch = true, Minimizable = true, }) pcall(function() Window:SetCornerRadius(10) end) local Toggles = Library.Toggles local Options = Library.Options -- Tabs (Rebirth deleted: no rebirth mechanic in Hamster Village) local Tabs = { Main = Window:AddTab("Main", "home"), Farming = Window:AddTab("Farming", "wheat"), Inventory = Window:AddTab("Inventory", "backpack"), Settings = Window:AddTab("Settings", "settings"), } -- ============ Helpers ============ local function getPlot() local plotName = LocalPlayer:GetAttribute("Plot") if typeof(plotName) ~= "string" then return nil end local tycoons = Workspace:FindFirstChild("Tycoon") if tycoons then tycoons = tycoons:FindFirstChild("Tycoons") end if not tycoons then return nil end return tycoons:FindFirstChild(plotName) end local function getHRP() local c = LocalPlayer.Character if not c then return nil end return c:FindFirstChild("HumanoidRootPart") end local function getButtonBase(name) local plot = getPlot() if not plot then return nil end local buttons = plot:FindFirstChild("Buttons") if not buttons then return nil end local btn = buttons:FindFirstChild(name) if not btn then return nil end return btn:FindFirstChild("Base") or btn:FindFirstChildWhichIsA("BasePart", true) end -- Physical press: teleport to button, hold, return. Proven live: -- firetouchinterest does NOT trigger these buttons; teleport does. local function pressButton(name, holdTime) holdTime = holdTime or 0.7 local base, hrp pcall(function() base = getButtonBase(name) hrp = getHRP() end) if not base or not hrp then return false end local ok = pcall(function() local cf = hrp.CFrame hrp.CFrame = base.CFrame + Vector3.new(0, 3, 0) task.wait(holdTime) if hrp and hrp.Parent then hrp.CFrame = cf end end) task.wait(0.55) -- ButtonTouchCooldown 0.5 return ok end local function getDropTouchParts(limit) local folder = Workspace:FindFirstChild("Drops") if not folder then return {} end local out = {} for _, m in ipairs(folder:GetChildren()) do if string.match(m.Name, "^Drop_%d+$") then local t = m:FindFirstChild("Touch", true) if t and t:IsA("BasePart") then table.insert(out, t) if limit and #out >= limit then break end end end end return out end local function fetchData() local ok, res = pcall(function() return GetData:InvokeServer() end) if ok and typeof(res) == "table" then return res end return nil end -- State flags (driven by UI) local F = { AutoBuy = false, BuyAmounts = { ["1"] = true }, AutoMerge = false, AutoLoot = false, AutoCash = false, AutoUpgradeSell = false, AutoUpgradeTier = false, AntiAFK = true, LootDelay = 1.0, ButtonDelay = 1.0, } -- ============ MAIN TAB (no mechanics, info only) ============ local MainL = Tabs.Main:AddLeftGroupbox("Status") MainL:AddLabel("Hamster Village", true) MainL:AddLabel("Buy Hamsters, collect Seeds, Deposit, Cashier, Merge for higher tiers.", true) local CashLabel = MainL:AddLabel("Cash: ...", true, "CashStatus") local CarryLabel = MainL:AddLabel("Carry: ...", true, "CarryStatus") local SessionLabel = MainL:AddLabel("Session: 0s", true, "SessionStatus") local MainR = Tabs.Main:AddRightGroupbox("Help") MainR:AddLabel("Farming > Collecting: loot seeds.\nFarming > Cash: deposit + cashier.\nInventory > Hamsters: buy + merge.\nInventory > Upgrades: selling + buy tier.", true) MainR:AddButton({ Text = "Claim Cashier Once", Func = function() task.spawn(function() pressButton("Cashier", 0.7) end) end }) MainR:AddButton({ Text = "Deposit Once", Func = function() task.spawn(function() pressButton("Deposit", 0.9) end) end }) task.spawn(function() local t0 = os.clock() while not Library.Unloaded do task.wait(2) local ok, _ = pcall(function() local r = fetchData() if r then pcall(function() CashLabel:SetText(string.format("Cash: $%s | PendingCash: %s | PendingDrop: %s", tostring(r.Cash), tostring(r.Tycoon.Shop.PendingCash), tostring(r.Tycoon.Shop.PendingDrop))) end) pcall(function() CarryLabel:SetText(string.format("Carry: %s | BuyTier: %s | Upgrades: %s", tostring(r.Tycoon.Carry), tostring(r.Tycoon.Shop.BuyTier), tostring(r.Tycoon.Shop.UpgradeCount))) end) end pcall(function() SessionLabel:SetText(string.format("Session: %ds | Plot: %s", math.floor(os.clock() - t0), tostring(LocalPlayer:GetAttribute("Plot")))) end) end) if not ok then task.wait(2) end end end) -- ============ FARMING TAB (sub-tabs required) ============ local FarmCollect = Tabs.Farming:AddSubTab("Collecting", "basket") local FarmCash = Tabs.Farming:AddSubTab("Cash", "coins") local CL = FarmCollect:AddLeftGroupbox("Auto-Collect") CL:AddToggle("AutoLoot", { Text = "Auto Loot Seeds", Default = false, Tooltip = "Teleport to dropped seeds to collect to Carry." }) CL:AddSlider("LootDelay", { Text = "Loot loop delay", Default = 1, Min = 0.5, Max = 5, Rounding = 1, Suffix = "s" }) CL:AddLabel("Deposit is handled by Auto Collect Cash.", true) local CR = FarmCollect:AddRightGroupbox("Info") CR:AddLabel("Seeds drop from hamsters. Touch collects to Carry. Deposit converts Carry to sellable stock.", true) local SL = FarmCash:AddLeftGroupbox("Selling") SL:AddToggle("AutoCash", { Text = "Auto Collect Cash", Default = false, Tooltip = "Presses Deposit then Cashier every loop." }) SL:AddSlider("ButtonDelay", { Text = "Cash loop delay", Default = 1, Min = 0.5, Max = 5, Rounding = 1, Suffix = "s" }) SL:AddLabel("Deposit: Carry -> PendingDrop/PendingCash. Cashier: PendingCash -> Cash.", true) Toggles.AutoLoot:OnChanged(function() F.AutoLoot = Toggles.AutoLoot.Value end) Toggles.AutoCash:OnChanged(function() F.AutoCash = Toggles.AutoCash.Value end) Options.LootDelay:OnChanged(function() F.LootDelay = Options.LootDelay.Value end) Options.ButtonDelay:OnChanged(function() F.ButtonDelay = Options.ButtonDelay.Value end) -- Auto Loot loop task.spawn(function() while not Library.Unloaded do task.wait(F.LootDelay or 1) if F.AutoLoot then pcall(function() local hrp = getHRP() if not hrp then return end local parts = getDropTouchParts(8) if #parts == 0 then return end local home = hrp.CFrame for _, touch in ipairs(parts) do if not F.AutoLoot or Library.Unloaded then break end if touch and touch.Parent then pcall(function() hrp.CFrame = touch.CFrame + Vector3.new(0, 2, 0) end) task.wait(0.35) end end pcall(function() if hrp and hrp.Parent then hrp.CFrame = home end end) end) end end end) -- Auto Collect Cash loop (Deposit + Cashier) task.spawn(function() while not Library.Unloaded do task.wait(F.ButtonDelay or 1) if F.AutoCash then pcall(function() pressButton("Deposit", 0.9) end) task.wait(0.4) if F.AutoCash then pcall(function() pressButton("Cashier", 0.7) end) end end end end) -- ============ INVENTORY TAB (sub-tabs required) ============ local InvBuy = Tabs.Inventory:AddSubTab("Hamsters", "squirrel") local InvUpg = Tabs.Inventory:AddSubTab("Upgrades", "arrow-up") local BL = InvBuy:AddLeftGroupbox("Purchasing") BL:AddToggle("AutoBuy", { Text = "Auto Buy Hamster", Default = false, Tooltip = "Buys selected amounts every 1s." }) BL:AddDropdown("BuyAmounts", { Values = { "1", "5", "25", "100" }, Default = 1, Multi = true, Text = "Buy Amounts (multi)", Tooltip = "Maps to Add1/Add5/Add25/Add100 buttons.", }) BL:AddLabel("Costs scale with owned units. Skips silently if cash is short.", true) local BR = InvBuy:AddRightGroupbox("Merging") BR:AddToggle("AutoMerge", { Text = "Auto Merge", Default = false, Tooltip = "3 same-tier -> 1 higher tier." }) BR:AddLabel("Needs 3 identical tiers on tower. Presses Merge button.", true) local UL = InvUpg:AddLeftGroupbox("Stat Upgrades") UL:AddToggle("AutoUpgradeSell", { Text = "Auto Upgrade Selling Seeds", Default = false, Tooltip = "Upgrade button: raises sale rate." }) UL:AddToggle("AutoUpgradeTier", { Text = "Auto Upgrade Buy Tier", Default = false, Tooltip = "TierUpgrader: raises spawned hamster tier." }) UL:AddLabel("Both cost Cash. Loops press their buttons every 1s.", true) Toggles.AutoBuy:OnChanged(function() F.AutoBuy = Toggles.AutoBuy.Value end) Toggles.AutoMerge:OnChanged(function() F.AutoMerge = Toggles.AutoMerge.Value end) Toggles.AutoUpgradeSell:OnChanged(function() F.AutoUpgradeSell = Toggles.AutoUpgradeSell.Value end) Toggles.AutoUpgradeTier:OnChanged(function() F.AutoUpgradeTier = Toggles.AutoUpgradeTier.Value end) Options.BuyAmounts:OnChanged(function() local v = Options.BuyAmounts.Value if typeof(v) == "table" then F.BuyAmounts = v else F.BuyAmounts = { [tostring(v)] = true } end end) task.spawn(function() while not Library.Unloaded do task.wait(1) if F.AutoBuy then local amounts = F.BuyAmounts if typeof(amounts) == "table" then for _, a in ipairs({ "1", "5", "25", "100" }) do if amounts[a] then if not F.AutoBuy or Library.Unloaded then break end pcall(function() pressButton("Add" .. a, 0.6) end) task.wait(0.3) end end end end if F.AutoMerge then pcall(function() pressButton("Merge", 0.6) end) end if F.AutoUpgradeSell then pcall(function() pressButton("Upgrade", 0.6) end) end if F.AutoUpgradeTier then pcall(function() pressButton("TierUpgrader", 0.6) end) end end end) -- ============ SETTINGS TAB ============ local SG = Tabs.Settings:AddLeftGroupbox("Automation") SG:AddToggle("AntiAFK", { Text = "Anti-AFK", Default = true, Tooltip = "Blocks Roblox kick + 960s idle rejoin teleport." }) Toggles.AntiAFK:OnChanged(function() F.AntiAFK = Toggles.AntiAFK.Value end) -- Anti-AFK: Roblox Idled + custom IdleClient (960s Teleport) pcall(function() LocalPlayer.Idled:Connect(function() if F.AntiAFK and not Library.Unloaded then pcall(function() VirtualUser:CaptureController(); VirtualUser:ClickButton2(Vector2.new()); end) end end) end) -- Block idle rejoin Teleport(PlaceId) while Anti-AFK is on do local okHook local old okHook, old = pcall(function() return hookmetamethod(game, "__namecall", function(self, ...) local m = getnamecallmethod() if m == "Teleport" and F.AntiAFK then local ok2, svc = pcall(function() return game:GetService("TeleportService") end) if ok2 and self == svc then return nil end end return old(self, ...) end) end) if not okHook then warn("[hidevin] Teleport hook unavailable, idle-rejoin block off") end end local MG = Tabs.Settings:AddRightGroupbox("Menu") MG:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", { Default = "RightShift", NoUI = true, Text = "Menu keybind" }) MG:AddButton("Unload", function() Library:Unload() end) Library.ToggleKeybind = Options.MenuKeybind -- SaveManager / ThemeManager ThemeManager:SetLibrary(Library) SaveManager:SetLibrary(Library) SaveManager:IgnoreThemeSettings() SaveManager:SetIgnoreIndexes({ "MenuKeybind" }) ThemeManager:SetFolder("hidevin") SaveManager:SetFolder("hidevin/Hamster Village") SaveManager:BuildConfigSection(Tabs.Settings) ThemeManager:ApplyToTab(Tabs.Settings) SaveManager:LoadAutoloadConfig() Library:Notify({ Title = "hidevin", Description = "Hamster Village loaded on pincoat4", Time = 4, Type = "Success" })