diff --git a/maps/bots/_bot.gsc b/maps/bots/_bot.gsc index 1e7a2b8..8b58d87 100644 --- a/maps/bots/_bot.gsc +++ b/maps/bots/_bot.gsc @@ -241,7 +241,12 @@ onActorDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, { if ( isdefined( eAttacker ) && isplayer( eAttacker ) && eAttacker is_bot() && getdvarint( "bots_t8_mode" ) && ( !isdefined( self.magic_bullet_shield ) || !self.magic_bullet_shield ) ) { - iDamage += int( self.maxhealth * randomfloatrange( 0.25, 1.25 ) ); + bonus = int( self.maxhealth * randomfloatrange( 0.25, 1.25 ) ); + + if ( bonus > 0 ) + { + iDamage += bonus; + } } self [[ level.prevcallbackactordamage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, iModelIndex, iTimeOffset ); diff --git a/maps/bots/_bot_script.gsc b/maps/bots/_bot_script.gsc index da8add0..d9f1902 100644 --- a/maps/bots/_bot_script.gsc +++ b/maps/bots/_bot_script.gsc @@ -409,6 +409,7 @@ start_bot_threads() self endon( "zombified" ); self thread doReloadCancel(); + self thread bot_weapon_think(); self thread maps\bots\objectives\_manager::start_bot_threads(); } @@ -532,3 +533,102 @@ doReloadCancel() 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 inLastStand() ) + { + 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 ) && curWeap != "molotov" && curWeap != "molotov_zombie" ) + { + 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 ( curWeap == weapon ) + { + continue; + } + + weap = weapon; + break; + } + + if ( weap == "" ) + { + return; + } + + self thread changeToWeapon( weap ); +} + +/* + Bot logic for switching weapons. +*/ +bot_weapon_think() +{ + self endon( "disconnect" ); + self endon( "zombified" ); + level endon( "game_ended" ); + + data = spawnstruct(); + data.first = true; + + for ( ;; ) + { + self bot_weapon_think_loop( data ); + } +}