bots properally use weapons

This commit is contained in:
ineed bots
2024-09-21 23:36:57 -06:00
parent 0028ed705f
commit 3bc50e5a33
4 changed files with 360 additions and 4 deletions

View File

@ -6,7 +6,7 @@
*/
init()
{
level.bw_version = "2.2.0 PR 1";
level.bw_version = "2.3.0 PR 1";
if ( getcvar( "bots_main" ) == "" )
{
@ -43,7 +43,7 @@ init()
if ( getcvar( "bots_main_kickBotsAtEnd" ) == "" )
{
setcvar( "bots_main_kickBotsAtEnd", false ); // kicks the bots at game end
setcvar( "bots_main_kickBotsAtEnd", true ); // kicks the bots at game end
}
if ( getcvar( "bots_manage_add" ) == "" )
@ -70,7 +70,7 @@ init()
{
setcvar( "bots_manage_fill_kick", false ); // kick bots if too many
}
if ( getcvar( "bots_manage_fill_watchplayers" ) == "" )
{
setcvar( "bots_manage_fill_watchplayers", false ); // add bots when player exists, kick if not

View File

@ -9,6 +9,11 @@ added()
self endon( "disconnect" );
self set_diff();
if ( randomfloatrange( 0, 1 ) < 0.5 )
{
self.pers[ "bots" ][ "behavior" ][ "quickscope" ] = true;
}
}
/*
@ -662,4 +667,226 @@ start_bot_threads()
self endon( "disconnect" );
level endon( "game_ended" );
self endon( "death" );
self thread doReloadCancel();
self thread bot_weapon_think();
}
/*
Changes to the weap
*/
changeToWeapon( weap )
{
self endon( "disconnect" );
self endon( "death" );
level endon( "game_ended" );
if ( !self hasweapon( weap ) )
{
return false;
}
self BotBuiltinBotWeapon( weap );
if ( self getcurrentweapon() == weap )
{
return true;
}
self waittill_any_timeout( 5, "weapon_change" );
return ( self getcurrentweapon() == weap );
}
/*
Reload cancels
*/
doReloadCancel_loop()
{
ret = self waittill_either_return( "reload", "weapon_change" );
if ( self BotIsFrozen() )
{
return;
}
if ( self isPlantingOrDefusing() )
{
return;
}
curWeap = self getcurrentweapon();
if ( !isWeaponDroppable( curWeap ) )
{
return;
}
if ( ret == "reload" )
{
// check single reloads
if ( self getweaponslotclipammo( getWeaponSlot( curWeap ) ) < WeaponClipSize( curWeap ) )
{
return;
}
}
// check difficulty
if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 3 )
{
return;
}
// check if got another weapon
weaponslist = self getWeaponsListPrimaries();
weap = "";
while ( weaponslist.size )
{
weapon = weaponslist[ randomint( weaponslist.size ) ];
weaponslist = array_remove( weaponslist, weapon );
if ( !isWeaponDroppable( curWeap ) )
{
continue;
}
if ( curWeap == weapon || weapon == "none" || weapon == "" )
{
continue;
}
weap = weapon;
break;
}
if ( weap == "" )
{
return;
}
// do the cancel
wait 0.1;
self thread changeToWeapon( weap );
wait 0.25;
self thread changeToWeapon( curWeap );
wait 2;
}
/*
Reload cancels
*/
doReloadCancel()
{
self endon( "disconnect" );
self endon( "death" );
for ( ;; )
{
self doReloadCancel_loop();
}
}
/*
Bot logic for switching weapons.
*/
bot_weapon_think_loop( data )
{
ret = self waittill_any_timeout( randomintrange( 2, 4 ), "bot_force_check_switch" );
if ( self BotIsFrozen() )
{
return;
}
if ( self isPlantingOrDefusing() )
{
return;
}
hasTarget = self HasThreat();
curWeap = self getcurrentweapon();
force = ( ret == "bot_force_check_switch" );
if ( data.first )
{
data.first = false;
if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "initswitch" ] )
{
return;
}
}
else
{
if ( curWeap != "none" && self getAmmoCount( curWeap ) )
{
if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "switch" ] )
{
return;
}
if ( hasTarget )
{
return;
}
}
else
{
force = true;
}
}
weaponslist = self getWeaponsListPrimaries();
weap = "";
while ( weaponslist.size )
{
weapon = weaponslist[ randomint( weaponslist.size ) ];
weaponslist = array_remove( weaponslist, weapon );
if ( !self getAmmoCount( weapon ) && !force )
{
continue;
}
if ( isWeaponDroppable( weapon ) )
{
continue;
}
if ( curWeap == weapon || weapon == "none" || weapon == "" )
{
continue;
}
weap = weapon;
break;
}
if ( weap == "" )
{
return;
}
self thread changeToWeapon( weap );
}
/*
Bot logic for switching weapons.
*/
bot_weapon_think()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
data = spawnstruct();
data.first = true;
for ( ;; )
{
self bot_weapon_think_loop( data );
}
}

View File

@ -96,6 +96,17 @@ BotBuiltinBotAngles( angles )
}
}
/*
Sets weapon
*/
BotBuiltinBotWeapon( weapon )
{
if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botweapon" ] ) )
{
self [[ level.bot_builtins[ "botweapon" ] ]]( weapon );
}
}
/*
Returns if player is the host
*/
@ -479,6 +490,11 @@ ClearPriorityObjective()
self notify( "kill_goal" );
}
isPlantingOrDefusing()
{
return isdefined( self.progressbackground );
}
/*
If the site is in use
*/
@ -591,6 +607,16 @@ getWeaponSlot( weap )
}
}
getWeaponsListPrimaries()
{
answer = [];
answer[ answer.size ] = self getweaponslotweapon( "primary" );
answer[ answer.size ] = self getweaponslotweapon( "primaryb" );
return answer;
}
/*
cOD2
*/