local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local UserInputService = game:GetService("UserInputService") local VirtualUser = game:GetService("VirtualUser") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui", 15) -- Clean up any previous instance if _G.LootToForgeCleanup then pcall(_G.LootToForgeCleanup) end -- ==================================================================== -- 📦 GAME MODULES & REMOTES -- ==================================================================== local CommunicationUtils = require(ReplicatedStorage:WaitForChild("Utils"):WaitForChild("CommunicationUtils")) local TranslateUtils = require(ReplicatedStorage:WaitForChild("Utils"):WaitForChild("TranslateUtils")) local TrainCTRL = require(ReplicatedStorage:WaitForChild("CTRL"):WaitForChild("TrainCTRL")) local HPCTRL = require(ReplicatedStorage:WaitForChild("CTRL"):WaitForChild("HPCTRL")) local BackpackData = require(ReplicatedStorage:WaitForChild("LocalData"):WaitForChild("BackpackData")) local StageUtils = require(LocalPlayer.PlayerScripts.Manager.StageManager.StageUtils) local CameraUtils = require(ReplicatedStorage:WaitForChild("Utils"):WaitForChild("CameraUtils")) local DamageUtils = require(ReplicatedStorage.SkillSystemNew.Utils.DamageUtils) local CalculateUtils = require(ReplicatedStorage:WaitForChild("Utils"):WaitForChild("CalculateUtils")) local WeaponConfig = nil local OreConfig = nil local WeaponHelper = nil local ArmorConfig = nil local ArmorHelper = nil local DungeonData = nil local DungeonFightGUI = nil pcall(function() WeaponConfig = require(ReplicatedStorage.Config.Weapon.Config) end) pcall(function() OreConfig = require(ReplicatedStorage.Config.Ore.Config) end) pcall(function() WeaponHelper = require(ReplicatedStorage.Config.Weapon.Helper) end) pcall(function() ArmorConfig = require(ReplicatedStorage.Config.Armor.Config) end) pcall(function() ArmorHelper = require(ReplicatedStorage.Config.Armor.Helper) end) pcall(function() DungeonData = require(ReplicatedStorage.LocalData.DungeonData) end) pcall(function() DungeonFightGUI = require(ReplicatedStorage.GuiUtils.DungeonFightGUI) end) local LeftInfoGUI = nil local Message = nil pcall(function() LeftInfoGUI = require(ReplicatedStorage.GuiUtils.LeftInfoGUI) end) pcall(function() Message = require(ReplicatedStorage.GuiUtils.Message) end) -- Forward declaration of Config & getStageEnemies for hooks local Config = { HitAllMobs = true, OneHitKill = true, GodMode = true, FastPacketAllStages = false, FastPacketTower = false, TowerStartRound = 1, AutoForgeBestWeapon = false, AutoEquipBestWeapon = true, AutoRestockOres = false, ForgeTargetMode = "CYCLE", -- "CYCLE", "WEAPON", "ARMOR" ForgeInterval = 1.5, OnlyHighestOres = true, MinOreRarity = 8, -- 8: Secret+ (Ore 32-48), 7: Eternal+ (Ore 26-48) AutoSellJunkOres = false, } local getStageEnemies = nil -- Hook CalculateUtils.CCPlrDamage for massive 1-hit kill on all normal swings & skills if not _G.OriginalCCPlrDamage and CalculateUtils then _G.OriginalCCPlrDamage = CalculateUtils.CCPlrDamage CalculateUtils.CCPlrDamage = function(attacker, skillData) if Config.OneHitKill then return 1e35 end return _G.OriginalCCPlrDamage(attacker, skillData) end end -- Hook DamageOnce for absolute player immunity + enemy lethal 1-hit kill if not _G.OriginalDamageOnce then _G.OriginalDamageOnce = HPCTRL.DamageOnce end HPCTRL.DamageOnce = function(target, amount) if target == LocalPlayer.Character then if Config.GodMode then return false end return _G.OriginalDamageOnce(target, amount) else if Config.OneHitKill then local cur = HPCTRL.GetCurrentHP(target) or 0 local max = HPCTRL.GetMaxHP(target) or 0 amount = math.max(cur * 2, max * 2, 1e35) end return _G.OriginalDamageOnce(target, amount) end end -- Hook TryFireDamageEvent for full-room AoE + amplified damage (Filtered strictly to LocalPlayer) if not _G.OriginalTryFireDamageEvent and DamageUtils and DamageUtils.TryFireDamageEvent then _G.OriginalTryFireDamageEvent = DamageUtils.TryFireDamageEvent DamageUtils.TryFireDamageEvent = function(attacker, hitList, damageInfo) local isSelf = (attacker == LocalPlayer or attacker == LocalPlayer.Character) if isSelf then if Config.HitAllMobs then local stageMobs = getStageEnemies and getStageEnemies() or {} if #stageMobs > 0 then hitList = hitList or {} local seen = {} for _, item in ipairs(hitList) do if item.UUID then seen[item.UUID] = true end end for _, entry in ipairs(stageMobs) do if not seen[entry.uuid] then table.insert(hitList, { Type = "Enemy", UUID = entry.uuid, Model = entry.model }) end end end end if Config.OneHitKill and damageInfo then damageInfo.Damage = 1e35 end end return _G.OriginalTryFireDamageEvent(attacker, hitList, damageInfo) end end -- Disable screen shake completely if not _G.OriginalCameraShake then _G.OriginalCameraShake = { PosShakeOnce = CameraUtils.PosShakeOnce, DirShakeOnce = CameraUtils.DirShakeOnce, NonShakeOnce = CameraUtils.NonShakeOnce, MoveShake = CameraUtils.MoveShake } end CameraUtils.PosShakeOnce = function(...) end CameraUtils.DirShakeOnce = function(...) end CameraUtils.NonShakeOnce = function(...) end CameraUtils.MoveShake = function(...) end local Remotes = { TrainOnce = CommunicationUtils.TryGetRemoteEvent("Train", "TrainOnceRE"), IntoAutoTrain = CommunicationUtils.TryGetRemoteEvent("Train", "IntoAutoTrainRE"), ExitAutoTrain = CommunicationUtils.TryGetRemoteEvent("Train", "ExitAutoTrainRE"), ClaimedAllOre = CommunicationUtils.TryGetRemoteEvent("Stage", "ClaimedAllOreRE"), GetOre = CommunicationUtils.TryGetRemoteFunction("Stage", "GetOreRF"), StageFinished = CommunicationUtils.TryGetRemoteFunction("Stage", "StageFinishedRF"), TryRebirth = CommunicationUtils.TryGetRemoteEvent("Rebirth", "TryRebirthRE"), TrySellAll = CommunicationUtils.TryGetRemoteEvent("Backpack", "TrySellAllRE"), ClaimOnline = CommunicationUtils.TryGetRemoteEvent("Online", "TryClaimRE"), ClaimOffline = CommunicationUtils.TryGetRemoteEvent("Offline", "TryClaimOfflineRewardRE"), ClaimDailyDunTicket = CommunicationUtils.TryGetRemoteEvent("Dungeon", "TryClaimDailyDunTicRE"), TryIntoDungeonRF = CommunicationUtils.TryGetRemoteFunction("Dungeon", "TryIntoDungeonRF"), StartRoundRE = CommunicationUtils.TryGetRemoteEvent("Dungeon", "StartRoundRE"), CompleteRoundRF = CommunicationUtils.TryGetRemoteFunction("Dungeon", "CompleteRoundRF"), ExitDungeonRE = CommunicationUtils.TryGetRemoteEvent("Dungeon", "ExitDungeonRE"), ExitDungeonBE = CommunicationUtils.TryGetBindableEvent("Stage", "ExitDungeonBE"), ClaimIndexExp = CommunicationUtils.TryGetRemoteFunction("Index", "TryClaimIndexExpRF"), TryClaimLevelRewardRF = CommunicationUtils.TryGetRemoteFunction("Index", "TryClaimLevelRewardRF"), KillSuperLootRE = CommunicationUtils.TryGetRemoteEvent("SuperLoot", "KillSuperLootRE"), EnemyHitBE = CommunicationUtils.TryGetBindableEvent("Attack", "EnemyHitBE"), UpgradeOnceRE = CommunicationUtils.TryGetRemoteEvent("Upgrade", "UpgradeOnceRE"), TryUsePotionRE = CommunicationUtils.TryGetRemoteEvent("Potion", "TryUsePotionRE"), ForgeRF = CommunicationUtils.TryGetRemoteFunction("Forge", "ForgeRF"), TryEquipItemRE = CommunicationUtils.TryGetRemoteEvent("Backpack", "TryEquipItemRE"), TryUnEquipItemRE = CommunicationUtils.TryGetRemoteEvent("Backpack", "TryUnEquipItemRE"), TrySellItemRE = CommunicationUtils.TryGetRemoteEvent("Backpack", "TrySellItemRE"), ATKOnceBE = CommunicationUtils.TryGetBindableEvent("Attack", "ATKOnceBE"), UseSkillByIndexBE = CommunicationUtils.TryGetBindableEvent("Skill", "UseSkillByIndexBE"), ExitFightBE = CommunicationUtils.TryGetBindableEvent("Stage", "ExitFightBE"), } -- Suppress "Pack is full" notifications & keep carried pack automatically flushed if not _G.OriginalShowMessage and Message and Message.showMessage then _G.OriginalShowMessage = Message.showMessage Message.showMessage = function(text, ...) if text and (tostring(text):find("Pack is full") or tostring(text):find("full")) then if Remotes.ClaimedAllOre then pcall(function() Remotes.ClaimedAllOre:FireServer() end) end if LeftInfoGUI and LeftInfoGUI.UpdateOrePack then pcall(function() LeftInfoGUI.UpdateOrePack(0) end) end return end return _G.OriginalShowMessage(text, ...) end end if LeftInfoGUI and LeftInfoGUI.GetOrePack then LeftInfoGUI.GetOrePack = function() return 0 end end -- ==================================================================== -- ⚙️ CONFIGURATION & RUNTIME -- ==================================================================== Config.SelectedStage = 1 Config.AutoStageLoop = false Config.SuperLootSniper = true Config.OreMagnet = true Config.SpeedBoost = true Config.TargetWalkSpeed = 50 Config.AutoPotion = false Config.AutoUpgradeStats = true Config.AutoAttackMobs = false Config.GodMode = true Config.HitAllMobs = true Config.OneHitKill = true -- Farming & Loot Config.AutoClaimOres = true Config.OnlyHighestOres = true Config.MinOreRarity = 8 Config.AutoSellJunkOres = false Config.AutoSellBag = false Config.AutoClaimRewards = true -- Training & Growth (ALL COMBAT/TRAIN OFF BY DEFAULT!) Config.AutoTrain = false Config.AutoRebirth = false Config.AntiAFK = true -- Auto Forge Best Weapon System Config.AutoForgeBestWeapon = false Config.AutoEquipBestWeapon = true Config.AutoSellJunkGear = true Config.AutoRestockOres = false Config.ForgeTargetMode = "CYCLE" -- "CYCLE", "WEAPON", "ARMOR" Config.ForgeInterval = 1.5 Config.SpeedMode = "HYPER" -- HYPER (0.12s), TURBO (0.15s), FAST (0.2s), NORMAL (0.35s) Config.TrainDelay = 0.12 -- Auto-detect currently unlocked stage if available local currentStageAttr = LocalPlayer:GetAttribute("StageID") if currentStageAttr then local num = tonumber(string.match(tostring(currentStageAttr), "%d+")) if num and num >= 1 and num <= 22 then Config.SelectedStage = num end end local Runtime = { Running = true, ActiveTab = "Combat", TotalTrained = 0, TotalOresClaimed = 0, TotalMobsKilled = 0, TotalWeaponsForged = 0, TotalTowerRounds = 0, TotalTowerRuns = 0, ForgeHistory = {}, StartPower = 0, Logs = {}, Connections = {}, Threads = {} } local function addLog(msg) table.insert(Runtime.Logs, 1, string.format("[%s] %s", os.date("%X"), msg)) if #Runtime.Logs > 30 then table.remove(Runtime.Logs) end end -- Number Formatting local Suffixes = { {1e+33, "Dc"}, {1e+30, "No"}, {1e+27, "Oc"}, {1e+24, "Sp"}, {1e+21, "Sx"}, {1e+18, "Qi"}, {1e+15, "Qa"}, {1e+12, "T"}, {1e+9, "B"}, {1e+6, "M"}, {1e+3, "K"} } local function formatNumber(n) local num = tonumber(n) if not num then return tostring(n or "0") end for _, item in ipairs(Suffixes) do if num >= item[1] then return string.format("%.2f%s", num / item[1], item[2]) end end return tostring(math.floor(num)) end local function getEcoStat(statName) local eco = LocalPlayer:FindFirstChild("Eco") if eco then local val = eco:FindFirstChild(statName) if val then return val.Value end end return 0 end Runtime.StartPower = getEcoStat("power") -- ==================================================================== -- 🛡️ GOD MODE DAMAGE INTERCEPTOR -- ==================================================================== HPCTRL.DamageOnce = function(target, amount, ...) if Config.GodMode and target == LocalPlayer then return false end return _G.OriginalDamageOnce(target, amount, ...) end -- ==================================================================== -- 💎 ORE RARITY FILTERS -- ==================================================================== local function getOreRarity(oreNameOrId) if not oreNameOrId then return 1 end local id = tostring(oreNameOrId) local matched = id:match("Ore_%d+") if matched then id = matched end local cfg = OreConfig and OreConfig[id] if cfg and cfg.Rarity then return cfg.Rarity end local num = tonumber(id:match("%d+")) if num then if num >= 48 then return 10 elseif num >= 40 then return 9 elseif num >= 32 then return 8 elseif num >= 26 then return 7 elseif num >= 20 then return 6 elseif num >= 15 then return 5 elseif num >= 10 then return 4 elseif num >= 6 then return 3 elseif num >= 3 then return 2 else return 1 end end return 1 end local function isOreHighTier(oreNameOrId) if not Config.OnlyHighestOres then return true end local r = getOreRarity(oreNameOrId) return r >= (Config.MinOreRarity or 8) end -- ==================================================================== -- 🕹️ CORE EXECUTION ACTIONS -- ==================================================================== local ToggleSetters = {} local Actions = {} _G.LootToForgeActions = Actions _G.LootToForgeConfig = Config function Actions.StopTrain() pcall(function() if TrainCTRL.ExitAutoTrain then TrainCTRL.ExitAutoTrain() end if TrainCTRL.EndTrain then TrainCTRL.EndTrain() end local char = LocalPlayer.Character local humanoid = char and char:FindFirstChildOfClass("Humanoid") if humanoid then for _, t in ipairs(humanoid:GetPlayingAnimationTracks()) do local name = (t.Name or ""):lower() if string.find(name, "train") then t:Stop() end end end end) addLog("Stopped Auto Train.") end function Actions.StopStage() Config.AutoStageLoop = false Config.AutoAttackMobs = false if ToggleSetters["AutoStageLoop"] then ToggleSetters["AutoStageLoop"](false, true) end if ToggleSetters["AutoAttackMobs"] then ToggleSetters["AutoAttackMobs"](false, true) end pcall(function() if Remotes.ExitFightBE then Remotes.ExitFightBE:Fire(true) end if TranslateUtils and TranslateUtils.ToSpawn and LocalPlayer.Character then TranslateUtils.ToSpawn(LocalPlayer.Character) end LocalPlayer:SetAttribute("IntoFight", nil) end) pcall(function() local char = LocalPlayer.Character local humanoid = char and char:FindFirstChildOfClass("Humanoid") if humanoid then for _, t in ipairs(humanoid:GetPlayingAnimationTracks()) do local name = (t.Name or ""):lower() if string.find(name, "atk") then t:Stop() end end end local hrp = char and char:FindFirstChild("HumanoidRootPart") if hrp then local bv = hrp:FindFirstChild("CombatHoverVelocity") if bv then bv:Destroy() end end end) addLog(string.format("🛑 Stopped Stage %d & Exited Dungeon!", Config.SelectedStage)) end function Actions.TrainOnce() if Remotes.TrainOnce then pcall(function() Remotes.TrainOnce:FireServer() end) Runtime.TotalTrained = Runtime.TotalTrained + 1 end end function Actions.StartAutoTrain() local areaId = LocalPlayer:GetAttribute("AutoTrainAreaID") or 5 if Remotes.IntoAutoTrain then pcall(function() Remotes.IntoAutoTrain:FireServer(areaId) end) end addLog(string.format("⚡ Dual-Engine Auto Train Activated! (Area: %s)", tostring(areaId))) end function Actions.StopTrain() local areaId = LocalPlayer:GetAttribute("AutoTrainAreaID") or 5 if Remotes.ExitAutoTrain then pcall(function() Remotes.ExitAutoTrain:FireServer(areaId) end) end addLog("🛑 Auto Train Deactivated.") end function Actions.ClaimAllOres() local fireprompt = fireproximityprompt or (getgenv and getgenv().fireproximityprompt) local oc = workspace:FindFirstChild("OreCache") local count = 0 if oc then for _, ore in ipairs(oc:GetChildren()) do if not Config.OnlyHighestOres or isOreHighTier(ore.Name) then local prompt = ore:FindFirstChildWhichIsA("ProximityPrompt", true) if prompt and fireprompt then pcall(function() fireprompt(prompt) end) count = count + 1 end end end end if Remotes.ClaimedAllOre then pcall(function() Remotes.ClaimedAllOre:FireServer() end) end if LeftInfoGUI and LeftInfoGUI.UpdateOrePack then pcall(function() LeftInfoGUI.UpdateOrePack(0) end) end Runtime.TotalOresClaimed = Runtime.TotalOresClaimed + count end function Actions.StartStage(stageNum) local stageName = "Stage_" .. tostring(stageNum) pcall(function() StageUtils.StartFight(stageName) end) addLog("Engaged " .. stageName) end function Actions.PacketClearAllStages() local totalOresClaimed = 0 local startStage = 1 if Config.OnlyHighestOres then startStage = (Config.MinOreRarity and Config.MinOreRarity >= 8) and 21 or 18 end for stageIdx = startStage, 22 do local stageName = "Stage_" .. stageIdx local s, rewards = pcall(function() return Remotes.StageFinished:InvokeServer(stageName) end) if s and type(rewards) == "table" then for uuid, oreType in pairs(rewards) do if not Config.OnlyHighestOres or isOreHighTier(oreType) then pcall(function() local res = Remotes.GetOre:InvokeServer(uuid) if res and res ~= false then totalOresClaimed = totalOresClaimed + 1 end end) end end end -- Immediately flush and deposit carried ores to inventory after each stage if Remotes.ClaimedAllOre then pcall(function() Remotes.ClaimedAllOre:FireServer() end) end if LeftInfoGUI and LeftInfoGUI.UpdateOrePack then pcall(function() LeftInfoGUI.UpdateOrePack(0) end) end end if Config.AutoSellBag then pcall(function() BackpackData.SellAll() end) end Runtime.TotalOresClaimed = Runtime.TotalOresClaimed + totalOresClaimed addLog(string.format("⚡ Packet Cleared Stages %d-22! (+%d %s Ores)", startStage, totalOresClaimed, Config.OnlyHighestOres and "Top-Tier" or "Total")) return totalOresClaimed end function Actions.PacketClearTower(startRound) startRound = startRound or Config.TowerStartRound or 1 -- Check tower tickets local ticketItem = nil if BackpackData and BackpackData.GetItemDataByIDType then ticketItem = BackpackData.GetItemDataByIDType("Dungeon_Ticket", "Material") end local ticketCount = ticketItem and ticketItem.Number or 0 if ticketCount <= 0 then if Remotes.ClaimDailyDunTicket then pcall(function() Remotes.ClaimDailyDunTicket:FireServer() end) task.wait(0.25) if BackpackData and BackpackData.GetItemDataByIDType then ticketItem = BackpackData.GetItemDataByIDType("Dungeon_Ticket", "Material") end ticketCount = ticketItem and ticketItem.Number or 0 end if ticketCount <= 0 then addLog("❌ No Tower Tickets left! Cannot enter Frostbound Tower.") return false, 0 end end -- Enter dungeon if not already inside if not LocalPlayer:GetAttribute("Dungeoning") then local ok = false local s = pcall(function() if Remotes.TryIntoDungeonRF then ok = Remotes.TryIntoDungeonRF:InvokeServer(startRound) end end) if not s or not ok then addLog("❌ Failed to enter Frostbound Tower!") return false, 0 end task.wait(0.1) end local roundsCleared = 0 local totalLootCount = 0 -- Fast clear rounds up to 30 for r = startRound, 30 do if not Runtime.Running then break end if Remotes.StartRoundRE then pcall(function() Remotes.StartRoundRE:FireServer(r) end) end task.wait(0.04) local pass = false local loot = nil if Remotes.CompleteRoundRF then local s, res1, res2 = pcall(function() return Remotes.CompleteRoundRF:InvokeServer(r) end) if s then loot = res1 pass = res2 if pass or loot then roundsCleared = roundsCleared + 1 if type(loot) == "table" then totalLootCount = totalLootCount + #loot end else break end else break end end task.wait(0.04) end -- Clean exit & state restoration pcall(function() if Remotes.ExitDungeonRE then Remotes.ExitDungeonRE:FireServer() end if Remotes.ExitDungeonBE then Remotes.ExitDungeonBE:Fire() end if DungeonFightGUI and DungeonFightGUI.Close then DungeonFightGUI.Close() end LocalPlayer:SetAttribute("StageID", nil) LocalPlayer:SetAttribute("Dungeoning", nil) TranslateUtils.ToSpawn(LocalPlayer.Character) local infoGui = PlayerGui:FindFirstChild("Info") if infoGui then if infoGui:FindFirstChild("DungeonResult") then infoGui.DungeonResult.Visible = false end if infoGui:FindFirstChild("RoundCompleted") then infoGui.RoundCompleted.Visible = false end end end) if Config.AutoSellBag and BackpackData and BackpackData.SellAll then pcall(function() BackpackData.SellAll() end) end Runtime.TotalTowerRounds = Runtime.TotalTowerRounds + roundsCleared Runtime.TotalTowerRuns = Runtime.TotalTowerRuns + 1 local leftTickets = math.max(0, ticketCount - 1) addLog(string.format("❄️ Tower Cleared! %d Rounds (+%d Items) [Tickets left: %d]", roundsCleared, totalLootCount, leftTickets)) return true, roundsCleared end function Actions.Rebirth() if Remotes.TryRebirth then pcall(function() Remotes.TryRebirth:FireServer() end) end end function Actions.SellAll() pcall(function() BackpackData.SellAll() end) addLog("Sold all bag items!") end function Actions.ClaimAllGifts() task.spawn(function() if Remotes.ClaimOffline then pcall(function() Remotes.ClaimOffline:FireServer() end) end if Remotes.ClaimDailyDunTicket then pcall(function() Remotes.ClaimDailyDunTicket:FireServer() end) end if Remotes.ClaimOnline then for i = 1, 12 do pcall(function() Remotes.ClaimOnline:FireServer(tostring(i)) end) task.wait(0.03) end end if Remotes.ClaimIndexExp then pcall(function() Remotes.ClaimIndexExp:InvokeServer() end) end if Remotes.TryClaimLevelRewardRF then pcall(function() Remotes.TryClaimLevelRewardRF:InvokeServer() end) end addLog("Claimed all gifts, index rewards & tickets!") end) end function Actions.SnipeSuperLoot() local enemyFolder = workspace:FindFirstChild("EnemyFolder") if not enemyFolder then return end for _, e in ipairs(enemyFolder:GetChildren()) do if e.Name:match("^SSS%-") or e.Name:match("Super") then local uuid = e:GetAttribute("UUID") or e.Name local curHp = HPCTRL.GetCurrentHP(e) or 1 if curHp > 0 then for i = 1, math.min(curHp + 2, 12) do if not enemyFolder:FindFirstChild(e.Name) then break end if Remotes.EnemyHitBE then Remotes.EnemyHitBE:Fire(uuid, 1, "Normal") end task.wait(0.03) end if Remotes.KillSuperLootRE then pcall(function() Remotes.KillSuperLootRE:FireServer(uuid) end) end addLog(string.format("🎯 SuperLoot Sniped! [%s]", uuid)) end end end end function Actions.FastOreMagnet() local oc = workspace:FindFirstChild("OreCache") if not oc then return end local fireprompt = fireproximityprompt or (getgenv and getgenv().fireproximityprompt) local count = 0 for _, ore in ipairs(oc:GetChildren()) do if not Config.OnlyHighestOres or isOreHighTier(ore.Name) then local prompt = ore:FindFirstChildWhichIsA("ProximityPrompt", true) if prompt then for _, conn in ipairs(getconnections(prompt.Triggered)) do conn:Fire() end if fireprompt then pcall(function() fireprompt(prompt, 0) end) end count = count + 1 end end end if count > 0 then if Remotes.ClaimedAllOre then pcall(function() Remotes.ClaimedAllOre:FireServer() end) end if LeftInfoGUI and LeftInfoGUI.UpdateOrePack then pcall(function() LeftInfoGUI.UpdateOrePack(0) end) end Runtime.TotalOresClaimed = Runtime.TotalOresClaimed + count end end function Actions.SellJunkOres() local data = BackpackData.GetData() if not data or not data.have then return 0 end local minRarity = Config.MinOreRarity or 8 local soldCount = 0 local batches = {} for uuid, item in pairs(data.have) do local id = tostring(item.ID or "") if item.Type == "Ore" or item.ConfigType == "Ore" or id:match("Ore") then local r = getOreRarity(id) if r < minRarity then local count = item.Number or item.Count or 1 if count > 0 then table.insert(batches, { uuid = uuid, count = count, id = id, rarity = r }) end end end end for _, b in ipairs(batches) do if Remotes.TrySellItemRE then pcall(function() Remotes.TrySellItemRE:FireServer(b.uuid, b.count) end) soldCount = soldCount + b.count task.wait(0.03) end end if soldCount > 0 then addLog(string.format("🧹 Purged %d Junk Ores (< Rarity %d) into Coins!", soldCount, minRarity)) else addLog(string.format("✨ Bag already clean! All ores are Rarity %d+", minRarity)) end return soldCount end function Actions.ApplyWalkSpeed() local char = LocalPlayer.Character local hum = char and char:FindFirstChildOfClass("Humanoid") if hum then if Config.SpeedBoost then if hum.WalkSpeed ~= Config.TargetWalkSpeed then hum.WalkSpeed = Config.TargetWalkSpeed end end end end function Actions.AutoUseAllPotions() if not Remotes.TryUsePotionRE then return end local potions = {"DamagePotion", "LuckPotion", "TrainPotion", "CoinPotion"} for _, p in ipairs(potions) do pcall(function() Remotes.TryUsePotionRE:FireServer(p) end) end end function Actions.AutoUpgradeStats() if not Remotes.UpgradeOnceRE then return end pcall(function() Remotes.UpgradeOnceRE:FireServer("Luck") end) pcall(function() Remotes.UpgradeOnceRE:FireServer("OrePack") end) pcall(function() Remotes.UpgradeOnceRE:FireServer("Train") end) end -- ==================================================================== -- 🔨 FORGE & WEAPON SYSTEM ACTIONS -- ==================================================================== function Actions.GetWeaponStats(itemOrId) local id = type(itemOrId) == "table" and itemOrId.ID or itemOrId local cfg = WeaponConfig and WeaponConfig[id] local designPower = cfg and (cfg.DesignPower or 0) or 0 local trainMult = cfg and (cfg.Train or 0) or 0 local rarity = cfg and (cfg.Rarity or "Unknown") or "Unknown" local name = WeaponHelper and WeaponHelper.GetDisName and WeaponHelper.GetDisName(id) or (cfg and cfg.Name or id) local price = cfg and (cfg.Price or 0) or 0 return { ID = id, Name = name, DesignPower = designPower, Train = trainMult, Rarity = rarity, Price = price } end function Actions.GetArmorStats(itemOrId) local id = type(itemOrId) == "table" and itemOrId.ID or itemOrId local cfg = ArmorConfig and ArmorConfig[id] local designPower = cfg and (cfg.DesignPower or 0) or 0 local rarity = cfg and (cfg.Rarity or "Unknown") or "Unknown" local name = ArmorHelper and ArmorHelper.GetDisName and ArmorHelper.GetDisName(id) or (cfg and cfg.Name or id) local price = cfg and (cfg.Price or 0) or 0 local bigType = cfg and cfg.BigType or (type(itemOrId) == "table" and itemOrId.Type) or "Armor" local attrType = cfg and cfg.AttributeType or "" local attrNum = cfg and cfg.AttriNum or 0 return { ID = id, Name = name, DesignPower = designPower, Rarity = rarity, Price = price, BigType = bigType, AttributeType = attrType, AttriNum = attrNum } end function Actions.GetEquippedGearStats() local data = BackpackData.GetData() local equipped = data.equiped or {} local weaponStats = nil if equipped.Weapon and data.have and data.have[equipped.Weapon] then weaponStats = Actions.GetWeaponStats(data.have[equipped.Weapon]) weaponStats.UUID = equipped.Weapon end local armorStats = nil if equipped.Armor and data.have and data.have[equipped.Armor] then armorStats = Actions.GetArmorStats(data.have[equipped.Armor]) armorStats.UUID = equipped.Armor end local hatStats = nil if equipped.Hat and data.have and data.have[equipped.Hat] then hatStats = Actions.GetArmorStats(data.have[equipped.Hat]) hatStats.UUID = equipped.Hat end return { Weapon = weaponStats, Armor = armorStats, Hat = hatStats } end function Actions.GetEquippedWeaponStats() local gear = Actions.GetEquippedGearStats() return gear.Weapon end function Actions.GetBestOresForForge(targetCount) targetCount = targetCount or 4 local data = BackpackData.GetData() if not data or not data.have then return nil, 0, {}, "" end local oreList = {} for uuid, item in pairs(data.have) do local id = tostring(item.ID or "") if item.Type == "Ore" or item.ConfigType == "Ore" or id:match("Ore") then local count = item.Number or item.Count or item.Num or 1 if count > 0 then local oreCfg = OreConfig and OreConfig[id] local power = oreCfg and (oreCfg.Power or oreCfg.BaseATK) or 0 local quality = oreCfg and (oreCfg.Quality or oreCfg.Rarity) or 0 table.insert(oreList, { UUID = uuid, ID = id, Count = count, Power = power, Quality = quality }) end end end -- Sort ores strictly by Power descending, then Quality descending table.sort(oreList, function(a, b) if a.Power ~= b.Power then return a.Power > b.Power end return a.Quality > b.Quality end) local selectedUUIDs = {} local totalCount = 0 local oresUsedDesc = {} for _, ore in ipairs(oreList) do local needed = targetCount - totalCount local take = math.min(ore.Count, needed) if take > 0 then selectedUUIDs[ore.UUID] = take totalCount = totalCount + take table.insert(oresUsedDesc, string.format("%s x%d", ore.ID, take)) end if totalCount >= targetCount then break end end if totalCount < targetCount then return nil, totalCount, oreList, "" end return selectedUUIDs, totalCount, oreList, table.concat(oresUsedDesc, ", ") end function Actions.ForgeBestWeapon() local selectedUUIDs, totalCount, allOres, desc = Actions.GetBestOresForForge() if not selectedUUIDs or totalCount < 4 then addLog(string.format("⚠️ Not enough ores to forge (Have %d/4 top ores)", totalCount)) return false, "Not enough ores" end local dataBefore = BackpackData.GetData() local beforeUUIDs = {} for uuid, _ in pairs(dataBefore.have or {}) do beforeUUIDs[uuid] = true end local s, res = pcall(function() return Remotes.ForgeRF:InvokeServer({ ConfigType = "Weapon", UUIDList = selectedUUIDs }) end) if not s or not res then addLog("❌ Forge request failed on server.") return false, "Server failed" end local craftedItem = res[1] or res local craftedID = craftedItem and craftedItem.ID local craftedStats = Actions.GetWeaponStats(craftedID) local newWeaponUUID = nil for attempt = 1, 8 do task.wait(0.15) local dataAfter = BackpackData.GetData() for uuid, item in pairs(dataAfter.have or {}) do if not beforeUUIDs[uuid] and (item.Type == "Weapon" or item.ConfigType == "Weapon" or tostring(item.ID):match("^[KG]_")) then newWeaponUUID = uuid break end end if not newWeaponUUID and craftedID then for uuid, item in pairs(dataAfter.have or {}) do if item.ID == craftedID and uuid ~= (dataAfter.equiped and dataAfter.equiped.Weapon) then newWeaponUUID = uuid break end end end if newWeaponUUID then break end end Runtime.TotalWeaponsForged = Runtime.TotalWeaponsForged + 1 local curEquipped = Actions.GetEquippedWeaponStats() local isBetter = false if not curEquipped then isBetter = true elseif craftedStats.DesignPower > curEquipped.DesignPower then isBetter = true elseif craftedStats.DesignPower == curEquipped.DesignPower and craftedStats.Train > curEquipped.Train then isBetter = true end local historyEntry = { Name = craftedStats.Name, Rarity = craftedStats.Rarity, Power = craftedStats.DesignPower, Time = os.date("%X"), Equipped = false } if isBetter and Config.AutoEquipBestWeapon then if newWeaponUUID then pcall(function() Remotes.TryEquipItemRE:FireServer(newWeaponUUID, "Weapon") end) else task.wait(0.2) Actions.EquipHighestWeaponInBag() end historyEntry.Equipped = true addLog(string.format("🎉 AUTO-EQUIPPED NEW BEST: %s (%s | Pwr %d)!", craftedStats.Name, craftedStats.Rarity, craftedStats.DesignPower)) else addLog(string.format("🔨 Forged: %s (%s | Pwr %d)", craftedStats.Name, craftedStats.Rarity, craftedStats.DesignPower)) end table.insert(Runtime.ForgeHistory, 1, historyEntry) if #Runtime.ForgeHistory > 8 then table.remove(Runtime.ForgeHistory) end if Config.AutoSellJunkGear then task.delay(0.3, function() Actions.SellWeakerAndDuplicateGear() end) end return true, craftedStats end function Actions.EquipHighestWeaponInBag() local data = BackpackData.GetData() if not data or not data.have then return end local bestUUID = nil local bestPower = -1 local bestTrain = -1 local bestName = "" local bestRarity = "" for uuid, item in pairs(data.have) do if item.Type == "Weapon" or item.ConfigType == "Weapon" or tostring(item.ID):match("^[KG]_") then local stats = Actions.GetWeaponStats(item) if stats.DesignPower > bestPower or (stats.DesignPower == bestPower and stats.Train > bestTrain) then bestPower = stats.DesignPower bestTrain = stats.Train bestUUID = uuid bestName = stats.Name bestRarity = stats.Rarity end end end if bestUUID then pcall(function() Remotes.TryEquipItemRE:FireServer(bestUUID, "Weapon") end) addLog(string.format("🗡️ Equipped Highest in Bag: %s (%s | Pwr %d)", bestName, bestRarity, bestPower)) else addLog("⚠️ No weapons found in backpack.") end end function Actions.EquipHighestArmorInBag() local data = BackpackData.GetData() if not data or not data.have then return end local bestUUID, bestPower, bestName, bestRarity = nil, -1, "", "" for uuid, item in pairs(data.have) do local stats = Actions.GetArmorStats(item) if stats.BigType == "Armor" and stats.DesignPower > bestPower then bestPower = stats.DesignPower bestUUID = uuid bestName = stats.Name bestRarity = stats.Rarity end end if bestUUID then pcall(function() Remotes.TryEquipItemRE:FireServer(bestUUID, "Armor") end) addLog(string.format("🛡️ Equipped Highest Armor: %s (%s | Pwr %d)", bestName, bestRarity, bestPower)) else addLog("⚠️ No Armor found in backpack.") end end function Actions.EquipHighestHatInBag() local data = BackpackData.GetData() if not data or not data.have then return end local bestUUID, bestPower, bestName, bestRarity = nil, -1, "", "" for uuid, item in pairs(data.have) do local stats = Actions.GetArmorStats(item) if stats.BigType == "Hat" and stats.DesignPower > bestPower then bestPower = stats.DesignPower bestUUID = uuid bestName = stats.Name bestRarity = stats.Rarity end end if bestUUID then pcall(function() Remotes.TryEquipItemRE:FireServer(bestUUID, "Hat") end) addLog(string.format("👑 Equipped Highest Hat: %s (%s | Pwr %d)", bestName, bestRarity, bestPower)) else addLog("⚠️ No Hat found in backpack.") end end function Actions.EquipAllBestGearInBag() Actions.EquipHighestWeaponInBag() Actions.EquipHighestArmorInBag() Actions.EquipHighestHatInBag() addLog("👑 Equipped Best Gear (Weapon + Armor + Hat)!") end function Actions.ForgeBestArmor(preferredTarget) local curGear = Actions.GetEquippedGearStats() local armorMax = curGear and curGear.Armor and curGear.Armor.DesignPower >= 67 local hatMax = curGear and curGear.Hat and curGear.Hat.DesignPower >= 67 local targetOres = 10 if preferredTarget == "Hat" or (armorMax and not hatMax) then targetOres = 4 elseif preferredTarget == "Armor" or (hatMax and not armorMax) then targetOres = 10 end local selectedUUIDs, totalCount, allOres, desc = Actions.GetBestOresForForge(targetOres) if (not selectedUUIDs or totalCount < targetOres) and targetOres > 4 then selectedUUIDs, totalCount, allOres, desc = Actions.GetBestOresForForge(4) targetOres = 4 end if not selectedUUIDs or totalCount < targetOres then addLog(string.format("⚠️ Not enough ores to forge Armor/Helm (Need %d, have %d)", targetOres, totalCount)) return false, "Not enough ores" end local dataBefore = BackpackData.GetData() local beforeUUIDs = {} for uuid, _ in pairs(dataBefore.have or {}) do beforeUUIDs[uuid] = true end local s, res = pcall(function() return Remotes.ForgeRF:InvokeServer({ ConfigType = "Armor", UUIDList = selectedUUIDs }) end) if not s or not res then addLog("❌ Armor forge request failed on server.") return false, "Server failed" end local craftedItem = res[1] or res local craftedID = craftedItem and craftedItem.ID local craftedStats = Actions.GetArmorStats(craftedID) local bigType = craftedStats.BigType -- "Armor" or "Hat" local newUUID = nil for attempt = 1, 8 do task.wait(0.15) local dataAfter = BackpackData.GetData() for uuid, item in pairs(dataAfter.have or {}) do if not beforeUUIDs[uuid] and (item.Type == "Armor" or item.Type == "Hat" or (ArmorConfig and ArmorConfig[item.ID])) then newUUID = uuid break end end if not newUUID and craftedID then for uuid, item in pairs(dataAfter.have or {}) do if item.ID == craftedID and uuid ~= (dataAfter.equiped and dataAfter.equiped[bigType]) then newUUID = uuid break end end end if newUUID then break end end Runtime.TotalWeaponsForged = Runtime.TotalWeaponsForged + 1 local currentGear = Actions.GetEquippedGearStats() local currentEquippedSlot = currentGear and currentGear[bigType] local isBetter = false if not currentEquippedSlot then isBetter = true elseif craftedStats.DesignPower > currentEquippedSlot.DesignPower then isBetter = true elseif craftedStats.DesignPower == currentEquippedSlot.DesignPower and craftedStats.AttriNum > currentEquippedSlot.AttriNum then isBetter = true end local historyEntry = { Name = craftedStats.Name, Rarity = craftedStats.Rarity, Power = craftedStats.DesignPower, Time = os.date("%X"), Equipped = false } if isBetter and Config.AutoEquipBestWeapon then if newUUID then pcall(function() Remotes.TryEquipItemRE:FireServer(newUUID, bigType) end) else task.wait(0.2) if bigType == "Hat" then Actions.EquipHighestHatInBag() else Actions.EquipHighestArmorInBag() end end historyEntry.Equipped = true addLog(string.format("🎉 AUTO-EQUIPPED NEW BEST %s: %s (%s | Pwr %d)!", bigType:upper(), craftedStats.Name, craftedStats.Rarity, craftedStats.DesignPower)) else addLog(string.format("🛡️ Forged %s: %s (%s | Pwr %d)", bigType, craftedStats.Name, craftedStats.Rarity, craftedStats.DesignPower)) end table.insert(Runtime.ForgeHistory, 1, historyEntry) if #Runtime.ForgeHistory > 8 then table.remove(Runtime.ForgeHistory) end if Config.AutoSellJunkGear then task.delay(0.3, function() Actions.SellWeakerAndDuplicateGear() end) end return true, craftedStats end function Actions.SellWeakerAndDuplicateGear() local data = BackpackData.GetData() if not data or not data.have then return 0 end local curGear = Actions.GetEquippedGearStats() local equippedUUIDs = {} if data.equiped then if data.equiped.Weapon then equippedUUIDs[data.equiped.Weapon] = true end if data.equiped.Armor then equippedUUIDs[data.equiped.Armor] = true end if data.equiped.Hat then equippedUUIDs[data.equiped.Hat] = true end end local curWeaponPower = curGear and curGear.Weapon and curGear.Weapon.DesignPower or 0 local curArmorPower = curGear and curGear.Armor and curGear.Armor.DesignPower or 0 local curHatPower = curGear and curGear.Hat and curGear.Hat.DesignPower or 0 local soldCount = 0 local totalSoldPrice = 0 local seenIDs = {} for uuid, item in pairs(data.have) do if not equippedUUIDs[uuid] then local isWeapon = (item.Type == "Weapon" or item.ConfigType == "Weapon" or tostring(item.ID):match("^[KG]_")) local isArmor = (item.Type == "Armor" or item.Type == "Hat" or (ArmorConfig and ArmorConfig[item.ID])) local shouldSell = false local reason = "" local itemPrice = 0 if isWeapon then local stats = Actions.GetWeaponStats(item) itemPrice = stats.Price or 0 if stats.DesignPower < curWeaponPower then shouldSell = true reason = "weaker" elseif stats.DesignPower == curWeaponPower then -- If we already have the equipped one, this is duplicate shouldSell = true reason = "duplicate" elseif seenIDs[item.ID] then shouldSell = true reason = "duplicate" end seenIDs[item.ID] = true elseif isArmor then local stats = Actions.GetArmorStats(item) itemPrice = stats.Price or 0 local bigType = stats.BigType local curPower = (bigType == "Hat") and curHatPower or curArmorPower if stats.DesignPower < curPower then shouldSell = true reason = "weaker" elseif stats.DesignPower == curPower then shouldSell = true reason = "duplicate" elseif seenIDs[item.ID] then shouldSell = true reason = "duplicate" end seenIDs[item.ID] = true end if shouldSell then pcall(function() Remotes.TrySellItemRE:FireServer(uuid, 1) end) soldCount = soldCount + 1 totalSoldPrice = totalSoldPrice + itemPrice end end end if soldCount > 0 then addLog(string.format("🧹 Auto-Sold %d Weaker/Duplicate gear items (+%s Coins)!", soldCount, formatNumber(totalSoldPrice))) end return soldCount end function Actions.RestockHighestStageOres() local stageNum = Config.SelectedStage or 22 if stageNum < 21 then stageNum = 22 end local totalRestocked = 0 pcall(function() local rewards = Remotes.StageFinished:InvokeServer("Stage_" .. tostring(stageNum)) if rewards and type(rewards) == "table" then for uuid, oreType in pairs(rewards) do if not Config.OnlyHighestOres or isOreHighTier(oreType) then pcall(function() if Remotes.GetOre:InvokeServer(uuid) then totalRestocked = totalRestocked + 1 end end) end end end if Remotes.ClaimedAllOre then pcall(function() Remotes.ClaimedAllOre:FireServer() end) end if LeftInfoGUI and LeftInfoGUI.UpdateOrePack then pcall(function() LeftInfoGUI.UpdateOrePack(0) end) end end) addLog(string.format("⛏️ Restocked Stage %d Top Ores! (+%d)", stageNum, totalRestocked)) end Actions.RestockStage17Ores = Actions.RestockHighestStageOres -- Retrieve enemies belonging specifically to the player's active stage local stageUpvals = debug.getupvalues(StageUtils.HurtEnemy) local stageDataTab = stageUpvals and stageUpvals[2] getStageEnemies = function() local list = {} local curStage = LocalPlayer:GetAttribute("StageID") or ("Stage_" .. tostring(Config.SelectedStage)) if stageDataTab and stageDataTab[curStage] and stageDataTab[curStage].EnemyTab then for uuid, entry in pairs(stageDataTab[curStage].EnemyTab) do if not entry.Dead then local model = workspace.EnemyFolder:FindFirstChild(uuid) if model then table.insert(list, { uuid = uuid, model = model, entry = entry }) end end end end -- Fallback: query alive mobs in EnemyFolder near player if #list == 0 then local ef = workspace:FindFirstChild("EnemyFolder") local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if ef then for _, m in ipairs(ef:GetChildren()) do if m:IsA("Model") and not m:GetAttribute("Dead") then if hrp then local dist = (m:GetPivot().Position - hrp.Position).Magnitude if dist < 120 then table.insert(list, { uuid = m.Name, model = m }) end else table.insert(list, { uuid = m.Name, model = m }) end end end end end return list end -- ==================================================================== -- ⚡ CONCURRENT WORKER THREADS (ALL WORK SIMULTANEOUSLY) -- ==================================================================== -- Helper to stabilize character in the air without gravity falling jitter local function setHoverVelocity(hrp, enable) if not hrp then return end local bv = hrp:FindFirstChild("CombatHoverVelocity") if enable then if not bv then bv = Instance.new("BodyVelocity") bv.Name = "CombatHoverVelocity" bv.MaxForce = Vector3.new(1e5, 1e5, 1e5) bv.Velocity = Vector3.new(0, 0, 0) bv.Parent = hrp end else if bv then bv:Destroy() end end end -- Thread 1: Combat & Skill Execution table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.AutoAttackMobs or Config.AutoStageLoop then local stageMobs = getStageEnemies() local enemy = stageMobs[1] and stageMobs[1].model local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if enemy and hrp then setHoverVelocity(hrp, true) local pivot = enemy:GetPivot() local targetPos = pivot.Position -- Calculate stable hovering position (offset diagonally to completely avoid vertical gimbal lock shake) local hoverOffset = Config.GodMode and Vector3.new(0, 4.8, 2.5) or Vector3.new(0, 3.2, 3.0) local desiredPos = targetPos + hoverOffset local desiredCFrame = CFrame.lookAt(desiredPos, targetPos) -- Deadzone threshold: only teleport when moving to a new mob or drifted away (> 2 studs) -- Prevents violent 10/sec micro-jitter and camera twitching if (hrp.Position - desiredPos).Magnitude > 2.0 then hrp.CFrame = desiredCFrame hrp.AssemblyLinearVelocity = Vector3.zero hrp.AssemblyAngularVelocity = Vector3.zero end -- Execute Hit All Mobs / One-Hit Kill with 1e35 damage if Config.HitAllMobs then for _, item in ipairs(stageMobs) do pcall(function() local dmg = Config.OneHitKill and 1e35 or math.max(50, getEcoStat("power")) StageUtils.HurtEnemy(item.uuid, dmg, "Title") end) end elseif Config.OneHitKill then pcall(function() StageUtils.HurtEnemy(stageMobs[1].uuid, 1e35, "Title") end) end -- Fire weapon attack + rotate Skill 1 (Q) & Skill 2 (E) pcall(function() Remotes.ATKOnceBE:Fire() end) pcall(function() Remotes.UseSkillByIndexBE:Fire(1) end) pcall(function() Remotes.UseSkillByIndexBE:Fire(2) end) task.wait(0.1) else local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") setHoverVelocity(hrp, false) task.wait(0.25) end else local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") setHoverVelocity(hrp, false) task.wait(0.3) end end end)) -- Thread 2: Auto Stage Loop (Continuous Dungeon Progression) table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.AutoStageLoop then local intoFight = LocalPlayer:GetAttribute("IntoFight") local ef = workspace:FindFirstChild("EnemyFolder") local hasEnemies = ef and #ef:GetChildren() > 0 if not intoFight or not hasEnemies then Actions.StartStage(Config.SelectedStage) task.wait(1.2) end end task.wait(0.8) end end)) -- Thread 3: Dual-Engine Auto Train Accelerator (Server Passive Auto + Direct Burst) table.insert(Runtime.Threads, task.spawn(function() local wasTraining = false while Runtime.Running do if Config.AutoTrain then if not wasTraining then wasTraining = true Actions.StartAutoTrain() end Actions.TrainOnce() task.wait(Config.TrainDelay or 0.12) else if wasTraining then wasTraining = false Actions.StopTrain() end task.wait(0.5) end end end)) -- Thread 4: Independent Ore Looting (Dual Engine) table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.AutoClaimOres then Actions.ClaimAllOres() end task.wait(0.35) end end)) -- Thread 5: GodMode Health Lock table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.GodMode then pcall(function() HPCTRL.SetCurrentHP(LocalPlayer, HPCTRL.GetMaxHP(LocalPlayer)) end) end task.wait(0.4) end end)) -- Thread 6: Auto Rebirth (Zero Combat Interruption) table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.AutoRebirth then Actions.Rebirth() end task.wait(1.5) end end)) -- Thread 7: Auto Sell Bag & Junk Ores table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.AutoSellBag then Actions.SellAll() end if Config.AutoSellJunkOres then Actions.SellJunkOres() end task.wait(12) end end)) -- Thread 8: Auto Claim Free Gifts & Online Gifts table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.AutoClaimRewards then Actions.ClaimAllGifts() task.wait(60) else task.wait(2) end end end)) -- Thread 9: Anti-AFK Kick Protection table.insert(Runtime.Threads, task.spawn(function() local conn = LocalPlayer.Idled:Connect(function() if Config.AntiAFK then VirtualUser:CaptureController() VirtualUser:ClickButton2(Vector2.new()) addLog("Anti-AFK active") end end) table.insert(Runtime.Connections, conn) end)) -- Thread 10: Fast Packet All Stages (Instant Nuke All 17 Stages) table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.FastPacketAllStages then pcall(function() Actions.PacketClearAllStages() end) task.wait(1.0) else task.wait(0.5) end end end)) -- Thread 10.5: Fast Packet Frostbound Tower (Instant Nuke Tower 1-30) table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.FastPacketTower then local success, rounds = Actions.PacketClearTower(Config.TowerStartRound or 1) if not success then Config.FastPacketTower = false if ToggleSetters["FastPacketTower"] then ToggleSetters["FastPacketTower"](false, true) end task.wait(1.5) else task.wait(1.5) end else task.wait(0.5) end end end)) -- Thread 11: Auto Forge Best Gear (Weapon + Armor + Hat) local forgeCycleAlternator = false table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.AutoForgeBestWeapon then local selectedUUIDs, totalCount = Actions.GetBestOresForForge() if selectedUUIDs and totalCount >= 4 then if Config.ForgeTargetMode == "WEAPON" then Actions.ForgeBestWeapon() elseif Config.ForgeTargetMode == "ARMOR" then Actions.ForgeBestArmor() else -- "CYCLE" forgeCycleAlternator = not forgeCycleAlternator if forgeCycleAlternator then Actions.ForgeBestWeapon() else Actions.ForgeBestArmor() end end task.wait(Config.ForgeInterval or 1.5) else if Config.AutoRestockOres then Actions.RestockStage17Ores() task.wait(2.0) else task.wait(2.0) end end else task.wait(0.5) end end end)) -- Thread 12: SuperLoot Boss Sniper table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.SuperLootSniper then pcall(Actions.SnipeSuperLoot) end task.wait(0.5) end end)) -- Thread 13: Instant Ore Magnet (Full-Map Aura) table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.OreMagnet then pcall(Actions.FastOreMagnet) end task.wait(0.15) end end)) -- Thread 14: Movement Speed Enforcer table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.SpeedBoost then pcall(Actions.ApplyWalkSpeed) end task.wait(0.5) end end)) -- Thread 15: Auto Potion Buffs table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.AutoPotion then pcall(Actions.AutoUseAllPotions) task.wait(30) else task.wait(2) end end end)) -- Thread 16: Auto Upgrade Stats table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do if Config.AutoUpgradeStats then pcall(Actions.AutoUpgradeStats) task.wait(10) else task.wait(2) end end end)) -- ==================================================================== -- 🎨 GLASS DECK UI SYSTEM (DARK GLASSMORPHISM & STEEL-CYAN COMMAND DECK) -- ==================================================================== local GuiParent = (gethui and gethui()) or PlayerGui or game:GetService("CoreGui") local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "LootToForge_MasterHub" ScreenGui.ResetOnSpawn = false ScreenGui.DisplayOrder = 99999 ScreenGui.Parent = GuiParent -- Theme Palette (Strict Glass Deck Tokens) local Theme = { -- Surfaces BgDark = Color3.fromRGB(7, 8, 12), -- #07080c deep base BgBody = Color3.fromRGB(10, 12, 17), -- Window background BgPanel = Color3.fromRGB(14, 17, 24), -- Header / sub-bars BgCard = Color3.fromRGB(17, 21, 29), -- Glass card fill BgCardHover = Color3.fromRGB(24, 29, 40), -- Hovered card BgSunken = Color3.fromRGB(5, 6, 9), -- Deep well / toggle off / terminal BgSunkenDeep = Color3.fromRGB(4, 5, 7), -- Darkest console surface -- Accent: Signature Muted Steel-Cyan (#3d80a1) Accent = Color3.fromRGB(61, 128, 161), -- #3d80a1 muted steel-cyan AccentLight = Color3.fromRGB(90, 178, 218), -- #5ab2da bright highlight AccentDark = Color3.fromRGB(40, 99, 128), -- #286380 gradient end -- Alerts & Status Danger = Color3.fromRGB(239, 68, 68), -- #ef4444 DangerDark = Color3.fromRGB(155, 28, 28), -- #9b1c1c Ok = Color3.fromRGB(52, 211, 153), -- #34d399 Warn = Color3.fromRGB(251, 191, 36), -- #fbbf24 -- Hairline Borders (1px solid var(--border-line)) BorderLine = Color3.fromRGB(34, 40, 52), -- Hairline normal BorderAccent = Color3.fromRGB(61, 128, 161), -- Hairline active/focus BorderBright = Color3.fromRGB(56, 66, 84), -- Hovered card hairline -- Text Ramp (4-step ramp) TextBright = Color3.fromRGB(255, 255, 255), -- #ffffff TextMain = Color3.fromRGB(218, 218, 218), -- #dadada TextDim = Color3.fromRGB(140, 147, 160), -- Labels / inactive TextMuted = Color3.fromRGB(88, 94, 106), -- Timestamps / hints -- Radii RadiusSm = UDim.new(0, 4), -- 4px: buttons, pills, tags RadiusMd = UDim.new(0, 6), -- 6px: cards, panels, toggles RadiusLg = UDim.new(0, 8), -- 8px: main window shell } -- Main Window (.deck-window) local MainFrame = Instance.new("Frame") MainFrame.Name = "MainFrame" MainFrame.Size = UDim2.new(0, 380, 0, 560) MainFrame.Position = UDim2.new(0.02, 0, 0.10, 0) MainFrame.BackgroundColor3 = Theme.BgBody MainFrame.BackgroundTransparency = 0.04 MainFrame.BorderSizePixel = 0 MainFrame.Active = false MainFrame.ClipsDescendants = true MainFrame.Parent = ScreenGui local MainCorner = Instance.new("UICorner", MainFrame) MainCorner.CornerRadius = Theme.RadiusLg local MainStroke = Instance.new("UIStroke", MainFrame) MainStroke.Color = Theme.BorderLine MainStroke.Thickness = 1 -- Header Bar (.deck-header frameless titlebar) local Header = Instance.new("Frame", MainFrame) Header.Name = "Header" Header.Size = UDim2.new(1, 0, 0, 44) Header.BackgroundColor3 = Theme.BgPanel Header.BorderSizePixel = 0 Header.Active = true local HeaderCorner = Instance.new("UICorner", Header) HeaderCorner.CornerRadius = Theme.RadiusLg local HeaderLine = Instance.new("Frame", Header) HeaderLine.Size = UDim2.new(1, 0, 0, 1) HeaderLine.Position = UDim2.new(0, 0, 1, -1) HeaderLine.BackgroundColor3 = Theme.BorderLine HeaderLine.BorderSizePixel = 0 -- Signature Icon Badge (Double-wrapper stamp) local OuterBadge = Instance.new("Frame", Header) OuterBadge.Name = "IconBadge" OuterBadge.Size = UDim2.new(0, 26, 0, 26) OuterBadge.Position = UDim2.new(0, 10, 0.5, -13) OuterBadge.BackgroundColor3 = Theme.BgCard OuterBadge.BackgroundTransparency = 0.2 local ObCorner = Instance.new("UICorner", OuterBadge) ObCorner.CornerRadius = Theme.RadiusMd local ObStroke = Instance.new("UIStroke", OuterBadge) ObStroke.Color = Theme.BorderLine ObStroke.Thickness = 1 local InnerBadge = Instance.new("Frame", OuterBadge) InnerBadge.Name = "InnerBadge" InnerBadge.Size = UDim2.new(0, 18, 0, 18) InnerBadge.Position = UDim2.new(0.5, -9, 0.5, -9) InnerBadge.BackgroundColor3 = Theme.Accent local IbCorner = Instance.new("UICorner", InnerBadge) IbCorner.CornerRadius = Theme.RadiusSm local BadgeIcon = Instance.new("TextLabel", InnerBadge) BadgeIcon.Size = UDim2.new(1, 0, 1, 0) BadgeIcon.BackgroundTransparency = 1 BadgeIcon.Font = Enum.Font.GothamBold BadgeIcon.TextSize = 10 BadgeIcon.TextColor3 = Theme.TextBright BadgeIcon.Text = "⚒" -- Title & Subtitle block local Title = Instance.new("TextLabel", Header) Title.Size = UDim2.new(0, 120, 0, 16) Title.Position = UDim2.new(0, 42, 0, 8) Title.BackgroundTransparency = 1 Title.Font = Enum.Font.GothamBold Title.TextSize = 12 Title.Text = "LOOT TO FORGE" Title.TextColor3 = Theme.TextBright Title.TextXAlignment = Enum.TextXAlignment.Left local SubTitle = Instance.new("TextLabel", Header) SubTitle.Size = UDim2.new(0, 120, 0, 12) SubTitle.Position = UDim2.new(0, 42, 0, 24) SubTitle.BackgroundTransparency = 1 SubTitle.Font = Enum.Font.GothamBold SubTitle.TextSize = 8.5 SubTitle.Text = "COMMAND DECK" SubTitle.TextColor3 = Theme.TextMuted SubTitle.TextXAlignment = Enum.TextXAlignment.Left -- Status Pill (.status-pill) local StatusPill = Instance.new("Frame", Header) StatusPill.Name = "StatusPill" StatusPill.Size = UDim2.new(0, 68, 0, 18) StatusPill.Position = UDim2.new(1, -128, 0.5, -9) StatusPill.BackgroundColor3 = Theme.BgSunken local SpCorner = Instance.new("UICorner", StatusPill) SpCorner.CornerRadius = Theme.RadiusSm local SpStroke = Instance.new("UIStroke", StatusPill) SpStroke.Color = Theme.BorderLine SpStroke.Thickness = 1 local SpText = Instance.new("TextLabel", StatusPill) SpText.Size = UDim2.new(1, 0, 1, 0) SpText.BackgroundTransparency = 1 SpText.Font = Enum.Font.GothamBold SpText.TextSize = 9 SpText.TextColor3 = Theme.TextDim SpText.Text = "● ONLINE" SpText.RichText = true -- Minimize Button local MinBtn = Instance.new("TextButton", Header) MinBtn.Size = UDim2.new(0, 22, 0, 22) MinBtn.Position = UDim2.new(1, -54, 0.5, -11) MinBtn.BackgroundColor3 = Theme.BgCard MinBtn.Font = Enum.Font.GothamBold MinBtn.Text = "—" MinBtn.TextColor3 = Theme.TextDim MinBtn.TextSize = 11 local MinCorner = Instance.new("UICorner", MinBtn) MinCorner.CornerRadius = Theme.RadiusSm local MinStroke = Instance.new("UIStroke", MinBtn) MinStroke.Color = Theme.BorderLine MinStroke.Thickness = 1 local Minimized = false MinBtn.Activated:Connect(function() Minimized = not Minimized if Minimized then TweenService:Create(MainFrame, TweenInfo.new(0.2, Enum.EasingStyle.Quad), {Size = UDim2.new(0, 380, 0, 44)}):Play() MinBtn.Text = "+" else TweenService:Create(MainFrame, TweenInfo.new(0.2, Enum.EasingStyle.Quad), {Size = UDim2.new(0, 380, 0, 560)}):Play() MinBtn.Text = "—" end end) -- Close Button (Frameless Window Close) local CloseBtn = Instance.new("TextButton", Header) CloseBtn.Size = UDim2.new(0, 22, 0, 22) CloseBtn.Position = UDim2.new(1, -28, 0.5, -11) CloseBtn.BackgroundColor3 = Theme.BgCard CloseBtn.Font = Enum.Font.GothamBold CloseBtn.Text = "✕" CloseBtn.TextColor3 = Theme.TextDim CloseBtn.TextSize = 9.5 local ClCorner = Instance.new("UICorner", CloseBtn) ClCorner.CornerRadius = Theme.RadiusSm local ClStroke = Instance.new("UIStroke", CloseBtn) ClStroke.Color = Theme.BorderLine ClStroke.Thickness = 1 CloseBtn.MouseEnter:Connect(function() CloseBtn.BackgroundColor3 = Theme.DangerDark CloseBtn.TextColor3 = Theme.TextBright ClStroke.Color = Theme.Danger end) CloseBtn.MouseLeave:Connect(function() CloseBtn.BackgroundColor3 = Theme.BgCard CloseBtn.TextColor3 = Theme.TextDim ClStroke.Color = Theme.BorderLine end) CloseBtn.Activated:Connect(function() if _G.LootToForgeCleanup then _G.LootToForgeCleanup() end end) -- Draggable Header local dragging, dragStart, startPos Header.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = MainFrame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) UserInputService.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local delta = input.Position - dragStart MainFrame.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end end) -- Navigation Tab Bar (Glass Deck Segmented Control) local TabBar = Instance.new("Frame", MainFrame) TabBar.Name = "TabBar" TabBar.Size = UDim2.new(1, -20, 0, 30) TabBar.Position = UDim2.new(0, 10, 0, 50) TabBar.BackgroundColor3 = Theme.BgSunken local TabCorner = Instance.new("UICorner", TabBar) TabCorner.CornerRadius = Theme.RadiusMd local TabStroke = Instance.new("UIStroke", TabBar) TabStroke.Color = Theme.BorderLine TabStroke.Thickness = 1 local Tabs = {"Combat", "Training", "Farming", "Forge", "Dashboard"} local TabButtons = {} local TabStrokes = {} local TabPages = {} -- Container for all Pages local PageContainer = Instance.new("Frame", MainFrame) PageContainer.Name = "PageContainer" PageContainer.Size = UDim2.new(1, -20, 1, -90) PageContainer.Position = UDim2.new(0, 10, 0, 86) PageContainer.BackgroundTransparency = 1 local function switchTab(tabName) Runtime.ActiveTab = tabName for name, btn in pairs(TabButtons) do local isActive = (name == tabName) btn.BackgroundColor3 = isActive and Theme.Accent or Color3.new(0, 0, 0) btn.BackgroundTransparency = isActive and 0 or 1 btn.TextColor3 = isActive and Theme.TextBright or Theme.TextDim if TabStrokes[name] then TabStrokes[name].Color = isActive and Theme.BorderAccent or Color3.new(0, 0, 0) TabStrokes[name].Transparency = isActive and 0 or 1 end end for name, page in pairs(TabPages) do page.Visible = (name == tabName) end end for i, tabName in ipairs(Tabs) do local btn = Instance.new("TextButton", TabBar) btn.Size = UDim2.new(1 / #Tabs, -2, 1, -4) btn.Position = UDim2.new((i - 1) * (1 / #Tabs), 1, 0, 2) btn.BackgroundColor3 = Theme.Accent btn.BackgroundTransparency = 1 btn.Font = Enum.Font.GothamBold btn.Text = tabName btn.TextColor3 = Theme.TextDim btn.TextSize = 10 local c = Instance.new("UICorner", btn) c.CornerRadius = Theme.RadiusSm local s = Instance.new("UIStroke", btn) s.Color = Theme.BorderAccent s.Thickness = 1 s.Transparency = 1 TabStrokes[tabName] = s btn.Activated:Connect(function() switchTab(tabName) end) TabButtons[tabName] = btn local page = Instance.new("ScrollingFrame", PageContainer) page.Name = tabName .. "Page" page.Size = UDim2.new(1, 0, 1, 0) page.BackgroundTransparency = 1 page.BorderSizePixel = 0 page.ScrollBarThickness = 3 page.ScrollBarImageColor3 = Theme.BorderLine page.CanvasSize = UDim2.new(0, 0, 0, 0) page.AutomaticCanvasSize = Enum.AutomaticSize.Y page.Visible = false local pageLayout = Instance.new("UIListLayout", page) pageLayout.SortOrder = Enum.SortOrder.LayoutOrder pageLayout.Padding = UDim.new(0, 6) TabPages[tabName] = page end -- ==================================================================== -- 🎛️ GLASS DECK UI HELPERS: CARDS & ROUNDED-SQUARE TOGGLES -- ==================================================================== local function createCard(parent, height) local card = Instance.new("Frame", parent) card.Size = UDim2.new(1, -4, 0, height) card.BackgroundColor3 = Theme.BgCard card.BackgroundTransparency = 0.2 local c = Instance.new("UICorner", card) c.CornerRadius = Theme.RadiusMd local s = Instance.new("UIStroke", card) s.Color = Theme.BorderLine s.Thickness = 1 return card end -- Glass Deck Toggle Switch (Rounded-square track, spring knob) local function createPillToggle(parent, title, desc, configKey, onToggle) local card = Instance.new("Frame", parent) card.Size = UDim2.new(1, -4, 0, 48) card.BackgroundColor3 = Theme.BgCard card.BackgroundTransparency = 0.2 local c = Instance.new("UICorner", card) c.CornerRadius = Theme.RadiusMd local s = Instance.new("UIStroke", card) s.Color = Theme.BorderLine s.Thickness = 1 card.MouseEnter:Connect(function() TweenService:Create(s, TweenInfo.new(0.15), {Color = Theme.BorderBright}):Play() end) card.MouseLeave:Connect(function() TweenService:Create(s, TweenInfo.new(0.15), {Color = Theme.BorderLine}):Play() end) local titleLbl = Instance.new("TextLabel", card) titleLbl.Size = UDim2.new(1, -64, 0, 18) titleLbl.Position = UDim2.new(0, 10, 0, 6) titleLbl.BackgroundTransparency = 1 titleLbl.Font = Enum.Font.GothamBold titleLbl.TextSize = 11.5 titleLbl.TextColor3 = Theme.TextBright titleLbl.TextXAlignment = Enum.TextXAlignment.Left titleLbl.Text = title local descLbl = Instance.new("TextLabel", card) descLbl.Size = UDim2.new(1, -64, 0, 14) descLbl.Position = UDim2.new(0, 10, 0, 25) descLbl.BackgroundTransparency = 1 descLbl.Font = Enum.Font.GothamMedium descLbl.TextSize = 9.5 descLbl.TextColor3 = Theme.TextDim descLbl.TextXAlignment = Enum.TextXAlignment.Left descLbl.Text = desc -- Rounded-square toggle switch local switchBtn = Instance.new("TextButton", card) switchBtn.Size = UDim2.new(0, 34, 0, 18) switchBtn.Position = UDim2.new(1, -44, 0.5, -9) switchBtn.BackgroundColor3 = Config[configKey] and Theme.Accent or Theme.BgSunken switchBtn.Text = "" switchBtn.AutoButtonColor = false local switchCorner = Instance.new("UICorner", switchBtn) switchCorner.CornerRadius = UDim.new(0, 5) local switchStroke = Instance.new("UIStroke", switchBtn) switchStroke.Color = Config[configKey] and Theme.AccentLight or Theme.BorderLine switchStroke.Thickness = 1 local knob = Instance.new("Frame", switchBtn) knob.Size = UDim2.new(0, 12, 0, 12) knob.Position = Config[configKey] and UDim2.new(1, -15, 0.5, -6) or UDim2.new(0, 3, 0.5, -6) knob.BackgroundColor3 = Config[configKey] and Theme.TextBright or Color3.fromRGB(130, 136, 148) local knobCorner = Instance.new("UICorner", knob) knobCorner.CornerRadius = UDim.new(0, 3) local function setVisual(isEnabled, silent) Config[configKey] = isEnabled local targetTrack = isEnabled and Theme.Accent or Theme.BgSunken local targetStroke = isEnabled and Theme.AccentLight or Theme.BorderLine local targetKnobPos = isEnabled and UDim2.new(1, -15, 0.5, -6) or UDim2.new(0, 3, 0.5, -6) local targetKnobColor = isEnabled and Theme.TextBright or Color3.fromRGB(130, 136, 148) TweenService:Create(switchBtn, TweenInfo.new(0.18, Enum.EasingStyle.Quad), {BackgroundColor3 = targetTrack}):Play() TweenService:Create(switchStroke, TweenInfo.new(0.18, Enum.EasingStyle.Quad), {Color = targetStroke}):Play() TweenService:Create(knob, TweenInfo.new(0.18, Enum.EasingStyle.Quad), {Position = targetKnobPos, BackgroundColor3 = targetKnobColor}):Play() if not silent then addLog(string.format("%s: %s", title, isEnabled and "ON" or "OFF")) end if onToggle then onToggle(isEnabled) end end ToggleSetters[configKey] = setVisual switchBtn.Activated:Connect(function() setVisual(not Config[configKey]) end) return card end -- ==================================================================== -- ⚔️ TAB 1: COMBAT PAGE -- ==================================================================== local combatPage = TabPages["Combat"] -- Target Dungeon Stage Stepper Card local stageCard = createCard(combatPage, 66) local stLabel = Instance.new("TextLabel", stageCard) stLabel.Size = UDim2.new(1, -20, 0, 14) stLabel.Position = UDim2.new(0, 10, 0, 6) stLabel.BackgroundTransparency = 1 stLabel.Font = Enum.Font.GothamBold stLabel.TextSize = 9 stLabel.TextColor3 = Theme.TextMuted stLabel.TextXAlignment = Enum.TextXAlignment.Left stLabel.Text = "TARGET DUNGEON STAGE" local pBtn = Instance.new("TextButton", stageCard) pBtn.Size = UDim2.new(0, 28, 0, 28) pBtn.Position = UDim2.new(0, 10, 0, 26) pBtn.BackgroundColor3 = Theme.BgSunken pBtn.Font = Enum.Font.GothamBold pBtn.Text = "◀" pBtn.TextColor3 = Theme.TextDim pBtn.TextSize = 11 local pc = Instance.new("UICorner", pBtn) pc.CornerRadius = Theme.RadiusSm local ps = Instance.new("UIStroke", pBtn) ps.Color = Theme.BorderLine ps.Thickness = 1 local sDisplay = Instance.new("TextLabel", stageCard) sDisplay.Size = UDim2.new(1, -210, 0, 28) sDisplay.Position = UDim2.new(0, 42, 0, 26) sDisplay.BackgroundColor3 = Theme.BgSunken sDisplay.Font = Enum.Font.Code sDisplay.TextSize = 11.5 sDisplay.TextColor3 = Theme.AccentLight sDisplay.Text = string.format("STAGE %02d", Config.SelectedStage) local sc = Instance.new("UICorner", sDisplay) sc.CornerRadius = Theme.RadiusSm local ss = Instance.new("UIStroke", sDisplay) ss.Color = Theme.BorderLine ss.Thickness = 1 local nBtn = Instance.new("TextButton", stageCard) nBtn.Size = UDim2.new(0, 28, 0, 28) nBtn.Position = UDim2.new(1, -164, 0, 26) nBtn.BackgroundColor3 = Theme.BgSunken nBtn.Font = Enum.Font.GothamBold nBtn.Text = "▶" nBtn.TextColor3 = Theme.TextDim nBtn.TextSize = 11 local nc = Instance.new("UICorner", nBtn) nc.CornerRadius = Theme.RadiusSm local ns = Instance.new("UIStroke", nBtn) ns.Color = Theme.BorderLine ns.Thickness = 1 local fightBtn = Instance.new("TextButton", stageCard) fightBtn.Size = UDim2.new(0, 64, 0, 28) fightBtn.Position = UDim2.new(1, -132, 0, 26) fightBtn.BackgroundColor3 = Theme.Accent fightBtn.Font = Enum.Font.GothamBold fightBtn.Text = "⚔ Fight" fightBtn.TextColor3 = Theme.TextBright fightBtn.TextSize = 10.5 local fc = Instance.new("UICorner", fightBtn) fc.CornerRadius = Theme.RadiusSm local fs = Instance.new("UIStroke", fightBtn) fs.Color = Theme.BorderAccent fs.Thickness = 1 local stopStageBtn = Instance.new("TextButton", stageCard) stopStageBtn.Size = UDim2.new(0, 62, 0, 28) stopStageBtn.Position = UDim2.new(1, -64, 0, 26) stopStageBtn.BackgroundColor3 = Theme.DangerDark stopStageBtn.Font = Enum.Font.GothamBold stopStageBtn.Text = "🛑 Stop" stopStageBtn.TextColor3 = Theme.TextBright stopStageBtn.TextSize = 10.5 local stpc = Instance.new("UICorner", stopStageBtn) stpc.CornerRadius = Theme.RadiusSm local stps = Instance.new("UIStroke", stopStageBtn) stps.Color = Theme.Danger stps.Thickness = 1 local function updateStageDisplay() sDisplay.Text = string.format("STAGE %02d", Config.SelectedStage) end pBtn.Activated:Connect(function() Config.SelectedStage = Config.SelectedStage - 1 if Config.SelectedStage < 1 then Config.SelectedStage = 22 end updateStageDisplay() end) nBtn.Activated:Connect(function() Config.SelectedStage = Config.SelectedStage + 1 if Config.SelectedStage > 22 then Config.SelectedStage = 1 end updateStageDisplay() end) fightBtn.Activated:Connect(function() Actions.StartStage(Config.SelectedStage) Config.AutoAttackMobs = true Config.AutoStageLoop = true if ToggleSetters["AutoStageLoop"] then ToggleSetters["AutoStageLoop"](true, true) end if ToggleSetters["AutoAttackMobs"] then ToggleSetters["AutoAttackMobs"](true, true) end end) stopStageBtn.Activated:Connect(function() Actions.StopStage() end) -- Frostbound Tower Action Card local towerCard = createCard(combatPage, 66) local twLabel = Instance.new("TextLabel", towerCard) twLabel.Size = UDim2.new(1, -20, 0, 14) twLabel.Position = UDim2.new(0, 10, 0, 6) twLabel.BackgroundTransparency = 1 twLabel.Font = Enum.Font.GothamBold twLabel.TextSize = 9 twLabel.TextColor3 = Theme.TextMuted twLabel.TextXAlignment = Enum.TextXAlignment.Left twLabel.Text = "FROSTBOUND TOWER (DUNGEON)" local clearTowerOnceBtn = Instance.new("TextButton", towerCard) clearTowerOnceBtn.Size = UDim2.new(1, -20, 0, 28) clearTowerOnceBtn.Position = UDim2.new(0, 10, 0, 26) clearTowerOnceBtn.BackgroundColor3 = Theme.Accent clearTowerOnceBtn.Font = Enum.Font.GothamBold clearTowerOnceBtn.Text = "❄️ Instant Clear 1 Tower Run (Rounds 1-30)" clearTowerOnceBtn.TextColor3 = Theme.TextBright clearTowerOnceBtn.TextSize = 10.5 local ctc = Instance.new("UICorner", clearTowerOnceBtn) ctc.CornerRadius = Theme.RadiusSm local cts = Instance.new("UIStroke", clearTowerOnceBtn) cts.Color = Theme.BorderAccent cts.Thickness = 1 clearTowerOnceBtn.Activated:Connect(function() task.spawn(function() Actions.PacketClearTower(1) end) end) -- Combat Pill Toggles createPillToggle(combatPage, "⚡ FAST PACKET ALL STAGES", "Nukes & claims all 22 stages simultaneously every second!", "FastPacketAllStages") createPillToggle(combatPage, "❄️ FAST PACKET FROSTBOUND TOWER", "Auto clears Frostbound Tower (Rounds 1-30) instantly via packets!", "FastPacketTower") createPillToggle(combatPage, "Auto Stage Loop", "Continuously clear selected stage and auto-restart", "AutoStageLoop", function(isEnabled) if not isEnabled then Actions.StopStage() end end) createPillToggle(combatPage, "Auto Attack & Skills", "Rotates normal attack and Weapon Skills (Q & E)", "AutoAttackMobs") createPillToggle(combatPage, "Hit All (Full-Room AoE)", "Hits every alive mob in the dungeon room simultaneously", "HitAllMobs") createPillToggle(combatPage, "One-Hit Kill (ตีทีเดียวตาย)", "Instantly defeats all enemies in a single blow", "OneHitKill") createPillToggle(combatPage, "God Mode (Invulnerable)", "Safe floating + damage block, zero damage taken", "GodMode") -- ==================================================================== -- ⚡ TAB 2: TRAINING PAGE -- ==================================================================== local trainPage = TabPages["Training"] -- Speed Mode Selector local speedCard = createCard(trainPage, 62) local spTitle = Instance.new("TextLabel", speedCard) spTitle.Size = UDim2.new(1, -20, 0, 14) spTitle.Position = UDim2.new(0, 10, 0, 6) spTitle.BackgroundTransparency = 1 spTitle.Font = Enum.Font.GothamBold spTitle.TextSize = 9 spTitle.TextColor3 = Theme.TextMuted spTitle.TextXAlignment = Enum.TextXAlignment.Left spTitle.Text = "TRAINING SPEED RATE (TICK DELAY)" local speeds = {"HYPER", "TURBO", "FAST", "NORMAL"} local speedBtns = {} local speedStrokes = {} local function setSpeed(s) Config.SpeedMode = s if s == "HYPER" then Config.TrainDelay = 0.12 elseif s == "TURBO" then Config.TrainDelay = 0.15 elseif s == "FAST" then Config.TrainDelay = 0.20 else Config.TrainDelay = 0.35 end for name, b in pairs(speedBtns) do local isSel = (name == s) b.BackgroundColor3 = isSel and Theme.Accent or Theme.BgSunken b.TextColor3 = isSel and Theme.TextBright or Theme.TextDim if speedStrokes[name] then speedStrokes[name].Color = isSel and Theme.BorderAccent or Theme.BorderLine end end addLog("Training Rate: " .. s) end for idx, sName in ipairs(speeds) do local b = Instance.new("TextButton", speedCard) b.Size = UDim2.new(0.25, -4, 0, 26) b.Position = UDim2.new((idx - 1) * 0.25, 2, 0, 26) b.BackgroundColor3 = (Config.SpeedMode == sName) and Theme.Accent or Theme.BgSunken b.Font = Enum.Font.GothamBold b.Text = sName b.TextColor3 = (Config.SpeedMode == sName) and Theme.TextBright or Theme.TextDim b.TextSize = 9.5 local bc = Instance.new("UICorner", b) bc.CornerRadius = Theme.RadiusSm local bs = Instance.new("UIStroke", b) bs.Color = (Config.SpeedMode == sName) and Theme.BorderAccent or Theme.BorderLine bs.Thickness = 1 speedStrokes[sName] = bs b.Activated:Connect(function() setSpeed(sName) end) speedBtns[sName] = b end createPillToggle(trainPage, "Auto Fast Train", "Continuous power farming simultaneously", "AutoTrain", function(isEnabled) if not isEnabled then Actions.StopTrain() end end) createPillToggle(trainPage, "Auto Rebirth", "Rebirths automatically when requirement is reached", "AutoRebirth") createPillToggle(trainPage, "Anti-AFK Protection", "Prevents 20-minute disconnect kicks", "AntiAFK") -- ==================================================================== -- 🎒 TAB 3: FARMING & LOOT PAGE -- ==================================================================== local farmPage = TabPages["Farming"] -- Quick Actions Grid local actionCard = createCard(farmPage, 74) local actTitle = Instance.new("TextLabel", actionCard) actTitle.Size = UDim2.new(1, -20, 0, 14) actTitle.Position = UDim2.new(0, 10, 0, 6) actTitle.BackgroundTransparency = 1 actTitle.Font = Enum.Font.GothamBold actTitle.TextSize = 9 actTitle.TextColor3 = Theme.TextMuted actTitle.TextXAlignment = Enum.TextXAlignment.Left actTitle.Text = "QUICK ACTIONS" local function createQuickAction(name, xPos, color, strokeColor, cb) local b = Instance.new("TextButton", actionCard) b.Size = UDim2.new(0.25, -4, 0, 36) b.Position = UDim2.new(xPos, 2, 0, 26) b.BackgroundColor3 = color b.Font = Enum.Font.GothamBold b.Text = name b.TextColor3 = Theme.TextBright b.TextSize = 9.5 local bc = Instance.new("UICorner", b) bc.CornerRadius = Theme.RadiusSm local bs = Instance.new("UIStroke", b) bs.Color = strokeColor or Theme.BorderLine bs.Thickness = 1 b.Activated:Connect(cb) return b end createQuickAction("🎒 Sell Bag", 0, Theme.DangerDark, Theme.Danger, function() Actions.SellAll() end) createQuickAction("⛏️ Get Ores", 0.25, Theme.Accent, Theme.BorderAccent, function() Actions.ClaimAllOres() end) createQuickAction("🧹 Junk Ores", 0.5, Theme.BgSunken, Theme.Warn, function() Actions.SellJunkOres() end) createQuickAction("🎁 Gifts", 0.75, Theme.BgSunken, Theme.BorderLine, function() Actions.ClaimAllGifts() end) -- Ore Rarity Filter Card local oreFilterCard = createCard(farmPage, 62) local ofTitle = Instance.new("TextLabel", oreFilterCard) ofTitle.Size = UDim2.new(1, -20, 0, 14) ofTitle.Position = UDim2.new(0, 10, 0, 6) ofTitle.BackgroundTransparency = 1 ofTitle.Font = Enum.Font.GothamBold ofTitle.TextSize = 9 ofTitle.TextColor3 = Theme.TextMuted ofTitle.TextXAlignment = Enum.TextXAlignment.Left ofTitle.Text = "MINIMUM ORE RARITY FILTER (ระดับแร่เป้าหมาย)" local rarityTiers = { { Label = "⭐ SECRET+ (8+)", Rarity = 8 }, { Label = "✨ ETERNAL+ (7+)", Rarity = 7 }, { Label = "🟣 MYTHIC+ (6+)", Rarity = 6 }, } local rarityBtns = {} local rarityStrokes = {} local function setRarityFilter(r) Config.MinOreRarity = r for _, item in ipairs(rarityTiers) do local isSel = (item.Rarity == r) local b = rarityBtns[item.Rarity] if b then b.BackgroundColor3 = isSel and Theme.Accent or Theme.BgSunken b.TextColor3 = isSel and Theme.TextBright or Theme.TextDim end if rarityStrokes[item.Rarity] then rarityStrokes[item.Rarity].Color = isSel and Theme.BorderAccent or Theme.BorderLine end end addLog(string.format("Ore Target: Rarity %d+ only!", r)) end for idx, item in ipairs(rarityTiers) do local b = Instance.new("TextButton", oreFilterCard) b.Size = UDim2.new(0.333, -4, 0, 26) b.Position = UDim2.new((idx - 1) * 0.333, 2, 0, 26) b.BackgroundColor3 = (Config.MinOreRarity == item.Rarity) and Theme.Accent or Theme.BgSunken b.Font = Enum.Font.GothamBold b.Text = item.Label b.TextColor3 = (Config.MinOreRarity == item.Rarity) and Theme.TextBright or Theme.TextDim b.TextSize = 9 local bc = Instance.new("UICorner", b) bc.CornerRadius = Theme.RadiusSm local bs = Instance.new("UIStroke", b) bs.Color = (Config.MinOreRarity == item.Rarity) and Theme.BorderAccent or Theme.BorderLine bs.Thickness = 1 rarityStrokes[item.Rarity] = bs b.Activated:Connect(function() setRarityFilter(item.Rarity) end) rarityBtns[item.Rarity] = b end createPillToggle(farmPage, "💎 Only Highest Tier Ores (เก็บเฉพาะแร่ระดับสูงสุด)", "Skips all low tier ores (Common-Legendary/Mythic) and exclusively collects highest tiers", "OnlyHighestOres") createPillToggle(farmPage, "🧹 Auto Sell Junk Ores (ขายแร่ขยะอัตโนมัติ)", "Continuously purges any bag ores below the selected rarity threshold into coins", "AutoSellJunkOres") createPillToggle(farmPage, "🎯 SuperLoot Boss Sniper", "Auto snipes secret bosses & forces Eternal/Secret ore drops!", "SuperLootSniper") createPillToggle(farmPage, "🧲 Fast Ore Magnet Aura", "Instantly triggers and collects all ore drops across the entire map", "OreMagnet") createPillToggle(farmPage, "🏃 Movement Speed Boost (50 WalkSpeed)", "Enforces 2x run speed safely without anti-cheat rubberbanding", "SpeedBoost") createPillToggle(farmPage, "🧪 Auto Potion Engine", "Auto consumes Damage, Luck, Train & Coin boost potions", "AutoPotion") createPillToggle(farmPage, "⭐ Auto Upgrade Stats", "Automatically upgrades permanent Luck, Pack & Train stats", "AutoUpgradeStats") createPillToggle(farmPage, "Auto Collect Ores", "Dual-engine instant loot collection from drops", "AutoClaimOres") createPillToggle(farmPage, "Auto Claim Free Gifts", "Periodically claims online/offline gifts, index & tickets", "AutoClaimRewards") createPillToggle(farmPage, "Auto Sell Bag", "Periodically cleans bag to prevent inventory overflow", "AutoSellBag") -- ==================================================================== -- 🔨 TAB 4: FORGE & WEAPON MASTER PAGE -- ==================================================================== local forgePage = TabPages["Forge"] -- 1. Status & Target Gear Card (Weapon + Armor + Helmet) local forgeStatusCard = createCard(forgePage, 134) local fsTitle = Instance.new("TextLabel", forgeStatusCard) fsTitle.Size = UDim2.new(1, -20, 0, 14) fsTitle.Position = UDim2.new(0, 10, 0, 6) fsTitle.BackgroundTransparency = 1 fsTitle.Font = Enum.Font.GothamBold fsTitle.TextSize = 9 fsTitle.TextColor3 = Theme.TextMuted fsTitle.TextXAlignment = Enum.TextXAlignment.Left fsTitle.Text = "EQUIPPED GEAR STATUS & FORGE ENGINE" local fsWeapon = Instance.new("TextLabel", forgeStatusCard) fsWeapon.Size = UDim2.new(1, -20, 0, 15) fsWeapon.Position = UDim2.new(0, 10, 0, 22) fsWeapon.BackgroundTransparency = 1 fsWeapon.Font = Enum.Font.GothamBold fsWeapon.TextSize = 10.5 fsWeapon.TextColor3 = Theme.AccentLight fsWeapon.TextXAlignment = Enum.TextXAlignment.Left fsWeapon.Text = "🗡️ Weapon: Scanning..." local fsArmor = Instance.new("TextLabel", forgeStatusCard) fsArmor.Size = UDim2.new(1, -20, 0, 15) fsArmor.Position = UDim2.new(0, 10, 0, 39) fsArmor.BackgroundTransparency = 1 fsArmor.Font = Enum.Font.GothamBold fsArmor.TextSize = 10.5 fsArmor.TextColor3 = Theme.Ok fsArmor.TextXAlignment = Enum.TextXAlignment.Left fsArmor.Text = "🛡️ Armor: Scanning..." local fsHat = Instance.new("TextLabel", forgeStatusCard) fsHat.Size = UDim2.new(1, -20, 0, 15) fsHat.Position = UDim2.new(0, 10, 0, 56) fsHat.BackgroundTransparency = 1 fsHat.Font = Enum.Font.GothamBold fsHat.TextSize = 10.5 fsHat.TextColor3 = Theme.Warn fsHat.TextXAlignment = Enum.TextXAlignment.Left fsHat.Text = "👑 Helmet: Scanning..." local fsTarget = Instance.new("TextLabel", forgeStatusCard) fsTarget.Size = UDim2.new(1, -20, 0, 15) fsTarget.Position = UDim2.new(0, 10, 0, 73) fsTarget.BackgroundTransparency = 1 fsTarget.Font = Enum.Font.GothamMedium fsTarget.TextSize = 9.5 fsTarget.TextColor3 = Theme.TextDim fsTarget.TextXAlignment = Enum.TextXAlignment.Left fsTarget.Text = "🎯 Goals: Bone Carver(150), Verdant Bark(67), Grove Warden(67)" local fsOres = Instance.new("TextLabel", forgeStatusCard) fsOres.Size = UDim2.new(1, -20, 0, 36) fsOres.Position = UDim2.new(0, 10, 0, 90) fsOres.BackgroundTransparency = 1 fsOres.Font = Enum.Font.Gotham fsOres.TextSize = 9.5 fsOres.TextColor3 = Theme.TextMuted fsOres.TextXAlignment = Enum.TextXAlignment.Left fsOres.TextYAlignment = Enum.TextYAlignment.Top fsOres.TextWrapped = true fsOres.Text = "💎 Top Ores: Scanning inventory..." -- 2. Target Mode Selector Card local modeCard = createCard(forgePage, 62) local modeTitle = Instance.new("TextLabel", modeCard) modeTitle.Size = UDim2.new(1, -20, 0, 14) modeTitle.Position = UDim2.new(0, 10, 0, 6) modeTitle.BackgroundTransparency = 1 modeTitle.Font = Enum.Font.GothamBold modeTitle.TextSize = 9 modeTitle.TextColor3 = Theme.TextMuted modeTitle.TextXAlignment = Enum.TextXAlignment.Left modeTitle.Text = "AUTO FORGE TARGET TYPE" local modeBtns = {} local modeStrokes = {} local function setForgeMode(m) Config.ForgeTargetMode = m for name, b in pairs(modeBtns) do local isSel = (name == m) b.BackgroundColor3 = isSel and Theme.Accent or Theme.BgSunken b.TextColor3 = isSel and Theme.TextBright or Theme.TextDim if modeStrokes[name] then modeStrokes[name].Color = isSel and Theme.BorderAccent or Theme.BorderLine end end addLog("Forge Target: " .. m) end local modeList = { { ID = "CYCLE", Text = "👑 All Gear" }, { ID = "WEAPON", Text = "⚔️ Swords" }, { ID = "ARMOR", Text = "🛡️ Armor/Helm" } } for idx, item in ipairs(modeList) do local b = Instance.new("TextButton", modeCard) b.Size = UDim2.new(0.333, -4, 0, 26) b.Position = UDim2.new((idx - 1) * 0.333, 2, 0, 26) b.BackgroundColor3 = (Config.ForgeTargetMode == item.ID) and Theme.Accent or Theme.BgSunken b.Font = Enum.Font.GothamBold b.Text = item.Text b.TextColor3 = (Config.ForgeTargetMode == item.ID) and Theme.TextBright or Theme.TextDim b.TextSize = 9.5 local bc = Instance.new("UICorner", b) bc.CornerRadius = Theme.RadiusSm local bs = Instance.new("UIStroke", b) bs.Color = (Config.ForgeTargetMode == item.ID) and Theme.BorderAccent or Theme.BorderLine bs.Thickness = 1 modeStrokes[item.ID] = bs b.Activated:Connect(function() setForgeMode(item.ID) end) modeBtns[item.ID] = b end -- 3. Quick Actions Grid local forgeActionCard = createCard(forgePage, 74) local faTitle = Instance.new("TextLabel", forgeActionCard) faTitle.Size = UDim2.new(1, -20, 0, 14) faTitle.Position = UDim2.new(0, 10, 0, 6) faTitle.BackgroundTransparency = 1 faTitle.Font = Enum.Font.GothamBold faTitle.TextSize = 9 faTitle.TextColor3 = Theme.TextMuted faTitle.TextXAlignment = Enum.TextXAlignment.Left faTitle.Text = "FORGE ACTIONS" local function createForgeBtn(name, xPos, color, strokeColor, widthScale, cb) local b = Instance.new("TextButton", forgeActionCard) b.Size = UDim2.new(widthScale or 0.25, -4, 0, 36) b.Position = UDim2.new(xPos, 2, 0, 26) b.BackgroundColor3 = color b.Font = Enum.Font.GothamBold b.Text = name b.TextColor3 = Theme.TextBright b.TextSize = 9.5 local bc = Instance.new("UICorner", b) bc.CornerRadius = Theme.RadiusSm local bs = Instance.new("UIStroke", b) bs.Color = strokeColor or Theme.BorderLine bs.Thickness = 1 b.Activated:Connect(cb) return b end createForgeBtn("🔨 Sword", 0, Theme.Accent, Theme.BorderAccent, 0.25, function() Actions.ForgeBestWeapon() end) createForgeBtn("🛡️ Armor", 0.25, Theme.BgSunken, Theme.BorderLine, 0.25, function() Actions.ForgeBestArmor() end) createForgeBtn("👑 Best", 0.5, Theme.BgSunken, Theme.BorderLine, 0.25, function() Actions.EquipAllBestGearInBag() end) createForgeBtn("🧹 Junk", 0.75, Theme.DangerDark, Theme.Danger, 0.25, function() Actions.SellWeakerAndDuplicateGear() end) -- 4. Pill Toggles createPillToggle(forgePage, "⚡ Auto Forge Best Gear", "Auto crafts selected gear (Swords, Armor & Hats)", "AutoForgeBestWeapon") createPillToggle(forgePage, "🏆 Auto Equip If Better", "Auto equips forged gear if Power/Stats > equipped", "AutoEquipBestWeapon") createPillToggle(forgePage, "🧹 Auto Sell Weaker & Duplicates", "Auto sells gear that is weaker than equipped or duplicate", "AutoSellJunkGear") createPillToggle(forgePage, "🔄 Auto Restock Ores", "Auto clears Stage 17 if high-tier ores < 4", "AutoRestockOres") -- 5. Recent Forge History Card local forgeLogCard = createCard(forgePage, 108) local flTitle = Instance.new("TextLabel", forgeLogCard) flTitle.Size = UDim2.new(1, -20, 0, 14) flTitle.Position = UDim2.new(0, 10, 0, 6) flTitle.BackgroundTransparency = 1 flTitle.Font = Enum.Font.GothamBold flTitle.TextSize = 9 flTitle.TextColor3 = Theme.TextMuted flTitle.TextXAlignment = Enum.TextXAlignment.Left flTitle.Text = "RECENT FORGE LOG" local flContent = Instance.new("TextLabel", forgeLogCard) flContent.Size = UDim2.new(1, -20, 1, -26) flContent.Position = UDim2.new(0, 10, 0, 22) flContent.BackgroundTransparency = 1 flContent.Font = Enum.Font.Code flContent.TextSize = 9.5 flContent.TextColor3 = Theme.TextDim flContent.TextXAlignment = Enum.TextXAlignment.Left flContent.TextYAlignment = Enum.TextYAlignment.Top flContent.TextWrapped = true flContent.Text = "No gear forged yet this session." -- ==================================================================== -- 📊 TAB 5: DASHBOARD & LIVE STATS -- ==================================================================== local dashPage = TabPages["Dashboard"] local statCard = createCard(dashPage, 116) local dashTitle = Instance.new("TextLabel", statCard) dashTitle.Size = UDim2.new(1, -20, 0, 14) dashTitle.Position = UDim2.new(0, 10, 0, 6) dashTitle.BackgroundTransparency = 1 dashTitle.Font = Enum.Font.GothamBold dashTitle.TextSize = 9 dashTitle.TextColor3 = Theme.TextMuted dashTitle.TextXAlignment = Enum.TextXAlignment.Left dashTitle.Text = "LIVE PLAYER TELEMETRY" local function createStatRow(yPos, color) local l = Instance.new("TextLabel", statCard) l.Size = UDim2.new(1, -20, 0, 18) l.Position = UDim2.new(0, 10, 0, yPos) l.BackgroundTransparency = 1 l.Font = Enum.Font.Code l.TextSize = 10.5 l.TextColor3 = color l.TextXAlignment = Enum.TextXAlignment.Left return l end local dRow1 = createStatRow(24, Theme.AccentLight) local dRow2 = createStatRow(44, Theme.Ok) local dRow3 = createStatRow(64, Theme.TextMain) local dRow4 = createStatRow(84, Theme.TextDim) -- Live Log Card (Terminal Console Well) local logCard = createCard(dashPage, 186) local logTitle = Instance.new("TextLabel", logCard) logTitle.Size = UDim2.new(1, -20, 0, 14) logTitle.Position = UDim2.new(0, 10, 0, 6) logTitle.BackgroundTransparency = 1 logTitle.Font = Enum.Font.GothamBold logTitle.TextSize = 9 logTitle.TextColor3 = Theme.TextMuted logTitle.TextXAlignment = Enum.TextXAlignment.Left logTitle.Text = "ACTIVITY TERMINAL CONSOLE" local logWell = Instance.new("Frame", logCard) logWell.Size = UDim2.new(1, -16, 1, -26) logWell.Position = UDim2.new(0, 8, 0, 20) logWell.BackgroundColor3 = Theme.BgSunkenDeep local LwCorner = Instance.new("UICorner", logWell) LwCorner.CornerRadius = Theme.RadiusSm local LwStroke = Instance.new("UIStroke", logWell) LwStroke.Color = Theme.BorderLine LwStroke.Thickness = 1 local logContent = Instance.new("TextLabel", logWell) logContent.Size = UDim2.new(1, -12, 1, -10) logContent.Position = UDim2.new(0, 6, 0, 5) logContent.BackgroundTransparency = 1 logContent.Font = Enum.Font.Code logContent.TextSize = 9.5 logContent.TextColor3 = Theme.TextMain logContent.TextXAlignment = Enum.TextXAlignment.Left logContent.TextYAlignment = Enum.TextYAlignment.Top logContent.TextWrapped = true logContent.Text = "System active and listening..." -- Telemetry Updater Loop table.insert(Runtime.Threads, task.spawn(function() while Runtime.Running do pcall(function() local p = getEcoStat("power") local l = getEcoStat("level") local r = getEcoStat("rebirth") local c = getEcoStat("coin") dRow1.Text = string.format("Power: %s | Level: %s", formatNumber(p), tostring(l)) dRow2.Text = string.format("Rebirth: %s | Coins: %s", formatNumber(r), formatNumber(c)) dRow3.Text = string.format("Trained: %d | Forged: %d | Ores: %d", Runtime.TotalTrained, Runtime.TotalWeaponsForged, Runtime.TotalOresClaimed) dRow4.Text = string.format("Stage: %d | Tower: %d Runs (%d Rounds)", Config.SelectedStage, Runtime.TotalTowerRuns, Runtime.TotalTowerRounds) if #Runtime.Logs > 0 then local slice = {} for i = 1, math.min(7, #Runtime.Logs) do table.insert(slice, Runtime.Logs[i]) end logContent.Text = table.concat(slice, "\n") end -- Update Forge Live Status for all 3 gear slots local gear = Actions.GetEquippedGearStats() if gear and gear.Weapon then fsWeapon.Text = string.format("🗡️ Weapon: %s [%s | Power: %d]", gear.Weapon.Name, gear.Weapon.Rarity, gear.Weapon.DesignPower) else fsWeapon.Text = "🗡️ Weapon: None" end if gear and gear.Armor then fsArmor.Text = string.format("🛡️ Armor: %s [%s | Power: %d | Def +%d%%]", gear.Armor.Name, gear.Armor.Rarity, gear.Armor.DesignPower, math.floor(gear.Armor.AttriNum * 100)) else fsArmor.Text = "🛡️ Armor: None" end if gear and gear.Hat then fsHat.Text = string.format("👑 Helmet: %s [%s | Power: %d | Pwr +%d%%]", gear.Hat.Name, gear.Hat.Rarity, gear.Hat.DesignPower, math.floor(gear.Hat.AttriNum * 100)) else fsHat.Text = "👑 Helmet: None" end local _, totalCount, allOres = Actions.GetBestOresForForge() if allOres and #allOres > 0 then local topNames = {} for i = 1, math.min(3, #allOres) do table.insert(topNames, string.format("%s(x%d, P%d)", allOres[i].ID, allOres[i].Count, allOres[i].Power)) end fsOres.Text = string.format("💎 Ready Ores: %s... (Total: %d)", table.concat(topNames, ", "), totalCount) else fsOres.Text = "💎 Ready Ores: None in bag (Click Restock!)" end if #Runtime.ForgeHistory > 0 then local histLines = {} for i = 1, math.min(4, #Runtime.ForgeHistory) do local h = Runtime.ForgeHistory[i] local tag = h.Equipped and "[EQUIPPED]" or "[KEPT]" local typePrefix = h.Type and ("[" .. h.Type:upper() .. "] ") or "" table.insert(histLines, string.format("[%s] %s%s %s (%s, Pwr %d)", h.Time, typePrefix, tag, h.Name, h.Rarity, h.Power)) end flContent.Text = table.concat(histLines, "\n") end end) task.wait(0.4) end end)) -- ==================================================================== -- 🧹 GLOBAL CLEANUP -- ==================================================================== _G.LootToForgeCleanup = function() Runtime.Running = false pcall(function() Actions.StopStage() end) if _G.OriginalCameraShake then CameraUtils.PosShakeOnce = _G.OriginalCameraShake.PosShakeOnce CameraUtils.DirShakeOnce = _G.OriginalCameraShake.DirShakeOnce CameraUtils.NonShakeOnce = _G.OriginalCameraShake.NonShakeOnce CameraUtils.MoveShake = _G.OriginalCameraShake.MoveShake end if _G.OriginalDamageOnce then HPCTRL.DamageOnce = _G.OriginalDamageOnce end if _G.OriginalCCPlrDamage and CalculateUtils then CalculateUtils.CCPlrDamage = _G.OriginalCCPlrDamage end if _G.OriginalTryFireDamageEvent and DamageUtils then DamageUtils.TryFireDamageEvent = _G.OriginalTryFireDamageEvent end local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if hrp then local bv = hrp:FindFirstChild("CombatHoverVelocity") if bv then bv:Destroy() end end for _, t in ipairs(Runtime.Threads) do pcall(function() task.cancel(t) end) end for _, c in ipairs(Runtime.Connections) do pcall(function() c:Disconnect() end) end if ScreenGui then ScreenGui:Destroy() end print("🧹 [Hub V3] Cleaned up previous session.") end -- Set Initial Active Tab switchTab("Combat") _G.LootToForge = { Config = Config, Runtime = Runtime, Actions = Actions, ScreenGui = ScreenGui, MainFrame = MainFrame } addLog("Hub V3 Online: All systems operational.") print("✅ [Loot To Forge Hub V3] Professional UI & Concurrent System Loaded!") return _G.LootToForge