local Players = game:GetService("Players") local RS = game:GetService("ReplicatedStorage") local UIS = game:GetService("UserInputService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") local ByteNet = RS:WaitForChild("ByteNetReliable") local function pktOp(op) local b = buffer.create(1) buffer.writeu8(b, 0, op) return b end -- [op][u16 le len][string] local function pktStr(op, str) local len = #str local b = buffer.create(1 + 2 + len) buffer.writeu8(b, 0, op) buffer.writeu16(b, 1, len) for i = 1, len do buffer.writeu8(b, 2 + i, string.byte(str, i)) -- i=1 -> idx 3 end return b end -- [op][u8][u16 len][string] local function pktU8Str(op, u8, str) local len = #str local b = buffer.create(1 + 1 + 2 + len) buffer.writeu8(b, 0, op) buffer.writeu8(b, 1, u8) buffer.writeu16(b, 2, len) for i = 1, len do buffer.writeu8(b, 3 + i, string.byte(str, i)) -- i=1 -> idx 4 end return b end local function fireNet(b) pcall(function() ByteNet:FireServer(b) end) end local cfg = { AutoClick = false, AutoFeedAll = false, AutoLaunch = false, AutoLaunchButton = false, AutoCollect = false, AutoOpenCrates = false, AutoUpgrade = false, AutoBuySilo = false, UpgradeTarget = "Clicker", ClickDelay = 0.05, FeedDelay = 0.35, LaunchDelay = 0.5, CollectDelay = 0.4, CrateDelay = 1, UpgradeDelay = 0.12, } local UPGRADE_TARGETS = { "Clicker", "Silo", "Helium Station", "Helium Tower", "Pipe Maze", "Atmospheric Reservoir", "Cryo Chamber", } local running, threads = {}, {} local function getPlot() local plots = workspace:FindFirstChild("Game") and workspace.Game:FindFirstChild("Plots") if not plots then return nil end local named = plots:FindFirstChild(player.Name .. "'s Plot") if named then return named end for _, p in ipairs(plots:GetChildren()) do if string.find(p.Name, player.Name, 1, true) then return p end end return nil end local function fireClick(det) if det then pcall(fireclickdetector, det) end end local function findClickerDet(plot) local gen = plot:FindFirstChild("Generators") local clicker = gen and gen:FindFirstChild("Clicker") local btn = clicker and clicker:FindFirstChild("Button") return btn and btn:FindFirstChildOfClass("ClickDetector") end local function findBalloon(plot) for _, c in ipairs(plot:GetChildren()) do if string.find(c.Name, "Balloon", 1, true) then return c end end end local function startLoop(key, fn) if threads[key] then return end running[key] = true threads[key] = task.spawn(function() while running[key] do local ok, err = pcall(fn) if not ok then warn("[BalloonAuto]", key, err) end end threads[key] = nil end) end local function setFeature(key, on, fn) cfg[key] = on if on then startLoop(key, fn) else running[key] = false end end local function firePrompt(prompt) if not prompt or not prompt:IsA("ProximityPrompt") then return end pcall(function() -- временно расширяем дистанцию / убираем hold local oldDist = prompt.MaxActivationDistance local oldHold = prompt.HoldDuration local oldEnabled = prompt.Enabled prompt.Enabled = true prompt.MaxActivationDistance = 999 prompt.HoldDuration = 0 if fireproximityprompt then -- разные сигнатуры executor'ов local ok = pcall(fireproximityprompt, prompt) if not ok then pcall(fireproximityprompt, prompt, 1) end end prompt.MaxActivationDistance = oldDist prompt.HoldDuration = oldHold prompt.Enabled = oldEnabled end) end local function findCollectPrompts(plot) local list = {} if not plot then return list end for _, d in ipairs(plot:GetDescendants()) do if d:IsA("ProximityPrompt") then local action = string.lower(d.ActionText or "") local object = string.lower(d.ObjectText or "") local name = string.lower(d.Name or "") if name == "pickup" or action == "collect" or string.find(object, "canister", 1, true) or string.find(name, "canister", 1, true) then list[#list + 1] = d end end end -- прямой путь из дампа local gen = plot:FindFirstChild("Generators") local clicker = gen and gen:FindFirstChild("Clicker") local can = clicker and clicker:FindFirstChild("Canister") if can then local p = can:FindFirstChild("Pickup") or can:FindFirstChildWhichIsA("ProximityPrompt", true) if p and p:IsA("ProximityPrompt") then local exists = false for _, x in ipairs(list) do if x == p then exists = true break end end if not exists then list[#list + 1] = p end end end return list end local function loopCollect() local plot = getPlot() local prompts = findCollectPrompts(plot) if #prompts == 0 then task.wait(0.5) return end local hrp = player.Character and player.Character:FindFirstChild("HumanoidRootPart") local oldCF = hrp and hrp.CFrame for _, p in ipairs(prompts) do -- сервер часто чекает дистанцию — короткий TP к канистре if hrp and p.Parent then local part = p.Parent:IsA("BasePart") and p.Parent or p.Parent:FindFirstChildWhichIsA("BasePart") if part then pcall(function() hrp.CFrame = part.CFrame * CFrame.new(0, 3, 0) end) task.wait(0.05) end end firePrompt(p) end if hrp and oldCF then pcall(function() hrp.CFrame = oldCF end) end if plot then for _, d in ipairs(plot:GetDescendants()) do if d:IsA("ClickDetector") then local parentName = string.lower(d.Parent and d.Parent.Name or "") if string.find(parentName, "canister", 1, true) or string.find(parentName, "pickup", 1, true) then fireClick(d) end end end end task.wait(cfg.CollectDelay) end local function loopClick() local plot = getPlot() if plot then fireClick(findClickerDet(plot)) local balloon = findBalloon(plot) local root = balloon and balloon:FindFirstChild("Root") local det = root and root:FindFirstChildOfClass("ClickDetector") fireClick(det) end fireNet(pktOp(0x19)) task.wait(cfg.ClickDelay) end local function loopFeedAll() local plot = getPlot() local balloon = plot and findBalloon(plot) local root = balloon and balloon:FindFirstChild("Root") if root then local p = root:FindFirstChild("FeedAll", true) or root:FindFirstChild("Feed", true) if p and p:IsA("ProximityPrompt") then firePrompt(p) end end task.wait(cfg.FeedDelay) end local function loopLaunch() local plot = getPlot() local balloon = plot and findBalloon(plot) local root = balloon and balloon:FindFirstChild("Root") if root then for _, d in ipairs(root:GetDescendants()) do if d:IsA("ProximityPrompt") and (d.ActionText == "Launch" or d.Name == "Feed") then firePrompt(d) end end end task.wait(cfg.LaunchDelay) end local function loopLaunchButton() local plot = getPlot() local lb = plot and plot:FindFirstChild("Launch_Button") local btn = lb and lb:FindFirstChild("Button") fireClick(btn and btn:FindFirstChildOfClass("ClickDetector")) task.wait(cfg.LaunchDelay) end local function loopCrates() fireNet(pktStr(0x0A, "Crates")) local crates = workspace:FindFirstChild("Game") and workspace.Game.Middle and workspace.Game.Middle:FindFirstChild("Crates") if crates then for _, p in ipairs(crates:GetDescendants()) do if p:IsA("ProximityPrompt") then firePrompt(p) end end end task.wait(cfg.CrateDelay) end local function loopUpgrade() fireNet(pktStr(0x0C, cfg.UpgradeTarget)) task.wait(cfg.UpgradeDelay) end local function loopBuySilo() fireNet(pktStr(0x0D, "Silo")) task.wait(1.2) end -- UI local gui = Instance.new("ScreenGui") gui.Name = "BalloonAutoUI" gui.ResetOnSpawn = false gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling gui.Parent = playerGui local frame = Instance.new("Frame") frame.Size = UDim2.fromOffset(440, 480) frame.Position = UDim2.new(0.5, -220, 0.12, 0) frame.BackgroundColor3 = Color3.fromRGB(20, 22, 28) frame.BorderSizePixel = 0 frame.Active = true frame.Parent = gui Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 12) Instance.new("UIStroke", frame).Color = Color3.fromRGB(50, 55, 70) local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -20, 0, 26) title.Position = UDim2.fromOffset(14, 8) title.BackgroundTransparency = 1 title.Font = Enum.Font.GothamBold title.TextSize = 18 title.TextXAlignment = Enum.TextXAlignment.Left title.TextColor3 = Color3.fromRGB(240, 240, 245) title.Text = "Balloon Auto" title.Parent = frame local status = Instance.new("TextLabel") status.Size = UDim2.new(1, -20, 0, 16) status.Position = UDim2.fromOffset(14, 34) status.BackgroundTransparency = 1 status.Font = Enum.Font.Gotham status.TextSize = 12 status.TextXAlignment = Enum.TextXAlignment.Left status.TextColor3 = Color3.fromRGB(140, 145, 160) status.Text = "Plot: ..." status.Parent = frame local scroll = Instance.new("ScrollingFrame") scroll.Size = UDim2.new(1, -16, 1, -58) scroll.Position = UDim2.fromOffset(8, 52) scroll.BackgroundTransparency = 1 scroll.BorderSizePixel = 0 scroll.ScrollBarThickness = 4 scroll.AutomaticCanvasSize = Enum.AutomaticSize.Y scroll.CanvasSize = UDim2.new() scroll.Parent = frame Instance.new("UIListLayout", scroll).Padding = UDim.new(0, 5) local function section(t) local l = Instance.new("TextLabel") l.Size = UDim2.new(1, -8, 0, 18) l.BackgroundTransparency = 1 l.Font = Enum.Font.GothamMedium l.TextSize = 11 l.TextXAlignment = Enum.TextXAlignment.Left l.TextColor3 = Color3.fromRGB(120, 125, 140) l.Text = t l.Parent = scroll end local function row(h) local f = Instance.new("Frame") f.Size = UDim2.new(1, -8, 0, h or 32) f.BackgroundColor3 = Color3.fromRGB(30, 33, 42) f.BorderSizePixel = 0 f.Parent = scroll Instance.new("UICorner", f).CornerRadius = UDim.new(0, 8) return f end local function toggle(label, key, fn) local r = row(32) local t = Instance.new("TextLabel") t.Size = UDim2.new(1, -56, 1, 0) t.Position = UDim2.fromOffset(10, 0) t.BackgroundTransparency = 1 t.Font = Enum.Font.Gotham t.TextSize = 14 t.TextXAlignment = Enum.TextXAlignment.Left t.TextColor3 = Color3.fromRGB(220, 225, 235) t.Text = label t.Parent = r local btn = Instance.new("TextButton") btn.Size = UDim2.fromOffset(38, 20) btn.Position = UDim2.new(1, -46, 0.5, -10) btn.BackgroundColor3 = Color3.fromRGB(55, 60, 72) btn.Text = "" btn.AutoButtonColor = false btn.Parent = r Instance.new("UICorner", btn).CornerRadius = UDim.new(1, 0) local knob = Instance.new("Frame") knob.Size = UDim2.fromOffset(16, 16) knob.Position = UDim2.fromOffset(2, 2) knob.BackgroundColor3 = Color3.fromRGB(245, 245, 250) knob.BorderSizePixel = 0 knob.Parent = btn Instance.new("UICorner", knob).CornerRadius = UDim.new(1, 0) local function refresh() local on = cfg[key] btn.BackgroundColor3 = on and Color3.fromRGB(70, 180, 100) or Color3.fromRGB(55, 60, 72) knob.Position = on and UDim2.fromOffset(20, 2) or UDim2.fromOffset(2, 2) end btn.MouseButton1Click:Connect(function() setFeature(key, not cfg[key], fn) refresh() end) refresh() end local function numBox(label, key, minV) local r = row(32) local t = Instance.new("TextLabel") t.Size = UDim2.new(0.55, 0, 1, 0) t.Position = UDim2.fromOffset(10, 0) t.BackgroundTransparency = 1 t.Font = Enum.Font.Gotham t.TextSize = 13 t.TextXAlignment = Enum.TextXAlignment.Left t.TextColor3 = Color3.fromRGB(210, 215, 225) t.Text = label t.Parent = r local box = Instance.new("TextBox") box.Size = UDim2.new(0.4, -12, 0, 22) box.Position = UDim2.new(0.58, 0, 0.5, -11) box.BackgroundColor3 = Color3.fromRGB(42, 46, 58) box.Font = Enum.Font.Gotham box.TextSize = 13 box.TextColor3 = Color3.fromRGB(235, 235, 240) box.Text = tostring(cfg[key]) box.ClearTextOnFocus = false box.Parent = r Instance.new("UICorner", box).CornerRadius = UDim.new(0, 6) box.FocusLost:Connect(function() local n = tonumber(box.Text) if n then cfg[key] = math.max(minV or 0, n) end box.Text = tostring(cfg[key]) end) end local targetButtons = {} section("FEATURES") toggle("Auto Click", "AutoClick", loopClick) toggle("Auto Feed All", "AutoFeedAll", loopFeedAll) toggle("Auto Launch (balloon)", "AutoLaunch", loopLaunch) toggle("Auto Launch Button", "AutoLaunchButton", loopLaunchButton) toggle("Auto Collect Canister", "AutoCollect", loopCollect) toggle("Auto Open Crates", "AutoOpenCrates", loopCrates) toggle("Auto Upgrade (0x0C)", "AutoUpgrade", loopUpgrade) toggle("Auto Buy Silo (0x0D)", "AutoBuySilo", loopBuySilo) section("UPGRADE TARGET") for _, name in ipairs(UPGRADE_TARGETS) do local r = row(28) local btn = Instance.new("TextButton") btn.Size = UDim2.new(1, -8, 1, -4) btn.Position = UDim2.fromOffset(4, 2) btn.BackgroundColor3 = Color3.fromRGB(42, 46, 58) btn.Font = Enum.Font.Gotham btn.TextSize = 13 btn.TextColor3 = Color3.fromRGB(220, 225, 235) btn.Text = name btn.AutoButtonColor = false btn.Parent = r Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 6) targetButtons[name] = btn btn.MouseButton1Click:Connect(function() cfg.UpgradeTarget = name for n, b in pairs(targetButtons) do local on = n == cfg.UpgradeTarget b.BackgroundColor3 = on and Color3.fromRGB(70, 180, 100) or Color3.fromRGB(42, 46, 58) b.TextColor3 = on and Color3.fromRGB(20, 20, 24) or Color3.fromRGB(220, 225, 235) end end) end -- init highlight do local b = targetButtons[cfg.UpgradeTarget] if b then b.BackgroundColor3 = Color3.fromRGB(70, 180, 100) b.TextColor3 = Color3.fromRGB(20, 20, 24) end end section("SPEED") numBox("Click delay", "ClickDelay", 0) numBox("Feed delay", "FeedDelay", 0.05) numBox("Upgrade delay", "UpgradeDelay", 0.05) task.spawn(function() while gui.Parent do local p = getPlot() status.Text = "Plot: " .. (p and p.Name or "?") .. " | Upg: " .. cfg.UpgradeTarget task.wait(1) end end) local dragging, dragStart, startPos frame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = frame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) UIS.InputChanged:Connect(function(input) if not dragging then return end if input.UserInputType ~= Enum.UserInputType.MouseMovement and input.UserInputType ~= Enum.UserInputType.Touch then return end local d = input.Position - dragStart frame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X, startPos.Y.Scale, startPos.Y.Offset + d.Y) end) print("[BalloonAuto v2] loaded")