Kill counter for Zeds(twins) tycoon kit

Hi Developers!
I have a question regarding my zeds(Twins)tycoon game.
I’m making a tycoon where the players can kill each other with my custom made swords.
This all works fine, but I can’t seem to get the kill counter to work.

For those who know what the script of zeds (twins) tycoon looks like there is a linkedleaderboard code in the tycoon kit that contains quite a lot of code that checks for a creator tag.

But no matter what I do it doesn’t count kills +1
In my custom weapons there is a creator tag that identifies who is attacking (which works fine, the person also gets a creator tag in humanoid).

Does anyone have a solution to get this working in linkedleaderboard code?

I even created a new leaderstats file that adds kills (it didn’t work very well, it did add the +1 kill to the correct player, so I don’t think its the creator tag what is causing the problem.)

There are no errors btw…

This is my sword code with creator tag

local tool = script.Parent
local canDamage = false
local canSwing = true


local function onTouch(otherPart)

	local humanoid = otherPart.Parent:FindFirstChild("Humanoid")
	if not humanoid then 
		return 
	end

	if humanoid.Parent ~= tool.Parent and canDamage then 

		tagHumanoid(humanoid)
		humanoid:TakeDamage(50)


		
	else
		return
	end

	canDamage = false
end

function tagHumanoid(hum)
	local existingTag = hum:FindFirstChild("creator");
	if existingTag then
		existingTag:Destroy(); --Removes any current tags on the humanoid
	end

	local tag = Instance.new("ObjectValue");
	tag.Name = "creator";
	tag.Value = game.Players:GetPlayerFromCharacter(tool.Parent); --Gets a player from their character using the tool's parent.
	tag.Parent = hum;
end

local function slash()
	if canSwing then
		canSwing = false
		local str = Instance.new("StringValue")
		str.Name = "toolanim"
		str.Value = "Slash" 
		str.Parent = tool
		canDamage = true
		wait(1) --cooldown time
		canSwing = true
	end
end

tool.Activated:Connect(slash)
tool.Handle.Touched:Connect(onTouch)

This is the official linkedleaderscript code

local Settings = require(script.Parent.Settings)
script.Parent = game.ServerScriptService
stands = {}
CTF_mode = false

-----------------------------------------------------------------------------------------
-- Don't touch this script unless you know what your doing
--This is for the leaderboard, and for you to keep track of people KOS, WOS, CASH, etc.
-----------------------------------------------------------------------------------------
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


		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


		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)

And for those who would like to see the settings code:

local module = {
	['Sounds'] = {
		['Purchase'] = 203785492, -- The sound that plays when a player buys a button he can afford
		['Collect'] = 131886985, -- The sound that plays when a player collects his currency
		['ErrorBuy'] = 138090596 -- The sound that plays when a player buys a button he can't afford
	},
	['AutoAssignTeams'] = true, -- If set to false the player will join on a 'hire' team and will pick their own tycoon
	['CurrencyName'] = "Cash",-- The name of your currency inside the tycoons; this will show up everywhere.
	['BuildAnimation'] = false,
	['ButtonsFadeOut'] = true,
	['FadeOutTime'] = 0.5,
	['ButtonsFadeIn'] = true,
	['FadeInTime'] = 0.5,
	['LeaderboardSettings'] = {
		['KOs'] = true, -- KnockOuts will show on the leaderboard
		['KillsName'] = "Kills", -- What will you call the kills
		['WOs'] = false,-- Wipeouts will show on the leaderboard
		['DeathsName'] = "Deaths", -- What will you call the deaths
		['ShowCurrency'] = true, -- Will show player's money to others
		['ShowShortCurrency'] = true -- This will change a players cash from showing "100,000" to "100K"
	},
	['StealSettings'] = {
		['Stealing'] = true, -- If this is set to true, you can step on other player's collectors and steal a precent indeciated below from the player!
		['StealPrecent'] = 0.25, -- This is the precent of their currency you can take! (1 = all of the currency)
		['PlayerProtection'] = 60 -- This is the time in seconds in which the player can not be stolen from
	}
}

