diff --git a/maps/mp/bots/_bot.gsc b/maps/mp/bots/_bot.gsc index 3036fc9..02ebab0 100644 --- a/maps/mp/bots/_bot.gsc +++ b/maps/mp/bots/_bot.gsc @@ -1151,7 +1151,7 @@ addBots_loop() setDvar( "bots_manage_add", 1 ); else if ( amount > fillAmount && getDvarInt( "bots_manage_fill_kick" ) ) { - tempBot = random( getBotArray() ); + tempBot = getBotToKick(); if ( isDefined( tempBot ) ) kick( tempBot getEntityNumber() ); diff --git a/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc index 99dce24..5b0e99f 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/maps/mp/bots/_bot_utility.gsc @@ -725,6 +725,98 @@ notifyAfterDelay( delay, not ) self notify( not ); } +/* + Returns a bot to be kicked +*/ +getBotToKick() +{ + bots = getBotArray(); + + if ( !isDefined( bots ) || !isDefined( bots.size ) || bots.size <= 0 || !isDefined( bots[0] ) ) + return undefined; + + tokick = undefined; + axis = 0; + allies = 0; + team = getDvar( "bots_team" ); + + // count teams + for ( i = 0; i < bots.size; i++ ) + { + bot = bots[i]; + + if ( !isDefined( bot ) || !isDefined( bot.team ) ) + continue; + + if ( bot.team == "allies" ) + allies++; + else if ( bot.team == "axis" ) + axis++; + else // choose bots that are not on a team first + return bot; + } + + // search for a bot on the other team + if ( team == "custom" || team == "axis" ) + { + team = "allies"; + } + else if ( team == "autoassign" ) + { + // get the team with the most bots + team = "allies"; + + if ( axis > allies ) + team = "axis"; + } + else + { + team = "axis"; + } + + // get the bot on this team with lowest skill + for ( i = 0; i < bots.size; i++ ) + { + bot = bots[i]; + + if ( !isDefined( bot ) || !isDefined( bot.team ) ) + continue; + + if ( bot.team != team ) + continue; + + if ( !isDefined( bot.pers ) || !isDefined( bot.pers["bots"] ) || !isDefined( bot.pers["bots"]["skill"] ) || !isDefined( bot.pers["bots"]["skill"]["base"] ) ) + continue; + + if ( isDefined( tokick ) && bot.pers["bots"]["skill"]["base"] > tokick.pers["bots"]["skill"]["base"] ) + continue; + + tokick = bot; + } + + if ( isDefined( tokick ) ) + return tokick; + + // just kick lowest skill + for ( i = 0; i < bots.size; i++ ) + { + bot = bots[i]; + + if ( !isDefined( bot ) || !isDefined( bot.team ) ) + continue; + + if ( !isDefined( bot.pers ) || !isDefined( bot.pers["bots"] ) || !isDefined( bot.pers["bots"]["skill"] ) || !isDefined( bot.pers["bots"]["skill"]["base"] ) ) + continue; + + if ( isDefined( tokick ) && bot.pers["bots"]["skill"]["base"] > tokick.pers["bots"]["skill"]["base"] ) + continue; + + tokick = bot; + } + + return tokick; +} + /* Gets a player who is host */