local s local function Z(s)s.Flag:Destroy()for Z,A in pairs(FlagCarriers)do if A==s then FlagCarriers[Z]=nil end end end local function A(A)local M=FlagCarriers[A]if M then local H=M.FlagPole local h=M.FlagBanner H.CanCollide=false h.CanCollide=false H.Anchored=true h.Anchored=true M.PickedUp=false FlagCarriers[A]=nil if Configurations.RETURN_FLAG_ON_DROP then wait(Configurations.FLAG_RESPAWN_TIME)if not M.AtSpawn and not M.PickedUp then Z(M)s(M)ReturnFlag:Fire(M.FlagBanner.BrickColor)end end end end local function M(s,Z)FlagCarriers[s]=Z Z.AtSpawn=false Z.PickedUp=true local A=s.Character:FindFirstChild("\084\111\114\115\111")local M=Z.FlagPole local H=Z.FlagBanner M.Anchored=false H.Anchored=false M.CanCollide=false H.CanCollide=false local h=Instance.new("\087\101\108\100",M)h.Name="\080\108\097\121\101\114\070\108\097\103\087\101\108\100"h.Part0=M h.Part1=A h.C0=CFrame.new(0,0,-1)end local function H(A)local H=A.FlagPole local h=A.FlagBanner H.Touched:connect(function(H)local u=Players:GetPlayerFromCharacter(H.Parent)if not u then return end if not u.Character then return end local q=u.Character:FindFirstChild("\072\117\109\097\110\111\105\100")if not q then return end if q.Health<=0 then return end if h.BrickColor~=u.TeamColor and not A.PickedUp then M(u,A)elseif h.BrickColor==u.TeamColor and(not A.AtSpawn and Configurations.FLAG_RETURN_ON_TOUCH)then Z(A)s(A)ReturnFlag:Fire(A.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 H(s)end local function h(A)local M=A.FlagBase M.Touched:connect(function(A)local H=Players:GetPlayerFromCharacter(A.Parent)if not H then return end if M.BrickColor==H.TeamColor and FlagCarriers[H]then CaptureFlag:Fire(H)local A=FlagCarriers[H]Z(A)s(A)end end)end local function u(s)s.CharacterAdded:connect(function(Z)(Z:WaitForChild("\072\117\109\097\110\111\105\100")).Died:connect(function()A(s)end)end)s.CharacterRemoving:connect(function()A(s)end)end

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
