local J=require(script.Parent.Settings)script.Parent=game.ServerScriptService stands={}CTF_mode=false function onHumanoidDied(s,p)local Z=p:findFirstChild("\108\101\097\100\101\114\115\116\097\116\115")if Z~=nil then local d=Z:findFirstChild(J.LeaderboardSettings.DeathsName)if d then d.Value=d.Value+1 end if J.LeaderboardSettings.KOs then local J=getKillerOfHumanoidIfStillInGame(s)handleKillCount(s,p)end end end function onPlayerRespawn(s,p)if s=="\067\104\097\114\097\099\116\101\114"and p.Character~=nil then local s=p.Character.Humanoid local Z=p local d=s if J.LeaderboardSettings.WOs then s.Died:connect(function()onHumanoidDied(d,Z)end)end end end function getKillerOfHumanoidIfStillInGame(J)local s=J:findFirstChild("\099\114\101\097\116\111\114")if s~=nil then local J=s.Value if J.Parent~=nil then return J end end return nil end function handleKillCount(s,p)local Z=getKillerOfHumanoidIfStillInGame(s)if Z~=nil then local s=Z:findFirstChild("\108\101\097\100\101\114\115\116\097\116\115")if s~=nil then local d=s:findFirstChild(J.LeaderboardSettings.KillsNames)if d then if Z~=p then d.Value=d.Value+1 else d.Value=d.Value-1 end else return end end end end function findAllFlagStands(J)local s=J:children()for J=1,#s,1 do if s[J].className=="\077\111\100\101\108"or s[J].className=="\080\097\114\116"then findAllFlagStands(s[J])end if s[J].className=="\070\108\097\103\083\116\097\110\100"then table.insert(stands,s[J])end end end function hookUpListeners()for J=1,#stands,1 do stands[J].FlagCaptured:connect(onCaptureScored)end end function onPlayerEntered(s)if CTF_mode==true then local J=Instance.new("\073\110\116\086\097\108\117\101")J.Name="\108\101\097\100\101\114\115\116\097\116\115"local p=Instance.new("\073\110\116\086\097\108\117\101")p.Name="\067\097\112\116\117\114\101\115"p.Value=0 p.Parent=J while true do if s.Character~=nil then break end wait(5)end J.Parent=s else local p=Instance.new("\073\110\116\086\097\108\117\101")p.Name="\108\101\097\100\101\114\115\116\097\116\115"local Z=false if J.LeaderboardSettings.KOs then Z=Instance.new("\073\110\116\086\097\108\117\101")Z.Name=J.LeaderboardSettings.KillsName Z.Value=0 end local d=false if J.LeaderboardSettings.WOs then d=Instance.new("\073\110\116\086\097\108\117\101")d.Name=J.LeaderboardSettings.DeathsName d.Value=0 end local t=false if J.LeaderboardSettings.ShowCurrency then t=Instance.new("\083\116\114\105\110\103\086\097\108\117\101")t.Name=J.CurrencyName t.Value=0 end local F=game.ServerStorage.PlayerMoney:FindFirstChild(s.Name)if F~=nil then if t then local s=J.LeaderboardSettings.ShowShortCurrency F.Changed:connect(function()if s then t.Value=J:ConvertShort(F.Value)else t.Value=J:ConvertComma(F.Value)end end)end end if Z then Z.Parent=p end if d then d.Parent=p end if t then t.Parent=p end while true do if s.Character~=nil then break end wait(5)end local G=s.Character.Humanoid G.Died:connect(function()onHumanoidDied(G,s)end)s.Changed:connect(function(J)onPlayerRespawn(J,s)end)p.Parent=s end end function onCaptureScored(J)local s=J:findFirstChild("\108\101\097\100\101\114\115\116\097\116\115")if s==nil then return end local p=s:findFirstChild("\067\097\112\116\117\114\101\115")if p==nil then return end p.Value=p.Value+1 end findAllFlagStands(game.Workspace)hookUpListeners()if#stands>0 then CTF_mode=true end game.Players.ChildAdded:connect(onPlayerEntered)
local Settings = require(script.Parent.Settings)
script.Parent = game.ServerScriptService
stands = {}
CTF_mode = false

function onHumanoidDied(humanoid, player)
	local stats = player:findFirstChild("leaderstats")
	if stats ~= nil then
		local deaths = stats:findFirstChild(Settings.LeaderboardSettings.DeathsName)
		if deaths then
			deaths.Value = deaths.Value + 1
		end
		-- do short dance to try and find the killer
		if Settings.LeaderboardSettings.KOs then
			local killer = getKillerOfHumanoidIfStillInGame(humanoid)
			handleKillCount(humanoid, player)
		end
	end
