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

How to make the autobalance only work on two teams?

Asked by
iHavoc101 127
4 years ago

this is a script:

-- Variables --

local TeamsService = Game:GetService('Teams')
local PlayersService = Game:GetService('Players')

local PlayerManager = Workspace:WaitForChild('PlayerManager')
local PlayerJoined = PlayerManager:WaitForChild('PlayerJoined')

local BalanceTeams = script:WaitForChild('BalanceTeams')
local AssignTeam = script:WaitForChild('AssignTeam')

local TeamCounts = {}

-- Local Functions --

local function ChangeTeamCount(teamColor, increment)
    TeamCounts[teamColor.Name] = TeamCounts[teamColor.Name] + increment
end

local function RefreshTeamCounts()
    -- Init counts
    for _, team in pairs(TeamsService:GetTeams()) do
        TeamCounts[team.TeamColor.Name] = 0
    end

    -- Get counts
    for _, player in pairs(PlayersService:GetPlayers()) do
        if not player.Neutral then --TODO: What if player not on valid team?
            ChangeTeamCount(player.TeamColor, 1)
        end
    end
end

local function SmallestTeam()
    local smallestTeam = nil
    local smallest = math.huge
    for _, team in pairs(TeamsService:GetTeams()) do
        local teamCount = TeamCounts[team.TeamColor.Name]
        if teamCount < smallest then
            smallestTeam = team
            smallest = teamCount
        end
    end
    return smallestTeam
end

local function LargestTeam()
    local largestTeam = nil
    local largest = 0
    for _, team in pairs(TeamsService:GetTeams()) do
        local teamCount = TeamCounts[team.TeamColor.Name]
        if teamCount > largest then
            largestTeam = team
            largest = teamCount
        end
    end
    return largestTeam
end

-- Unbalanced: Returns true if there is a player disparity of 2 or more
local function Unbalanced()
    local smallestTeamSize = TeamCounts[SmallestTeam().TeamColor.Name]
    for _, team in pairs(TeamsService:GetTeams()) do
        if TeamCounts[team.TeamColor.Name] - smallestTeamSize >= 2 then
            return true
        end
    end
    return false
end

--[[ When a player joins a game with teams, assign them to the smallest one
local function OnPlayerJoined(player)
    RefreshTeamCounts()
    local smallestTeam = SmallestTeam()
    if smallestTeam then
        player.TeamColor = smallestTeam.TeamColor
        player.Neutral = false
        ChangeTeamCount(player.TeamColor, 1)
    end
end
]]

-- Bindable Functions --
--[[
BalanceTeams.OnInvoke = function()
    RefreshTeamCounts()
    local players = PlayersService:GetPlayers()

    -- Assign neutral players
    for _, player in pairs(players) do
        if player.Neutral then
            local smallestTeam = SmallestTeam()
            player.TeamColor = smallestTeam.TeamColor
            player.Neutral = false
            ChangeTeamCount(player.TeamColor, 1)
        end
    end

    while Unbalanced() do
        -- Move one player from the largest team to the smallest team
        local largestTeam = LargestTeam()
        local smallestTeam = SmallestTeam()
        for _, player in pairs(players) do
            if player.TeamColor == largestTeam.TeamColor then
                ChangeTeamCount(player.TeamColor, -1)
                player.TeamColor = smallestTeam.TeamColor
                ChangeTeamCount(player.TeamColor, 1)
                break
            end
        end
    end
end
--]]

--PlayerJoined.Event:connect(OnPlayerJoined)

AssignTeam.OnInvoke = function(player)
    if player then
        RefreshTeamCounts()
        local smallestTeam = SmallestTeam()
        if smallestTeam then
            player.TeamColor = smallestTeam.TeamColor
            player.Neutral = false
            ChangeTeamCount(player.TeamColor, 1)
        end
    end
end

Answer this question