local auto_merge = true
local merge_speed = 0.15 -- seconds
local auto_upgrade = true
local auto_lock_base = true
local Players = game:GetService("Players")
local RS = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
local player = Players.LocalPlayer
local nr = RS:WaitForChild("NukeRemotes")
local pickup = nr:WaitForChild("PickUp")
local merge = nr:WaitForChild("MergeRequest")
local upgradeR = nr:FindFirstChild("PurchaseUpgrade")
local lockR = nr:FindFirstChild("RequestLockBase")
local HoldingUI = (function() local ok, m = pcall(require, RS.Controllers.HoldingUI) return ok and m or nil end)()
local NukeCtl = (function() local ok, m = pcall(require, RS.Controllers.NukeController) return ok and m or nil end)()
local function root()
local c = player.Character
return c and c:FindFirstChild("HumanoidRootPart")
end
local function myBase()
local bases = Workspace:FindFirstChild("Bases")
if not bases then return nil end
for _, b in ipairs(bases:GetChildren()) do
if b:GetAttribute("OwnerUserId") == player.UserId then return b end
end
return nil
end
local function myNukes()
local b = myBase()
return b and b:FindFirstChild("Nukes")
end
local function tpTo(part)
local hrp = root()
if not (hrp and part) then return end
local np = part:GetPivot().Position
local dir = Vector3.new(hrp.Position.X - np.X, 0, hrp.Position.Z - np.Z)
if dir.Magnitude < 0.1 then dir = Vector3.new(1, 0, 0) end
dir = dir.Unit
local stand = np + dir * 4 + Vector3.new(0, 3, 0)
hrp.CFrame = CFrame.lookAt(stand, Vector3.new(np.X, stand.Y, np.Z))
end
local function isMergeable(n)
if n:GetAttribute("Locked") == true then return false end
return n:GetAttribute("Tier") ~= nil
end
local function tierGroups()
local folder = myNukes()
local g = {}
if not folder then return g end
for _, n in ipairs(folder:GetChildren()) do
if isMergeable(n) then
local t = n:GetAttribute("Tier")
g[t] = g[t] or {}
g[t][#g[t] + 1] = n
end
end
return g
end
local function dropHeld()
if HoldingUI and HoldingUI.RequestDrop then
pcall(function() HoldingUI.RequestDrop() end)
end
end
local function heldNukeTier()
if not NukeCtl or not NukeCtl.GetHeld then return nil end
local ok, held = pcall(function() return NukeCtl:GetHeld(player) end)
if ok and held then return held.Tier end
return nil
end
local function placedOfTier(tier)
local folder = myNukes()
if not folder then return nil end
for _, n in ipairs(folder:GetChildren()) do
if n.Parent ~= nil and isMergeable(n) and n:GetAttribute("Tier") == tier then
return n
end
end
return nil
end
local function mergeStep()
local hrp = root()
if not (hrp and pickup and merge) then return false end
local ht = heldNukeTier()
if ht ~= nil then
local b = placedOfTier(ht)
if b then
tpTo(b); task.wait(merge_speed)
merge:FireServer(b); task.wait(merge_speed)
else
dropHeld(); task.wait(merge_speed)
end
return true
end
local g = tierGroups()
for tier = 1, 30 do
if g[tier] and #g[tier] >= 2 then
local a = g[tier][1]
tpTo(a); task.wait(merge_speed)
pickup:FireServer(a); task.wait(merge_speed)
return true
end
end
return false
end
if auto_merge then
task.spawn(function()
while true do
if not mergeStep() then task.wait(0.5) end
task.wait(0.05)
end
end)
end
if auto_upgrade and upgradeR then
task.spawn(function()
while true do
for _, key in ipairs({ "TIER", "MAX", "LOCKBASE" }) do
pcall(function() upgradeR:FireServer(key) end)
end
task.wait(1)
end
end)
end
if auto_lock_base and lockR then
task.spawn(function()
while true do
local b = myBase()
if b and b:GetAttribute("BaseLocked") ~= true then
pcall(function() lockR:FireServer() end)
end
task.wait(1)
end
end)
end