-- [[ 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=6ad75803162178f2d31f301b"))() end) end) --[[rscripts:analytics:end]] local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local CollectionService = game:GetService("CollectionService") local PathfindingService = game:GetService("PathfindingService") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local CoreGui = game:GetService("CoreGui") local LocalPlayer = Players.LocalPlayer local BIND_STEP_NAME = "DogsBonbonMoveStep" getgenv().AutoBonbon = false pcall(function() RunService:UnbindFromRenderStep(BIND_STEP_NAME) end) for _, key in ipairs({ "_BonbonSession", "_BonbonDiag", "_BonbonDiagHub", "_BonbonDiagV2", "_BonbonZeroTpHub", "_DogsBonbonCollector" }) do local prev = getgenv()[key] if prev then pcall(function() if type(prev.Unload) == "function" then prev:Unload() elseif type(prev.Stop) == "function" then prev:Stop() end end) getgenv()[key] = nil end end local function CleanupOldGuis() local parents = {} if type(gethui) == "function" then local ok, h = pcall(gethui) if ok and h then table.insert(parents, h) end end pcall(function() table.insert(parents, CoreGui) end) pcall(function() local pg = LocalPlayer:FindFirstChild("PlayerGui") if pg then table.insert(parents, pg) end end) local oldNames = { DogsBonbonESP = true, BonbonESPFolder = true, DogsBonbonUI = true, BonbonZeroTpHub = true, BonbonDiagHub = true, BonbonDiagV2UI = true, BonbonSafeDiagUI = true, BonbonDiagBeaconHL = true, BonbonDiagBeaconBB = true } for _, parent in ipairs(parents) do pcall(function() for _, child in ipairs(parent:GetChildren()) do if oldNames[child.Name] then pcall(game.Destroy, child) end end end) end end CleanupOldGuis() local ClientBonbons = nil local ClientSprint = nil local ClientSkillCheck = nil local ClientGun = nil local ClientGunfire = nil local ClientMinigun = nil local OriginalScatter = nil local OriginalGunFire = nil local Hub = { Running = true, AuraEnabled = true, AutoWalkEnabled = true, AvoidDogs = true, BonbonESP = true, AutoSkillCheck = true, AutoSprint = true, InfStamina = false, AutoAimGuns = true, AutoGun = false, GunTriggerHP = 50, GunTriggerTime = 60, LockedDog = nil, WeEquippedGun = false, MinigunHeldTool = nil, MinStamina = 12, RegainStamina = 45, RestingStamina = false, WeSetSprint = false, AuraRadius = 11.2, StopDistance = 7.8, DogDangerRadius = 16.0, DogPathCorridor = 10.5, DogEvadeRadius = 13.0, DogSpawnAvoidRadius = 24.0, CandyRushRadius = 28.0, MoveGoal = nil, CollectedCount = 0, CurrentTarget = nil, StatusText = "ready", GunStatusText = "guns: standby", Connections = {}, ESPMap = {}, Blacklist = setmetatable({}, { __mode = "k" }), FailCounts = setmetatable({}, { __mode = "k" }), StuckZones = {} } getgenv()._DogsBonbonCollector = Hub local GunSpecCache = setmetatable({}, { __mode = "k" }) local GunPriorityRank = { Minigun = 1, M249 = 2, MP5K = 3, HallowsLauncher = 4, DoubleBarrel = 5, HuntingRifle = 6, AR2 = 7 } local KnownGunNames = { MP5K = true, DoubleBarrel = true, HuntingRifle = true, M249 = true, HallowsLauncher = true, Minigun = true, AR2 = true } local MapRayParams = RaycastParams.new() MapRayParams.FilterType = Enum.RaycastFilterType.Include local GunLosParams = RaycastParams.new() GunLosParams.FilterType = Enum.RaycastFilterType.Include local function UpdateRayFilter() local filter = {} local map = workspace:FindFirstChild("CurrentMap") local planks = workspace:FindFirstChild("Planks") if map then table.insert(filter, map) end if planks then table.insert(filter, planks) end MapRayParams.FilterDescendantsInstances = filter local losFilter = {} if map then table.insert(losFilter, map) end local lobby = workspace:FindFirstChild("Lobby") if lobby then table.insert(losFilter, lobby) end local npcs = workspace:FindFirstChild("NPCs") if npcs then table.insert(losFilter, npcs) end GunLosParams.FilterDescendantsInstances = losFilter end local CachedLobbyBox = nil local function IsPointInLobby(pos) local lobby = workspace:FindFirstChild("Lobby") if not lobby then return false end if not CachedLobbyBox then local minV, maxV = nil, nil for _, d in ipairs(lobby:GetDescendants()) do if d:IsA("BasePart") then local half = d.Size * 0.5 local pMin = d.Position - half local pMax = d.Position + half minV = minV and minV:Min(pMin) or pMin maxV = maxV and maxV:Max(pMax) or pMax end end if minV and maxV then local pad = Vector3.new(25, 25, 25) CachedLobbyBox = { Min = minV - pad, Max = maxV + pad } end end if CachedLobbyBox then local bMin, bMax = CachedLobbyBox.Min, CachedLobbyBox.Max return pos.X >= bMin.X and pos.X <= bMax.X and pos.Y >= bMin.Y and pos.Y <= bMax.Y and pos.Z >= bMin.Z and pos.Z <= bMax.Z end return false end local function GetRoundStatus() local roundFolder = ReplicatedStorage:FindFirstChild("Round") return roundFolder and roundFolder:GetAttribute("Status") or "" end local function GetRoundTimeLeft() local roundFolder = ReplicatedStorage:FindFirstChild("Round") if not roundFolder then return math.huge end local endsAt = roundFolder:GetAttribute("EndsAt") or 0 if endsAt <= 0 then return math.huge end return math.max(0, endsAt - workspace:GetServerTimeNow()) end local function IsInRound() local stats = LocalPlayer:FindFirstChild("RoundStats") if not stats or stats:GetAttribute("InRound") ~= true then return false end local char = LocalPlayer.Character if not char or char:GetAttribute("LobbyIntro") == true then return false end local root = char:FindFirstChild("HumanoidRootPart") if not root or IsPointInLobby(root.Position) then return false end local map = workspace:FindFirstChild("CurrentMap") if not map or #map:GetChildren() == 0 then return false end return true end local function GetShopBonbons() local shop = LocalPlayer:FindFirstChild("Shop") return shop and (shop:GetAttribute("Bonbons") or 0) or 0 end local function GetLiveStamina() if ClientSprint and type(rawget(ClientSprint, "_stamina")) == "number" then return rawget(ClientSprint, "_stamina") end local pgui = LocalPlayer:FindFirstChild("PlayerGui") local stamGui = pgui and pgui:FindFirstChild("Stamina") local bar = stamGui and stamGui:FindFirstChild("Bar") local amt = bar and bar:FindFirstChild("Amount") if amt and amt:IsA("TextLabel") then return tonumber(amt.Text) or 100 end return 100 end local function GetCharacterData() local char = LocalPlayer.Character if not char or not char.Parent then return nil end local hum = char:FindFirstChildOfClass("Humanoid") if not hum or hum.Health <= 0 then return nil end local root = char:FindFirstChild("HumanoidRootPart") if not root or not root.Parent then return nil end local disabled = (char:GetAttribute("Ragdolled") == true) or (char:GetAttribute("Dragged") == true) or (char:GetAttribute("LobbyIntro") == true) return { Character = char, Humanoid = hum, Root = root, Torso = char:FindFirstChild("Torso"), Head = char:FindFirstChild("Head"), Disabled = disabled } end local function ApplySprintState(wantSprint) if not ClientSprint then return end if wantSprint then Hub.WeSetSprint = true if not rawget(ClientSprint, "_held") then pcall(ClientSprint._toggle, ClientSprint, true) rawset(ClientSprint, "_held", true) end else if Hub.WeSetSprint then Hub.WeSetSprint = false if rawget(ClientSprint, "_held") then pcall(ClientSprint._toggle, ClientSprint, false) rawset(ClientSprint, "_held", false) end end end end local function GetGunSpec(tool) if not tool then return nil end local cached = GunSpecCache[tool] if cached ~= nil then return cached or nil end local cfg = tool:FindFirstChild("GunConfig") if cfg and cfg:IsA("ModuleScript") then local ok, res = pcall(require, cfg) if ok and type(res) == "table" then GunSpecCache[tool] = res return res end end GunSpecCache[tool] = false return nil end local function IsGunTool(tool) if not tool or not tool:IsA("Tool") then return false end if tool:FindFirstChild("GunConfig") then return true end local shopTool = tool:GetAttribute("ShopTool") if type(shopTool) == "string" and KnownGunNames[shopTool] then return true end if KnownGunNames[tool.Name] then return true end if tool:GetAttribute("Loaded") ~= nil and tool:GetAttribute("FireCooldown") ~= nil then return true end return false end local function GetAllPlayerGuns(char) char = char or LocalPlayer.Character local guns = {} local seen = {} if char then for _, c in ipairs(char:GetChildren()) do if IsGunTool(c) and not seen[c] then seen[c] = true table.insert(guns, c) end end end local bp = LocalPlayer:FindFirstChildOfClass("Backpack") if bp then for _, c in ipairs(bp:GetChildren()) do if IsGunTool(c) and not seen[c] then seen[c] = true table.insert(guns, c) end end end table.sort(guns, function(a, b) local aKey = a:GetAttribute("ShopTool") or a.Name local bKey = b:GetAttribute("ShopTool") or b.Name local aRank = GunPriorityRank[aKey] or 50 local bRank = GunPriorityRank[bKey] or 50 if aRank ~= bRank then return aRank < bRank end return a.Name < b.Name end) return guns end local function GetGunAmmoState(tool) if not tool then return 0, 0, false end local loaded = tool:GetAttribute("Loaded") or 0 if ClientGunfire and type(ClientGunfire.Ammo) == "function" and tool.Parent == LocalPlayer.Character then local ok, predAmmo = pcall(ClientGunfire.Ammo, ClientGunfire, tool) if ok and type(predAmmo) == "number" then loaded = predAmmo end end local reserve = tool:GetAttribute("Reserve") or 0 local reloading = tool:GetAttribute("Reloading") == true return loaded, reserve, reloading end local function GetGunRange(tool) if not tool then return 280 end local attrRange = tool:GetAttribute("Range") if type(attrRange) == "number" and attrRange > 0 then return attrRange end local spec = GetGunSpec(tool) if spec and type(spec.Range) == "number" and spec.Range > 0 then return spec.Range end return 280 end local function GetGunFireCooldown(tool) if not tool then return 0.1 end local attrCd = tool:GetAttribute("FireCooldown") if type(attrCd) == "number" and attrCd > 0 then return attrCd end local spec = GetGunSpec(tool) if spec and type(spec.FireCooldown) == "number" and spec.FireCooldown > 0 then return spec.FireCooldown end return 0.1 end local function GetGunOriginPos(tool, charData) local handle = tool and tool:FindFirstChild("Handle") local muzzle = handle and handle:FindFirstChild("Muzzle") if tool and charData and tool.Parent == charData.Character and muzzle and muzzle:IsA("Attachment") then return muzzle.WorldPosition end if charData and charData.Head then return charData.Head.Position end if charData and charData.Root then return charData.Root.Position end local cam = workspace.CurrentCamera return cam and cam.CFrame.Position or Vector3.zero end local function ComputePredictedAimPos(tool, originPos, aimPart) if not aimPart then return originPos end local vel = aimPart.AssemblyLinearVelocity local spec = GetGunSpec(tool) if spec and type(spec.Rocket) == "table" then local rocketSpeed = tonumber(spec.Rocket.Speed) or 140 local dist = (aimPart.Position - originPos).Magnitude local t = math.clamp(dist / math.max(rocketSpeed, 1), 0, 1.0) return aimPart.Position + Vector3.new(vel.X, 0, vel.Z) * t end return aimPart.Position + Vector3.new(vel.X, vel.Y * 0.2, vel.Z) * 0.03 end local function HasGunLineOfSight(originPos, dogModel) UpdateRayFilter() for _, partName in ipairs({ "Torso", "Head", "HumanoidRootPart" }) do local part = dogModel:FindFirstChild(partName) if part and part:IsA("BasePart") then local delta = part.Position - originPos local dist = delta.Magnitude if dist >= 0.2 then local dir = delta.Unit local curOrigin = originPos local remaining = dist local clear = false for _ = 1, 6 do local hit = workspace:Raycast(curOrigin, dir * remaining, GunLosParams) if not hit then clear = true break end local hitInst = hit.Instance if hitInst:IsDescendantOf(dogModel) then clear = true break end local hitModel = hitInst:FindFirstAncestorOfClass("Model") local isOtherNpc = hitModel and hitModel:FindFirstChildOfClass("Humanoid") ~= nil if (not hitInst:IsA("Terrain") and hitInst.Transparency >= 1 and not isOtherNpc) or (isOtherNpc and hitModel:GetAttribute("Zombie") ~= true) then local step = hit.Distance + 0.05 curOrigin = curOrigin + dir * step remaining = remaining - step if remaining <= 0.1 then clear = true break end else break end end if clear then return part end else return part end end end return nil end local function IsDogAliveAndValid(dogModel) if not dogModel or not dogModel.Parent then return false end local hum = dogModel:FindFirstChildOfClass("Humanoid") local root = dogModel:FindFirstChild("Torso") or dogModel:FindFirstChild("HumanoidRootPart") return hum ~= nil and hum.Health > 0 and root ~= nil and dogModel:GetAttribute("Zombie") ~= true end local function SelectTargetDogToShoot(originPos, maxRange) maxRange = maxRange or 280 if IsDogAliveAndValid(Hub.LockedDog) then local r = Hub.LockedDog:FindFirstChild("Torso") or Hub.LockedDog:FindFirstChild("HumanoidRootPart") if r and (r.Position - originPos).Magnitude <= maxRange then local aimPart = HasGunLineOfSight(originPos, Hub.LockedDog) if aimPart then return Hub.LockedDog, aimPart end end end Hub.LockedDog = nil local npcs = workspace:FindFirstChild("NPCs") if not npcs then return nil, nil end local candidates = {} for _, npc in ipairs(npcs:GetChildren()) do if IsDogAliveAndValid(npc) then local r = npc:FindFirstChild("Torso") or npc:FindFirstChild("HumanoidRootPart") local d = r and (r.Position - originPos).Magnitude or math.huge if d <= maxRange then table.insert(candidates, { Model = npc, Dist = d }) end end end table.sort(candidates, function(a, b) return a.Dist < b.Dist end) for _, cand in ipairs(candidates) do local aimPart = HasGunLineOfSight(originPos, cand.Model) if aimPart then Hub.LockedDog = cand.Model return cand.Model, aimPart end end return nil, nil end local function ReleaseMinigunSpin() if Hub.MinigunHeldTool and ClientMinigun then pcall(function() ClientMinigun:Hold(Hub.MinigunHeldTool, "trigger", false) end) Hub.MinigunHeldTool = nil end end local function LocateLiveControllers() pcall(function() local cl = ReplicatedStorage:FindFirstChild("Client") if cl then if not ClientSprint and cl:FindFirstChild("Sprint") then ClientSprint = require(cl.Sprint) end if not ClientBonbons and cl:FindFirstChild("Bonbons") then ClientBonbons = require(cl.Bonbons) end if not ClientSkillCheck and cl:FindFirstChild("SkillCheck") then ClientSkillCheck = require(cl.SkillCheck) end if not ClientGun and cl:FindFirstChild("GunClient") then ClientGun = require(cl.GunClient) end if not ClientGunfire and cl:FindFirstChild("Gunfire") then ClientGunfire = require(cl.Gunfire) end if not ClientMinigun and cl:FindFirstChild("Minigun") then ClientMinigun = require(cl.Minigun) end end end) if (not ClientSprint or not ClientBonbons or not ClientSkillCheck) and type(getgc) == "function" then local ok, gc = pcall(getgc, true) if ok and type(gc) == "table" then for _, v in ipairs(gc) do if type(v) == "table" then if not ClientSprint and rawget(v, "_stamina") ~= nil and type(rawget(v, "_step")) == "function" then ClientSprint = v elseif not ClientBonbons and type(rawget(v, "_spinning")) == "table" then ClientBonbons = v elseif not ClientSkillCheck and rawget(v, "_gui") ~= nil and rawget(v, "_pointer") ~= nil and rawget(v, "_zone") ~= nil then ClientSkillCheck = v end end end end end if ClientGunfire and type(rawget(ClientGunfire, "_scatter")) == "function" and not OriginalScatter then OriginalScatter = ClientGunfire._scatter ClientGunfire._scatter = function(self, dir, spread) if Hub.Running and Hub.AutoAimGuns then return dir end return OriginalScatter(self, dir, spread) end end if ClientGun and type(rawget(ClientGun, "_fire")) == "function" and not OriginalGunFire then OriginalGunFire = ClientGun._fire ClientGun._fire = function(self, tool, aimPos) if Hub.Running and Hub.AutoAimGuns and tool and tool:IsA("Tool") then if tool:GetAttribute("Spread") ~= 0 then pcall(function() tool:SetAttribute("Spread", 0) end) end local charData = GetCharacterData() if charData and not charData.Disabled then local originPos = GetGunOriginPos(tool, charData) local gunRange = GetGunRange(tool) local _, aimPart = SelectTargetDogToShoot(originPos, gunRange) if aimPart then aimPos = ComputePredictedAimPos(tool, originPos, aimPart) end end end return OriginalGunFire(self, tool, aimPos) end end end LocateLiveControllers() local function FormatGunsInventorySummary(guns) local parts = {} for i = 1, math.min(#guns, 3) do local g = guns[i] local l, r, rel = GetGunAmmoState(g) local shortName = g.Name if shortName == "DoubleBarrel" then shortName = "DB" elseif shortName == "HuntingRifle" then shortName = "HR" elseif shortName == "HallowsLauncher" then shortName = "HL" end if rel then table.insert(parts, string.format("%s[rel/%d]", shortName, r)) else table.insert(parts, string.format("%s[%d/%d]", shortName, l, r)) end end return table.concat(parts, " ") end local LastReloadFire = 0 local LastGunFire = 0 local function StepGunCombat(charData, inRound) if not inRound then Hub.LockedDog = nil Hub.WeEquippedGun = false ReleaseMinigunSpin() Hub.GunStatusText = Hub.AutoAimGuns and "guns: auto-aim ready" or "guns: lobby" return end if not charData or charData.Disabled then ReleaseMinigunSpin() Hub.GunStatusText = "guns: waiting..." return end local guns = GetAllPlayerGuns(charData.Character) if #guns == 0 then Hub.LockedDog = nil Hub.WeEquippedGun = false ReleaseMinigunSpin() Hub.GunStatusText = "guns: none in inventory" return end local equippedGun = nil local reloadingGun = nil local anyGunHasAmmo = false for _, g in ipairs(guns) do if Hub.AutoAimGuns and g:GetAttribute("Spread") ~= 0 then pcall(function() g:SetAttribute("Spread", 0) end) end if g.Parent == charData.Character then equippedGun = g end local l, r, rel = GetGunAmmoState(g) if rel and not reloadingGun then reloadingGun = g end if l > 0 or r > 0 or rel then anyGunHasAmmo = true end end -- When Auto Gun is OFF, NEVER equip, swap, or unequip the player's guns (even if empty!) if not Hub.AutoGun then Hub.WeEquippedGun = false ReleaseMinigunSpin() local modeStr = Hub.AutoAimGuns and "aim:ON" or "aim:OFF" Hub.GunStatusText = string.format("%s | %s", modeStr, FormatGunsInventorySummary(guns)) return end -- Auto Gun is ON: if all guns in inventory are 0/0 empty, unequip if not anyGunHasAmmo then Hub.LockedDog = nil ReleaseMinigunSpin() if equippedGun then pcall(function() charData.Humanoid:UnequipTools() end) end Hub.WeEquippedGun = false Hub.GunStatusText = string.format("guns (%d): all empty (unequipped)", #guns) return end -- If any gun is mid-reload, keep it equipped until reload finishes if reloadingGun then ReleaseMinigunSpin() if equippedGun ~= reloadingGun then Hub.WeEquippedGun = true pcall(function() charData.Humanoid:EquipTool(reloadingGun) end) end local _, res = GetGunAmmoState(reloadingGun) Hub.GunStatusText = string.format("%s: reloading (res %d)", reloadingGun.Name, res) return end -- If currently equipped gun is 0/0 empty while Auto Gun is ON, unequip it so we can swap if equippedGun then local el, er, erel = GetGunAmmoState(equippedGun) if el <= 0 and er <= 0 and not erel then ReleaseMinigunSpin() pcall(function() charData.Humanoid:UnequipTools() end) equippedGun = nil Hub.WeEquippedGun = false end end local hpPct = (charData.Humanoid.Health / math.max(charData.Humanoid.MaxHealth, 1)) * 100 local roundStatus = GetRoundStatus() local timeLeft = (roundStatus == "Round") and GetRoundTimeLeft() or math.huge local lowHpTriggered = hpPct <= Hub.GunTriggerHP local timerTriggered = (roundStatus == "Round") and (timeLeft <= Hub.GunTriggerTime) if not lowHpTriggered and not timerTriggered then Hub.LockedDog = nil ReleaseMinigunSpin() if equippedGun and Hub.WeEquippedGun then Hub.WeEquippedGun = false pcall(function() charData.Humanoid:UnequipTools() end) end Hub.GunStatusText = string.format( "%s | wait (<=%d%% or <=%ds)", FormatGunsInventorySummary(guns), Hub.GunTriggerHP, Hub.GunTriggerTime ) return end local activeGun = nil if equippedGun then local el = GetGunAmmoState(equippedGun) if el > 0 then activeGun = equippedGun end end if not activeGun then for _, g in ipairs(guns) do local l = GetGunAmmoState(g) if l > 0 then activeGun = g break end end end if not activeGun and equippedGun then local _, er = GetGunAmmoState(equippedGun) if er > 0 then activeGun = equippedGun end end if not activeGun then for _, g in ipairs(guns) do local _, r = GetGunAmmoState(g) if r > 0 then activeGun = g break end end end if not activeGun then ReleaseMinigunSpin() return end local isEquipped = (activeGun.Parent == charData.Character) local loaded, reserve = GetGunAmmoState(activeGun) if loaded <= 0 and reserve > 0 then ReleaseMinigunSpin() if not isEquipped then Hub.WeEquippedGun = true pcall(function() charData.Humanoid:EquipTool(activeGun) end) Hub.GunStatusText = string.format("%s: equipping to reload...", activeGun.Name) return end if os.clock() - LastReloadFire > 0.4 then LastReloadFire = os.clock() local relRem = ReplicatedStorage:FindFirstChild("Remotes") and ReplicatedStorage.Remotes:FindFirstChild("RifleReload") if relRem and relRem:IsA("RemoteEvent") then relRem:FireServer() end end Hub.GunStatusText = string.format("%s: reload -> res %d", activeGun.Name, reserve) return end local originPos = GetGunOriginPos(activeGun, charData) local gunRange = GetGunRange(activeGun) local dogModel, aimPart = SelectTargetDogToShoot(originPos, gunRange) if not dogModel or not aimPart then ReleaseMinigunSpin() if isEquipped and Hub.WeEquippedGun then Hub.WeEquippedGun = false pcall(function() charData.Humanoid:UnequipTools() end) end Hub.GunStatusText = string.format("%s [%d/%d] active (no LOS)", activeGun.Name, loaded, reserve) return end if not isEquipped then ReleaseMinigunSpin() Hub.WeEquippedGun = true pcall(function() charData.Humanoid:EquipTool(activeGun) end) Hub.GunStatusText = string.format("equipping %s...", activeGun.Name) return end local spec = GetGunSpec(activeGun) if spec and spec.WindUp and ClientMinigun then Hub.MinigunHeldTool = activeGun pcall(function() ClientMinigun:Hold(activeGun, "trigger", true) end) local okReady, isReady = pcall(ClientMinigun.Ready, ClientMinigun, activeGun) if okReady and not isReady then Hub.GunStatusText = string.format("%s [%d/%d] spinning up...", activeGun.Name, loaded, reserve) return end else ReleaseMinigunSpin() end local cooldown = GetGunFireCooldown(activeGun) if os.clock() - LastGunFire >= math.max(cooldown * 0.9, 0.05) then LastGunFire = os.clock() local aimPos = ComputePredictedAimPos(activeGun, originPos, aimPart) if ClientGun and type(OriginalGunFire or ClientGun._fire) == "function" then if ClientGun._tool ~= activeGun then local equipSpec = spec or { Auto = true, Range = gunRange, FireCooldown = cooldown } pcall(ClientGun._equip, ClientGun, activeGun, equipSpec) end pcall(OriginalGunFire or ClientGun._fire, ClientGun, activeGun, aimPos) elseif ClientGunfire then local handle = activeGun:FindFirstChild("Handle") local muzzle = handle and handle:FindFirstChild("Muzzle") local mPos = (muzzle and muzzle:IsA("Attachment") and muzzle.WorldPosition) or originPos local dir = (aimPos - mPos) if dir.Magnitude > 0.1 then local hits, insts = ClientGunfire:Fire(activeGun, mPos, dir.Unit) if hits then local fireRem = ReplicatedStorage:FindFirstChild("Remotes") and ReplicatedStorage.Remotes:FindFirstChild("RifleFire") if fireRem and fireRem:IsA("RemoteEvent") then fireRem:FireServer(hits, insts) end end end end end local dogHum = dogModel:FindFirstChildOfClass("Humanoid") local dogHp = dogHum and math.ceil(dogHum.Health) or 0 Hub.GunStatusText = string.format("%s [%d/%d] -> %s (%dhp)", activeGun.Name, loaded, reserve, dogModel.Name, dogHp) end local function GetTrueBonbonPos(part) if ClientBonbons and type(rawget(ClientBonbons, "_spinning")) == "table" then local entry = ClientBonbons._spinning[part] if entry and typeof(entry.Base) == "CFrame" then return entry.Base.Position end end return part.Position end local function GetFloorPos(pos) UpdateRayFilter() local hit = workspace:Raycast(pos + Vector3.new(0, 3, 0), Vector3.new(0, -45, 0), MapRayParams) if hit then return hit.Position + Vector3.new(0, 0.5, 0) end return pos end local function IsBonbonValid(part) return part ~= nil and part.Parent ~= nil and part:IsA("BasePart") and part.CanTouch == true and part:GetAttribute("Collected") ~= true and part.Transparency < 0.95 end local function GetUncollectedBonbons() local list = {} local seen = {} local folder = workspace:FindFirstChild("Bonbons") if folder then for _, c in ipairs(folder:GetChildren()) do if not seen[c] and IsBonbonValid(c) then seen[c] = true table.insert(list, c) end end end for _, t in ipairs(CollectionService:GetTagged("Bonbon")) do if not seen[t] and IsBonbonValid(t) then seen[t] = true table.insert(list, t) end end return list end local function GetDogSpawnPositions() local spawns = {} local mapFolder = workspace:FindFirstChild("CurrentMap") if not mapFolder then return spawns end for _, map in ipairs(mapFolder:GetChildren()) do local ds = map:FindFirstChild("DogsSpawns") if ds then for _, d in ipairs(ds:GetDescendants()) do if d:IsA("BasePart") then table.insert(spawns, d.Position) end end end end return spawns end local function GetRagdollPadPositions() local pads = {} for _, inst in ipairs(CollectionService:GetTagged("RagdollPad")) do if inst:IsA("BasePart") and inst:IsDescendantOf(workspace) then table.insert(pads, { Pos = inst.Position, Radius = math.max(inst.Size.X, inst.Size.Z) * 0.5 + 3.0 }) end end return pads end local function GetActiveThreats() local threats = {} local npcs = workspace:FindFirstChild("NPCs") if npcs then for _, npc in ipairs(npcs:GetChildren()) do local hum = npc:FindFirstChildOfClass("Humanoid") local root = npc:FindFirstChild("HumanoidRootPart") or npc:FindFirstChild("Torso") if hum and hum.Health > 0 and root and npc:GetAttribute("Zombie") ~= true and npc:GetAttribute("Ragdolled") ~= true then local vel = root.AssemblyLinearVelocity local flatVel = Vector3.new(vel.X, 0, vel.Z) table.insert(threats, { Pos = root.Position, PredPos = root.Position + flatVel * 0.65, Vel = flatVel }) end end end if IsInRound() then local chars = workspace:FindFirstChild("Characters") local dave = chars and chars:FindFirstChild("Dave") if dave then local dRoot = dave:FindFirstChild("HumanoidRootPart") or dave:FindFirstChild("Head") if dRoot then local vel = dRoot.AssemblyLinearVelocity local flatVel = Vector3.new(vel.X, 0, vel.Z) table.insert(threats, { Pos = dRoot.Position, PredPos = dRoot.Position + flatVel * 0.65, Vel = flatVel }) end end end return threats end local function PointToSegmentDistance(pt, a, b) local ab = b - a local lenSq = ab:Dot(ab) if lenSq < 0.001 then return (pt - a).Magnitude end local t = math.clamp((pt - a):Dot(ab) / lenSq, 0, 1) local proj = a + ab * t return (pt - proj).Magnitude end local function GetThreatMetrics(pos, threats) threats = threats or GetActiveThreats() local minDist = math.huge local nearestThreat = nil for _, t in ipairs(threats) do local d1 = (t.Pos - pos).Magnitude local d2 = (t.PredPos - pos).Magnitude local d = math.min(d1, d2) if d < minDist then minDist = d nearestThreat = t end end return minDist, nearestThreat end local function GetNearestDogSpawnDist(pos, dogSpawns) dogSpawns = dogSpawns or GetDogSpawnPositions() local minDist = math.huge local nearestPos = nil for _, sp in ipairs(dogSpawns) do local d = (sp - pos).Magnitude if d < minDist then minDist = d nearestPos = sp end end return minDist, nearestPos end local function GetCorridorThreatDist(myPos, targetPos, threats) local minCorridorDist = math.huge for _, t in ipairs(threats) do local d1 = PointToSegmentDistance(t.Pos, myPos, targetPos) local d2 = PointToSegmentDistance(t.PredPos, myPos, targetPos) local d = math.min(d1, d2) if d < minCorridorDist then minCorridorDist = d end end return minCorridorDist end local function CanRushBonbon(myPos, bPos, threats) local dist = (bPos - myPos).Magnitude local yDiff = math.abs(bPos.Y - myPos.Y) if yDiff > 9.5 or dist > Hub.CandyRushRadius then return false end local grabTravelDist = math.max(dist - (Hub.AuraRadius - 1.5), 0) if grabTravelDist <= 7.5 then return true end local dogDistAtCandy = GetThreatMetrics(bPos, threats) local corridorDist = GetCorridorThreatDist(myPos, bPos, threats) if grabTravelDist < dogDistAtCandy * 0.9 and corridorDist >= 5.5 then return true end return false end local function GetStuckAndHazardPenalty(pos, dogSpawns, ragdollPads) local now = os.clock() local penalty = 0 for i = #Hub.StuckZones, 1, -1 do local z = Hub.StuckZones[i] if now >= z.Expire then table.remove(Hub.StuckZones, i) else local flatDist = (Vector3.new(pos.X, 0, pos.Z) - Vector3.new(z.Pos.X, 0, z.Pos.Z)).Magnitude local yDist = math.abs(pos.Y - z.Pos.Y) if flatDist < z.Radius and yDist < 8 then penalty += (z.Radius - flatDist) * 34 end end end if ragdollPads then for _, pad in ipairs(ragdollPads) do local d = (Vector3.new(pos.X, 0, pos.Z) - Vector3.new(pad.Pos.X, 0, pad.Pos.Z)).Magnitude if d < pad.Radius and math.abs(pos.Y - pad.Pos.Y) < 8 then penalty += (pad.Radius - d) * 60 end end end if Hub.AvoidDogs and dogSpawns then local status = GetRoundStatus() local weight = (status == "Headstart") and 3.5 or 0.8 for _, sp in ipairs(dogSpawns) do local d = (pos - sp).Magnitude if d < Hub.DogSpawnAvoidRadius then penalty += (Hub.DogSpawnAvoidRadius - d) * weight end end end return penalty end local function ChooseTargetBonbon(myPos, threats, dogSpawns) local bonbons = GetUncollectedBonbons() if #bonbons == 0 then return nil end local now = os.clock() local candidates = {} for _, part in ipairs(bonbons) do local expire = Hub.Blacklist[part] if not expire or now >= expire then table.insert(candidates, part) end end if #candidates == 0 then table.clear(Hub.Blacklist) candidates = bonbons end local status = GetRoundStatus() local bestPart = nil local bestScore = math.huge for _, part in ipairs(candidates) do local bPos = GetTrueBonbonPos(part) local dist = (bPos - myPos).Magnitude local yDiff = math.abs(bPos.Y - myPos.Y) local dogDistAtCandy = GetThreatMetrics(bPos, threats) local corridorDist = GetCorridorThreatDist(myPos, bPos, threats) local spawnDistAtCandy = GetNearestDogSpawnDist(bPos, dogSpawns) local canQuickGrab = CanRushBonbon(myPos, bPos, threats) local pathIsSafe = (not Hub.AvoidDogs) or (dogDistAtCandy >= Hub.DogDangerRadius and corridorDist >= Hub.DogPathCorridor) or canQuickGrab if pathIsSafe then local penalty = 0 if Hub.AvoidDogs then if dogDistAtCandy < Hub.DogDangerRadius then penalty += (Hub.DogDangerRadius - dogDistAtCandy) * 4.5 end if corridorDist < Hub.DogPathCorridor then penalty += (Hub.DogPathCorridor - corridorDist) * 5.5 end if status == "Headstart" and spawnDistAtCandy < Hub.DogSpawnAvoidRadius then penalty += (Hub.DogSpawnAvoidRadius - spawnDistAtCandy) * 2.5 end end local score = dist + (yDiff * 1.4) + penalty if canQuickGrab then score = score * 0.45 end if score < bestScore then bestScore = score bestPart = part end end end if not bestPart then for _, part in ipairs(candidates) do local bPos = GetTrueBonbonPos(part) local dist = (bPos - myPos).Magnitude local dogDistAtCandy = GetThreatMetrics(bPos, threats) local score = dist + math.max(0, 22 - dogDistAtCandy) * 5 if score < bestScore then bestScore = score bestPart = part end end end return bestPart end local TouchingParts = setmetatable({}, { __mode = "k" }) local LastAuraTick = 0 local function TriggerTouch(part, charData) if TouchingParts[part] then return end TouchingParts[part] = true task.spawn(function() if part and part.Parent and charData.Root and charData.Root.Parent then pcall(firetouchinterest, charData.Root, part, 0) pcall(firetouchinterest, part, charData.Root, 0) if charData.Torso then pcall(firetouchinterest, charData.Torso, part, 0) pcall(firetouchinterest, part, charData.Torso, 0) end if charData.Head then pcall(firetouchinterest, charData.Head, part, 0) pcall(firetouchinterest, part, charData.Head, 0) end task.wait(0.05) if part and part.Parent and charData.Root and charData.Root.Parent then pcall(firetouchinterest, charData.Root, part, 1) pcall(firetouchinterest, part, charData.Root, 1) if charData.Torso then pcall(firetouchinterest, charData.Torso, part, 1) pcall(firetouchinterest, part, charData.Torso, 1) end if charData.Head then pcall(firetouchinterest, charData.Head, part, 1) pcall(firetouchinterest, part, charData.Head, 1) end end end task.wait(0.03) TouchingParts[part] = nil end) end local function GetSafeGuiParent() if type(gethui) == "function" then local ok, res = pcall(gethui) if ok and res then return res end end local ok, res = pcall(function() return CoreGui end) if ok and res then return res end return LocalPlayer:WaitForChild("PlayerGui") end local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "DogsBonbonUI" ScreenGui.ResetOnSpawn = false ScreenGui.DisplayOrder = 999 ScreenGui.Parent = GetSafeGuiParent() local ESPContainer = Instance.new("Folder") ESPContainer.Name = "DogsBonbonESP" ESPContainer.Parent = ScreenGui local function ClearESPForPart(part) local entry = Hub.ESPMap[part] if entry then if entry.Highlight then pcall(game.Destroy, entry.Highlight) end if entry.Billboard then pcall(game.Destroy, entry.Billboard) end Hub.ESPMap[part] = nil end end local function UpdateESP(myPos) local validSet = {} if Hub.BonbonESP then for _, part in ipairs(GetUncollectedBonbons()) do validSet[part] = true local entry = Hub.ESPMap[part] if not entry then local hl = Instance.new("Highlight") hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop hl.FillTransparency = 0.35 hl.OutlineTransparency = 0 hl.Adornee = part hl.Parent = ESPContainer local bb = Instance.new("BillboardGui") bb.Size = UDim2.fromOffset(90, 22) bb.StudsOffset = Vector3.new(0, 2, 0) bb.AlwaysOnTop = true bb.Adornee = part bb.Parent = ESPContainer local lbl = Instance.new("TextLabel") lbl.Size = UDim2.fromScale(1, 1) lbl.BackgroundTransparency = 1 lbl.Font = Enum.Font.GothamBold lbl.TextSize = 11 lbl.TextStrokeTransparency = 0.2 lbl.Parent = bb entry = { Highlight = hl, Billboard = bb, Label = lbl } Hub.ESPMap[part] = entry end local isTarget = (part == Hub.CurrentTarget) local dist = myPos and (GetTrueBonbonPos(part) - myPos).Magnitude or 0 local col = (dist <= 10.0 and Color3.fromRGB(90, 255, 130)) or (isTarget and Color3.fromRGB(95, 210, 255)) or Color3.fromRGB(185, 115, 255) entry.Highlight.FillColor = col entry.Highlight.OutlineColor = col entry.Label.TextColor3 = col entry.Label.Text = string.format("%.1fm", dist) end end for part in pairs(Hub.ESPMap) do if not validSet[part] or not IsBonbonValid(part) then ClearESPForPart(part) end end end local LastJumpTick = 0 local function TriggerSmartJump(charData) if not charData or not charData.Humanoid then return false end if os.clock() - LastJumpTick < 0.28 then return false end if charData.Humanoid.FloorMaterial == Enum.Material.Air then return false end local stam = GetLiveStamina() if not Hub.InfStamina and stam < 10 then return false end LastJumpTick = os.clock() local hum = charData.Humanoid local prevRest = ClientSprint and rawget(ClientSprint, "_restingSince") hum.Jump = true pcall(hum.ChangeState, hum, Enum.HumanoidStateType.Jumping) if Hub.RestingStamina and ClientSprint and prevRest then task.defer(function() if ClientSprint and Hub.RestingStamina then rawset(ClientSprint, "_restingSince", prevRest) end end) end return true end local LastSkillCheckFire = 0 local LastGcCheck = 0 RunService:BindToRenderStep(BIND_STEP_NAME, Enum.RenderPriority.Character.Value + 1, function() if not Hub.Running then return end if (not ClientSprint or not ClientSkillCheck or not ClientBonbons or not ClientGun or not ClientGunfire or not ClientMinigun) and (os.clock() - LastGcCheck > 2.0) then LastGcCheck = os.clock() LocateLiveControllers() end local charData = GetCharacterData() local myPos = charData and charData.Root.Position or nil UpdateESP(myPos) local inRound = IsInRound() local moveDirVec = Vector3.zero if Hub.AutoWalkEnabled and inRound and charData and not charData.Disabled and Hub.MoveGoal then local delta = Vector3.new(Hub.MoveGoal.X - myPos.X, 0, Hub.MoveGoal.Z - myPos.Z) if delta.Magnitude > 0.35 then moveDirVec = delta.Unit charData.Humanoid:Move(moveDirVec, false) else charData.Humanoid:Move(Vector3.zero, false) end end local maxStam = (ClientSprint and ClientSprint.Config and ClientSprint.Config.Max) or 100 local isMoving = charData ~= nil and not charData.Disabled and (moveDirVec.Magnitude > 0.05 or charData.Humanoid.MoveDirection.Magnitude > 0.05) if Hub.InfStamina and ClientSprint then rawset(ClientSprint, "_stamina", maxStam) rawset(ClientSprint, "_spent", false) Hub.RestingStamina = false end if Hub.AutoSprint and inRound and charData and not charData.Disabled then if Hub.InfStamina then ApplySprintState(isMoving) else local curStam = GetLiveStamina() local stopFloor = math.max(Hub.MinStamina, 11) local resumeTarget = math.min(Hub.RegainStamina, maxStam - 0.5) local isSpent = (ClientSprint and rawget(ClientSprint, "_spent") == true) or curStam <= 1 if Hub.RestingStamina then if curStam >= resumeTarget and not isSpent then Hub.RestingStamina = false ApplySprintState(isMoving) else ApplySprintState(false) end else if curStam <= stopFloor or isSpent then Hub.RestingStamina = true ApplySprintState(false) else ApplySprintState(isMoving) end end end else ApplySprintState(false) end if Hub.AutoSkillCheck then if ClientSkillCheck and rawget(ClientSkillCheck, "_active") then local pos = rawget(ClientSkillCheck, "_position") or 0 local zStart = rawget(ClientSkillCheck, "_zoneStart") or 0 local zWidth = (ClientSkillCheck.Config and ClientSkillCheck.Config.ZoneWidth) or 0.18 if pos >= (zStart + 0.015) and pos <= (zStart + zWidth - 0.015) then if os.clock() - LastSkillCheckFire > 0.18 then LastSkillCheckFire = os.clock() pcall(function() ClientSkillCheck:_press() end) end end elseif charData and charData.Character:GetAttribute("Dragged") == true then local pgui = LocalPlayer:FindFirstChild("PlayerGui") local scGui = pgui and pgui:FindFirstChild("SkillCheck") if scGui and scGui.Enabled then local zone = scGui:FindFirstChild("Zone", true) local pointer = scGui:FindFirstChild("Pointer", true) if zone and pointer and zone:IsA("GuiObject") and pointer:IsA("GuiObject") then local pScale = pointer.Position.X.Scale local zStart = zone.Position.X.Scale local zEnd = zStart + zone.Size.X.Scale if pScale >= (zStart + 0.015) and pScale <= (zEnd - 0.015) then if os.clock() - LastSkillCheckFire > 0.18 then LastSkillCheckFire = os.clock() local rem = ReplicatedStorage:FindFirstChild("Remotes") and ReplicatedStorage.Remotes:FindFirstChild("SkillCheck") if rem and rem:IsA("RemoteEvent") then rem:FireServer() end end end end end end end StepGunCombat(charData, inRound) if not charData or charData.Disabled or not inRound then return end if Hub.AuraEnabled and (os.clock() - LastAuraTick >= 0.05) then LastAuraTick = os.clock() for _, part in ipairs(GetUncollectedBonbons()) do if (GetTrueBonbonPos(part) - myPos).Magnitude <= Hub.AuraRadius then TriggerTouch(part, charData) end end end end) local function ProbeSingleRay(originPos, dir, maxDist) local footY = originPos.Y - 2.95 local ankleHit = workspace:Raycast(originPos - Vector3.new(0, 2.35, 0), dir * maxDist, MapRayParams) local kneeHit = workspace:Raycast(originPos - Vector3.new(0, 1.2, 0), dir * maxDist, MapRayParams) local chestHit = workspace:Raycast(originPos + Vector3.new(0, 0.4, 0), dir * maxDist, MapRayParams) local firstHit = ankleHit if kneeHit and (not firstHit or kneeHit.Distance < firstHit.Distance) then firstHit = kneeHit end if chestHit and (not firstHit or chestHit.Distance < firstHit.Distance) then firstHit = chestHit end if not firstHit then return "open", maxDist, 0 end if firstHit.Normal.Y >= 0.55 then local upHit = workspace:Raycast(originPos + dir * math.min(firstHit.Distance + 2.5, maxDist) + Vector3.new(0, 3.0, 0), dir * math.max(maxDist - firstHit.Distance, 4.0), MapRayParams) if upHit and upHit.Normal.Y < 0.55 then return "wall", firstHit.Distance + upHit.Distance, 99 end return "open", maxDist, 2.5 end local hitDist = firstHit.Distance local probePoint = originPos + dir * (hitDist + 1.15) local headClear = not workspace:Raycast(originPos + Vector3.new(0, 4.8, 0), dir * (hitDist + 1.4), MapRayParams) if headClear then local downHit = workspace:Raycast(probePoint + Vector3.new(0, 5.8, 0), Vector3.new(0, -9.8, 0), MapRayParams) if downHit then local stepHeight = downHit.Position.Y - footY if stepHeight > 0.25 and stepHeight <= 6.4 then return "step", hitDist, stepHeight end end end return "wall", hitDist, 99 end local function ProbeDirectionWide(myPos, dir, maxDist) local right = Vector3.new(-dir.Z, 0, dir.X) local cKind, cDist, cStep = ProbeSingleRay(myPos, dir, maxDist) local lKind, lDist = ProbeSingleRay(myPos - right * 0.85, dir, math.min(maxDist, 7)) local rKind, rDist = ProbeSingleRay(myPos + right * 0.85, dir, math.min(maxDist, 7)) if (lKind == "wall" and lDist < 1.8) or (rKind == "wall" and rDist < 1.8) then return "wall", math.min(cDist, lDist, rDist), 99 end local minClear = math.min(cDist, (lKind == "wall" and lDist or maxDist), (rKind == "wall" and rDist or maxDist)) if cKind == "step" or (lKind == "step" and lDist <= 3.2) or (rKind == "step" and rDist <= 3.2) then return "step", math.min(cDist, lDist, rDist), cStep end return cKind, minClear, cStep end local function GetCornerExitOpenness(samplePos, dir) local right = Vector3.new(-dir.Z, 0, dir.X) local probeOrigin = samplePos + Vector3.new(0, 1.5, 0) local fHit = workspace:Raycast(probeOrigin, dir * 9.0, MapRayParams) local lHit = workspace:Raycast(probeOrigin, -right * 8.0, MapRayParams) local rHit = workspace:Raycast(probeOrigin, right * 8.0, MapRayParams) local fClear = (not fHit or fHit.Normal.Y >= 0.55) and 9.0 or fHit.Distance local lClear = (not lHit or lHit.Normal.Y >= 0.55) and 8.0 or lHit.Distance local rClear = (not rHit or rHit.Normal.Y >= 0.55) and 8.0 or rHit.Distance return fClear + math.max(lClear, rClear) end local BypassVector = nil local BypassUntil = 0 local function SteerAndClimbTowards(charData, rawGoal, threats, isEvading, dogSpawns, ragdollPads, candyPos) UpdateRayFilter() local root = charData.Root local myPos = root.Position local flatDelta = Vector3.new(rawGoal.X - myPos.X, 0, rawGoal.Z - myPos.Z) if flatDelta.Magnitude < 0.25 and not isEvading then if (rawGoal.Y - myPos.Y) > 1.4 then TriggerSmartJump(charData) end return rawGoal end local desiredDir = flatDelta.Magnitude > 0.05 and flatDelta.Unit or root.CFrame.LookVector local candyDir = nil if candyPos then local cd = Vector3.new(candyPos.X - myPos.X, 0, candyPos.Z - myPos.Z) if cd.Magnitude > 0.1 then candyDir = cd.Unit end end local climbDesired = (rawGoal.Y - myPos.Y) > 1.3 or (candyPos ~= nil and (candyPos.Y - myPos.Y) > 1.5) if climbDesired and flatDelta.Magnitude <= 9.5 then TriggerSmartJump(charData) end local nearestDogD = GetThreatMetrics(myPos, threats) local dogsClose = Hub.AvoidDogs and (isEvading or nearestDogD <= 17.5) if not dogsClose and os.clock() >= BypassUntil then local checkLen = math.clamp(flatDelta.Magnitude, 4.5, 9.5) local directKind, directDist = ProbeDirectionWide(myPos, desiredDir, checkLen) if directKind == "step" and directDist <= 3.8 then TriggerSmartJump(charData) BypassVector = nil return myPos + desiredDir * 10 elseif directKind == "open" and directDist >= checkLen - 0.3 then return rawGoal end end if not dogsClose and BypassVector and os.clock() < BypassUntil then local bKind, bDist = ProbeDirectionWide(myPos, BypassVector, 6.0) if bKind == "step" and bDist <= 3.8 then TriggerSmartJump(charData) return myPos + BypassVector * 10 elseif bKind == "open" and bDist >= 5.2 then return myPos + BypassVector * 10 end end local bestDir = desiredDir local bestScore = -math.huge local bestJump = false for i = 0, 23 do local angle = (i / 24) * math.pi * 2 local dir = Vector3.new(math.cos(angle), 0, math.sin(angle)) local kind, dist, stepLift = ProbeDirectionWide(myPos, dir, 24) if kind == "open" or kind == "step" or dist >= 5.5 then local reach = (kind == "step") and 14 or dist local moveStep = math.min(reach, 11) local samplePos = myPos + dir * moveStep local alignDesired = dir:Dot(desiredDir) local alignCandy = candyDir and dir:Dot(candyDir) or alignDesired local alignCurrent = BypassVector and (dir:Dot(BypassVector) * 4.5) or 0 local hazardPenalty = GetStuckAndHazardPenalty(samplePos, dogSpawns, ragdollPads) local exitOpenness = GetCornerExitOpenness(samplePos, dir) local stepScore = 0 if kind == "step" then stepScore = (climbDesired or isEvading) and 24 or 10 elseif kind == "open" and stepLift and stepLift > 0.5 then stepScore = (climbDesired or isEvading) and 18 or 6 elseif kind == "wall" then if dist < 8.5 then stepScore = -160 - (8.5 - dist) * 20 else stepScore = -45 end end if exitOpenness < 8.5 then stepScore -= (8.5 - exitOpenness) * 18 else stepScore += math.min(exitOpenness, 16) * 1.4 end local dogScore = 0 if threats and #threats > 0 then local minDogD = math.huge local minSegD = math.huge for _, t in ipairs(threats) do local d = math.min((samplePos - t.Pos).Magnitude, (samplePos - t.PredPos).Magnitude) if d < minDogD then minDogD = d end local segD = math.min( PointToSegmentDistance(t.Pos, myPos, samplePos), PointToSegmentDistance(t.PredPos, myPos, samplePos) ) if segD < minSegD then minSegD = segD end local toDog = Vector3.new(t.Pos.X - myPos.X, 0, t.Pos.Z - myPos.Z) local dogDistNow = toDog.Magnitude if dogDistNow > 0.1 and dogDistNow < 24 then local dogAlign = dir:Dot(toDog.Unit) if dogAlign > 0.15 then dogScore -= dogAlign * (isEvading and 85 or 52) end end end if minSegD < 6.5 then dogScore -= (6.5 - minSegD) * 45 end dogScore += math.min(minDogD, 32) * (isEvading and 3.4 or 1.3) end local goalScore if isEvading then goalScore = (alignDesired * 10) + (alignCandy * 20) else goalScore = (alignDesired * 26) + (alignCandy * 8) end local score = goalScore + (math.min(reach, 22) * 1.6) + stepScore + dogScore + alignCurrent - hazardPenalty if score > bestScore then bestScore = score bestDir = dir bestJump = (kind == "step" and dist <= 3.8) end end end BypassVector = bestDir BypassUntil = os.clock() + (isEvading and 0.25 or 0.55) if bestJump then TriggerSmartJump(charData) end return myPos + bestDir * 12 end local WalkerThread = task.spawn(function() local waypoints = nil local wpIndex = 1 local lastPathTime = 0 local lastTargetPart = nil local targetLockStart = 0 local targetStartDist = math.huge local lastCheckPos = Vector3.zero local lastCheckTime = os.clock() local stuckCount = 0 local function ResetNav() waypoints = nil wpIndex = 1 lastPathTime = 0 lastTargetPart = nil targetLockStart = 0 targetStartDist = math.huge stuckCount = 0 BypassVector = nil BypassUntil = 0 end table.insert(Hub.Connections, LocalPlayer.CharacterAdded:Connect(function() task.delay(0.4, LocateLiveControllers) table.clear(Hub.Blacklist) table.clear(Hub.FailCounts) table.clear(Hub.StuckZones) CachedLobbyBox = nil Hub.MoveGoal = nil Hub.LockedDog = nil Hub.WeEquippedGun = false ReleaseMinigunSpin() ResetNav() end)) while Hub.Running do if not Hub.AutoWalkEnabled then Hub.CurrentTarget = nil Hub.MoveGoal = nil Hub.StatusText = "auto walk off" ResetNav() task.wait(0.2) continue end if not IsInRound() then Hub.CurrentTarget = nil Hub.MoveGoal = nil Hub.StatusText = "in lobby (waiting for match)" ResetNav() task.wait(0.3) continue end local charData = GetCharacterData() if not charData or charData.Disabled then Hub.CurrentTarget = nil Hub.MoveGoal = nil Hub.StatusText = "waiting for character..." ResetNav() task.wait(0.2) continue end local myPos = charData.Root.Position local onGround = charData.Humanoid.FloorMaterial ~= Enum.Material.Air local threats = GetActiveThreats() local dogSpawns = GetDogSpawnPositions() local ragdollPads = GetRagdollPadPositions() local nearestDogDist = GetThreatMetrics(myPos, threats) local nearestSpawnDist, nearestSpawnPos = GetNearestDogSpawnDist(myPos, dogSpawns) if lastTargetPart and IsBonbonValid(lastTargetPart) and not Hub.Blacklist[lastTargetPart] then local curTargetPos = GetTrueBonbonPos(lastTargetPart) local curTargetDist = (curTargetPos - myPos).Magnitude if curTargetDist < targetStartDist - 2.5 then targetStartDist = curTargetDist targetLockStart = os.clock() elseif os.clock() - targetLockStart > 5.5 then Hub.Blacklist[lastTargetPart] = os.clock() + 7.0 ResetNav() end end local target = ChooseTargetBonbon(myPos, threats, dogSpawns) Hub.CurrentTarget = target if target ~= lastTargetPart then targetLockStart = os.clock() targetStartDist = target and (GetTrueBonbonPos(target) - myPos).Magnitude or math.huge end local targetPos = target and GetTrueBonbonPos(target) or nil local floorTargetPos = targetPos and GetFloorPos(targetPos) or nil local distToTarget = targetPos and (targetPos - myPos).Magnitude or math.huge if os.clock() - lastCheckTime >= 0.3 then local moved = (Vector3.new(myPos.X, 0, myPos.Z) - Vector3.new(lastCheckPos.X, 0, lastCheckPos.Z)).Magnitude lastCheckPos = myPos lastCheckTime = os.clock() if moved < 0.85 and onGround and Hub.MoveGoal ~= nil then stuckCount += 1 TriggerSmartJump(charData) if stuckCount >= 2 then local forwardLook = charData.Root.CFrame.LookVector local blockedSpot = myPos + Vector3.new(forwardLook.X, 0, forwardLook.Z) * 2.5 table.insert(Hub.StuckZones, { Pos = blockedSpot, Radius = 8.0, Expire = os.clock() + 10.0 }) BypassUntil = 0 Hub.MoveGoal = SteerAndClimbTowards(charData, myPos - Vector3.new(forwardLook.X, 0, forwardLook.Z) * 12, threats, true, dogSpawns, ragdollPads, targetPos) if stuckCount >= 4 and target then Hub.Blacklist[target] = os.clock() + 7.0 end waypoints = nil stuckCount = 0 task.wait(0.25) continue end elseif moved >= 0.85 then stuckCount = 0 end end local rushingNearbyCandy = (target ~= nil and CanRushBonbon(myPos, targetPos, threats)) if Hub.AvoidDogs and nearestDogDist <= Hub.DogEvadeRadius and not rushingNearbyCandy then local awayVec = Vector3.zero for _, t in ipairs(threats) do local dv = Vector3.new(myPos.X - t.Pos.X, 0, myPos.Z - t.Pos.Z) local d = math.max(dv.Magnitude, 0.5) if d < 28 then awayVec += dv.Unit * ((28 - d) / 28) end end local rawEvadeGoal = awayVec.Magnitude > 0.05 and (myPos + awayVec.Unit * 20) or (targetPos or (myPos + charData.Root.CFrame.LookVector * 16)) Hub.MoveGoal = SteerAndClimbTowards(charData, rawEvadeGoal, threats, true, dogSpawns, ragdollPads, targetPos) waypoints = nil Hub.StatusText = string.format("evading dog (%.1fm)", nearestDogDist) task.wait(0.06) continue end if not target then local totalLeft = #GetUncollectedBonbons() if totalLeft > 0 or (Hub.AvoidDogs and (nearestDogDist < 32 or nearestSpawnDist < Hub.DogSpawnAvoidRadius)) then local awayVec = Vector3.zero for _, t in ipairs(threats) do local dv = Vector3.new(myPos.X - t.Pos.X, 0, myPos.Z - t.Pos.Z) local d = math.max(dv.Magnitude, 1) if d < 45 then awayVec += (dv.Unit * (45 - d)) end end if nearestSpawnPos and nearestSpawnDist < Hub.DogSpawnAvoidRadius + 10 then local sv = Vector3.new(myPos.X - nearestSpawnPos.X, 0, myPos.Z - nearestSpawnPos.Z) if sv.Magnitude > 0.1 then awayVec += sv.Unit * 25 end end local roamGoal = awayVec.Magnitude > 0.1 and (myPos + awayVec.Unit * 18) or (myPos + charData.Root.CFrame.LookVector * 14) Hub.MoveGoal = SteerAndClimbTowards(charData, roamGoal, threats, true, dogSpawns, ragdollPads, nil) Hub.StatusText = totalLeft > 0 and string.format("avoiding dogs (%d left)", totalLeft) or "moving away from dog spawns" else Hub.MoveGoal = nil Hub.StatusText = "all bonbons collected (safe)" end task.wait(0.12) continue end if (targetPos.Y - myPos.Y) > 1.4 and Vector3.new(targetPos.X - myPos.X, 0, targetPos.Z - myPos.Z).Magnitude <= 9.5 then TriggerSmartJump(charData) end if distToTarget <= Hub.StopDistance then TriggerTouch(target, charData) Hub.MoveGoal = SteerAndClimbTowards(charData, targetPos, threats, false, dogSpawns, ragdollPads, targetPos) Hub.StatusText = string.format("collecting (%.1fm)", distToTarget) task.wait(0.06) continue end local needPath = (target ~= lastTargetPart) or (not waypoints) or (wpIndex > #waypoints) or (onGround and (os.clock() - lastPathTime >= 1.2)) if needPath and onGround and os.clock() >= BypassUntil then lastTargetPart = target lastPathTime = os.clock() local path = PathfindingService:CreatePath({ AgentRadius = 1.35, AgentHeight = 4.6, AgentCanJump = true, AgentCanClimb = true, WaypointSpacing = 3.0 }) local startFloor = GetFloorPos(myPos) local ok = pcall(function() path:ComputeAsync(startFloor, floorTargetPos) end) local rawWps = ok and path:GetWaypoints() or nil if rawWps and #rawWps >= 2 then Hub.FailCounts[target] = 0 waypoints = rawWps wpIndex = 2 while wpIndex < #waypoints do local wpPos = waypoints[wpIndex].Position local d3 = (Vector3.new(wpPos.X, myPos.Y, wpPos.Z) - myPos).Magnitude if d3 < 3.4 and math.abs(wpPos.Y - (myPos.Y - 2.5)) <= 4.0 then wpIndex += 1 else break end end else waypoints = nil local fails = (Hub.FailCounts[target] or 0) + 1 Hub.FailCounts[target] = fails if fails >= 3 and distToTarget > 24 then Hub.Blacklist[target] = os.clock() + 6.0 ResetNav() task.wait(0.05) continue end Hub.MoveGoal = SteerAndClimbTowards(charData, floorTargetPos, threats, false, dogSpawns, ragdollPads, targetPos) Hub.StatusText = string.format("direct -> %.1fm", distToTarget) task.wait(0.06) continue end end if waypoints and wpIndex <= #waypoints and os.clock() >= BypassUntil then while wpIndex < #waypoints do local wpPos = waypoints[wpIndex].Position local flatDist = (Vector3.new(wpPos.X, myPos.Y, wpPos.Z) - myPos).Magnitude local yDist = math.abs(wpPos.Y - (myPos.Y - 2.5)) if flatDist < 3.2 and yDist <= 4.5 then wpIndex += 1 else break end end local wp = waypoints[wpIndex] if wp.Action == Enum.PathWaypointAction.Jump or (wp.Position.Y - (myPos.Y - 2.95)) > 1.5 then TriggerSmartJump(charData) end Hub.MoveGoal = SteerAndClimbTowards(charData, wp.Position, threats, false, dogSpawns, ragdollPads, targetPos) Hub.StatusText = string.format("collecting -> %.1fm", distToTarget) else Hub.MoveGoal = SteerAndClimbTowards(charData, floorTargetPos, threats, false, dogSpawns, ragdollPads, targetPos) Hub.StatusText = string.format("direct -> %.1fm", distToTarget) end task.wait(0.06) end end) local function BindShopTracker() local shop = LocalPlayer:FindFirstChild("Shop") or LocalPlayer:WaitForChild("Shop", 10) if not shop then return end local lastBal = shop:GetAttribute("Bonbons") or 0 table.insert(Hub.Connections, shop:GetAttributeChangedSignal("Bonbons"):Connect(function() local cur = shop:GetAttribute("Bonbons") or 0 if cur > lastBal then Hub.CollectedCount += (cur - lastBal) end lastBal = cur end)) end task.spawn(BindShopTracker) local Main = Instance.new("Frame") Main.Size = UDim2.fromOffset(320, 260) Main.Position = UDim2.new(0.5, -160, 0.12, 0) Main.BackgroundColor3 = Color3.fromRGB(18, 18, 22) Main.BorderSizePixel = 0 Main.ClipsDescendants = true Main.Parent = ScreenGui local MainCorner = Instance.new("UICorner") MainCorner.CornerRadius = UDim.new(0, 7) MainCorner.Parent = Main local MainStroke = Instance.new("UIStroke") MainStroke.Color = Color3.fromRGB(55, 55, 68) MainStroke.Thickness = 1 MainStroke.Parent = Main local TopBar = Instance.new("Frame") TopBar.Size = UDim2.new(1, 0, 0, 30) TopBar.BackgroundColor3 = Color3.fromRGB(25, 25, 32) TopBar.BorderSizePixel = 0 TopBar.Parent = Main local Title = Instance.new("TextLabel") Title.Size = UDim2.new(1, -74, 1, 0) Title.Position = UDim2.fromOffset(10, 0) Title.BackgroundTransparency = 1 Title.Font = Enum.Font.GothamBold Title.TextSize = 12 Title.TextXAlignment = Enum.TextXAlignment.Left Title.TextColor3 = Color3.fromRGB(235, 235, 240) Title.Text = "dogs bonbons collector" Title.Parent = TopBar local MinBtn = Instance.new("TextButton") MinBtn.Size = UDim2.fromOffset(26, 20) MinBtn.Position = UDim2.new(1, -62, 0.5, -10) MinBtn.BackgroundColor3 = Color3.fromRGB(40, 40, 50) MinBtn.Font = Enum.Font.GothamBold MinBtn.TextSize = 12 MinBtn.TextColor3 = Color3.fromRGB(220, 220, 230) MinBtn.Text = "-" MinBtn.AutoButtonColor = false MinBtn.Parent = TopBar local MinCorner = Instance.new("UICorner") MinCorner.CornerRadius = UDim.new(0, 4) MinCorner.Parent = MinBtn local CloseBtn = Instance.new("TextButton") CloseBtn.Size = UDim2.fromOffset(26, 20) CloseBtn.Position = UDim2.new(1, -32, 0.5, -10) CloseBtn.BackgroundColor3 = Color3.fromRGB(90, 35, 38) CloseBtn.Font = Enum.Font.GothamBold CloseBtn.TextSize = 11 CloseBtn.TextColor3 = Color3.fromRGB(245, 220, 220) CloseBtn.Text = "X" CloseBtn.AutoButtonColor = false CloseBtn.Parent = TopBar local CloseCorner = Instance.new("UICorner") CloseCorner.CornerRadius = UDim.new(0, 4) CloseCorner.Parent = CloseBtn do local dragging, dragInput, dragStart, startPos table.insert(Hub.Connections, TopBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = Main.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end)) table.insert(Hub.Connections, TopBar.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end)) table.insert(Hub.Connections, UserInputService.InputChanged:Connect(function(input) if input == dragInput and dragging then local delta = input.Position - dragStart Main.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end end)) end local Body = Instance.new("Frame") Body.Size = UDim2.new(1, 0, 1, -30) Body.Position = UDim2.fromOffset(0, 30) Body.BackgroundTransparency = 1 Body.Parent = Main local TabBar = Instance.new("Frame") TabBar.Size = UDim2.new(1, -16, 0, 26) TabBar.Position = UDim2.fromOffset(8, 6) TabBar.BackgroundTransparency = 1 TabBar.Parent = Body local MainTabBtn = Instance.new("TextButton") MainTabBtn.Size = UDim2.new(0.32, 0, 1, 0) MainTabBtn.BackgroundColor3 = Color3.fromRGB(48, 82, 60) MainTabBtn.Font = Enum.Font.GothamBold MainTabBtn.TextSize = 11 MainTabBtn.TextColor3 = Color3.fromRGB(240, 240, 245) MainTabBtn.Text = "Collector" MainTabBtn.AutoButtonColor = false MainTabBtn.Parent = TabBar local MainTabCorner = Instance.new("UICorner") MainTabCorner.CornerRadius = UDim.new(0, 5) MainTabCorner.Parent = MainTabBtn local GunTabBtn = Instance.new("TextButton") GunTabBtn.Size = UDim2.new(0.32, 0, 1, 0) GunTabBtn.Position = UDim2.new(0.34, 0, 0, 0) GunTabBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 38) GunTabBtn.Font = Enum.Font.GothamBold GunTabBtn.TextSize = 11 GunTabBtn.TextColor3 = Color3.fromRGB(190, 190, 200) GunTabBtn.Text = "Guns" GunTabBtn.AutoButtonColor = false GunTabBtn.Parent = TabBar local GunTabCorner = Instance.new("UICorner") GunTabCorner.CornerRadius = UDim.new(0, 5) GunTabCorner.Parent = GunTabBtn local StamTabBtn = Instance.new("TextButton") StamTabBtn.Size = UDim2.new(0.32, 0, 1, 0) StamTabBtn.Position = UDim2.new(0.68, 0, 0, 0) StamTabBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 38) StamTabBtn.Font = Enum.Font.GothamBold StamTabBtn.TextSize = 11 StamTabBtn.TextColor3 = Color3.fromRGB(190, 190, 200) StamTabBtn.Text = "Stamina" StamTabBtn.AutoButtonColor = false StamTabBtn.Parent = TabBar local StamTabCorner = Instance.new("UICorner") StamTabCorner.CornerRadius = UDim.new(0, 5) StamTabCorner.Parent = StamTabBtn local StatusBox = Instance.new("Frame") StatusBox.Size = UDim2.new(1, -16, 0, 42) StatusBox.Position = UDim2.fromOffset(8, 36) StatusBox.BackgroundColor3 = Color3.fromRGB(24, 24, 30) StatusBox.BorderSizePixel = 0 StatusBox.Parent = Body local StatusBoxCorner = Instance.new("UICorner") StatusBoxCorner.CornerRadius = UDim.new(0, 5) StatusBoxCorner.Parent = StatusBox local StatusLabel = Instance.new("TextLabel") StatusLabel.Size = UDim2.new(1, -12, 1, -4) StatusLabel.Position = UDim2.fromOffset(6, 2) StatusLabel.BackgroundTransparency = 1 StatusLabel.Font = Enum.Font.Code StatusLabel.TextSize = 10 StatusLabel.TextXAlignment = Enum.TextXAlignment.Left StatusLabel.TextYAlignment = Enum.TextYAlignment.Center StatusLabel.TextWrapped = true StatusLabel.TextColor3 = Color3.fromRGB(215, 220, 230) StatusLabel.Text = "bonbons: 0 | waiting..." StatusLabel.Parent = StatusBox local MainPage = Instance.new("Frame") MainPage.Size = UDim2.new(1, -16, 1, -86) MainPage.Position = UDim2.fromOffset(8, 84) MainPage.BackgroundTransparency = 1 MainPage.Parent = Body local MainGrid = Instance.new("UIGridLayout") MainGrid.CellSize = UDim2.new(0.485, 0, 0, 34) MainGrid.CellPadding = UDim2.new(0.03, 0, 0, 6) MainGrid.SortOrder = Enum.SortOrder.LayoutOrder MainGrid.Parent = MainPage local GunPage = Instance.new("Frame") GunPage.Size = UDim2.new(1, -16, 1, -86) GunPage.Position = UDim2.fromOffset(8, 84) GunPage.BackgroundTransparency = 1 GunPage.Visible = false GunPage.Parent = Body local StamPage = Instance.new("Frame") StamPage.Size = UDim2.new(1, -16, 1, -86) StamPage.Position = UDim2.fromOffset(8, 84) StamPage.BackgroundTransparency = 1 StamPage.Visible = false StamPage.Parent = Body local function MakeToggle(parent, order, text, prop, pos, size) local btn = Instance.new("TextButton") btn.LayoutOrder = order if pos then btn.Position = pos end if size then btn.Size = size end btn.Font = Enum.Font.GothamBold btn.TextSize = 11 btn.TextColor3 = Color3.fromRGB(240, 240, 245) btn.AutoButtonColor = false btn.Parent = parent local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, 5) c.Parent = btn local function Refresh() local on = Hub[prop] btn.Text = text .. ": " .. (on and "ON" or "OFF") btn.BackgroundColor3 = on and Color3.fromRGB(45, 90, 58) or Color3.fromRGB(32, 32, 40) end table.insert(Hub.Connections, btn.Activated:Connect(function() Hub[prop] = not Hub[prop] Refresh() end)) Refresh() return btn end MakeToggle(MainPage, 1, "Auto Walk", "AutoWalkEnabled") MakeToggle(MainPage, 2, "Bonbon Aura", "AuraEnabled") MakeToggle(MainPage, 3, "Avoid Dogs", "AvoidDogs") MakeToggle(MainPage, 4, "Auto Shift Run", "AutoSprint") MakeToggle(MainPage, 5, "Bonbon ESP", "BonbonESP") MakeToggle(MainPage, 6, "Auto Struggle", "AutoSkillCheck") -- Guns Page Controls (Clean: Only Auto Aim & Auto Gun) MakeToggle(GunPage, 1, "Auto Aim", "AutoAimGuns", UDim2.fromOffset(0, 0), UDim2.new(0.485, 0, 0, 32)) MakeToggle(GunPage, 2, "Auto Gun", "AutoGun", UDim2.new(0.515, 0, 0, 0), UDim2.new(0.485, 0, 0, 32)) local HpTrigLbl = Instance.new("TextLabel") HpTrigLbl.Size = UDim2.new(0.62, 0, 0, 26) HpTrigLbl.Position = UDim2.fromOffset(0, 40) HpTrigLbl.BackgroundTransparency = 1 HpTrigLbl.Font = Enum.Font.GothamMedium HpTrigLbl.TextSize = 11 HpTrigLbl.TextXAlignment = Enum.TextXAlignment.Left HpTrigLbl.TextColor3 = Color3.fromRGB(210, 210, 220) HpTrigLbl.Text = "Auto Gun HP <= (%):" HpTrigLbl.Parent = GunPage local HpTrigBox = Instance.new("TextBox") HpTrigBox.Size = UDim2.new(0.35, 0, 0, 26) HpTrigBox.Position = UDim2.new(0.65, 0, 0, 40) HpTrigBox.BackgroundColor3 = Color3.fromRGB(28, 28, 36) HpTrigBox.Font = Enum.Font.GothamBold HpTrigBox.TextSize = 11 HpTrigBox.TextColor3 = Color3.fromRGB(245, 245, 250) HpTrigBox.Text = tostring(Hub.GunTriggerHP) HpTrigBox.ClearTextOnFocus = false HpTrigBox.Parent = GunPage local HpTrigCorner = Instance.new("UICorner") HpTrigCorner.CornerRadius = UDim.new(0, 5) HpTrigCorner.Parent = HpTrigBox local TimeTrigLbl = Instance.new("TextLabel") TimeTrigLbl.Size = UDim2.new(0.62, 0, 0, 26) TimeTrigLbl.Position = UDim2.fromOffset(0, 72) TimeTrigLbl.BackgroundTransparency = 1 TimeTrigLbl.Font = Enum.Font.GothamMedium TimeTrigLbl.TextSize = 11 TimeTrigLbl.TextXAlignment = Enum.TextXAlignment.Left TimeTrigLbl.TextColor3 = Color3.fromRGB(210, 210, 220) TimeTrigLbl.Text = "Auto Gun Timer <= (M:SS):" TimeTrigLbl.Parent = GunPage local TimeTrigBox = Instance.new("TextBox") TimeTrigBox.Size = UDim2.new(0.35, 0, 0, 26) TimeTrigBox.Position = UDim2.new(0.65, 0, 0, 72) TimeTrigBox.BackgroundColor3 = Color3.fromRGB(28, 28, 36) TimeTrigBox.Font = Enum.Font.GothamBold TimeTrigBox.TextSize = 11 TimeTrigBox.TextColor3 = Color3.fromRGB(245, 245, 250) TimeTrigBox.Text = "1:00" TimeTrigBox.ClearTextOnFocus = false TimeTrigBox.Parent = GunPage local TimeTrigCorner = Instance.new("UICorner") TimeTrigCorner.CornerRadius = UDim.new(0, 5) TimeTrigCorner.Parent = TimeTrigBox local GunInfoLbl = Instance.new("TextLabel") GunInfoLbl.Size = UDim2.new(1, 0, 0, 34) GunInfoLbl.Position = UDim2.fromOffset(0, 104) GunInfoLbl.BackgroundTransparency = 1 GunInfoLbl.Font = Enum.Font.GothamMedium GunInfoLbl.TextSize = 10 GunInfoLbl.TextWrapped = true GunInfoLbl.TextXAlignment = Enum.TextXAlignment.Left GunInfoLbl.TextYAlignment = Enum.TextYAlignment.Top GunInfoLbl.TextColor3 = Color3.fromRGB(165, 175, 190) GunInfoLbl.Text = "Supported: MP5K, DoubleBarrel, HuntingRifle, M249, HallowsLauncher, Minigun, AR2" GunInfoLbl.Parent = GunPage local function FormatSecondsToClock(sec) sec = math.max(0, math.floor(sec)) return string.format("%d:%02d", math.floor(sec / 60), sec % 60) end local function ParseTimeInput(str) str = tostring(str or ""):gsub("%s+", "") local m, s = str:match("^(%d+):(%d+)$") if m and s then return tonumber(m) * 60 + tonumber(s) end return tonumber(str) end table.insert(Hub.Connections, HpTrigBox.FocusLost:Connect(function() local n = tonumber(HpTrigBox.Text) if n then Hub.GunTriggerHP = math.clamp(math.floor(n), 0, 100) end HpTrigBox.Text = tostring(Hub.GunTriggerHP) end)) table.insert(Hub.Connections, TimeTrigBox.FocusLost:Connect(function() local sec = ParseTimeInput(TimeTrigBox.Text) if sec then Hub.GunTriggerTime = math.clamp(math.floor(sec), 0, 300) end TimeTrigBox.Text = FormatSecondsToClock(Hub.GunTriggerTime) end)) -- Stamina Page Controls local MinLbl = Instance.new("TextLabel") MinLbl.Size = UDim2.new(0.62, 0, 0, 26) MinLbl.Position = UDim2.fromOffset(0, 0) MinLbl.BackgroundTransparency = 1 MinLbl.Font = Enum.Font.GothamMedium MinLbl.TextSize = 11 MinLbl.TextXAlignment = Enum.TextXAlignment.Left MinLbl.TextColor3 = Color3.fromRGB(210, 210, 220) MinLbl.Text = "Stop Sprint Below:" MinLbl.Parent = StamPage local MinBox = Instance.new("TextBox") MinBox.Size = UDim2.new(0.35, 0, 0, 26) MinBox.Position = UDim2.new(0.65, 0, 0, 0) MinBox.BackgroundColor3 = Color3.fromRGB(28, 28, 36) MinBox.Font = Enum.Font.GothamBold MinBox.TextSize = 11 MinBox.TextColor3 = Color3.fromRGB(245, 245, 250) MinBox.Text = tostring(Hub.MinStamina) MinBox.ClearTextOnFocus = false MinBox.Parent = StamPage local MinBoxCorner = Instance.new("UICorner") MinBoxCorner.CornerRadius = UDim.new(0, 5) MinBoxCorner.Parent = MinBox local RegainLbl = Instance.new("TextLabel") RegainLbl.Size = UDim2.new(0.62, 0, 0, 26) RegainLbl.Position = UDim2.fromOffset(0, 32) RegainLbl.BackgroundTransparency = 1 RegainLbl.Font = Enum.Font.GothamMedium RegainLbl.TextSize = 11 RegainLbl.TextXAlignment = Enum.TextXAlignment.Left RegainLbl.TextColor3 = Color3.fromRGB(210, 210, 220) RegainLbl.Text = "Wait Regain To:" RegainLbl.Parent = StamPage local RegainBox = Instance.new("TextBox") RegainBox.Size = UDim2.new(0.35, 0, 0, 26) RegainBox.Position = UDim2.new(0.65, 0, 0, 32) RegainBox.BackgroundColor3 = Color3.fromRGB(28, 28, 36) RegainBox.Font = Enum.Font.GothamBold RegainBox.TextSize = 11 RegainBox.TextColor3 = Color3.fromRGB(245, 245, 250) RegainBox.Text = tostring(Hub.RegainStamina) RegainBox.ClearTextOnFocus = false RegainBox.Parent = StamPage local RegainBoxCorner = Instance.new("UICorner") RegainBoxCorner.CornerRadius = UDim.new(0, 5) RegainBoxCorner.Parent = RegainBox table.insert(Hub.Connections, MinBox.FocusLost:Connect(function() local n = tonumber(MinBox.Text) if n then Hub.MinStamina = math.clamp(math.floor(n), 11, 95) end MinBox.Text = tostring(Hub.MinStamina) end)) table.insert(Hub.Connections, RegainBox.FocusLost:Connect(function() local n = tonumber(RegainBox.Text) if n then Hub.RegainStamina = math.clamp(math.floor(n), math.max(Hub.MinStamina + 1, 15), 100) end RegainBox.Text = tostring(Hub.RegainStamina) end)) MakeToggle(StamPage, 1, "Inf Stamina", "InfStamina", UDim2.fromOffset(0, 64), UDim2.new(1, 0, 0, 30)) local WarnLabel = Instance.new("TextLabel") WarnLabel.Size = UDim2.new(1, 0, 0, 52) WarnLabel.Position = UDim2.fromOffset(0, 98) WarnLabel.BackgroundTransparency = 1 WarnLabel.Font = Enum.Font.GothamMedium WarnLabel.TextSize = 10 WarnLabel.TextWrapped = true WarnLabel.TextXAlignment = Enum.TextXAlignment.Left WarnLabel.TextYAlignment = Enum.TextYAlignment.Top WarnLabel.TextColor3 = Color3.fromRGB(235, 110, 110) WarnLabel.Text = "use it at ur own risk: if you get caught with inf stamina or game updates with inf stamina anticheat u will get perma banned" WarnLabel.Parent = StamPage local function SelectTab(tabName) MainPage.Visible = (tabName == "Main") GunPage.Visible = (tabName == "Gun") StamPage.Visible = (tabName == "Stam") MainTabBtn.BackgroundColor3 = (tabName == "Main") and Color3.fromRGB(48, 82, 60) or Color3.fromRGB(30, 30, 38) MainTabBtn.TextColor3 = (tabName == "Main") and Color3.fromRGB(240, 240, 245) or Color3.fromRGB(190, 190, 200) GunTabBtn.BackgroundColor3 = (tabName == "Gun") and Color3.fromRGB(48, 82, 60) or Color3.fromRGB(30, 30, 38) GunTabBtn.TextColor3 = (tabName == "Gun") and Color3.fromRGB(240, 240, 245) or Color3.fromRGB(190, 190, 200) StamTabBtn.BackgroundColor3 = (tabName == "Stam") and Color3.fromRGB(48, 82, 60) or Color3.fromRGB(30, 30, 38) StamTabBtn.TextColor3 = (tabName == "Stam") and Color3.fromRGB(240, 240, 245) or Color3.fromRGB(190, 190, 200) end table.insert(Hub.Connections, MainTabBtn.Activated:Connect(function() SelectTab("Main") end)) table.insert(Hub.Connections, GunTabBtn.Activated:Connect(function() SelectTab("Gun") end)) table.insert(Hub.Connections, StamTabBtn.Activated:Connect(function() SelectTab("Stam") end)) local minimized = false table.insert(Hub.Connections, MinBtn.Activated:Connect(function() minimized = not minimized MinBtn.Text = minimized and "+" or "-" Body.Visible = not minimized Main.Size = minimized and UDim2.fromOffset(220, 30) or UDim2.fromOffset(320, 260) end)) local UILoop = task.spawn(function() while Hub.Running do local mapRemaining = #GetUncollectedBonbons() local shopBal = GetShopBonbons() local stam = math.floor(GetLiveStamina() + 0.5) local sprintState = Hub.InfStamina and "inf" or (Hub.RestingStamina and "regen" or (Hub.WeSetSprint and "run" or "walk")) StatusLabel.Text = string.format( "bonbons: %d (+%d) | left: %d | stam: %d (%s)\n%s | %s", shopBal, Hub.CollectedCount, mapRemaining, stam, sprintState, Hub.StatusText, Hub.GunStatusText ) task.wait(0.2) end end) table.insert(Hub.Connections, UserInputService.InputBegan:Connect(function(input, gp) if not gp and input.KeyCode == Enum.KeyCode.RightControl then ScreenGui.Enabled = not ScreenGui.Enabled end end)) function Hub:Unload() Hub.Running = false Hub.AutoWalkEnabled = false Hub.AuraEnabled = false Hub.MoveGoal = nil ReleaseMinigunSpin() pcall(function() RunService:UnbindFromRenderStep(BIND_STEP_NAME) end) if ClientGunfire and OriginalScatter then ClientGunfire._scatter = OriginalScatter OriginalScatter = nil end if ClientGun and OriginalGunFire then ClientGun._fire = OriginalGunFire OriginalGunFire = nil end pcall(ApplySprintState, false) for _, conn in ipairs(Hub.Connections) do pcall(function() if conn and conn.Connected then conn:Disconnect() end end) end table.clear(Hub.Connections) pcall(task.cancel, WalkerThread) pcall(task.cancel, UILoop) table.clear(Hub.ESPMap) pcall(game.Destroy, ESPContainer) pcall(game.Destroy, ScreenGui) getgenv()._DogsBonbonCollector = nil end table.insert(Hub.Connections, CloseBtn.Activated:Connect(function() task.spawn(function() Hub:Unload() end) end))