local ReplicatedStorage = game:GetService("ReplicatedStorage") local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local Events = ReplicatedStorage:WaitForChild("Events", 10) local ShowUpgradeScreen = Events:WaitForChild("ShowUpgradeScreen", 10) local SelectUpgrade = Events:WaitForChild("SelectUpgrade", 10) local RerollUpgrade = Events:WaitForChild("RerollUpgrade", 10) local SkipUpgrade = Events:WaitForChild("SkipUpgrade", 10) local RequestLootCollection = Events:WaitForChild("RequestLootCollection", 10) local TriggerChestEvent = Events:WaitForChild("TriggerChestEvent", 10) local UpdateInventoryUI = Events:WaitForChild("UpdateInventoryUI", 10) local player = Players.LocalPlayer -- ================================ -- HIT REMOTES (always on) -- ================================ local hitRemotes = { { name = "Hammer", id = "RequestHammerHit" }, { name = "Thunder Hammer", id = "RequestThunderHammerHit" }, { name = "Shadow", id = "RequestShadowHit" }, { name = "Shadow Pulse", id = "RequestShadowPulse" }, { name = "Voice Shout", id = "RequestVoiceShoutHit" }, { name = "Doom Echo", id = "RequestDoomEchoHit" }, } for _, r in ipairs(hitRemotes) do local ok, remote = pcall(function() return Events:WaitForChild(r.id, 5) end) r.remote = ok and remote or nil end -- ================================ -- PRIORITY TIERS -- ================================ local allTiers = { { label = "Limit Break: Power", ids = { "InfinitePower" } }, { label = "Evolve", ids = { "ThunderHammer", "Supernova", "DoomEcho" } }, { label = "Priority Weapon", ids = { "Hammer", "ShadowOrbit", "VoiceAmplifier" } }, { label = "Build Item", ids = { "Shuriken", "SunAura", "CritChance", "XPMultiplier", "CursedSkull", "MaxHealth", "DamageMultiplier" } }, { label = "Limit Break: Speed", ids = { "InfiniteHaste" } }, } local function findInTier(upgrades, ids) local matches = {} for _, upgrade in ipairs(upgrades) do if type(upgrade) == "table" then for _, id in ipairs(ids) do if upgrade.ID == id then table.insert(matches, upgrade) end end end end table.sort(matches, function(a, b) return (a.Level or 0) < (b.Level or 0) end) return matches end local function getGold() local ok, val = pcall(function() return player.leaderstats.Gold.Value end) return ok and val or 0 end local function getRerollCost() local ok, label = pcall(function() return player.PlayerGui.UpgradeScreen.MainContainer.Footer.RollButton.TextLabel.Text end) if not ok then return math.huge end local numStr = label:match("%d+") return numStr and tonumber(numStr) or math.huge end -- ================================ -- GUI HELPERS -- ================================ local screenGui = Instance.new("ScreenGui") screenGui.Name = "MasterGUI" screenGui.ResetOnSpawn = false screenGui.Parent = player.PlayerGui local function makeCorner(parent, radius) local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, radius or 10) c.Parent = parent end local function makeFrame(parent, size, pos) local f = Instance.new("Frame") f.Size = size f.Position = pos f.BackgroundColor3 = Color3.fromRGB(20, 20, 20) f.BorderSizePixel = 0 f.Active = true f.Draggable = true f.Parent = parent makeCorner(f) return f end local function makeTitle(parent, text) local t = Instance.new("TextLabel") t.Size = UDim2.new(1, 0, 0, 38) t.BackgroundColor3 = Color3.fromRGB(10, 10, 10) t.BorderSizePixel = 0 t.Text = text t.TextColor3 = Color3.fromRGB(255, 200, 0) t.TextSize = 15 t.Font = Enum.Font.GothamBold t.Parent = parent makeCorner(t) return t end local function makeLabel(parent, text, size, pos, color, fontSize) local l = Instance.new("TextLabel") l.Size = size l.Position = pos l.BackgroundTransparency = 1 l.Text = text l.TextColor3 = color or Color3.fromRGB(180, 180, 180) l.TextSize = fontSize or 13 l.Font = Enum.Font.Gotham l.TextWrapped = true l.Parent = parent return l end local function makeButton(parent, text, size, pos) local b = Instance.new("TextButton") b.Size = size b.Position = pos b.BackgroundColor3 = Color3.fromRGB(50, 50, 50) b.BorderSizePixel = 0 b.Text = text b.TextColor3 = Color3.fromRGB(255, 255, 255) b.TextSize = 13 b.Font = Enum.Font.GothamBold b.Parent = parent makeCorner(b, 6) return b end local function setToggle(btn, on) btn.Text = on and "ON" or "OFF" btn.BackgroundColor3 = on and Color3.fromRGB(50, 180, 80) or Color3.fromRGB(50, 50, 50) end local function makeDivider(parent, yPos) local d = Instance.new("Frame") d.Size = UDim2.new(1, -20, 0, 1) d.Position = UDim2.new(0, 10, 0, yPos) d.BackgroundColor3 = Color3.fromRGB(50, 50, 50) d.BorderSizePixel = 0 d.Parent = parent end -- ================================ -- AUTO HIT WINDOW -- ================================ local hitFrame = makeFrame(screenGui, UDim2.new(0, 260, 0, 320), UDim2.new(0, 20, 0.5, -280)) makeTitle(hitFrame, "⚔️ Auto Hit (Always On)") makeLabel(hitFrame, "🟢 Running for all 6 weapons", UDim2.new(1,-20,0,20), UDim2.new(0,10,0,44), Color3.fromRGB(100,255,100), 12) local yOff = 70 for _, r in ipairs(hitRemotes) do local row = Instance.new("Frame") row.Size = UDim2.new(1,-20,0,30) row.Position = UDim2.new(0,10,0,yOff) row.BackgroundColor3 = Color3.fromRGB(30,30,30) row.BorderSizePixel = 0 row.Parent = hitFrame makeCorner(row, 6) makeLabel(row, "✅ "..r.name, UDim2.new(1,-10,1,0), UDim2.new(0,10,0,0), Color3.fromRGB(200,200,200), 13) yOff = yOff + 36 end -- ================================ -- LOOT ALL WINDOW -- ================================ local lootFrame = makeFrame(screenGui, UDim2.new(0, 260, 0, 140), UDim2.new(0, 20, 0.5, 60)) makeTitle(lootFrame, "💰 Loot All") local lootCountLabel = makeLabel(lootFrame, "Loot: 0", UDim2.new(1,0,0,22), UDim2.new(0,0,0,42), Color3.fromRGB(180,180,180), 13) local delayRowBg = Instance.new("Frame") delayRowBg.Size = UDim2.new(1,-20,0,28) delayRowBg.Position = UDim2.new(0,10,0,66) delayRowBg.BackgroundColor3 = Color3.fromRGB(30,30,30) delayRowBg.BorderSizePixel = 0 delayRowBg.Parent = lootFrame makeCorner(delayRowBg, 6) makeLabel(delayRowBg, "Delay (s):", UDim2.new(0,70,1,0), UDim2.new(0,8,0,0), Color3.fromRGB(180,180,180), 12) local delayBox = Instance.new("TextBox") delayBox.Size = UDim2.new(0,60,0,22) delayBox.Position = UDim2.new(0,80,0.5,-11) delayBox.BackgroundColor3 = Color3.fromRGB(40,40,40) delayBox.BorderSizePixel = 0 delayBox.Text = "0.08" delayBox.TextColor3 = Color3.fromRGB(255,255,255) delayBox.TextSize = 12 delayBox.Font = Enum.Font.Gotham delayBox.Parent = delayRowBg makeCorner(delayBox, 4) local delayApplyBtn = Instance.new("TextButton") delayApplyBtn.Size = UDim2.new(0,60,0,22) delayApplyBtn.Position = UDim2.new(0,148,0.5,-11) delayApplyBtn.BackgroundColor3 = Color3.fromRGB(50,130,200) delayApplyBtn.BorderSizePixel = 0 delayApplyBtn.Text = "Apply" delayApplyBtn.TextColor3 = Color3.fromRGB(255,255,255) delayApplyBtn.TextSize = 12 delayApplyBtn.Font = Enum.Font.GothamBold delayApplyBtn.Parent = delayRowBg makeCorner(delayApplyBtn, 4) local lootBtn = makeButton(lootFrame, "Enable", UDim2.new(0,220,0,30), UDim2.new(0.5,-110,0,102)) -- ================================ -- AUTO UPGRADE PICKER WINDOW -- ================================ local pickerFrame = makeFrame(screenGui, UDim2.new(0, 280, 0, 210), UDim2.new(0, 300, 0.5, -280)) makeTitle(pickerFrame, "🎯 Auto Upgrade Picker") local pickerStatusLabel = makeLabel(pickerFrame, "Status: OFF", UDim2.new(1,-20,0,22), UDim2.new(0,10,0,44), Color3.fromRGB(180,180,180), 14) makeDivider(pickerFrame, 70) local pickerTierLabel = makeLabel(pickerFrame, "Tier: —", UDim2.new(1,-20,0,22), UDim2.new(0,10,0,76), Color3.fromRGB(255,200,0), 14) local pickerActionLabel = makeLabel(pickerFrame, "Action: Waiting...", UDim2.new(1,-20,0,22), UDim2.new(0,10,0,100), Color3.fromRGB(180,180,180), 13) local pickerLastLabel = makeLabel(pickerFrame, "Last picked: None", UDim2.new(1,-20,0,22), UDim2.new(0,10,0,124), Color3.fromRGB(120,120,120), 13) makeDivider(pickerFrame, 150) local pickerGoldLabel = makeLabel(pickerFrame, "Gold: 0 | Reroll: ?", UDim2.new(1,-20,0,20), UDim2.new(0,10,0,156), Color3.fromRGB(255,180,0), 12) local pickerBtn = makeButton(pickerFrame, "Enable", UDim2.new(0,240,0,32), UDim2.new(0.5,-120,0,174)) -- ================================ -- CHEST OPENER WINDOW -- ================================ local chestFrame = makeFrame(screenGui, UDim2.new(0, 260, 0, 160), UDim2.new(0, 300, 0.5, -50)) makeTitle(chestFrame, "📦 Auto Chest Opener") local chestStatusLabel = makeLabel(chestFrame, "Status: Waiting... (0W/0P)", UDim2.new(1,-20,0,22), UDim2.new(0,10,0,44), Color3.fromRGB(180,180,180), 13) local chestLastLabel = makeLabel(chestFrame, "Last: None", UDim2.new(1,-20,0,20), UDim2.new(0,10,0,68), Color3.fromRGB(120,120,120), 13) local chestCountLabel = makeLabel(chestFrame, "Chests found: 0", UDim2.new(1,-20,0,20), UDim2.new(0,10,0,90), Color3.fromRGB(180,180,180), 12) local chestInventLabel = makeLabel(chestFrame, "Inventory: 0W / 0P", UDim2.new(1,-20,0,20), UDim2.new(0,10,0,112), Color3.fromRGB(255,180,0), 12) local chestBtn = makeButton(chestFrame, "Enable", UDim2.new(0,220,0,30), UDim2.new(0.5,-110,0,124)) -- ================================ -- TITAN DODGE WINDOW -- ================================ local titanFrame = makeFrame(screenGui, UDim2.new(0, 260, 0, 130), UDim2.new(0, 300, 0.5, 130)) makeTitle(titanFrame, "🧟 Titan Zombie Dodge") local titanStatusLabel = makeLabel(titanFrame, "Status: OFF | G to toggle", UDim2.new(1,-20,0,22), UDim2.new(0,10,0,44), Color3.fromRGB(180,180,180), 13) local titanLastLabel = makeLabel(titanFrame, "Last: Idle", UDim2.new(1,-20,0,20), UDim2.new(0,10,0,68), Color3.fromRGB(120,120,120), 13) local titanBtn = makeButton(titanFrame, "Enable", UDim2.new(0,220,0,30), UDim2.new(0.5,-110,0,94)) -- ================================ -- STATE -- ================================ local lootEnabled = false local lootDelay = 0.12 local titanEnabled = false local chestEnabled = false local isMaxed = false local chestsUnlocked = false local currentWeapons = 0 local currentPassives = 0 local SAFE_DISTANCE = 55 -- ================================ -- INVENTORY LISTENER -- ================================ UpdateInventoryUI.OnClientEvent:Connect(function(data) if type(data) ~= "table" then return end currentWeapons = type(data.Weapons) == "table" and #data.Weapons or 0 currentPassives = type(data.Passives) == "table" and #data.Passives or 0 chestInventLabel.Text = string.format("Inventory: %dW / %dP", currentWeapons, currentPassives) if currentWeapons >= 5 and currentPassives >= 5 then chestsUnlocked = true if not isMaxed and not chestEnabled then chestEnabled = true setToggle(chestBtn, true) chestStatusLabel.Text = "Status: ON (Auto started! ✅)" chestStatusLabel.TextColor3 = Color3.fromRGB(100, 255, 100) print("[Chest] All 10 slots filled! Auto starting chest opener.") end else chestsUnlocked = false if not chestEnabled and not isMaxed then chestStatusLabel.Text = string.format("Waiting... (%dW/%dP — need 5W/5P)", currentWeapons, currentPassives) chestStatusLabel.TextColor3 = Color3.fromRGB(180, 180, 180) end end end) -- ================================ -- CHEST LOOP -- ================================ task.spawn(function() while true do if chestEnabled and chestsUnlocked and not isMaxed then local char = player.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if hrp then local chestPrompts = {} for _, v in ipairs(workspace:GetDescendants()) do if v:IsA("ProximityPrompt") then local parent = v.Parent local ancestor = parent and parent.Parent local name = (ancestor and ancestor.Name or "") .. (parent and parent.Name or "") if name:lower():find("chest") then table.insert(chestPrompts, { prox = v, part = parent }) end end end chestCountLabel.Text = "Chests found: " .. #chestPrompts for _, entry in ipairs(chestPrompts) do if not chestEnabled or isMaxed then break end hrp.CFrame = entry.part.CFrame + Vector3.new(0, 0, 3) task.wait(0.2) for i = 1, 3 do pcall(function() fireproximityprompt(entry.prox) end) task.wait(0.3) end chestLastLabel.Text = "Last: " .. entry.part.Name chestLastLabel.TextColor3 = Color3.fromRGB(100, 220, 100) print("[Chest] Opened:", entry.part:GetFullName()) task.wait(0.5) end end end task.wait(0.5) end end) -- ================================ -- TITAN DODGE HELPERS -- ================================ local function getTitanZombies() local titans = {} local enemiesFolder = workspace:FindFirstChild("Enemies") if enemiesFolder then for _, enemy in ipairs(enemiesFolder:GetChildren()) do if enemy:IsA("Model") and enemy.Name:lower():find("titan") then local hrp = enemy:FindFirstChild("HumanoidRootPart") if hrp then table.insert(titans, hrp) end end end end return titans end -- ================================ -- HELPER: find enemies folder (handles renames) -- ================================ local function getEnemiesFolder() return workspace:FindFirstChild("Enemies") or workspace:FindFirstChild("EnemiesFolder") or workspace:FindFirstChild("Mobs") or workspace:FindFirstChild("NPCs") end -- ================================ -- MAIN LOOP (Fast) -- ================================ task.spawn(function() while true do local char = player.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") -- Collect EnemyID numbers from ClientEnemies local enemyIDs = {} local enemiesFolder = workspace:FindFirstChild("ClientEnemies") if enemiesFolder then for _, enemy in ipairs(enemiesFolder:GetChildren()) do if enemy:IsA("Model") then local id = enemy:GetAttribute("EnemyID") if id then table.insert(enemyIDs, id) end end end end if #enemyIDs > 0 then for _, r in ipairs(hitRemotes) do if r.remote then pcall(function() r.remote:FireServer(enemyIDs) end) end end end -- Titan Dodge if titanEnabled and hrp then local titans = {} local ef = workspace:FindFirstChild("ClientEnemies") if ef then for _, enemy in ipairs(ef:GetChildren()) do if enemy:IsA("Model") and enemy.Name:lower():find("titan") then local h = enemy:FindFirstChild("HumanoidRootPart") if h then table.insert(titans, h) end end end end if #titans > 0 then local shouldDodge = false local closestDist = math.huge for _, titanHRP in ipairs(titans) do local dist = (hrp.Position - titanHRP.Position).Magnitude if dist < SAFE_DISTANCE then shouldDodge = true end if dist < closestDist then closestDist = dist end end if shouldDodge then local avgPos = Vector3.new(0, 0, 0) for _, titanHRP in ipairs(titans) do avgPos = avgPos + titanHRP.Position end avgPos = avgPos / #titans local awayDir = (hrp.Position - avgPos).Unit hrp.CFrame = CFrame.new(hrp.Position + awayDir * (SAFE_DISTANCE * 1.8)) titanLastLabel.Text = "🚨 DODGED! (" .. math.floor(closestDist) .. " studs)" titanLastLabel.TextColor3 = Color3.fromRGB(255, 80, 80) else titanLastLabel.Text = "Safe (" .. math.floor(closestDist) .. " studs)" titanLastLabel.TextColor3 = Color3.fromRGB(80, 255, 120) end else titanLastLabel.Text = "No Titans Nearby" titanLastLabel.TextColor3 = Color3.fromRGB(120, 120, 120) end end task.wait(0.05) end end) -- ================================ -- LOOT LOOP (separate, with delay) -- ================================ task.spawn(function() while true do if lootEnabled then local char = player.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if hrp then local lootFolder = workspace:FindFirstChild("Loot") if lootFolder then local items = lootFolder:GetChildren() lootCountLabel.Text = "Loot: " .. #items for _, loot in ipairs(items) do if loot:IsA("BasePart") then loot.CFrame = hrp.CFrame elseif loot:IsA("Model") then local root = loot.PrimaryPart or loot:FindFirstChildWhichIsA("BasePart") if root then loot:SetPrimaryPartCFrame(hrp.CFrame) end end pcall(function() RequestLootCollection:FireServer(loot) end) end end end else local lootFolder = workspace:FindFirstChild("Loot") lootCountLabel.Text = "Loot: " .. (lootFolder and #lootFolder:GetChildren() or 0) end task.wait(lootDelay > 0 and lootDelay or 0.1) end end) -- ================================ -- AUTO UPGRADE PICKER -- ================================ local pickerEnabled = false local pickerConnection = nil local function onUpgradeScreen(upgrades) if type(upgrades) ~= "table" then return end local gold = getGold() local cost = getRerollCost() pickerGoldLabel.Text = "Gold: " .. gold .. " | Reroll: " .. (cost == math.huge and "?" or cost .. "G") for _, tier in ipairs(allTiers) do local matches = findInTier(upgrades, tier.ids) if #matches > 0 then local pick = matches[1] SelectUpgrade:FireServer(pick.ID) pickerTierLabel.Text = "Tier: " .. tier.label pickerActionLabel.Text = "Action: Selected ✅" pickerActionLabel.TextColor3 = Color3.fromRGB(100, 255, 100) pickerLastLabel.Text = "Last: " .. pick.ID .. " (Lv " .. (pick.Level or 1) .. ")" pickerLastLabel.TextColor3 = Color3.fromRGB(100, 220, 100) if pick.ID == "InfinitePower" or pick.ID == "InfiniteHaste" then isMaxed = true chestEnabled = false setToggle(chestBtn, false) chestStatusLabel.Text = "Status: MAXED ✅ - Done!" chestStatusLabel.TextColor3 = Color3.fromRGB(255, 200, 0) print("[AutoPicker] Maxed! Chest opener stopped.") end return end end if cost ~= math.huge and gold >= cost then RerollUpgrade:FireServer() pickerActionLabel.Text = "Action: Rerolled 🔄" pickerActionLabel.TextColor3 = Color3.fromRGB(255, 200, 0) pickerLastLabel.Text = "Last: Rerolled (" .. cost .. "G)" else SkipUpgrade:FireServer() pickerActionLabel.Text = "Action: Skipped ⏭️" pickerActionLabel.TextColor3 = Color3.fromRGB(180, 80, 80) pickerLastLabel.Text = "Last: Skipped (no gold)" end end pickerBtn.MouseButton1Click:Connect(function() pickerEnabled = not pickerEnabled setToggle(pickerBtn, pickerEnabled) pickerStatusLabel.Text = pickerEnabled and "Status: ON" or "Status: OFF" pickerStatusLabel.TextColor3 = pickerEnabled and Color3.fromRGB(100,255,100) or Color3.fromRGB(180,180,180) if pickerEnabled then pickerConnection = ShowUpgradeScreen.OnClientEvent:Connect(onUpgradeScreen) else if pickerConnection then pickerConnection:Disconnect() pickerConnection = nil end end end) -- ================================ -- TOGGLES -- ================================ lootBtn.MouseButton1Click:Connect(function() lootEnabled = not lootEnabled setToggle(lootBtn, lootEnabled) end) chestBtn.MouseButton1Click:Connect(function() if isMaxed then chestStatusLabel.Text = "Status: MAXED ✅ - Done!" chestStatusLabel.TextColor3 = Color3.fromRGB(255, 200, 0) return end if not chestsUnlocked then chestStatusLabel.Text = string.format("Not ready! (%dW/%dP — need 5W/5P)", currentWeapons, currentPassives) chestStatusLabel.TextColor3 = Color3.fromRGB(255, 80, 80) return end chestEnabled = not chestEnabled setToggle(chestBtn, chestEnabled) chestStatusLabel.Text = chestEnabled and "Status: ON" or "Status: OFF (Ready! ✅)" chestStatusLabel.TextColor3 = chestEnabled and Color3.fromRGB(100,255,100) or Color3.fromRGB(255,200,0) end) local function toggleTitan() titanEnabled = not titanEnabled setToggle(titanBtn, titanEnabled) titanStatusLabel.Text = titanEnabled and "Status: ON | G to toggle" or "Status: OFF | G to toggle" titanStatusLabel.TextColor3 = titanEnabled and Color3.fromRGB(100,255,100) or Color3.fromRGB(180,180,180) if not titanEnabled then titanLastLabel.Text = "Last: Idle" titanLastLabel.TextColor3 = Color3.fromRGB(120,120,120) end end titanBtn.MouseButton1Click:Connect(toggleTitan) UserInputService.InputBegan:Connect(function(input, gp) if gp then return end if input.KeyCode == Enum.KeyCode.G then toggleTitan() end end) delayApplyBtn.MouseButton1Click:Connect(function() local num = tonumber(delayBox.Text) if num and num >= 0 then lootDelay = num delayBox.Text = tostring(num) print("[Loot] Delay set to " .. num .. " seconds") else delayBox.Text = tostring(lootDelay) print("[Loot] Invalid delay! Reset to " .. lootDelay) end end) print("[Master GUI] Loaded! Auto Hit fix applied (dual-format firing).")