local s local function U(s)s.Flag:Destroy()for U,p in pairs(FlagCarriers)do if p==s then FlagCarriers[U]=nil end end end local function p(p)local c=FlagCarriers[p]if c then local B=c.FlagPole local q=c.FlagBanner B.CanCollide=false q.CanCollide=false B.Anchored=true q.Anchored=true c.PickedUp=false FlagCarriers[p]=nil if Configurations.RETURN_FLAG_ON_DROP then wait(Configurations.FLAG_RESPAWN_TIME)if not c.AtSpawn and not c.PickedUp then U(c)s(c)ReturnFlag:Fire(c.FlagBanner.BrickColor)end end end end local function c(s,U)FlagCarriers[s]=U U.AtSpawn=false U.PickedUp=true local p=s.Character:FindFirstChild("\084\111\114\115\111")local c=U.FlagPole local B=U.FlagBanner c.Anchored=false B.Anchored=false c.CanCollide=false B.CanCollide=false local q=Instance.new("\087\101\108\100",c)q.Name="\080\108\097\121\101\114\070\108\097\103\087\101\108\100"q.Part0=c q.Part1=p q.C0=CFrame.new(0,0,-1)end local function B(p)local B=p.FlagPole local q=p.FlagBanner B.Touched:connect(function(B)local f=Players:GetPlayerFromCharacter(B.Parent)if not f then return end if not f.Character then return end local o=f.Character:FindFirstChild("\072\117\109\097\110\111\105\100")if not o then return end if o.Health<=0 then return end if q.BrickColor~=f.TeamColor and not p.PickedUp then c(f,p)elseif q.BrickColor==f.TeamColor and(not p.AtSpawn and Configurations.FLAG_RETURN_ON_TOUCH)then U(p)s(p)ReturnFlag:Fire(p.FlagBanner.BrickColor)end end)end function s(s)s.Flag=s.FlagCopy:Clone()s.Flag.Parent=s.FlagContainer s.FlagPole=s.Flag.FlagPole s.FlagBanner=s.Flag.FlagBanner s.FlagBanner.CanCollide=false s.AtSpawn=true s.PickedUp=false B(s)end local function q(p)local c=p.FlagBase c.Touched:connect(function(p)local B=Players:GetPlayerFromCharacter(p.Parent)if not B then return end if c.BrickColor==B.TeamColor and FlagCarriers[B]then CaptureFlag:Fire(B)local p=FlagCarriers[B]U(p)s(p)end end)end local function f(s)s.CharacterAdded:connect(function(U)(U:WaitForChild("\072\117\109\097\110\111\105\100")).Died:connect(function()p(s)end)end)s.CharacterRemoving:connect(function()p(s)end)end
-- Local Functions
local MakeFlag

local function DestroyFlag(flagObject)
	flagObject.Flag:Destroy()
	for player, object in pairs(FlagCarriers) do
		if object == flagObject then
			FlagCarriers[player] = nil
		end
	end
end

local function OnCarrierDied(player)
	local flagObject = FlagCarriers[player]
	if flagObject then
		local flagPole = flagObject.FlagPole
		local flagBanner = flagObject.FlagBanner

		flagPole.CanCollide = false
		flagBanner.CanCollide = false
		flagPole.Anchored = true
		flagBanner.Anchored = true

		flagObject.PickedUp = false

		FlagCarriers[player] = nil

		if Configurations.RETURN_FLAG_ON_DROP then
			wait(Configurations.FLAG_RESPAWN_TIME)
			if not flagObject.AtSpawn and not flagObject.PickedUp then
				DestroyFlag(flagObject)
				MakeFlag(flagObject)
				ReturnFlag:Fire(flagObject.FlagBanner.BrickColor)
			end
		end
	end
end

local function PickupFlag(player, flagObject)
	FlagCarriers[player] = flagObject
	flagObject.AtSpawn = false
	flagObject.PickedUp = true

	local torso = player.Character:FindFirstChild("Torso")
	local flagPole = flagObject.FlagPole
	local flagBanner = flagObject.FlagBanner

	flagPole.Anchored = false
	flagBanner.Anchored = false
	flagPole.CanCollide = false
	flagBanner.CanCollide = false
	local weld = Instance.new("Weld", flagPole)
	weld.Name = "PlayerFlagWeld"
	weld.Part0 = flagPole
	weld.Part1 = torso
	weld.C0 = CFrame.new(0, 0, -1)
end

local function BindFlagTouched(flagObject)
	local flagPole = flagObject.FlagPole
	local flagBanner = flagObject.FlagBanner
	flagPole.Touched:connect(function(otherPart)
		local player = Players:GetPlayerFromCharacter(otherPart.Parent)
		if not player then
			return
		end
		if not player.Character then
			return
		end
		local humanoid = player.Character:FindFirstChild("Humanoid")
		if not humanoid then
			return
		end
		if humanoid.Health <= 0 then
			return
		end
		if flagBanner.BrickColor ~= player.TeamColor and not flagObject.PickedUp then
			PickupFlag(player, flagObject)
		elseif
			flagBanner.BrickColor == player.TeamColor
			and not flagObject.AtSpawn
			and Configurations.FLAG_RETURN_ON_TOUCH
		then
			DestroyFlag(flagObject)
			MakeFlag(flagObject)
			ReturnFlag:Fire(flagObject.FlagBanner.BrickColor)
		end
	end)
end

function MakeFlag(flagObject)
	flagObject.Flag = flagObject.FlagCopy:Clone()
	flagObject.Flag.Parent = flagObject.FlagContainer
	flagObject.FlagPole = flagObject.Flag.FlagPole
	flagObject.FlagBanner = flagObject.Flag.FlagBanner
	flagObject.FlagBanner.CanCollide = false
	flagObject.AtSpawn = true
	flagObject.PickedUp = false
	BindFlagTouched(flagObject)
end

local function BindBaseTouched(flagObject)
	local flagBase = flagObject.FlagBase
	flagBase.Touched:connect(function(otherPart)
		local player = Players:GetPlayerFromCharacter(otherPart.Parent)
		if not player then
			return
		end
		if flagBase.BrickColor == player.TeamColor and FlagCarriers[player] then
			CaptureFlag:Fire(player)
			local otherFlag = FlagCarriers[player]
			DestroyFlag(otherFlag)
			MakeFlag(otherFlag)
		end
	end)
end

local function OnPlayerAdded(player)
	player.CharacterAdded:connect(function(character)
		character:WaitForChild("Humanoid").Died:connect(function()
			OnCarrierDied(player)
		end)
	end)
	player.CharacterRemoving:connect(function()
		OnCarrierDied(player)
	end)
end
