pcall(function()
local set = setthreadidentity or set_thread_identity or setthreadcontext or set_identity
if set then pcall(set, 8) pcall(set, 7) end
end)
local RGB = Color3.fromRGB
local CREDIT_LINK = "https://discord.gg/7Pfw9GWnub"
local CREDIT_TEXT = "Open sourced and removed key system by " .. CREDIT_LINK
local function copyLink()
local ok = false
pcall(function() if type(setclipboard) == "function" then setclipboard(CREDIT_LINK) ok = true end end)
pcall(function()
local s = game:GetService("StarterGui")
if s and s.SetClipboard then s:SetClipboard(CREDIT_LINK) ok = true end
end)
return ok
end
local function creditWait()
local player = game:GetService("Players")
local tween = game:GetService("TweenService")
local uis = game:GetService("UserInputService")
local host
pcall(function() if type(gethui) == "function" then host = gethui() end end)
if type(host) ~= "Instance" then host = game:GetService("CoreGui"):FindFirstChild("RobloxGui") end
if not host then host = player.LocalPlayer:WaitForChild("PlayerGui") end
local done = false
local gui = Instance.new("ScreenGui")
gui.Name = "LiquidHubCredit" gui.DisplayOrder = 999999 gui.IgnoreGuiInset = true
gui.ResetOnSpawn = false gui.Parent = host
local bg = Instance.new("Frame")
bg.Name = "Backdrop" bg.Size = UDim2.fromScale(1, 1) bg.BackgroundColor3 = RGB(3, 5, 10)
bg.BackgroundTransparency = 0.2 bg.BorderSizePixel = 0 bg.Active = true bg.Parent = gui
local card = Instance.new("TextButton")
card.Name = "Card" card.AnchorPoint = Vector2.new(0.5, 0.5) card.Position = UDim2.fromScale(0.5, 0.5)
card.Size = UDim2.fromOffset(460, 240) card.BackgroundColor3 = RGB(10, 14, 22)
card.BorderSizePixel = 0 card.AutoButtonColor = false card.Text = "" card.TextTransparency = 1
card.Active = true card.Parent = bg
local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 10) corner.Parent = card
local stroke = Instance.new("UIStroke") stroke.Color = RGB(28, 42, 62) stroke.Thickness = 1 stroke.Parent = card
local function label(str, ypos, h, sz, col, align)
local l = Instance.new("TextLabel")
l.Size = UDim2.new(1, -48, 0, h) l.Position = UDim2.fromOffset(24, ypos)
l.BackgroundTransparency = 1 l.Font = Enum.Font.Code l.TextSize = sz
l.Text = str l.TextColor3 = col l.TextXAlignment = align or Enum.TextXAlignment.Left
l.Active = false l.Parent = card
return l
end
label("LIQUID HUB", 20, 14, 11, RGB(88, 102, 122))
label("OPEN SOURCE", 20, 14, 11, RGB(18, 168, 255), Enum.TextXAlignment.Right)
local rule = Instance.new("Frame")
rule.Size = UDim2.new(1, -48, 0, 1) rule.Position = UDim2.fromOffset(24, 44)
rule.BackgroundColor3 = RGB(28, 42, 62) rule.BorderSizePixel = 0 rule.Parent = card
label("Key system removed", 60, 30, 24, RGB(226, 236, 246))
local sub = label(CREDIT_TEXT, 96, 58, 13, RGB(122, 138, 160))
sub.TextWrapped = true sub.TextYAlignment = Enum.TextYAlignment.Top
local btn = Instance.new("TextButton")
btn.Name = "Copy" btn.Size = UDim2.new(1, -48, 0, 40) btn.Position = UDim2.fromOffset(24, 162)
btn.BackgroundColor3 = RGB(18, 168, 255) btn.BorderSizePixel = 0 btn.AutoButtonColor = false
btn.Font = Enum.Font.Code btn.TextSize = 14 btn.Text = "copy link" btn.TextColor3 = RGB(4, 11, 24)
btn.Active = true btn.Parent = card
local bc = Instance.new("UICorner") bc.CornerRadius = UDim.new(0, 8) bc.Parent = btn
label("or press enter", 208, 14, 11, RGB(70, 82, 100), Enum.TextXAlignment.Center)
local function paint(target, col)
tween:Create(target, TweenInfo.new(0.15), {BackgroundColor3 = col}):Play()
end
btn.MouseEnter:Connect(function() paint(btn, RGB(64, 198, 255)) end)
btn.MouseLeave:Connect(function() paint(btn, RGB(18, 168, 255)) end)
card.MouseEnter:Connect(function() tween:Create(stroke, TweenInfo.new(0.15), {Color = RGB(54, 100, 146)}):Play() end)
card.MouseLeave:Connect(function() tween:Create(stroke, TweenInfo.new(0.15), {Color = RGB(28, 42, 62)}):Play() end)
local conn
local function accept()
if done then return end
if not copyLink() then
btn.Text = "copy failed - press enter to retry"
paint(btn, RGB(196, 58, 78))
return
end
done = true
btn.Text = "copied - loading"
if conn then conn:Disconnect() end
end
conn = uis.InputBegan:Connect(function(input, focused)
if done or focused then return end
if input.KeyCode == Enum.KeyCode.Return or input.KeyCode == Enum.KeyCode.Space then accept() end
end)
card.MouseButton1Click:Connect(accept)
card.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then accept() end
end)
btn.MouseButton1Click:Connect(accept)
while not done do task.wait(0.1) end
local fade = TweenInfo.new(0.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
tween:Create(bg, fade, {BackgroundTransparency = 1}):Play()
tween:Create(card, fade, {BackgroundTransparency = 1}):Play()
tween:Create(stroke, fade, {Transparency = 1}):Play()
for _, d in ipairs(card:GetDescendants()) do
if d:IsA("TextLabel") or d:IsA("TextButton") then
tween:Create(d, fade, {TextTransparency = 1, BackgroundTransparency = 1}):Play()
elseif d:IsA("Frame") then
tween:Create(d, fade, {BackgroundTransparency = 1}):Play()
end
end
task.wait(0.45)
pcall(function() gui:Destroy() end)
end
creditWait()
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local LocalPlayer = Players.LocalPlayer
local BRAND = {
Name = "Liquid Hub",
Version = "1.0.0",
Discord = "https://discord.gg/liquidhub",
Invite = "discord.gg/liquidhub",
Logo = "rbxassetid://139497684190586",
LogoRaw = "139497684190586",
Deep = Color3.fromHex("040B18"),
Navy = Color3.fromHex("081A33"),
Mid = Color3.fromHex("0F2C55"),
Cyan = Color3.fromHex("3BEAFF"),
Azure = Color3.fromHex("12A8FF"),
Royal = Color3.fromHex("0757E0"),
Sheen = Color3.fromHex("BFF4FF"),
Text = Color3.fromHex("F2FEFF"),
}
local ICON = {
Drops = "droplet",
Bolt = "zap",
Crown = "crown",
Shield = "shield",
Terminal = "terminal",
Question = "circle-question-mark",
Star = "star",
Rocket = "rocket",
Heart = "heart",
Gamepad = "gamepad-2",
Spark = "sparkles",
Dot = "dot",
Key = "key",
House = "house",
Package = "package",
Egg = "egg",
Coins = "coins",
Gift = "gift",
Dumbbell = "dumbbell",
Flask = "flask-conical",
Cart = "shopping-cart",
Trend = "arrow-up-right",
Move = "move",
Gem = "gem",
ShieldOK = "shield-check",
Gear = "settings",
}
local USE_BRAND_LOGO = false
local LOGO_ICON = USE_BRAND_LOGO and BRAND.Logo or ICON.Drops
local LOAD_GEN = math.floor(os.clock() * 100000) % 1000000 + math.random(1, 999) * 1000000
ReplicatedStorage:SetAttribute("LH_LoadGen", LOAD_GEN)
local function isCurrentGen()
return ReplicatedStorage:GetAttribute("LH_LoadGen") == LOAD_GEN
end
local Splash = nil
do
local PlayerGui = LocalPlayer:FindFirstChild("PlayerGui")
if PlayerGui then
local gui = Instance.new("ScreenGui")
gui.Name = "LiquidSplash"
gui.DisplayOrder = 999
gui.IgnoreGuiInset = true
gui.ResetOnSpawn = false
gui.Parent = PlayerGui
local backdrop = Instance.new("Frame")
backdrop.Size = UDim2.fromScale(1, 1)
backdrop.BackgroundColor3 = BRAND.Deep
backdrop.BorderSizePixel = 0
backdrop.Parent = gui
local grad = Instance.new("UIGradient")
grad.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, BRAND.Mid),
ColorSequenceKeypoint.new(0.55, BRAND.Navy),
ColorSequenceKeypoint.new(1, BRAND.Deep),
})
grad.Rotation = 35
grad.Parent = backdrop
local glow = Instance.new("Frame")
glow.Name = "Glow"
glow.AnchorPoint = Vector2.new(0.5, 0.5)
glow.Position = UDim2.fromScale(0.5, 0.44)
glow.Size = UDim2.fromOffset(420, 420)
glow.BackgroundColor3 = BRAND.Azure
glow.BackgroundTransparency = 0.82
glow.BorderSizePixel = 0
glow.Parent = backdrop
Instance.new("UICorner", glow).CornerRadius = UDim.new(1, 0)
for _, radius in ipairs({ 200, 236 }) do
local ring = Instance.new("Frame")
ring.AnchorPoint = Vector2.new(0.5, 0.5)
ring.Position = UDim2.fromScale(0.5, 0.44)
ring.Size = UDim2.fromOffset(radius * 2, radius * 2)
ring.BackgroundTransparency = 1
ring.BorderSizePixel = 0
ring.Parent = backdrop
local stroke = Instance.new("UIStroke")
stroke.Color = BRAND.Cyan
stroke.Transparency = radius == 200 and 0.88 or 0.93
stroke.Thickness = 1.5
stroke.Parent = ring
Instance.new("UICorner", ring).CornerRadius = UDim.new(1, 0)
end
local mark = Instance.new("TextLabel")
mark.Name = "Mark"
mark.AnchorPoint = Vector2.new(0.5, 0.5)
mark.Position = UDim2.fromScale(0.5, 0.42)
mark.Size = UDim2.fromOffset(460, 130)
mark.BackgroundTransparency = 1
mark.Font = Enum.Font.Code
mark.TextSize = 92
mark.Text = ">"
mark.TextColor3 = BRAND.Text
mark.TextStrokeColor3 = BRAND.Royal
mark.TextStrokeTransparency = 0.45
mark.Parent = backdrop
local title = Instance.new("TextLabel")
title.AnchorPoint = Vector2.new(0.5, 0.5)
title.Position = UDim2.fromScale(0.5, 0.58)
title.Size = UDim2.new(1, -40, 0, 40)
title.BackgroundTransparency = 1
title.Font = Enum.Font.GothamBold
title.TextSize = 30
title.Text = BRAND.Name
title.TextColor3 = BRAND.Text
title.Parent = backdrop
local status = Instance.new("TextLabel")
status.Name = "Status"
status.AnchorPoint = Vector2.new(0.5, 0.5)
status.Position = UDim2.fromScale(0.5, 0.66)
status.Size = UDim2.new(1, -40, 0, 22)
status.BackgroundTransparency = 1
status.Font = Enum.Font.GothamMedium
status.TextSize = 13
status.Text = "Loading interface..."
status.TextColor3 = BRAND.Cyan
status.Parent = backdrop
local sheen = Instance.new("Frame")
sheen.AnchorPoint = Vector2.new(0, 0.5)
sheen.Position = UDim2.fromScale(-0.3, 0.42)
sheen.Size = UDim2.fromOffset(180, 180)
sheen.BackgroundTransparency = 0.9
sheen.BorderSizePixel = 0
sheen.Rotation = 20
sheen.Parent = backdrop
Instance.new("UICorner", sheen).CornerRadius = UDim.new(1, 0)
TweenService:Create(sheen, TweenInfo.new(1.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
Position = UDim2.fromScale(1.3, 0.42),
}):Play()
TweenService:Create(glow, TweenInfo.new(2.6, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut, -1, true), {
Size = UDim2.fromOffset(470, 470),
}):Play()
Splash = { gui = gui, status = status }
end
end
local function splashStatus(text)
if Splash and Splash.status then
pcall(function() Splash.status.Text = text end)
end
end
local function splashClose()
if not Splash then return end
local gui = Splash.gui
local ok = pcall(function()
if not gui or not gui.Parent then return end
local backdrop = gui:FindFirstChildWhichIsA("Frame")
if backdrop then
TweenService:Create(backdrop, TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.In), {
BackgroundTransparency = 1,
}):Play()
end
task.wait(0.32)
gui:Destroy()
end)
if not ok then pcall(function() gui:Destroy() end) end
Splash = nil
end
pcall(function()
local rg = game:GetService("CoreGui"):FindFirstChild("RobloxGui")
if not rg then return end
for _, sg in ipairs(rg:GetChildren()) do
if sg:IsA("ScreenGui") then
if sg.Name == "Obsidian" or sg.Name == "NebulaUI" or sg.Name == "KeySystem" then
sg:Destroy()
end
end
end
end)
pcall(function()
local pg = LocalPlayer:FindFirstChild("PlayerGui")
if not pg then return end
for _, sg in ipairs(pg:GetChildren()) do
if sg:IsA("ScreenGui") and (sg.Name == "LiquidSplash" or sg.Name == "KeySystem") then
sg:Destroy()
end
end
end)
local Repo = "https://raw.githubusercontent.com/tyanxblack2-max/asdfasd/refs/heads/main/ui-libs/obsidian-ultra/"
local LIB_SOURCES = {
Repo .. "Library.lua",
"https://cdn.jsdelivr.net/gh/tyanxblack2-max/asdfasd@main/ui-libs/obsidian-ultra/Library.lua",
}
splashStatus("Loading interface...")
local Library = nil
for _, url in ipairs(LIB_SOURCES) do
local ok, res = pcall(function()
return game:HttpGet(url .. "?nocache=" .. tostring(os.time()))
end)
if ok and type(res) == "string" and #res > 2000 then
local chunk, cerr = (loadstring or load)(res)
if chunk then
local okLib, lib = pcall(chunk)
if okLib and type(lib) == "table" then
Library = lib
break
end
else
warn("[Liquid Hub] Compile error: " .. tostring(cerr))
end
end
end
if not Library or type(Library) ~= "table" then
warn("[Liquid Hub] Failed to load ObsidianUltra from all sources")
splashClose()
return
end
local SaveManager
pcall(function()
SaveManager = loadstring(game:HttpGet(Repo .. "addons/SaveManager.lua"))()
end)
local GAME_NAME = "Unknown Game"
do
local pid = game.PlaceId
local ok, name = pcall(function()
local Http = game:GetService("HttpService")
local res = game:HttpGet("https://apis.roblox.com/universes/v1/places/" .. pid .. "/universe")
local universeId = Http:JSONDecode(res).universeId
local res2 = game:HttpGet("https://games.roblox.com/v1/games?universeIds=" .. universeId)
return Http:JSONDecode(res2).data[1].name
end)
if ok and type(name) == "string" and #name > 0 then
GAME_NAME = name
else
pcall(function()
for _, attr in ipairs({ "GameName", "PlaceName", "DisplayName" }) do
local v = ReplicatedStorage:GetAttribute(attr)
if type(v) == "string" and #v > 0 then
GAME_NAME = v
break
end
end
end)
if GAME_NAME == "Unknown Game" and pid ~= 0 then
GAME_NAME = "Place " .. pid
end
end
end
splashStatus("Building menu...")
local Window = Library:CreateWindow({
Title = BRAND.Name,
Icon = LOGO_ICON,
IconSize = UDim2.fromOffset(22, 22),
DisableSearch = true,
Size = UDim2.fromOffset(680, 620),
Center = true,
ShowCustomCursor = false,
Snapping = false,
SnapAvoidCoreGui = false,
DisableCompactingSnap = true,
ToggleKeybind = Enum.KeyCode.RightShift,
UnlockMouseWhileOpen = false,
SidebarCompacted = true,
SidebarCompactWidth = 56,
MinSidebarWidth = 150,
EnableCompacting = true,
ShowMobileButtons = false,
DisableNotificationBell = false,
Animations = {
ToggleWindow = true,
TabSwitch = true,
Groupbox = true,
GroupboxCollapse = false,
Dropdown = true,
KeyPicker = true,
SubTabUnderline = false,
},
TabButtonsStyle = {
Gap = 6,
Padding = 6,
CornerRadius = 0,
Indicator = true,
IndicatorWidth = 2,
IndicatorHeight = 20,
},
Footer = {
{ Text = BRAND.Invite, Copyable = true },
" | ",
GAME_NAME,
},
})
Window:SetCornerRadius(2)
if Library.Scheme then
Library.Scheme.BackgroundColor = Color3.fromHex("02060F")
Library.Scheme.MainColor = Color3.fromHex("071229")
Library.Scheme.OutlineColor = Color3.fromHex("1D4E7A")
Library.Scheme.AccentColor = BRAND.Azure
Library.Scheme.FontColor = BRAND.Text
Library.Scheme.RedColor = Color3.fromHex("FF4D6D")
Library.Scheme.BlueColor = BRAND.Azure
Library.Scheme.WhiteColor = BRAND.Text
Library.Scheme.DarkColor = BRAND.Deep
Library.Scheme.DestructiveColor = Color3.fromHex("FF4D6D")
end
pcall(function()
if Library.SetFont then Library:SetFont(Enum.Font.Code) end
if Library.UpdateColorsUsingRegistry then Library:UpdateColorsUsingRegistry() end
end)
local Tabs = {
Main = Window:AddTab({ Name = "Main", Icon = ICON.Drops, Description = "Session overview" }),
Farming = Window:AddTab({ Name = "Farming", Icon = ICON.Bolt, Description = "Training, eggs, selling and rewards" }),
Inventory = Window:AddTab({ Name = "Inventory", Icon = ICON.Package, Description = "Shops and upgrades" }),
Misc = Window:AddTab({ Name = "Misc", Icon = ICON.Gamepad, Description = "Movement and utilities" }),
Settings = Window:AddTab({ Name = "Settings", Icon = ICON.Gear, Description = "Configs" }),
Credits = Window:AddTab({ Name = "Credits", Icon = ICON.Star, Description = "Team and community" }),
}
splashStatus("Waiting for game data...")
local function getCharacter() return LocalPlayer.Character end
local function getHumanoid()
local char = getCharacter()
return char and char:FindFirstChildOfClass("Humanoid")
end
local function getRoot()
local char = getCharacter()
return char and char:FindFirstChild("HumanoidRootPart")
end
local Remotes = ReplicatedStorage:WaitForChild("Remotes", 15)
if not Remotes then
Library:Notify({ Title = BRAND.Name, Description = "Remotes folder not found. Join the game first.", Time = 6, Type = "Error" })
splashClose()
return
end
local function waitRemote(name, parent)
local success, instance = pcall(function()
return (parent or Remotes):WaitForChild(name, 10)
end)
if success then return instance end
return nil
end
local PlaceEggRequest = waitRemote("PlaceEggRequest")
local DropEggRequest = waitRemote("DropEggRequest")
local SellRemote = waitRemote("Sell")
local CoilsRemote = waitRemote("Coils")
local TrailsRemote = waitRemote("Trails")
local SquatTrainingRequest = waitRemote("SquatTrainingRequest")
local StopSquattingRequest = waitRemote("StopSquattingRequest")
local SquatBonusRequest = waitRemote("SquatBonusRequest")
local OfflineRewardsRemote = waitRemote("OfflineRewards")
local IndexRewardRemote = waitRemote("ClaimAnimalIndexReward")
local REMOTE_COUNT = 0
for _, r in ipairs({
PlaceEggRequest, DropEggRequest, SellRemote, CoilsRemote, TrailsRemote,
SquatTrainingRequest, StopSquattingRequest, SquatBonusRequest,
OfflineRewardsRemote, IndexRewardRemote,
}) do
if r then REMOTE_COUNT += 1 end
end
if REMOTE_COUNT < 10 then
warn(string.format(
"[Liquid Hub] only %d/10 remotes resolved - features depending on the missing ones will do nothing",
REMOTE_COUNT))
end
local Settings = ReplicatedStorage:FindFirstChild("Settings")
local function requireSetting(name)
local module = Settings and Settings:FindFirstChild(name)
if not module then return nil end
local success, result = pcall(require, module)
if success then return result end
return nil
end
local Rarities = requireSetting("Rarities")
local SpeedUpgrades = requireSetting("SpeedUpgrades")
local TrailSettings = requireSetting("Trails")
local BarbellUpgrades = requireSetting("BarbellUpgrades")
local RecommendedJumps = requireSetting("RecommendedJumps")
local ZoneJumpRequirements = { Meadow = 25 }
if RecommendedJumps and type(RecommendedJumps.List) == "table" then
for key, value in pairs(RecommendedJumps.List) do
local zone = string.gsub(tostring(key), "%d+$", "")
local jump = tonumber(value)
if jump and (ZoneJumpRequirements[zone] == nil or jump < ZoneJumpRequirements[zone]) then
ZoneJumpRequirements[zone] = jump
end
end
end
local function teleportTo(position)
local root = getRoot()
if root and position then
root.CFrame = CFrame.new(position + Vector3.new(0, 3, 0))
return true
end
return false
end
local function holderPosition(holder)
if not holder then return nil end
if holder:IsA("BasePart") then return holder.Position end
if holder:IsA("Attachment") then return holder.WorldPosition end
return nil
end
local function getPlot()
local plot = LocalPlayer:FindFirstChild("Plot")
return plot and plot.Value or nil
end
local function getSquatDetector()
local plot = getPlot()
local zone = plot and plot:FindFirstChild("SquatZone")
local floor = zone and zone:FindFirstChild("Floor")
return floor and floor:FindFirstChild("Detector") or nil
end
local function getPlacementDetector()
local plot = getPlot()
return plot and plot:FindFirstChild("Detector", true) or nil
end
local function getCash()
local leaderstats = LocalPlayer:FindFirstChild("leaderstats")
local cash = leaderstats and leaderstats:FindFirstChild("Cash")
local value = cash and cash:FindFirstChild("V")
return value and tonumber(value.Value) or 0
end
local function getLevel()
local leaderstats = LocalPlayer:FindFirstChild("leaderstats")
local level = leaderstats and leaderstats:FindFirstChild("Level")
local value = level and level:FindFirstChild("V")
return value and tonumber(value.Value) or 0
end
local function isPetTool(tool)
return tool:IsA("Tool") and tool:GetAttribute("IsPetInventoryTool") == true
end
local function isEggTool(tool)
return tool:IsA("Tool") and tool:GetAttribute("IsEggTool") == true
end
local function forEachContainer(fn)
local character = getCharacter()
if LocalPlayer.Backpack then fn(LocalPlayer.Backpack) end
if character then fn(character) end
end
local function findTool(predicate)
local found
forEachContainer(function(container)
if found then return end
for _, child in ipairs(container:GetChildren()) do
if child:IsA("Tool") and predicate(child) then
found = child
return
end
end
end)
return found
end
local function countEggTools()
local count = 0
forEachContainer(function(container)
for _, child in ipairs(container:GetChildren()) do
if isEggTool(child) then count += 1 end
end
end)
return count
end
local function countPlacedEggs()
local plot = getPlot()
local placed = plot and plot:FindFirstChild("PlacedEggs")
return placed and #placed:GetChildren() or 0
end
local function countReadyEggs()
local plot = getPlot()
local placed = plot and plot:FindFirstChild("PlacedEggs")
if not placed then return 0 end
local ready = 0
for _, egg in ipairs(placed:GetChildren()) do
if egg:GetAttribute("HatchReady") == true then ready += 1 end
end
return ready
end
local function uniqueAnimalNames()
local names, seen = {}, {}
forEachContainer(function(container)
for _, child in ipairs(container:GetChildren()) do
if isPetTool(child) then
local name = child:GetAttribute("AnimalName") or child.Name
if not seen[name] then
seen[name] = true
table.insert(names, name)
end
end
end
end)
table.sort(names)
return names
end
local function abbreviate(value)
value = tonumber(value) or 0
local units = { "", "K", "M", "B", "T", "Qa", "Qi" }
local index = 1
while value >= 1000 and index < #units do
value /= 1000
index += 1
end
if index == 1 then return tostring(math.floor(value)) end
return string.format("%.2f%s", value, units[index])
end
local function formatClock(seconds)
seconds = math.max(math.floor(seconds), 0)
local hours = math.floor(seconds / 3600)
local minutes = math.floor((seconds % 3600) / 60)
local secs = seconds % 60
return string.format("%02d:%02d:%02d", hours, minutes, secs)
end
local ZoneNames = {}
do
local map = workspace:FindFirstChild("Map")
local stages = map and map:FindFirstChild("Stages")
if stages then
for _, stage in ipairs(stages:GetChildren()) do
if stage:FindFirstChild("SpawnedEggs") then table.insert(ZoneNames, stage.Name) end
end
end
end
if #ZoneNames == 0 then
ZoneNames = { "Meadow", "Coral Reef", "Winter", "Desert", "Crystal Mines", "Jungle", "Mystic Isles", "Prehistoric", "Celestial Heights", "Savannah" }
end
local AnimalNames = uniqueAnimalNames()
if #AnimalNames == 0 then AnimalNames = { "None" } end
local RARITIES = { "Common", "Uncommon", "Rare", "Epic", "Legendary", "Mythic", "Divine", "Celestial", "Eternal" }
local Options = Library.Options
local Toggles = Library.Toggles
local function packSet(sel)
if type(sel) ~= "table" then return "" end
local names = {}
for k, v in pairs(sel) do
if type(k) == "string" then names[#names + 1] = k end
if type(v) == "string" then names[#names + 1] = v end
end
table.sort(names)
return table.concat(names, ",")
end
local function unpackSet(str)
local set = {}
if type(str) == "string" and str ~= "" then
for name in string.gmatch(str, "[^,]+") do
set[name] = true
end
end
return set
end
local function asList(packed)
local list = {}
if type(packed) == "string" and packed ~= "" then
for name in string.gmatch(packed, "[^,]+") do
list[#list + 1] = name
end
end
return list
end
local function getFlag(n) return ReplicatedStorage:GetAttribute("LH_" .. n) end
local function setFlag(n, v) ReplicatedStorage:SetAttribute("LH_" .. n, v) end
local function selHas(sel, value)
if type(sel) ~= "table" then return true end
local count, hit = 0, false
for k, v in pairs(sel) do
count += 1
if v == true and k == value then hit = true end
if v == value then hit = true end
end
if count == 0 then return true end
return hit
end
local function seedSet(flagName, list)
local cur = getFlag(flagName)
if type(cur) == "string" and cur ~= "" then return end
local packed = packSet(list)
if packed ~= "" then setFlag(flagName, packed) end
end
seedSet("StealZones", ZoneNames)
seedSet("StealRarities", RARITIES)
seedSet("BuyCoilList", { "Red Coil", "Candy Coil", "Yellow Coil", "Chocolate Coil" })
seedSet("BuyTrailList", { "Blue Trail", "Red Trail", "Green Trail", "Yellow Trail", "Purple Trail", "White Trail", "Black Trail", "Galaxy Trail", "Crimson Star Trail", "Rainbow Trail" })
local StartedAt = os.clock()
local StatusGrid = nil
local StatusSession, StatusCash, StatusLevel, StatusEggs, StatusSquat
do
pcall(function()
Tabs.Main:AddPlayerInfo("LiquidBanner", {
Title = "Welcome to " .. BRAND.Name .. "",
Description = {
GAME_NAME .. " | press RightShift to toggle the menu",
},
ThumbnailType = "HeadShot",
Height = 84,
})
end)
local Session = Tabs.Main:AddLeftGroupbox("Session", ICON.Drops, true, false)
Session:AddLabel({ Text = GAME_NAME, DoesWrap = true })
pcall(function()
StatusGrid = Session:AddStatGrid("SessionStats", {
Columns = 2,
TileHeight = 44,
Padding = 6,
Items = {
{ Text = "Cash", Value = "0", ValueColor = BRAND.Azure },
{ Text = "Level", Value = "0", ValueColor = BRAND.Azure },
{ Text = "Eggs", Value = "0 / 0", Tooltip = "Carried / placed on your plot" },
{ Text = "Squat", Value = "idle", Tooltip = "Server-controlled squat state" },
{ Text = "Uptime", Value = "00:00:00", ValueColor = BRAND.Sheen },
},
})
end)
if not StatusGrid then
StatusSession = Session:AddLabel({ Text = "Uptime: 00:00:00", DoesWrap = true })
StatusCash = Session:AddLabel({ Text = "Cash: 0", DoesWrap = true })
StatusLevel = Session:AddLabel({ Text = "Level: 0", DoesWrap = true })
StatusEggs = Session:AddLabel({ Text = "Carried eggs: 0 | Placed: 0", DoesWrap = true })
StatusSquat = Session:AddLabel({ Text = "Squatting: false", DoesWrap = true })
end
end
local TrainingTab = Tabs.Farming:AddSubTab("Training", ICON.Dumbbell)
local EggTab = Tabs.Farming:AddSubTab("Eggs", ICON.Egg)
local SellingTab = Tabs.Farming:AddSubTab("Selling", ICON.Coins)
local RewardsTab = Tabs.Farming:AddSubTab("Rewards", ICON.Gift)
do
local Squats = TrainingTab:AddLeftGroupbox("Squats", ICON.Dumbbell, true, false)
Squats:AddToggle("AutoTrain", {
Text = "Auto Train Squats",
Tooltip = "Teleports to your squat pad and trains jump XP",
Default = false,
})
Squats:AddToggle("AutoSquatBonus", {
Text = "Auto Claim Squat Bonus",
Tooltip = "Instantly claims the pink squat bonus popup",
Default = false,
})
TrainingTab:AddRightGroupbox("Info", ICON.Question, true, false)
:AddLabel("Squatting is server controlled; training pauses while you carry an egg.", true)
end
do
local Stealing = EggTab:AddLeftGroupbox("Stealing", ICON.Egg, true, false)
Stealing:AddToggle("AutoSteal", {
Text = "Auto Steal Eggs",
Tooltip = "Grabs an egg, returns to base to bank it, then places it",
Default = false,
})
Stealing:AddDropdown("StealMode", {
Text = "Target",
Values = { "Best Egg", "Nearest Egg", "Highest Rarity" },
Default = 1,
Tooltip = "Best Egg = rarest egg your Jump Power can actually reach",
})
Stealing:AddDropdown("StealZones", {
Text = "Zones",
Values = ZoneNames,
Default = unpackSet(getFlag("StealZones")),
Multi = true,
Searchable = true,
Tooltip = "Only steal eggs from these zones (empty = all)",
})
Stealing:AddDropdown("StealRarities", {
Text = "Rarities",
Values = RARITIES,
Default = unpackSet(getFlag("StealRarities")),
Multi = true,
Searchable = true,
Tooltip = "Only steal eggs of these rarities (empty = all)",
})
Stealing:AddSlider("StealDelay", {
Text = "Train Between Steals",
Default = 5,
Min = 0,
Max = 60,
Rounding = 0,
Suffix = "s",
Tooltip = "After each egg is placed, train squats for this long before stealing again",
})
local Hatching = EggTab:AddRightGroupbox("Hatching", ICON.Spark, true, false)
Hatching:AddToggle("AutoPlace", {
Text = "Auto Place Stolen Eggs",
Tooltip = "Places carried eggs on your plot",
Default = false,
})
Hatching:AddToggle("AutoHatch", {
Text = "Auto Hatch Ready Eggs",
Tooltip = "Opens every egg whose hatch timer finished, never uses Robux skip",
Default = false,
})
EggTab:AddRightGroupbox("Info", ICON.Question, true, false)
:AddLabel("Carrying an egg disables jumping. Auto Place moves it to your plot so the loop continues.", true)
if Options.StealZones then
Options.StealZones.OnChanged(function(v) setFlag("StealZones", packSet(v)) end)
setFlag("StealZones", packSet(Options.StealZones.Value))
end
if Options.StealRarities then
Options.StealRarities.OnChanged(function(v) setFlag("StealRarities", packSet(v)) end)
setFlag("StealRarities", packSet(Options.StealRarities.Value))
end
end
do
local Selling = SellingTab:AddLeftGroupbox("Selling", ICON.Coins, true, false)
Selling:AddToggle("AutoSell", {
Text = "Auto Sell Junk Pets",
Tooltip = "Equips a pet, walks to the animal seller and sells it",
Default = false,
})
Selling:AddDropdown("SellMode", {
Text = "Mode",
Values = { "Lowest CPS First", "Chosen Pet" },
Default = 1,
})
Selling:AddDropdown("AutoSellPet", {
Text = "Chosen Pet",
Values = AnimalNames,
Default = 1,
Searchable = true,
Tooltip = "Only used when Mode is Chosen Pet",
})
Selling:AddInput("SellMaxCps", {
Text = "Max CPS To Sell",
Default = "1000",
Placeholder = "1000",
Numeric = true,
Tooltip = "Lowest CPS First mode never sells pets above this value",
})
SellingTab:AddRightGroupbox("Info", ICON.Question, true, false)
:AddLabel("Sell value scales with pet CPS. Raise Max CPS only when you really want to sell better pets.", true)
end
do
local Claims = RewardsTab:AddLeftGroupbox("Claims", ICON.Gift, true, false)
Claims:AddToggle("AutoOffline", {
Text = "Auto Claim Offline Cash",
Tooltip = "Claims pending offline earnings whenever ready",
Default = false,
})
Claims:AddToggle("AutoIndex", {
Text = "Auto Claim Animal Index Rewards",
Tooltip = "Claims every finished Animal Index reward",
Default = false,
})
RewardsTab:AddRightGroupbox("Info", ICON.Question, true, false)
:AddLabel("Index rewards are claimed with a single claim-all request. Offline cash is claimed whenever a balance is waiting.", true)
end
local ShopsTab = Tabs.Inventory:AddSubTab("Shops", ICON.Cart)
local UpgradesTab = Tabs.Inventory:AddSubTab("Upgrades", ICON.Trend)
do
local Coils = ShopsTab:AddLeftGroupbox("Coils", ICON.Bolt, true, false)
Coils:AddToggle("AutoBuyCoils", {
Text = "Auto Buy Coils",
Tooltip = "Buys selected speed coils when affordable",
Default = false,
})
Coils:AddDropdown("BuyCoilList", {
Text = "Coils",
Values = { "Red Coil", "Candy Coil", "Yellow Coil", "Chocolate Coil" },
Default = unpackSet(getFlag("BuyCoilList")),
Multi = true,
Searchable = true,
Tooltip = "Coils to buy (empty = none)",
})
Coils:AddToggle("AutoEquipCoil", {
Text = "Auto Equip Best Coil",
Tooltip = "Equips the highest tier coil you own",
Default = false,
})
local Trails = ShopsTab:AddRightGroupbox("Trails", ICON.Spark, true, false)
Trails:AddToggle("AutoBuyTrails", {
Text = "Auto Buy Trails",
Tooltip = "Buys selected jump trails when affordable",
Default = false,
})
Trails:AddDropdown("BuyTrailList", {
Text = "Trails",
Values = { "Blue Trail", "Red Trail", "Green Trail", "Yellow Trail", "Purple Trail", "White Trail", "Black Trail", "Galaxy Trail", "Crimson Star Trail", "Rainbow Trail" },
Default = unpackSet(getFlag("BuyTrailList")),
Multi = true,
Searchable = true,
Tooltip = "Trails to buy (empty = none)",
})
Trails:AddToggle("AutoEquipTrail", {
Text = "Auto Equip Best Trail",
Tooltip = "Equips the highest jump multiplier trail you own",
Default = false,
})
if Options.BuyCoilList then
Options.BuyCoilList.OnChanged(function(v) setFlag("BuyCoilList", packSet(v)) end)
setFlag("BuyCoilList", packSet(Options.BuyCoilList.Value))
end
if Options.BuyTrailList then
Options.BuyTrailList.OnChanged(function(v) setFlag("BuyTrailList", packSet(v)) end)
setFlag("BuyTrailList", packSet(Options.BuyTrailList.Value))
end
end
do
local Barbell = UpgradesTab:AddLeftGroupbox("Barbell", ICON.Dumbbell, true, false)
Barbell:AddToggle("AutoBarbell", {
Text = "Auto Upgrade Barbell",
Tooltip = "Buys the next barbell level whenever you can afford it",
Default = false,
})
local Mutation = UpgradesTab:AddRightGroupbox("Mutation Machine", ICON.Flask, true, false)
Mutation:AddToggle("AutoAddMutation", {
Text = "Auto Add Pets To Mutation Machine",
Tooltip = "Feeds five matching pets into the machine",
Default = false,
})
Mutation:AddDropdown("MutationMode", {
Text = "Pet Choice",
Values = { "Auto Select", "Chosen Animal" },
Default = 1,
})
Mutation:AddDropdown("MutationAnimal", {
Text = "Chosen Animal",
Values = AnimalNames,
Default = 1,
Searchable = true,
})
Mutation:AddToggle("AutoClaimMutation", {
Text = "Auto Claim Gold Mutation",
Tooltip = "Claims the finished gold pet",
Default = false,
})
Mutation:AddToggle("AutoReturnMutation", {
Text = "Auto Return Mutation Pets",
Tooltip = "Returns stored pets when the machine allows it",
Default = false,
})
end
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local AntiAfkOn = ReplicatedStorage:GetAttribute("LH_AntiAfkOn")
if AntiAfkOn == nil then setFlag("AntiAfkOn", true) end
local NoclipOn = ReplicatedStorage:GetAttribute("LH_NoclipOn")
if NoclipOn == nil then setFlag("NoclipOn", false) end
local HideNameOn = ReplicatedStorage:GetAttribute("LH_HideNameOn")
if HideNameOn == nil then setFlag("HideNameOn", false) end
local FlyOn = ReplicatedStorage:GetAttribute("LH_FlyOn")
if FlyOn == nil then setFlag("FlyOn", false) end
local flySpeed = ReplicatedStorage:GetAttribute("LH_FlySpeed")
if type(flySpeed) ~= "number" then flySpeed = 60 setFlag("FlySpeed", 60) end
local noclipRunning = false
local flyOn = FlyOn == true
local flyBV, flyBG, flyConn
local flyKeys = { W = false, A = false, S = false, D = false, Space = false, Ctrl = false }
local defaultWalkSpeed, defaultJumpHeight = 16, 7.2
pcall(function()
local h = getHumanoid()
if h then
defaultWalkSpeed = h.WalkSpeed
defaultJumpHeight = h.UseJumpPower and h.JumpPower or h.JumpHeight
end
end)
local currentWalkSpeed = ReplicatedStorage:GetAttribute("LH_WalkSpeed")
if type(currentWalkSpeed) ~= "number" then currentWalkSpeed = defaultWalkSpeed end
local currentJump = ReplicatedStorage:GetAttribute("LH_JumpHeight")
if type(currentJump) ~= "number" then currentJump = defaultJumpHeight end
local function setNoclip(on)
pcall(function()
local char = getCharacter()
if not char then return end
for _, v in ipairs(char:GetDescendants()) do
if v:IsA("BasePart") then v.CanCollide = not on end
end
local hrp = char:FindFirstChild("HumanoidRootPart")
if hrp then hrp.CanCollide = not on end
end)
end
local function applyHideName(on)
local char = getCharacter()
if char then
local hum = char:FindFirstChildOfClass("Humanoid")
if hum then
hum.NameDisplayDistance = on and 0 or 100
hum.DisplayName = on and "" or LocalPlayer.DisplayName
end
for _, gui in ipairs(char:GetDescendants()) do
if gui:IsA("BillboardGui") then
gui.Enabled = not on
for _, lbl in ipairs(gui:GetDescendants()) do
if lbl:IsA("TextLabel") then
lbl.Visible = not on
lbl.TextTransparency = on and 1 or 0
end
end
end
end
end
end
local function noclipLoop()
noclipRunning = true
while getFlag("NoclipOn") and isCurrentGen() do
pcall(function() setNoclip(true) end)
task.wait(0.2)
end
pcall(function() setNoclip(false) end)
noclipRunning = false
end
local function applyWalkSpeed(v)
currentWalkSpeed = math.clamp(tonumber(v) or defaultWalkSpeed, 8, 200)
setFlag("WalkSpeed", currentWalkSpeed)
local hum = getHumanoid()
if hum then pcall(function() hum.WalkSpeed = currentWalkSpeed end) end
end
local function applyJump(v)
currentJump = math.clamp(tonumber(v) or defaultJumpHeight, 0, 200)
setFlag("JumpHeight", currentJump)
local hum = getHumanoid()
if hum then
pcall(function()
if hum.UseJumpPower then hum.JumpPower = currentJump else hum.JumpHeight = currentJump end
end)
end
end
local function stopFly()
flyOn = false
setFlag("FlyOn", false)
if flyConn then flyConn:Disconnect() flyConn = nil end
if flyBV then flyBV:Destroy() flyBV = nil end
if flyBG then flyBG:Destroy() flyBG = nil end
local hum = getHumanoid()
if hum then pcall(function() hum.PlatformStand = false end) end
pcall(function() setNoclip(getFlag("NoclipOn") == true) end)
end
local function startFly()
local char = getCharacter()
local hrp = char and char:FindFirstChild("HumanoidRootPart")
local hum = getHumanoid()
if not hrp or not hum then return end
flyOn = true
setFlag("FlyOn", true)
pcall(function() hum.PlatformStand = true end)
flyBG = Instance.new("BodyGyro")
flyBG.P = 9e4
flyBG.maxTorque = Vector3.new(9e9, 9e9, 9e9)
flyBG.cframe = hrp.CFrame
flyBG.Parent = hrp
flyBV = Instance.new("BodyVelocity")
flyBV.velocity = Vector3.zero
flyBV.maxForce = Vector3.new(9e9, 9e9, 9e9)
flyBV.Parent = hrp
setNoclip(true)
flyConn = RunService.Heartbeat:Connect(function()
if not flyOn or not isCurrentGen() then stopFly() return end
local char2 = getCharacter()
local hrp2 = char2 and char2:FindFirstChild("HumanoidRootPart")
local cam = workspace.CurrentCamera
if not hrp2 or not flyBV or not flyBG or not cam then return end
local move = Vector3.zero
if flyKeys.W then move += cam.CFrame.LookVector end
if flyKeys.S then move -= cam.CFrame.LookVector end
if flyKeys.A then move -= cam.CFrame.RightVector end
if flyKeys.D then move += cam.CFrame.RightVector end
if flyKeys.Space then move += Vector3.new(0, 1, 0) end
if flyKeys.Ctrl then move -= Vector3.new(0, 1, 0) end
if move.Magnitude > 0 then move = move.Unit * flySpeed end
flyBV.velocity = move
flyBG.cframe = cam.CFrame
end)
end
UserInputService.InputBegan:Connect(function(input, gpe)
if gpe then return end
local k = input.KeyCode
if k == Enum.KeyCode.W then flyKeys.W = true
elseif k == Enum.KeyCode.A then flyKeys.A = true
elseif k == Enum.KeyCode.S then flyKeys.S = true
elseif k == Enum.KeyCode.D then flyKeys.D = true
elseif k == Enum.KeyCode.Space then flyKeys.Space = true
elseif k == Enum.KeyCode.LeftControl or k == Enum.KeyCode.LeftShift then flyKeys.Ctrl = true end
end)
UserInputService.InputEnded:Connect(function(input)
local k = input.KeyCode
if k == Enum.KeyCode.W then flyKeys.W = false
elseif k == Enum.KeyCode.A then flyKeys.A = false
elseif k == Enum.KeyCode.S then flyKeys.S = false
elseif k == Enum.KeyCode.D then flyKeys.D = false
elseif k == Enum.KeyCode.Space then flyKeys.Space = false
elseif k == Enum.KeyCode.LeftControl or k == Enum.KeyCode.LeftShift then flyKeys.Ctrl = false end
end)
LocalPlayer.CharacterAdded:Connect(function(char)
task.wait(0.6)
local hum = char:WaitForChild("Humanoid", 6)
if hum then
pcall(function() hum.WalkSpeed = currentWalkSpeed end)
pcall(function()
if hum.UseJumpPower then hum.JumpPower = currentJump else hum.JumpHeight = currentJump end
end)
end
if getFlag("HideNameOn") == true then task.wait(0.2) applyHideName(true) end
if flyOn then task.wait(0.2) startFly() end
end)
task.spawn(function()
while isCurrentGen() do
task.wait(0.5)
local hum = getHumanoid()
if hum then
if math.abs(hum.WalkSpeed - currentWalkSpeed) > 0.5 then
pcall(function() hum.WalkSpeed = currentWalkSpeed end)
end
local cur = hum.UseJumpPower and hum.JumpPower or hum.JumpHeight
if math.abs(cur - currentJump) > 0.5 then
pcall(function()
if hum.UseJumpPower then hum.JumpPower = currentJump else hum.JumpHeight = currentJump end
end)
end
if getFlag("HideNameOn") == true then pcall(function() applyHideName(true) end) end
end
if getFlag("NoclipOn") == true and not noclipRunning then task.spawn(noclipLoop) end
end
end)
do
local Utilities = Tabs.Misc:AddLeftGroupbox("Utilities", ICON.Shield, true, false)
Utilities:AddToggle("AntiAFK", {
Text = "Anti-AFK",
Tooltip = "Jumps every 5 minutes so Roblox never kicks you",
Default = getFlag("AntiAfkOn") ~= false,
})
Utilities:AddToggle("HideName", {
Text = "Hide Name",
Tooltip = "Hides your nametag and overhead billboard",
Default = getFlag("HideNameOn") == true,
})
Utilities:AddToggle("Noclip", {
Text = "Noclip",
Tooltip = "Walk through walls",
Default = getFlag("NoclipOn") == true,
})
local Movement = Tabs.Misc:AddRightGroupbox("Movement", ICON.Move, true, false)
Movement:AddSlider("Walkspeed", {
Text = "Walkspeed",
Min = 8,
Max = 200,
Default = currentWalkSpeed,
Rounding = 0,
Tooltip = "Default 16 - Max 200",
})
Movement:AddSlider("Jumpheight", {
Text = "Jump Height",
Min = 0,
Max = 200,
Default = currentJump,
Rounding = 0,
Tooltip = "JumpHeight / JumpPower (auto)",
})
local Flight = Tabs.Misc:AddRightGroupbox("Flight", ICON.Rocket, true, false)
Flight:AddToggle("Fly", {
Text = "Fly",
Tooltip = "Enable flight (noclip while flying)",
Default = flyOn,
})
Flight:AddSlider("FlySpeed", {
Text = "Fly Speed",
Min = 10,
Max = 250,
Default = flySpeed,
Rounding = 5,
Suffix = " studs/s",
Tooltip = "Studs per second",
})
end
if Toggles.Noclip then
Toggles.Noclip.OnChanged(function(v)
if v and not noclipRunning then task.spawn(noclipLoop) end
if not v then pcall(function() setNoclip(false) end) end
end)
end
if Toggles.HideName then
Toggles.HideName.OnChanged(function(v) applyHideName(v) end)
end
if Toggles.Fly then
Toggles.Fly.OnChanged(function(v) if v then startFly() else stopFly() end end)
end
if Toggles.AntiAFK then
Toggles.AntiAFK.OnChanged(function(v) setFlag("AntiAfkOn", v) end)
end
if Toggles.Walkspeed then
Toggles.Walkspeed.OnChanged(function(v) applyWalkSpeed(v) end)
end
if Toggles.Jumpheight then
Toggles.Jumpheight.OnChanged(function(v) applyJump(v) end)
end
if Toggles.FlySpeed then
Toggles.FlySpeed.OnChanged(function(v)
flySpeed = math.clamp(tonumber(v) or 60, 10, 250)
setFlag("FlySpeed", flySpeed)
end)
end
if Toggles.AutoTrain then
Toggles.AutoTrain.OnChanged(function(value)
if value == false and LocalPlayer:GetAttribute("IsSquatting") == true and StopSquattingRequest then
StopSquattingRequest:FireServer()
end
end)
end
if HideNameOn == true then applyHideName(true) end
if getFlag("NoclipOn") == true and not noclipRunning then task.spawn(noclipLoop) end
if flyOn then task.defer(function() task.wait(0.8) if getFlag("FlyOn") == true then startFly() end end) end
local LastIndexClaim = 0
local LastBarbellAction = 0
local LastBonusClaim = 0
local CarryWatchSince = nil
local NextStealAt = 0
local NextPlaceAttempt = 0
local PlaceRotation = 0
local function zoneReachable(zone)
local required = ZoneJumpRequirements[zone]
if required == nil then return true end
local jp = LocalPlayer:FindFirstChild("JumpPower")
jp = jp and tonumber(jp.Value) or 0
return jp >= required
end
local function findEggPrompt(mode)
local map = workspace:FindFirstChild("Map")
local stages = map and map:FindFirstChild("Stages")
if not stages then return nil, nil end
local root = getRoot()
local origin = root and root.Position or Vector3.zero
local zoneFilter = unpackSet(getFlag("StealZones"))
local rarityFilter = unpackSet(getFlag("StealRarities"))
local bestPrompt, bestScore, bestPosition
for _, stage in ipairs(stages:GetChildren()) do
local spawned = stage:FindFirstChild("SpawnedEggs")
if spawned and selHas(zoneFilter, stage.Name) then
for _, egg in ipairs(spawned:GetChildren()) do
local rarity = egg:GetAttribute("Rarity")
if selHas(rarityFilter, rarity) then
local prompt = egg:FindFirstChildWhichIsA("ProximityPrompt", true)
if prompt and prompt.Enabled then
local worldPosition = holderPosition(prompt.Parent)
if worldPosition then
local distance = (worldPosition - origin).Magnitude
local rarityIndex = 0
if Rarities and Rarities.GetIndex then
rarityIndex = Rarities.GetIndex(rarity) or 0
end
local score
if mode == "Nearest Egg" then
score = -distance
else
if mode == "Best Egg" and not zoneReachable(stage.Name) then continue end
score = rarityIndex * 1000000 - distance * 0.001
end
if not bestScore or score > bestScore then
bestPrompt, bestScore, bestPosition = prompt, score, worldPosition
end
end
end
end
end
end
end
return bestPrompt, bestPosition
end
local function doCarryRecovery()
if not Toggles.AutoSteal.Value and not Toggles.AutoPlace.Value then
CarryWatchSince = nil
return
end
local carried = (tonumber(LocalPlayer:GetAttribute("CarriedEggCount")) or 0) > 0
local tool = findTool(isEggTool)
if carried and not tool then
local base = getPlacementDetector()
local root = getRoot()
if base and root and (root.Position - base.Position).Magnitude > 40 then
teleportTo(base.Position)
task.wait(0.4)
end
if not CarryWatchSince then
CarryWatchSince = os.clock()
elseif os.clock() - CarryWatchSince > 30 and DropEggRequest then
DropEggRequest:FireServer()
CarryWatchSince = os.clock()
task.wait(0.5)
end
else
CarryWatchSince = nil
end
end
local function doAutoTrain()
if not Toggles.AutoTrain.Value then return end
if Toggles.AutoHatch.Value and countReadyEggs() > 0 then
if LocalPlayer:GetAttribute("IsSquatting") == true and StopSquattingRequest then
StopSquattingRequest:FireServer()
end
return
end
if Toggles.AutoSteal.Value and (tonumber(LocalPlayer:GetAttribute("CarriedEggCount")) or 0) > 0 then
return
end
local detector = getSquatDetector()
local root = getRoot()
if not detector or not root then return end
if (root.Position - detector.Position).Magnitude > 10 then
teleportTo(detector.Position)
task.wait(0.3)
end
if LocalPlayer:GetAttribute("IsSquatting") ~= true and SquatTrainingRequest then
SquatTrainingRequest:FireServer(detector)
task.wait(0.25)
end
end
local function doAutoSquatBonus()
if not Toggles.AutoSquatBonus.Value or not SquatBonusRequest then return end
if LocalPlayer:GetAttribute("SquatBonusAvailable") ~= true then return end
if os.clock() - LastBonusClaim < 0.4 then return end
LastBonusClaim = os.clock()
local version = math.floor(tonumber(LocalPlayer:GetAttribute("SquatBonusVersion")) or 0)
SquatBonusRequest:FireServer(version)
end
local function doAutoPlace()
if not Toggles.AutoPlace.Value or not PlaceEggRequest then return end
if os.clock() < NextPlaceAttempt then return end
local list = {}
forEachContainer(function(container)
for _, child in ipairs(container:GetChildren()) do
if isEggTool(child) then table.insert(list, child) end
end
end)
if #list == 0 then return end
PlaceRotation += 1
local carrying = list[(PlaceRotation % #list) + 1]
local humanoid = getHumanoid()
local detector = getPlacementDetector()
if not humanoid or not detector then return end
NextPlaceAttempt = os.clock() + 2
pcall(function() humanoid:EquipTool(carrying) end)
task.wait(0.2)
PlaceEggRequest:FireServer(carrying:GetAttribute("EggId"), detector.Position + Vector3.new(0, 2, 0))
task.wait(0.35)
if not carrying.Parent then
local delay = tonumber(Options.StealDelay and Options.StealDelay.Value) or 5
NextStealAt = os.clock() + math.max(delay, 0)
end
end
local function doAutoSteal()
if not Toggles.AutoSteal.Value then return end
if os.clock() < NextStealAt then return end
if countEggTools() >= 3 then return end
if (tonumber(LocalPlayer:GetAttribute("CarriedEggCount")) or 0) > 0 then return end
local prompt, position = findEggPrompt(Options.StealMode and Options.StealMode.Value)
if not prompt or not position then return end
if LocalPlayer:GetAttribute("IsSquatting") == true and StopSquattingRequest then
StopSquattingRequest:FireServer()
local deadline = os.clock() + 1.5
while LocalPlayer:GetAttribute("IsSquatting") == true and os.clock() < deadline do
task.wait(0.15)
end
end
teleportTo(position)
task.wait(0.35)
if prompt.Enabled then fireproximityprompt(prompt) end
task.wait(0.4)
local base = getPlacementDetector()
if base then
teleportTo(base.Position)
task.wait(0.6)
end
end
local function doAutoHatch()
if not Toggles.AutoHatch.Value then return end
local plot = getPlot()
local placed = plot and plot:FindFirstChild("PlacedEggs")
if not placed then return end
for _, egg in ipairs(placed:GetChildren()) do
if egg:GetAttribute("HatchReady") == true then
local prompt = egg:FindFirstChildWhichIsA("ProximityPrompt", true)
if prompt and prompt.Enabled then
local position = holderPosition(prompt.Parent)
if position then
teleportTo(position)
task.wait(0.25)
end
fireproximityprompt(prompt)
task.wait(0.35)
return
end
end
end
end
local function findSellTarget()
local mode = Options.SellMode and Options.SellMode.Value
local chosen = Options.AutoSellPet and Options.AutoSellPet.Value
local maxCps = tonumber(Options.SellMaxCps and Options.SellMaxCps.Value) or 1000
local bestTool, bestCps
forEachContainer(function(container)
for _, child in ipairs(container:GetChildren()) do
if isPetTool(child) then
local name = child:GetAttribute("AnimalName") or child.Name
local cps = tonumber(child:GetAttribute("CashPerSecond")) or math.huge
if mode == "Chosen Pet" then
if name == chosen and (not bestCps or cps < bestCps) then
bestTool, bestCps = child, cps
end
elseif cps <= maxCps and (not bestCps or cps < bestCps) then
bestTool, bestCps = child, cps
end
end
end
end)
return bestTool
end
local function doAutoSell()
if not Toggles.AutoSell.Value then return end
if findTool(isEggTool) then return end
local tool = findSellTarget()
if not tool then return end
local humanoid = getHumanoid()
if not humanoid then return end
pcall(function() humanoid:EquipTool(tool) end)
local sellRoot = workspace:FindFirstChild("Map") and workspace.Map:FindFirstChild("Sell")
local detector = sellRoot and sellRoot:FindFirstChild("Detector", true)
if detector and detector:IsA("BasePart") then
teleportTo(detector.Position)
task.wait(0.3)
end
local prompt = detector and detector:FindFirstChild("SellAnimalPrompt", true)
if prompt and prompt.Enabled then
fireproximityprompt(prompt)
elseif SellRemote then
SellRemote:FireServer()
end
task.wait(0.4)
end
local function doAutoOffline()
if not Toggles.AutoOffline.Value or not OfflineRewardsRemote then return end
if (tonumber(LocalPlayer:GetAttribute("OfflineCashPending")) or 0) > 0 then
OfflineRewardsRemote:FireServer("Claim")
task.wait(0.25)
end
end
local function doAutoIndex()
if not Toggles.AutoIndex.Value or not IndexRewardRemote then return end
if os.clock() - LastIndexClaim < 15 then return end
LastIndexClaim = os.clock()
IndexRewardRemote:FireServer("__ALL__")
end
local function ownedValue(folder, name)
local entry = folder and folder:FindFirstChild(name)
return entry and entry.Value == true
end
local function doAutoCoils()
local coilData = LocalPlayer:FindFirstChild("CoilData")
if not coilData or not CoilsRemote then return end
local owned = coilData:FindFirstChild("Owned")
local equipped = coilData:FindFirstChild("Equipped")
if Toggles.AutoBuyCoils.Value and SpeedUpgrades then
for name in pairs(unpackSet(getFlag("BuyCoilList"))) do
local config = SpeedUpgrades.Get(name)
if config and not ownedValue(owned, name) and getCash() >= config.Cost then
CoilsRemote:FireServer("Select", name)
task.wait(0.25)
end
end
end
if Toggles.AutoEquipCoil.Value and SpeedUpgrades and equipped then
local bestName, bestOrder = nil, -1
if owned then
for _, entry in ipairs(owned:GetChildren()) do
if entry.Value == true then
local config = SpeedUpgrades.Get(entry.Name)
local order = config and config.Order or 0
if order > bestOrder then
bestName, bestOrder = entry.Name, order
end
end
end
end
if bestName and equipped.Value ~= bestName then
CoilsRemote:FireServer("Select", bestName)
task.wait(0.2)
end
end
end
local function doAutoTrails()
local trailData = LocalPlayer:FindFirstChild("TrailData")
if not trailData or not TrailsRemote then return end
local owned = trailData:FindFirstChild("Owned")
local equipped = trailData:FindFirstChild("Equipped")
if Toggles.AutoBuyTrails.Value and TrailSettings then
for name in pairs(unpackSet(getFlag("BuyTrailList"))) do
local config = TrailSettings.Get(name)
if config and not ownedValue(owned, name) and getCash() >= config.Cost then
TrailsRemote:FireServer("Select", name)
task.wait(0.25)
end
end
end
if Toggles.AutoEquipTrail.Value and TrailSettings and equipped then
local bestName, bestOrder = nil, -1
if owned then
for _, entry in ipairs(owned:GetChildren()) do
if entry.Value == true then
local config = TrailSettings.Get(entry.Name)
local order = config and config.Order or 0
if order > bestOrder then
bestName, bestOrder = entry.Name, order
end
end
end
end
if bestName and equipped.Value ~= bestName then
TrailsRemote:FireServer("Select", bestName)
task.wait(0.2)
end
end
end
local function doAutoBarbell()
if not Toggles.AutoBarbell.Value or not BarbellUpgrades or not BarbellUpgrades.GetNext then return end
if os.clock() - LastBarbellAction < 3 then return end
LastBarbellAction = os.clock()
local level = LocalPlayer:FindFirstChild("BarbellLevel")
if not level then return end
local nextUpgrade = BarbellUpgrades.GetNext(math.max(math.floor(tonumber(level.Value) or 1), 1))
if not nextUpgrade then return end
if getCash() < (tonumber(nextUpgrade.CashPrice) or 0) then return end
local plot = getPlot()
local zone = plot and plot:FindFirstChild("SquatZone")
local upgradeB = zone and zone:FindFirstChild("UpgradeB")
local prompt = upgradeB and upgradeB:FindFirstChild("BarbellUpgradePrompt", true)
if not prompt or not prompt.Enabled then return end
local position = holderPosition(prompt.Parent)
if position then
teleportTo(position)
task.wait(0.25)
end
fireproximityprompt(prompt)
task.wait(0.4)
end
local function findMutationPet(targetName)
local candidate, candidateCps
forEachContainer(function(container)
for _, child in ipairs(container:GetChildren()) do
if isPetTool(child) then
local name = child:GetAttribute("AnimalName") or child.Name
local cps = tonumber(child:GetAttribute("CashPerSecond")) or math.huge
if name == targetName and (not candidateCps or cps < candidateCps) then
candidate, candidateCps = child, cps
end
end
end
end)
return candidate
end
local function findDuplicateAnimal()
local counts, lowest = {}, {}
forEachContainer(function(container)
for _, child in ipairs(container:GetChildren()) do
if isPetTool(child) then
local name = child:GetAttribute("AnimalName") or child.Name
local cps = tonumber(child:GetAttribute("CashPerSecond")) or math.huge
counts[name] = (counts[name] or 0) + 1
if not lowest[name] or cps < lowest[name] then lowest[name] = cps end
end
end
end)
local bestName, bestCps
for name, count in pairs(counts) do
if count >= 2 and (not bestCps or lowest[name] < bestCps) then
bestName, bestCps = name, lowest[name]
end
end
return bestName
end
local function mutationDetector()
local map = workspace:FindFirstChild("Map")
local mutations = map and map:FindFirstChild("Mutations")
return mutations and mutations:FindFirstChild("Detector") or nil
end
local function fireMutation(name, detector)
local prompt = detector and detector:FindFirstChild(name, true)
if not prompt or not prompt.Enabled then return false end
local position = holderPosition(prompt.Parent)
if position then
teleportTo(position)
task.wait(0.2)
end
fireproximityprompt(prompt)
task.wait(0.35)
return true
end
local function doAutoMutation()
local active = LocalPlayer:GetAttribute("MutationCraftActive") == true
local ready = LocalPlayer:GetAttribute("MutationCraftReady") == true
local canRemove = LocalPlayer:GetAttribute("MutationCanRemove") == true
local detector = mutationDetector()
if Toggles.AutoClaimMutation.Value and active and ready then
fireMutation("MutationPrompt", detector)
return
end
if Toggles.AutoReturnMutation.Value and active and canRemove then
fireMutation("MutationRemovePrompt", detector)
return
end
if not Toggles.AutoAddMutation.Value or active then return end
local target = LocalPlayer:GetAttribute("MutationCraftAnimalName")
if type(target) ~= "string" or target == "" then
if Options.MutationMode and Options.MutationMode.Value == "Chosen Animal" then
target = Options.MutationAnimal and Options.MutationAnimal.Value
else
target = findDuplicateAnimal()
end
end
if not target or target == "None" then return end
local tool = findMutationPet(target)
if not tool then return end
local humanoid = getHumanoid()
if not humanoid then return end
pcall(function() humanoid:EquipTool(tool) end)
task.wait(0.2)
fireMutation("MutationPrompt", detector)
end
local function farmLoop(steps, interval)
task.spawn(function()
while isCurrentGen() do
for _, step in ipairs(steps) do
if not isCurrentGen() then return end
local ok, err = pcall(step)
if not ok and isCurrentGen() then
warn("[Liquid Hub] " .. tostring(err))
end
end
task.wait(interval or 0.5)
end
end)
end
farmLoop({
doCarryRecovery,
doAutoPlace,
doAutoSteal,
doAutoSell,
doAutoTrain,
doAutoSquatBonus,
doAutoHatch,
doAutoBarbell,
})
farmLoop({
doAutoOffline,
doAutoIndex,
doAutoCoils,
doAutoTrails,
})
farmLoop({ doAutoMutation }, 6)
task.spawn(function()
while isCurrentGen() do
task.wait(300)
if isCurrentGen() and getFlag("AntiAfkOn") ~= false then
pcall(function()
local hum = getHumanoid()
if hum then hum.Jump = true end
local virtualUser = game:GetService("VirtualUser")
virtualUser:CaptureController()
virtualUser:ClickButton2(Vector2.new())
end)
end
end
end)
task.spawn(function()
while isCurrentGen() do
pcall(function()
local uptime = formatClock(os.clock() - StartedAt)
local cash = abbreviate(getCash())
local level = tostring(getLevel())
local carried = countEggTools()
local placed = countPlacedEggs()
local squatting = LocalPlayer:GetAttribute("IsSquatting") == true
if StatusGrid and StatusGrid.SetValue then
StatusGrid:SetValue("Cash", cash)
StatusGrid:SetValue("Level", level)
StatusGrid:SetValue("Eggs", string.format("%d / %d", carried, placed))
StatusGrid:SetValue("Squat", squatting and "training" or "idle",
squatting and BRAND.Cyan or BRAND.Sheen)
StatusGrid:SetValue("Uptime", uptime)
end
if StatusSession then
StatusSession.Text = "Uptime: " .. uptime
StatusCash.Text = "Cash: " .. cash
StatusLevel.Text = "Level: " .. level
StatusEggs.Text = string.format("Carried eggs: %d | Placed: %d", carried, placed)
StatusSquat.Text = "Squatting: " .. tostring(squatting)
end
end)
task.wait(1)
end
end)
if SaveManager then
pcall(function()
SaveManager:SetLibrary(Library)
SaveManager:IgnoreThemeSettings()
SaveManager:SetIgnoreIndexes({ "MenuKeybind" })
SaveManager:SetFolder("LiquidHub/JumpForAnimals")
local addGroupbox = Tabs.Settings.AddGroupbox
Tabs.Settings.AddGroupbox = function(self, info)
info = info or {}
info.Side = "Left"
return addGroupbox(self, info)
end
local okBuild, buildErr = pcall(function()
SaveManager:BuildConfigSection(Tabs.Settings)
end)
Tabs.Settings.AddGroupbox = addGroupbox
if not okBuild then warn("[Liquid Hub] config section failed: " .. tostring(buildErr)) end
SaveManager:LoadAutoloadConfig()
end)
end
do
local Team = Tabs.Credits:AddLeftGroupbox("Team", ICON.ShieldOK, true, false)
Team:AddLabel("Owner - sempai.real")
Team:AddLabel("Game: " .. GAME_NAME)
pcall(function() Team:AddDivider() end)
local Community = Tabs.Credits:AddLeftGroupbox("Community", ICON.Heart, true, false)
pcall(function()
Community:AddDiscordBox("Invite", {
Avatar = LOGO_ICON,
Title = "Liquid Hub",
Subtitle = BRAND.Invite,
Status = "online",
Accent = BRAND.Azure,
Link = BRAND.Discord,
Buttons = {
{
Text = "Copy Invite",
Icon = "copy",
Copy = true,
Style = "Primary",
},
{
Text = "Copy Short",
Icon = "link",
Copy = BRAND.Invite,
Style = "Secondary",
},
},
})
end)
Community:AddLabel("Report bugs or request a game in Discord.", true)
end
splashClose()
Library:Notify({
Title = BRAND.Name,
Description = "Loaded for " .. GAME_NAME .. ". RightShift toggles the menu.",
Time = 5,
Type = "Info",
})