function module:ConvertComma(num)
	local x = tostring(num)
	if #x>=10 then
		local important = (#x-9)
		return x:sub(0,(important))..","..x:sub(important+1,important+3)..","..x:sub(important+4,important+6)..","..x:sub(important+7)
	elseif #x>= 7 then
		local important = (#x-6)
		return x:sub(0,(important))..","..x:sub(important+1,important+3)..","..x:sub(important+4)
	elseif #x>=4 then
		return x:sub(0,(#x-3))..","..x:sub((#x-3)+1)
	else
		return num
	end
end

function module:ConvertShort(Filter_Num)
	local x = tostring(Filter_Num)
	if #x>=10 then
		local important = (#x-9)
		return x:sub(0,(important)).."."..(x:sub(#x-7,(#x-7))).."B+"
	elseif #x>= 7 then
		local important = (#x-6)
		return x:sub(0,(important)).."."..(x:sub(#x-5,(#x-5))).."M+"
	elseif #x>=4 then
		return x:sub(0,(#x-3)).."."..(x:sub(#x-2,(#x-2))).."K+"
	else
		return Filter_Num
	end
end

return module

-- Don't recommend touching any of this rather than the true's. You can change them to false if you don't want them on the leaderboard.

Hopefully someone can help me out with this issue, I have searched google and youtube for a solution but unfortunately, no results.

Kind regards,
IWasToFastForYou

make a local script which gives the condition if the player is dead then raise the counter, or
a leaderstats if you want it to be saved on youtube there are many tutorials on the subject and if you can’t find it try to watch it in Spanish.

i dont get why your kill tracker script is so unnecessary complicated unless you really need those flags. the script also uses a lot of outdated methods

this is all you really need

local Players = game:GetService("Players")

Players.PlyerAdded:Connect(function(plr)
    local leaderstats = Instance.new("Folder", plr)
    leaderstats.Name = "leaderstats"
    
    local kills = Instance.new("IntValue", leaderstats")
    kills.Name = "Kills"
    
    local deaths = Instance.new("IntValue", leaderstats")
    deaths.Name = "Deaths"

    plr.CharacterAdded:Connect(function(char)
        char.Humanoid.Died:Connect(function()
            local tag = chhar.Humanoid:FindFirstChild("creator")
            if tag then
                 tag.Value.leaderstats.Kills.Value += 1
            end
            plr.leaderstats.Deaths.Value += 1
        end
    end)
end)

this isnt a good idea and can be easily exploited

and what I said is the same as the code you did

Yes, it’s from the original code. So I dont know what to do with it.

Where do I need to put the code in that you gave me?
Plus there are some errors so I think it should be like this right?:

local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function(plr)
	local leaderstats = Instance.new("Folder", plr)
	leaderstats.Name = "leaderstats"

	local kills = Instance.new("IntValue", leaderstats)
	kills.Name = "Kills"

	local deaths = Instance.new("IntValue", leaderstats)
	deaths.Name = "Deaths"

	plr.CharacterAdded:Connect(function(char)
		char.Humanoid.Died:Connect(function()
			local tag = char.Humanoid:FindFirstChild("creator")
			if tag then
				tag.Value.leaderstats.Kills.Value += 1
			end
			plr.leaderstats.Deaths.Value += 1
		end)
	end)
end)

I am quite new to programming, so could you explain a little bit more on what goes wrong here? Thank you!

Btw I already made my own leaderstats earlier but it wont save to the original one:


local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("TycoonSaveDate1.2")

local function onPlayerJoin(player)  

	local leaderstats = Instance.new("Folder")  

	leaderstats.Name = "leaderstats"

	leaderstats.Parent = player

	local kills = Instance.new("StringValue",leaderstats)
	kills.Name = "Kills"
	kills.Value = 0



	player.CharacterAdded:Connect(function(character)
		character:WaitForChild("Humanoid").Died:Connect(function(killed)
			local CreatorTag = character.Humanoid:FindFirstChild("creator")
			if CreatorTag and CreatorTag.Value then
				local stats = CreatorTag.Value:WaitForChild("leaderstats")
				print("creating tag works")
				stats['Kills'].Value = stats['Kills'].Value + 1
			end
		end)
	end)




	local playerUserId = "Player_" .. player.UserId  

	local data = playerData:GetAsync(playerUserId)  

	if data then

		kills.Value = data['Kills']
	else

		-- Data store is working, but no current data for this player

		kills.Value = 0

	end

end

local function create_table(player)

	local player_stats = {}

	for _, stat in pairs(player.leaderstats:GetChildren()) do

		player_stats[stat.Name] = stat.Value

	end

	return player_stats

end

local function onPlayerExit(player)  --Runs when players exit

	local player_stats = create_table(player)

	local success, err = pcall(function()

		local playerUserId = "Player_" .. player.UserId

		playerData:SetAsync(playerUserId, player_stats) --Saves player data

	end)

	if not success then

		warn('Oops.. Can not save data!')

	end

end

game.Players.PlayerAdded:Connect(onPlayerJoin)

game.Players.PlayerRemoving:Connect(onPlayerExit)

i misspelled a few things the second code block you sent seems fine

no what you said was to have a local script and call a remote when they die which is a horrible idea since an exploiter could just call it over and over on a loop and get infinite kills

also trusting the client to tell the server when a player has died isnt a good idea

I thought I had it working. But I didnt. My own code works for the counter, but now the rebirth and the other leaderstats is buggy.

Does anyone know what to do now… I don’t know it anymore.

and if you put a condition on the local script ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? '?? ?? ??? ??? ??? ?? ??? ?? ??? ??

After this, you could probaby put something that says like

if humanoid.Health == 0 then
game.Players.LocalPlayer.Kills.Value += 1

This is a probably easily exploitable solution but I guess it could work.

never trust the client an exploiter has full control over it

move your other leaderstats to the new leaderstats creator so it doesnt create multiple leaderstats folders

so I already understood you, otherwise I don’t know much English