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

Help, how to make leaderboard script reset scores every 180 seconds?

Asked by 6 years ago

i have been trying to make this work, i have used for i =, and i think it doesn't work. how should i do it?



function onPlayerEntered(newPlayer) local stats = Instance.new("IntValue") stats.Name = "leaderstats" local kills = Instance.new("IntValue") kills.Name = "KOs" kills.Value = 0 local deaths = Instance.new("IntValue") deaths.Name = "Wipeouts" deaths.Value = 0 kills.Parent = stats deaths.Parent = stats while true do if newPlayer.Character ~= nil then break end wait(1) 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 function Send_DB_Event_Died(victim, killer) -- killer may be nil local killername = "no one" if killer ~= nil then killername = killer.Name end print("DIED EVENT: ", victim.Name, " KILLED by ", killername) if shared["deaths"] ~= nil then shared["deaths"](victim, killer) print("SENT DB DEATH EVENT") end end function Send_DB_Event_Kill(killer, victim) print("KILL EVENT. ", killer.Name, " BLOXXED ", victim.Name) if shared["kills"] ~= nil then shared["kills"](killer, victim) print("SENT DB KILL EVENT") end end function onHumanoidDied(humanoid, player) local stats = player:findFirstChild("leaderstats") if stats ~= nil then local deaths = stats:findFirstChild("Wipeouts") deaths.Value = deaths.Value + 1 -- do short dance to try and find the killer local killer = getKillerOfHumanoidIfStillInGame(humanoid) Send_DB_Event_Died(player, killer) 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") if killer ~= player then kills.Value = kills.Value + 1 else kills.Value = kills.Value - 1 end Send_DB_Event_Kill(killer, player) end end end game.Players.ChildAdded:connect(onPlayerEntered) for i = 180,0,-1 do local kills = Instance.new("IntValue") kills.Name = "KOs" kills.Value = 0 local deaths = Instance.new("IntValue") deaths.Name = "Wipeouts" deaths.Value = 0 end

and if what i did doesnt, work, please try and rewrite it with a different method or tell me another method for making this work, thanks.

0
delay() arshad145 392 — 6y

1 answer

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

There are 2 solutions:

  1. Have a loop that goes over each player and resets their kills/deaths every 180 seconds. This is ideal if you want everyone's stats reset at the same time.
  2. Have a loop that resets the player-who-just-entered-the-game every 180 seconds. This is what you want to do if you want a player's stats to be reset every 3 minutes since they entered the game (which means that if two people don't enter in at the same time, they'll probably have their stats reset at different times).

I'll assume you want #1. This at the bottom of your leaderboard script:

while true do -- keep going while the server is running
    wait(180)
    local players = game.Players:GetPlayers() -- get all the players
    for i = 1, #players do -- you could also do "for _, player in ipairs(players) do"
        local player = players[i] -- if you did the "for _, player in ipairs(players) do", you wouldn't need this line
        --Attempt to get the leaderstats. If successful, reset them.
        local leaderstats = player:FindFirstChild("leaderstats")
        if leaderstats then -- I will assume that if there are leaderstats, there are always KOs and WOs
            leaderstats.KOs.Value = 0
            leaderstats.WOs.Value = 0
        end
    end
end

It's important to understand why what you tried didn't work:

for i = 180,0,-1 do -- This is the beginnings of a count down loop. If you wanted to update a status, this would be good. It might look something like this:

while true do -- Note that you need an outer loop, or else your script will only count down once.
    for i = 180, 1, -1 do
        print(i, "seconds left!")
        wait(1)
    end
    --do whatever you want after the 180 seconds
end

--Your attempt  continues:

    local kills = Instance.new("IntValue") -- With this you create a new IntValue. But you don't want to create a *new* one, you just want to modify the one that already exists.
    kills.Name = "KOs" -- This names it to "KOs", but it's already named that
    kills.Value = 0 -- This resets the value, which *is* what you want. It doesn't work in this case because "kills" refers to a new IntValue, rather than the one in the player's leaderstats.

--Your script then repeats that for WOs.
Ad

Answer this question