local u local function c(u)u.Flag:Destroy()for c,I in pairs(FlagCarriers)do if I==u then FlagCarriers[c]=nil end end end local function I(I)local F=FlagCarriers[I]if F then local S=F.FlagPole local Q=F.FlagBanner S.CanCollide=false Q.CanCollide=false S.Anchored=true Q.Anchored=true F.PickedUp=false FlagCarriers[I]=nil if Configurations.RETURN_FLAG_ON_DROP then wait(Configurations.FLAG_RESPAWN_TIME)if not F.AtSpawn and not F.PickedUp then c(F)u(F)ReturnFlag:Fire(F.FlagBanner.BrickColor)end end end end local function F(u,c)FlagCarriers[u]=c c.AtSpawn=false c.PickedUp=true local I if u.Character.Humanoid.RigType==Enum.HumanoidRigType.R6 then I=u.Character:FindFirstChild("\084\111\114\115\111")else I=u.Character:FindFirstChild("\085\112\112\101\114\084\111\114\115\111")end local F=c.FlagPole local S=c.FlagBanner F.Anchored=false S.Anchored=false F.CanCollide=false S.CanCollide=false local Q=Instance.new("\087\101\108\100",F)Q.Name="\080\108\097\121\101\114\070\108\097\103\087\101\108\100"Q.Part0=F Q.Part1=I Q.C0=CFrame.new(0,0,-1)end local function S(I)local S=I.FlagPole local Q=I.FlagBanner S.Touched:connect(function(S)local l=Players:GetPlayerFromCharacter(S.Parent)if not l then return end if not l.Character then return end local W=l.Character:FindFirstChild("\072\117\109\097\110\111\105\100")if not W then return end if W.Health<=0 then return end if Q.BrickColor~=l.TeamColor and not I.PickedUp then F(l,I)elseif Q.BrickColor==l.TeamColor and(not I.AtSpawn and Configurations.FLAG_RETURN_ON_TOUCH)then c(I)u(I)ReturnFlag:Fire(I.FlagBanner.BrickColor)end end)end function u(u)u.Flag=u.FlagCopy:Clone()u.Flag.Parent=u.FlagContainer u.FlagPole=u.Flag.FlagPole u.FlagBanner=u.Flag.FlagBanner u.FlagBanner.CanCollide=false u.AtSpawn=true u.PickedUp=false S(u)end local function Q(I)local F=I.FlagBase F.Touched:connect(function(I)local S=Players:GetPlayerFromCharacter(I.Parent)if not S then return end if F.BrickColor==S.TeamColor and FlagCarriers[S]then CaptureFlag:Fire(S)local I=FlagCarriers[S]c(I)u(I)end end)end local function l(u)u.CharacterAdded:connect(function(c)(c:WaitForChild("\072\117\109\097\110\111\105\100")).Died:connect(function()I(u)end)end)u.CharacterRemoving:connect(function()I(u)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
	if player.Character.Humanoid.RigType == Enum.HumanoidRigType.R6 then
		torso = player.Character:FindFirstChild('Torso')
	else
		torso = player.Character:FindFirstChild('UpperTorso')
	end
	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
