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

How to add "while true do" function among the KO WO point leaderboard?

Asked by 7 years ago
Edited 7 years ago

I want to add a script where every 3 seconds, a point is added. The script works in build mode but not in the play mode when it's saved. Or even in some cases, the points work but the KO and WO doesn't work.

Is there a way to have the KO, WO and points script (that changes every 3 seconds) work at the same time?

Below is the script:

function onHumanoidDied(humanoid, player)
    local stats = player:findFirstChild("leaderstats")
    if stats ~= nil then
        local deaths = stats:findFirstChild("Deaths")
        deaths.Value = deaths.Value + 1
        local spend = stats:findFirstChild("Points")
        spend.Value = spend.Value - 5
    -- 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("KOs")
            local earn = stats:findFirstChild("Points")
            if killer ~= player then
                kills.Value = kills.Value + 1
                earn.Value = earn.Value + 100       
            else
                kills.Value = kills.Value - 1
                earn.Value = earn.Value - 1

            end
        end
    end
end


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


function Entered(player)
      if player:findFirstChild("leaderstats") ~= nil then
            player.leaderstats:remove()
      end

      stats = Instance.new("IntValue")
      stats.Parent = player
      stats.Name = "leaderstats"

        local kills = Instance.new("IntValue")
        kills.Name = "KOs"
        kills.Value = 0

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

        kills.Parent = stats
        deaths.Parent = stats

      money = Instance.new("IntValue")
      money.Parent = stats
      money.Name = "Points"
      money.Value = 0 --How much you start out with change it to how much you want

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

        local humanoid = player.Character.Humanoid

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

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


        stats.Parent = player

end


game.Players.PlayerAdded:connect(Entered)

c = game.Players:GetChildren()
for i=1, #c do
        Entered(c[i])
end


while true do
    wait(3)
    money.Value = money.Value + 1
    end

Thank you!

0
Can you edit your code block. User#5423 17 — 7y
0
Sorry!! Hope its better for reading now. beginer12a 5 — 7y

1 answer

Log in to vote
0
Answered by 7 years ago
Edited 7 years ago

The issue is that your money variable gets updated every time a player joins the game since it's not a local variable. When the first player joins, money is equal to that player's money stat, and it'll get updated in the loop. When a second player joins the game, money is now set to the second player's money stat, and your script no longer has any reference to the first player's money stat. To fix this, replace your loop with this:

while true do
    wait(3)
    for i,player in pairs(game.Players:GetPlayers()) do
        player.leaderstats.Points.Value = player.leaderstats.Points.Value + 1
    end
end

In this new loop we loop through all of the players and update their individual money stats. Make sure to change "Points" in this loop if you rename your money stat to "Money" instead of "Points". Another change I'd recommend is making the money variable on line 82 and the stats variable on line 67 local. You will never need to access those outside of the PlayerAdded event, so making them local will remind you to use player.leaderstats instead to avoid the issue you're having now.

0
Thank you so much for your help! I've learnt something today :D beginer12a 5 — 7y
Ad

Answer this question