I have a code, it's a modification of omnibot "balanceteams" function, that makes always equal number of bots, so if you have 2 axis humans and 4 allies humans, and maxbots 12, teams would not be "6vs6", they would be 5vs7, so new players are forced to join the teams with less bots.
If you don't want to touch omnibot code (they recommend/ encourage not, but i didn't know another way to do it), then you just have to verify if it's bot, you can do it by making a function that check if first 7 characters of GUID is "OMNIBOT", and do nothing. If it's not "OMNIBOT", then add the clientnum to table. Also, check ping. If ping = 0, then exclude the bot. (I don't know how it works with people that really have 0 ping).
An example (untested) would be this:
modname = "balance"
version = "0.1"
function et_InitGame(levelTime,randomSeed,restart)
et.RegisterModname(modname .. " " .. version)
end
unevenDiff = 2
max_unevenTime = 45
max_unevenDiff = 4
axisPlayers = {}
alliedPlayers = {}
unevenTime = 15
function isBot(clientNum)
if et.gentity_get(clientNum,"ps.ping") == 0 then
return true -- is Bot
end
end
function et_RunFrame( levelTime )
local numAlliedPlayers = table.getn( alliedPlayers )
local numAxisPlayers = table.getn( axisPlayers )
if numAlliedPlayers >= numAxisPlayers + max_unevenDiff then
local clientNum = alliedPlayers[ numAlliedPlayers ]
et.trap_SendConsoleCommand( et.EXEC_APPEND, "putteam " .. clientNum .. " r" )
et.G_globalSound("lua/playermove.wav")
et.trap_SendServerCommand(-1, "chat \"balancing teams... " .. et.gentity_get( clientNum, "pers.netname" ) .. "^7 moved to ^1AXIS\"" )
elseif numAxisPlayers >= numAlliedPlayers + max_unevenDiff then
local clientNum = axisPlayers[ numAxisPlayers ]
et.trap_SendConsoleCommand( et.EXEC_APPEND, "putteam " .. clientNum .. " b" )
et.G_globalSound("lua/playermove.wav")
et.trap_SendServerCommand(-1, "chat \"balancing teams... " .. et.gentity_get( clientNum, "pers.netname" ) .. "^7 moved to ^4ALLIES\"" )
elseif numAlliedPlayers >= numAxisPlayers + unevenDiff then
if unevenTime > 0 then
if tonumber( levelTime ) - unevenTime >= max_unevenTime * 1000 then
local clientNum = alliedPlayers[ numAlliedPlayers ]
et.trap_SendConsoleCommand( et.EXEC_APPEND, "putteam " .. clientNum .. " r" )
et.G_globalSound("lua/playermove.wav")
et.trap_SendServerCommand(-1, "chat \"balancing teams... " .. et.gentity_get( clientNum, "pers.netname" ) .. "^7 moved to ^1AXIS\"" )
end
else
unevenTime = tonumber( levelTime )
end
elseif numAxisPlayers >= numAlliedPlayers + unevenDiff then
if unevenTime > 0 then
if tonumber( levelTime ) - unevenTime >= max_unevenTime * 1000 then
local clientNum = axisPlayers[ numAxisPlayers ]
et.trap_SendConsoleCommand( et.EXEC_APPEND, "putteam " .. clientNum .. " b" )
et.G_globalSound("lua/playermove.wav")
et.trap_SendServerCommand(-1, "chat \"balancing teams... " .. et.gentity_get( clientNum, "pers.netname" ) .. "^7 moved to ^4ALLIES\"" )
end
else
unevenTime = tonumber( levelTime )
end
else
unevenTime = -1
end
end
function et_ClientSpawn( clientNum, revived, teamChange, restoreHealth )
if teamChange ~= 0 then
local team = tonumber( et.gentity_get( clientNum, "sess.sessionTeam" ) )
-- these were the teamnumbers prior to the move
local numAlliedPlayers = table.getn( alliedPlayers )
local numAxisPlayers = table.getn( axisPlayers )
if team == 1 then
for i, num in ipairs( alliedPlayers ) do
if num == clientNum then
table.remove( alliedPlayers, i )
break
end
end
-- this should not happen but still check for it to avoid doubles
for i, num in ipairs( axisPlayers ) do
if num == clientNum then
return
end
end
-- make sure a player who (got) moved when teams were uneven doesn't get moved right back
if numAlliedPlayers >= numAxisPlayers + unevenDiff then
table.insert( axisPlayers, 1, clientNum )
else
if isBot(clientNum) then
--do nothing
else
table.insert( axisPlayers, clientNum )
end
end
elseif team == 2 then
for i, num in ipairs( axisPlayers ) do
if num == clientNum then
table.remove( axisPlayers, i )
break
end
end
for i, num in ipairs( alliedPlayers ) do
if num == clientNum then
return
end
end
if numAxisPlayers >= numAlliedPlayers + unevenDiff then
table.insert( alliedPlayers, 1, clientNum )
else
if isBot(clientNum) then
--do nothing
else
table.insert( alliedPlayers, clientNum )
end
end
else
for i, num in ipairs( alliedPlayers ) do
if num == clientNum then
table.remove( alliedPlayers, i )
return
end
end
for i, num in ipairs( axisPlayers ) do
if num == clientNum then
table.remove( axisPlayers, i )
return
end
end
end
end
end
function et_ClientDisconnect( clientNum )
for i, num in ipairs( alliedPlayers ) do
if num == clientNum then
table.remove( alliedPlayers, i )
return
end
end
for i, num in ipairs( axisPlayers ) do
if num == clientNum then
table.remove( axisPlayers, i )
return
end
end
end
I did it with the other method (omnibot), because it was better for me to have bots auto balancing themselves, and forcing new players to join weaker team. Also it's more visual the team balance this way
Also, you can check this: http://mygamingtalk.com/forums/topic/4626-lua-enhanced-server-module/It has a great function to balance teams