end

function onPlayerRespawn(property, player)
	-- need to connect to new humanoid
	
	if property == "Character" and player.Character ~= nil then
		local humanoid = player.Character.Humanoid
		local p = player
		local h = humanoid
		if Settings.LeaderboardSettings.WOs then
			humanoid.Died:connect(function() onHumanoidDied(h, p) end )
		end
	end
end

function getKillerOfHumanoidIfStillInGame(humanoid)
	-- returns the player object that killed this humanoid
	-- returns nil if the killer is no longer in the game

	-- check for kill tag on humanoid - may be more than one - todo: deal with this
	local tag = humanoid:findFirstChild("creator")

	-- find player with name on tag
	if tag ~= nil then
		
		local killer = tag.Value
		if killer.Parent ~= nil then -- killer still in game
			return killer
		end
	end

	return nil
end

function handleKillCount(humanoid, player)
	local killer = getKillerOfHumanoidIfStillInGame(humanoid)
	if killer ~= nil then
		local stats = killer:findFirstChild("leaderstats")
		if stats ~= nil then
			local kills = stats:findFirstChild(Settings.LeaderboardSettings.KillsNames)
			if kills then
				if killer ~= player then
					kills.Value = kills.Value + 1	
				else
					kills.Value = kills.Value - 1
				end
			else
				return
			end
		end
	end
end


-----------------------------------------------



function findAllFlagStands(root)
	local c = root:children()
	for i=1,#c do
		if (c[i].className == "Model" or c[i].className == "Part") then
			findAllFlagStands(c[i])
		end
		if (c[i].className == "FlagStand") then
			table.insert(stands, c[i])
		end
	end
end

function hookUpListeners()
	for i=1,#stands do
		stands[i].FlagCaptured:connect(onCaptureScored)
	end
end

function onPlayerEntered(newPlayer)

	if CTF_mode == true then

		local stats = Instance.new("IntValue")
		stats.Name = "leaderstats"

		local captures = Instance.new("IntValue")
		captures.Name = "Captures"
		captures.Value = 0


		captures.Parent = stats

		-- VERY UGLY HACK
		-- Will this leak threads?
		-- Is the problem even what I think it is (player arrived before character)?
		while true do
			if newPlayer.Character ~= nil then break end
			wait(5)
		end

		stats.Parent = newPlayer

	else

		local stats = Instance.new("IntValue")
		stats.Name = "leaderstats"
		local kills = false
		if Settings.LeaderboardSettings.KOs then
			kills = Instance.new("IntValue")
			kills.Name = Settings.LeaderboardSettings.KillsName
			kills.Value = 0
		end
		local deaths = false
		if Settings.LeaderboardSettings.WOs then
			deaths = Instance.new("IntValue")
			deaths.Name = Settings.LeaderboardSettings.DeathsName
			deaths.Value = 0
		end
		
		local cash = false
		if Settings.LeaderboardSettings.ShowCurrency then
			cash = Instance.new("StringValue")
			cash.Name = Settings.CurrencyName
			cash.Value = 0
		end
		
		local PlayerStats = game.ServerStorage.PlayerMoney:FindFirstChild(newPlayer.Name)
		if PlayerStats ~= nil then
			if cash then
				local Short = Settings.LeaderboardSettings.ShowShortCurrency
				PlayerStats.Changed:connect(function()
					if (Short) then
						cash.Value = Settings:ConvertShort(PlayerStats.Value)
					else
						cash.Value = Settings:ConvertComma(PlayerStats.Value)
					end
				end)
			end
		end
		if kills then
		kills.Parent = stats
		end
		if deaths then
		deaths.Parent = stats
		end
		if cash then
		cash.Parent = stats
		end

		-- VERY UGLY HACK
		-- Will this leak threads?
		-- Is the problem even what I think it is (player arrived before character)?
		while true do
			if newPlayer.Character ~= nil then break end
			wait(5)
		end

		local humanoid = newPlayer.Character.Humanoid

		humanoid.Died:connect(function() onHumanoidDied(humanoid, newPlayer) end )

		-- start to listen for new humanoid
		newPlayer.Changed:connect(function(property) onPlayerRespawn(property, newPlayer) end )


		stats.Parent = newPlayer

	end

end


function onCaptureScored(player)

		local ls = player:findFirstChild("leaderstats")
		if ls == nil then return end
		local caps = ls:findFirstChild("Captures")
		if caps == nil then return end
		caps.Value = caps.Value + 1

end


findAllFlagStands(game.Workspace)
hookUpListeners()
if (#stands > 0) then CTF_mode = true end
game.Players.ChildAdded:connect(onPlayerEntered)