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