Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Can someone help me with a leaderboard problem please?

Asked by 9 years ago

I have been trying all kinds of different code to get the leaderboard to compare the infamy from the killer to the guy that died.

but nothing I have tried is working.

right now I have 3 tabs.

kills, deaths, and infamy

when someone kills someone the program should compare the killers infamy with the one whom died and compare it to his own.

if the infamy.value is 0 it will add 100

if the infiny.value is less than the one who died it should take the infamy value from the one who died and times it by .5 and add that figure to the killers infamy.

but nothing is working. I cant figure out how to get the if statement to looking the other persons stats.

can someone help me please. this is the code that I am playing around with.

print("LinkedLeaderboard script version 5.00 loaded")

stands = {}
CTF_mode = false


function onHumanoidDied(humanoid, player)
    local stats = player:findFirstChild("leaderstats")
    if stats ~= nil then
        local deaths = stats:findFirstChild("Deaths")
        deaths.Value = deaths.Value + 1

        -- do short dance to try and find the killer

        local killer = getKillerOfHumanoidIfStillInGame(humanoid)

        handleKillCount(humanoid, player)
    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
            humanoid.Died:connect(function() onHumanoidDied(h, p) 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("Kills")
            local infamy = stats:findFirstChild ("Infamy")


            if killer ~= player then
                kills.Value = kills.Value + 1

                local upgrade = player:findFirstChild("leaderstats")
                local increase = upgrade.stats:findFirstChild ("Infamy")

                if infamy.Value < increase or infamy.Value == 0 then

                    infamy.Value = infamy.Value + 100

                else

                    infamy.Value = ((increase* .5)+ infamy.Value)

                end

            else
                kills.Value = kills.Value - 1

            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 = Instance.new("IntValue")
        kills.Name = "Kills"
        kills.Value = 0

        local deaths = Instance.new("IntValue")
        deaths.Name = "Deaths"
        deaths.Value = 0

        local infamy = Instance.new("IntValue")
        infamy.Name = "Infamy"
        infamy.Value = 0

        kills.Parent = stats
        deaths.Parent = stats
        infamy.Parent = stats

        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)








0
at the same time , i just added a few more tabs, Experience, class, gold, and silver, but only 4 of them show up. How can i get all of them to show and move them around the way i want? I have been looking on the intenet all day with no results. snipers0076 5 — 9y

1 answer

Log in to vote
0
Answered by
Validark 1580 Snack Break Moderation Voter
9 years ago

Line 15 is there for no reason.

line 43:

local killer = tag.Value 
if killer.Parent ~= nil then -- This checks if the Value "killer" no longer has a parent
    return killer
end

killer is NOT the Userdata of the killer. I am assuming it's just the name of the Killer. If you want to find the killer, you are going to have to find them:

for a, v in pairs(game.Players:GetPlayers()) do
    if v.Name == tag.Value then
        print("This is our killer")
    end
end

Otherwise, good job with your formatting and naming. I can tell you are an experienced programmer.

Also, there is no way to customize the Roblox default leaderboard. You COULD make your own. I made one to suit my style, which I could give to you if you want.

Hope you get the desired outcome :)

EDIT Line 187 game.Players.ChildAdded:connect(onPlayerEntered) should be changed to game.Players.PlayerAdded:connect(onPlayerEntered)

On line 163, use newPlayer.CharacterAdded to listen for when a player respawns

Remove lines 153-156 because they are unnecessary

Send me the latest version of your leaderboard after you fix it up the best you can

0
that would be great i could use it to design one i like, you know something to go off of.... i dont know how you can get it to me, but me email is snipers0076 5 — 9y
0
as well, the problem i was having is that the code will not check the infamy of the dead guy and the infamy of the killer, and change it. if the killer has less infamy then the dead guy the infamy should increase to .5 times what the dead guy has if the dead guy has less or none, the killers infamy should change by 100. that code portion is not working. snipers0076 5 — 9y
0
Re-edit your script the best you can, then send it to me Validark 1580 — 9y
Ad

Answer this question