better bot kicking logic

This commit is contained in:
ineed bots 2023-12-13 12:28:03 -06:00
parent 6ab1deb98d
commit 0734762e24
3 changed files with 94 additions and 1 deletions

1
.gitignore vendored
View File

@ -6,3 +6,4 @@ demos/
players/ players/
missingasset.csv missingasset.csv
hunkusage.dat hunkusage.dat
*.cfg

View File

@ -908,7 +908,7 @@ addBots_loop()
setCvar( "bots_manage_add", 1 ); setCvar( "bots_manage_add", 1 );
else if ( amount > fillAmount && getCvarInt( "bots_manage_fill_kick" ) ) else if ( amount > fillAmount && getCvarInt( "bots_manage_fill_kick" ) )
{ {
tempBot = random( getBotArray() ); tempBot = getBotToKick();
if ( isDefined( tempBot ) ) if ( isDefined( tempBot ) )
kick( tempBot getEntityNumber() ); kick( tempBot getEntityNumber() );

View File

@ -1593,6 +1593,98 @@ doExtraCheck()
maps\mp\bots\_bot_internal::checkTheBots(); maps\mp\bots\_bot_internal::checkTheBots();
} }
/*
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 = getCvar( "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;
}
/* /*
Returns an array of all the bots in the game. Returns an array of all the bots in the game.
*/ */