From f910ae605426372ae73afb49e8e2b00993bb43bd Mon Sep 17 00:00:00 2001 From: ineed bots Date: Wed, 13 Dec 2023 12:21:32 -0600 Subject: [PATCH] better bot kicking logic --- maps/mp/bots/_bot.gsc | 2 +- maps/mp/bots/_bot_utility.gsc | 92 +++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/maps/mp/bots/_bot.gsc b/maps/mp/bots/_bot.gsc index a3fdd9d..d36a3e3 100644 --- a/maps/mp/bots/_bot.gsc +++ b/maps/mp/bots/_bot.gsc @@ -956,7 +956,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(), "EXE_PLAYERKICKED" ); diff --git a/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc index b187e22..68d06c3 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/maps/mp/bots/_bot_utility.gsc @@ -745,6 +745,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 || !isArray( bots ) || !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 */