Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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 nextPoint = nil
- if Part.Name == "A" then
- nextPoint = "B"
- ShowFallback("Fallback1")
- elseif Part.Name == "B" then
- nextPoint = "C"
- ShowFallback("Fallback2")
- elseif Part.Name == "C" then
- nextPoint = nil
- end
- if nextPoint then
- local success, err = pcall(function()
- PointChangedEvent:Fire(nextPoint)
- end)
- if not success then
- warn("Failed firing PointChangedEvent:", err)
- end
- 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
Advertisement
Add Comment
Please, Sign In to add comment