-- game load & fps unlocker repeat task.wait() until game:IsLoaded() if setfpscap then setfpscap(1000000) else warn("Your exploit does not support setfpscap.") end -- library local l = loadstring(game:HttpGet("https://github.com/Footagesus/WindUI/releases/latest/download/main.lua"))() -- services local ReplicatedStorage = game:GetService("ReplicatedStorage") local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local VirtualUser = game:GetService("VirtualUser") local Workspace = game:GetService("Workspace") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer local Character = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait() local HumanoidRootPart = Character:WaitForChild("HumanoidRootPart") local Backpack = LocalPlayer:WaitForChild("Backpack") -- settings local AutoCollect = false local AutoFarm = false local autoClicking = false local AutoCollectDelay = 60 local ClickInterval = 0.25 local HeldToolName = "Basic Bat" local SellPlant = false local SellBrainrot = false local serverStartTime = os.time() -- shop items local shop = { seedList = { "Cactus Seed", "Strawberry Seed", "Pumpkin Seed", "Sunflower Seed", "Dragon Seed", "Eggplant Seed", "Watermelon Seed", "Cocotank Seed", "Carnivorous Plant Seed", "Mr Carrot Seed", "Tomatrio Seed", "Shroombino Seed" }, gearList = { "Water Bucket", "Frost Grenade", "Banana Gun", "Frost Blower", "Carrot Launcher" } } -- variables local selectedSeeds = {} local selectedGears = {} local AutoBuySelectedSeed = false local AutoBuySelectedGear = false local AutoBuyAllSeed = false local AutoBuyAllGear = false -- helper functions local function GetMyPlot() for _, plot in ipairs(Workspace.Plots:GetChildren()) do local playerSign = plot:FindFirstChild("PlayerSign") if playerSign then local bg = playerSign:FindFirstChild("BillboardGui") local textLabel = bg and bg:FindFirstChild("TextLabel") if textLabel and (textLabel.Text == LocalPlayer.Name or textLabel.Text == LocalPlayer.DisplayName) then return plot end end end return nil end local function GetMyPlotName() local plot = GetMyPlot() return plot and plot.Name or "No Plot" end local function GetMoney() local leaderstats = LocalPlayer:FindFirstChild("leaderstats") return leaderstats and leaderstats:FindFirstChild("Money") and leaderstats.Money.Value or 0 end local function GetRebirth() local gui = LocalPlayer:FindFirstChild("PlayerGui") and LocalPlayer.PlayerGui:FindFirstChild("Main") if gui and gui:FindFirstChild("Rebirth") then local text = gui.Rebirth.Frame.Title.Text or "Rebirth 0" local n = tonumber(text:match("%d+")) or 0 return math.max(0, n - 1) end return 0 end local function FormatTime(sec) local h = math.floor(sec / 3600) local m = math.floor((sec % 3600) / 60) local s = sec % 60 return string.format("%02d:%02d:%02d", h, m, s) end -- safe remote getters local function GetBridgeNet2() return ReplicatedStorage:FindFirstChild("BridgeNet2") end local function GetRemotesFolder() return ReplicatedStorage:FindFirstChild("Remotes") end -- window local Window = l:CreateWindow({ Title = "Horizon Hub - Plants vs Brainrots", Icon = "rbxassetid://128130788295246", Author = "Laspard", Folder = "HorizonHubV3/PlantsVsBrainrots", Size = UDim2.fromOffset(500, 390), Transparent = true, Theme = "Dark", Resizable = true, SideBarWidth = 150, BackgroundImageTransparency = 0.8, HideSearchBar = true, ScrollBarEnabled = true, User = { Enabled = true, Anonymous = false, Callback = function() end, }, }) Window:EditOpenButton({ Title = "Horizon Hub - Open", Icon = "monitor", CornerRadius = UDim.new(0, 6), StrokeThickness = 2, Color = ColorSequence.new(Color3.fromRGB(30, 30, 30), Color3.fromRGB(255, 255, 255)), Draggable = true, }) -- tabs local Main = Window:Tab({Title = "Main", Icon = "house"}) local Sell = Window:Tab({Title = "Sell", Icon = "dollar-sign"}) local Shop = Window:Tab({Title = "Shop", Icon = "shopping-cart"}) local Collect = Window:Tab({Title = "Auto", Icon = "crown"}) Window:Divider() local InfoTab = Window:Tab({ Title = "Info", Icon = "info"}) Window:SelectTab(1) Main:Section({ Title = "Auto Farm", Icon = "crown" }) Main:Section({ Title = "Use on PRIVATE SERVERS only!", Icon = "badge-alert" }) -- cache local BrainrotsCache = {} local function UpdateBrainrotsCache() local ok, folder = pcall(function() return Workspace:WaitForChild("ScriptedMap"):WaitForChild("Brainrots") end) if not ok or not folder then return end BrainrotsCache = {} for _, b in ipairs(folder:GetChildren()) do if b:FindFirstChild("BrainrotHitbox") then table.insert(BrainrotsCache, b) end end end local function GetNearestBrainrot() local nearest = nil local minDist = math.huge for _, b in ipairs(BrainrotsCache) do local hitbox = b:FindFirstChild("BrainrotHitbox") if hitbox then local dist = (HumanoidRootPart.Position - hitbox.Position).Magnitude if dist < minDist then minDist = dist nearest = b end end end return nearest end -- utility local function EquipBat() local tool = Backpack:FindFirstChild(HeldToolName) or Character:FindFirstChild(HeldToolName) if tool then tool.Parent = Character end end local function InstantWarpToBrainrot(brainrot) local hitbox = brainrot and brainrot:FindFirstChild("BrainrotHitbox") if hitbox then local offset = Vector3.new(0, 1, 3) HumanoidRootPart.CFrame = CFrame.new(hitbox.Position + offset, hitbox.Position) end end -- improved auto clicker using VirtualUser for reliability local function DoClick() -- simulate press & release pcall(function() VirtualUser:Button1Down(Vector2.new(0, 0)) task.wait(0.03) VirtualUser:Button1Up(Vector2.new(0, 0)) end) end Main:Toggle({ Title = "Auto Farm", Desc = "Automatically Attacks the BRAINROTS", Default = false, Callback = function(v) AutoFarm = v autoClicking = v if v then EquipBat() UpdateBrainrotsCache() -- AUTO CLICKER task.spawn(function() while autoClicking do if Character and Character:FindFirstChild(HeldToolName) then DoClick() end task.wait(ClickInterval) end end) -- AUTO EQUIP task.spawn(function() while AutoFarm do if Character and not Character:FindFirstChild(HeldToolName) then EquipBat() end task.wait(0.5) end end) -- BRAINROTS CACHE REFRESH task.spawn(function() while AutoFarm do UpdateBrainrotsCache() task.wait(1) end end) -- AUTO FARM BRAINROT task.spawn(function() while AutoFarm do local currentTarget = GetNearestBrainrot() if not currentTarget then task.wait(0.5) continue end if currentTarget and currentTarget:FindFirstChild("BrainrotHitbox") then InstantWarpToBrainrot(currentTarget) pcall(function() local remotes = GetRemotesFolder() if remotes and remotes:FindFirstChild("AttacksServer") and remotes.AttacksServer:FindFirstChild("WeaponAttack") then remotes.AttacksServer.WeaponAttack:FireServer({ { target = currentTarget.BrainrotHitbox } }) else -- fallback to generic path (keeps original path from script) local ok, _ = pcall(function() ReplicatedStorage.Remotes.AttacksServer.WeaponAttack:FireServer({ { target = currentTarget.BrainrotHitbox } }) end) end end) end task.wait(ClickInterval) end end) else autoClicking = false end end }) -- auto colect local function GetNearestPlot() local nearestPlot = nil local minDist = math.huge for _, plot in ipairs(Workspace.Plots:GetChildren()) do if plot:IsA("Folder") then local center = plot:FindFirstChild("Center") or plot:FindFirstChildWhichIsA("BasePart") if center then local dist = (HumanoidRootPart.Position - center.Position).Magnitude if dist < minDist then minDist = dist nearestPlot = plot end end end end return nearestPlot end local function CollectFromPlot(plot) if not plot then return end local brainrotsFolder = plot:FindFirstChild("Brainrots") if not brainrotsFolder then return end for i = 1, 17 do local slot = brainrotsFolder:FindFirstChild(tostring(i)) if slot and slot:FindFirstChild("Brainrot") then local brainrot = slot:FindFirstChild("Brainrot") if brainrot:FindFirstChild("BrainrotHitbox") then local hitbox = brainrot.BrainrotHitbox local offset = Vector3.new(0, 1, 3) HumanoidRootPart.CFrame = CFrame.new(hitbox.Position + offset, hitbox.Position) task.wait(0.2) pcall(function() local remotes = GetRemotesFolder() if remotes and remotes:FindFirstChild("AttacksServer") and remotes.AttacksServer:FindFirstChild("WeaponAttack") then remotes.AttacksServer.WeaponAttack:FireServer({ { target = hitbox } }) else ReplicatedStorage.Remotes.AttacksServer.WeaponAttack:FireServer({ { target = hitbox } }) end end) end end end end Collect:Section({ Title = "Auto Collect", Icon = "hand-coins" }) Collect:Slider({ Title = "Auto Collect Delay (sec)", Description = "Set delay time between collections", Value = {Min = 1, Max = 60, Default = 5}, Step = 1, Callback = function(val) AutoCollectDelay = val end }) Collect:Toggle({ Title = "Auto Collect Money", Default = false, Callback = function(state) AutoCollect = state if state then task.spawn(function() while AutoCollect do local nearestPlot = GetNearestPlot() if nearestPlot then CollectFromPlot(nearestPlot) end task.wait(AutoCollectDelay) end end) end end }) Collect:Toggle({ Title = "Auto Collect Money V2 (PATCHED)", Description = "Automatically Collect Without Teleport", Default = false, Callback = function(state) if state then task.spawn(function() while state do local args = { { [2] = "\004" } } game:GetService("ReplicatedStorage"):WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) task.wait(1) end end) end end }) -- collect Collect:Section({ Title = "Auto Equip", Icon = "star" }) Collect:Toggle({ Title = "Auto Equip Brainrot (PATCHED)", Description = "Automatically Equip Best Brainrot", Default = false, Callback = function(state) if state then task.spawn(function() while state do local args = { { [2] = "\004" } } game:GetService("ReplicatedStorage"):WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) task.wait(1) end end) end end }) -- sell Sell:Section({ Title = "Auto Sell", Icon = "dollar-sign" }) Sell:Toggle({ Title = "Sell Brainrot All", Default = false, Callback = function(state) SellBrainrot = state end }) Sell:Toggle({ Title = "Sell Plants All", Default = false, Callback = function(state) SellPlant = state end }) Sell:Section({ Title = "Sell Everything", Icon = "gem" }) Sell:Toggle({ Title = "Sell Both All", Default = false, Callback = function(state) SellEverything = state end }) -- shop ui Shop:Section({ Title = "Buy Seed", Icon = "leaf" }) Shop:Dropdown({ Title = "Select Seed", Values = shop.seedList, Multi = true, Callback = function(values) selectedSeeds = values end }) -- Auto Buy Selected Seed Shop:Toggle({ Title = "Auto Buy Seed (Selected)", Default = false, Callback = function(state) AutoBuySelectedSeed = state if state then task.spawn(function() while AutoBuySelectedSeed do for _, seed in ipairs(selectedSeeds) do local args = {{ seed, "\b" }} game:GetService("ReplicatedStorage"):WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) task.wait(0.5) end task.wait(1) end end) end end }) -- Auto Buy All Seed Shop:Toggle({ Title = "Auto Buy Seed (All)", Default = false, Callback = function(state) AutoBuyAllSeed = state if state then task.spawn(function() while AutoBuyAllSeed do for _, seed in ipairs(shop.seedList) do local args = {{ seed, "\b" }} game:GetService("ReplicatedStorage"):WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) task.wait(0.5) end task.wait(1) end end) end end }) -- gear Shop:Section({ Title = "Buy Gear", Icon = "package" }) Shop:Dropdown({ Title = "Select Gear", Values = shop.gearList, Multi = true, Callback = function(values) selectedGears = values end }) -- Auto Buy Selected Gear Shop:Toggle({ Title = "Auto Buy Gear (Selected)", Default = false, Callback = function(state) AutoBuySelectedGear = state if state then task.spawn(function() while AutoBuySelectedGear do for _, gear in ipairs(selectedGears) do local args = {{ gear, "\026" }} game:GetService("ReplicatedStorage"):WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) task.wait(0.5) end task.wait(1) end end) end end }) -- Auto Buy All Gear Shop:Toggle({ Title = "Auto Buy Gear (All)", Default = false, Callback = function(state) AutoBuyAllGear = state if state then task.spawn(function() while AutoBuyAllGear do for _, gear in ipairs(shop.gearList) do local args = {{ gear, "\026" }} game:GetService("ReplicatedStorage"):WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) task.wait(0.5) end task.wait(1) end end) end end }) -- ====================== LOOPS ====================== -- Selling loop uses safe pcall and only fires when toggled task.spawn(function() while task.wait(0.69) do if SellBrainrot or SellPlant or SellEverything then local remotes = GetRemotesFolder() if remotes and remotes:FindFirstChild("ItemSell") then pcall(function() remotes.ItemSell:FireServer() end) else pcall(function() ReplicatedStorage.Remotes.ItemSell:FireServer() end) end end end end) -- Auto buy loop (fixed variable names and safer remote calls) task.spawn(function() while task.wait(0.95) do if AutoBuyGear and #selectedGears > 0 then local bn = GetBridgeNet2() for _, g in ipairs(selectedGears) do local args = {{g, "\026"}} if bn and bn:FindFirstChild("dataRemoteEvent") then pcall(function() bn.dataRemoteEvent:FireServer(unpack(args)) end) else pcall(function() ReplicatedStorage:WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) end) end task.wait(0.1) end end if AutoBuySeed and #selectedSeeds > 0 then local bn = GetBridgeNet2() for _, s in ipairs(selectedSeeds) do local args = {{s, "\b"}} if bn and bn:FindFirstChild("dataRemoteEvent") then pcall(function() bn.dataRemoteEvent:FireServer(unpack(args)) end) else pcall(function() ReplicatedStorage:WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) end) end task.wait(0.1) end end if AutoBuyAllGear then local bn = GetBridgeNet2() for _, g in ipairs(gearList) do local args = {{g, "\026"}} if bn and bn:FindFirstChild("dataRemoteEvent") then pcall(function() bn.dataRemoteEvent:FireServer(unpack(args)) end) else pcall(function() ReplicatedStorage:WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) end) end task.wait(0.12) end end if AutoBuyAllSeed then local bn = GetBridgeNet2() for _, s in ipairs(seedList) do local args = {{s, "\b"}} if bn and bn:FindFirstChild("dataRemoteEvent") then pcall(function() bn.dataRemoteEvent:FireServer(unpack(args)) end) else pcall(function() ReplicatedStorage:WaitForChild("BridgeNet2"):WaitForChild("dataRemoteEvent"):FireServer(unpack(args)) end) end task.wait(0.12) end end end end) Info = InfoTab local ui = l local InviteCode = "5MWnDsEnbw" local DiscordAPI = "https://discord.com/api/v10/invites/" .. InviteCode .. "?with_counts=true&with_expiration=true" local function LoadDiscordInfo() local success, result = pcall(function() return game:GetService("HttpService"):JSONDecode(ui.Creator.Request({ Url = DiscordAPI, Method = "GET", Headers = { ["User-Agent"] = "RobloxBot/1.0", ["Accept"] = "application/json" } }).Body) end) if success and result and result.guild then local DiscordInfo = Info:Paragraph({ Title = result.guild.name, Desc = ' Member Count : ' .. tostring(result.approximate_member_count) .. '\n Online Count : ' .. tostring(result.approximate_presence_count), Image = "rbxassetid://128130788295246", ImageSize = 42, }) Info:Button({ Title = "Update Info", Callback = function() local updated, updatedResult = pcall(function() return game:GetService("HttpService"):JSONDecode(ui.Creator.Request({ Url = DiscordAPI, Method = "GET", }).Body) end) if updated and updatedResult and updatedResult.guild then DiscordInfo:SetDesc( ' Member Count : ' .. tostring(updatedResult.approximate_member_count) .. '\n Online Count : ' .. tostring(updatedResult.approximate_presence_count) ) end end }) Info:Button({ Title = "Copy Our Discord Server Invite Link", Desc = "Click to copy our discord server invite link", Callback = function() setclipboard(tostring("https://discord.gg/" .. InviteCode)) Library:Notify({ Title = "Discord Server Link Copied!", Content = "Copied! in the clipboard", Duration = 2, Icon = "check", }) end }) else Info:Paragraph({ Title = "Error fetching Discord Info", Desc = game:GetService("HttpService"):JSONEncode(result), Image = "triangle-alert", ImageSize = 26, Color = "Red", }) end end LoadDiscordInfo()