local CaptureDistance = 40
local UpdateRate = 0.5
local MAIN_MENU_PLACE_ID = 118884121023860
local TELEPORT_DELAY_AFTER_SOUND = 3
local PLAYER_WEIGHT = 1
local DEFENDER_NPC_WEIGHT = 0.6
local ATTACKER_NPC_WEIGHT = 0.6
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local TeamsService = game:GetService("Teams")
local RunService = game:GetService("RunService")
local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PointChangedEvent = ReplicatedStorage:FindFirstChild("PointChanged")
if not PointChangedEvent then
PointChangedEvent = Instance.new("BindableEvent")
PointChangedEvent.Name = "PointChanged"
PointChangedEvent.Parent = ReplicatedStorage
end
local CaptureValues = {}
local PartIndex = {}
local Locked = {}
local RobotsDefender = {}
local RobotsAttacker = {}
local parts = {}
for _, child in ipairs(script.Parent:GetChildren()) do
if child:IsA("BasePart") or child:IsA("Part") then
table.insert(parts, child)
end
end
table.sort(parts, function(a,b) return a.Name < b.Name end)
local function Tween(Obj, Prop, New, Time)
Time = Time or 0.1
local Tweened = TweenService:Create(Obj, TweenInfo.new(Time, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {[Prop] = New})
Tweened:Play()
return {Stop = function() Tweened:Cancel() end}
end
local function UpdateRobotList()
RobotsDefender = {}
RobotsAttacker = {}
for _, v in ipairs(workspace:GetDescendants()) do
if v:IsA("Model") and v:FindFirstChildOfClass("Humanoid") and v:FindFirstChild("HumanoidRootPart") then
local name = v.Name or ""
if name:find("Arctic Wolf") then
table.insert(RobotsDefender, v)
elseif name:find("SonsOfHorus") then
table.insert(RobotsAttacker, v)
elseif name:find("CT-") then
table.insert(RobotsDefender, v)
elseif name:find("B1-") or name:find("B2-") then
table.insert(RobotsAttacker, v)
end
end
end
end
UpdateRobotList()
Players.PlayerAdded:Connect(function(plr)
plr.CharacterAdded:Connect(function()
task.delay(2, UpdateRobotList)
end)
end)
local function GetPlayersNear(Pos)
local DefenderCount = 0
local AttackerCount = 0
for _, player in ipairs(Players:GetPlayers()) do
if player.Character and player.Character:FindFirstChild("HumanoidRootPart") and player.Character:FindFirstChildOfClass("Humanoid") then
if (player.Character.HumanoidRootPart.Position - Pos).Magnitude <= CaptureDistance then
if player.Team then
if player.Team.Name == "Emperor" then
DefenderCount = DefenderCount + PLAYER_WEIGHT
elseif player.Team.Name == "Horus" then
AttackerCount = AttackerCount + PLAYER_WEIGHT
end
end
end
end
end
return DefenderCount, AttackerCount
end
local function GetDefenderNPCsNear(Pos)
local Near = 0
for _, ally in ipairs(RobotsDefender) do
if ally and ally.Parent and ally:FindFirstChild("HumanoidRootPart") and ally:FindFirstChildOfClass("Humanoid") then
if (ally.HumanoidRootPart.Position - Pos).Magnitude <= CaptureDistance then
Near = Near + DEFENDER_NPC_WEIGHT
end
end
end
return Near
end
local function GetAttackerNPCsNear(Pos)
local Near = 0
for _, enemy in ipairs(RobotsAttacker) do
if enemy and enemy.Parent and enemy:FindFirstChild("HumanoidRootPart") and enemy:FindFirstChildOfClass("Humanoid") then
if (enemy.HumanoidRootPart.Position - Pos).Magnitude <= CaptureDistance then
Near = Near + ATTACKER_NPC_WEIGHT
end
end
end
return Near
end
for index, part in ipairs(parts) do
local capVal = part:FindFirstChild("Captured")
local isRep = part:FindFirstChild("IsRepublic")
local hudBar = nil
if part:FindFirstChild("HUD") and part.HUD:FindFirstChild("Capturing") then
hudBar = part.HUD.Capturing
end
if capVal and isRep and hudBar then
capVal.Value = 100
isRep.Value = true
Locked[part] = false
table.insert(CaptureValues, {Part = part, Captured = capVal, IsRepublic = isRep, HUD = hudBar})
PartIndex[part] = #CaptureValues
else
warn("Capture part missing children:", part:GetFullName())
end
end
local function PreviousIsCapturedByAttackers(index)
if index <= 1 then return true end
local prev = CaptureValues[index - 1]
if prev then
return (prev.Captured.Value >= 100) and (prev.IsRepublic.Value == false)
end
return false
end
local function ShowFallback(fallbackName)
print("Showing fallback:", fallbackName)
for _, player in ipairs(Players:GetPlayers()) do
if player:FindFirstChild("PlayerGui") and player.PlayerGui:FindFirstChild("CaptureSystem") then
local gui = player.PlayerGui.CaptureSystem
if gui:FindFirstChild(fallbackName) then
gui[fallbackName].Visible = true
task.delay(4, function()
if gui:FindFirstChild(fallbackName) then
gui[fallbackName].Visible = false
end
end)
end
end
end
local fbSound = script.Parent:FindFirstChild("FallbackSound")
if fbSound and fbSound:IsA("Sound") then
fbSound:Play()
end
end
local function Connection(entry)
local Part = entry.Part
local CapturedValue = entry.Captured
local IsRepublic = entry.IsRepublic
local HUDBar = entry.HUD
local idx = PartIndex[Part]
task.spawn(function()
local LastCaptureValue = CapturedValue.Value
while Part and Part.Parent do
task.wait(0.1)
if HUDBar and CapturedValue then
if LastCaptureValue ~= CapturedValue.Value then
local size = math.clamp(CapturedValue.Value / 100, 0, 1)
Tween(HUDBar, "Size", UDim2.new(1, 0, size, 0), 0.12)
LastCaptureValue = CapturedValue.Value
end
else
break
end
end
end)
while Part and Part.Parent do
task.wait(UpdateRate)
if math.random(1, 12) == 1 then
UpdateRobotList()
end
local playerDefenders, playerAttackers = GetPlayersNear(Part.Position)
local defendersNearby = playerDefenders + GetDefenderNPCsNear(Part.Position)
local attackersNearby = playerAttackers + GetAttackerNPCsNear(Part.Position)
if CapturedValue.Value > 100 then CapturedValue.Value = 100 end
if CapturedValue.Value < 0 then CapturedValue.Value = 0 end
if CapturedValue.Value < 1 and not Locked[Part] then
if defendersNearby > attackersNearby then
IsRepublic.Value = true
elseif attackersNearby > defendersNearby then
IsRepublic.Value = false
end
end
if IsRepublic.Value then
HUDBar.BackgroundColor3 = Color3.fromRGB(131, 255, 251)
else
HUDBar.BackgroundColor3 = BrickColor.new("Earth green").Color
end
local attackersAllowedToProgress = PreviousIsCapturedByAttackers(idx)
local isLocked = Locked[Part]
if CapturedValue.Value < 100 then
if IsRepublic.Value and defendersNearby > 0 and not isLocked then
CapturedValue.Value = math.min(100, CapturedValue.Value + defendersNearby)
elseif (not IsRepublic.Value) and attackersNearby > 0 then
if attackersAllowedToProgress then
CapturedValue.Value = math.min(100, CapturedValue.Value + attackersNearby)
end
elseif defendersNearby == 0 and attackersNearby == 0 and CapturedValue.Value > 0 and not isLocked then
CapturedValue.Value = math.max(0, CapturedValue.Value - 0.5)
end
end
if not isLocked then
if IsRepublic.Value and attackersNearby > defendersNearby and CapturedValue.Value > 0 then
CapturedValue.Value = math.max(0, CapturedValue.Value - attackersNearby)
elseif (not IsRepublic.Value) and defendersNearby > attackersNearby and CapturedValue.Value > 0 then
CapturedValue.Value = math.max(0, CapturedValue.Value - defendersNearby)
end
else
if not IsRepublic.Value and attackersNearby > 0 and CapturedValue.Value < 100 and attackersAllowedToProgress then
CapturedValue.Value = math.min(100, CapturedValue.Value + attackersNearby)
end
end
if CapturedValue.Value >= 100 and IsRepublic.Value == false and not Locked[Part] then
Locked[Part] = true
IsRepublic.Value = false
print(("Point %s locked to attackers"):format(Part.Name))
local success, err = pcall(function()
PointChangedEvent:Fire(Part.Name)
end)
if not success then
warn("Failed firing PointChangedEvent:", err)
end
if Part.Name == "A" then
ShowFallback("Fallback1")
elseif Part.Name == "B" then
ShowFallback("Fallback2")
elseif Part.Name == "C" then
end
end
end
end
for _, entry in ipairs(CaptureValues) do
task.spawn(function()
Connection(entry)
end)
end
while task.wait(1) do
local allCapturedByAttackers = true
for _, entry in ipairs(CaptureValues) do
if not (entry.Captured.Value >= 100 and entry.IsRepublic.Value == false) then
allCapturedByAttackers = false
break
end
end
if allCapturedByAttackers then
for _, player in ipairs(Players:GetPlayers()) do
if player:FindFirstChild("PlayerGui") and player.PlayerGui:FindFirstChild("CaptureSystem") then
local gui = player.PlayerGui.CaptureSystem
if player.Team and player.Team.Name == "Emperor" then
if gui:FindFirstChild("Lost") then
gui.Lost.Visible = true
end
elseif player.Team and player.Team.Name == "Horus" then
if gui:FindFirstChild("Won") then
gui.Won.Visible = true
end
end
end
end
local soundObj = script.Parent:FindFirstChild("VictorySound")
if soundObj and soundObj.Play then
soundObj:Play()
end
task.wait(TELEPORT_DELAY_AFTER_SOUND)
for _, player in ipairs(Players:GetPlayers()) do
if player and player.Parent then
local success, err = pcall(function()
TeleportService:Teleport(MAIN_MENU_PLACE_ID, player)
end)
if not success then
warn("Teleport failed for", player.Name, err)
end
task.wait(0.2)
end
end
while true do task.wait(1) end
end
end