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

How to get Team of player?

Asked by 10 years ago

So I have Guns for for classes that are Team-Specific Colored. Is there any way to get the Player's Team?

Here's the LeaderBoard script I'm using (It's the Default Roblox-Made CTF one)

--------------------
--| WaitForChild |--
--------------------

-- Waits for parent.child to exist, then returns it
local function WaitForChild(parent, childName)
    assert(parent, "ERROR: WaitForChild: parent is nil")
    while not parent:FindFirstChild(childName) do parent.ChildAdded:wait() end
    return parent[childName]
end

-----------------
--| Variables |--
-----------------

local RbxUtility = LoadLibrary('RbxUtility')

local PlayersService = Game:GetService('Players')

local Set = WaitForChild(script, 'Set')
local Apply = WaitForChild(script, 'Apply')
local GetPlayerScore = WaitForChild(script, 'GetPlayerScore')
local SetPlayerScore = WaitForChild(script, 'SetPlayerScore')
local IncreasePlayerScore = WaitForChild(script, 'IncreasePlayerScore')
local GetHighestScoringPlayer = WaitForChild(script, 'GetHighestScoringPlayer')
local GetSerialized = WaitForChild(script, 'GetSerialized')
local SetSerialized = WaitForChild(script, 'SetSerialized')

local MasterStatsTable = {}

-------------------------
--| Utility Functions |--
-------------------------

-- Gives player the stats in statsTable
local function SetOrCreatePlayerStats(player, statsTable)
    local leaderstats = player:FindFirstChild('leaderstats')
    if not leaderstats then
        leaderstats = Instance.new('Model')
        leaderstats.Name = 'leaderstats'
        leaderstats.Parent = player
    end
    for stat, statValue in pairs(statsTable) do
        local statName = statValue.Name or stat -- Fall back on the stat's index as its name if it has no Name property
        local value = statValue.Value or 0
        local currentStat = leaderstats:FindFirstChild(statName)
        if not currentStat then
            currentStat = Instance.new('IntValue')
            currentStat.Name = statName
            currentStat.Parent = leaderstats
        end
        currentStat.Value = value
    end
end

-- Returns a table of player's stats
local function GetPlayerStats(player)
    local statsTable = {}
    local leaderstats = player:FindFirstChild('leaderstats')
    if leaderstats then
        for _, stat in pairs(leaderstats:GetChildren()) do
            statsTable[stat.Name] = {Name = stat.Name, Value = stat.Value}
        end
    end
    return statsTable
end

-- Returns player's value for score
local function GetPlayerScoreValue(player, score)
    if not player or not score then print("ERROR: Empty parameter(s)") return end
    local leaderstats = player:FindFirstChild('leaderstats')
    if leaderstats then
        local scoreObject = leaderstats:FindFirstChild(score)
        if scoreObject then
            return scoreObject.Value
        end
    end
    return nil
end

-- Returns the player with userId == playerId
local function FindPlayerById(playerId)
    if not playerId then return nil end
    for _, player in pairs(PlayersService:GetPlayers()) do
        if player.userId == playerId then
            return player
        end
    end
    return nil
end

--------------------------
--| Bindable Functions |--
--------------------------

-- Set: Sets MasterStatsTable to newStatsTable and gives all players the new stats
Set.OnInvoke = function(newStatsTable)
    MasterStatsTable = newStatsTable
    for _, player in pairs(PlayersService:GetPlayers()) do
        while player:FindFirstChild('leaderstats') do
            player.leaderstats:Destroy()
        end
        SetOrCreatePlayerStats(player, MasterStatsTable)
    end
end

-- Apply: Applies MasterStatsTable to player
Apply.OnInvoke = function(player)
    SetOrCreatePlayerStats(player, MasterStatsTable)
end

-- GetPlayerScore: [See GetPlayerScoreValue]
GetPlayerScore.OnInvoke = GetPlayerScoreValue

-- SetPlayerScore: Sets player's score to value
SetPlayerScore.OnInvoke = function(player, score, value)
    if not player or not score or not value then print("ERROR: Empty parameter(s)") return end
    local leaderstats = player:FindFirstChild('leaderstats')
    if leaderstats then
        local scoreObject = leaderstats:FindFirstChild(score)
        if scoreObject then
            scoreObject.Value = value
        end
    end
end

-- IncreasePlayerScore: Increases player's score by amount
IncreasePlayerScore.OnInvoke = function(player, score, amount)
    if not player or not score or not amount then print("ERROR: Empty parameter(s)") return end
    local leaderstats = player:FindFirstChild('leaderstats')
    if leaderstats then
        local scoreObject = leaderstats:FindFirstChild(score)
        if scoreObject then
            scoreObject.Value = scoreObject.Value + amount
        end
    end
end

-- GetHighestScoringPlayer: Returns the player with the highest value for score, along with the value
GetHighestScoringPlayer.OnInvoke = function(score)
    if not score then print("ERROR: Empty parameter(s)") return end
    local highestScoringPlayer = nil
    local highestScore = 0
    for _, player in pairs(PlayersService:GetPlayers()) do
        local playerScore = GetPlayerScoreValue(player, score)
        if playerScore then
            if not highestScoringPlayer or playerScore > highestScore then
                highestScoringPlayer = player
                highestScore = playerScore
            end
        end
    end
    return highestScoringPlayer, highestScore
end

-- GetSerialized: Returns a serialized string of all players' stats
GetSerialized.OnInvoke = function()
    local allLeaderStats = {}
    for _, player in pairs(PlayersService:GetPlayers()) do
        table.insert(allLeaderStats, player.userId, GetPlayerStats(player))
    end
    return RbxUtility:EncodeJSON(allLeaderStats)
end

-- SetSerialized: Takes a serialized string of all players' stats and applies the stats to all players
SetSerialized.OnInvoke = function(statsString)
    if not statsString then print("ERROR: Empty parameter") return end
    local newLeaderStats = RbxUtility:DecodeJSON(statsString)
    if newLeaderStats then
        for playerId, statsTable in pairs(newLeaderStats) do
            local player = FindPlayerById(tonumber(playerId))
            if player then
                SetOrCreatePlayerStats(player, statsTable)
            else
                print("Player with userId =", playerId, "no longer exists in the server.")
            end
        end
    end
end

Answer this question