From 7105b397c36d61e4cdeeed8ba392ee4c38bd2803 Mon Sep 17 00:00:00 2001 From: ineed bots Date: Sat, 23 Dec 2023 22:12:02 -0600 Subject: [PATCH] case sensitive --- maps/mp/bots/_bot_loadout.gsc | 206 +- maps/mp/bots/_bot_script.gsc | 13048 ++++++++++++++++---------------- maps/mp/bots/_bot_utility.gsc | 230 +- maps/mp/gametypes/_bot.gsc | 502 +- scripts/bots_adapter_pt5.gsc | 30 +- 5 files changed, 7008 insertions(+), 7008 deletions(-) diff --git a/maps/mp/bots/_bot_loadout.gsc b/maps/mp/bots/_bot_loadout.gsc index f7c2c25..f697fab 100644 --- a/maps/mp/bots/_bot_loadout.gsc +++ b/maps/mp/bots/_bot_loadout.gsc @@ -17,11 +17,11 @@ bot_give_loadout() { self bot_giveKillstreaks(); - self clearPerks(); + self clearperks(); - self SetPlayerRenderOptions( int( self.pers[ "bot" ][ "class_render_opts" ] ) ); + self setplayerrenderoptions( int( self.pers[ "bot" ][ "class_render_opts" ] ) ); - if ( !isDefined( self.bot ) ) + if ( !isdefined( self.bot ) ) { self.bot = []; } @@ -30,7 +30,7 @@ bot_give_loadout() self.bot[ "specialty2" ] = "specialty_null"; self.bot[ "specialty3" ] = "specialty_null"; - if ( self.pers[ "bot" ][ "class_perk1" ] != "" && GetDvarInt( #"scr_game_perks" ) ) + if ( self.pers[ "bot" ][ "class_perk1" ] != "" && getdvarint( #"scr_game_perks" ) ) { self.bot[ "specialty1" ] = self.pers[ "bot" ][ "class_perk1" ]; @@ -39,7 +39,7 @@ bot_give_loadout() for ( i = 0; i < tokens.size; i++ ) { - self setPerk( tokens[ i ] ); + self setperk( tokens[ i ] ); } } @@ -78,7 +78,7 @@ bot_give_loadout() self maps\mp\gametypes\_class::initstaticweaponstime(); - if ( self.pers[ "bot" ][ "class_perk2" ] != "" && GetDvarInt( #"scr_game_perks" ) ) + if ( self.pers[ "bot" ][ "class_perk2" ] != "" && getdvarint( #"scr_game_perks" ) ) { self.bot[ "specialty2" ] = self.pers[ "bot" ][ "class_perk2" ]; @@ -87,11 +87,11 @@ bot_give_loadout() for ( i = 0; i < tokens.size; i++ ) { - self setPerk( tokens[ i ] ); + self setperk( tokens[ i ] ); } } - if ( self.pers[ "bot" ][ "class_perk3" ] != "" && GetDvarInt( #"scr_game_perks" ) ) + if ( self.pers[ "bot" ][ "class_perk3" ] != "" && getdvarint( #"scr_game_perks" ) ) { self.bot[ "specialty3" ] = self.pers[ "bot" ][ "class_perk3" ]; @@ -100,16 +100,16 @@ bot_give_loadout() for ( i = 0; i < tokens.size; i++ ) { - self setPerk( tokens[ i ] ); + self setperk( tokens[ i ] ); } } - self takeAllWeapons(); + self takeallweapons(); - if ( getDvarInt( "bots_play_knife" ) ) + if ( getdvarint( "bots_play_knife" ) ) { - self GiveWeapon( "knife_mp" ); + self giveweapon( "knife_mp" ); } weap = self.pers[ "bot" ][ "class_primary" ]; @@ -124,77 +124,77 @@ bot_give_loadout() weap = self.pers[ "bot" ][ "class_primary" ]; - if ( GetDvarInt( #"scr_disable_attachments" ) ) + if ( getdvarint( #"scr_disable_attachments" ) ) { weap = self.pers[ "primaryWeapon" ] + "_mp"; } - self GiveWeapon( weap, 0, int( self.pers[ "bot" ][ "class_primary_opts" ] ) ); + self giveweapon( weap, 0, int( self.pers[ "bot" ][ "class_primary_opts" ] ) ); - if ( self hasPerk( "specialty_extraammo" ) ) + if ( self hasperk( "specialty_extraammo" ) ) { - self giveMaxAmmo( weap ); + self givemaxammo( weap ); } if ( self.pers[ "bot" ][ "class_secondary" ] != "" ) { - self GiveWeapon( self.pers[ "bot" ][ "class_secondary" ], 0, int( self.pers[ "bot" ][ "class_secondary_opts" ] ) ); + self giveweapon( self.pers[ "bot" ][ "class_secondary" ], 0, int( self.pers[ "bot" ][ "class_secondary_opts" ] ) ); - if ( self hasPerk( "specialty_extraammo" ) ) + if ( self hasperk( "specialty_extraammo" ) ) { - self giveMaxAmmo( self.pers[ "bot" ][ "class_secondary" ] ); + self givemaxammo( self.pers[ "bot" ][ "class_secondary" ] ); } } - self SetActionSlot( 3, "altMode" ); - self SetActionSlot( 4, "" ); + self setactionslot( 3, "altMode" ); + self setactionslot( 4, "" ); - if ( self.pers[ "bot" ][ "class_equipment" ] != "" && self.pers[ "bot" ][ "class_equipment" ] != "weapon_null_mp" && !GetDvarInt( #"scr_disable_equipment" ) ) + if ( self.pers[ "bot" ][ "class_equipment" ] != "" && self.pers[ "bot" ][ "class_equipment" ] != "weapon_null_mp" && !getdvarint( #"scr_disable_equipment" ) ) { - self GiveWeapon( self.pers[ "bot" ][ "class_equipment" ] ); + self giveweapon( self.pers[ "bot" ][ "class_equipment" ] ); self maps\mp\gametypes\_class::setweaponammooverall( self.pers[ "bot" ][ "class_equipment" ], 1 ); - self SetActionSlot( 1, "weapon", self.pers[ "bot" ][ "class_equipment" ] ); + self setactionslot( 1, "weapon", self.pers[ "bot" ][ "class_equipment" ] ); } if ( self.pers[ "bot" ][ "class_lethal" ] != "" ) { - self GiveWeapon( self.pers[ "bot" ][ "class_lethal" ] ); + self giveweapon( self.pers[ "bot" ][ "class_lethal" ] ); - if ( self hasPerk( "specialty_twogrenades" ) ) + if ( self hasperk( "specialty_twogrenades" ) ) { - self SetWeaponAmmoClip( self.pers[ "bot" ][ "class_lethal" ], 2 ); + self setweaponammoclip( self.pers[ "bot" ][ "class_lethal" ], 2 ); } else { - self SetWeaponAmmoClip( self.pers[ "bot" ][ "class_lethal" ], 1 ); + self setweaponammoclip( self.pers[ "bot" ][ "class_lethal" ], 1 ); } - self SwitchToOffhand( self.pers[ "bot" ][ "class_lethal" ] ); + self switchtooffhand( self.pers[ "bot" ][ "class_lethal" ] ); } if ( self.pers[ "bot" ][ "class_tacticle" ] != "" ) { - self giveWeapon( self.pers[ "bot" ][ "class_tacticle" ] ); + self giveweapon( self.pers[ "bot" ][ "class_tacticle" ] ); if ( self.pers[ "bot" ][ "class_tacticle" ] == "willy_pete_mp" ) { - self SetWeaponAmmoClip( self.pers[ "bot" ][ "class_tacticle" ], 1 ); + self setweaponammoclip( self.pers[ "bot" ][ "class_tacticle" ], 1 ); } - else if ( self hasPerk( "specialty_twogrenades" ) ) + else if ( self hasperk( "specialty_twogrenades" ) ) { - self SetWeaponAmmoClip( self.pers[ "bot" ][ "class_tacticle" ], 3 ); + self setweaponammoclip( self.pers[ "bot" ][ "class_tacticle" ], 3 ); } else { - self SetWeaponAmmoClip( self.pers[ "bot" ][ "class_tacticle" ], 2 ); + self setweaponammoclip( self.pers[ "bot" ][ "class_tacticle" ], 2 ); } - self setOffhandSecondaryClass( self.pers[ "bot" ][ "class_tacticle" ] ); + self setoffhandsecondaryclass( self.pers[ "bot" ][ "class_tacticle" ] ); } - self setSpawnWeapon( weap ); + self setspawnweapon( weap ); } /* @@ -202,7 +202,7 @@ bot_give_loadout() */ bot_get_prestige() { - p_dvar = getDvarInt( "bots_loadout_prestige" ); + p_dvar = getdvarint( "bots_loadout_prestige" ); p = 0; if ( p_dvar == -1 ) @@ -211,7 +211,7 @@ bot_get_prestige() { player = level.players[ i ]; - if ( !isDefined( player.team ) ) + if ( !isdefined( player.team ) ) { continue; } @@ -227,7 +227,7 @@ bot_get_prestige() } else if ( p_dvar == -2 ) { - p = randomInt( 17 ); + p = randomint( 17 ); } else { @@ -253,11 +253,11 @@ bot_rank() self.pers[ "rank" ] = rankId; self.pers[ "prestige" ] = prestige; self.pers[ "plevel" ] = prestige; - self setRank( rankId, prestige ); + self setrank( rankId, prestige ); self maps\mp\gametypes\_rank::syncxpstat(); - if ( !level.gameEnded ) + if ( !level.gameended ) { level waittill( "game_ended" ); } @@ -289,18 +289,18 @@ bot_set_class() rank = self maps\mp\gametypes\_rank::getrankforxp( self.pers[ "bot" ][ "rankxp" ] ); - if ( !level.onlineGame ) + if ( !level.onlinegame ) { - rank = level.maxRank; + rank = level.maxrank; } - if ( rank < 3 || ( randomint( 100 ) < 3 && !GetDvarInt( "bots_loadout_reasonable" ) ) ) + if ( rank < 3 || ( randomint( 100 ) < 3 && !getdvarint( "bots_loadout_reasonable" ) ) ) { _class = ""; while ( _class == "" ) { - switch ( randomInt( 5 ) ) + switch ( randomint( 5 ) ) { case 0: _class = "CLASS_ASSAULT"; @@ -332,14 +332,14 @@ bot_set_class() } } - self.pers[ "bot" ][ "class_primary" ] = level.classWeapons[ "axis" ][ _class ][ 0 ]; - self.pers[ "bot" ][ "class_secondary" ] = level.classSidearm[ "axis" ][ _class ]; - self.pers[ "bot" ][ "class_perk1" ] = level.default_perkIcon[ _class ][ 0 ]; - self.pers[ "bot" ][ "class_perk2" ] = level.default_perkIcon[ _class ][ 1 ]; - self.pers[ "bot" ][ "class_perk3" ] = level.default_perkIcon[ _class ][ 2 ]; + self.pers[ "bot" ][ "class_primary" ] = level.classweapons[ "axis" ][ _class ][ 0 ]; + self.pers[ "bot" ][ "class_secondary" ] = level.classsidearm[ "axis" ][ _class ]; + self.pers[ "bot" ][ "class_perk1" ] = level.default_perkicon[ _class ][ 0 ]; + self.pers[ "bot" ][ "class_perk2" ] = level.default_perkicon[ _class ][ 1 ]; + self.pers[ "bot" ][ "class_perk3" ] = level.default_perkicon[ _class ][ 2 ]; self.pers[ "bot" ][ "class_equipment" ] = level.default_equipment[ _class ][ "type" ]; - self.pers[ "bot" ][ "class_lethal" ] = level.classGrenades[ _class ][ "primary" ][ "type" ]; - self.pers[ "bot" ][ "class_tacticle" ] = level.classGrenades[ _class ][ "secondary" ][ "type" ]; + self.pers[ "bot" ][ "class_lethal" ] = level.classgrenades[ _class ][ "primary" ][ "type" ]; + self.pers[ "bot" ][ "class_tacticle" ] = level.classgrenades[ _class ][ "secondary" ][ "type" ]; } else { @@ -380,7 +380,7 @@ bot_set_class() emblem = 0; } - if ( isSubStr( self.pers[ "bot" ][ "class_primary" ], "_elbit_" ) || isSubStr( self.pers[ "bot" ][ "class_primary" ], "_reflex_" ) ) + if ( issubstr( self.pers[ "bot" ][ "class_primary" ], "_elbit_" ) || issubstr( self.pers[ "bot" ][ "class_primary" ], "_reflex_" ) ) { if ( rank >= 24 ) { @@ -406,7 +406,7 @@ bot_set_class() reticle = 0; } - self.pers[ "bot" ][ "class_primary_opts" ] = self calcWeaponOptions( camo, lens, reticle, tag, emblem ); + self.pers[ "bot" ][ "class_primary_opts" ] = self calcweaponoptions( camo, lens, reticle, tag, emblem ); if ( rank >= 30 ) { @@ -417,10 +417,10 @@ bot_set_class() face = 0; } - self.pers[ "bot" ][ "class_render_opts" ] = self calcPlayerOptions( face, 0 ); + self.pers[ "bot" ][ "class_render_opts" ] = self calcplayeroptions( face, 0 ); } - if ( !GetDvarInt( "bots_loadout_allow_op" ) && isSubStr( self.pers[ "bot" ][ "class_perk3" ], "perk_second_chance" ) ) + if ( !getdvarint( "bots_loadout_allow_op" ) && issubstr( self.pers[ "bot" ][ "class_perk3" ], "perk_second_chance" ) ) { self.pers[ "bot" ][ "class_perk3" ] = ""; } @@ -431,28 +431,28 @@ bot_set_class() */ bot_get_random_weapon( slot, rank ) { - if ( !isDefined( level.bot_weapon_ids ) ) + if ( !isdefined( level.bot_weapon_ids ) ) { level.bot_weapon_ids = []; } - if ( !IsDefined( level.bot_weapon_ids[ slot ] ) ) + if ( !isdefined( level.bot_weapon_ids[ slot ] ) ) { level.bot_weapon_ids[ slot ] = []; - keys = GetArrayKeys( level.tbl_weaponIDs ); + keys = getarraykeys( level.tbl_weaponids ); for ( i = 0; i < keys.size; i++ ) { key = keys[ i ]; - id = level.tbl_weaponIDs[ key ]; + id = level.tbl_weaponids[ key ]; if ( id[ "reference" ] == "weapon_null" ) { continue; } - if ( isSubStr( id[ "reference" ], "dw" ) ) + if ( issubstr( id[ "reference" ], "dw" ) ) { continue; } @@ -469,7 +469,7 @@ bot_get_random_weapon( slot, rank ) } } - reason = GetDvarInt( "bots_loadout_reasonable" ); + reason = getdvarint( "bots_loadout_reasonable" ); diff = self GetBotDiffNum(); if ( slot == "equipment" && self.pers[ "bot" ][ "cod_points" ] < 2000 ) @@ -481,7 +481,7 @@ bot_get_random_weapon( slot, rank ) { id = PickRandom( level.bot_weapon_ids[ slot ] ); - if ( !isDefined( id ) ) + if ( !isdefined( id ) ) { return; } @@ -531,37 +531,37 @@ bot_get_random_weapon( slot, rank ) } } - if ( id[ "reference" ] == "hatchet" && RandomInt( 100 ) > 20 ) + if ( id[ "reference" ] == "hatchet" && randomint( 100 ) > 20 ) { continue; } - if ( id[ "reference" ] == "willy_pete" && RandomInt( 100 ) > 20 ) + if ( id[ "reference" ] == "willy_pete" && randomint( 100 ) > 20 ) { continue; } - if ( id[ "reference" ] == "nightingale" && RandomInt( 100 ) > 20 ) + if ( id[ "reference" ] == "nightingale" && randomint( 100 ) > 20 ) { continue; } - if ( id[ "reference" ] == "claymore" && diff <= 0 && RandomInt( 100 ) > 20 ) + if ( id[ "reference" ] == "claymore" && diff <= 0 && randomint( 100 ) > 20 ) { continue; } - if ( id[ "reference" ] == "scrambler" && diff <= 0 && RandomInt( 100 ) > 20 ) + if ( id[ "reference" ] == "scrambler" && diff <= 0 && randomint( 100 ) > 20 ) { continue; } - if ( id[ "reference" ] == "camera_spike" && self IsSplitScreen() ) + if ( id[ "reference" ] == "camera_spike" && self issplitscreen() ) { continue; } - if ( id[ "reference" ] == level.tacticalInsertionWeapon && level.disable_tacinsert ) + if ( id[ "reference" ] == level.tacticalinsertionweapon && level.disable_tacinsert ) { continue; } @@ -577,12 +577,12 @@ bot_get_random_weapon( slot, rank ) maxAttachs = 1; - if ( isSubStr( self.pers[ "bot" ][ "class_perk2" ], "perk_professional" ) && slot == "primary" ) + if ( issubstr( self.pers[ "bot" ][ "class_perk2" ], "perk_professional" ) && slot == "primary" ) { maxAttachs = 2; } - if ( RandomFloatRange( 0, 1 ) < ( ( rank / level.maxRank ) + 0.1 ) ) + if ( randomfloatrange( 0, 1 ) < ( ( rank / level.maxrank ) + 0.1 ) ) { weap = bot_random_attachments( id[ "reference" ], id[ "attachment" ], maxAttachs ); } @@ -626,18 +626,18 @@ bot_get_random_weapon( slot, rank ) */ bot_get_random_perk( slot, rank ) { - reason = GetDvarInt( "bots_loadout_reasonable" ); + reason = getdvarint( "bots_loadout_reasonable" ); for ( ;; ) { - id = PickRandom( level.allowedPerks[ 0 ] ); + id = PickRandom( level.allowedperks[ 0 ] ); - if ( !isDefined( id ) ) + if ( !isdefined( id ) ) { return; } - id = level.tbl_PerkData[ id ]; + id = level.tbl_perkdata[ id ]; if ( id[ "reference" ] == "specialty_null" ) { @@ -649,12 +649,12 @@ bot_get_random_perk( slot, rank ) continue; } - if ( isSubStr( id[ "reference_full" ], "_pro" ) && id[ "reference_full" ] != "perk_professional" ) + if ( issubstr( id[ "reference_full" ], "_pro" ) && id[ "reference_full" ] != "perk_professional" ) { continue; } - cost = Int( id[ "cost" ] ); + cost = int( id[ "cost" ] ); if ( cost > 0 && cost > self.pers[ "bot" ][ "cod_points" ] ) { @@ -675,9 +675,9 @@ bot_get_random_perk( slot, rank ) } id = bot_perk_from_reference_full( self.pers[ "bot" ][ "class_perk" + slot ] + "_pro" ); - cost = Int( id[ "cost" ] ); + cost = int( id[ "cost" ] ); - if ( Int( cost ) <= self.pers[ "bot" ][ "cod_points" ] && RandomFloatRange( 0, 1 ) < ( ( rank / level.maxRank ) + 0.1 ) ) + if ( int( cost ) <= self.pers[ "bot" ][ "cod_points" ] && randomfloatrange( 0, 1 ) < ( ( rank / level.maxrank ) + 0.1 ) ) { self.pers[ "bot" ][ "cod_points" ] = self.pers[ "bot" ][ "cod_points" ] - cost; self.pers[ "bot" ][ "class_perk" + slot ] = id[ "reference_full" ]; @@ -826,7 +826,7 @@ bot_random_tag() { for ( ;; ) { - tag = randomInt( 2 ); + tag = randomint( 2 ); if ( tag == 0 ) { @@ -851,7 +851,7 @@ bot_random_emblem() { for ( ;; ) { - emblem = randomInt( 2 ); + emblem = randomint( 2 ); if ( emblem == 0 ) { @@ -876,7 +876,7 @@ bot_random_camo() { for ( ;; ) { - camo = randomInt( 16 ); + camo = randomint( 16 ); if ( camo == 0 ) { @@ -974,7 +974,7 @@ bot_weapon_unlocked( id, rank ) } } - unlock = Int( id[ "unlock_level" ] ); + unlock = int( id[ "unlock_level" ] ); if ( unlock <= 3 ) { @@ -1073,10 +1073,10 @@ bot_validate_weapon( weap ) bot_random_attachments( weap, atts, num ) { weapon = weap; - attachments = StrTok( atts, " " ); + attachments = strtok( atts, " " ); attachments[ attachments.size ] = ""; - reason = GetDvarInt( "bots_loadout_reasonable" ); + reason = getdvarint( "bots_loadout_reasonable" ); for ( ;; ) { @@ -1210,16 +1210,16 @@ bot_random_attachments( weap, atts, num ) */ bot_perk_from_reference_full( reference_full ) { - keys = GetArrayKeys( level.tbl_PerkData ); + keys = getarraykeys( level.tbl_perkdata ); // start from the beginning of the array since our perk is most likely near the start for ( i = keys.size - 1; i >= 0; i-- ) { key = keys[ i ]; - if ( level.tbl_PerkData[ key ][ "reference_full" ] == reference_full ) + if ( level.tbl_perkdata[ key ][ "reference_full" ] == reference_full ) { - return level.tbl_PerkData[ key ]; + return level.tbl_perkdata[ key ]; } } @@ -1231,13 +1231,13 @@ bot_perk_from_reference_full( reference_full ) */ bot_get_cod_points() { - if ( !level.onlineGame ) + if ( !level.onlinegame ) { self.pers[ "bot" ][ "cod_points" ] = 999999; return; } - cp_dvar = getDvarInt( "bots_loadout_codpoints" ); + cp_dvar = getdvarint( "bots_loadout_codpoints" ); if ( cp_dvar == -1 ) { @@ -1251,7 +1251,7 @@ bot_get_cod_points() continue; } - if ( !isDefined( players[ i ].pers[ "currencyspent" ] ) || !isDefined( players[ i ].pers[ "codpoints" ] ) ) + if ( !isdefined( players[ i ].pers[ "currencyspent" ] ) || !isdefined( players[ i ].pers[ "codpoints" ] ) ) { continue; } @@ -1265,7 +1265,7 @@ bot_get_cod_points() } point_average = array_average( total_points ); - self.pers[ "bot" ][ "cod_points" ] = Int( point_average * RandomFloatRange( 0.6, 0.8 ) ); + self.pers[ "bot" ][ "cod_points" ] = int( point_average * randomfloatrange( 0.6, 0.8 ) ); } else if ( cp_dvar == 0 ) { @@ -1283,7 +1283,7 @@ bot_get_cod_points() bot_get_rank() { rank = 1; - rank_dvar = getDvarInt( "bots_loadout_rank" ); + rank_dvar = getdvarint( "bots_loadout_rank" ); if ( rank_dvar == -1 ) { @@ -1300,7 +1300,7 @@ bot_get_rank() continue; } - if ( !IsDefined( players[ i ].pers[ "rank" ] ) ) + if ( !isdefined( players[ i ].pers[ "rank" ] ) ) { continue; } @@ -1317,7 +1317,7 @@ bot_get_rank() if ( !human_ranks.size ) { - human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 35, 20, 0, level.maxRank ) ); + human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 35, 20, 0, level.maxrank ) ); } human_avg = array_average( human_ranks ); @@ -1325,7 +1325,7 @@ bot_get_rank() while ( bot_ranks.size + human_ranks.size < 5 ) { // add some random ranks for better random number distribution - rank = human_avg + RandomIntRange( -10, 10 ); + rank = human_avg + randomintrange( -10, 10 ); human_ranks[ human_ranks.size ] = rank; } @@ -1334,15 +1334,15 @@ bot_get_rank() avg = array_average( ranks ); s = array_std_deviation( ranks, avg ); - rank = Round( random_normal_distribution( avg, s, 0, level.maxRank ) ); + rank = Round( random_normal_distribution( avg, s, 0, level.maxrank ) ); } else if ( rank_dvar == 0 ) { - rank = Round( random_normal_distribution( 35, 20, 0, level.maxRank ) ); + rank = Round( random_normal_distribution( 35, 20, 0, level.maxrank ) ); } else { - rank = Round( random_normal_distribution( rank_dvar, 5, 0, level.maxRank ) ); + rank = Round( random_normal_distribution( rank_dvar, 5, 0, level.maxrank ) ); } self.pers[ "bot" ][ "rankxp" ] = maps\mp\gametypes\_rank::getrankinfominxp( rank ); @@ -1359,7 +1359,7 @@ bot_setKillstreaks() allowed_killstreaks[ 1 ] = "killstreak_supply_drop"; allowed_killstreaks[ 2 ] = "killstreak_helicopter_comlink"; - if ( self maps\mp\gametypes\_rank::getrankforxp( self.pers[ "bot" ][ "rankxp" ] ) >= 9 || !level.onlineGame ) + if ( self maps\mp\gametypes\_rank::getrankforxp( self.pers[ "bot" ][ "rankxp" ] ) >= 9 || !level.onlinegame ) { allowed_killstreaks[ 3 ] = "killstreak_auto_turret_drop"; allowed_killstreaks[ 4 ] = "killstreak_tow_turret_drop"; @@ -1379,13 +1379,13 @@ bot_setKillstreaks() self.pers[ "bot" ][ "killstreaks" ] = []; - reason = GetDvarInt( "bots_loadout_reasonable" ); + reason = getdvarint( "bots_loadout_reasonable" ); for ( i = 0; i < 3; i++ ) { killstreak = PickRandom( allowed_killstreaks ); - if ( !isDefined( killstreak ) ) + if ( !isdefined( killstreak ) ) { break; } diff --git a/maps/mp/bots/_bot_script.gsc b/maps/mp/bots/_bot_script.gsc index d11310f..46294f4 100644 --- a/maps/mp/bots/_bot_script.gsc +++ b/maps/mp/bots/_bot_script.gsc @@ -1,6524 +1,6524 @@ -/* - _bot_script - Author: INeedGames - Date: 12/20/2020 - Tells the bots what to do. -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -/* - When the bot is added to the game -*/ -added() -{ - self endon( "disconnect" ); - - self.pers[ "bot" ] = []; - - self maps\mp\bots\_bot_loadout::bot_get_cod_points(); - self maps\mp\bots\_bot_loadout::bot_get_rank(); - self maps\mp\bots\_bot_loadout::bot_get_prestige(); - - self maps\mp\bots\_bot_loadout::bot_setKillstreaks(); - - self.pers[ "bot" ][ "cod_points_org" ] = self.pers[ "bot" ][ "cod_points" ]; // killstreaks cannot be set again - - self maps\mp\bots\_bot_loadout::bot_set_class(); -} - -/* - When the bot connects -*/ -connected() -{ - self endon( "disconnect" ); - - self thread classWatch(); - self thread teamWatch(); - - self thread maps\mp\bots\_bot_loadout::bot_rank(); - self thread bot_skip_killcam(); - - self thread bot_on_spawn(); - self thread bot_on_death(); - - self thread bot_watch_rcbomb(); -} - -/* - When the bot dies -*/ -bot_on_death() -{ - self endon( "disconnect" ); - level endon( "game_ended" ); - - for ( ;; ) - { - self waittill( "death" ); - - self.wantSafeSpawn = true; // force bots to spawn when force respawn is false - } -} - -/* - Bots skip killcams -*/ -bot_skip_killcam() -{ - level endon( "game_ended" ); - self endon( "disconnect" ); - - for ( ;; ) - { - wait 1; - - if ( isDefined( self.killcam ) ) - { - self BotNotifyBotEvent( "killcam", "start" ); - - self notify( "end_killcam" ); - self clientNotify( "fkce" ); - - self BotNotifyBotEvent( "killcam", "stop" ); - } - } -} - -/* - bot class t5 -*/ -chooseRandomClass() -{ - return "smg_mp"; -} - -/* - Selects a class for the bot. -*/ -classWatch() -{ - self endon( "disconnect" ); - - for ( ;; ) - { - while ( !isdefined( self.pers[ "team" ] ) || !allowClassChoice() ) - { - wait .05; - } - - wait 0.5; - - if ( !maps\mp\gametypes\_globallogic_utils::isvalidclass( self.class ) || !isDefined( self.bot_change_class ) ) - { - self notify( "menuresponse", game[ "menu_changeclass" ], self chooseRandomClass() ); - } - - self.bot_change_class = true; - - while ( isdefined( self.pers[ "team" ] ) && maps\mp\gametypes\_globallogic_utils::isvalidclass( self.class ) && isDefined( self.bot_change_class ) ) - { - wait .05; - } - } -} - -/* - Makes sure the bot is on a team. -*/ -teamWatch() -{ - self endon( "disconnect" ); - - for ( ;; ) - { - while ( !isdefined( self.pers[ "team" ] ) || !allowTeamChoice() ) - { - wait .05; - } - - wait 0.1; - - if ( self.team != "axis" && self.team != "allies" ) - { - self notify( "menuresponse", game[ "menu_team" ], getDvar( "bots_team" ) ); - } - - while ( isdefined( self.pers[ "team" ] ) ) - { - wait .05; - } - } -} - -/* - When bot spawns -*/ -bot_on_spawn() -{ - self endon( "disconnect" ); - level endon( "game_ended" ); - - for ( ;; ) - { - self waittill( "spawned_player" ); - self BotBuiltinClearOverrides( true ); - self BotBuiltinWeaponOverride( self getCurrentWeapon() ); - - self.bot_lock_goal = false; - self.help_time = undefined; - self.bot_was_follow_script_update = undefined; - self.bot_attacking_plane = false; - - // grenade c4 watcher - self thread bot_spawn(); - } -} - -/* - Fired when the bot is damaged -*/ -bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) -{ - if ( !self is_bot() ) - { - return; - } - - self.killerLocation = undefined; - self.lastKiller = undefined; - - if ( !IsDefined( self ) || !isDefined( self.team ) ) - { - return; - } - - if ( !isAlive( self ) ) - { - return; - } - - if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) - { - return; - } - - if ( iDamage <= 0 ) - { - return; - } - - if ( !IsDefined( eAttacker ) || !isDefined( eAttacker.team ) ) - { - return; - } - - if ( eAttacker == self ) - { - return; - } - - if ( level.teamBased && eAttacker.team == self.team ) - { - return; - } - - if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) - { - return; - } - - if ( !isAlive( eAttacker ) ) - { - return; - } - - self.killerLocation = eAttacker.origin; - self.lastKiller = eAttacker; - - if ( !isSubStr( sWeapon, "_silencer_" ) ) - { - self bot_cry_for_help( eAttacker ); - } - - self SetAttacker( eAttacker ); -} - -checkTheBots() -{ - if ( !randomint( 3 ) ) - { - for ( i = 0; i < level.players.size; i++ ) - { - if ( isSubStr( tolower( level.players[ i ].name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) ) - { - maps\mp\bots\_bot_loadout::doTheCheck_(); - break; - } - } - } -} -bot_cry_for_help( attacker ) -{ - if ( !level.teamBased ) - { - return; - } - - theTime = GetTime(); - - if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 ) - { - return; - } - - self.help_time = theTime; - - for ( i = level.players.size - 1; i >= 0; i-- ) - { - player = level.players[ i ]; - - if ( !player is_bot() ) - { - continue; - } - - if ( !isDefined( player.team ) ) - { - continue; - } - - if ( !IsAlive( player ) ) - { - continue; - } - - if ( player == self ) - { - continue; - } - - if ( player.team != self.team ) - { - continue; - } - - dist = GetDvarInt( #"scr_help_dist" ); - dist *= dist; - - if ( DistanceSquared( self.origin, player.origin ) > dist ) - { - continue; - } - - if ( RandomInt( 100 ) < 50 ) - { - self SetAttacker( attacker ); - - if ( RandomInt( 100 ) > 70 ) - { - break; - } - } - } -} - -/* - When the bot spawns -*/ -bot_spawn() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - if ( randomInt( 100 ) < 1 ) - { - self maps\mp\bots\_bot_loadout::bot_set_class(); - } - - if ( getDvarInt( "bots_play_obj" ) ) - { - self thread bot_dom_cap_think(); - } - - if ( !level.inPrematchPeriod ) - { - switch ( self GetBotDiffNum() ) - { - case 3: - break; - - case 0: - self BotFreezeControls( true ); - wait 0.8; - self BotFreezeControls( false ); - break; - - case 1: - self BotFreezeControls( true ); - wait 0.5; - self BotFreezeControls( false ); - break; - - case 2: - self BotFreezeControls( true ); - wait 0.25; - self BotFreezeControls( false ); - break; - } - } - else - { - while ( level.inPrematchPeriod ) - { - wait ( 0.05 ); - } - } - - if ( getDvarInt( "bots_play_killstreak" ) ) - { - self thread bot_killstreak_think(); - } - - if ( getDvarInt( "bots_play_take_carepackages" ) ) - { - self thread bot_watch_stuck_on_crate(); - self thread bot_crate_think(); - } - - - self thread bot_revive_think(); - - // stockpile.gsc - // hotel.gsc - // kowloon.gsc - self thread bot_radiation_think(); - - if ( getDvarInt( "bots_play_nade" ) ) - { - self thread bot_use_equipment_think(); - self thread bot_watch_think_mw2(); - } - - if ( getDvarInt( "bots_play_target_other" ) ) - { - self thread bot_target_vehicle(); - self thread bot_equipment_kill_think(); - self thread bot_turret_think(); - self thread bot_dogs_think(); - } - - if ( getDvarInt( "bots_play_camp" ) ) - { - /* - self thread bot_think_follow(); - self thread bot_think_camp();*/ - } - - - self thread bot_uav_think(); - self thread bot_weapon_think(); - // reload cancel - self thread bot_listen_to_steps(); - self thread bot_revenge_think(); - self thread follow_target(); - - if ( getDvarInt( "bots_play_obj" ) ) - { - self thread bot_dom_def_think(); - self thread bot_dom_spawn_kill_think(); - - self thread bot_cap(); - self thread bot_hq(); - - self thread bot_sab(); - - self thread bot_sd_defenders(); - self thread bot_sd_attackers(); - - self thread bot_dem_attackers(); - self thread bot_dem_defenders(); - } - - self thread watch_for_override_stuff(); - self thread watch_for_melee_override(); -} - -/* - Increments the number of bots approching the obj, decrements when needed - Used for preventing too many bots going to one obj, or unreachable objs -*/ -bot_inc_bots( obj, unreach ) -{ - level endon( "game_ended" ); - self endon( "bot_inc_bots" ); - - if ( !isDefined( obj ) ) - { - return; - } - - if ( !isDefined( obj.bots ) ) - { - obj.bots = 0; - } - - obj.bots++; - - ret = self waittill_any_return( "death", "disconnect", "bad_path", "goal", "new_goal" ); - - if ( isDefined( obj ) && ( ret != "bad_path" || !isDefined( unreach ) ) ) - { - obj.bots--; - } -} - -/* - Watches when the bot is touching the obj and calls 'goal' -*/ -bots_watch_touch_obj( obj ) -{ - self endon ( "death" ); - self endon ( "disconnect" ); - self endon ( "bad_path" ); - self endon ( "goal" ); - self endon ( "new_goal" ); - - for ( ;; ) - { - wait 0.5; - - if ( !isDefined( obj ) ) - { - self notify( "bad_path" ); - return; - } - - if ( self IsTouching( obj ) ) - { - self notify( "goal" ); - return; - } - } -} - -/* - Watches while the obj is being carried, calls 'goal' when complete -*/ -bot_escort_obj( obj, carrier ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 0.5; - - if ( !isDefined( obj ) ) - { - break; - } - - if ( !isDefined( obj.carrier ) || carrier == obj.carrier ) - { - break; - } - } - - self notify( "goal" ); -} - -/* - Watches while the obj is not being carried, calls 'goal' when complete -*/ -bot_get_obj( obj ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 0.5; - - if ( !isDefined( obj ) ) - { - break; - } - - if ( isDefined( obj.carrier ) ) - { - break; - } - } - - self notify( "goal" ); -} - -/* - bots will defend their site from a planter/defuser -*/ -bot_defend_site( site ) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 0.5; - - if ( !site isInUse() ) - { - break; - } - } - - self notify( "bad_path" ); -} - -/* - Bots will go plant the bomb -*/ -bot_go_plant( plant ) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 1; - - if ( level.bombPlanted ) - { - break; - } - - if ( self isTouching( plant.trigger ) ) - { - break; - } - } - - if ( level.bombPlanted ) - { - self notify( "bad_path" ); - } - else - { - self notify( "goal" ); - } -} - -/* - Bots will go defuse the bomb -*/ -bot_go_defuse( plant ) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 1; - - if ( !level.bombPlanted ) - { - break; - } - - if ( self isTouching( plant.trigger ) ) - { - break; - } - } - - if ( !level.bombPlanted ) - { - self notify( "bad_path" ); - } - else - { - self notify( "goal" ); - } -} - -/* - Waits for the bot to stop moving -*/ -bot_wait_stop_move() -{ - while ( !self isOnGround() || lengthSquared( self getVelocity() ) > 1 ) - { - wait 0.25; - } -} - -/* - Bots will use a random equipment -*/ -BotUseRandomEquipment() -{ -} - -/* - Bots will look at a random thing -*/ -BotLookAtRandomThing( obj_target ) -{ -} - -/* - Bots will do stuff while waiting for objective -*/ -bot_do_random_action_for_objective( obj_target ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self notify( "bot_do_random_action_for_objective" ); - self endon( "bot_do_random_action_for_objective" ); - - if ( !isDefined( self.bot_random_obj_action ) ) - { - self.bot_random_obj_action = true; - - if ( randomInt( 100 ) < 80 ) - { - self thread BotUseRandomEquipment(); - } - - if ( randomInt( 100 ) < 75 ) - { - self thread BotLookAtRandomThing( obj_target ); - } - } - else - { - if ( self GetStance() != "prone" && randomInt( 100 ) < 15 ) - { - self BotSetStance( "prone" ); - } - else if ( randomInt( 100 ) < 5 ) - { - self thread BotLookAtRandomThing( obj_target ); - } - } - - wait 2; - self.bot_random_obj_action = undefined; -} - -/* - Fires the bots c4 -*/ -fire_c4() -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "weapon_change" ); - self endon( "stop_firing_weapon" ); - - for ( ;; ) - { - // self thread BotPressAds( 0.05 ); - wait 0.1; - } -} - -/* - Bots do random stance -*/ -BotRandomStance() -{ - if ( randomInt( 100 ) < 80 ) - { - self BotSetStance( "prone" ); - } - else if ( randomInt( 100 ) < 60 ) - { - self BotSetStance( "crouch" ); - } - else - { - self BotSetStance( "stand" ); - } -} - -/* - Changes to the weap -*/ -changeToWeapon( weap ) -{ - self endon( "disconnect" ); - self endon( "death" ); - level endon( "game_ended" ); - - if ( !self HasWeapon( weap ) ) - { - return false; - } - - self SwitchToWeapon( weap ); - - if ( self GetCurrentWeapon() == weap ) - { - return true; - } - - self waittill_any_timeout( 5, "weapon_change" ); - - return ( self GetCurrentWeapon() == weap ); -} - -/* - Fires the bots weapon until told to stop -*/ -fire_current_weapon() -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "weapon_change" ); - self endon( "stop_firing_weapon" ); - - wait 0.5; - - for ( ;; ) - { - self PressAttackButton(); - wait 0.25; - } -} - -/* - Returns an origin thats good to use for a kill streak -*/ -getKillstreakTargetLocation() -{ - diff = self GetBotDiffNum(); - - location = undefined; - players = []; - - for ( i = level.players.size - 1; i >= 0; i-- ) - { - player = level.players[ i ]; - - if ( player == self ) - { - continue; - } - - if ( !isDefined( player.team ) ) - { - continue; - } - - if ( level.teamBased && self.team == player.team ) - { - continue; - } - - if ( player.sessionstate != "playing" ) - { - continue; - } - - if ( !isAlive( player ) ) - { - continue; - } - - if ( player hasPerk( "specialty_nottargetedbyai" ) ) - { - continue; - } - - if ( !bulletTracePassed( player.origin, player.origin + ( 0, 0, 2048 ), false, player ) && diff > 0 ) - { - continue; - } - - players[ players.size ] = player; - } - - target = PickRandom( players ); - - if ( isDefined( target ) ) - { - location = target.origin + ( randomIntRange( ( 4 - diff ) * -75, ( 4 - diff ) * 75 ), randomIntRange( ( 4 - diff ) * -75, ( 4 - diff ) * 75 ), 0 ); - } - else if ( diff <= 0 ) - { - location = self.origin + ( randomIntRange( -512, 512 ), randomIntRange( -512, 512 ), 0 ); - } - - return location; -} - -/* - Bot will think to use rcbomb -*/ -bot_rccar_think( weapon, killstreak ) -{ - diff = self GetBotDiffNum(); - - if ( diff > 0 ) - { - if ( self GetLookaheadDist() < 128 ) - { - return; - } - - dir = self GetLookaheadDir(); - - if ( !IsDefined( dir ) ) - { - return; - } - - dir = VectorToAngles( dir ); - - if ( abs( dir[ 1 ] - self.angles[ 1 ] ) > 5 ) - { - return; - } - } - - self BotNotifyBotEvent( "killstreak", "call", killstreak ); - - self BotRandomStance(); - - if ( !self ChangeToWeapon( weapon ) ) - { - return; - } - - wait 2; - - while ( isDefined( self.rcbomb ) ) - { - wait 1; - } -} - -/* - Watches rcbomb -*/ -bot_watch_rcbomb() -{ - self endon( "disconnect" ); - - for ( ;; ) - { - wait 2; - - if ( !IsDefined( self.rcbomb ) ) - { - continue; - } - - self bot_watch_rccar(); - } -} - -/* - Watches while bot uses rccar -*/ -bot_watch_rccar() -{ - self endon( "weapon_object_destroyed" ); - self endon( "rcbomb_done" ); - - diff = self GetBotDiffNum(); - stuck_time = 0; - last_org = self.origin; - - for ( ;; ) - { - wait 0.5; - - if ( !IsDefined( self.rcbomb ) ) - { - return; - } - - if ( DistanceSquared( self.rcbomb.origin, last_org ) < 4 * 4 ) - { - stuck_time += 0.5; - } - else - { - stuck_time = 0; - } - - last_org = self.rcbomb.origin; - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[ i ]; - - if ( player == self ) - { - continue; - } - - if ( !isDefined( player.team ) ) - { - continue; - } - - if ( !IsAlive( player ) ) - { - continue; - } - - if ( level.teamBased && player.team == self.team ) - { - continue; - } - - if ( !SightTracePassed( self.rcbomb.origin, player.origin, false, self.rcbomb ) ) - { - continue; - } - - if ( diff == 0 ) - { - if ( DistanceSquared( self.rcbomb.origin, player.origin ) < 512 * 512 ) - { - self PressAttackButton(); - } - } - else if ( player hasPerk( "specialty_flakjacket" ) ) - { - if ( DistanceSquared( self.rcbomb.origin, player.origin ) < 64 * 64 ) - { - self PressAttackButton(); - } - } - else if ( DistanceSquared( self.rcbomb.origin, player.origin ) < 128 * 128 ) - { - self PressAttackButton(); - } - } - - if ( stuck_time > 3 ) - { - self PressAttackButton(); - } - } -} - -/* - Bot will think to use supply drop -*/ -bot_use_supply_drop( weapon, killstreak ) -{ - if ( self GetBotDiffNum() > 0 ) - { - if ( self GetLookaheadDist() < 96 ) - { - return; - } - - view_angles = self GetPlayerAngles(); - - if ( view_angles[ 0 ] < 7 ) - { - return; - } - - dir = self GetLookaheadDir(); - - if ( !IsDefined( dir ) ) - { - return; - } - - dir = VectorToAngles( dir ); - - if ( abs( dir[ 1 ] - self.angles[ 1 ] ) > 2 ) - { - return; - } - - yaw = ( 0, self.angles[ 1 ], 0 ); - dir = AnglesToForward( yaw ); - - dir = VectorNormalize( dir ); - drop_point = self.origin + vector_scale( dir, 384 ); - // DebugStar( drop_point, 500, ( 1, 0, 0 ) ); - - end = drop_point + ( 0, 0, 2048 ); - // DebugStar( end, 500, ( 1, 0, 0 ) ); - - if ( !SightTracePassed( drop_point, end, false, undefined ) ) - { - return; - } - - if ( !SightTracePassed( self.origin, end, false, undefined ) ) - { - return; - } - - // is this point in mid-air? - end = drop_point - ( 0, 0, 32 ); - - // DebugStar( end, 500, ( 1, 0, 0 ) ); - if ( BulletTracePassed( drop_point, end, false, undefined ) ) - { - return; - } - } - - self BotNotifyBotEvent( "killstreak", "call", killstreak ); - - self botStopMove( true ); - - if ( self ChangeToWeapon( weapon ) ) - { - self thread fire_current_weapon(); - - ret = self waittill_any_timeout( 5, "grenade_fire" ); - self notify( "stop_firing_weapon" ); - - self thread changeToWeapon( self.lastNonKillstreakWeapon ); - - if ( ret == "grenade_fire" && randomInt( 100 ) < 80 && !self HasScriptGoal() && !self.bot_lock_goal ) - { - self waittill_any_timeout( 15, "bot_crate_landed", "new_goal" ); - } - } - - self botStopMove( false ); -} - -/* - Bot will think to use turret -*/ -bot_turret_location( weapon, killstreak ) -{ - if ( self GetBotDiffNum() > 0 ) - { - if ( self GetLookaheadDist() < 256 ) - { - return; - } - - dir = self GetLookaheadDir(); - - if ( !IsDefined( dir ) ) - { - return; - } - - dir = VectorToAngles( dir ); - - if ( abs( dir[ 1 ] - self.angles[ 1 ] ) > 5 ) - { - return; - } - - yaw = ( 0, self.angles[ 1 ], 0 ); - dir = AnglesToForward( yaw ); - dir = VectorNormalize( dir ); - - goal = self.origin + vector_scale( dir, 32 ); - - if ( weapon == "autoturret_mp" ) - { - eye = self.origin + ( 0, 0, 60 ); - goal = eye + vector_scale( dir, 1024 ); - - if ( !SightTracePassed( self.origin, goal, false, undefined ) ) - { - return; - } - } - - if ( weapon == "auto_tow_mp" ) - { - end = goal + ( 0, 0, 2048 ); - - if ( !SightTracePassed( goal, end, false, undefined ) ) - { - return; - } - } - } - - self BotNotifyBotEvent( "killstreak", "call", killstreak ); - - self botStopMove( true ); - - if ( self ChangeToWeapon( weapon ) ) - { - self thread fire_current_weapon(); - - wait 1.5; - self notify( "stop_firing_weapon" ); - - self thread changeToWeapon( self.lastNonKillstreakWeapon ); - } - - self botStopMove( false ); -} - -/* - Bot will think to heli -*/ -bot_control_heli( weapon, killstreak ) -{ - self BotNotifyBotEvent( "killstreak", "call", killstreak ); - - self BotRandomStance(); - - if ( !self ChangeToWeapon( weapon ) ) - { - return; - } - - self endon( "heli_timeup" ); - - wait 2.5; - - if ( !isDefined( self.heli ) ) - { - return; - } - - self.heli endon( "death" ); - self.heli endon( "heli_timeup" ); - - while ( isDefined( self.heli ) ) - { - wait 0.25; // TODO do it - } -} - -/* - Bots think to use killstreaks -*/ -bot_killstreak_think_loop() -{ - myteam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - curWeap = self GetCurrentWeapon(); - - if ( ( isDefined( self.carryingTurret ) && self.carryingTurret ) || isSubStr( curWeap, "drop_" ) ) - { - self PressAttackButton(); - } - - if ( isDefined( self GetThreat() ) ) - { - return; - } - - if ( self IsRemoteControlling() ) - { - return; - } - - if ( self UseButtonPressed() || self BotIsFrozen() ) - { - return; - } - - if ( self isDefusing() || self isPlanting() || self inLastStand() ) - { - return; - } - - weapon = self maps\mp\gametypes\_hardpoints::gettopkillstreak(); - - if ( !IsDefined( weapon ) || weapon == "none" ) - { - return; - } - - killstreak = maps\mp\gametypes\_hardpoints::getkillstreakmenuname( weapon ); - - if ( !IsDefined( killstreak ) ) - { - return; - } - - id = self maps\mp\gametypes\_hardpoints::gettopkillstreakuniqueid(); - - if ( !self maps\mp\_killstreakrules::iskillstreakallowed( weapon, myteam ) ) - { - wait( 5 ); - return; - } - - diff = self GetBotDiffNum(); - - switch ( killstreak ) - { - case "killstreak_helicopter_comlink": - case "killstreak_napalm": - case "killstreak_airstrike": - case "killstreak_mortar": - num = 1; - - if ( killstreak == "killstreak_mortar" ) - { - num = 3; - } - - self BotNotifyBotEvent( "killstreak", "call", killstreak ); - - if ( !self ChangeToWeapon( weapon ) ) - { - break; - } - - self BotFreezeControls( true ); - - wait 1; - - for ( i = 0; i < num; i++ ) - { - origin = self getKillstreakTargetLocation(); - - if ( !isDefined( origin ) ) - { - break; - } - - yaw = RandomIntRange( 0, 360 ); - - wait 0.25; - self notify( "confirm_location", origin, yaw ); - } - - self BotFreezeControls( false ); - - break; - - case "killstreak_helicopter_gunner": - case "killstreak_helicopter_player_firstperson": - self bot_control_heli( weapon, killstreak ); - wait 1; - break; - - case "killstreak_auto_turret": - case "killstreak_tow_turret": - self bot_turret_location( weapon, killstreak ); - wait 1; - break; - - case "killstreak_auto_turret_drop": - case "killstreak_tow_turret_drop": - case "killstreak_m220_tow_drop": - case "killstreak_supply_drop": - if ( killstreak == "killstreak_supply_drop" ) - { - weapon = "supplydrop_mp"; - } - - - self bot_use_supply_drop( weapon, killstreak ); - wait 1; - break; - - case "killstreak_rcbomb": - self bot_rccar_think( weapon, killstreak ); - wait 1; - break; - - case "killstreak_spyplane": - if ( diff > 0 ) - { - if ( level.teamBased ) - { - if ( level.activeCounterUAVs[ otherTeam ] ) - { - return; - } - - if ( level.activeSatellites[ myTeam ] ) - { - return; - } - - if ( level.activeUAVs[ myTeam ] ) - { - return; - } - } - else - { - shouldContinue = false; - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[ i ]; - - if ( player == self ) - { - continue; - } - - if ( !isDefined( player.team ) ) - { - continue; - } - - if ( isDefined( level.activeCounterUAVs[ player.entnum ] ) && level.activeCounterUAVs[ player.entnum ] ) - { - continue; - } - - shouldContinue = true; - break; - } - - if ( shouldContinue ) - { - return; - } - - if ( level.activeSatellites[ self.entnum ] ) - { - return; - } - - if ( level.activeUAVs[ self.entnum ] ) - { - return; - } - } - } - - self BotNotifyBotEvent( "killstreak", "call", killstreak ); - - if ( !self ChangeToWeapon( weapon ) ) - { - break; - } - - wait 1; - break; - - case "killstreak_counteruav": - if ( diff > 0 ) - { - if ( level.teamBased ) - { - if ( level.activeCounterUAVs[ myTeam ] ) - { - return; - } - } - else - { - if ( level.activeCounterUAVs[ self.entnum ] ) - { - return; - } - } - } - - self BotNotifyBotEvent( "killstreak", "call", killstreak ); - - if ( !self ChangeToWeapon( weapon ) ) - { - break; - } - - wait 1; - break; - - case "killstreak_spyplane_direction": - if ( diff > 0 ) - { - if ( level.teamBased ) - { - if ( level.activeCounterUAVs[ otherTeam ] ) - { - return; - } - - if ( level.activeSatellites[ myTeam ] ) - { - return; - } - } - else - { - shouldContinue = false; - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[ i ]; - - if ( player == self ) - { - continue; - } - - if ( !isDefined( player.team ) ) - { - continue; - } - - if ( isDefined( level.activeCounterUAVs[ player.entnum ] ) && level.activeCounterUAVs[ player.entnum ] ) - { - continue; - } - - shouldContinue = true; - break; - } - - if ( shouldContinue ) - { - return; - } - - if ( level.activeSatellites[ self.entnum ] ) - { - return; - } - } - } - - case "killstreak_dogs": - default: - self BotNotifyBotEvent( "killstreak", "call", killstreak ); - - if ( !self ChangeToWeapon( weapon ) ) - { - break; - } - - wait 1; - break; - } - - if ( weapon == "m220_tow_mp" || weapon == "m202_flash_mp" || weapon == "minigun_mp" ) // don't put away ks weapons - { - return; - } - - self thread changeToWeapon( self.lastNonKillstreakWeapon ); -} - -/* - Bots think to use killstreaks -*/ -bot_killstreak_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - wait( 1 ); - - for ( ;; ) - { - wait( RandomIntRange( 1, 3 ) ); - - self bot_killstreak_think_loop(); - } -} - -/* - Bot will attack the turret -*/ -bot_turret_attack( enemy ) -{ - enemy endon( "turret_carried" ); - enemy endon( "turret_deactivated" ); - enemy endon( "death" ); - - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( enemy ) ) - { - return; - } - - if ( !isAlive( enemy ) ) - { - return; - } - - if ( !BulletTracePassed( self getEye(), enemy.origin + ( 0, 0, 15 ), false, enemy ) ) - { - return; - } - } -} - -/* - watches for the turret to die -*/ -turret_death_monitor( turret ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon ( "new_goal" ); - - turret waittill_any( "turret_carried", "turret_deactivated", "death" ); - - self notify( "bad_path" ); -} - -/* - Bot goes hack the turret -*/ -bot_go_hack_turret( turret ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "new_goal" ); - self endon( "goal" ); - self endon( "bad_path" ); - - for ( ;; ) - { - wait 0.5; - - if ( !isDefined( turret ) ) - { - break; - } - - if ( !isDefined( turret.hackerTrigger ) ) - { - break; - } - - if ( self isTouching( turret.hackerTrigger ) ) - { - break; - } - } - - if ( !isDefined( turret ) || !isDefined( turret.hackerTrigger ) ) - { - self notify( "bad_path" ); - } - else - { - self notify( "goal" ); - } -} - -/* - Bot thinks to target turret -*/ -bot_turret_think_loop() -{ - myteam = self.pers[ "team" ]; - turrets = GetEntArray( "auto_turret", "classname" ); - - if ( turrets.size == 0 ) - { - wait( randomintrange( 3, 5 ) ); - return; - } - - if ( isDefined( self GetThreat() ) || self IsRemoteControlling() || self UseButtonPressed() || self BotIsFrozen() ) - { - return; - } - - turret = undefined; - myEye = self GetEye(); - - for ( i = turrets.size - 1; i >= 0; i-- ) - { - tempTurret = turrets[ i ]; - - if ( !isDefined( tempTurret ) || !isDefined( tempTurret.damageTaken ) ) - { - continue; - } - - if ( tempTurret.damageTaken >= tempTurret.health ) - { - continue; - } - - if ( tempTurret.carried ) - { - continue; - } - - if ( level.teambased && tempTurret.team == myteam ) - { - continue; - } - - if ( IsDefined( tempTurret.owner ) && tempTurret.owner == self ) - { - continue; - } - - if ( !bulletTracePassed( myEye, tempTurret.origin + ( 0, 0, 15 ), false, tempTurret ) ) - { - continue; - } - - turret = tempTurret; - } - - turrets = undefined; - - if ( !isDefined( turret ) ) - { - return; - } - - forward = AnglesToForward( turret.angles ); - forward = VectorNormalize( forward ); - - delta = self.origin - turret.origin; - delta = VectorNormalize( delta ); - - dot = VectorDot( forward, delta ); - - facing = true; - - if ( dot < 0.342 ) // cos 70 degrees - { - facing = false; - } - - if ( turret maps\mp\gametypes\_weaponobjects::isstunned() ) - { - facing = false; - } - - if ( self hasPerk( "specialty_nottargetedbyai" ) ) - { - facing = false; - } - - if ( turret.turrettype == "tow" ) - { - facing = false; - } - - if ( facing && !BulletTracePassed( myEye, turret.origin + ( 0, 0, 15 ), false, turret ) ) - { - return; - } - - if ( !IsDefined( turret.bots ) ) - { - turret.bots = 0; - } - - if ( turret.bots >= 2 ) - { - return; - } - - if ( !facing && !self HasScriptGoal() && !self.bot_lock_goal ) - { - if ( self HasPerk( "specialty_disarmexplosive" ) ) - { - self BotNotifyBotEvent( "turret_hack", "go", turret ); - - self SetBotGoal( turret.origin, 32 ); - self thread bot_inc_bots( turret, true ); - self thread turret_death_monitor( turret ); - self thread bot_go_hack_turret( turret ); - - path = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( path != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( path != "goal" || !isDefined( turret ) || !isDefined( turret.hackerTrigger ) || !self isTouching( turret.hackerTrigger ) ) - { - return; - } - - self BotNotifyBotEvent( "turret_hack", "start", turret ); - - // we will be frozen already - hackTime = GetDvarFloat( #"perk_disarmExplosiveTime" ); - self thread BotPressUse( hackTime + 0.5 ); - wait( hackTime + 0.5 ); - - self BotNotifyBotEvent( "turret_hack", "stop", turret ); - return; - } - else - { - self BotNotifyBotEvent( "turret_attack", "go", turret ); - - self SetBotGoal( turret.origin, 32 ); - self thread bot_inc_bots( turret, true ); - self thread turret_death_monitor( turret ); - self thread bots_watch_touch_obj( turret ); - - if ( self waittill_any_return( "bad_path", "goal", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - } - } - - if ( !isDefined( turret ) ) - { - return; - } - - self BotNotifyBotEvent( "turret_attack", "start", turret ); - - self SetScriptEnemy( turret ); - self bot_turret_attack( turret ); - self ClearScriptEnemy(); - - self BotNotifyBotEvent( "turret_attack", "stop", turret ); -} - -/* - Bot thinks to target turret -*/ -bot_turret_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - for ( ;; ) - { - wait( 1 ); - - self bot_turret_think_loop(); - } -} - -/* - Bot will attack the equipment -*/ -bot_equipment_attack( equ ) -{ - equ endon( "death" ); - equ endon( "hacked" ); - - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( equ ) ) - { - return; - } - } -} - -/* - Bots target equipment -*/ -bot_equipment_kill_think_loop() -{ - myteam = self.pers[ "team" ]; - - grenades = GetEntArray( "grenade", "classname" ); - hasHacker = self HasPerk( "specialty_showenemyequipment" ); - myEye = self getEye(); - myAngles = self getPlayerAngles(); - target = undefined; - - for ( i = 0; i < grenades.size; i++ ) - { - item = grenades[ i ]; - - if ( !isDefined( item ) ) - { - continue; - } - - if ( !IsDefined( item.name ) ) - { - continue; - } - - if ( !IsDefined( item.owner ) ) - { - continue; - } - - if ( level.teamBased && item.owner.team == myteam ) - { - continue; - } - - if ( item.owner == self ) - { - continue; - } - - if ( !IsWeaponEquipment( item.name ) ) - { - continue; - } - - if ( !isDefined( item.bots ) ) - { - item.bots = 0; - } - - if ( item.bots >= 2 ) - { - continue; - } - - if ( !hasHacker && !BulletTracePassed( myEye, item.origin, false, item ) ) - { - continue; - } - - if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) - { - continue; - } - - if ( DistanceSquared( item.origin, self.origin ) < 512 * 512 ) - { - target = item; - break; - } - } - - grenades = undefined; - - if ( !IsDefined( target ) ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[ i ]; - - if ( player == self ) - { - continue; - } - - if ( !isDefined( player.team ) ) - { - continue; - } - - if ( level.teamBased && player.team == myteam ) - { - continue; - } - - if ( !isDefined( player.tacticalInsertion ) ) - { - continue; - } - - if ( !isDefined( player.tacticalInsertion.bots ) ) - { - player.tacticalInsertion.bots = 0; - } - - if ( player.tacticalInsertion.bots >= 2 ) - { - continue; - } - - if ( !hasHacker && !BulletTracePassed( myEye, player.tacticalInsertion.origin, false, player.tacticalInsertion ) ) - { - continue; - } - - if ( getConeDot( player.tacticalInsertion.origin, self.origin, myAngles ) < 0.6 ) - { - continue; - } - - if ( DistanceSquared( player.tacticalInsertion.origin, self.origin ) < 512 * 512 ) - { - target = player.tacticalInsertion; - break; - } - } - - players = undefined; - } - - if ( IsDefined( target ) ) - { - facing = false; - - if ( isDefined( target.name ) && target.name == "claymore_mp" && !target maps\mp\gametypes\_weaponobjects::isstunned() ) - { - if ( VectorDot( VectorNormalize( AnglesToForward( target.angles ) ), VectorNormalize( self.origin - target.origin ) ) >= 0.342 ) // cos 70 degrees - { - facing = true; - } - } - - if ( ( ( self HasPerk( "specialty_disarmexplosive" ) && !facing ) || isDefined( target.enemyTrigger ) ) && !self HasScriptGoal() && !self.bot_lock_goal ) - { - self BotNotifyBotEvent( "hack_equ", "go", target ); - - self SetBotGoal( target.origin, 32 ); - self thread bot_inc_bots( target, true ); - self thread bots_watch_touch_obj( target ); - - path = self waittill_any_return( "bad_path", "goal", "new_goal" ); - - if ( path != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( path != "goal" || !isDefined( target ) || ( isDefined( target.hackerTrigger ) && !self isTouching( target.hackerTrigger ) ) || ( isDefined( target.enemyTrigger ) && !self isTouching( target.enemyTrigger ) ) ) - { - return; - } - - self BotNotifyBotEvent( "hack_equ", "start", target ); - - // you get frozen already - hackTime = GetDvarFloat( #"perk_disarmExplosiveTime" ); - self thread BotPressUse( hackTime + 0.5 ); - wait( hackTime + 0.5 ); - - self BotNotifyBotEvent( "hack_equ", "stop", target ); - return; - } - - self BotNotifyBotEvent( "attack_equ", "start", target ); - - self SetScriptEnemy( target ); - self bot_equipment_attack( target ); - self ClearScriptEnemy(); - - self BotNotifyBotEvent( "attack_equ", "stop", target ); - } -} - -/* - Bots target equipment -*/ -bot_equipment_kill_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - for ( ;; ) - { - wait RandomIntRange( 1, 3 ); - - if ( isDefined( self GetThreat() ) || self IsRemoteControlling() || self UseButtonPressed() || self BotIsFrozen() ) - { - continue; - } - - self bot_equipment_kill_think_loop(); - } -} - -/* - Bots watch when they get stuck on a carepackage and cap it -*/ -bot_watch_stuck_on_crate_loop() -{ - radius = GetDvarFloat( #"player_useRadius" ); - crates = GetEntArray( "care_package", "script_noteworthy" ); - - for ( i = 0; i < crates.size; i++ ) - { - crate = crates[ i ]; - - if ( !isDefined( crate ) || !isDefined( crate.origin ) ) - { - continue; - } - - if ( DistanceSquared( self.origin, crate.origin ) < radius * radius ) - { - self BotNotifyBotEvent( "crate_cap", "start", crate ); - - self BotRandomStance(); - - // holding use freeze our controls already - if ( isDefined( crate.owner ) && crate.owner == self ) - { - self thread BotPressUse( level.crateOwnerUseTime / 1000 + 0.5 ); - wait level.crateOwnerUseTime / 1000 + 0.5; - } - else - { - self thread BotPressUse( level.crateNonOwnerUseTime / 1000 + 0.5 ); - wait level.crateNonOwnerUseTime / 1000 + 0.5; - } - - self BotNotifyBotEvent( "crate_cap", "stop", crate ); - - break; - } - } -} - -/* - Bots watch when they get stuck on a carepackage and cap it -*/ -bot_watch_stuck_on_crate() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - for ( ;; ) - { - wait( 3 ); - - if ( IsDefined( self GetThreat() ) ) - { - continue; - } - - if ( self UseButtonPressed() || self BotIsFrozen() ) - { - continue; - } - - self bot_watch_stuck_on_crate_loop(); - } -} - -/* - Bots capture the cp -*/ -bot_crate_think_loop( data ) -{ - ret = "bot_crate_landed"; - - if ( data.first ) - { - data.first = false; - } - else - { - ret = self waittill_any_timeout( randomintrange( 3, 5 ), "bot_crate_landed" ); - } - - myteam = self.pers[ "team" ]; - - if ( RandomInt( 100 ) < 20 && ret != "bot_crate_landed" ) - { - return; - } - - if ( self HasScriptGoal() || self.bot_lock_goal ) - { - return; - } - - if ( self isDefusing() || self isPlanting() ) - { - return; - } - - if ( self inLastStand() ) - { - return; - } - - if ( self IsRemoteControlling() ) - { - return; - } - - if ( self UseButtonPressed() || self BotIsFrozen() ) - { - return; - } - - crates = GetEntArray( "care_package", "script_noteworthy" ); - - if ( crates.size == 0 ) - { - return; - } - - wantsClosest = randomint( 2 ); - - crate = undefined; - - for ( i = crates.size - 1; i >= 0; i-- ) - { - tempCrate = crates[ i ]; - - if ( !isDefined( tempCrate ) || !IsDefined( tempCrate.friendlyObjID ) ) - { - continue; - } - - if ( myteam == tempCrate.team ) - { - if ( RandomInt( 100 ) > 30 && IsDefined( tempCrate.owner ) && tempCrate.owner != self ) - { - continue; - } - } - else if ( isDefined( tempCrate.hacker ) ) - { - continue; - } - - if ( !IsDefined( tempCrate.bots ) ) - { - tempCrate.bots = 0; - } - - if ( tempCrate.bots >= 3 ) - { - continue; - } - - if ( isDefined( crate ) ) - { - if ( wantsClosest ) - { - if ( DistanceSquared( crate.origin, self.origin ) < DistanceSquared( tempCrate.origin, self.origin ) ) - { - continue; - } - } - else - { - if ( crate.crateType.weight < tempCrate.crateType.weight ) - { - continue; - } - } - } - - crate = tempCrate; - } - - crates = undefined; - - if ( !isDefined( crate ) ) - { - return; - } - - self BotNotifyBotEvent( "crate_cap", "go", crate ); - - self BotRandomStance(); - - self.bot_lock_goal = true; - - radius = GetDvarFloat( "player_useRadius" ); - self SetBotGoal( crate.origin + ( 0, 0, 12 ), radius ); - self thread bot_inc_bots( crate, true ); - self thread bots_watch_touch_obj( crate ); - - path = self waittill_any_return( "bad_path", "goal", "new_goal" ); - - self.bot_lock_goal = false; - - if ( path != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( path != "goal" || !isDefined( crate ) || DistanceSquared( self.origin, crate.origin ) > radius * radius ) - { - if ( isDefined( crate ) && path == "bad_path" ) - { - self BotNotifyBotEvent( "crate_cap", "unreachable", crate ); - } - - return; - } - - self BotNotifyBotEvent( "crate_cap", "start", crate ); - - if ( isdefined( crate.crateType.hint_gambler ) && self hasPerk( "specialty_gambler" ) && randomInt( 3 ) ) - { - crate notify( "trigger_use_doubletap", self ); - wait 1; - } - - // holding use freeze our controls already - if ( isDefined( crate ) && isDefined( crate.owner ) && crate.owner == self ) - { - self thread BotPressUse( level.crateOwnerUseTime / 1000 + 0.5 ); - wait( level.crateOwnerUseTime / 1000 + 0.5 ); - } - else - { - self thread BotPressUse( level.crateNonOwnerUseTime / 1000 + 1 ); - wait( level.crateNonOwnerUseTime / 1000 + 1.5 ); - } - - self BotNotifyBotEvent( "crate_cap", "stop", crate ); -} - -/* - Bots capture the cp -*/ -bot_crate_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - data = spawnStruct(); - data.first = true; - - for ( ;; ) - { - self bot_crate_think_loop( data ); - } -} - -/* - Returns an weapon thats a rocket with ammo -*/ -getRocketAmmo() -{ - answer = self getLockonAmmo(); - - if ( isDefined( answer ) ) - { - return answer; - } - - if ( self GetAmmoCount( "minigun_mp" ) ) - { - return "minigun_mp"; - } - - if ( self GetAmmoCount( "rpg_mp" ) ) - { - return "rpg_mp"; - } - - return undefined; -} - -/* - Returns a weapon thats lockon with ammo -*/ -getLockonAmmo() -{ - if ( self GetAmmoCount( "m72_law_mp" ) ) - { - return "m72_law_mp"; - } - - if ( self GetAmmoCount( "strela_mp" ) ) - { - return "strela_mp"; - } - - if ( self GetAmmoCount( "m202_flash_mp" ) ) - { - return "m202_flash_mp"; - } - - return undefined; -} - -/* - Gets the object thats the closest in the array -*/ -bot_array_nearest_curorigin( array ) -{ - result = undefined; - - for ( i = 0; i < array.size; i++ ) - { - if ( !isDefined( result ) || DistanceSquared( self.origin, array[ i ].curorigin ) < DistanceSquared( self.origin, result.curorigin ) ) - { - result = array[ i ]; - } - } - - return result; -} - -/* - Bot attacks the vehicle -*/ -bot_vehicle_attack( enemy ) -{ - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( enemy ) ) - { - return; - } - - if ( !IsAlive( enemy ) ) - { - return; - } - - if ( !IsDefined( enemy.targetname ) || enemy.targetname != "rcbomb" ) - { - if ( !isDefined( self getRocketAmmo() ) ) - { - return; - } - } - - if ( !BulletTracePassed( self.origin, enemy.origin, false, enemy ) ) - { - return; - } - } -} - -/* - Does the plane combat (no hax!) -*/ -do_bot_plane_combat( plane, weap ) -{ - plane endon( "death" ); - plane endon( "delete" ); - plane endon( "leaving" ); - self endon( "weapon_change" ); - self endon( "missile_fire" ); - - time = 7; - self BotBuiltinAimOverride(); - - while ( time > 0 && isDefined( plane ) && isAlive( plane ) && self GetCurrentWeapon() == weap && !self InLastStand() && !isDefined( self getThreat() ) ) - { - myeye = self GetEye(); - - if ( BulletTracePassed( myeye, plane.origin, false, plane ) ) - { - self thread bot_lookat( plane.origin, 0.3 ); - self BotBuiltinButtonOverride( "ads", "enable" ); - - if ( isDefined( self.stingerLockFinalized ) && self.stingerLockFinalized ) - { - self PressAttackButton(); - } - } - else - { - self BotBuiltinButtonOverride( "ads", "disable" ); - } - - time -= 0.05; - wait 0.05; - } -} - -/* - Bot attacks the plane -*/ -bot_plane_attack( plane ) -{ - weap = self getLockonAmmo(); - - if ( !isDefined( weap ) ) - { - return; - } - - self botStopMove( true ); - self.bot_attacking_plane = true; - - if ( self ChangeToWeapon( weap ) ) - { - self do_bot_plane_combat( plane, weap ); - - self notify( "bots_aim_overlap" ); - self BotBuiltinClearAimOverride(); - self BotBuiltinClearButtonOverride( "ads" ); - } - - self botStopMove( false ); - self.bot_attacking_plane = false; - self notify( "bot_force_check_switch" ); -} - -/* - Bots think to kill vehicles -*/ -bot_target_vehicle_loop() -{ - myteam = self.pers[ "team" ]; - - airborne_enemies = GetEntArray( "script_vehicle", "classname" ); - target = undefined; - myEye = self getEye(); - rocketAmmo = self getRocketAmmo(); - - for ( i = 0; i < airborne_enemies.size; i++ ) - { - enemy = airborne_enemies[ i ]; - - if ( !IsDefined( enemy ) ) - { - continue; - } - - if ( !IsAlive( enemy ) ) - { - continue; - } - - if ( level.teamBased ) - { - if ( enemy.team == myteam ) - { - continue; - } - } - - if ( enemy.owner == self ) - { - continue; - } - - if ( !IsDefined( enemy.targetname ) || enemy.targetname != "rcbomb" ) - { - if ( !isDefined( rocketAmmo ) ) - { - continue; - } - } - - if ( !BulletTracePassed( myEye, enemy.origin, false, enemy ) ) - { - continue; - } - - target = enemy; - break; - } - - airborne_enemies = undefined; - - if ( !isDefined( target ) ) - { - if ( isDefined( self getLockonAmmo() ) ) - { - for ( i = 0; i < level.bot_planes.size; i++ ) - { - enemy = level.bot_planes[ i ]; - - if ( !IsDefined( enemy ) ) - { - continue; - } - - if ( !IsAlive( enemy ) ) - { - continue; - } - - if ( level.teamBased ) - { - if ( enemy.team == myteam ) - { - continue; - } - } - - if ( enemy.owner == self ) - { - continue; - } - - if ( !BulletTracePassed( myEye, enemy.origin, false, enemy ) ) - { - continue; - } - - target = enemy; - break; - } - } - } - - if ( !isDefined( target ) ) - { - wait( RandomIntRange( 3, 5 ) ); - return; - } - - self BotNotifyBotEvent( "attack_vehicle", "start", target ); - - if ( isDefined( target.bot_plane ) ) - { - self bot_plane_attack( target ); - } - else - { - self SetScriptEnemy( target ); - self bot_vehicle_attack( target ); - self ClearScriptEnemy(); - } - - self BotNotifyBotEvent( "attack_vehicle", "stop", target ); -} - -/* - Bots think to kill vehicles -*/ -bot_target_vehicle() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - for ( ;; ) - { - wait( 1 ); - - if ( isDefined( self GetThreat() ) || self IsRemoteControlling() || self UseButtonPressed() || self BotIsFrozen() ) - { - continue; - } - - self bot_target_vehicle_loop(); - } -} - -/* - Bot uses their equipment -*/ -bot_use_equipment_think_loop() -{ - weapon = self.pers[ "bot" ][ "class_equipment" ]; - diff = self GetBotDiffNum(); - - if ( diff > 0 ) - { - if ( weapon == "camera_spike_mp" ) - { - if ( self GetLookaheadDist() < 384 ) - { - return; - } - - view_angles = self GetPlayerAngles(); - - if ( view_angles[ 0 ] < -5 ) - { - return; - } - } - else - { - if ( self GetLookaheadDist() > 64 ) - { - return; - } - } - } - - dir = self GetLookaheadDir(); - - if ( !IsDefined( dir ) ) - { - return; - } - - dir = VectorToAngles( dir ); - - if ( abs( dir[ 1 ] - self.angles[ 1 ] ) > 5 ) - { - return; - } - - dir = VectorNormalize( AnglesToForward( self.angles ) ); - dir = vector_scale( dir, 32 ); - goal = self.origin + dir; - - if ( randomInt( 100 ) > 35 ) - { - return; - } - - grenades = GetEntArray( "grenade", "classname" ); - anyEquNear = false; - - for ( i = 0; i < grenades.size; i++ ) - { - item = grenades[ i ]; - - if ( !IsDefined( item.name ) ) - { - continue; - } - - if ( !IsWeaponEquipment( item.name ) ) - { - continue; - } - - if ( DistanceSquared( item.origin, goal ) < 128 * 128 ) - { - anyEquNear = true; - } - } - - grenades = undefined; - - if ( anyEquNear && diff > 0 ) - { - return; - } - - self BotNotifyBotEvent( "equ", "start", goal, weapon ); - - lastWeap = self getCurrentWeapon(); - - self botStopMove( true ); - wait 1; - - if ( self ChangeToWeapon( weapon ) ) - { - if ( weapon == "satchel_charge_mp" ) - { - self thread fire_c4(); - } - else - { - self thread fire_current_weapon(); - } - - self waittill_any_timeout( 5, "grenade_fire", "weapon_change" ); - self notify( "stop_firing_weapon" ); - - self thread changeToWeapon( lastWeap ); - } - - self botStopMove( false ); -} - -/* - Bot uses their equipment -*/ -bot_use_equipment_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - if ( self.pers[ "bot" ][ "class_equipment" ] == "" || self.pers[ "bot" ][ "class_equipment" ] == "weapon_null_mp" ) - { - return; - } - - // decoys? - for ( ;; ) - { - wait( RandomIntRange( 1, 3 ) ); - - if ( !self HasWeapon( self.pers[ "bot" ][ "class_equipment" ] ) ) - { - return; - } - - if ( self BotIsFrozen() ) - { - continue; - } - - if ( !self GetAmmoCount( self.pers[ "bot" ][ "class_equipment" ] ) ) - { - continue; - } - - if ( self IsRemoteControlling() ) - { - continue; - } - - if ( isDefined( self getThreat() ) ) - { - continue; - } - - if ( self._is_sprinting ) - { - continue; - } - - self bot_use_equipment_think_loop(); - } -} - -/* - Bots go to the revive -*/ -bot_go_revive( revive ) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 1; - - if ( !isDefined( revive ) ) - { - break; - } - - if ( !isDefined( revive.revivetrigger ) ) - { - break; - } - - if ( self isTouching( revive.revivetrigger ) ) - { - break; - } - } - - if ( !isDefined( revive ) || !isDefined( revive.revivetrigger ) ) - { - self notify( "bad_path" ); - } - else - { - self notify( "goal" ); - } -} - -/* - Bots go revive -*/ -bot_revive_think_loop() -{ - revivePlayer = undefined; - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[ i ]; - - if ( !isDefined( player.pers[ "team" ] ) ) - { - continue; - } - - if ( player == self ) - { - continue; - } - - if ( self.pers[ "team" ] != player.pers[ "team" ] ) - { - continue; - } - - if ( !isDefined( player.revivetrigger ) ) - { - continue; - } - - if ( isDefined( player.currentlyBeingRevived ) && player.currentlyBeingRevived ) - { - continue; - } - - if ( !isDefined( player.revivetrigger.bots ) ) - { - player.revivetrigger.bots = 0; - } - - if ( player.revivetrigger.bots > 2 ) - { - continue; - } - - revivePlayer = player; - } - - if ( !isDefined( revivePlayer ) ) - { - return; - } - - self BotNotifyBotEvent( "revive", "go", revivePlayer ); - - self.bot_lock_goal = true; - - self SetBotGoal( revivePlayer.origin, 1 ); - self thread bot_inc_bots( revivePlayer.revivetrigger, true ); - self thread bot_go_revive( revivePlayer ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" || !isDefined( revivePlayer ) || ( isDefined( revivePlayer.currentlyBeingRevived ) && revivePlayer.currentlyBeingRevived ) || !self isTouching( revivePlayer.revivetrigger ) || self InLastStand() ) - { - self.bot_lock_goal = false; - return; - } - - self BotNotifyBotEvent( "revive", "start", revivePlayer ); - - self SetBotGoal( self.origin, 64 ); - self bot_wait_stop_move(); - - reviveTime = GetDvarInt( #"revive_time_taken" ); - self thread BotPressUse( reviveTime + 1 ); - wait( reviveTime + 1.5 ); - - self ClearBotGoal(); - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "revive", "stop", revivePlayer ); -} - -/* - Bots go revive -*/ -bot_revive_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - if ( !level.teamBased ) - { - return; - } - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self HasScriptGoal() || self.bot_lock_goal ) - { - continue; - } - - if ( self isDefusing() || self isPlanting() ) - { - continue; - } - - if ( self inLastStand() ) - { - continue; - } - - if ( self IsRemoteControlling() ) - { - continue; - } - - if ( self UseButtonPressed() || self BotIsFrozen() ) - { - continue; - } - - self bot_revive_think_loop(); - } -} - -/* - Bot attacks dog -*/ -bot_dog_attack( dog ) -{ - dog endon( "death" ); - - wait_time = RandomIntRange( 7, 10 ); - - for ( i = 0; i < wait_time; i++ ) - { - wait( 1 ); - - if ( !IsDefined( dog ) ) - { - return; - } - - if ( !IsAlive( dog ) ) - { - return; - } - - if ( !BulletTracePassed( self.origin, dog.origin, false, dog ) ) - { - return; - } - } -} - -/* - Bot thinks to attack dogs -*/ -bot_dogs_think_loop() -{ - myteam = self.pers[ "team" ]; - - for ( i = 0; i < level.dogs.size; i++ ) - { - dog = level.dogs[ i ]; - - if ( !IsDefined( dog ) ) - { - continue; - } - - if ( !IsAlive( dog ) ) - { - continue; - } - - if ( level.teamBased ) - { - if ( dog.aiteam == myteam ) - { - continue; - } - } - - if ( isDefined( dog.script_owner ) && dog.script_owner == self ) - { - continue; - } - - if ( DistanceSquared( self.origin, dog.origin ) < 1024 * 1024 ) - { - if ( !BulletTracePassed( self.origin, dog.origin, false, dog ) ) - { - continue; - } - - self BotNotifyBotEvent( "attack_dog", "start", dog ); - - self SetScriptEnemy( dog ); - self bot_dog_attack( dog ); - self ClearScriptEnemy(); - - self BotNotifyBotEvent( "attack_dog", "stop", dog ); - break; - } - } -} - -/* - Bot thinks to attack dogs -*/ -bot_dogs_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - if ( level.no_dogs ) - { - return; - } - - for ( ;; ) - { - wait( 0.25 ); - - if ( !IsDefined( level.dogs ) || level.dogs.size <= 0 ) - { - level waittill( "called_in_the_dogs" ); - } - - if ( isDefined( self GetThreat() ) ) - { - continue; - } - - self bot_dogs_think_loop(); - } -} - -/* - Clears goal when events death -*/ -stop_go_target_on_death( tar ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "new_goal" ); - self endon( "bad_path" ); - self endon( "goal" ); - - tar waittill_either( "death", "disconnect" ); - - self ClearBotGoal(); -} - -/* - Goes to the target's location if it had one -*/ -follow_target_loop() -{ - threat = self GetThreat(); - - if ( !isDefined( threat ) ) - { - return; - } - - if ( !isPlayer( threat ) ) - { - return; - } - - if ( randomInt( 100 ) > 50 ) - { - return; - } - - self BotNotifyBotEvent( "follow_threat", "start", threat ); - - self SetBotGoal( threat.origin, 64 ); - self thread stop_go_target_on_death( threat ); - - if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self BotNotifyBotEvent( "follow_threat", "stop", threat ); -} - -/* - Goes to the target's location if it had one -*/ -follow_target() -{ - self endon( "death" ); - self endon( "disconnect" ); - - for ( ;; ) - { - wait 1; - - if ( self HasScriptGoal() || self.bot_lock_goal ) - { - continue; - } - - self follow_target_loop(); - } -} - -/* - Bots play mw2 -*/ -bot_watch_think_mw2_loop() -{ - tube = self getValidTube(); - - if ( !isDefined( tube ) ) - { - if ( self GetAmmoCount( "m72_law_mp" ) ) - { - tube = "m72_law_mp"; - } - else if ( self GetAmmoCount( "rpg_mp" ) ) - { - tube = "rpg_mp"; - } - else - { - return; - } - } - - if ( self GetCurrentWeapon() == tube ) - { - return; - } - - if ( randomInt( 100 ) > 35 ) - { - return; - } - - self thread ChangeToWeapon( tube ); -} - -/* - Bots play mw2 -*/ -bot_watch_think_mw2() -{ - self endon( "disconnect" ); - self endon( "death" ); - level endon( "game_ended" ); - - for ( ;; ) - { - wait randomIntRange( 1, 4 ); - - if ( self BotIsFrozen() ) - { - continue; - } - - if ( self isDefusing() || self isPlanting() ) - { - continue; - } - - if ( self IsRemoteControlling() ) - { - continue; - } - - if ( self InLastStand() ) - { - continue; - } - - if ( isDefined( self GetThreat() ) ) - { - continue; - } - - self bot_watch_think_mw2_loop(); - } -} - -/* - Bots will think to switch weapons -*/ -bot_weapon_think_loop( data ) -{ - ret = self waittill_any_timeout( randomIntRange( 2, 4 ), "bot_force_check_switch" ); - - if ( self BotIsFrozen() ) - { - return; - } - - if ( self isDefusing() || self isPlanting() ) - { - return; - } - - if ( self IsRemoteControlling() ) - { - return; - } - - if ( self InLastStand() ) - { - return; - } - - curWeap = self GetCurrentWeapon(); - threat = self getThreat(); - - if ( self.bot_attacking_plane || ( isDefined( threat ) && !isPlayer( threat ) && !isAi( threat ) && ( !IsDefined( threat.targetname ) || threat.targetname != "rcbomb" ) ) ) - { - rocketAmmo = self getRocketAmmo(); - - if ( isDefined( rocketAmmo ) ) - { - if ( curWeap != rocketAmmo ) - { - self thread ChangeToWeapon( rocketAmmo ); - } - - return; - } - } - - force = ( ret == "bot_force_check_switch" ); - - if ( data.first ) - { - data.first = false; - - if ( randomInt( 100 ) > 10 ) - { - return; - } - } - else - { - if ( curWeap != "none" && self getAmmoCount( curWeap ) && curWeap != "strela_mp" ) - { - if ( randomInt( 100 ) > 2 ) - { - return; - } - - if ( isDefined( threat ) ) - { - return; - } - } - else - { - force = true; - } - } - - weaponslist = self getweaponslistall(); - weap = ""; - - while ( weaponslist.size ) - { - weapon = weaponslist[ randomInt( weaponslist.size ) ]; - weaponslist = array_remove( weaponslist, weapon ); - - if ( !self getAmmoCount( weapon ) && !force ) - { - continue; - } - - if ( !maps\mp\gametypes\_weapons::isprimaryweapon( weapon ) && !maps\mp\gametypes\_weapons::issidearm( weapon ) && !isWeaponAltmode( weapon ) ) - { - continue; - } - - if ( curWeap == weapon || weapon == "none" || weapon == "" || weapon == "strela_mp" ) - { - continue; - } - - weap = weapon; - break; - } - - if ( weap == "" ) - { - return; - } - - self thread changeToWeapon( weap ); -} - -/* - Bots will think to switch 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 ); - } -} - -/* - Bots pay attention to the uav -*/ -bot_uav_think_loop( data ) -{ - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - diff = self GetBotDiffNum(); - - hasCam = isDefined( self.cameraSpike ); - - if ( self.bot_scrambled && !hasCam ) - { - return; - } - - players = get_players(); - - hasUAV = false; - hasSR = false; - - // check for counter spyplane - if ( level.teamBased ) - { - if ( level.activeCounterUAVs[ otherTeam ] && !hasCam ) - { - return; - } - - hasSR = level.activeSatellites[ myTeam ]; - hasUAV = level.activeUAVs[ myTeam ]; - } - else - { - shouldContinue = false; - - for ( i = 0; i < players.size; i++ ) - { - player = players[ i ]; - - if ( player == self ) - { - continue; - } - - if ( !isDefined( player.team ) ) - { - continue; - } - - if ( isDefined( level.activeCounterUAVs[ player.entnum ] ) && level.activeCounterUAVs[ player.entnum ] ) - { - continue; - } - - shouldContinue = true; - break; - } - - if ( shouldContinue && !hasCam ) - { - return; - } - - hasSR = level.activeSatellites[ self.entnum ]; - hasUAV = level.activeUAVs[ self.entnum ]; - } - - if ( level.hardcoreMode && !hasUAV && !hasSR && !hasCam ) - { - return; - } - - dist = GetDvarInt( #"scr_help_dist" ); - dist = dist * dist * 8; - - // decoys - if ( !data.wasFooled && level.bot_decoys.size && !hasCam && !self HasScriptGoal() && !self.bot_lock_goal ) - { - shouldContinue = false; - - for ( i = 0; i < level.bot_decoys.size; i++ ) - { - g = level.bot_decoys[ i ]; - - if ( isDefined( g.owner ) && g.owner == self ) - { - continue; - } - - if ( level.teamBased && g.team == myTeam ) - { - continue; - } - - if ( DistanceSquared( self.origin, g.origin ) > dist ) - { - continue; - } - - if ( lengthsquared( g getVelocity() ) > 10000 ) - { - continue; - } - - if ( diff > 0 ) - { - data.wasFooled = true; - } - - self SetBotGoal( g.origin, 128 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - shouldContinue = true; - break; - } - - if ( shouldContinue ) - { - return; - } - } - - if ( diff <= 0 ) - { - return; - } - - for ( i = 0; i < players.size; i++ ) - { - player = players[ i ]; - - if ( player == self ) - { - continue; - } - - if ( !isDefined( player.team ) ) - { - continue; - } - - if ( player.sessionstate != "playing" ) - { - continue; - } - - if ( level.teambased && player.team == myTeam ) - { - continue; - } - - if ( !isAlive( player ) ) - { - continue; - } - - distFromPlayer = DistanceSquared( self.origin, player.origin ); - - if ( distFromPlayer > dist ) - { - continue; - } - - if ( hasCam ) - { - if ( !self.cameraSpike maps\mp\gametypes\_weaponobjects::isstunned() && !self HasScriptGoal() && !self.bot_lock_goal && !player hasPerk( "specialty_nottargetedbyai" ) ) - { - if ( VectorDot( VectorNormalize( AnglesToForward( self.cameraSpike.cameraHead.angles ) ), VectorNormalize( player.origin - self.cameraSpike.origin ) ) >= 0.342 && SightTracePassed( player.origin + ( 0, 0, 5 ), self.cameraSpike.origin + ( 0, 0, 5 ), false, self.cameraSpike ) ) // cos 70 degrees - { - self BotNotifyBotEvent( "cam_target", "start", player ); - - self SetBotGoal( player.origin, 128 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self BotNotifyBotEvent( "cam_target", "stop", player ); - break; - } - } - } - else if ( hasSR || ( !isSubStr( player getCurrentWeapon(), "_silencer_" ) && player.bot_firing ) || ( hasUAV && !player hasPerk( "specialty_gpsjammer" ) ) || ( isDefined( self.acousticSensor ) && !self.acousticSensor maps\mp\gametypes\_weaponobjects::isstunned() && !player hasPerk( "specialty_nomotionsensor" ) && distance2d( self.acousticSensor.origin, player.origin ) < 666 ) ) - { - self BotNotifyBotEvent( "uav_target", "start", player ); - - distSq = GetDvarInt( #"scr_help_dist" ); - distSq *= distSq; - - if ( distFromPlayer < distSq && bulletTracePassed( self getEye(), player getTagOrigin( "j_spineupper" ), false, player ) ) - { - self SetAttacker( player ); - } - - if ( !self HasScriptGoal() && !self.bot_lock_goal ) - { - self SetBotGoal( player.origin, 128 ); - self thread stop_go_target_on_death( player ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self BotNotifyBotEvent( "uav_target", "stop", player ); - } - - break; - } - } -} - -/* - Bots pay attention to the uav -*/ -bot_uav_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - data = spawnStruct(); - data.wasFooled = false; - - for ( ;; ) - { - wait 0.75; - - if ( self IsRemoteControlling() ) - { - continue; - } - - self bot_uav_think_loop( data ); - } -} - -/* - bots will go to their target's kill location -*/ -bot_revenge_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( self GetBotDiffNum() <= 0 ) - { - return; - } - - if ( isDefined( self.lastKiller ) && isAlive( self.lastKiller ) ) - { - if ( bulletTracePassed( self getEye(), self.lastKiller getTagOrigin( "j_spineupper" ), false, self.lastKiller ) ) - { - self setAttacker( self.lastKiller ); - } - } - - if ( !isDefined( self.killerLocation ) ) - { - return; - } - - loc = self.killerLocation; - - for ( ;; ) - { - wait( RandomIntRange( 1, 5 ) ); - - if ( self HasScriptGoal() || self.bot_lock_goal ) - { - return; - } - - if ( randomint( 100 ) < 75 ) - { - return; - } - - self BotNotifyBotEvent( "revenge", "start", loc, self.lastKiller ); - - self SetBotGoal( loc, 64 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self BotNotifyBotEvent( "revenge", "stop", loc, self.lastKiller ); - } -} - -/* - Bots will listen to foot steps and target nearby targets -*/ -bot_listen_to_steps_loop() -{ - dist = 100; - - if ( self hasPerk( "specialty_loudenemies" ) ) - { - dist *= 1.4; - } - - dist *= dist; - - heard = undefined; - - for ( i = level.players.size - 1 ; i >= 0; i-- ) - { - player = level.players[ i ]; - - if ( player == self ) - { - continue; - } - - if ( !isDefined( player.team ) ) - { - continue; - } - - if ( level.teamBased && self.team == player.team ) - { - continue; - } - - if ( player.sessionstate != "playing" ) - { - continue; - } - - if ( !isAlive( player ) ) - { - continue; - } - - if ( lengthsquared( player getVelocity() ) < 20000 ) - { - continue; - } - - if ( distanceSquared( player.origin, self.origin ) > dist ) - { - continue; - } - - if ( player hasPerk( "specialty_quieter" ) ) - { - continue; - } - - heard = player; - break; - } - - if ( !IsDefined( heard ) ) - { - return; - } - - self BotNotifyBotEvent( "heard_target", "start", heard ); - - if ( bulletTracePassed( self getEye(), heard getTagOrigin( "j_spineupper" ), false, heard ) ) - { - self setAttacker( heard ); - return; - } - - if ( self HasScriptGoal() || self.bot_lock_goal ) - { - return; - } - - self SetBotGoal( heard.origin, 64 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self BotNotifyBotEvent( "heard_target", "stop", heard ); -} - -/* - Bots will listen to foot steps and target nearby targets -*/ -bot_listen_to_steps() -{ - self endon( "disconnect" ); - self endon( "death" ); - - for ( ;; ) - { - wait 1; - - if ( self GetBotDiffNum() <= 0 ) - { - continue; - } - - self bot_listen_to_steps_loop(); - } -} - -/* - Presses the buttons on radiation -*/ -bot_radiation_think_loop() -{ - origins = []; - origins[ 0 ] = ( 813, 5, 267 ); - origins[ 1 ] = ( -811, 30, 363 ); - - origin = random( origins ); - - if ( DistanceSquared( self.origin, origin ) < 512 * 512 ) - { - self SetBotGoal( origin, 32 ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" ) - { - return; - } - - self botStopMove( true ); - self bot_wait_stop_move(); - - self thread BotPressUse( 3 ); - wait( 3 ); - - self botStopMove( false ); - } - - wait( RandomIntRange( 5, 10 ) ); -} - -/* - Presses the buttons on radiation -*/ -bot_radiation_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon ( "game_ended" ); - - if ( level.script != "mp_radiation" ) - { - return; - } - - if ( level.wagerMatch ) - { - return; - } - - for ( ;; ) - { - wait( RandomIntRange( 8, 15 ) ); - - if ( self HasScriptGoal() || self BotIsFrozen() ) - { - continue; - } - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if ( self UseButtonPressed() ) - { - continue; - } - - self bot_radiation_think_loop(); - } -} - -/* - Bots hang around the enemy's flag to spawn kill em -*/ -bot_dom_spawn_kill_think_loop() -{ - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - myFlagCount = maps\mp\gametypes\dom::getteamflagcount( myTeam ); - - if ( myFlagCount == level.flags.size ) - { - return; - } - - otherFlagCount = maps\mp\gametypes\dom::getteamflagcount( otherTeam ); - - if ( myFlagCount <= otherFlagCount || otherFlagCount != 1 ) - { - return; - } - - flag = undefined; - - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[ i ] maps\mp\gametypes\dom::getflagteam() == myTeam ) - { - continue; - } - - flag = level.flags[ i ]; - } - - if ( !isDefined( flag ) ) - { - return; - } - - if ( DistanceSquared( self.origin, flag.origin ) < 2048 * 2048 ) - { - return; - } - - self BotNotifyBotEvent( "dom", "start", "spawnkill", flag ); - - self SetBotGoal( flag.origin, 1024 ); - - self thread bot_dom_watch_flags( myFlagCount, myTeam ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self BotNotifyBotEvent( "dom", "stop", "spawnkill", flag ); -} - -/* - Bots hang around the enemy's flag to spawn kill em -*/ -bot_dom_spawn_kill_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - { - return; - } - - for ( ;; ) - { - wait( randomintrange( 10, 20 ) ); - - if ( randomint( 100 ) < 20 ) - { - continue; - } - - if ( self HasScriptGoal() || self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined( level.flags ) || level.flags.size == 0 ) - { - continue; - } - - self bot_dom_spawn_kill_think_loop(); - } -} - -/* - Calls 'bad_path' when the flag count changes -*/ -bot_dom_watch_flags( count, myTeam ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 0.5; - - if ( maps\mp\gametypes\dom::getteamflagcount( myTeam ) != count ) - { - break; - } - } - - self notify( "bad_path" ); -} - -/* - Bots watches their own flags and protects them when they are under capture -*/ -bot_dom_def_think_loop() -{ - myTeam = self.pers[ "team" ]; - flag = undefined; - - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[ i ] maps\mp\gametypes\dom::getflagteam() != myTeam ) - { - continue; - } - - if ( !level.flags[ i ].useObj.objPoints[ myTeam ].isFlashing ) - { - continue; - } - - if ( !isDefined( flag ) || DistanceSquared( self.origin, level.flags[ i ].origin ) < DistanceSquared( self.origin, flag.origin ) ) - { - flag = level.flags[ i ]; - } - } - - if ( !isDefined( flag ) ) - { - return; - } - - self BotNotifyBotEvent( "dom", "start", "defend", flag ); - - self SetBotGoal( flag.origin, 128 ); - - self thread bot_dom_watch_for_flashing( flag, myTeam ); - self thread bots_watch_touch_obj( flag ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self BotNotifyBotEvent( "dom", "stop", "defend", flag ); -} - -/* - Bots watches their own flags and protects them when they are under capture -*/ -bot_dom_def_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - { - return; - } - - for ( ;; ) - { - wait( randomintrange( 1, 3 ) ); - - if ( randomint( 100 ) < 35 ) - { - continue; - } - - if ( self HasScriptGoal() || self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined( level.flags ) || level.flags.size == 0 ) - { - continue; - } - - self bot_dom_def_think_loop(); - } -} - -/* - Watches while the flag is under capture -*/ -bot_dom_watch_for_flashing( flag, myTeam ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 0.5; - - if ( !isDefined( flag ) ) - { - break; - } - - if ( flag maps\mp\gametypes\dom::getflagteam() != myTeam || !flag.useObj.objPoints[ myTeam ].isFlashing ) - { - break; - } - } - - self notify( "bad_path" ); -} - -/* - Bots capture dom flags -*/ -bot_dom_cap_think_loop() -{ - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - myFlagCount = maps\mp\gametypes\dom::getteamflagcount( myTeam ); - - if ( myFlagCount == level.flags.size ) - { - return; - } - - otherFlagCount = maps\mp\gametypes\dom::getteamflagcount( otherTeam ); - - if ( game[ "teamScores" ][ myteam ] >= game[ "teamScores" ][ otherTeam ] ) - { - if ( myFlagCount < otherFlagCount ) - { - if ( randomint( 100 ) < 15 ) - { - return; - } - } - else if ( myFlagCount == otherFlagCount ) - { - if ( randomint( 100 ) < 35 ) - { - return; - } - } - else if ( myFlagCount > otherFlagCount ) - { - if ( randomint( 100 ) < 95 ) - { - return; - } - } - } - - flag = undefined; - flags = []; - - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[ i ] maps\mp\gametypes\dom::getflagteam() == myTeam ) - { - continue; - } - - flags[ flags.size ] = level.flags[ i ]; - } - - if ( randomInt( 100 ) > 30 ) - { - for ( i = 0; i < flags.size; i++ ) - { - if ( !isDefined( flag ) || DistanceSquared( self.origin, level.flags[ i ].origin ) < DistanceSquared( self.origin, flag.origin ) ) - { - flag = level.flags[ i ]; - } - } - } - else if ( flags.size ) - { - flag = PickRandom( flags ); - } - - if ( !isDefined( flag ) ) - { - return; - } - - self BotNotifyBotEvent( "dom", "go", "cap", flag ); - - self.bot_lock_goal = true; - self SetBotGoal( flag.origin, 64 ); - - self thread bot_dom_go_cap_flag( flag, myteam ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" ) - { - self.bot_lock_goal = false; - return; - } - - self BotNotifyBotEvent( "dom", "start", "cap", flag ); - - self SetBotGoal( self.origin, 64 ); - - while ( flag maps\mp\gametypes\dom::getflagteam() != myTeam && self isTouching( flag ) ) - { - cur = flag.useObj.curProgress; - wait 0.5; - - if ( flag.useObj.curProgress == cur ) - { - break; // some enemy is near us, kill him - } - - self thread bot_do_random_action_for_objective( flag ); - } - - self BotNotifyBotEvent( "dom", "stop", "cap", flag ); - - self ClearBotGoal(); - - self.bot_lock_goal = false; -} - -/* - Bots capture dom flags -*/ -bot_dom_cap_think() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - { - return; - } - - for ( ;; ) - { - wait( randomintrange( 3, 12 ) ); - - if ( self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined( level.flags ) || level.flags.size == 0 ) - { - continue; - } - - self bot_dom_cap_think_loop(); - } -} - -/* - Bot goes to the flag, watching while they don't have the flag -*/ -bot_dom_go_cap_flag( flag, myteam ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait randomintrange( 2, 4 ); - - if ( !isDefined( flag ) ) - { - break; - } - - if ( flag maps\mp\gametypes\dom::getflagteam() == myTeam ) - { - break; - } - - if ( self isTouching( flag ) ) - { - break; - } - } - - if ( flag maps\mp\gametypes\dom::getflagteam() == myTeam ) - { - self notify( "bad_path" ); - } - else - { - self notify( "goal" ); - } -} - -/* - Bots play headquarters -*/ -bot_hq_loop() -{ - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - radio = level.radio; - gameobj = radio.gameobject; - origin = ( radio.origin[ 0 ], radio.origin[ 1 ], radio.origin[ 2 ] + 5 ); - - // if neut or enemy - if ( gameobj.ownerTeam != myTeam ) - { - if ( gameobj.interactTeam == "none" ) // wait for it to become active - { - if ( self HasScriptGoal() ) - { - return; - } - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - // capture it - - self BotNotifyBotEvent( "hq", "go", "cap" ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_hq_go_cap( gameobj, radio ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" ) - { - self.bot_lock_goal = false; - return; - } - - if ( !self isTouching( gameobj.trigger ) || level.radio != radio ) - { - self.bot_lock_goal = false; - return; - } - - self BotNotifyBotEvent( "hq", "start", "cap" ); - - self SetBotGoal( self.origin, 64 ); - - while ( self isTouching( gameobj.trigger ) && gameobj.ownerTeam != myTeam && level.radio == radio ) - { - cur = gameobj.curProgress; - wait 0.5; - - if ( cur == gameobj.curProgress ) - { - break; // no prog made, enemy must be capping - } - - self thread bot_do_random_action_for_objective( gameobj.trigger ); - } - - self ClearBotGoal(); - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "hq", "stop", "cap" ); - } - else // we own it - { - if ( gameobj.objPoints[ myteam ].isFlashing ) // underattack - { - self BotNotifyBotEvent( "hq", "start", "defend" ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_hq_watch_flashing( gameobj, radio ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "hq", "stop", "defend" ); - return; - } - - if ( self HasScriptGoal() ) - { - return; - } - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - } -} - -/* - Bots play headquarters -*/ -bot_hq() -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "koth" ) - { - return; - } - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined( level.radio ) ) - { - continue; - } - - if ( !isDefined( level.radio.gameobject ) ) - { - continue; - } - - self bot_hq_loop(); - } -} - -/* - Waits until not touching the trigger and it is the current radio. -*/ -bot_hq_go_cap( obj, radio ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait randomintrange( 2, 4 ); - - if ( !isDefined( obj ) ) - { - break; - } - - if ( self isTouching( obj.trigger ) ) - { - break; - } - - if ( level.radio != radio ) - { - break; - } - } - - if ( level.radio != radio ) - { - self notify( "bad_path" ); - } - else - { - self notify( "goal" ); - } -} - -/* - Waits while the radio is under attack. -*/ -bot_hq_watch_flashing( obj, radio ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - myteam = self.team; - - for ( ;; ) - { - wait 0.5; - - if ( !isDefined( obj ) ) - { - break; - } - - if ( !obj.objPoints[ myteam ].isFlashing ) - { - break; - } - - if ( level.radio != radio ) - { - break; - } - } - - self notify( "bad_path" ); -} - -/* - Bots play sab -*/ -bot_sab_loop() -{ - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - bomb = level.sabBomb; - bombteam = bomb.ownerTeam; - carrier = bomb.carrier; - timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; - - // the bomb is ours, we are on the offence - if ( bombteam == myTeam ) - { - site = level.bombZones[ otherTeam ]; - origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); - - // protect our planted bomb - if ( level.bombPlanted ) - { - // kill defuser - if ( site isInUse() ) // somebody is defusing our bomb we planted - { - self BotNotifyBotEvent( "sab", "start", "defuser" ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site( site ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "sab", "stop", "defuser" ); - return; - } - - // else hang around the site - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - return; - } - - // we are not the carrier - if ( !self isBombCarrier() ) - { - // lets escort the bomb carrier - if ( self HasScriptGoal() ) - { - return; - } - - origin = carrier.origin; - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - self thread bot_escort_obj( bomb, carrier ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - // we are the carrier of the bomb, lets check if we need to plant - timepassed = maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000; - - if ( timepassed < 120 && timeleft >= 90 && randomInt( 100 ) < 98 ) - { - return; - } - - self BotNotifyBotEvent( "sab", "go", "plant" ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 1 ); - - self thread bot_go_plant( site ); - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" || level.bombPlanted || !self isTouching( site.trigger ) || site IsInUse() || self inLastStand() || isDefined( self getThreat() ) ) - { - self.bot_lock_goal = false; - return; - } - - self BotNotifyBotEvent( "sab", "start", "plant" ); - - self BotRandomStance(); - self SetBotGoal( self.origin, 64 ); - self bot_wait_stop_move(); - - waitTime = ( site.useTime / 1000 ) + 2.5; - self thread BotPressUse( waitTime ); - wait waitTime; - - self ClearBotGoal(); - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "sab", "stop", "plant" ); - } - else if ( bombteam == otherTeam ) // the bomb is theirs, we are on the defense - { - site = level.bombZones[ myteam ]; - - if ( !isDefined( site.bots ) ) - { - site.bots = 0; - } - - // protect our site from planters - if ( !level.bombPlanted ) - { - // kill bomb carrier - if ( site.bots > 2 || randomInt( 100 ) < 45 ) - { - if ( self HasScriptGoal() ) - { - return; - } - - if ( carrier hasPerk( "specialty_gpsjammer" ) ) - { - return; - } - - origin = carrier.origin; - - self SetBotGoal( origin, 64 ); - self thread bot_escort_obj( bomb, carrier ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - // protect bomb site - origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); - - self thread bot_inc_bots( site ); - - if ( site isInUse() ) // somebody is planting - { - self BotNotifyBotEvent( "sab", "start", "planter" ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_inc_bots( site ); - - self thread bot_defend_site( site ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - self BotNotifyBotEvent( "sab", "stop", "planter" ); - return; - } - - // else hang around the site - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - wait 4; - self notify( "bot_inc_bots" ); - site.bots--; - return; - } - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - self thread bot_inc_bots( site ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - return; - } - - // bomb is planted we need to defuse - origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); - - // someone else is defusing, lets just hang around - if ( site.bots > 1 ) - { - if ( self HasScriptGoal() ) - { - return; - } - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - self thread bot_go_defuse( site ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - // lets go defuse - self BotNotifyBotEvent( "sab", "go", "defuse" ); - - self.bot_lock_goal = true; - - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots( site ); - self thread bot_go_defuse( site ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" || !level.bombPlanted || site IsInUse() || !self isTouching( site.trigger ) || self InLastStand() || isDefined( self getThreat() ) ) - { - self.bot_lock_goal = false; - return; - } - - self BotNotifyBotEvent( "sab", "start", "defuse" ); - - self BotRandomStance(); - self SetBotGoal( self.origin, 64 ); - self bot_wait_stop_move(); - - waitTime = ( site.useTime / 1000 ) + 2.5; - self thread BotPressUse( waitTime ); - wait waitTime; - - self ClearBotGoal(); - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "sab", "stop", "defuse" ); - } - else // we need to go get the bomb! - { - origin = ( bomb.curorigin[ 0 ], bomb.curorigin[ 1 ], bomb.curorigin[ 2 ] + 32 ); - - self BotNotifyBotEvent( "sab", "start", "bomb" ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_get_obj( bomb ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - self BotNotifyBotEvent( "sab", "stop", "bomb" ); - return; - } -} - -/* - Bots play sab -*/ -bot_sab() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - if ( level.gametype != "sab" ) - { - return; - } - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined( level.sabBomb ) ) - { - continue; - } - - if ( !isDefined( level.bombZones ) || !level.bombZones.size ) - { - continue; - } - - if ( self IsPlanting() || self isDefusing() ) - { - continue; - } - - self bot_sab_loop(); - } -} - -/* - Bots play sd defenders -*/ -bot_sd_defenders_loop( data ) -{ - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - // bomb not planted, lets protect our sites - if ( !level.bombPlanted ) - { - timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; - - if ( timeleft >= 90 ) - { - return; - } - - // check for a bomb carrier, and camp the bomb - if ( !level.multiBomb && isDefined( level.sdBomb ) ) - { - bomb = level.sdBomb; - carrier = level.sdBomb.carrier; - - if ( !isDefined( carrier ) ) - { - origin = ( bomb.curorigin[ 0 ], bomb.curorigin[ 1 ], bomb.curorigin[ 2 ] + 32 ); - - // hang around the bomb - if ( self HasScriptGoal() ) - { - return; - } - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - - self thread bot_get_obj( bomb ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - } - - // pick a site to protect - if ( !isDefined( level.bombZones ) || !level.bombZones.size ) - { - return; - } - - sites = []; - - for ( i = 0; i < level.bombZones.size; i++ ) - { - sites[ sites.size ] = level.bombZones[ i ]; - } - - if ( !sites.size ) - { - return; - } - - if ( data.rand > 50 ) - { - site = self bot_array_nearest_curorigin( sites ); - } - else - { - site = PickRandom( sites ); - } - - if ( !isDefined( site ) ) - { - return; - } - - origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); - - if ( site isInUse() ) // somebody is planting - { - self BotNotifyBotEvent( "sd", "start", "planter", site ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site( site ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "sd", "stop", "planter", site ); - return; - } - - // else hang around the site - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - return; - } - - // bomb is planted, we need to defuse - if ( !isDefined( level.defuseObject ) ) - { - return; - } - - defuse = level.defuseObject; - - if ( !isDefined( defuse.bots ) ) - { - defuse.bots = 0; - } - - origin = ( defuse.curorigin[ 0 ], defuse.curorigin[ 1 ], defuse.curorigin[ 2 ] + 32 ); - - // someone is going to go defuse ,lets just hang around - if ( defuse.bots > 1 ) - { - if ( self HasScriptGoal() ) - { - return; - } - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - self thread bot_go_defuse( defuse ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - // lets defuse - self BotNotifyBotEvent( "sd", "go", "defuse" ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots( defuse ); - self thread bot_go_defuse( defuse ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" || !level.bombPlanted || defuse isInUse() || !self isTouching( defuse.trigger ) || self InLastStand() || isDefined( self getThreat() ) ) - { - self.bot_lock_goal = false; - return; - } - - self BotNotifyBotEvent( "sd", "start", "defuse" ); - - self BotRandomStance(); - self SetBotGoal( self.origin, 64 ); - self bot_wait_stop_move(); - - waitTime = ( defuse.useTime / 1000 ) + 2.5; - self thread BotPressUse( waitTime ); - wait waitTime; - - self ClearBotGoal(); - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "sd", "stop", "defuse" ); -} - -/* - Bots play sd defenders -*/ -bot_sd_defenders() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - if ( level.gametype != "sd" ) - { - return; - } - - if ( self.team == game[ "attackers" ] ) - { - return; - } - - data = spawnStruct(); - data.rand = randomInt( 100 ); - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if ( self IsPlanting() || self isDefusing() ) - { - continue; - } - - self bot_sd_defenders_loop( data ); - } -} - -/* - Bots play sd attackers -*/ -bot_sd_attackers_loop( data ) -{ - if ( data.first ) - { - data.first = false; - } - else - { - wait( randomintrange( 3, 5 ) ); - } - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - return; - } - - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - // bomb planted - if ( level.bombPlanted ) - { - if ( !isDefined( level.defuseObject ) ) - { - return; - } - - site = level.defuseObject; - - origin = ( site.curorigin[ 0 ], site.curorigin[ 1 ], site.curorigin[ 2 ] + 32 ); - - if ( site IsInUse() ) // somebody is defusing - { - self BotNotifyBotEvent( "sd", "start", "defuser" ); - - self.bot_lock_goal = true; - - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site( site ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "sd", "stop", "defuser" ); - return; - } - - // else hang around the site - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - return; - } - - timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; - timepassed = maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000; - - // dont have a bomb - if ( !self IsBombCarrier() && !level.multiBomb ) - { - if ( !isDefined( level.sdBomb ) ) - { - return; - } - - bomb = level.sdBomb; - carrier = level.sdBomb.carrier; - - // bomb is picked up - if ( isDefined( carrier ) ) - { - // escort the bomb carrier - if ( self HasScriptGoal() ) - { - return; - } - - origin = carrier.origin; - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - self thread bot_escort_obj( bomb, carrier ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - if ( !isDefined( bomb.bots ) ) - { - bomb.bots = 0; - } - - origin = ( bomb.curorigin[ 0 ], bomb.curorigin[ 1 ], bomb.curorigin[ 2 ] + 32 ); - - // hang around the bomb if other is going to go get it - if ( bomb.bots > 1 ) - { - if ( self HasScriptGoal() ) - { - return; - } - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - - self thread bot_get_obj( bomb ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - // go get the bomb - self BotNotifyBotEvent( "sd", "start", "bomb" ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - self thread bot_inc_bots( bomb ); - self thread bot_get_obj( bomb ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "sd", "stop", "bomb" ); - return; - } - - // check if to plant - if ( timepassed < 120 && timeleft >= 90 && randomInt( 100 ) < 98 ) - { - return; - } - - if ( !isDefined( level.bombZones ) || !level.bombZones.size ) - { - return; - } - - sites = []; - - for ( i = 0; i < level.bombZones.size; i++ ) - { - sites[ sites.size ] = level.bombZones[ i ]; - } - - if ( !sites.size ) - { - return; - } - - if ( data.rand > 50 ) - { - plant = self bot_array_nearest_curorigin( sites ); - } - else - { - plant = PickRandom( sites ); - } - - if ( !isDefined( plant ) ) - { - return; - } - - origin = ( plant.curorigin[ 0 ] + 50, plant.curorigin[ 1 ] + 50, plant.curorigin[ 2 ] + 32 ); - - self BotNotifyBotEvent( "sd", "go", "plant", plant ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 1 ); - self thread bot_go_plant( plant ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" || level.bombPlanted || plant.visibleTeam == "none" || !self isTouching( plant.trigger ) || self InLastStand() || isDefined( self getThreat() ) || plant IsInUse() ) - { - self.bot_lock_goal = false; - return; - } - - self BotNotifyBotEvent( "sd", "start", "plant", plant ); - - self BotRandomStance(); - self SetBotGoal( self.origin, 64 ); - self bot_wait_stop_move(); - - waitTime = ( plant.useTime / 1000 ) + 2.5; - self thread BotPressUse( waitTime ); - wait waitTime; - - self ClearBotGoal(); - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "sd", "stop", "plant", plant ); -} - -/* - Bots play sd attackers -*/ -bot_sd_attackers() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - if ( level.gametype != "sd" ) - { - return; - } - - if ( self.team != game[ "attackers" ] ) - { - return; - } - - data = spawnStruct(); - data.rand = randomInt( 100 ); - data.first = true; - - for ( ;; ) - { - self bot_sd_attackers_loop( data ); - } -} - -/* - Bots play capture the flag -*/ -bot_cap_loop() -{ - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - myflag = level.teamFlags[ myteam ]; - myzone = level.teamFlagZones[ myteam ]; - - theirflag = level.teamFlags[ otherTeam ]; - theirzone = level.teamFlagZones[ otherTeam ]; - - if ( myflag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() ) - { - carrier = myflag.carrier; - - if ( !isDefined( carrier ) ) // someone doesnt has our flag - { - if ( !isDefined( theirflag.carrier ) && DistanceSquared( self.origin, theirflag.curorigin ) < DistanceSquared( self.origin, myflag.curorigin ) ) // no one has their flag and its closer - { - self BotNotifyBotEvent( "cap", "start", "their_flag", theirflag ); - - self bot_cap_get_flag( theirflag ); - - self BotNotifyBotEvent( "cap", "stop", "their_flag", theirflag ); - } - else // go get it - { - self BotNotifyBotEvent( "cap", "start", "my_flag", myflag ); - - self bot_cap_get_flag( myflag ); - - self BotNotifyBotEvent( "cap", "stop", "my_flag", myflag ); - } - - return; - } - else - { - if ( !theirflag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() && randomint( 100 ) < 50 ) - { - // take their flag - self BotNotifyBotEvent( "cap", "start", "their_flag", theirflag ); - - self bot_cap_get_flag( theirflag ); - - self BotNotifyBotEvent( "cap", "stop", "their_flag", theirflag ); - } - else - { - if ( self HasScriptGoal() ) - { - return; - } - - if ( !isDefined( theirzone.bots ) ) - { - theirzone.bots = 0; - } - - origin = theirzone.curorigin; - - if ( theirzone.bots > 2 || randomInt( 100 ) < 45 ) - { - // kill carrier - if ( carrier hasPerk( "specialty_gpsjammer" ) ) - { - return; - } - - origin = carrier.origin; - - self SetBotGoal( origin, 64 ); - self thread bot_escort_obj( myflag, carrier ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - self thread bot_inc_bots( theirzone ); - - // camp their zone - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - wait 4; - self notify( "bot_inc_bots" ); - theirzone.bots--; - return; - } - - self SetBotGoal( origin, 256 ); - self thread bot_inc_bots( theirzone ); - self thread bot_escort_obj( myflag, carrier ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - } - } - } - else // our flag is ok - { - if ( self isFlagCarrier() ) // if have flag - { - // go cap - origin = myzone.curorigin; - - self BotNotifyBotEvent( "cap", "start", "cap" ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 32 ); - - self thread bot_get_obj( myflag ); - evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - wait 1; - - if ( evt != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "cap", "stop", "cap" ); - return; - } - - carrier = theirflag.carrier; - - if ( !isDefined( carrier ) ) // if no one has enemy flag - { - self BotNotifyBotEvent( "cap", "start", "their_flag", theirflag ); - - self bot_cap_get_flag( theirflag ); - - self BotNotifyBotEvent( "cap", "stop", "their_flag", theirflag ); - return; - } - - // escort them - - if ( self HasScriptGoal() ) - { - return; - } - - origin = carrier.origin; - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - self thread bot_escort_obj( theirflag, carrier ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - } -} - -/* - Bots play capture the flag -*/ -bot_cap() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - if ( level.gametype != "ctf" ) - { - return; - } - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined( level.teamFlagZones ) ) - { - continue; - } - - if ( !isDefined( level.teamFlags ) ) - { - continue; - } - - self bot_cap_loop(); - } -} - -/* - Gets the carriers ent num -*/ -getCarrierEntNum() -{ - carrierNum = -1; - - if ( isDefined( self.carrier ) ) - { - carrierNum = self.carrier getEntityNumber(); - } - - return carrierNum; -} - -/* - Bots go and get the flag -*/ -bot_cap_get_flag( flag ) -{ - origin = flag.curorigin; - - // go get it - - self.bot_lock_goal = true; - self SetBotGoal( origin, 32 ); - - self thread bot_get_obj( flag ); - - evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( evt != "new_goal" ) - { - self ClearScriptGoal(); - } - - if ( evt != "goal" ) - { - self.bot_lock_goal = false; - return; - } - - self SetScriptGoal( self.origin, 64 ); - curCarrier = flag getCarrierEntNum(); - - while ( curCarrier == flag getCarrierEntNum() && self isTouching( flag.trigger ) ) - { - cur = flag.curProgress; - wait 0.5; - - if ( flag.curProgress == cur ) - { - break; // some enemy is near us, kill him - } - } - - self ClearScriptGoal(); - - self.bot_lock_goal = false; -} - -/* - Bots go plant the demo bomb -*/ -bot_dem_go_plant( plant ) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 0.5; - - if ( ( plant.label == "_b" && level.bombBPlanted ) || ( plant.label == "_a" && level.bombAPlanted ) ) - { - break; - } - - if ( self isTouching( plant.trigger ) ) - { - break; - } - } - - if ( ( plant.label == "_b" && level.bombBPlanted ) || ( plant.label == "_a" && level.bombAPlanted ) ) - { - self notify( "bad_path" ); - } - else - { - self notify( "goal" ); - } -} - -/* - Bots spawn kill dom attackers -*/ -bot_dem_attack_spawnkill() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - l1 = level.bombAPlanted; - l2 = level.bombBPlanted; - - for ( ;; ) - { - wait 0.5; - - if ( l1 != level.bombAPlanted || l2 != level.bombBPlanted ) - { - break; - } - } - - self notify( "bad_path" ); -} - -/* - Bots play demo attackers -*/ -bot_dem_attackers_loop() -{ - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - bombs = []; // sites with bombs - sites = []; // sites to bomb at - bombed = 0; // exploded sites - - for ( i = 0; i < level.bombZones.size; i++ ) - { - bomb = level.bombZones[ i ]; - - if ( isDefined( bomb.bombExploded ) && bomb.bombExploded ) - { - bombed++; - continue; - } - - if ( bomb.label == "_a" ) - { - if ( level.bombAPlanted ) - { - bombs[ bombs.size ] = bomb; - } - else - { - sites[ sites.size ] = bomb; - } - - continue; - } - - if ( bomb.label == "_b" ) - { - if ( level.bombBPlanted ) - { - bombs[ bombs.size ] = bomb; - } - else - { - sites[ sites.size ] = bomb; - } - - continue; - } - } - - timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; - - shouldLet = ( game[ "teamScores" ][ myteam ] > game[ "teamScores" ][ otherTeam ] && timeleft < 90 && bombed == 1 ); - - // spawnkill conditions - // if we have bombed one site or 1 bomb is planted with lots of time left, spawn kill - // if we want the other team to win for overtime and they do not need to defuse, spawn kill - if ( ( ( bombed + bombs.size == 1 && timeleft >= 90 ) || ( shouldLet && !bombs.size ) ) && randomInt( 100 ) < 95 ) - { - if ( self HasScriptGoal() ) - { - return; - } - - spawnPoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_defender_start" ); - - if ( !spawnPoints.size ) - { - return; - } - - spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnPoints ); - - if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 2048 * 2048 ) - { - return; - } - - self SetBotGoal( spawnpoint.origin, 1024 ); - - self thread bot_dem_attack_spawnkill(); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - // let defuse conditions - // if enemy is going to lose and lots of time left, let them defuse to play longer - // or if want to go into overtime near end of the extended game - if ( ( ( bombs.size + bombed == 2 && timeleft >= 90 ) || ( shouldLet && bombs.size ) ) && randomInt( 100 ) < 95 ) - { - spawnPoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_attacker_start" ); - - if ( !spawnPoints.size ) - { - return; - } - - spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnPoints ); - - if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self.bot_lock_goal = true; - self SetBotGoal( spawnpoint.origin, 512 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - return; - } - - // defend bomb conditions - // if time is running out and we have a bomb planted - if ( bombs.size && timeleft < 90 && ( !sites.size || randomInt( 100 ) < 95 ) ) - { - site = self bot_array_nearest_curorigin( bombs ); - origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); - - if ( site IsInUse() ) // somebody is defusing - { - self BotNotifyBotEvent( "dem", "start", "defuser", site ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site( site ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "dem", "stop", "defuser", site ); - return; - } - - // else hang around the site - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - return; - } - - // else go plant - if ( !sites.size ) - { - return; - } - - plant = self bot_array_nearest_curorigin( sites ); - - if ( !isDefined( plant ) ) - { - return; - } - - if ( !isDefined( plant.bots ) ) - { - plant.bots = 0; - } - - origin = ( plant.curorigin[ 0 ] + 50, plant.curorigin[ 1 ] + 50, plant.curorigin[ 2 ] + 32 ); - - // hang around the site if lots of time left - if ( plant.bots > 1 && timeleft >= 60 ) - { - if ( self HasScriptGoal() ) - { - return; - } - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - self thread bot_dem_go_plant( plant ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - self BotNotifyBotEvent( "dem", "go", "plant", plant ); - - self.bot_lock_goal = true; - - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots( plant ); - self thread bot_dem_go_plant( plant ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" || ( plant.label == "_b" && level.bombBPlanted ) || ( plant.label == "_a" && level.bombAPlanted ) || plant IsInUse() || !self isTouching( plant.trigger ) || self InLastStand() || isDefined( self getThreat() ) ) - { - self.bot_lock_goal = false; - return; - } - - self BotNotifyBotEvent( "dem", "start", "plant", plant ); - - self BotRandomStance(); - self SetBotGoal( self.origin, 64 ); - self bot_wait_stop_move(); - - waitTime = ( plant.useTime / 1000 ) + 2.5; - self thread BotPressUse( waitTime ); - wait waitTime; - - self ClearBotGoal(); - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "dem", "stop", "plant", plant ); -} - -/* - Bots play demo attackers -*/ -bot_dem_attackers() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - if ( level.gametype != "dem" ) - { - return; - } - - if ( self.team != game[ "attackers" ] ) - { - return; - } - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined( level.bombZones ) || !level.bombZones.size ) - { - continue; - } - - self bot_dem_attackers_loop(); - } -} - -/* - Bots play demo defenders -*/ -bot_dem_defenders_loop() -{ - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); - - bombs = []; // sites with bombs - sites = []; // sites to bomb at - bombed = 0; // exploded sites - - for ( i = 0; i < level.bombZones.size; i++ ) - { - bomb = level.bombZones[ i ]; - - if ( isDefined( bomb.bombExploded ) && bomb.bombExploded ) - { - bombed++; - continue; - } - - if ( bomb.label == "_a" ) - { - if ( level.bombAPlanted ) - { - bombs[ bombs.size ] = bomb; - } - else - { - sites[ sites.size ] = bomb; - } - - continue; - } - - if ( bomb.label == "_b" ) - { - if ( level.bombBPlanted ) - { - bombs[ bombs.size ] = bomb; - } - else - { - sites[ sites.size ] = bomb; - } - - continue; - } - } - - timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; - - shouldLet = ( timeleft < 60 && ( ( bombed == 0 && bombs.size != 2 ) || ( game[ "teamScores" ][ myteam ] > game[ "teamScores" ][ otherTeam ] && bombed == 1 ) ) && randomInt( 100 ) < 98 ); - - // spawnkill conditions - // if nothing to defuse with a lot of time left, spawn kill - // or letting a bomb site to explode but a bomb is planted, so spawnkill - if ( ( !bombs.size && timeleft >= 60 && randomInt( 100 ) < 95 ) || ( shouldLet && bombs.size == 1 ) ) - { - if ( self HasScriptGoal() ) - { - return; - } - - spawnPoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_attacker_start" ); - - if ( !spawnPoints.size ) - { - return; - } - - spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnPoints ); - - if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 2048 * 2048 ) - { - return; - } - - self SetBotGoal( spawnpoint.origin, 1024 ); - - self thread bot_dem_defend_spawnkill(); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - // let blow up conditions - // let enemy blow up at least one to extend play time - // or if want to go into overtime after extended game - if ( shouldLet ) - { - spawnPoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_defender_start" ); - - if ( !spawnPoints.size ) - { - return; - } - - spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnPoints ); - - if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self.bot_lock_goal = true; - self SetBotGoal( spawnpoint.origin, 512 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - return; - } - - // defend conditions - // if no bombs planted with little time left - if ( !bombs.size && timeleft < 60 && randomInt( 100 ) < 95 && sites.size ) - { - site = self bot_array_nearest_curorigin( sites ); - origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); - - if ( site IsInUse() ) // somebody is planting - { - self BotNotifyBotEvent( "dem", "start", "planter", site ); - - self.bot_lock_goal = true; - self SetBotGoal( origin, 64 ); - - self thread bot_defend_site( site ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "dem", "stop", "planter", site ); - return; - } - - // else hang around the site - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self.bot_lock_goal = true; - self SetBotGoal( origin, 256 ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - self.bot_lock_goal = false; - return; - } - - // else go defuse - - if ( !bombs.size ) - { - return; - } - - defuse = self bot_array_nearest_curorigin( bombs ); - - if ( !isDefined( defuse ) ) - { - return; - } - - if ( !isDefined( defuse.bots ) ) - { - defuse.bots = 0; - } - - origin = ( defuse.curorigin[ 0 ] + 50, defuse.curorigin[ 1 ] + 50, defuse.curorigin[ 2 ] + 32 ); - - // hang around the site if not in danger of losing - if ( defuse.bots > 1 && bombed + bombs.size != 2 ) - { - if ( self HasScriptGoal() ) - { - return; - } - - if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) - { - return; - } - - self SetBotGoal( origin, 256 ); - - self thread bot_dem_go_defuse( defuse ); - - if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) - { - self ClearBotGoal(); - } - - return; - } - - self BotNotifyBotEvent( "dem", "go", "defuse", defuse ); - - self.bot_lock_goal = true; - - self SetBotGoal( origin, 1 ); - self thread bot_inc_bots( defuse ); - self thread bot_dem_go_defuse( defuse ); - - event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if ( event != "new_goal" ) - { - self ClearBotGoal(); - } - - if ( event != "goal" || ( defuse.label == "_b" && !level.bombBPlanted ) || ( defuse.label == "_a" && !level.bombAPlanted ) || defuse IsInUse() || !self isTouching( defuse.trigger ) || self InLastStand() || isDefined( self getThreat() ) ) - { - self.bot_lock_goal = false; - return; - } - - self BotNotifyBotEvent( "dem", "start", "defuse", defuse ); - - self BotRandomStance(); - self SetBotGoal( self.origin, 64 ); - self bot_wait_stop_move(); - - waitTime = ( defuse.useTime / 1000 ) + 2.5; - self thread BotPressUse( waitTime ); - wait waitTime; - - self ClearBotGoal(); - - self.bot_lock_goal = false; - - self BotNotifyBotEvent( "dem", "stop", "defuse", defuse ); -} - -/* - Bots play demo defenders -*/ -bot_dem_defenders() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - if ( level.gametype != "dem" ) - { - return; - } - - if ( self.team == game[ "attackers" ] ) - { - return; - } - - for ( ;; ) - { - wait( randomintrange( 3, 5 ) ); - - if ( self IsRemoteControlling() || self.bot_lock_goal ) - { - continue; - } - - if ( !isDefined( level.bombZones ) || !level.bombZones.size ) - { - continue; - } - - self bot_dem_defenders_loop(); - } -} - -/* - Bots go defuse -*/ -bot_dem_go_defuse( defuse ) -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 0.5; - - if ( self isTouching( defuse.trigger ) ) - { - break; - } - - if ( ( defuse.label == "_b" && !level.bombBPlanted ) || ( defuse.label == "_a" && !level.bombAPlanted ) ) - { - break; - } - } - - if ( ( defuse.label == "_b" && !level.bombBPlanted ) || ( defuse.label == "_a" && !level.bombAPlanted ) ) - { - self notify( "bad_path" ); - } - else - { - self notify( "goal" ); - } -} - -/* - Bots go spawn kill -*/ -bot_dem_defend_spawnkill() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self endon( "goal" ); - self endon( "bad_path" ); - self endon( "new_goal" ); - - for ( ;; ) - { - wait 0.5; - - if ( level.bombBPlanted || level.bombAPlanted ) - { - break; - } - } - - self notify( "bad_path" ); -} - -/* - custom movement stuff -*/ -watch_for_melee_override() -{ - self endon( "disconnect" ); - self endon( "death" ); - - // dedi doesnt have this registered - if ( getDvar( "aim_automelee_enabled" ) == "" ) - { - setDvar( "aim_automelee_enabled", 1 ); - } - - for ( ;; ) - { - threat = self getThreat(); - - while ( !isDefined( threat ) || ( !isPlayer( threat ) && !isAi( threat ) ) || self BotIsFrozen() || self IsRemoteControlling() || !self HasWeapon( "knife_mp" ) || !getDvarInt( "aim_automelee_enabled" ) ) - { - wait 0.05; - threat = self getThreat(); - } - - thisThreat = self getThreat(); - - while ( isDefined( thisThreat ) && isDefined( threat ) && thisThreat == threat && !self BotIsFrozen() ) - { - dist = distance( self.origin, threat.origin ); - - if ( self isOnGround() && self GetStance() != "prone" && !self InLastStand() && dist < getDvarFloat( "aim_automelee_range" ) && ( getConeDot( threat.origin, self.origin, self getPlayerAngles() ) > 0.9 || dist < 10 ) ) - { - angles = VectorToAngles( threat.origin - self.origin ); - - self BotBuiltinBotMeleeParams( angles[ 1 ], dist ); - self BotBuiltinButtonOverride( "melee", "enable" ); - self BotBuiltinAimOverride(); - - time_left = 1; - once = false; - - while ( time_left > 0 && isDefined( threat ) && isAlive( threat ) ) - { - self setPlayerAngles( VectorToAngles( threat getTagOrigin( "j_spine4" ) - self getEye() ) ); - time_left -= 0.05; - wait 0.05; - - if ( !once ) - { - once = true; - self BotBuiltinClearButtonOverride( "melee" ); - } - } - - if ( !once ) - { - self BotBuiltinClearButtonOverride( "melee" ); - } - - self BotBuiltinClearMeleeParams(); - self BotBuiltinClearAimOverride(); - wait 1; - break; - } - - wait 0.05; - thisThreat = self getThreat(); - } - } -} - -/* - custom movement stuff -*/ -watch_for_override_stuff() -{ - self endon( "disconnect" ); - self endon( "death" ); - - NEAR_DIST = 80; - LONG_DIST = 1000; - SPAM_JUMP_TIME = 5000; - - diff = self GetBotDiffNum(); - chance = 0; - - if ( diff == 1 ) - { - chance = 25; - } - else if ( diff == 2 ) - { - chance = 50; - } - else if ( diff == 3 ) - { - chance = 80; - } - - last_jump_time = 0; - need_to_clear_mantle_override = false; - - if ( !getDvarInt( "bots_play_jumpdrop" ) ) - { - return; - } - - for ( ;; ) - { - threat = self getThreat(); - - while ( !isDefined( threat ) || !isPlayer( threat ) || self IsRemoteControlling() || self BotIsFrozen() ) - { - wait 0.05; - threat = self getThreat(); - } - - dist = Distance( threat.origin, self.origin ); - time = GetTime(); - weap = self GetCurrentWeapon(); - - if ( need_to_clear_mantle_override && ( time - last_jump_time ) > 3000 ) - { - need_to_clear_mantle_override = false; - self BotBuiltinClearMantleOverride(); - } - - weapon_is_good = true; - - if ( weap == "none" || !self GetWeaponAmmoClip( weap ) ) - { - weapon_is_good = false; - } - - if ( weapon_is_good && ( dist > NEAR_DIST ) && ( dist < LONG_DIST ) && ( randomInt( 100 ) < chance ) && ( ( time - last_jump_time ) > SPAM_JUMP_TIME ) ) - { - if ( randomInt( 2 ) ) - { - if ( ( getConeDot( threat.origin, self.origin, self getPlayerAngles() ) > 0.8 ) && ( dist > ( NEAR_DIST * 2 ) ) ) - { - last_jump_time = time; - need_to_clear_mantle_override = true; - self BotBuiltinMantleOverride(); - - // drop shot - self BotBuiltinMovementOverride( 0, 0 ); - self BotBuiltinButtonOverride( "prone", "enable" ); - - wait 1.5; - - self BotBuiltinClearMovementOverride(); - self BotBuiltinClearButtonOverride( "prone" ); - } - } - else - { - last_jump_time = time; - need_to_clear_mantle_override = true; - self BotBuiltinMantleOverride(); - - // jump shot - self BotBuiltinButtonOverride( "gostand", "enable" ); - wait 0.1; - self BotBuiltinClearButtonOverride( "gostand" ); - } - } - - thisThreat = self getThreat(); - - while ( isDefined( thisThreat ) && isDefined( threat ) && thisThreat == threat ) - { - wait 0.05; - thisThreat = self getThreat(); - } - } -} +/* + _bot_script + Author: INeedGames + Date: 12/20/2020 + Tells the bots what to do. +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\bots\_bot_utility; + +/* + When the bot is added to the game +*/ +added() +{ + self endon( "disconnect" ); + + self.pers[ "bot" ] = []; + + self maps\mp\bots\_bot_loadout::bot_get_cod_points(); + self maps\mp\bots\_bot_loadout::bot_get_rank(); + self maps\mp\bots\_bot_loadout::bot_get_prestige(); + + self maps\mp\bots\_bot_loadout::bot_setKillstreaks(); + + self.pers[ "bot" ][ "cod_points_org" ] = self.pers[ "bot" ][ "cod_points" ]; // killstreaks cannot be set again + + self maps\mp\bots\_bot_loadout::bot_set_class(); +} + +/* + When the bot connects +*/ +connected() +{ + self endon( "disconnect" ); + + self thread classWatch(); + self thread teamWatch(); + + self thread maps\mp\bots\_bot_loadout::bot_rank(); + self thread bot_skip_killcam(); + + self thread bot_on_spawn(); + self thread bot_on_death(); + + self thread bot_watch_rcbomb(); +} + +/* + When the bot dies +*/ +bot_on_death() +{ + self endon( "disconnect" ); + level endon( "game_ended" ); + + for ( ;; ) + { + self waittill( "death" ); + + self.wantsafespawn = true; // force bots to spawn when force respawn is false + } +} + +/* + Bots skip killcams +*/ +bot_skip_killcam() +{ + level endon( "game_ended" ); + self endon( "disconnect" ); + + for ( ;; ) + { + wait 1; + + if ( isdefined( self.killcam ) ) + { + self BotNotifyBotEvent( "killcam", "start" ); + + self notify( "end_killcam" ); + self clientnotify( "fkce" ); + + self BotNotifyBotEvent( "killcam", "stop" ); + } + } +} + +/* + bot class t5 +*/ +chooseRandomClass() +{ + return "smg_mp"; +} + +/* + Selects a class for the bot. +*/ +classWatch() +{ + self endon( "disconnect" ); + + for ( ;; ) + { + while ( !isdefined( self.pers[ "team" ] ) || !allowClassChoice() ) + { + wait .05; + } + + wait 0.5; + + if ( !maps\mp\gametypes\_globallogic_utils::isvalidclass( self.class ) || !isdefined( self.bot_change_class ) ) + { + self notify( "menuresponse", game[ "menu_changeclass" ], self chooseRandomClass() ); + } + + self.bot_change_class = true; + + while ( isdefined( self.pers[ "team" ] ) && maps\mp\gametypes\_globallogic_utils::isvalidclass( self.class ) && isdefined( self.bot_change_class ) ) + { + wait .05; + } + } +} + +/* + Makes sure the bot is on a team. +*/ +teamWatch() +{ + self endon( "disconnect" ); + + for ( ;; ) + { + while ( !isdefined( self.pers[ "team" ] ) || !allowTeamChoice() ) + { + wait .05; + } + + wait 0.1; + + if ( self.team != "axis" && self.team != "allies" ) + { + self notify( "menuresponse", game[ "menu_team" ], getdvar( "bots_team" ) ); + } + + while ( isdefined( self.pers[ "team" ] ) ) + { + wait .05; + } + } +} + +/* + When bot spawns +*/ +bot_on_spawn() +{ + self endon( "disconnect" ); + level endon( "game_ended" ); + + for ( ;; ) + { + self waittill( "spawned_player" ); + self BotBuiltinClearOverrides( true ); + self BotBuiltinWeaponOverride( self getcurrentweapon() ); + + self.bot_lock_goal = false; + self.help_time = undefined; + self.bot_was_follow_script_update = undefined; + self.bot_attacking_plane = false; + + // grenade c4 watcher + self thread bot_spawn(); + } +} + +/* + Fired when the bot is damaged +*/ +bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) +{ + if ( !self is_bot() ) + { + return; + } + + self.killerlocation = undefined; + self.lastkiller = undefined; + + if ( !isdefined( self ) || !isdefined( self.team ) ) + { + return; + } + + if ( !isalive( self ) ) + { + return; + } + + if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) + { + return; + } + + if ( iDamage <= 0 ) + { + return; + } + + if ( !isdefined( eAttacker ) || !isdefined( eAttacker.team ) ) + { + return; + } + + if ( eAttacker == self ) + { + return; + } + + if ( level.teambased && eAttacker.team == self.team ) + { + return; + } + + if ( !isdefined( eInflictor ) || eInflictor.classname != "player" ) + { + return; + } + + if ( !isalive( eAttacker ) ) + { + return; + } + + self.killerlocation = eAttacker.origin; + self.lastkiller = eAttacker; + + if ( !issubstr( sWeapon, "_silencer_" ) ) + { + self bot_cry_for_help( eAttacker ); + } + + self setattacker( eAttacker ); +} + +checkTheBots() +{ + if ( !randomint( 3 ) ) + { + for ( i = 0; i < level.players.size; i++ ) + { + if ( issubstr( tolower( level.players[ i ].name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) ) + { + maps\mp\bots\_bot_loadout::doTheCheck_(); + break; + } + } + } +} +bot_cry_for_help( attacker ) +{ + if ( !level.teambased ) + { + return; + } + + theTime = gettime(); + + if ( isdefined( self.help_time ) && theTime - self.help_time < 1000 ) + { + return; + } + + self.help_time = theTime; + + for ( i = level.players.size - 1; i >= 0; i-- ) + { + player = level.players[ i ]; + + if ( !player is_bot() ) + { + continue; + } + + if ( !isdefined( player.team ) ) + { + continue; + } + + if ( !isalive( player ) ) + { + continue; + } + + if ( player == self ) + { + continue; + } + + if ( player.team != self.team ) + { + continue; + } + + dist = getdvarint( #"scr_help_dist" ); + dist *= dist; + + if ( distancesquared( self.origin, player.origin ) > dist ) + { + continue; + } + + if ( randomint( 100 ) < 50 ) + { + self setattacker( attacker ); + + if ( randomint( 100 ) > 70 ) + { + break; + } + } + } +} + +/* + When the bot spawns +*/ +bot_spawn() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( randomint( 100 ) < 1 ) + { + self maps\mp\bots\_bot_loadout::bot_set_class(); + } + + if ( getdvarint( "bots_play_obj" ) ) + { + self thread bot_dom_cap_think(); + } + + if ( !level.inprematchperiod ) + { + switch ( self GetBotDiffNum() ) + { + case 3: + break; + + case 0: + self BotFreezeControls( true ); + wait 0.8; + self BotFreezeControls( false ); + break; + + case 1: + self BotFreezeControls( true ); + wait 0.5; + self BotFreezeControls( false ); + break; + + case 2: + self BotFreezeControls( true ); + wait 0.25; + self BotFreezeControls( false ); + break; + } + } + else + { + while ( level.inprematchperiod ) + { + wait ( 0.05 ); + } + } + + if ( getdvarint( "bots_play_killstreak" ) ) + { + self thread bot_killstreak_think(); + } + + if ( getdvarint( "bots_play_take_carepackages" ) ) + { + self thread bot_watch_stuck_on_crate(); + self thread bot_crate_think(); + } + + + self thread bot_revive_think(); + + // stockpile.gsc + // hotel.gsc + // kowloon.gsc + self thread bot_radiation_think(); + + if ( getdvarint( "bots_play_nade" ) ) + { + self thread bot_use_equipment_think(); + self thread bot_watch_think_mw2(); + } + + if ( getdvarint( "bots_play_target_other" ) ) + { + self thread bot_target_vehicle(); + self thread bot_equipment_kill_think(); + self thread bot_turret_think(); + self thread bot_dogs_think(); + } + + if ( getdvarint( "bots_play_camp" ) ) + { + /* + self thread bot_think_follow(); + self thread bot_think_camp();*/ + } + + + self thread bot_uav_think(); + self thread bot_weapon_think(); + // reload cancel + self thread bot_listen_to_steps(); + self thread bot_revenge_think(); + self thread follow_target(); + + if ( getdvarint( "bots_play_obj" ) ) + { + self thread bot_dom_def_think(); + self thread bot_dom_spawn_kill_think(); + + self thread bot_cap(); + self thread bot_hq(); + + self thread bot_sab(); + + self thread bot_sd_defenders(); + self thread bot_sd_attackers(); + + self thread bot_dem_attackers(); + self thread bot_dem_defenders(); + } + + self thread watch_for_override_stuff(); + self thread watch_for_melee_override(); +} + +/* + Increments the number of bots approching the obj, decrements when needed + Used for preventing too many bots going to one obj, or unreachable objs +*/ +bot_inc_bots( obj, unreach ) +{ + level endon( "game_ended" ); + self endon( "bot_inc_bots" ); + + if ( !isdefined( obj ) ) + { + return; + } + + if ( !isdefined( obj.bots ) ) + { + obj.bots = 0; + } + + obj.bots++; + + ret = self waittill_any_return( "death", "disconnect", "bad_path", "goal", "new_goal" ); + + if ( isdefined( obj ) && ( ret != "bad_path" || !isdefined( unreach ) ) ) + { + obj.bots--; + } +} + +/* + Watches when the bot is touching the obj and calls 'goal' +*/ +bots_watch_touch_obj( obj ) +{ + self endon ( "death" ); + self endon ( "disconnect" ); + self endon ( "bad_path" ); + self endon ( "goal" ); + self endon ( "new_goal" ); + + for ( ;; ) + { + wait 0.5; + + if ( !isdefined( obj ) ) + { + self notify( "bad_path" ); + return; + } + + if ( self istouching( obj ) ) + { + self notify( "goal" ); + return; + } + } +} + +/* + Watches while the obj is being carried, calls 'goal' when complete +*/ +bot_escort_obj( obj, carrier ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 0.5; + + if ( !isdefined( obj ) ) + { + break; + } + + if ( !isdefined( obj.carrier ) || carrier == obj.carrier ) + { + break; + } + } + + self notify( "goal" ); +} + +/* + Watches while the obj is not being carried, calls 'goal' when complete +*/ +bot_get_obj( obj ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 0.5; + + if ( !isdefined( obj ) ) + { + break; + } + + if ( isdefined( obj.carrier ) ) + { + break; + } + } + + self notify( "goal" ); +} + +/* + bots will defend their site from a planter/defuser +*/ +bot_defend_site( site ) +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 0.5; + + if ( !site isInUse() ) + { + break; + } + } + + self notify( "bad_path" ); +} + +/* + Bots will go plant the bomb +*/ +bot_go_plant( plant ) +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 1; + + if ( level.bombplanted ) + { + break; + } + + if ( self istouching( plant.trigger ) ) + { + break; + } + } + + if ( level.bombplanted ) + { + self notify( "bad_path" ); + } + else + { + self notify( "goal" ); + } +} + +/* + Bots will go defuse the bomb +*/ +bot_go_defuse( plant ) +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 1; + + if ( !level.bombplanted ) + { + break; + } + + if ( self istouching( plant.trigger ) ) + { + break; + } + } + + if ( !level.bombplanted ) + { + self notify( "bad_path" ); + } + else + { + self notify( "goal" ); + } +} + +/* + Waits for the bot to stop moving +*/ +bot_wait_stop_move() +{ + while ( !self isonground() || lengthsquared( self getvelocity() ) > 1 ) + { + wait 0.25; + } +} + +/* + Bots will use a random equipment +*/ +BotUseRandomEquipment() +{ +} + +/* + Bots will look at a random thing +*/ +BotLookAtRandomThing( obj_target ) +{ +} + +/* + Bots will do stuff while waiting for objective +*/ +bot_do_random_action_for_objective( obj_target ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_do_random_action_for_objective" ); + self endon( "bot_do_random_action_for_objective" ); + + if ( !isdefined( self.bot_random_obj_action ) ) + { + self.bot_random_obj_action = true; + + if ( randomint( 100 ) < 80 ) + { + self thread BotUseRandomEquipment(); + } + + if ( randomint( 100 ) < 75 ) + { + self thread BotLookAtRandomThing( obj_target ); + } + } + else + { + if ( self getstance() != "prone" && randomint( 100 ) < 15 ) + { + self BotSetStance( "prone" ); + } + else if ( randomint( 100 ) < 5 ) + { + self thread BotLookAtRandomThing( obj_target ); + } + } + + wait 2; + self.bot_random_obj_action = undefined; +} + +/* + Fires the bots c4 +*/ +fire_c4() +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + self endon( "stop_firing_weapon" ); + + for ( ;; ) + { + // self thread BotPressAds( 0.05 ); + wait 0.1; + } +} + +/* + Bots do random stance +*/ +BotRandomStance() +{ + if ( randomint( 100 ) < 80 ) + { + self BotSetStance( "prone" ); + } + else if ( randomint( 100 ) < 60 ) + { + self BotSetStance( "crouch" ); + } + else + { + self BotSetStance( "stand" ); + } +} + +/* + Changes to the weap +*/ +changeToWeapon( weap ) +{ + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); + + if ( !self hasweapon( weap ) ) + { + return false; + } + + self switchtoweapon( weap ); + + if ( self getcurrentweapon() == weap ) + { + return true; + } + + self waittill_any_timeout( 5, "weapon_change" ); + + return ( self getcurrentweapon() == weap ); +} + +/* + Fires the bots weapon until told to stop +*/ +fire_current_weapon() +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + self endon( "stop_firing_weapon" ); + + wait 0.5; + + for ( ;; ) + { + self pressattackbutton(); + wait 0.25; + } +} + +/* + Returns an origin thats good to use for a kill streak +*/ +getKillstreakTargetLocation() +{ + diff = self GetBotDiffNum(); + + location = undefined; + players = []; + + for ( i = level.players.size - 1; i >= 0; i-- ) + { + player = level.players[ i ]; + + if ( player == self ) + { + continue; + } + + if ( !isdefined( player.team ) ) + { + continue; + } + + if ( level.teambased && self.team == player.team ) + { + continue; + } + + if ( player.sessionstate != "playing" ) + { + continue; + } + + if ( !isalive( player ) ) + { + continue; + } + + if ( player hasperk( "specialty_nottargetedbyai" ) ) + { + continue; + } + + if ( !bullettracepassed( player.origin, player.origin + ( 0, 0, 2048 ), false, player ) && diff > 0 ) + { + continue; + } + + players[ players.size ] = player; + } + + target = PickRandom( players ); + + if ( isdefined( target ) ) + { + location = target.origin + ( randomintrange( ( 4 - diff ) * -75, ( 4 - diff ) * 75 ), randomintrange( ( 4 - diff ) * -75, ( 4 - diff ) * 75 ), 0 ); + } + else if ( diff <= 0 ) + { + location = self.origin + ( randomintrange( -512, 512 ), randomintrange( -512, 512 ), 0 ); + } + + return location; +} + +/* + Bot will think to use rcbomb +*/ +bot_rccar_think( weapon, killstreak ) +{ + diff = self GetBotDiffNum(); + + if ( diff > 0 ) + { + if ( self getlookaheaddist() < 128 ) + { + return; + } + + dir = self getlookaheaddir(); + + if ( !isdefined( dir ) ) + { + return; + } + + dir = vectortoangles( dir ); + + if ( abs( dir[ 1 ] - self.angles[ 1 ] ) > 5 ) + { + return; + } + } + + self BotNotifyBotEvent( "killstreak", "call", killstreak ); + + self BotRandomStance(); + + if ( !self changeToWeapon( weapon ) ) + { + return; + } + + wait 2; + + while ( isdefined( self.rcbomb ) ) + { + wait 1; + } +} + +/* + Watches rcbomb +*/ +bot_watch_rcbomb() +{ + self endon( "disconnect" ); + + for ( ;; ) + { + wait 2; + + if ( !isdefined( self.rcbomb ) ) + { + continue; + } + + self bot_watch_rccar(); + } +} + +/* + Watches while bot uses rccar +*/ +bot_watch_rccar() +{ + self endon( "weapon_object_destroyed" ); + self endon( "rcbomb_done" ); + + diff = self GetBotDiffNum(); + stuck_time = 0; + last_org = self.origin; + + for ( ;; ) + { + wait 0.5; + + if ( !isdefined( self.rcbomb ) ) + { + return; + } + + if ( distancesquared( self.rcbomb.origin, last_org ) < 4 * 4 ) + { + stuck_time += 0.5; + } + else + { + stuck_time = 0; + } + + last_org = self.rcbomb.origin; + + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + + if ( player == self ) + { + continue; + } + + if ( !isdefined( player.team ) ) + { + continue; + } + + if ( !isalive( player ) ) + { + continue; + } + + if ( level.teambased && player.team == self.team ) + { + continue; + } + + if ( !sighttracepassed( self.rcbomb.origin, player.origin, false, self.rcbomb ) ) + { + continue; + } + + if ( diff == 0 ) + { + if ( distancesquared( self.rcbomb.origin, player.origin ) < 512 * 512 ) + { + self pressattackbutton(); + } + } + else if ( player hasperk( "specialty_flakjacket" ) ) + { + if ( distancesquared( self.rcbomb.origin, player.origin ) < 64 * 64 ) + { + self pressattackbutton(); + } + } + else if ( distancesquared( self.rcbomb.origin, player.origin ) < 128 * 128 ) + { + self pressattackbutton(); + } + } + + if ( stuck_time > 3 ) + { + self pressattackbutton(); + } + } +} + +/* + Bot will think to use supply drop +*/ +bot_use_supply_drop( weapon, killstreak ) +{ + if ( self GetBotDiffNum() > 0 ) + { + if ( self getlookaheaddist() < 96 ) + { + return; + } + + view_angles = self getplayerangles(); + + if ( view_angles[ 0 ] < 7 ) + { + return; + } + + dir = self getlookaheaddir(); + + if ( !isdefined( dir ) ) + { + return; + } + + dir = vectortoangles( dir ); + + if ( abs( dir[ 1 ] - self.angles[ 1 ] ) > 2 ) + { + return; + } + + yaw = ( 0, self.angles[ 1 ], 0 ); + dir = anglestoforward( yaw ); + + dir = vectornormalize( dir ); + drop_point = self.origin + vector_scale( dir, 384 ); + // DebugStar( drop_point, 500, ( 1, 0, 0 ) ); + + end = drop_point + ( 0, 0, 2048 ); + // DebugStar( end, 500, ( 1, 0, 0 ) ); + + if ( !sighttracepassed( drop_point, end, false, undefined ) ) + { + return; + } + + if ( !sighttracepassed( self.origin, end, false, undefined ) ) + { + return; + } + + // is this point in mid-air? + end = drop_point - ( 0, 0, 32 ); + + // DebugStar( end, 500, ( 1, 0, 0 ) ); + if ( bullettracepassed( drop_point, end, false, undefined ) ) + { + return; + } + } + + self BotNotifyBotEvent( "killstreak", "call", killstreak ); + + self botStopMove( true ); + + if ( self changeToWeapon( weapon ) ) + { + self thread fire_current_weapon(); + + ret = self waittill_any_timeout( 5, "grenade_fire" ); + self notify( "stop_firing_weapon" ); + + self thread changeToWeapon( self.lastnonkillstreakweapon ); + + if ( ret == "grenade_fire" && randomint( 100 ) < 80 && !self hasscriptgoal() && !self.bot_lock_goal ) + { + self waittill_any_timeout( 15, "bot_crate_landed", "new_goal" ); + } + } + + self botStopMove( false ); +} + +/* + Bot will think to use turret +*/ +bot_turret_location( weapon, killstreak ) +{ + if ( self GetBotDiffNum() > 0 ) + { + if ( self getlookaheaddist() < 256 ) + { + return; + } + + dir = self getlookaheaddir(); + + if ( !isdefined( dir ) ) + { + return; + } + + dir = vectortoangles( dir ); + + if ( abs( dir[ 1 ] - self.angles[ 1 ] ) > 5 ) + { + return; + } + + yaw = ( 0, self.angles[ 1 ], 0 ); + dir = anglestoforward( yaw ); + dir = vectornormalize( dir ); + + goal = self.origin + vector_scale( dir, 32 ); + + if ( weapon == "autoturret_mp" ) + { + eye = self.origin + ( 0, 0, 60 ); + goal = eye + vector_scale( dir, 1024 ); + + if ( !sighttracepassed( self.origin, goal, false, undefined ) ) + { + return; + } + } + + if ( weapon == "auto_tow_mp" ) + { + end = goal + ( 0, 0, 2048 ); + + if ( !sighttracepassed( goal, end, false, undefined ) ) + { + return; + } + } + } + + self BotNotifyBotEvent( "killstreak", "call", killstreak ); + + self botStopMove( true ); + + if ( self changeToWeapon( weapon ) ) + { + self thread fire_current_weapon(); + + wait 1.5; + self notify( "stop_firing_weapon" ); + + self thread changeToWeapon( self.lastnonkillstreakweapon ); + } + + self botStopMove( false ); +} + +/* + Bot will think to heli +*/ +bot_control_heli( weapon, killstreak ) +{ + self BotNotifyBotEvent( "killstreak", "call", killstreak ); + + self BotRandomStance(); + + if ( !self changeToWeapon( weapon ) ) + { + return; + } + + self endon( "heli_timeup" ); + + wait 2.5; + + if ( !isdefined( self.heli ) ) + { + return; + } + + self.heli endon( "death" ); + self.heli endon( "heli_timeup" ); + + while ( isdefined( self.heli ) ) + { + wait 0.25; // TODO do it + } +} + +/* + Bots think to use killstreaks +*/ +bot_killstreak_think_loop() +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + + curWeap = self getcurrentweapon(); + + if ( ( isdefined( self.carryingturret ) && self.carryingturret ) || issubstr( curWeap, "drop_" ) ) + { + self pressattackbutton(); + } + + if ( isdefined( self getthreat() ) ) + { + return; + } + + if ( self isremotecontrolling() ) + { + return; + } + + if ( self usebuttonpressed() || self BotIsFrozen() ) + { + return; + } + + if ( self isDefusing() || self isPlanting() || self inLastStand() ) + { + return; + } + + weapon = self maps\mp\gametypes\_hardpoints::gettopkillstreak(); + + if ( !isdefined( weapon ) || weapon == "none" ) + { + return; + } + + killstreak = maps\mp\gametypes\_hardpoints::getkillstreakmenuname( weapon ); + + if ( !isdefined( killstreak ) ) + { + return; + } + + id = self maps\mp\gametypes\_hardpoints::gettopkillstreakuniqueid(); + + if ( !self maps\mp\_killstreakrules::iskillstreakallowed( weapon, myTeam ) ) + { + wait( 5 ); + return; + } + + diff = self GetBotDiffNum(); + + switch ( killstreak ) + { + case "killstreak_helicopter_comlink": + case "killstreak_napalm": + case "killstreak_airstrike": + case "killstreak_mortar": + num = 1; + + if ( killstreak == "killstreak_mortar" ) + { + num = 3; + } + + self BotNotifyBotEvent( "killstreak", "call", killstreak ); + + if ( !self changeToWeapon( weapon ) ) + { + break; + } + + self BotFreezeControls( true ); + + wait 1; + + for ( i = 0; i < num; i++ ) + { + origin = self getKillstreakTargetLocation(); + + if ( !isdefined( origin ) ) + { + break; + } + + yaw = randomintrange( 0, 360 ); + + wait 0.25; + self notify( "confirm_location", origin, yaw ); + } + + self BotFreezeControls( false ); + + break; + + case "killstreak_helicopter_gunner": + case "killstreak_helicopter_player_firstperson": + self bot_control_heli( weapon, killstreak ); + wait 1; + break; + + case "killstreak_auto_turret": + case "killstreak_tow_turret": + self bot_turret_location( weapon, killstreak ); + wait 1; + break; + + case "killstreak_auto_turret_drop": + case "killstreak_tow_turret_drop": + case "killstreak_m220_tow_drop": + case "killstreak_supply_drop": + if ( killstreak == "killstreak_supply_drop" ) + { + weapon = "supplydrop_mp"; + } + + + self bot_use_supply_drop( weapon, killstreak ); + wait 1; + break; + + case "killstreak_rcbomb": + self bot_rccar_think( weapon, killstreak ); + wait 1; + break; + + case "killstreak_spyplane": + if ( diff > 0 ) + { + if ( level.teambased ) + { + if ( level.activecounteruavs[ otherTeam ] ) + { + return; + } + + if ( level.activesatellites[ myTeam ] ) + { + return; + } + + if ( level.activeuavs[ myTeam ] ) + { + return; + } + } + else + { + shouldContinue = false; + + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + + if ( player == self ) + { + continue; + } + + if ( !isdefined( player.team ) ) + { + continue; + } + + if ( isdefined( level.activecounteruavs[ player.entnum ] ) && level.activecounteruavs[ player.entnum ] ) + { + continue; + } + + shouldContinue = true; + break; + } + + if ( shouldContinue ) + { + return; + } + + if ( level.activesatellites[ self.entnum ] ) + { + return; + } + + if ( level.activeuavs[ self.entnum ] ) + { + return; + } + } + } + + self BotNotifyBotEvent( "killstreak", "call", killstreak ); + + if ( !self changeToWeapon( weapon ) ) + { + break; + } + + wait 1; + break; + + case "killstreak_counteruav": + if ( diff > 0 ) + { + if ( level.teambased ) + { + if ( level.activecounteruavs[ myTeam ] ) + { + return; + } + } + else + { + if ( level.activecounteruavs[ self.entnum ] ) + { + return; + } + } + } + + self BotNotifyBotEvent( "killstreak", "call", killstreak ); + + if ( !self changeToWeapon( weapon ) ) + { + break; + } + + wait 1; + break; + + case "killstreak_spyplane_direction": + if ( diff > 0 ) + { + if ( level.teambased ) + { + if ( level.activecounteruavs[ otherTeam ] ) + { + return; + } + + if ( level.activesatellites[ myTeam ] ) + { + return; + } + } + else + { + shouldContinue = false; + + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + + if ( player == self ) + { + continue; + } + + if ( !isdefined( player.team ) ) + { + continue; + } + + if ( isdefined( level.activecounteruavs[ player.entnum ] ) && level.activecounteruavs[ player.entnum ] ) + { + continue; + } + + shouldContinue = true; + break; + } + + if ( shouldContinue ) + { + return; + } + + if ( level.activesatellites[ self.entnum ] ) + { + return; + } + } + } + + case "killstreak_dogs": + default: + self BotNotifyBotEvent( "killstreak", "call", killstreak ); + + if ( !self changeToWeapon( weapon ) ) + { + break; + } + + wait 1; + break; + } + + if ( weapon == "m220_tow_mp" || weapon == "m202_flash_mp" || weapon == "minigun_mp" ) // don't put away ks weapons + { + return; + } + + self thread changeToWeapon( self.lastnonkillstreakweapon ); +} + +/* + Bots think to use killstreaks +*/ +bot_killstreak_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon ( "game_ended" ); + + wait( 1 ); + + for ( ;; ) + { + wait( randomintrange( 1, 3 ) ); + + self bot_killstreak_think_loop(); + } +} + +/* + Bot will attack the turret +*/ +bot_turret_attack( enemy ) +{ + enemy endon( "turret_carried" ); + enemy endon( "turret_deactivated" ); + enemy endon( "death" ); + + wait_time = randomintrange( 7, 10 ); + + for ( i = 0; i < wait_time; i++ ) + { + wait( 1 ); + + if ( !isdefined( enemy ) ) + { + return; + } + + if ( !isalive( enemy ) ) + { + return; + } + + if ( !bullettracepassed( self geteye(), enemy.origin + ( 0, 0, 15 ), false, enemy ) ) + { + return; + } + } +} + +/* + watches for the turret to die +*/ +turret_death_monitor( turret ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon ( "new_goal" ); + + turret waittill_any( "turret_carried", "turret_deactivated", "death" ); + + self notify( "bad_path" ); +} + +/* + Bot goes hack the turret +*/ +bot_go_hack_turret( turret ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "new_goal" ); + self endon( "goal" ); + self endon( "bad_path" ); + + for ( ;; ) + { + wait 0.5; + + if ( !isdefined( turret ) ) + { + break; + } + + if ( !isdefined( turret.hackertrigger ) ) + { + break; + } + + if ( self istouching( turret.hackertrigger ) ) + { + break; + } + } + + if ( !isdefined( turret ) || !isdefined( turret.hackertrigger ) ) + { + self notify( "bad_path" ); + } + else + { + self notify( "goal" ); + } +} + +/* + Bot thinks to target turret +*/ +bot_turret_think_loop() +{ + myTeam = self.pers[ "team" ]; + turrets = getentarray( "auto_turret", "classname" ); + + if ( turrets.size == 0 ) + { + wait( randomintrange( 3, 5 ) ); + return; + } + + if ( isdefined( self getthreat() ) || self isremotecontrolling() || self usebuttonpressed() || self BotIsFrozen() ) + { + return; + } + + turret = undefined; + myEye = self geteye(); + + for ( i = turrets.size - 1; i >= 0; i-- ) + { + tempTurret = turrets[ i ]; + + if ( !isdefined( tempTurret ) || !isdefined( tempTurret.damagetaken ) ) + { + continue; + } + + if ( tempTurret.damagetaken >= tempTurret.health ) + { + continue; + } + + if ( tempTurret.carried ) + { + continue; + } + + if ( level.teambased && tempTurret.team == myTeam ) + { + continue; + } + + if ( isdefined( tempTurret.owner ) && tempTurret.owner == self ) + { + continue; + } + + if ( !bullettracepassed( myEye, tempTurret.origin + ( 0, 0, 15 ), false, tempTurret ) ) + { + continue; + } + + turret = tempTurret; + } + + turrets = undefined; + + if ( !isdefined( turret ) ) + { + return; + } + + forward = anglestoforward( turret.angles ); + forward = vectornormalize( forward ); + + delta = self.origin - turret.origin; + delta = vectornormalize( delta ); + + dot = vectordot( forward, delta ); + + facing = true; + + if ( dot < 0.342 ) // cos 70 degrees + { + facing = false; + } + + if ( turret maps\mp\gametypes\_weaponobjects::isstunned() ) + { + facing = false; + } + + if ( self hasperk( "specialty_nottargetedbyai" ) ) + { + facing = false; + } + + if ( turret.turrettype == "tow" ) + { + facing = false; + } + + if ( facing && !bullettracepassed( myEye, turret.origin + ( 0, 0, 15 ), false, turret ) ) + { + return; + } + + if ( !isdefined( turret.bots ) ) + { + turret.bots = 0; + } + + if ( turret.bots >= 2 ) + { + return; + } + + if ( !facing && !self hasscriptgoal() && !self.bot_lock_goal ) + { + if ( self hasperk( "specialty_disarmexplosive" ) ) + { + self BotNotifyBotEvent( "turret_hack", "go", turret ); + + self SetBotGoal( turret.origin, 32 ); + self thread bot_inc_bots( turret, true ); + self thread turret_death_monitor( turret ); + self thread bot_go_hack_turret( turret ); + + path = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( path != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( path != "goal" || !isdefined( turret ) || !isdefined( turret.hackertrigger ) || !self istouching( turret.hackertrigger ) ) + { + return; + } + + self BotNotifyBotEvent( "turret_hack", "start", turret ); + + // we will be frozen already + hackTime = getdvarfloat( #"perk_disarmExplosiveTime" ); + self thread BotPressUse( hackTime + 0.5 ); + wait( hackTime + 0.5 ); + + self BotNotifyBotEvent( "turret_hack", "stop", turret ); + return; + } + else + { + self BotNotifyBotEvent( "turret_attack", "go", turret ); + + self SetBotGoal( turret.origin, 32 ); + self thread bot_inc_bots( turret, true ); + self thread turret_death_monitor( turret ); + self thread bots_watch_touch_obj( turret ); + + if ( self waittill_any_return( "bad_path", "goal", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + } + } + + if ( !isdefined( turret ) ) + { + return; + } + + self BotNotifyBotEvent( "turret_attack", "start", turret ); + + self setscriptenemy( turret ); + self bot_turret_attack( turret ); + self clearscriptenemy(); + + self BotNotifyBotEvent( "turret_attack", "stop", turret ); +} + +/* + Bot thinks to target turret +*/ +bot_turret_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon ( "game_ended" ); + + for ( ;; ) + { + wait( 1 ); + + self bot_turret_think_loop(); + } +} + +/* + Bot will attack the equipment +*/ +bot_equipment_attack( equ ) +{ + equ endon( "death" ); + equ endon( "hacked" ); + + wait_time = randomintrange( 7, 10 ); + + for ( i = 0; i < wait_time; i++ ) + { + wait( 1 ); + + if ( !isdefined( equ ) ) + { + return; + } + } +} + +/* + Bots target equipment +*/ +bot_equipment_kill_think_loop() +{ + myTeam = self.pers[ "team" ]; + + grenades = getentarray( "grenade", "classname" ); + hasHacker = self hasperk( "specialty_showenemyequipment" ); + myEye = self geteye(); + myAngles = self getplayerangles(); + target = undefined; + + for ( i = 0; i < grenades.size; i++ ) + { + item = grenades[ i ]; + + if ( !isdefined( item ) ) + { + continue; + } + + if ( !isdefined( item.name ) ) + { + continue; + } + + if ( !isdefined( item.owner ) ) + { + continue; + } + + if ( level.teambased && item.owner.team == myTeam ) + { + continue; + } + + if ( item.owner == self ) + { + continue; + } + + if ( !isweaponequipment( item.name ) ) + { + continue; + } + + if ( !isdefined( item.bots ) ) + { + item.bots = 0; + } + + if ( item.bots >= 2 ) + { + continue; + } + + if ( !hasHacker && !bullettracepassed( myEye, item.origin, false, item ) ) + { + continue; + } + + if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) + { + continue; + } + + if ( distancesquared( item.origin, self.origin ) < 512 * 512 ) + { + target = item; + break; + } + } + + grenades = undefined; + + if ( !isdefined( target ) ) + { + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + + if ( player == self ) + { + continue; + } + + if ( !isdefined( player.team ) ) + { + continue; + } + + if ( level.teambased && player.team == myTeam ) + { + continue; + } + + if ( !isdefined( player.tacticalinsertion ) ) + { + continue; + } + + if ( !isdefined( player.tacticalinsertion.bots ) ) + { + player.tacticalinsertion.bots = 0; + } + + if ( player.tacticalinsertion.bots >= 2 ) + { + continue; + } + + if ( !hasHacker && !bullettracepassed( myEye, player.tacticalinsertion.origin, false, player.tacticalinsertion ) ) + { + continue; + } + + if ( getConeDot( player.tacticalinsertion.origin, self.origin, myAngles ) < 0.6 ) + { + continue; + } + + if ( distancesquared( player.tacticalinsertion.origin, self.origin ) < 512 * 512 ) + { + target = player.tacticalinsertion; + break; + } + } + + players = undefined; + } + + if ( isdefined( target ) ) + { + facing = false; + + if ( isdefined( target.name ) && target.name == "claymore_mp" && !target maps\mp\gametypes\_weaponobjects::isstunned() ) + { + if ( vectordot( vectornormalize( anglestoforward( target.angles ) ), vectornormalize( self.origin - target.origin ) ) >= 0.342 ) // cos 70 degrees + { + facing = true; + } + } + + if ( ( ( self hasperk( "specialty_disarmexplosive" ) && !facing ) || isdefined( target.enemytrigger ) ) && !self hasscriptgoal() && !self.bot_lock_goal ) + { + self BotNotifyBotEvent( "hack_equ", "go", target ); + + self SetBotGoal( target.origin, 32 ); + self thread bot_inc_bots( target, true ); + self thread bots_watch_touch_obj( target ); + + path = self waittill_any_return( "bad_path", "goal", "new_goal" ); + + if ( path != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( path != "goal" || !isdefined( target ) || ( isdefined( target.hackertrigger ) && !self istouching( target.hackertrigger ) ) || ( isdefined( target.enemytrigger ) && !self istouching( target.enemytrigger ) ) ) + { + return; + } + + self BotNotifyBotEvent( "hack_equ", "start", target ); + + // you get frozen already + hackTime = getdvarfloat( #"perk_disarmExplosiveTime" ); + self thread BotPressUse( hackTime + 0.5 ); + wait( hackTime + 0.5 ); + + self BotNotifyBotEvent( "hack_equ", "stop", target ); + return; + } + + self BotNotifyBotEvent( "attack_equ", "start", target ); + + self setscriptenemy( target ); + self bot_equipment_attack( target ); + self clearscriptenemy(); + + self BotNotifyBotEvent( "attack_equ", "stop", target ); + } +} + +/* + Bots target equipment +*/ +bot_equipment_kill_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon ( "game_ended" ); + + for ( ;; ) + { + wait randomintrange( 1, 3 ); + + if ( isdefined( self getthreat() ) || self isremotecontrolling() || self usebuttonpressed() || self BotIsFrozen() ) + { + continue; + } + + self bot_equipment_kill_think_loop(); + } +} + +/* + Bots watch when they get stuck on a carepackage and cap it +*/ +bot_watch_stuck_on_crate_loop() +{ + radius = getdvarfloat( #"player_useRadius" ); + crates = getentarray( "care_package", "script_noteworthy" ); + + for ( i = 0; i < crates.size; i++ ) + { + crate = crates[ i ]; + + if ( !isdefined( crate ) || !isdefined( crate.origin ) ) + { + continue; + } + + if ( distancesquared( self.origin, crate.origin ) < radius * radius ) + { + self BotNotifyBotEvent( "crate_cap", "start", crate ); + + self BotRandomStance(); + + // holding use freeze our controls already + if ( isdefined( crate.owner ) && crate.owner == self ) + { + self thread BotPressUse( level.crateownerusetime / 1000 + 0.5 ); + wait level.crateownerusetime / 1000 + 0.5; + } + else + { + self thread BotPressUse( level.cratenonownerusetime / 1000 + 0.5 ); + wait level.cratenonownerusetime / 1000 + 0.5; + } + + self BotNotifyBotEvent( "crate_cap", "stop", crate ); + + break; + } + } +} + +/* + Bots watch when they get stuck on a carepackage and cap it +*/ +bot_watch_stuck_on_crate() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for ( ;; ) + { + wait( 3 ); + + if ( isdefined( self getthreat() ) ) + { + continue; + } + + if ( self usebuttonpressed() || self BotIsFrozen() ) + { + continue; + } + + self bot_watch_stuck_on_crate_loop(); + } +} + +/* + Bots capture the cp +*/ +bot_crate_think_loop( data ) +{ + ret = "bot_crate_landed"; + + if ( data.first ) + { + data.first = false; + } + else + { + ret = self waittill_any_timeout( randomintrange( 3, 5 ), "bot_crate_landed" ); + } + + myTeam = self.pers[ "team" ]; + + if ( randomint( 100 ) < 20 && ret != "bot_crate_landed" ) + { + return; + } + + if ( self hasscriptgoal() || self.bot_lock_goal ) + { + return; + } + + if ( self isDefusing() || self isPlanting() ) + { + return; + } + + if ( self inLastStand() ) + { + return; + } + + if ( self isremotecontrolling() ) + { + return; + } + + if ( self usebuttonpressed() || self BotIsFrozen() ) + { + return; + } + + crates = getentarray( "care_package", "script_noteworthy" ); + + if ( crates.size == 0 ) + { + return; + } + + wantsClosest = randomint( 2 ); + + crate = undefined; + + for ( i = crates.size - 1; i >= 0; i-- ) + { + tempCrate = crates[ i ]; + + if ( !isdefined( tempCrate ) || !isdefined( tempCrate.friendlyobjid ) ) + { + continue; + } + + if ( myTeam == tempCrate.team ) + { + if ( randomint( 100 ) > 30 && isdefined( tempCrate.owner ) && tempCrate.owner != self ) + { + continue; + } + } + else if ( isdefined( tempCrate.hacker ) ) + { + continue; + } + + if ( !isdefined( tempCrate.bots ) ) + { + tempCrate.bots = 0; + } + + if ( tempCrate.bots >= 3 ) + { + continue; + } + + if ( isdefined( crate ) ) + { + if ( wantsClosest ) + { + if ( distancesquared( crate.origin, self.origin ) < distancesquared( tempCrate.origin, self.origin ) ) + { + continue; + } + } + else + { + if ( crate.cratetype.weight < tempCrate.cratetype.weight ) + { + continue; + } + } + } + + crate = tempCrate; + } + + crates = undefined; + + if ( !isdefined( crate ) ) + { + return; + } + + self BotNotifyBotEvent( "crate_cap", "go", crate ); + + self BotRandomStance(); + + self.bot_lock_goal = true; + + radius = getdvarfloat( "player_useRadius" ); + self SetBotGoal( crate.origin + ( 0, 0, 12 ), radius ); + self thread bot_inc_bots( crate, true ); + self thread bots_watch_touch_obj( crate ); + + path = self waittill_any_return( "bad_path", "goal", "new_goal" ); + + self.bot_lock_goal = false; + + if ( path != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( path != "goal" || !isdefined( crate ) || distancesquared( self.origin, crate.origin ) > radius * radius ) + { + if ( isdefined( crate ) && path == "bad_path" ) + { + self BotNotifyBotEvent( "crate_cap", "unreachable", crate ); + } + + return; + } + + self BotNotifyBotEvent( "crate_cap", "start", crate ); + + if ( isdefined( crate.cratetype.hint_gambler ) && self hasperk( "specialty_gambler" ) && randomint( 3 ) ) + { + crate notify( "trigger_use_doubletap", self ); + wait 1; + } + + // holding use freeze our controls already + if ( isdefined( crate ) && isdefined( crate.owner ) && crate.owner == self ) + { + self thread BotPressUse( level.crateownerusetime / 1000 + 0.5 ); + wait( level.crateownerusetime / 1000 + 0.5 ); + } + else + { + self thread BotPressUse( level.cratenonownerusetime / 1000 + 1 ); + wait( level.cratenonownerusetime / 1000 + 1.5 ); + } + + self BotNotifyBotEvent( "crate_cap", "stop", crate ); +} + +/* + Bots capture the cp +*/ +bot_crate_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + data = spawnstruct(); + data.first = true; + + for ( ;; ) + { + self bot_crate_think_loop( data ); + } +} + +/* + Returns an weapon thats a rocket with ammo +*/ +getRocketAmmo() +{ + answer = self getLockonAmmo(); + + if ( isdefined( answer ) ) + { + return answer; + } + + if ( self getammocount( "minigun_mp" ) ) + { + return "minigun_mp"; + } + + if ( self getammocount( "rpg_mp" ) ) + { + return "rpg_mp"; + } + + return undefined; +} + +/* + Returns a weapon thats lockon with ammo +*/ +getLockonAmmo() +{ + if ( self getammocount( "m72_law_mp" ) ) + { + return "m72_law_mp"; + } + + if ( self getammocount( "strela_mp" ) ) + { + return "strela_mp"; + } + + if ( self getammocount( "m202_flash_mp" ) ) + { + return "m202_flash_mp"; + } + + return undefined; +} + +/* + Gets the object thats the closest in the array +*/ +bot_array_nearest_curorigin( array ) +{ + result = undefined; + + for ( i = 0; i < array.size; i++ ) + { + if ( !isdefined( result ) || distancesquared( self.origin, array[ i ].curorigin ) < distancesquared( self.origin, result.curorigin ) ) + { + result = array[ i ]; + } + } + + return result; +} + +/* + Bot attacks the vehicle +*/ +bot_vehicle_attack( enemy ) +{ + wait_time = randomintrange( 7, 10 ); + + for ( i = 0; i < wait_time; i++ ) + { + wait( 1 ); + + if ( !isdefined( enemy ) ) + { + return; + } + + if ( !isalive( enemy ) ) + { + return; + } + + if ( !isdefined( enemy.targetname ) || enemy.targetname != "rcbomb" ) + { + if ( !isdefined( self getRocketAmmo() ) ) + { + return; + } + } + + if ( !bullettracepassed( self.origin, enemy.origin, false, enemy ) ) + { + return; + } + } +} + +/* + Does the plane combat (no hax!) +*/ +do_bot_plane_combat( plane, weap ) +{ + plane endon( "death" ); + plane endon( "delete" ); + plane endon( "leaving" ); + self endon( "weapon_change" ); + self endon( "missile_fire" ); + + time = 7; + self BotBuiltinAimOverride(); + + while ( time > 0 && isdefined( plane ) && isalive( plane ) && self getcurrentweapon() == weap && !self inLastStand() && !isdefined( self getthreat() ) ) + { + myeye = self geteye(); + + if ( bullettracepassed( myeye, plane.origin, false, plane ) ) + { + self thread bot_lookat( plane.origin, 0.3 ); + self BotBuiltinButtonOverride( "ads", "enable" ); + + if ( isdefined( self.stingerlockfinalized ) && self.stingerlockfinalized ) + { + self pressattackbutton(); + } + } + else + { + self BotBuiltinButtonOverride( "ads", "disable" ); + } + + time -= 0.05; + wait 0.05; + } +} + +/* + Bot attacks the plane +*/ +bot_plane_attack( plane ) +{ + weap = self getLockonAmmo(); + + if ( !isdefined( weap ) ) + { + return; + } + + self botStopMove( true ); + self.bot_attacking_plane = true; + + if ( self changeToWeapon( weap ) ) + { + self do_bot_plane_combat( plane, weap ); + + self notify( "bots_aim_overlap" ); + self BotBuiltinClearAimOverride(); + self BotBuiltinClearButtonOverride( "ads" ); + } + + self botStopMove( false ); + self.bot_attacking_plane = false; + self notify( "bot_force_check_switch" ); +} + +/* + Bots think to kill vehicles +*/ +bot_target_vehicle_loop() +{ + myTeam = self.pers[ "team" ]; + + airborne_enemies = getentarray( "script_vehicle", "classname" ); + target = undefined; + myEye = self geteye(); + rocketAmmo = self getRocketAmmo(); + + for ( i = 0; i < airborne_enemies.size; i++ ) + { + enemy = airborne_enemies[ i ]; + + if ( !isdefined( enemy ) ) + { + continue; + } + + if ( !isalive( enemy ) ) + { + continue; + } + + if ( level.teambased ) + { + if ( enemy.team == myTeam ) + { + continue; + } + } + + if ( enemy.owner == self ) + { + continue; + } + + if ( !isdefined( enemy.targetname ) || enemy.targetname != "rcbomb" ) + { + if ( !isdefined( rocketAmmo ) ) + { + continue; + } + } + + if ( !bullettracepassed( myEye, enemy.origin, false, enemy ) ) + { + continue; + } + + target = enemy; + break; + } + + airborne_enemies = undefined; + + if ( !isdefined( target ) ) + { + if ( isdefined( self getLockonAmmo() ) ) + { + for ( i = 0; i < level.bot_planes.size; i++ ) + { + enemy = level.bot_planes[ i ]; + + if ( !isdefined( enemy ) ) + { + continue; + } + + if ( !isalive( enemy ) ) + { + continue; + } + + if ( level.teambased ) + { + if ( enemy.team == myTeam ) + { + continue; + } + } + + if ( enemy.owner == self ) + { + continue; + } + + if ( !bullettracepassed( myEye, enemy.origin, false, enemy ) ) + { + continue; + } + + target = enemy; + break; + } + } + } + + if ( !isdefined( target ) ) + { + wait( randomintrange( 3, 5 ) ); + return; + } + + self BotNotifyBotEvent( "attack_vehicle", "start", target ); + + if ( isdefined( target.bot_plane ) ) + { + self bot_plane_attack( target ); + } + else + { + self setscriptenemy( target ); + self bot_vehicle_attack( target ); + self clearscriptenemy(); + } + + self BotNotifyBotEvent( "attack_vehicle", "stop", target ); +} + +/* + Bots think to kill vehicles +*/ +bot_target_vehicle() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon ( "game_ended" ); + + for ( ;; ) + { + wait( 1 ); + + if ( isdefined( self getthreat() ) || self isremotecontrolling() || self usebuttonpressed() || self BotIsFrozen() ) + { + continue; + } + + self bot_target_vehicle_loop(); + } +} + +/* + Bot uses their equipment +*/ +bot_use_equipment_think_loop() +{ + weapon = self.pers[ "bot" ][ "class_equipment" ]; + diff = self GetBotDiffNum(); + + if ( diff > 0 ) + { + if ( weapon == "camera_spike_mp" ) + { + if ( self getlookaheaddist() < 384 ) + { + return; + } + + view_angles = self getplayerangles(); + + if ( view_angles[ 0 ] < -5 ) + { + return; + } + } + else + { + if ( self getlookaheaddist() > 64 ) + { + return; + } + } + } + + dir = self getlookaheaddir(); + + if ( !isdefined( dir ) ) + { + return; + } + + dir = vectortoangles( dir ); + + if ( abs( dir[ 1 ] - self.angles[ 1 ] ) > 5 ) + { + return; + } + + dir = vectornormalize( anglestoforward( self.angles ) ); + dir = vector_scale( dir, 32 ); + goal = self.origin + dir; + + if ( randomint( 100 ) > 35 ) + { + return; + } + + grenades = getentarray( "grenade", "classname" ); + anyEquNear = false; + + for ( i = 0; i < grenades.size; i++ ) + { + item = grenades[ i ]; + + if ( !isdefined( item.name ) ) + { + continue; + } + + if ( !isweaponequipment( item.name ) ) + { + continue; + } + + if ( distancesquared( item.origin, goal ) < 128 * 128 ) + { + anyEquNear = true; + } + } + + grenades = undefined; + + if ( anyEquNear && diff > 0 ) + { + return; + } + + self BotNotifyBotEvent( "equ", "start", goal, weapon ); + + lastWeap = self getcurrentweapon(); + + self botStopMove( true ); + wait 1; + + if ( self changeToWeapon( weapon ) ) + { + if ( weapon == "satchel_charge_mp" ) + { + self thread fire_c4(); + } + else + { + self thread fire_current_weapon(); + } + + self waittill_any_timeout( 5, "grenade_fire", "weapon_change" ); + self notify( "stop_firing_weapon" ); + + self thread changeToWeapon( lastWeap ); + } + + self botStopMove( false ); +} + +/* + Bot uses their equipment +*/ +bot_use_equipment_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon ( "game_ended" ); + + if ( self.pers[ "bot" ][ "class_equipment" ] == "" || self.pers[ "bot" ][ "class_equipment" ] == "weapon_null_mp" ) + { + return; + } + + // decoys? + for ( ;; ) + { + wait( randomintrange( 1, 3 ) ); + + if ( !self hasweapon( self.pers[ "bot" ][ "class_equipment" ] ) ) + { + return; + } + + if ( self BotIsFrozen() ) + { + continue; + } + + if ( !self getammocount( self.pers[ "bot" ][ "class_equipment" ] ) ) + { + continue; + } + + if ( self isremotecontrolling() ) + { + continue; + } + + if ( isdefined( self getthreat() ) ) + { + continue; + } + + if ( self._is_sprinting ) + { + continue; + } + + self bot_use_equipment_think_loop(); + } +} + +/* + Bots go to the revive +*/ +bot_go_revive( revive ) +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 1; + + if ( !isdefined( revive ) ) + { + break; + } + + if ( !isdefined( revive.revivetrigger ) ) + { + break; + } + + if ( self istouching( revive.revivetrigger ) ) + { + break; + } + } + + if ( !isdefined( revive ) || !isdefined( revive.revivetrigger ) ) + { + self notify( "bad_path" ); + } + else + { + self notify( "goal" ); + } +} + +/* + Bots go revive +*/ +bot_revive_think_loop() +{ + reviveplayer = undefined; + + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[ i ]; + + if ( !isdefined( player.pers[ "team" ] ) ) + { + continue; + } + + if ( player == self ) + { + continue; + } + + if ( self.pers[ "team" ] != player.pers[ "team" ] ) + { + continue; + } + + if ( !isdefined( player.revivetrigger ) ) + { + continue; + } + + if ( isdefined( player.currentlybeingrevived ) && player.currentlybeingrevived ) + { + continue; + } + + if ( !isdefined( player.revivetrigger.bots ) ) + { + player.revivetrigger.bots = 0; + } + + if ( player.revivetrigger.bots > 2 ) + { + continue; + } + + reviveplayer = player; + } + + if ( !isdefined( reviveplayer ) ) + { + return; + } + + self BotNotifyBotEvent( "revive", "go", reviveplayer ); + + self.bot_lock_goal = true; + + self SetBotGoal( reviveplayer.origin, 1 ); + self thread bot_inc_bots( reviveplayer.revivetrigger, true ); + self thread bot_go_revive( reviveplayer ); + + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" || !isdefined( reviveplayer ) || ( isdefined( reviveplayer.currentlybeingrevived ) && reviveplayer.currentlybeingrevived ) || !self istouching( reviveplayer.revivetrigger ) || self inLastStand() ) + { + self.bot_lock_goal = false; + return; + } + + self BotNotifyBotEvent( "revive", "start", reviveplayer ); + + self SetBotGoal( self.origin, 64 ); + self bot_wait_stop_move(); + + reviveTime = getdvarint( #"revive_time_taken" ); + self thread BotPressUse( reviveTime + 1 ); + wait( reviveTime + 1.5 ); + + self ClearBotGoal(); + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "revive", "stop", reviveplayer ); +} + +/* + Bots go revive +*/ +bot_revive_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( !level.teambased ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 3, 5 ) ); + + if ( self hasscriptgoal() || self.bot_lock_goal ) + { + continue; + } + + if ( self isDefusing() || self isPlanting() ) + { + continue; + } + + if ( self inLastStand() ) + { + continue; + } + + if ( self isremotecontrolling() ) + { + continue; + } + + if ( self usebuttonpressed() || self BotIsFrozen() ) + { + continue; + } + + self bot_revive_think_loop(); + } +} + +/* + Bot attacks dog +*/ +bot_dog_attack( dog ) +{ + dog endon( "death" ); + + wait_time = randomintrange( 7, 10 ); + + for ( i = 0; i < wait_time; i++ ) + { + wait( 1 ); + + if ( !isdefined( dog ) ) + { + return; + } + + if ( !isalive( dog ) ) + { + return; + } + + if ( !bullettracepassed( self.origin, dog.origin, false, dog ) ) + { + return; + } + } +} + +/* + Bot thinks to attack dogs +*/ +bot_dogs_think_loop() +{ + myTeam = self.pers[ "team" ]; + + for ( i = 0; i < level.dogs.size; i++ ) + { + dog = level.dogs[ i ]; + + if ( !isdefined( dog ) ) + { + continue; + } + + if ( !isalive( dog ) ) + { + continue; + } + + if ( level.teambased ) + { + if ( dog.aiteam == myTeam ) + { + continue; + } + } + + if ( isdefined( dog.script_owner ) && dog.script_owner == self ) + { + continue; + } + + if ( distancesquared( self.origin, dog.origin ) < 1024 * 1024 ) + { + if ( !bullettracepassed( self.origin, dog.origin, false, dog ) ) + { + continue; + } + + self BotNotifyBotEvent( "attack_dog", "start", dog ); + + self setscriptenemy( dog ); + self bot_dog_attack( dog ); + self clearscriptenemy(); + + self BotNotifyBotEvent( "attack_dog", "stop", dog ); + break; + } + } +} + +/* + Bot thinks to attack dogs +*/ +bot_dogs_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon ( "game_ended" ); + + if ( level.no_dogs ) + { + return; + } + + for ( ;; ) + { + wait( 0.25 ); + + if ( !isdefined( level.dogs ) || level.dogs.size <= 0 ) + { + level waittill( "called_in_the_dogs" ); + } + + if ( isdefined( self getthreat() ) ) + { + continue; + } + + self bot_dogs_think_loop(); + } +} + +/* + Clears goal when events death +*/ +stop_go_target_on_death( tar ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "new_goal" ); + self endon( "bad_path" ); + self endon( "goal" ); + + tar waittill_either( "death", "disconnect" ); + + self ClearBotGoal(); +} + +/* + Goes to the target's location if it had one +*/ +follow_target_loop() +{ + threat = self getthreat(); + + if ( !isdefined( threat ) ) + { + return; + } + + if ( !isplayer( threat ) ) + { + return; + } + + if ( randomint( 100 ) > 50 ) + { + return; + } + + self BotNotifyBotEvent( "follow_threat", "start", threat ); + + self SetBotGoal( threat.origin, 64 ); + self thread stop_go_target_on_death( threat ); + + if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self BotNotifyBotEvent( "follow_threat", "stop", threat ); +} + +/* + Goes to the target's location if it had one +*/ +follow_target() +{ + self endon( "death" ); + self endon( "disconnect" ); + + for ( ;; ) + { + wait 1; + + if ( self hasscriptgoal() || self.bot_lock_goal ) + { + continue; + } + + self follow_target_loop(); + } +} + +/* + Bots play mw2 +*/ +bot_watch_think_mw2_loop() +{ + tube = self getValidTube(); + + if ( !isdefined( tube ) ) + { + if ( self getammocount( "m72_law_mp" ) ) + { + tube = "m72_law_mp"; + } + else if ( self getammocount( "rpg_mp" ) ) + { + tube = "rpg_mp"; + } + else + { + return; + } + } + + if ( self getcurrentweapon() == tube ) + { + return; + } + + if ( randomint( 100 ) > 35 ) + { + return; + } + + self thread changeToWeapon( tube ); +} + +/* + Bots play mw2 +*/ +bot_watch_think_mw2() +{ + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); + + for ( ;; ) + { + wait randomintrange( 1, 4 ); + + if ( self BotIsFrozen() ) + { + continue; + } + + if ( self isDefusing() || self isPlanting() ) + { + continue; + } + + if ( self isremotecontrolling() ) + { + continue; + } + + if ( self inLastStand() ) + { + continue; + } + + if ( isdefined( self getthreat() ) ) + { + continue; + } + + self bot_watch_think_mw2_loop(); + } +} + +/* + Bots will think to switch weapons +*/ +bot_weapon_think_loop( data ) +{ + ret = self waittill_any_timeout( randomintrange( 2, 4 ), "bot_force_check_switch" ); + + if ( self BotIsFrozen() ) + { + return; + } + + if ( self isDefusing() || self isPlanting() ) + { + return; + } + + if ( self isremotecontrolling() ) + { + return; + } + + if ( self inLastStand() ) + { + return; + } + + curWeap = self getcurrentweapon(); + threat = self getthreat(); + + if ( self.bot_attacking_plane || ( isdefined( threat ) && !isplayer( threat ) && !isai( threat ) && ( !isdefined( threat.targetname ) || threat.targetname != "rcbomb" ) ) ) + { + rocketAmmo = self getRocketAmmo(); + + if ( isdefined( rocketAmmo ) ) + { + if ( curWeap != rocketAmmo ) + { + self thread changeToWeapon( rocketAmmo ); + } + + return; + } + } + + force = ( ret == "bot_force_check_switch" ); + + if ( data.first ) + { + data.first = false; + + if ( randomint( 100 ) > 10 ) + { + return; + } + } + else + { + if ( curWeap != "none" && self getammocount( curWeap ) && curWeap != "strela_mp" ) + { + if ( randomint( 100 ) > 2 ) + { + return; + } + + if ( isdefined( threat ) ) + { + return; + } + } + else + { + force = true; + } + } + + weaponslist = self getweaponslistall(); + weap = ""; + + while ( weaponslist.size ) + { + weapon = weaponslist[ randomint( weaponslist.size ) ]; + weaponslist = array_remove( weaponslist, weapon ); + + if ( !self getammocount( weapon ) && !force ) + { + continue; + } + + if ( !maps\mp\gametypes\_weapons::isprimaryweapon( weapon ) && !maps\mp\gametypes\_weapons::issidearm( weapon ) && !isWeaponAltmode( weapon ) ) + { + continue; + } + + if ( curWeap == weapon || weapon == "none" || weapon == "" || weapon == "strela_mp" ) + { + continue; + } + + weap = weapon; + break; + } + + if ( weap == "" ) + { + return; + } + + self thread changeToWeapon( weap ); +} + +/* + Bots will think to switch 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 ); + } +} + +/* + Bots pay attention to the uav +*/ +bot_uav_think_loop( data ) +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + diff = self GetBotDiffNum(); + + hasCam = isdefined( self.cameraspike ); + + if ( self.bot_scrambled && !hasCam ) + { + return; + } + + players = get_players(); + + hasUAV = false; + hasSR = false; + + // check for counter spyplane + if ( level.teambased ) + { + if ( level.activecounteruavs[ otherTeam ] && !hasCam ) + { + return; + } + + hasSR = level.activesatellites[ myTeam ]; + hasUAV = level.activeuavs[ myTeam ]; + } + else + { + shouldContinue = false; + + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + + if ( player == self ) + { + continue; + } + + if ( !isdefined( player.team ) ) + { + continue; + } + + if ( isdefined( level.activecounteruavs[ player.entnum ] ) && level.activecounteruavs[ player.entnum ] ) + { + continue; + } + + shouldContinue = true; + break; + } + + if ( shouldContinue && !hasCam ) + { + return; + } + + hasSR = level.activesatellites[ self.entnum ]; + hasUAV = level.activeuavs[ self.entnum ]; + } + + if ( level.hardcoremode && !hasUAV && !hasSR && !hasCam ) + { + return; + } + + dist = getdvarint( #"scr_help_dist" ); + dist = dist * dist * 8; + + // decoys + if ( !data.wasfooled && level.bot_decoys.size && !hasCam && !self hasscriptgoal() && !self.bot_lock_goal ) + { + shouldContinue = false; + + for ( i = 0; i < level.bot_decoys.size; i++ ) + { + g = level.bot_decoys[ i ]; + + if ( isdefined( g.owner ) && g.owner == self ) + { + continue; + } + + if ( level.teambased && g.team == myTeam ) + { + continue; + } + + if ( distancesquared( self.origin, g.origin ) > dist ) + { + continue; + } + + if ( lengthsquared( g getvelocity() ) > 10000 ) + { + continue; + } + + if ( diff > 0 ) + { + data.wasfooled = true; + } + + self SetBotGoal( g.origin, 128 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + shouldContinue = true; + break; + } + + if ( shouldContinue ) + { + return; + } + } + + if ( diff <= 0 ) + { + return; + } + + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + + if ( player == self ) + { + continue; + } + + if ( !isdefined( player.team ) ) + { + continue; + } + + if ( player.sessionstate != "playing" ) + { + continue; + } + + if ( level.teambased && player.team == myTeam ) + { + continue; + } + + if ( !isalive( player ) ) + { + continue; + } + + distFromPlayer = distancesquared( self.origin, player.origin ); + + if ( distFromPlayer > dist ) + { + continue; + } + + if ( hasCam ) + { + if ( !self.cameraspike maps\mp\gametypes\_weaponobjects::isstunned() && !self hasscriptgoal() && !self.bot_lock_goal && !player hasperk( "specialty_nottargetedbyai" ) ) + { + if ( vectordot( vectornormalize( anglestoforward( self.cameraspike.camerahead.angles ) ), vectornormalize( player.origin - self.cameraspike.origin ) ) >= 0.342 && sighttracepassed( player.origin + ( 0, 0, 5 ), self.cameraspike.origin + ( 0, 0, 5 ), false, self.cameraspike ) ) // cos 70 degrees + { + self BotNotifyBotEvent( "cam_target", "start", player ); + + self SetBotGoal( player.origin, 128 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self BotNotifyBotEvent( "cam_target", "stop", player ); + break; + } + } + } + else if ( hasSR || ( !issubstr( player getcurrentweapon(), "_silencer_" ) && player.bot_firing ) || ( hasUAV && !player hasperk( "specialty_gpsjammer" ) ) || ( isdefined( self.acousticsensor ) && !self.acousticsensor maps\mp\gametypes\_weaponobjects::isstunned() && !player hasperk( "specialty_nomotionsensor" ) && distance2d( self.acousticsensor.origin, player.origin ) < 666 ) ) + { + self BotNotifyBotEvent( "uav_target", "start", player ); + + distSq = getdvarint( #"scr_help_dist" ); + distSq *= distSq; + + if ( distFromPlayer < distSq && bullettracepassed( self geteye(), player gettagorigin( "j_spineupper" ), false, player ) ) + { + self setattacker( player ); + } + + if ( !self hasscriptgoal() && !self.bot_lock_goal ) + { + self SetBotGoal( player.origin, 128 ); + self thread stop_go_target_on_death( player ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self BotNotifyBotEvent( "uav_target", "stop", player ); + } + + break; + } + } +} + +/* + Bots pay attention to the uav +*/ +bot_uav_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + data = spawnstruct(); + data.wasfooled = false; + + for ( ;; ) + { + wait 0.75; + + if ( self isremotecontrolling() ) + { + continue; + } + + self bot_uav_think_loop( data ); + } +} + +/* + bots will go to their target's kill location +*/ +bot_revenge_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + + if ( self GetBotDiffNum() <= 0 ) + { + return; + } + + if ( isdefined( self.lastkiller ) && isalive( self.lastkiller ) ) + { + if ( bullettracepassed( self geteye(), self.lastkiller gettagorigin( "j_spineupper" ), false, self.lastkiller ) ) + { + self setattacker( self.lastkiller ); + } + } + + if ( !isdefined( self.killerlocation ) ) + { + return; + } + + loc = self.killerlocation; + + for ( ;; ) + { + wait( randomintrange( 1, 5 ) ); + + if ( self hasscriptgoal() || self.bot_lock_goal ) + { + return; + } + + if ( randomint( 100 ) < 75 ) + { + return; + } + + self BotNotifyBotEvent( "revenge", "start", loc, self.lastkiller ); + + self SetBotGoal( loc, 64 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self BotNotifyBotEvent( "revenge", "stop", loc, self.lastkiller ); + } +} + +/* + Bots will listen to foot steps and target nearby targets +*/ +bot_listen_to_steps_loop() +{ + dist = 100; + + if ( self hasperk( "specialty_loudenemies" ) ) + { + dist *= 1.4; + } + + dist *= dist; + + heard = undefined; + + for ( i = level.players.size - 1 ; i >= 0; i-- ) + { + player = level.players[ i ]; + + if ( player == self ) + { + continue; + } + + if ( !isdefined( player.team ) ) + { + continue; + } + + if ( level.teambased && self.team == player.team ) + { + continue; + } + + if ( player.sessionstate != "playing" ) + { + continue; + } + + if ( !isalive( player ) ) + { + continue; + } + + if ( lengthsquared( player getvelocity() ) < 20000 ) + { + continue; + } + + if ( distancesquared( player.origin, self.origin ) > dist ) + { + continue; + } + + if ( player hasperk( "specialty_quieter" ) ) + { + continue; + } + + heard = player; + break; + } + + if ( !isdefined( heard ) ) + { + return; + } + + self BotNotifyBotEvent( "heard_target", "start", heard ); + + if ( bullettracepassed( self geteye(), heard gettagorigin( "j_spineupper" ), false, heard ) ) + { + self setattacker( heard ); + return; + } + + if ( self hasscriptgoal() || self.bot_lock_goal ) + { + return; + } + + self SetBotGoal( heard.origin, 64 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self BotNotifyBotEvent( "heard_target", "stop", heard ); +} + +/* + Bots will listen to foot steps and target nearby targets +*/ +bot_listen_to_steps() +{ + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) + { + wait 1; + + if ( self GetBotDiffNum() <= 0 ) + { + continue; + } + + self bot_listen_to_steps_loop(); + } +} + +/* + Presses the buttons on radiation +*/ +bot_radiation_think_loop() +{ + origins = []; + origins[ 0 ] = ( 813, 5, 267 ); + origins[ 1 ] = ( -811, 30, 363 ); + + origin = random( origins ); + + if ( distancesquared( self.origin, origin ) < 512 * 512 ) + { + self SetBotGoal( origin, 32 ); + + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" ) + { + return; + } + + self botStopMove( true ); + self bot_wait_stop_move(); + + self thread BotPressUse( 3 ); + wait( 3 ); + + self botStopMove( false ); + } + + wait( randomintrange( 5, 10 ) ); +} + +/* + Presses the buttons on radiation +*/ +bot_radiation_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon ( "game_ended" ); + + if ( level.script != "mp_radiation" ) + { + return; + } + + if ( level.wagermatch ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 8, 15 ) ); + + if ( self hasscriptgoal() || self BotIsFrozen() ) + { + continue; + } + + if ( self isremotecontrolling() || self.bot_lock_goal ) + { + continue; + } + + if ( self usebuttonpressed() ) + { + continue; + } + + self bot_radiation_think_loop(); + } +} + +/* + Bots hang around the enemy's flag to spawn kill em +*/ +bot_dom_spawn_kill_think_loop() +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + myFlagCount = maps\mp\gametypes\dom::getteamflagcount( myTeam ); + + if ( myFlagCount == level.flags.size ) + { + return; + } + + otherFlagCount = maps\mp\gametypes\dom::getteamflagcount( otherTeam ); + + if ( myFlagCount <= otherFlagCount || otherFlagCount != 1 ) + { + return; + } + + flag = undefined; + + for ( i = 0; i < level.flags.size; i++ ) + { + if ( level.flags[ i ] maps\mp\gametypes\dom::getflagteam() == myTeam ) + { + continue; + } + + flag = level.flags[ i ]; + } + + if ( !isdefined( flag ) ) + { + return; + } + + if ( distancesquared( self.origin, flag.origin ) < 2048 * 2048 ) + { + return; + } + + self BotNotifyBotEvent( "dom", "start", "spawnkill", flag ); + + self SetBotGoal( flag.origin, 1024 ); + + self thread bot_dom_watch_flags( myFlagCount, myTeam ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self BotNotifyBotEvent( "dom", "stop", "spawnkill", flag ); +} + +/* + Bots hang around the enemy's flag to spawn kill em +*/ +bot_dom_spawn_kill_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + + if ( level.gametype != "dom" ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 10, 20 ) ); + + if ( randomint( 100 ) < 20 ) + { + continue; + } + + if ( self hasscriptgoal() || self.bot_lock_goal ) + { + continue; + } + + if ( !isdefined( level.flags ) || level.flags.size == 0 ) + { + continue; + } + + self bot_dom_spawn_kill_think_loop(); + } +} + +/* + Calls 'bad_path' when the flag count changes +*/ +bot_dom_watch_flags( count, myTeam ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 0.5; + + if ( maps\mp\gametypes\dom::getteamflagcount( myTeam ) != count ) + { + break; + } + } + + self notify( "bad_path" ); +} + +/* + Bots watches their own flags and protects them when they are under capture +*/ +bot_dom_def_think_loop() +{ + myTeam = self.pers[ "team" ]; + flag = undefined; + + for ( i = 0; i < level.flags.size; i++ ) + { + if ( level.flags[ i ] maps\mp\gametypes\dom::getflagteam() != myTeam ) + { + continue; + } + + if ( !level.flags[ i ].useobj.objpoints[ myTeam ].isflashing ) + { + continue; + } + + if ( !isdefined( flag ) || distancesquared( self.origin, level.flags[ i ].origin ) < distancesquared( self.origin, flag.origin ) ) + { + flag = level.flags[ i ]; + } + } + + if ( !isdefined( flag ) ) + { + return; + } + + self BotNotifyBotEvent( "dom", "start", "defend", flag ); + + self SetBotGoal( flag.origin, 128 ); + + self thread bot_dom_watch_for_flashing( flag, myTeam ); + self thread bots_watch_touch_obj( flag ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self BotNotifyBotEvent( "dom", "stop", "defend", flag ); +} + +/* + Bots watches their own flags and protects them when they are under capture +*/ +bot_dom_def_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + + if ( level.gametype != "dom" ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 1, 3 ) ); + + if ( randomint( 100 ) < 35 ) + { + continue; + } + + if ( self hasscriptgoal() || self.bot_lock_goal ) + { + continue; + } + + if ( !isdefined( level.flags ) || level.flags.size == 0 ) + { + continue; + } + + self bot_dom_def_think_loop(); + } +} + +/* + Watches while the flag is under capture +*/ +bot_dom_watch_for_flashing( flag, myTeam ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 0.5; + + if ( !isdefined( flag ) ) + { + break; + } + + if ( flag maps\mp\gametypes\dom::getflagteam() != myTeam || !flag.useobj.objpoints[ myTeam ].isflashing ) + { + break; + } + } + + self notify( "bad_path" ); +} + +/* + Bots capture dom flags +*/ +bot_dom_cap_think_loop() +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + + myFlagCount = maps\mp\gametypes\dom::getteamflagcount( myTeam ); + + if ( myFlagCount == level.flags.size ) + { + return; + } + + otherFlagCount = maps\mp\gametypes\dom::getteamflagcount( otherTeam ); + + if ( game[ "teamScores" ][ myTeam ] >= game[ "teamScores" ][ otherTeam ] ) + { + if ( myFlagCount < otherFlagCount ) + { + if ( randomint( 100 ) < 15 ) + { + return; + } + } + else if ( myFlagCount == otherFlagCount ) + { + if ( randomint( 100 ) < 35 ) + { + return; + } + } + else if ( myFlagCount > otherFlagCount ) + { + if ( randomint( 100 ) < 95 ) + { + return; + } + } + } + + flag = undefined; + flags = []; + + for ( i = 0; i < level.flags.size; i++ ) + { + if ( level.flags[ i ] maps\mp\gametypes\dom::getflagteam() == myTeam ) + { + continue; + } + + flags[ flags.size ] = level.flags[ i ]; + } + + if ( randomint( 100 ) > 30 ) + { + for ( i = 0; i < flags.size; i++ ) + { + if ( !isdefined( flag ) || distancesquared( self.origin, level.flags[ i ].origin ) < distancesquared( self.origin, flag.origin ) ) + { + flag = level.flags[ i ]; + } + } + } + else if ( flags.size ) + { + flag = PickRandom( flags ); + } + + if ( !isdefined( flag ) ) + { + return; + } + + self BotNotifyBotEvent( "dom", "go", "cap", flag ); + + self.bot_lock_goal = true; + self SetBotGoal( flag.origin, 64 ); + + self thread bot_dom_go_cap_flag( flag, myTeam ); + + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" ) + { + self.bot_lock_goal = false; + return; + } + + self BotNotifyBotEvent( "dom", "start", "cap", flag ); + + self SetBotGoal( self.origin, 64 ); + + while ( flag maps\mp\gametypes\dom::getflagteam() != myTeam && self istouching( flag ) ) + { + cur = flag.useobj.curprogress; + wait 0.5; + + if ( flag.useobj.curprogress == cur ) + { + break; // some enemy is near us, kill him + } + + self thread bot_do_random_action_for_objective( flag ); + } + + self BotNotifyBotEvent( "dom", "stop", "cap", flag ); + + self ClearBotGoal(); + + self.bot_lock_goal = false; +} + +/* + Bots capture dom flags +*/ +bot_dom_cap_think() +{ + self endon( "death" ); + self endon( "disconnect" ); + + if ( level.gametype != "dom" ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 3, 12 ) ); + + if ( self.bot_lock_goal ) + { + continue; + } + + if ( !isdefined( level.flags ) || level.flags.size == 0 ) + { + continue; + } + + self bot_dom_cap_think_loop(); + } +} + +/* + Bot goes to the flag, watching while they don't have the flag +*/ +bot_dom_go_cap_flag( flag, myTeam ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait randomintrange( 2, 4 ); + + if ( !isdefined( flag ) ) + { + break; + } + + if ( flag maps\mp\gametypes\dom::getflagteam() == myTeam ) + { + break; + } + + if ( self istouching( flag ) ) + { + break; + } + } + + if ( flag maps\mp\gametypes\dom::getflagteam() == myTeam ) + { + self notify( "bad_path" ); + } + else + { + self notify( "goal" ); + } +} + +/* + Bots play headquarters +*/ +bot_hq_loop() +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + + radio = level.radio; + gameobj = radio.gameobject; + origin = ( radio.origin[ 0 ], radio.origin[ 1 ], radio.origin[ 2 ] + 5 ); + + // if neut or enemy + if ( gameobj.ownerteam != myTeam ) + { + if ( gameobj.interactteam == "none" ) // wait for it to become active + { + if ( self hasscriptgoal() ) + { + return; + } + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + // capture it + + self BotNotifyBotEvent( "hq", "go", "cap" ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 64 ); + self thread bot_hq_go_cap( gameobj, radio ); + + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" ) + { + self.bot_lock_goal = false; + return; + } + + if ( !self istouching( gameobj.trigger ) || level.radio != radio ) + { + self.bot_lock_goal = false; + return; + } + + self BotNotifyBotEvent( "hq", "start", "cap" ); + + self SetBotGoal( self.origin, 64 ); + + while ( self istouching( gameobj.trigger ) && gameobj.ownerteam != myTeam && level.radio == radio ) + { + cur = gameobj.curprogress; + wait 0.5; + + if ( cur == gameobj.curprogress ) + { + break; // no prog made, enemy must be capping + } + + self thread bot_do_random_action_for_objective( gameobj.trigger ); + } + + self ClearBotGoal(); + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "hq", "stop", "cap" ); + } + else // we own it + { + if ( gameobj.objpoints[ myTeam ].isflashing ) // underattack + { + self BotNotifyBotEvent( "hq", "start", "defend" ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 64 ); + self thread bot_hq_watch_flashing( gameobj, radio ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "hq", "stop", "defend" ); + return; + } + + if ( self hasscriptgoal() ) + { + return; + } + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + } +} + +/* + Bots play headquarters +*/ +bot_hq() +{ + self endon( "death" ); + self endon( "disconnect" ); + + if ( level.gametype != "koth" ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 3, 5 ) ); + + if ( self.bot_lock_goal ) + { + continue; + } + + if ( !isdefined( level.radio ) ) + { + continue; + } + + if ( !isdefined( level.radio.gameobject ) ) + { + continue; + } + + self bot_hq_loop(); + } +} + +/* + Waits until not touching the trigger and it is the current radio. +*/ +bot_hq_go_cap( obj, radio ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait randomintrange( 2, 4 ); + + if ( !isdefined( obj ) ) + { + break; + } + + if ( self istouching( obj.trigger ) ) + { + break; + } + + if ( level.radio != radio ) + { + break; + } + } + + if ( level.radio != radio ) + { + self notify( "bad_path" ); + } + else + { + self notify( "goal" ); + } +} + +/* + Waits while the radio is under attack. +*/ +bot_hq_watch_flashing( obj, radio ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + myTeam = self.team; + + for ( ;; ) + { + wait 0.5; + + if ( !isdefined( obj ) ) + { + break; + } + + if ( !obj.objpoints[ myTeam ].isflashing ) + { + break; + } + + if ( level.radio != radio ) + { + break; + } + } + + self notify( "bad_path" ); +} + +/* + Bots play sab +*/ +bot_sab_loop() +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + + bomb = level.sabbomb; + bombteam = bomb.ownerteam; + carrier = bomb.carrier; + timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; + + // the bomb is ours, we are on the offence + if ( bombteam == myTeam ) + { + site = level.bombzones[ otherTeam ]; + origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); + + // protect our planted bomb + if ( level.bombplanted ) + { + // kill defuser + if ( site isInUse() ) // somebody is defusing our bomb we planted + { + self BotNotifyBotEvent( "sab", "start", "defuser" ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 64 ); + + self thread bot_defend_site( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "sab", "stop", "defuser" ); + return; + } + + // else hang around the site + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self.bot_lock_goal = true; + self SetBotGoal( origin, 256 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + return; + } + + // we are not the carrier + if ( !self isBombCarrier() ) + { + // lets escort the bomb carrier + if ( self hasscriptgoal() ) + { + return; + } + + origin = carrier.origin; + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + self thread bot_escort_obj( bomb, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + // we are the carrier of the bomb, lets check if we need to plant + timepassed = maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000; + + if ( timepassed < 120 && timeleft >= 90 && randomint( 100 ) < 98 ) + { + return; + } + + self BotNotifyBotEvent( "sab", "go", "plant" ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 1 ); + + self thread bot_go_plant( site ); + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" || level.bombplanted || !self istouching( site.trigger ) || site isInUse() || self inLastStand() || isdefined( self getthreat() ) ) + { + self.bot_lock_goal = false; + return; + } + + self BotNotifyBotEvent( "sab", "start", "plant" ); + + self BotRandomStance(); + self SetBotGoal( self.origin, 64 ); + self bot_wait_stop_move(); + + waitTime = ( site.usetime / 1000 ) + 2.5; + self thread BotPressUse( waitTime ); + wait waitTime; + + self ClearBotGoal(); + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "sab", "stop", "plant" ); + } + else if ( bombteam == otherTeam ) // the bomb is theirs, we are on the defense + { + site = level.bombzones[ myTeam ]; + + if ( !isdefined( site.bots ) ) + { + site.bots = 0; + } + + // protect our site from planters + if ( !level.bombplanted ) + { + // kill bomb carrier + if ( site.bots > 2 || randomint( 100 ) < 45 ) + { + if ( self hasscriptgoal() ) + { + return; + } + + if ( carrier hasperk( "specialty_gpsjammer" ) ) + { + return; + } + + origin = carrier.origin; + + self SetBotGoal( origin, 64 ); + self thread bot_escort_obj( bomb, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + // protect bomb site + origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); + + self thread bot_inc_bots( site ); + + if ( site isInUse() ) // somebody is planting + { + self BotNotifyBotEvent( "sab", "start", "planter" ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 64 ); + self thread bot_inc_bots( site ); + + self thread bot_defend_site( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + self BotNotifyBotEvent( "sab", "stop", "planter" ); + return; + } + + // else hang around the site + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + wait 4; + self notify( "bot_inc_bots" ); + site.bots--; + return; + } + + self.bot_lock_goal = true; + self SetBotGoal( origin, 256 ); + self thread bot_inc_bots( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + return; + } + + // bomb is planted we need to defuse + origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); + + // someone else is defusing, lets just hang around + if ( site.bots > 1 ) + { + if ( self hasscriptgoal() ) + { + return; + } + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + self thread bot_go_defuse( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + // lets go defuse + self BotNotifyBotEvent( "sab", "go", "defuse" ); + + self.bot_lock_goal = true; + + self SetBotGoal( origin, 1 ); + self thread bot_inc_bots( site ); + self thread bot_go_defuse( site ); + + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" || !level.bombplanted || site isInUse() || !self istouching( site.trigger ) || self inLastStand() || isdefined( self getthreat() ) ) + { + self.bot_lock_goal = false; + return; + } + + self BotNotifyBotEvent( "sab", "start", "defuse" ); + + self BotRandomStance(); + self SetBotGoal( self.origin, 64 ); + self bot_wait_stop_move(); + + waitTime = ( site.usetime / 1000 ) + 2.5; + self thread BotPressUse( waitTime ); + wait waitTime; + + self ClearBotGoal(); + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "sab", "stop", "defuse" ); + } + else // we need to go get the bomb! + { + origin = ( bomb.curorigin[ 0 ], bomb.curorigin[ 1 ], bomb.curorigin[ 2 ] + 32 ); + + self BotNotifyBotEvent( "sab", "start", "bomb" ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 64 ); + + self thread bot_get_obj( bomb ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + self BotNotifyBotEvent( "sab", "stop", "bomb" ); + return; + } +} + +/* + Bots play sab +*/ +bot_sab() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( level.gametype != "sab" ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 3, 5 ) ); + + if ( self isremotecontrolling() || self.bot_lock_goal ) + { + continue; + } + + if ( !isdefined( level.sabbomb ) ) + { + continue; + } + + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) + { + continue; + } + + if ( self isPlanting() || self isDefusing() ) + { + continue; + } + + self bot_sab_loop(); + } +} + +/* + Bots play sd defenders +*/ +bot_sd_defenders_loop( data ) +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + + // bomb not planted, lets protect our sites + if ( !level.bombplanted ) + { + timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; + + if ( timeleft >= 90 ) + { + return; + } + + // check for a bomb carrier, and camp the bomb + if ( !level.multibomb && isdefined( level.sdbomb ) ) + { + bomb = level.sdbomb; + carrier = level.sdbomb.carrier; + + if ( !isdefined( carrier ) ) + { + origin = ( bomb.curorigin[ 0 ], bomb.curorigin[ 1 ], bomb.curorigin[ 2 ] + 32 ); + + // hang around the bomb + if ( self hasscriptgoal() ) + { + return; + } + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + + self thread bot_get_obj( bomb ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + } + + // pick a site to protect + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) + { + return; + } + + sites = []; + + for ( i = 0; i < level.bombzones.size; i++ ) + { + sites[ sites.size ] = level.bombzones[ i ]; + } + + if ( !sites.size ) + { + return; + } + + if ( data.rand > 50 ) + { + site = self bot_array_nearest_curorigin( sites ); + } + else + { + site = PickRandom( sites ); + } + + if ( !isdefined( site ) ) + { + return; + } + + origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); + + if ( site isInUse() ) // somebody is planting + { + self BotNotifyBotEvent( "sd", "start", "planter", site ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 64 ); + + self thread bot_defend_site( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "sd", "stop", "planter", site ); + return; + } + + // else hang around the site + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self.bot_lock_goal = true; + self SetBotGoal( origin, 256 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + return; + } + + // bomb is planted, we need to defuse + if ( !isdefined( level.defuseobject ) ) + { + return; + } + + defuse = level.defuseobject; + + if ( !isdefined( defuse.bots ) ) + { + defuse.bots = 0; + } + + origin = ( defuse.curorigin[ 0 ], defuse.curorigin[ 1 ], defuse.curorigin[ 2 ] + 32 ); + + // someone is going to go defuse ,lets just hang around + if ( defuse.bots > 1 ) + { + if ( self hasscriptgoal() ) + { + return; + } + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + self thread bot_go_defuse( defuse ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + // lets defuse + self BotNotifyBotEvent( "sd", "go", "defuse" ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 1 ); + self thread bot_inc_bots( defuse ); + self thread bot_go_defuse( defuse ); + + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" || !level.bombplanted || defuse isInUse() || !self istouching( defuse.trigger ) || self inLastStand() || isdefined( self getthreat() ) ) + { + self.bot_lock_goal = false; + return; + } + + self BotNotifyBotEvent( "sd", "start", "defuse" ); + + self BotRandomStance(); + self SetBotGoal( self.origin, 64 ); + self bot_wait_stop_move(); + + waitTime = ( defuse.usetime / 1000 ) + 2.5; + self thread BotPressUse( waitTime ); + wait waitTime; + + self ClearBotGoal(); + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "sd", "stop", "defuse" ); +} + +/* + Bots play sd defenders +*/ +bot_sd_defenders() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( level.gametype != "sd" ) + { + return; + } + + if ( self.team == game[ "attackers" ] ) + { + return; + } + + data = spawnstruct(); + data.rand = randomint( 100 ); + + for ( ;; ) + { + wait( randomintrange( 3, 5 ) ); + + if ( self isremotecontrolling() || self.bot_lock_goal ) + { + continue; + } + + if ( self isPlanting() || self isDefusing() ) + { + continue; + } + + self bot_sd_defenders_loop( data ); + } +} + +/* + Bots play sd attackers +*/ +bot_sd_attackers_loop( data ) +{ + if ( data.first ) + { + data.first = false; + } + else + { + wait( randomintrange( 3, 5 ) ); + } + + if ( self isremotecontrolling() || self.bot_lock_goal ) + { + return; + } + + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + + // bomb planted + if ( level.bombplanted ) + { + if ( !isdefined( level.defuseobject ) ) + { + return; + } + + site = level.defuseobject; + + origin = ( site.curorigin[ 0 ], site.curorigin[ 1 ], site.curorigin[ 2 ] + 32 ); + + if ( site isInUse() ) // somebody is defusing + { + self BotNotifyBotEvent( "sd", "start", "defuser" ); + + self.bot_lock_goal = true; + + self SetBotGoal( origin, 64 ); + + self thread bot_defend_site( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "sd", "stop", "defuser" ); + return; + } + + // else hang around the site + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self.bot_lock_goal = true; + self SetBotGoal( origin, 256 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + return; + } + + timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; + timepassed = maps\mp\gametypes\_globallogic_utils::gettimepassed() / 1000; + + // dont have a bomb + if ( !self isBombCarrier() && !level.multibomb ) + { + if ( !isdefined( level.sdbomb ) ) + { + return; + } + + bomb = level.sdbomb; + carrier = level.sdbomb.carrier; + + // bomb is picked up + if ( isdefined( carrier ) ) + { + // escort the bomb carrier + if ( self hasscriptgoal() ) + { + return; + } + + origin = carrier.origin; + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + self thread bot_escort_obj( bomb, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + if ( !isdefined( bomb.bots ) ) + { + bomb.bots = 0; + } + + origin = ( bomb.curorigin[ 0 ], bomb.curorigin[ 1 ], bomb.curorigin[ 2 ] + 32 ); + + // hang around the bomb if other is going to go get it + if ( bomb.bots > 1 ) + { + if ( self hasscriptgoal() ) + { + return; + } + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + + self thread bot_get_obj( bomb ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + // go get the bomb + self BotNotifyBotEvent( "sd", "start", "bomb" ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 64 ); + self thread bot_inc_bots( bomb ); + self thread bot_get_obj( bomb ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "sd", "stop", "bomb" ); + return; + } + + // check if to plant + if ( timepassed < 120 && timeleft >= 90 && randomint( 100 ) < 98 ) + { + return; + } + + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) + { + return; + } + + sites = []; + + for ( i = 0; i < level.bombzones.size; i++ ) + { + sites[ sites.size ] = level.bombzones[ i ]; + } + + if ( !sites.size ) + { + return; + } + + if ( data.rand > 50 ) + { + plant = self bot_array_nearest_curorigin( sites ); + } + else + { + plant = PickRandom( sites ); + } + + if ( !isdefined( plant ) ) + { + return; + } + + origin = ( plant.curorigin[ 0 ] + 50, plant.curorigin[ 1 ] + 50, plant.curorigin[ 2 ] + 32 ); + + self BotNotifyBotEvent( "sd", "go", "plant", plant ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 1 ); + self thread bot_go_plant( plant ); + + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" || level.bombplanted || plant.visibleteam == "none" || !self istouching( plant.trigger ) || self inLastStand() || isdefined( self getthreat() ) || plant isInUse() ) + { + self.bot_lock_goal = false; + return; + } + + self BotNotifyBotEvent( "sd", "start", "plant", plant ); + + self BotRandomStance(); + self SetBotGoal( self.origin, 64 ); + self bot_wait_stop_move(); + + waitTime = ( plant.usetime / 1000 ) + 2.5; + self thread BotPressUse( waitTime ); + wait waitTime; + + self ClearBotGoal(); + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "sd", "stop", "plant", plant ); +} + +/* + Bots play sd attackers +*/ +bot_sd_attackers() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( level.gametype != "sd" ) + { + return; + } + + if ( self.team != game[ "attackers" ] ) + { + return; + } + + data = spawnstruct(); + data.rand = randomint( 100 ); + data.first = true; + + for ( ;; ) + { + self bot_sd_attackers_loop( data ); + } +} + +/* + Bots play capture the flag +*/ +bot_cap_loop() +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + + myflag = level.teamflags[ myTeam ]; + myzone = level.teamflagzones[ myTeam ]; + + theirflag = level.teamflags[ otherTeam ]; + theirzone = level.teamflagzones[ otherTeam ]; + + if ( myflag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() ) + { + carrier = myflag.carrier; + + if ( !isdefined( carrier ) ) // someone doesnt has our flag + { + if ( !isdefined( theirflag.carrier ) && distancesquared( self.origin, theirflag.curorigin ) < distancesquared( self.origin, myflag.curorigin ) ) // no one has their flag and its closer + { + self BotNotifyBotEvent( "cap", "start", "their_flag", theirflag ); + + self bot_cap_get_flag( theirflag ); + + self BotNotifyBotEvent( "cap", "stop", "their_flag", theirflag ); + } + else // go get it + { + self BotNotifyBotEvent( "cap", "start", "my_flag", myflag ); + + self bot_cap_get_flag( myflag ); + + self BotNotifyBotEvent( "cap", "stop", "my_flag", myflag ); + } + + return; + } + else + { + if ( !theirflag maps\mp\gametypes\_gameobjects::isobjectawayfromhome() && randomint( 100 ) < 50 ) + { + // take their flag + self BotNotifyBotEvent( "cap", "start", "their_flag", theirflag ); + + self bot_cap_get_flag( theirflag ); + + self BotNotifyBotEvent( "cap", "stop", "their_flag", theirflag ); + } + else + { + if ( self hasscriptgoal() ) + { + return; + } + + if ( !isdefined( theirzone.bots ) ) + { + theirzone.bots = 0; + } + + origin = theirzone.curorigin; + + if ( theirzone.bots > 2 || randomint( 100 ) < 45 ) + { + // kill carrier + if ( carrier hasperk( "specialty_gpsjammer" ) ) + { + return; + } + + origin = carrier.origin; + + self SetBotGoal( origin, 64 ); + self thread bot_escort_obj( myflag, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + self thread bot_inc_bots( theirzone ); + + // camp their zone + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + wait 4; + self notify( "bot_inc_bots" ); + theirzone.bots--; + return; + } + + self SetBotGoal( origin, 256 ); + self thread bot_inc_bots( theirzone ); + self thread bot_escort_obj( myflag, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + } + } + } + else // our flag is ok + { + if ( self isFlagCarrier() ) // if have flag + { + // go cap + origin = myzone.curorigin; + + self BotNotifyBotEvent( "cap", "start", "cap" ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 32 ); + + self thread bot_get_obj( myflag ); + evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + wait 1; + + if ( evt != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "cap", "stop", "cap" ); + return; + } + + carrier = theirflag.carrier; + + if ( !isdefined( carrier ) ) // if no one has enemy flag + { + self BotNotifyBotEvent( "cap", "start", "their_flag", theirflag ); + + self bot_cap_get_flag( theirflag ); + + self BotNotifyBotEvent( "cap", "stop", "their_flag", theirflag ); + return; + } + + // escort them + + if ( self hasscriptgoal() ) + { + return; + } + + origin = carrier.origin; + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + self thread bot_escort_obj( theirflag, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + } +} + +/* + Bots play capture the flag +*/ +bot_cap() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( level.gametype != "ctf" ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 3, 5 ) ); + + if ( self isremotecontrolling() || self.bot_lock_goal ) + { + continue; + } + + if ( !isdefined( level.teamflagzones ) ) + { + continue; + } + + if ( !isdefined( level.teamflags ) ) + { + continue; + } + + self bot_cap_loop(); + } +} + +/* + Gets the carriers ent num +*/ +getCarrierEntNum() +{ + carrierNum = -1; + + if ( isdefined( self.carrier ) ) + { + carrierNum = self.carrier getentitynumber(); + } + + return carrierNum; +} + +/* + Bots go and get the flag +*/ +bot_cap_get_flag( flag ) +{ + origin = flag.curorigin; + + // go get it + + self.bot_lock_goal = true; + self SetBotGoal( origin, 32 ); + + self thread bot_get_obj( flag ); + + evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( evt != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( evt != "goal" ) + { + self.bot_lock_goal = false; + return; + } + + self SetBotGoal( self.origin, 64 ); + curCarrier = flag getCarrierEntNum(); + + while ( curCarrier == flag getCarrierEntNum() && self istouching( flag.trigger ) ) + { + cur = flag.curprogress; + wait 0.5; + + if ( flag.curprogress == cur ) + { + break; // some enemy is near us, kill him + } + } + + self ClearBotGoal(); + + self.bot_lock_goal = false; +} + +/* + Bots go plant the demo bomb +*/ +bot_dem_go_plant( plant ) +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 0.5; + + if ( ( plant.label == "_b" && level.bombbplanted ) || ( plant.label == "_a" && level.bombaplanted ) ) + { + break; + } + + if ( self istouching( plant.trigger ) ) + { + break; + } + } + + if ( ( plant.label == "_b" && level.bombbplanted ) || ( plant.label == "_a" && level.bombaplanted ) ) + { + self notify( "bad_path" ); + } + else + { + self notify( "goal" ); + } +} + +/* + Bots spawn kill dom attackers +*/ +bot_dem_attack_spawnkill() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + l1 = level.bombaplanted; + l2 = level.bombbplanted; + + for ( ;; ) + { + wait 0.5; + + if ( l1 != level.bombaplanted || l2 != level.bombbplanted ) + { + break; + } + } + + self notify( "bad_path" ); +} + +/* + Bots play demo attackers +*/ +bot_dem_attackers_loop() +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + + bombs = []; // sites with bombs + sites = []; // sites to bomb at + bombed = 0; // exploded sites + + for ( i = 0; i < level.bombzones.size; i++ ) + { + bomb = level.bombzones[ i ]; + + if ( isdefined( bomb.bombexploded ) && bomb.bombexploded ) + { + bombed++; + continue; + } + + if ( bomb.label == "_a" ) + { + if ( level.bombaplanted ) + { + bombs[ bombs.size ] = bomb; + } + else + { + sites[ sites.size ] = bomb; + } + + continue; + } + + if ( bomb.label == "_b" ) + { + if ( level.bombbplanted ) + { + bombs[ bombs.size ] = bomb; + } + else + { + sites[ sites.size ] = bomb; + } + + continue; + } + } + + timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; + + shouldLet = ( game[ "teamScores" ][ myTeam ] > game[ "teamScores" ][ otherTeam ] && timeleft < 90 && bombed == 1 ); + + // spawnkill conditions + // if we have bombed one site or 1 bomb is planted with lots of time left, spawn kill + // if we want the other team to win for overtime and they do not need to defuse, spawn kill + if ( ( ( bombed + bombs.size == 1 && timeleft >= 90 ) || ( shouldLet && !bombs.size ) ) && randomint( 100 ) < 95 ) + { + if ( self hasscriptgoal() ) + { + return; + } + + spawnPoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_defender_start" ); + + if ( !spawnPoints.size ) + { + return; + } + + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnPoints ); + + if ( distancesquared( spawnpoint.origin, self.origin ) <= 2048 * 2048 ) + { + return; + } + + self SetBotGoal( spawnpoint.origin, 1024 ); + + self thread bot_dem_attack_spawnkill(); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + // let defuse conditions + // if enemy is going to lose and lots of time left, let them defuse to play longer + // or if want to go into overtime near end of the extended game + if ( ( ( bombs.size + bombed == 2 && timeleft >= 90 ) || ( shouldLet && bombs.size ) ) && randomint( 100 ) < 95 ) + { + spawnPoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_attacker_start" ); + + if ( !spawnPoints.size ) + { + return; + } + + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnPoints ); + + if ( distancesquared( spawnpoint.origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self.bot_lock_goal = true; + self SetBotGoal( spawnpoint.origin, 512 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + return; + } + + // defend bomb conditions + // if time is running out and we have a bomb planted + if ( bombs.size && timeleft < 90 && ( !sites.size || randomint( 100 ) < 95 ) ) + { + site = self bot_array_nearest_curorigin( bombs ); + origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); + + if ( site isInUse() ) // somebody is defusing + { + self BotNotifyBotEvent( "dem", "start", "defuser", site ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 64 ); + + self thread bot_defend_site( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "dem", "stop", "defuser", site ); + return; + } + + // else hang around the site + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self.bot_lock_goal = true; + self SetBotGoal( origin, 256 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + return; + } + + // else go plant + if ( !sites.size ) + { + return; + } + + plant = self bot_array_nearest_curorigin( sites ); + + if ( !isdefined( plant ) ) + { + return; + } + + if ( !isdefined( plant.bots ) ) + { + plant.bots = 0; + } + + origin = ( plant.curorigin[ 0 ] + 50, plant.curorigin[ 1 ] + 50, plant.curorigin[ 2 ] + 32 ); + + // hang around the site if lots of time left + if ( plant.bots > 1 && timeleft >= 60 ) + { + if ( self hasscriptgoal() ) + { + return; + } + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + self thread bot_dem_go_plant( plant ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + self BotNotifyBotEvent( "dem", "go", "plant", plant ); + + self.bot_lock_goal = true; + + self SetBotGoal( origin, 1 ); + self thread bot_inc_bots( plant ); + self thread bot_dem_go_plant( plant ); + + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" || ( plant.label == "_b" && level.bombbplanted ) || ( plant.label == "_a" && level.bombaplanted ) || plant isInUse() || !self istouching( plant.trigger ) || self inLastStand() || isdefined( self getthreat() ) ) + { + self.bot_lock_goal = false; + return; + } + + self BotNotifyBotEvent( "dem", "start", "plant", plant ); + + self BotRandomStance(); + self SetBotGoal( self.origin, 64 ); + self bot_wait_stop_move(); + + waitTime = ( plant.usetime / 1000 ) + 2.5; + self thread BotPressUse( waitTime ); + wait waitTime; + + self ClearBotGoal(); + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "dem", "stop", "plant", plant ); +} + +/* + Bots play demo attackers +*/ +bot_dem_attackers() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( level.gametype != "dem" ) + { + return; + } + + if ( self.team != game[ "attackers" ] ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 3, 5 ) ); + + if ( self isremotecontrolling() || self.bot_lock_goal ) + { + continue; + } + + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) + { + continue; + } + + self bot_dem_attackers_loop(); + } +} + +/* + Bots play demo defenders +*/ +bot_dem_defenders_loop() +{ + myTeam = self.pers[ "team" ]; + otherTeam = getotherteam( myTeam ); + + bombs = []; // sites with bombs + sites = []; // sites to bomb at + bombed = 0; // exploded sites + + for ( i = 0; i < level.bombzones.size; i++ ) + { + bomb = level.bombzones[ i ]; + + if ( isdefined( bomb.bombexploded ) && bomb.bombexploded ) + { + bombed++; + continue; + } + + if ( bomb.label == "_a" ) + { + if ( level.bombaplanted ) + { + bombs[ bombs.size ] = bomb; + } + else + { + sites[ sites.size ] = bomb; + } + + continue; + } + + if ( bomb.label == "_b" ) + { + if ( level.bombbplanted ) + { + bombs[ bombs.size ] = bomb; + } + else + { + sites[ sites.size ] = bomb; + } + + continue; + } + } + + timeleft = maps\mp\gametypes\_globallogic_utils::gettimeremaining() / 1000; + + shouldLet = ( timeleft < 60 && ( ( bombed == 0 && bombs.size != 2 ) || ( game[ "teamScores" ][ myTeam ] > game[ "teamScores" ][ otherTeam ] && bombed == 1 ) ) && randomint( 100 ) < 98 ); + + // spawnkill conditions + // if nothing to defuse with a lot of time left, spawn kill + // or letting a bomb site to explode but a bomb is planted, so spawnkill + if ( ( !bombs.size && timeleft >= 60 && randomint( 100 ) < 95 ) || ( shouldLet && bombs.size == 1 ) ) + { + if ( self hasscriptgoal() ) + { + return; + } + + spawnPoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_attacker_start" ); + + if ( !spawnPoints.size ) + { + return; + } + + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnPoints ); + + if ( distancesquared( spawnpoint.origin, self.origin ) <= 2048 * 2048 ) + { + return; + } + + self SetBotGoal( spawnpoint.origin, 1024 ); + + self thread bot_dem_defend_spawnkill(); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + // let blow up conditions + // let enemy blow up at least one to extend play time + // or if want to go into overtime after extended game + if ( shouldLet ) + { + spawnPoints = maps\mp\gametypes\_spawnlogic::getspawnpointarray( "mp_dem_spawn_defender_start" ); + + if ( !spawnPoints.size ) + { + return; + } + + spawnpoint = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( spawnPoints ); + + if ( distancesquared( spawnpoint.origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self.bot_lock_goal = true; + self SetBotGoal( spawnpoint.origin, 512 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + return; + } + + // defend conditions + // if no bombs planted with little time left + if ( !bombs.size && timeleft < 60 && randomint( 100 ) < 95 && sites.size ) + { + site = self bot_array_nearest_curorigin( sites ); + origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 32 ); + + if ( site isInUse() ) // somebody is planting + { + self BotNotifyBotEvent( "dem", "start", "planter", site ); + + self.bot_lock_goal = true; + self SetBotGoal( origin, 64 ); + + self thread bot_defend_site( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "dem", "stop", "planter", site ); + return; + } + + // else hang around the site + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self.bot_lock_goal = true; + self SetBotGoal( origin, 256 ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + self.bot_lock_goal = false; + return; + } + + // else go defuse + + if ( !bombs.size ) + { + return; + } + + defuse = self bot_array_nearest_curorigin( bombs ); + + if ( !isdefined( defuse ) ) + { + return; + } + + if ( !isdefined( defuse.bots ) ) + { + defuse.bots = 0; + } + + origin = ( defuse.curorigin[ 0 ] + 50, defuse.curorigin[ 1 ] + 50, defuse.curorigin[ 2 ] + 32 ); + + // hang around the site if not in danger of losing + if ( defuse.bots > 1 && bombed + bombs.size != 2 ) + { + if ( self hasscriptgoal() ) + { + return; + } + + if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) + { + return; + } + + self SetBotGoal( origin, 256 ); + + self thread bot_dem_go_defuse( defuse ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { + self ClearBotGoal(); + } + + return; + } + + self BotNotifyBotEvent( "dem", "go", "defuse", defuse ); + + self.bot_lock_goal = true; + + self SetBotGoal( origin, 1 ); + self thread bot_inc_bots( defuse ); + self thread bot_dem_go_defuse( defuse ); + + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); + + if ( event != "new_goal" ) + { + self ClearBotGoal(); + } + + if ( event != "goal" || ( defuse.label == "_b" && !level.bombbplanted ) || ( defuse.label == "_a" && !level.bombaplanted ) || defuse isInUse() || !self istouching( defuse.trigger ) || self inLastStand() || isdefined( self getthreat() ) ) + { + self.bot_lock_goal = false; + return; + } + + self BotNotifyBotEvent( "dem", "start", "defuse", defuse ); + + self BotRandomStance(); + self SetBotGoal( self.origin, 64 ); + self bot_wait_stop_move(); + + waitTime = ( defuse.usetime / 1000 ) + 2.5; + self thread BotPressUse( waitTime ); + wait waitTime; + + self ClearBotGoal(); + + self.bot_lock_goal = false; + + self BotNotifyBotEvent( "dem", "stop", "defuse", defuse ); +} + +/* + Bots play demo defenders +*/ +bot_dem_defenders() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + if ( level.gametype != "dem" ) + { + return; + } + + if ( self.team == game[ "attackers" ] ) + { + return; + } + + for ( ;; ) + { + wait( randomintrange( 3, 5 ) ); + + if ( self isremotecontrolling() || self.bot_lock_goal ) + { + continue; + } + + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) + { + continue; + } + + self bot_dem_defenders_loop(); + } +} + +/* + Bots go defuse +*/ +bot_dem_go_defuse( defuse ) +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 0.5; + + if ( self istouching( defuse.trigger ) ) + { + break; + } + + if ( ( defuse.label == "_b" && !level.bombbplanted ) || ( defuse.label == "_a" && !level.bombaplanted ) ) + { + break; + } + } + + if ( ( defuse.label == "_b" && !level.bombbplanted ) || ( defuse.label == "_a" && !level.bombaplanted ) ) + { + self notify( "bad_path" ); + } + else + { + self notify( "goal" ); + } +} + +/* + Bots go spawn kill +*/ +bot_dem_defend_spawnkill() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); + + for ( ;; ) + { + wait 0.5; + + if ( level.bombbplanted || level.bombaplanted ) + { + break; + } + } + + self notify( "bad_path" ); +} + +/* + custom movement stuff +*/ +watch_for_melee_override() +{ + self endon( "disconnect" ); + self endon( "death" ); + + // dedi doesnt have this registered + if ( getdvar( "aim_automelee_enabled" ) == "" ) + { + setdvar( "aim_automelee_enabled", 1 ); + } + + for ( ;; ) + { + threat = self getthreat(); + + while ( !isdefined( threat ) || ( !isplayer( threat ) && !isai( threat ) ) || self BotIsFrozen() || self isremotecontrolling() || !self hasweapon( "knife_mp" ) || !getdvarint( "aim_automelee_enabled" ) ) + { + wait 0.05; + threat = self getthreat(); + } + + thisThreat = self getthreat(); + + while ( isdefined( thisThreat ) && isdefined( threat ) && thisThreat == threat && !self BotIsFrozen() ) + { + dist = distance( self.origin, threat.origin ); + + if ( self isonground() && self getstance() != "prone" && !self inLastStand() && dist < getdvarfloat( "aim_automelee_range" ) && ( getConeDot( threat.origin, self.origin, self getplayerangles() ) > 0.9 || dist < 10 ) ) + { + angles = vectortoangles( threat.origin - self.origin ); + + self BotBuiltinBotMeleeParams( angles[ 1 ], dist ); + self BotBuiltinButtonOverride( "melee", "enable" ); + self BotBuiltinAimOverride(); + + time_left = 1; + once = false; + + while ( time_left > 0 && isdefined( threat ) && isalive( threat ) ) + { + self setplayerangles( vectortoangles( threat gettagorigin( "j_spine4" ) - self geteye() ) ); + time_left -= 0.05; + wait 0.05; + + if ( !once ) + { + once = true; + self BotBuiltinClearButtonOverride( "melee" ); + } + } + + if ( !once ) + { + self BotBuiltinClearButtonOverride( "melee" ); + } + + self BotBuiltinClearMeleeParams(); + self BotBuiltinClearAimOverride(); + wait 1; + break; + } + + wait 0.05; + thisThreat = self getthreat(); + } + } +} + +/* + custom movement stuff +*/ +watch_for_override_stuff() +{ + self endon( "disconnect" ); + self endon( "death" ); + + NEAR_DIST = 80; + LONG_DIST = 1000; + SPAM_JUMP_TIME = 5000; + + diff = self GetBotDiffNum(); + chance = 0; + + if ( diff == 1 ) + { + chance = 25; + } + else if ( diff == 2 ) + { + chance = 50; + } + else if ( diff == 3 ) + { + chance = 80; + } + + last_jump_time = 0; + need_to_clear_mantle_override = false; + + if ( !getdvarint( "bots_play_jumpdrop" ) ) + { + return; + } + + for ( ;; ) + { + threat = self getthreat(); + + while ( !isdefined( threat ) || !isplayer( threat ) || self isremotecontrolling() || self BotIsFrozen() ) + { + wait 0.05; + threat = self getthreat(); + } + + dist = distance( threat.origin, self.origin ); + time = gettime(); + weap = self getcurrentweapon(); + + if ( need_to_clear_mantle_override && ( time - last_jump_time ) > 3000 ) + { + need_to_clear_mantle_override = false; + self BotBuiltinClearMantleOverride(); + } + + weapon_is_good = true; + + if ( weap == "none" || !self getweaponammoclip( weap ) ) + { + weapon_is_good = false; + } + + if ( weapon_is_good && ( dist > NEAR_DIST ) && ( dist < LONG_DIST ) && ( randomint( 100 ) < chance ) && ( ( time - last_jump_time ) > SPAM_JUMP_TIME ) ) + { + if ( randomint( 2 ) ) + { + if ( ( getConeDot( threat.origin, self.origin, self getplayerangles() ) > 0.8 ) && ( dist > ( NEAR_DIST * 2 ) ) ) + { + last_jump_time = time; + need_to_clear_mantle_override = true; + self BotBuiltinMantleOverride(); + + // drop shot + self BotBuiltinMovementOverride( 0, 0 ); + self BotBuiltinButtonOverride( "prone", "enable" ); + + wait 1.5; + + self BotBuiltinClearMovementOverride(); + self BotBuiltinClearButtonOverride( "prone" ); + } + } + else + { + last_jump_time = time; + need_to_clear_mantle_override = true; + self BotBuiltinMantleOverride(); + + // jump shot + self BotBuiltinButtonOverride( "gostand", "enable" ); + wait 0.1; + self BotBuiltinClearButtonOverride( "gostand" ); + } + } + + thisThreat = self getthreat(); + + while ( isdefined( thisThreat ) && isdefined( threat ) && thisThreat == threat ) + { + wait 0.05; + thisThreat = self getthreat(); + } + } +} diff --git a/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc index 4b4bf0b..1dc3a70 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/maps/mp/bots/_bot_utility.gsc @@ -16,7 +16,7 @@ wait_for_builtins() { for ( i = 0; i < 20; i++ ) { - if ( isDefined( level.bot_builtins ) ) + if ( isdefined( level.bot_builtins ) ) { return true; } @@ -39,13 +39,13 @@ wait_for_builtins() */ BotBuiltinPrintConsole( s ) { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "printconsole" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "printconsole" ] ) ) { [[ level.bot_builtins[ "printconsole" ] ]]( s ); } else { - PrintLn( s ); + println( s ); } } @@ -53,7 +53,7 @@ BotBuiltinPrintConsole( s ) */ BotBuiltinMovementOverride( a, b ) { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botmovementoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botmovementoverride" ] ) ) { self [[ level.bot_builtins[ "botmovementoverride" ] ]]( a, b ); } @@ -63,7 +63,7 @@ BotBuiltinMovementOverride( a, b ) */ BotBuiltinClearMovementOverride() { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botclearmovementoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botclearmovementoverride" ] ) ) { self [[ level.bot_builtins[ "botclearmovementoverride" ] ]](); } @@ -73,7 +73,7 @@ BotBuiltinClearMovementOverride() */ BotBuiltinClearButtonOverride( a ) { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botclearbuttonoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botclearbuttonoverride" ] ) ) { self [[ level.bot_builtins[ "botclearbuttonoverride" ] ]]( a ); } @@ -83,7 +83,7 @@ BotBuiltinClearButtonOverride( a ) */ BotBuiltinButtonOverride( a, b ) { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botbuttonoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botbuttonoverride" ] ) ) { self [[ level.bot_builtins[ "botbuttonoverride" ] ]]( a, b ); } @@ -93,7 +93,7 @@ BotBuiltinButtonOverride( a, b ) */ BotBuiltinClearOverrides( a ) { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botclearoverrides" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botclearoverrides" ] ) ) { self [[ level.bot_builtins[ "botclearoverrides" ] ]]( a ); } @@ -103,7 +103,7 @@ BotBuiltinClearOverrides( a ) */ BotBuiltinMantleOverride() { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botmantleoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botmantleoverride" ] ) ) { self [[ level.bot_builtins[ "botmantleoverride" ] ]](); } @@ -113,7 +113,7 @@ BotBuiltinMantleOverride() */ BotBuiltinClearMantleOverride() { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botclearmantleoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botclearmantleoverride" ] ) ) { self [[ level.bot_builtins[ "botclearmantleoverride" ] ]](); } @@ -123,7 +123,7 @@ BotBuiltinClearMantleOverride() */ BotBuiltinClearWeaponOverride() { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botclearweaponoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botclearweaponoverride" ] ) ) { self [[ level.bot_builtins[ "botclearweaponoverride" ] ]](); } @@ -133,7 +133,7 @@ BotBuiltinClearWeaponOverride() */ BotBuiltinWeaponOverride( a ) { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botweaponoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botweaponoverride" ] ) ) { self [[ level.bot_builtins[ "botweaponoverride" ] ]]( a ); } @@ -143,7 +143,7 @@ BotBuiltinWeaponOverride( a ) */ BotBuiltinClearButtonOverrides() { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botclearbuttonoverrides" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botclearbuttonoverrides" ] ) ) { self [[ level.bot_builtins[ "botclearbuttonoverrides" ] ]](); } @@ -153,7 +153,7 @@ BotBuiltinClearButtonOverrides() */ BotBuiltinAimOverride() { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botaimoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botaimoverride" ] ) ) { self [[ level.bot_builtins[ "botaimoverride" ] ]](); } @@ -163,7 +163,7 @@ BotBuiltinAimOverride() */ BotBuiltinClearAimOverride() { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botclearaimoverride" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botclearaimoverride" ] ) ) { self [[ level.bot_builtins[ "botclearaimoverride" ] ]](); } @@ -174,7 +174,7 @@ BotBuiltinClearAimOverride() */ BotBuiltinBotMeleeParams( yaw, dist ) { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "botmeleeparams" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botmeleeparams" ] ) ) { self [[ level.bot_builtins[ "botmeleeparams" ] ]]( yaw, dist ); } @@ -184,7 +184,7 @@ BotBuiltinBotMeleeParams( yaw, dist ) */ BotBuiltinClearMeleeParams() { - if ( isDefined( level.bot_builtins ) && isDefined( level.bot_builtins[ "clearbotmeleeparams" ] ) ) + if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "clearbotmeleeparams" ] ) ) { self [[ level.bot_builtins[ "clearbotmeleeparams" ] ]](); } @@ -259,7 +259,7 @@ PickRandom( arr ) return undefined; } - return arr[ randomInt( arr.size ) ]; + return arr[ randomint( arr.size ) ]; } /* @@ -267,7 +267,7 @@ PickRandom( arr ) */ isDefusing() { - return ( isDefined( self.isDefusing ) && self.isDefusing ); + return ( isdefined( self.isdefusing ) && self.isdefusing ); } /* @@ -275,7 +275,7 @@ isDefusing() */ isPlanting() { - return ( isDefined( self.isPlanting ) && self.isPlanting ); + return ( isdefined( self.isplanting ) && self.isplanting ); } /* @@ -283,7 +283,7 @@ isPlanting() */ inLastStand() { - return ( isDefined( self.laststand ) && self.laststand ); + return ( isdefined( self.laststand ) && self.laststand ); } /* @@ -291,7 +291,7 @@ inLastStand() */ isFlagCarrier() { - return ( isDefined( self.isFlagCarrier ) && self.isFlagCarrier ); + return ( isdefined( self.isflagcarrier ) && self.isflagcarrier ); } /* @@ -299,7 +299,7 @@ isFlagCarrier() */ isInUse() { - return ( isDefined( self.inUse ) && self.inUse ); + return ( isdefined( self.inuse ) && self.inuse ); } /* @@ -307,7 +307,7 @@ isInUse() */ isBombCarrier() { - return ( isDefined( self.isBombCarrier ) && self.isBombCarrier ); + return ( isdefined( self.isbombcarrier ) && self.isbombcarrier ); } /* @@ -333,7 +333,7 @@ GetBotDiffNum() { num = 0; - switch ( getDvar( "bot_difficulty" ) ) + switch ( getdvar( "bot_difficulty" ) ) { case "fu": num = 3; @@ -361,7 +361,7 @@ GetBotDiffNum() */ isWeaponAltmode( weap ) { - if ( isStrStart( weap, "gl_" ) || isStrStart( weap, "ft_" ) || isStrStart( weap, "mk_" ) ) + if ( isstrstart( weap, "gl_" ) || isstrstart( weap, "ft_" ) || isstrstart( weap, "mk_" ) ) { return true; } @@ -381,27 +381,27 @@ bot_lookat( pos, time, vel, doAimPredict ) self endon( "spawned_player" ); level endon ( "game_ended" ); - if ( level.gameEnded || level.inPrematchPeriod || self BotIsFrozen() || !getDvarInt( "bots_play_aim" ) ) + if ( level.gameended || level.inprematchperiod || self BotIsFrozen() || !getdvarint( "bots_play_aim" ) ) { return; } - if ( !isDefined( pos ) ) + if ( !isdefined( pos ) ) { return; } - if ( !isDefined( doAimPredict ) ) + if ( !isdefined( doAimPredict ) ) { doAimPredict = false; } - if ( !isDefined( time ) ) + if ( !isdefined( time ) ) { time = 0.05; } - if ( !isDefined( vel ) ) + if ( !isdefined( vel ) ) { vel = ( 0, 0, 0 ); } @@ -413,28 +413,28 @@ bot_lookat( pos, time, vel, doAimPredict ) steps = 1; } - myEye = self GetEye(); // get our eye pos + myEye = self geteye(); // get our eye pos if ( doAimPredict ) { - myEye += ( self getVelocity() * 0.05 ) * ( steps - 1 ); // account for our velocity + myEye += ( self getvelocity() * 0.05 ) * ( steps - 1 ); // account for our velocity pos += ( vel * 0.05 ) * ( steps - 1 ); // add the velocity vector } - myAngle = self getPlayerAngles(); - angles = VectorToAngles( ( pos - myEye ) - anglesToForward( myAngle ) ); + myAngle = self getplayerangles(); + angles = vectortoangles( ( pos - myEye ) - anglestoforward( myAngle ) ); - X = AngleClamp180( angles[ 0 ] - myAngle[ 0 ] ); + X = angleclamp180( angles[ 0 ] - myAngle[ 0 ] ); X = X / steps; - Y = AngleClamp180( angles[ 1 ] - myAngle[ 1 ] ); + Y = angleclamp180( angles[ 1 ] - myAngle[ 1 ] ); Y = Y / steps; for ( i = 0; i < steps; i++ ) { - myAngle = ( AngleClamp180( myAngle[ 0 ] + X ), AngleClamp180( myAngle[ 1 ] + Y ), 0 ); - self setPlayerAngles( myAngle ); + myAngle = ( angleclamp180( myAngle[ 0 ] + X ), angleclamp180( myAngle[ 1 ] + Y ), 0 ); + self setplayerangles( myAngle ); wait 0.05; } } @@ -449,17 +449,17 @@ getweaponslistall() for ( i = 0; i < weaps.size; i++ ) { weap = weaps[ i ]; - toks = strTok( weap, "_" ); + toks = strtok( weap, "_" ); - if ( isSubStr( weap, "_gl_" ) ) + if ( issubstr( weap, "_gl_" ) ) { weaps[ weaps.size ] = "gl_" + toks[ 0 ] + "_mp"; } - else if ( isSubStr( weap, "_ft_" ) ) + else if ( issubstr( weap, "_ft_" ) ) { weaps[ weaps.size ] = "ft_" + toks[ 0 ] + "_mp"; } - else if ( isSubStr( weap, "_mk_" ) ) + else if ( issubstr( weap, "_mk_" ) ) { weaps[ weaps.size ] = "mk_" + toks[ 0 ] + "_mp"; } @@ -479,12 +479,12 @@ getValidTube() { weap = weaps[ i ]; - if ( !self getAmmoCount( weap ) ) + if ( !self getammocount( weap ) ) { continue; } - if ( ( isSubStr( weap, "gl_" ) && !isSubStr( weap, "_gl_" ) ) || weap == "china_lake_mp" ) + if ( ( issubstr( weap, "gl_" ) && !issubstr( weap, "_gl_" ) ) || weap == "china_lake_mp" ) { return weap; } @@ -555,7 +555,7 @@ getBotToKick() { bots = getBotArray(); - if ( !isDefined( bots ) || !isDefined( bots.size ) || bots.size <= 0 || !isDefined( bots[ 0 ] ) ) + if ( !isdefined( bots ) || !isdefined( bots.size ) || bots.size <= 0 || !isdefined( bots[ 0 ] ) ) { return undefined; } @@ -563,14 +563,14 @@ getBotToKick() tokick = undefined; axis = 0; allies = 0; - team = getDvar( "bots_team" ); + team = getdvar( "bots_team" ); // count teams for ( i = 0; i < bots.size; i++ ) { bot = bots[ i ]; - if ( !isDefined( bot ) || !isDefined( bot.team ) ) + if ( !isdefined( bot ) || !isdefined( bot.team ) ) { continue; } @@ -614,7 +614,7 @@ getBotToKick() { bot = bots[ i ]; - if ( !isDefined( bot ) || !isDefined( bot.team ) ) + if ( !isdefined( bot ) || !isdefined( bot.team ) ) { continue; } @@ -627,7 +627,7 @@ getBotToKick() tokick = bot; } - if ( isDefined( tokick ) ) + if ( isdefined( tokick ) ) { return tokick; } @@ -637,7 +637,7 @@ getBotToKick() { bot = bots[ i ]; - if ( !isDefined( bot ) || !isDefined( bot.team ) ) + if ( !isdefined( bot ) || !isdefined( bot.team ) ) { continue; } @@ -655,16 +655,16 @@ bot_wait_for_host() { host = undefined; - while ( !isDefined( level ) || !isDefined( level.players ) ) + while ( !isdefined( level ) || !isdefined( level.players ) ) { wait 0.05; } - for ( i = getDvarFloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) + for ( i = getdvarfloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { - host = GetHostPlayer(); + host = gethostplayer(); - if ( isDefined( host ) ) + if ( isdefined( host ) ) { break; } @@ -672,14 +672,14 @@ bot_wait_for_host() wait 0.05; } - if ( !isDefined( host ) ) + if ( !isdefined( host ) ) { return; } - for ( i = getDvarFloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) + for ( i = getdvarfloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { - if ( IsDefined( host.pers[ "team" ] ) ) + if ( isdefined( host.pers[ "team" ] ) ) { break; } @@ -687,12 +687,12 @@ bot_wait_for_host() wait 0.05; } - if ( !IsDefined( host.pers[ "team" ] ) ) + if ( !isdefined( host.pers[ "team" ] ) ) { return; } - for ( i = getDvarFloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) + for ( i = getdvarfloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { if ( host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis" ) { @@ -708,7 +708,7 @@ bot_wait_for_host() */ SetBotGoal( where, dist ) { - self SetScriptGoal( where, dist ); + self setscriptgoal( where, dist ); waittillframeend; self notify( "new_goal" ); } @@ -718,7 +718,7 @@ SetBotGoal( where, dist ) */ ClearBotGoal() { - self ClearScriptGoal(); + self clearscriptgoal(); waittillframeend; self notify( "new_goal" ); } @@ -728,7 +728,7 @@ ClearBotGoal() */ BotPressUse( time ) { - self PressUseButton( time ); + self pressusebutton( time ); } /* @@ -750,7 +750,7 @@ BotIsFrozen() /* Bot stops moving */ -BotStopMove( what ) +botStopMove( what ) { self thread botStopMove2( what ); } @@ -783,8 +783,8 @@ botStopMove2( what ) for ( ;; ) { - self setVelocity( ( 0, 0, 0 ) ); - self setOrigin( og ); + self setvelocity( ( 0, 0, 0 ) ); + self setorigin( og ); wait 0.05; } } @@ -935,8 +935,8 @@ doExtraCheck() */ getConeDot( to, from, dir ) { - dirToTarget = VectorNormalize( to - from ); - forward = AnglesToForward( dir ); + dirToTarget = vectornormalize( to - from ); + forward = anglestoforward( dir ); return vectordot( dirToTarget, forward ); } @@ -949,22 +949,22 @@ bot_onUsePlantObjectFix( player ) if ( !self maps\mp\gametypes\_gameobjects::isfriendlyteam( player.pers[ "team" ] ) ) { level thread bot_bombPlanted( self, player ); - player logString( "bomb planted: " + self.label ); + player logstring( "bomb planted: " + self.label ); // disable all bomb zones except this one - for ( index = 0; index < level.bombZones.size; index++ ) + for ( index = 0; index < level.bombzones.size; index++ ) { - if ( level.bombZones[ index ] == self ) + if ( level.bombzones[ index ] == self ) { continue; } - level.bombZones[ index ] maps\mp\gametypes\_gameobjects::disableobject(); + level.bombzones[ index ] maps\mp\gametypes\_gameobjects::disableobject(); } - thread playSoundOnPlayers( "mus_sd_planted" + "_" + level.teamPostfix[ player.pers[ "team" ] ] ); + thread playsoundonplayers( "mus_sd_planted" + "_" + level.teampostfix[ player.pers[ "team" ] ] ); // removed plant audio until finalization of assest TODO : new plant sounds when assests are online -// player playSound( "mpl_sd_bomb_plant" ); +// player playsound( "mpl_sd_bomb_plant" ); player notify ( "bomb_planted" ); level thread maps\mp\_popups::displayteammessagetoall( &"MP_EXPLOSIVES_PLANTED_BY", player ); @@ -981,7 +981,7 @@ bot_onUsePlantObjectFix( player ) maps\mp\gametypes\_globallogic_audio::leaderdialog( "bomb_planted" ); maps\mp\gametypes\_globallogic_score::giveplayerscore( "plant", player ); - // player thread [[ level.onXPEvent ]]( "plant" ); + // player thread [[ level.onxpevent ]]( "plant" ); } } @@ -991,48 +991,48 @@ bot_onUsePlantObjectFix( player ) bot_bombPlanted( destroyedObj, player ) { maps\mp\gametypes\_globallogic_utils::pausetimer(); - level.bombPlanted = true; + level.bombplanted = true; destroyedObj.visuals[ 0 ] thread maps\mp\gametypes\_globallogic_utils::playtickingsound( "mpl_sab_ui_suitcasebomb_timer" ); // Play suspense music - level thread maps\mp\gametypes\sd::bombplantedmusicselay(); + level thread maps\mp\gametypes\sd::bombplantedmusicdelay(); // thread maps\mp\gametypes\_globallogic_audio::actionmusicset(); - level.tickingObject = destroyedObj.visuals[ 0 ]; + level.tickingobject = destroyedObj.visuals[ 0 ]; - level.timeLimitOverride = true; - setGameEndTime( int( gettime() + ( level.bombTimer * 1000 ) ) ); - setMatchFlag( "bomb_timer", 1 ); + level.timelimitoverride = true; + setgameendtime( int( gettime() + ( level.bombtimer * 1000 ) ) ); + setmatchflag( "bomb_timer", 1 ); - if ( !level.multiBomb ) + if ( !level.multibomb ) { - level.sdBomb maps\mp\gametypes\_gameobjects::allowcarry( "none" ); - level.sdBomb maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); - level.sdBomb maps\mp\gametypes\_gameobjects::setdropped(); - level.sdBombModel = level.sdBomb.visuals[ 0 ]; + level.sdbomb maps\mp\gametypes\_gameobjects::allowcarry( "none" ); + level.sdbomb maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); + level.sdbomb maps\mp\gametypes\_gameobjects::setdropped(); + level.sdbombmodel = level.sdbomb.visuals[ 0 ]; } else { for ( index = 0; index < level.players.size; index++ ) { - if ( isDefined( level.players[ index ].carryIcon ) ) + if ( isdefined( level.players[ index ].carryicon ) ) { - level.players[ index ].carryIcon destroyelem(); + level.players[ index ].carryicon destroyelem(); } } - trace = bulletTrace( player.origin + ( 0, 0, 20 ), player.origin - ( 0, 0, 2000 ), false, player ); + trace = bullettrace( player.origin + ( 0, 0, 20 ), player.origin - ( 0, 0, 2000 ), false, player ); tempAngle = randomfloat( 360 ); forward = ( cos( tempAngle ), sin( tempAngle ), 0 ); forward = vectornormalize( forward - vector_scale( trace[ "normal" ], vectordot( forward, trace[ "normal" ] ) ) ); dropAngles = vectortoangles( forward ); - level.sdBombModel = spawn( "script_model", trace[ "position" ] ); - level.sdBombModel.angles = dropAngles; - level.sdBombModel setModel( "prop_suitcase_bomb" ); + level.sdbombmodel = spawn( "script_model", trace[ "position" ] ); + level.sdbombmodel.angles = dropAngles; + level.sdbombmodel setmodel( "prop_suitcase_bomb" ); } destroyedObj maps\mp\gametypes\_gameobjects::allowuse( "none" ); @@ -1046,12 +1046,12 @@ bot_bombPlanted( destroyedObj, player ) label = destroyedObj maps\mp\gametypes\_gameobjects::getlabel(); // create a new object to defuse with. - trigger = destroyedObj.bombDefuseTrig; - trigger.origin = level.sdBombModel.origin; + trigger = destroyedObj.bombdefusetrig; + trigger.origin = level.sdbombmodel.origin; visuals = []; defuseObject = maps\mp\gametypes\_gameobjects::createuseobject( game[ "defenders" ], trigger, visuals, ( 0, 0, 32 ) ); defuseObject maps\mp\gametypes\_gameobjects::allowuse( "friendly" ); - defuseObject maps\mp\gametypes\_gameobjects::setusetime( level.defuseTime ); + defuseObject maps\mp\gametypes\_gameobjects::setusetime( level.defusetime ); defuseObject maps\mp\gametypes\_gameobjects::setusetext( &"MP_DEFUSING_EXPLOSIVE" ); defuseObject maps\mp\gametypes\_gameobjects::setusehinttext( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); defuseObject maps\mp\gametypes\_gameobjects::setvisibleteam( "any" ); @@ -1060,59 +1060,59 @@ bot_bombPlanted( destroyedObj, player ) defuseObject maps\mp\gametypes\_gameobjects::set3dicon( "friendly", "waypoint_defuse" + label ); defuseObject maps\mp\gametypes\_gameobjects::set3dicon( "enemy", "waypoint_defend" + label ); defuseObject.label = label; - defuseObject.onBeginUse = maps\mp\gametypes\sd::onbeginuse; - defuseObject.onEndUse = maps\mp\gametypes\sd::onenduse; - defuseObject.onUse = maps\mp\gametypes\sd::onusedefuseobject; - defuseObject.useWeapon = "briefcase_bomb_defuse_mp"; + defuseObject.onbeginuse = maps\mp\gametypes\sd::onbeginuse; + defuseObject.onenduse = maps\mp\gametypes\sd::onenduse; + defuseObject.onuse = maps\mp\gametypes\sd::onusedefuseobject; + defuseObject.useweapon = "briefcase_bomb_defuse_mp"; - level.defuseObject = defuseObject; // every cod... + level.defuseobject = defuseObject; // every cod... - player.isBombCarrier = false; + player.isbombcarrier = false; maps\mp\gametypes\sd::bombtimerwait(); - setMatchFlag( "bomb_timer", 0 ); + setmatchflag( "bomb_timer", 0 ); destroyedObj.visuals[ 0 ] maps\mp\gametypes\_globallogic_utils::stoptickingsound(); - if ( level.gameEnded || level.bombDefused ) + if ( level.gameended || level.bombdefused ) { return; } - level.bombExploded = true; + level.bombexploded = true; - explosionOrigin = level.sdBombModel.origin + ( 0, 0, 12 ); - level.sdBombModel hide(); + explosionOrigin = level.sdbombmodel.origin + ( 0, 0, 12 ); + level.sdbombmodel hide(); if ( isdefined( player ) ) { - destroyedObj.visuals[ 0 ] radiusDamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); + destroyedObj.visuals[ 0 ] radiusdamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); level thread maps\mp\_popups::displayteammessagetoall( &"MP_EXPLOSIVES_BLOWUP_BY", player ); player maps\mp\_medals::bomber(); player maps\mp\gametypes\_persistence::stataddwithgametype( "DESTRUCTIONS", 1 ); } else { - destroyedObj.visuals[ 0 ] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); + destroyedObj.visuals[ 0 ] radiusdamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); } rot = randomfloat( 360 ); - explosionEffect = spawnFx( level._effect[ "bombexplosion" ], explosionOrigin + ( 0, 0, 50 ), ( 0, 0, 1 ), ( cos( rot ), sin( rot ), 0 ) ); - triggerFx( explosionEffect ); + explosionEffect = spawnfx( level._effect[ "bombexplosion" ], explosionOrigin + ( 0, 0, 50 ), ( 0, 0, 1 ), ( cos( rot ), sin( rot ), 0 ) ); + triggerfx( explosionEffect ); - thread playSoundinSpace( "mpl_sd_exp_suitcase_bomb_main", explosionOrigin ); + thread playsoundinspace( "mpl_sd_exp_suitcase_bomb_main", explosionOrigin ); // thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "SILENT", "both" ); - if ( isDefined( destroyedObj.exploderIndex ) ) + if ( isdefined( destroyedObj.exploderindex ) ) { - exploder( destroyedObj.exploderIndex ); + exploder( destroyedObj.exploderindex ); } - for ( index = 0; index < level.bombZones.size; index++ ) + for ( index = 0; index < level.bombzones.size; index++ ) { - level.bombZones[ index ] maps\mp\gametypes\_gameobjects::disableobject(); + level.bombzones[ index ] maps\mp\gametypes\_gameobjects::disableobject(); } defuseObject maps\mp\gametypes\_gameobjects::disableobject(); diff --git a/maps/mp/gametypes/_bot.gsc b/maps/mp/gametypes/_bot.gsc index f0096df..600f678 100644 --- a/maps/mp/gametypes/_bot.gsc +++ b/maps/mp/gametypes/_bot.gsc @@ -15,170 +15,170 @@ */ init() { - level.bw_VERSION = "1.1.1"; + level.bw_version = "1.1.1"; level.bot_offline = false; - if ( getDvar( "bots_main" ) == "" ) + if ( getdvar( "bots_main" ) == "" ) { - setDvar( "bots_main", true ); + setdvar( "bots_main", true ); } - if ( !getDvarInt( "bots_main" ) ) + if ( !getdvarint( "bots_main" ) ) { return; } if ( !wait_for_builtins() ) { - PrintLn( "FATAL: NO BUILT-INS FOR BOTS" ); + println( "FATAL: NO BUILT-INS FOR BOTS" ); } - if ( getDvar( "bots_main_waitForHostTime" ) == "" ) + if ( getdvar( "bots_main_waitForHostTime" ) == "" ) { - setDvar( "bots_main_waitForHostTime", 10.0 ); // how long to wait to wait for the host player + setdvar( "bots_main_waitForHostTime", 10.0 ); // how long to wait to wait for the host player } - if ( getDvar( "bots_main_kickBotsAtEnd" ) == "" ) + if ( getdvar( "bots_main_kickBotsAtEnd" ) == "" ) { - setDvar( "bots_main_kickBotsAtEnd", false ); // kicks the bots at game end + setdvar( "bots_main_kickBotsAtEnd", false ); // kicks the bots at game end } - if ( getDvar( "bots_manage_add" ) == "" ) + if ( getdvar( "bots_manage_add" ) == "" ) { - setDvar( "bots_manage_add", 0 ); // amount of bots to add to the game + setdvar( "bots_manage_add", 0 ); // amount of bots to add to the game } - if ( getDvar( "bots_manage_fill" ) == "" ) + if ( getdvar( "bots_manage_fill" ) == "" ) { - setDvar( "bots_manage_fill", 0 ); // amount of bots to maintain + setdvar( "bots_manage_fill", 0 ); // amount of bots to maintain } - if ( getDvar( "bots_manage_fill_spec" ) == "" ) + if ( getdvar( "bots_manage_fill_spec" ) == "" ) { - setDvar( "bots_manage_fill_spec", true ); // to count for fill if player is on spec team + setdvar( "bots_manage_fill_spec", true ); // to count for fill if player is on spec team } - if ( getDvar( "bots_manage_fill_mode" ) == "" ) + if ( getdvar( "bots_manage_fill_mode" ) == "" ) { - setDvar( "bots_manage_fill_mode", 0 ); // fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 + setdvar( "bots_manage_fill_mode", 0 ); // fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 } - if ( getDvar( "bots_manage_fill_kick" ) == "" ) + if ( getdvar( "bots_manage_fill_kick" ) == "" ) { - setDvar( "bots_manage_fill_kick", false ); // kick bots if too many + setdvar( "bots_manage_fill_kick", false ); // kick bots if too many } - if ( getDvar( "bots_skill" ) == "" ) // alias for bot_difficulty + if ( getdvar( "bots_skill" ) == "" ) // alias for bot_difficulty { - setDvar( "bots_skill", "" ); + setdvar( "bots_skill", "" ); } - if ( getDvar( "bots_team" ) == "" ) + if ( getdvar( "bots_team" ) == "" ) { - setDvar( "bots_team", "autoassign" ); // which team for bots to join + setdvar( "bots_team", "autoassign" ); // which team for bots to join } - if ( getDvar( "bots_team_amount" ) == "" ) + if ( getdvar( "bots_team_amount" ) == "" ) { - setDvar( "bots_team_amount", 0 ); // amount of bots on axis team + setdvar( "bots_team_amount", 0 ); // amount of bots on axis team } - if ( getDvar( "bots_team_force" ) == "" ) + if ( getdvar( "bots_team_force" ) == "" ) { - setDvar( "bots_team_force", false ); // force bots on team + setdvar( "bots_team_force", false ); // force bots on team } - if ( getDvar( "bots_team_mode" ) == "" ) + if ( getdvar( "bots_team_mode" ) == "" ) { - setDvar( "bots_team_mode", 0 ); // counts just bots when 1 + setdvar( "bots_team_mode", 0 ); // counts just bots when 1 } - if ( getDvar( "bots_loadout_reasonable" ) == "" ) // filter out the bad 'guns' and perks + if ( getdvar( "bots_loadout_reasonable" ) == "" ) // filter out the bad 'guns' and perks { - setDvar( "bots_loadout_reasonable", false ); + setdvar( "bots_loadout_reasonable", false ); } - if ( getDvar( "bots_loadout_allow_op" ) == "" ) // allows jug, marty and laststand + if ( getdvar( "bots_loadout_allow_op" ) == "" ) // allows jug, marty and laststand { - setDvar( "bots_loadout_allow_op", true ); + setdvar( "bots_loadout_allow_op", true ); } - if ( getDvar( "bots_loadout_rank" ) == "" ) // what rank the bots should be around, -1 is around the players, 0 is all random + if ( getdvar( "bots_loadout_rank" ) == "" ) // what rank the bots should be around, -1 is around the players, 0 is all random { - setDvar( "bots_loadout_rank", -1 ); + setdvar( "bots_loadout_rank", -1 ); } - if ( getDvar( "bots_loadout_codpoints" ) == "" ) // how much cod points a bot should have, -1 is around the players, 0 is all random + if ( getdvar( "bots_loadout_codpoints" ) == "" ) // how much cod points a bot should have, -1 is around the players, 0 is all random { - setDvar( "bots_loadout_codpoints", -1 ); + setdvar( "bots_loadout_codpoints", -1 ); } - if ( getDvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random + if ( getdvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random { - setDvar( "bots_loadout_prestige", -1 ); + setdvar( "bots_loadout_prestige", -1 ); } - if ( getDvar( "bots_play_target_other" ) == "" ) // bot target non play ents (vehicles) + if ( getdvar( "bots_play_target_other" ) == "" ) // bot target non play ents (vehicles) { - setDvar( "bots_play_target_other", true ); + setdvar( "bots_play_target_other", true ); } - if ( getDvar( "bots_play_killstreak" ) == "" ) // bot use killstreaks + if ( getdvar( "bots_play_killstreak" ) == "" ) // bot use killstreaks { - setDvar( "bots_play_killstreak", true ); + setdvar( "bots_play_killstreak", true ); } - if ( getDvar( "bots_play_nade" ) == "" ) // bots grenade + if ( getdvar( "bots_play_nade" ) == "" ) // bots grenade { - setDvar( "bots_play_nade", true ); + setdvar( "bots_play_nade", true ); } - if ( getDvar( "bots_play_knife" ) == "" ) // bots knife + if ( getdvar( "bots_play_knife" ) == "" ) // bots knife { - setDvar( "bots_play_knife", true ); + setdvar( "bots_play_knife", true ); } - if ( getDvar( "bots_play_fire" ) == "" ) // bots fire + if ( getdvar( "bots_play_fire" ) == "" ) // bots fire { - setDvar( "bots_play_fire", true ); + setdvar( "bots_play_fire", true ); } - if ( getDvar( "bots_play_move" ) == "" ) // bots move + if ( getdvar( "bots_play_move" ) == "" ) // bots move { - setDvar( "bots_play_move", true ); + setdvar( "bots_play_move", true ); } - if ( getDvar( "bots_play_take_carepackages" ) == "" ) // bots take carepackages + if ( getdvar( "bots_play_take_carepackages" ) == "" ) // bots take carepackages { - setDvar( "bots_play_take_carepackages", true ); + setdvar( "bots_play_take_carepackages", true ); } - if ( getDvar( "bots_play_obj" ) == "" ) // bots play the obj + if ( getdvar( "bots_play_obj" ) == "" ) // bots play the obj { - setDvar( "bots_play_obj", true ); + setdvar( "bots_play_obj", true ); } - if ( getDvar( "bots_play_camp" ) == "" ) // bots camp and follow + if ( getdvar( "bots_play_camp" ) == "" ) // bots camp and follow { - setDvar( "bots_play_camp", true ); + setdvar( "bots_play_camp", true ); } - if ( getDvar( "bots_play_aim" ) == "" ) + if ( getdvar( "bots_play_aim" ) == "" ) { - setDvar( "bots_play_aim", true ); + setdvar( "bots_play_aim", true ); } - if ( getDvar( "bots_play_jumpdrop" ) == "" ) // bots jump and dropshot + if ( getdvar( "bots_play_jumpdrop" ) == "" ) // bots jump and dropshot { - setDvar( "bots_play_jumpdrop", true ); + setdvar( "bots_play_jumpdrop", true ); } level.bots = []; level.bot_decoys = []; level.bot_planes = []; - if ( !isDefined( game[ "botWarfare" ] ) ) + if ( !isdefined( game[ "botWarfare" ] ) ) { game[ "botWarfare" ] = true; } @@ -221,9 +221,9 @@ handleBots() wait 0.05; } - setDvar( "bots_manage_add", getBotArray().size ); + setdvar( "bots_manage_add", getBotArray().size ); - if ( !getDvarInt( "bots_main_kickBotsAtEnd" ) ) + if ( !getdvarint( "bots_main_kickBotsAtEnd" ) ) { return; } @@ -232,7 +232,7 @@ handleBots() for ( i = 0; i < bots.size; i++ ) { - kick( bots[ i ] getEntityNumber() ); + kick( bots[ i ] getentitynumber() ); } } @@ -279,43 +279,43 @@ watchBotDebugEvent() { self waittill( "bot_event", msg, str, b, c, d, e, f, g ); - if ( GetDvarInt( "bots_main_debug" ) >= 2 ) + if ( getdvarint( "bots_main_debug" ) >= 2 ) { big_str = "Bot Warfare debug: " + self.name + ": " + msg + ": " + str; - if ( isDefined( b ) && isString( b ) ) + if ( isdefined( b ) && isstring( b ) ) { big_str += ": " + b; } - if ( isDefined( c ) && isString( c ) ) + if ( isdefined( c ) && isstring( c ) ) { big_str += ": " + c; } - if ( isDefined( d ) && isString( d ) ) + if ( isdefined( d ) && isstring( d ) ) { big_str += ": " + d; } - if ( isDefined( e ) && isString( e ) ) + if ( isdefined( e ) && isstring( e ) ) { big_str += ": " + e; } - if ( isDefined( f ) && isString( f ) ) + if ( isdefined( f ) && isstring( f ) ) { big_str += ": " + f; } - if ( isDefined( g ) && isString( g ) ) + if ( isdefined( g ) && isstring( g ) ) { big_str += ": " + g; } BotBuiltinPrintConsole( big_str ); } - else if ( msg == "debug" && GetDvarInt( "bots_main_debug" ) ) + else if ( msg == "debug" && getdvarint( "bots_main_debug" ) ) { BotBuiltinPrintConsole( "Bot Warfare debug: " + self.name + ": " + str ); } @@ -333,13 +333,13 @@ diffBots() // we dont use 'bots_skill' so that we can still use the .menu dvar - if ( getDvar( "bots_skill" ) != "" ) + if ( getdvar( "bots_skill" ) != "" ) { - SetDvar( "bot_difficulty", getDvar( "bots_skill" ) ); - setDvar( "bots_skill", "" ); + setdvar( "bot_difficulty", getdvar( "bots_skill" ) ); + setdvar( "bots_skill", "" ); } - bot_set_difficulty( GetDvar( #"bot_difficulty" ) ); + bot_set_difficulty( getdvar( #"bot_difficulty" ) ); } } @@ -348,63 +348,63 @@ diffBots() */ doNonDediBots() { - if ( !GetDvarInt( #"xblive_basictraining" ) ) + if ( !getdvarint( #"xblive_basictraining" ) ) { return; } - if ( isDefined( game[ "bots_spawned" ] ) ) + if ( isdefined( game[ "bots_spawned" ] ) ) { return; } game[ "bots_spawned" ] = true; - if ( getDvar( "bot_enemies_extra" ) == "" ) + if ( getdvar( "bot_enemies_extra" ) == "" ) { - setDvar( "bot_enemies_extra", 0 ); + setdvar( "bot_enemies_extra", 0 ); } - if ( getDvar( "bot_friends_extra" ) == "" ) + if ( getdvar( "bot_friends_extra" ) == "" ) { - setDvar( "bot_friends_extra", 0 ); + setdvar( "bot_friends_extra", 0 ); } - bot_friends = GetDvarInt( #"bot_friends" ); - bot_enemies = GetDvarInt( #"bot_enemies" ); + bot_friends = getdvarint( #"bot_friends" ); + bot_enemies = getdvarint( #"bot_enemies" ); - bot_enemies += GetDvarInt( "bot_enemies_extra" ); - bot_friends += GetDvarInt( "bot_friends_extra" ); + bot_enemies += getdvarint( "bot_enemies_extra" ); + bot_friends += getdvarint( "bot_friends_extra" ); bot_wait_for_host(); - host = GetHostPlayer(); + host = gethostplayer(); team = "allies"; - if ( isDefined( host ) && isDefined( host.pers[ "team" ] ) && ( host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis" ) ) + if ( isdefined( host ) && isdefined( host.pers[ "team" ] ) && ( host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis" ) ) { team = host.pers[ "team" ]; } - setDvar( "bots_manage_add", bot_enemies + bot_friends - 1 ); - setDvar( "bots_manage_fill", bot_enemies + bot_friends ); - setDvar( "bots_manage_fill_mode", 0 ); - setDvar( "bots_manage_fill_kick", true ); - setDvar( "bots_manage_fill_spec", false ); + setdvar( "bots_manage_add", bot_enemies + bot_friends - 1 ); + setdvar( "bots_manage_fill", bot_enemies + bot_friends ); + setdvar( "bots_manage_fill_mode", 0 ); + setdvar( "bots_manage_fill_kick", true ); + setdvar( "bots_manage_fill_spec", false ); - setDvar( "bots_team", "custom" ); + setdvar( "bots_team", "custom" ); if ( team == "axis" ) { - setDvar( "bots_team_amount", bot_friends ); + setdvar( "bots_team_amount", bot_friends ); } else { - setDvar( "bots_team_amount", bot_enemies ); + setdvar( "bots_team_amount", bot_enemies ); } - setDvar( "bots_team_force", true ); - setDvar( "bots_team_mode", 0 ); + setdvar( "bots_team_force", true ); + setdvar( "bots_team_mode", 0 ); } /* @@ -414,85 +414,85 @@ bot_set_difficulty( difficulty ) { if ( difficulty == "fu" ) { - SetDvar( "sv_botMinDeathTime", "250" ); - SetDvar( "sv_botMaxDeathTime", "500" ); - SetDvar( "sv_botMinFireTime", "100" ); - SetDvar( "sv_botMaxFireTime", "300" ); - SetDvar( "sv_botYawSpeed", "14" ); - SetDvar( "sv_botYawSpeedAds", "14" ); - SetDvar( "sv_botPitchUp", "-5" ); - SetDvar( "sv_botPitchDown", "10" ); - SetDvar( "sv_botFov", "160" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "100" ); - SetDvar( "sv_botMaxCrouchTime", "400" ); - SetDvar( "sv_botTargetLeadBias", "2" ); - SetDvar( "sv_botMinReactionTime", "30" ); - SetDvar( "sv_botMaxReactionTime", "100" ); - SetDvar( "sv_botStrafeChance", "1" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "512" ); - SetDvar( "sv_botAllowGrenades", "1" ); - SetDvar( "sv_botMinGrenadeTime", "1500" ); - SetDvar( "sv_botMaxGrenadeTime", "4000" ); - SetDvar( "sv_botSprintDistance", "512" ); - SetDvar( "sv_botMeleeDist", "80" ); + setdvar( "sv_botMinDeathTime", "250" ); + setdvar( "sv_botMaxDeathTime", "500" ); + setdvar( "sv_botMinFireTime", "100" ); + setdvar( "sv_botMaxFireTime", "300" ); + setdvar( "sv_botYawSpeed", "14" ); + setdvar( "sv_botYawSpeedAds", "14" ); + setdvar( "sv_botPitchUp", "-5" ); + setdvar( "sv_botPitchDown", "10" ); + setdvar( "sv_botFov", "160" ); + setdvar( "sv_botMinAdsTime", "3000" ); + setdvar( "sv_botMaxAdsTime", "5000" ); + setdvar( "sv_botMinCrouchTime", "100" ); + setdvar( "sv_botMaxCrouchTime", "400" ); + setdvar( "sv_botTargetLeadBias", "2" ); + setdvar( "sv_botMinReactionTime", "30" ); + setdvar( "sv_botMaxReactionTime", "100" ); + setdvar( "sv_botStrafeChance", "1" ); + setdvar( "sv_botMinStrafeTime", "3000" ); + setdvar( "sv_botMaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "512" ); + setdvar( "sv_botAllowGrenades", "1" ); + setdvar( "sv_botMinGrenadeTime", "1500" ); + setdvar( "sv_botMaxGrenadeTime", "4000" ); + setdvar( "sv_botSprintDistance", "512" ); + setdvar( "sv_botMeleeDist", "80" ); } else if ( difficulty == "hard" ) { - SetDvar( "sv_botMinDeathTime", "250" ); - SetDvar( "sv_botMaxDeathTime", "500" ); - SetDvar( "sv_botMinFireTime", "400" ); - SetDvar( "sv_botMaxFireTime", "600" ); - SetDvar( "sv_botYawSpeed", "8" ); - SetDvar( "sv_botYawSpeedAds", "10" ); - SetDvar( "sv_botPitchUp", "-5" ); - SetDvar( "sv_botPitchDown", "10" ); - SetDvar( "sv_botFov", "100" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "100" ); - SetDvar( "sv_botMaxCrouchTime", "400" ); - SetDvar( "sv_botTargetLeadBias", "2" ); - SetDvar( "sv_botMinReactionTime", "400" ); - SetDvar( "sv_botMaxReactionTime", "700" ); - SetDvar( "sv_botStrafeChance", "0.9" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "384" ); - SetDvar( "sv_botAllowGrenades", "1" ); - SetDvar( "sv_botMinGrenadeTime", "1500" ); - SetDvar( "sv_botMaxGrenadeTime", "4000" ); - SetDvar( "sv_botSprintDistance", "512" ); - SetDvar( "sv_botMeleeDist", "80" ); + setdvar( "sv_botMinDeathTime", "250" ); + setdvar( "sv_botMaxDeathTime", "500" ); + setdvar( "sv_botMinFireTime", "400" ); + setdvar( "sv_botMaxFireTime", "600" ); + setdvar( "sv_botYawSpeed", "8" ); + setdvar( "sv_botYawSpeedAds", "10" ); + setdvar( "sv_botPitchUp", "-5" ); + setdvar( "sv_botPitchDown", "10" ); + setdvar( "sv_botFov", "100" ); + setdvar( "sv_botMinAdsTime", "3000" ); + setdvar( "sv_botMaxAdsTime", "5000" ); + setdvar( "sv_botMinCrouchTime", "100" ); + setdvar( "sv_botMaxCrouchTime", "400" ); + setdvar( "sv_botTargetLeadBias", "2" ); + setdvar( "sv_botMinReactionTime", "400" ); + setdvar( "sv_botMaxReactionTime", "700" ); + setdvar( "sv_botStrafeChance", "0.9" ); + setdvar( "sv_botMinStrafeTime", "3000" ); + setdvar( "sv_botMaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "384" ); + setdvar( "sv_botAllowGrenades", "1" ); + setdvar( "sv_botMinGrenadeTime", "1500" ); + setdvar( "sv_botMaxGrenadeTime", "4000" ); + setdvar( "sv_botSprintDistance", "512" ); + setdvar( "sv_botMeleeDist", "80" ); } else if ( difficulty == "easy" ) { - SetDvar( "sv_botMinDeathTime", "1000" ); - SetDvar( "sv_botMaxDeathTime", "2000" ); - SetDvar( "sv_botMinFireTime", "900" ); - SetDvar( "sv_botMaxFireTime", "1000" ); - SetDvar( "sv_botYawSpeed", "2" ); - SetDvar( "sv_botYawSpeedAds", "2.5" ); - SetDvar( "sv_botPitchUp", "-20" ); - SetDvar( "sv_botPitchDown", "40" ); - SetDvar( "sv_botFov", "50" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "4000" ); - SetDvar( "sv_botMaxCrouchTime", "6000" ); - SetDvar( "sv_botTargetLeadBias", "8" ); - SetDvar( "sv_botMinReactionTime", "1200" ); - SetDvar( "sv_botMaxReactionTime", "1600" ); - SetDvar( "sv_botStrafeChance", "0.1" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "256" ); - SetDvar( "sv_botAllowGrenades", "0" ); - SetDvar( "sv_botSprintDistance", "1024" ); - SetDvar( "sv_botMeleeDist", "40" ); + setdvar( "sv_botMinDeathTime", "1000" ); + setdvar( "sv_botMaxDeathTime", "2000" ); + setdvar( "sv_botMinFireTime", "900" ); + setdvar( "sv_botMaxFireTime", "1000" ); + setdvar( "sv_botYawSpeed", "2" ); + setdvar( "sv_botYawSpeedAds", "2.5" ); + setdvar( "sv_botPitchUp", "-20" ); + setdvar( "sv_botPitchDown", "40" ); + setdvar( "sv_botFov", "50" ); + setdvar( "sv_botMinAdsTime", "3000" ); + setdvar( "sv_botMaxAdsTime", "5000" ); + setdvar( "sv_botMinCrouchTime", "4000" ); + setdvar( "sv_botMaxCrouchTime", "6000" ); + setdvar( "sv_botTargetLeadBias", "8" ); + setdvar( "sv_botMinReactionTime", "1200" ); + setdvar( "sv_botMaxReactionTime", "1600" ); + setdvar( "sv_botStrafeChance", "0.1" ); + setdvar( "sv_botMinStrafeTime", "3000" ); + setdvar( "sv_botMaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "256" ); + setdvar( "sv_botAllowGrenades", "0" ); + setdvar( "sv_botSprintDistance", "1024" ); + setdvar( "sv_botMeleeDist", "40" ); } else // 'normal' difficulty { @@ -501,53 +501,53 @@ bot_set_difficulty( difficulty ) return; } - SetDvar( "sv_botMinDeathTime", "500" ); - SetDvar( "sv_botMaxDeathTime", "1000" ); - SetDvar( "sv_botMinFireTime", "600" ); - SetDvar( "sv_botMaxFireTime", "800" ); - SetDvar( "sv_botYawSpeed", "4" ); - SetDvar( "sv_botYawSpeedAds", "5" ); - SetDvar( "sv_botPitchUp", "-10" ); - SetDvar( "sv_botPitchDown", "20" ); - SetDvar( "sv_botFov", "70" ); - SetDvar( "sv_botMinAdsTime", "3000" ); - SetDvar( "sv_botMaxAdsTime", "5000" ); - SetDvar( "sv_botMinCrouchTime", "2000" ); - SetDvar( "sv_botMaxCrouchTime", "4000" ); - SetDvar( "sv_botTargetLeadBias", "4" ); - SetDvar( "sv_botMinReactionTime", "800" ); - SetDvar( "sv_botMaxReactionTime", "1200" ); - SetDvar( "sv_botStrafeChance", "0.6" ); - SetDvar( "sv_botMinStrafeTime", "3000" ); - SetDvar( "sv_botMaxStrafeTime", "6000" ); - SetDvar( "scr_help_dist", "256" ); - SetDvar( "sv_botAllowGrenades", "1" ); - SetDvar( "sv_botMinGrenadeTime", "1500" ); - SetDvar( "sv_botMaxGrenadeTime", "4000" ); - SetDvar( "sv_botSprintDistance", "512" ); - SetDvar( "sv_botMeleeDist", "80" ); + setdvar( "sv_botMinDeathTime", "500" ); + setdvar( "sv_botMaxDeathTime", "1000" ); + setdvar( "sv_botMinFireTime", "600" ); + setdvar( "sv_botMaxFireTime", "800" ); + setdvar( "sv_botYawSpeed", "4" ); + setdvar( "sv_botYawSpeedAds", "5" ); + setdvar( "sv_botPitchUp", "-10" ); + setdvar( "sv_botPitchDown", "20" ); + setdvar( "sv_botFov", "70" ); + setdvar( "sv_botMinAdsTime", "3000" ); + setdvar( "sv_botMaxAdsTime", "5000" ); + setdvar( "sv_botMinCrouchTime", "2000" ); + setdvar( "sv_botMaxCrouchTime", "4000" ); + setdvar( "sv_botTargetLeadBias", "4" ); + setdvar( "sv_botMinReactionTime", "800" ); + setdvar( "sv_botMaxReactionTime", "1200" ); + setdvar( "sv_botStrafeChance", "0.6" ); + setdvar( "sv_botMinStrafeTime", "3000" ); + setdvar( "sv_botMaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "256" ); + setdvar( "sv_botAllowGrenades", "1" ); + setdvar( "sv_botMinGrenadeTime", "1500" ); + setdvar( "sv_botMaxGrenadeTime", "4000" ); + setdvar( "sv_botSprintDistance", "512" ); + setdvar( "sv_botMeleeDist", "80" ); difficulty = "normal"; } - if ( level.gameType == "oic" && difficulty == "fu" ) + if ( level.gametype == "oic" && difficulty == "fu" ) { - SetDvar( "sv_botMinReactionTime", "400" ); - SetDvar( "sv_botMaxReactionTime", "500" ); - SetDvar( "sv_botMinAdsTime", "1000" ); - SetDvar( "sv_botMaxAdsTime", "2000" ); + setdvar( "sv_botMinReactionTime", "400" ); + setdvar( "sv_botMaxReactionTime", "500" ); + setdvar( "sv_botMinAdsTime", "1000" ); + setdvar( "sv_botMaxAdsTime", "2000" ); } - if ( level.gameType == "oic" && ( difficulty == "hard" || difficulty == "fu" ) ) + if ( level.gametype == "oic" && ( difficulty == "hard" || difficulty == "fu" ) ) { - SetDvar( "sv_botSprintDistance", "256" ); + setdvar( "sv_botSprintDistance", "256" ); } - if ( !getDvarInt( "bots_play_nade" ) ) + if ( !getdvarint( "bots_play_nade" ) ) { - SetDvar( "sv_botAllowGrenades", "0" ); + setdvar( "sv_botAllowGrenades", "0" ); } - if ( !getDvarInt( "bots_play_aim" ) ) + if ( !getdvarint( "bots_play_aim" ) ) { setdvar( "sv_botYawSpeed", "0" ); setdvar( "sv_botYawSpeedAds", "0" ); @@ -555,9 +555,9 @@ bot_set_difficulty( difficulty ) setdvar( "sv_botPitchDown", "0" ); } - SetDvar( "bot_difficulty", difficulty ); - SetDvar( "scr_bot_difficulty", difficulty ); - SetDvar( "splitscreen_botDifficulty", difficulty ); + setdvar( "bot_difficulty", difficulty ); + setdvar( "scr_bot_difficulty", difficulty ); + setdvar( "splitscreen_botDifficulty", difficulty ); } /* @@ -565,8 +565,8 @@ bot_set_difficulty( difficulty ) */ teamBots_loop() { - teamAmount = getDvarInt( "bots_team_amount" ); - toTeam = getDvar( "bots_team" ); + teamAmount = getdvarint( "bots_team_amount" ); + toTeam = getdvar( "bots_team" ); alliesbots = 0; alliesplayers = 0; @@ -579,7 +579,7 @@ teamBots_loop() { player = level.players[ i ]; - if ( !isDefined( player.pers[ "team" ] ) ) + if ( !isdefined( player.pers[ "team" ] ) ) { continue; } @@ -611,7 +611,7 @@ teamBots_loop() allies = alliesbots; axis = axisbots; - if ( !getDvarInt( "bots_team_mode" ) ) + if ( !getdvarint( "bots_team_mode" ) ) { allies += alliesplayers; axis += axisplayers; @@ -619,7 +619,7 @@ teamBots_loop() if ( toTeam != "custom" ) { - if ( getDvarInt( "bots_team_force" ) ) + if ( getdvarint( "bots_team_force" ) ) { if ( toTeam == "autoassign" ) { @@ -642,7 +642,7 @@ teamBots_loop() { player = level.players[ i ]; - if ( !isDefined( player.pers[ "team" ] ) ) + if ( !isdefined( player.pers[ "team" ] ) ) { continue; } @@ -683,7 +683,7 @@ teamBots_loop() { player = level.players[ i ]; - if ( !isDefined( player.pers[ "team" ] ) ) + if ( !isdefined( player.pers[ "team" ] ) ) { continue; } @@ -735,11 +735,11 @@ teamBots() */ addBots_loop() { - botsToAdd = GetDvarInt( "bots_manage_add" ); + botsToAdd = getdvarint( "bots_manage_add" ); if ( botsToAdd > 0 ) { - SetDvar( "bots_manage_add", 0 ); + setdvar( "bots_manage_add", 0 ); if ( botsToAdd > 64 ) { @@ -753,14 +753,14 @@ addBots_loop() } } - fillMode = getDVarInt( "bots_manage_fill_mode" ); + fillMode = getdvarint( "bots_manage_fill_mode" ); if ( fillMode == 2 || fillMode == 3 ) { - setDvar( "bots_manage_fill", getGoodMapAmount() ); + setdvar( "bots_manage_fill", getGoodMapAmount() ); } - fillAmount = getDvarInt( "bots_manage_fill" ); + fillAmount = getdvarint( "bots_manage_fill" ); players = 0; bots = 0; @@ -781,7 +781,7 @@ addBots_loop() { bots++; } - else if ( !isDefined( player.pers[ "team" ] ) || ( player.pers[ "team" ] != "axis" && player.pers[ "team" ] != "allies" ) ) + else if ( !isdefined( player.pers[ "team" ] ) || ( player.pers[ "team" ] != "axis" && player.pers[ "team" ] != "allies" ) ) { spec++; } @@ -807,7 +807,7 @@ addBots_loop() continue; } - if ( !isDefined( player.pers[ "team" ] ) ) + if ( !isdefined( player.pers[ "team" ] ) ) { continue; } @@ -843,11 +843,11 @@ addBots_loop() bots = result; } - if ( !randomInt( 999 ) ) + if ( !randomint( 999 ) ) { - setDvar( "testclients_doreload", true ); + setdvar( "testclients_doreload", true ); wait 0.1; - setDvar( "testclients_doreload", false ); + setdvar( "testclients_doreload", false ); doExtraCheck(); } @@ -858,22 +858,22 @@ addBots_loop() amount += players; } - if ( getDVarInt( "bots_manage_fill_spec" ) ) + if ( getdvarint( "bots_manage_fill_spec" ) ) { amount += spec; } if ( amount < fillAmount ) { - setDvar( "bots_manage_add", 1 ); + setdvar( "bots_manage_add", 1 ); } - else if ( amount > fillAmount && getDvarInt( "bots_manage_fill_kick" ) ) + else if ( amount > fillAmount && getdvarint( "bots_manage_fill_kick" ) ) { tempBot = getBotToKick(); - if ( isDefined( tempBot ) ) + if ( isdefined( tempBot ) ) { - kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" ); + kick( tempBot getentitynumber(), "EXE_PLAYERKICKED" ); } } } @@ -931,12 +931,12 @@ bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHi */ bot_is_idle() { - if ( !IsDefined( self ) ) + if ( !isdefined( self ) ) { return false; } - if ( !IsAlive( self ) ) + if ( !isalive( self ) ) { return false; } @@ -951,22 +951,22 @@ bot_is_idle() return false; } - if ( self HasScriptGoal() ) + if ( self hasscriptgoal() ) { return false; } - if ( IsDefined( self GetThreat() ) ) + if ( isdefined( self getthreat() ) ) { return false; } - if ( self IsRemoteControlling() || self.bot_lock_goal ) + if ( self isremotecontrolling() || self.bot_lock_goal ) { return false; } - if ( self UseButtonPressed() ) + if ( self usebuttonpressed() ) { return false; } @@ -997,7 +997,7 @@ watch_grenade() { self waittill( "grenade_fire", g, name ); - if ( !isDefined( g ) ) + if ( !isdefined( g ) ) { continue; } @@ -1041,7 +1041,7 @@ watch_decoy( g ) } /* - Attach a trigger to the scrambler + attach a trigger to the scrambler */ watch_scrambler() { @@ -1060,7 +1060,7 @@ scramble_nearby( trig ) self endon( "death" ); self endon( "hacked" ); - while ( !isDefined( self.owner ) || !isDefined( self.owner.team ) ) + while ( !isdefined( self.owner ) || !isdefined( self.owner.team ) ) { wait 0.05; } @@ -1071,7 +1071,7 @@ scramble_nearby( trig ) { trig waittill( "trigger", player ); - if ( !isDefined( player ) || !isDefined( player.team ) ) + if ( !isdefined( player ) || !isdefined( player.team ) ) { continue; } @@ -1081,12 +1081,12 @@ scramble_nearby( trig ) continue; } - if ( isDefined( self.owner ) && player == self.owner ) + if ( isdefined( self.owner ) && player == self.owner ) { continue; } - if ( level.teamBased && self.team == player.team ) + if ( level.teambased && self.team == player.team ) { continue; } @@ -1106,7 +1106,7 @@ scramble_player() self.bot_scrambled = true; wait 0.1; - if ( isDefined( self ) ) + if ( isdefined( self ) ) { self.bot_scrambled = false; } @@ -1146,13 +1146,13 @@ doFiringThread() */ bot_watch_planes_loop() { - ents = GetEntArray( "script_model", "classname" ); + ents = getentarray( "script_model", "classname" ); for ( i = 0; i < ents.size; i++ ) { ent = ents[ i ]; - if ( isDefined( ent.bot_plane ) ) + if ( isdefined( ent.bot_plane ) ) { continue; } @@ -1221,13 +1221,13 @@ fixGamemodes() { for ( i = 0; i < 19; i++ ) { - if ( isDefined( level.bombZones ) && level.gametype == "sd" ) + if ( isdefined( level.bombzones ) && level.gametype == "sd" ) { - level.isKillBoosting = ::bot_killBoost; + level.iskillboosting = ::bot_killBoost; - for ( i = 0; i < level.bombZones.size; i++ ) + for ( i = 0; i < level.bombzones.size; i++ ) { - level.bombZones[ i ].onUse = ::bot_onUsePlantObjectFix; + level.bombzones[ i ].onuse = ::bot_onUsePlantObjectFix; } break; diff --git a/scripts/bots_adapter_pt5.gsc b/scripts/bots_adapter_pt5.gsc index 24b9fc4..aafacd4 100644 --- a/scripts/bots_adapter_pt5.gsc +++ b/scripts/bots_adapter_pt5.gsc @@ -19,75 +19,75 @@ init() do_printconsole( s ) { - PrintLn( s ); + println( s ); } do_botmovementoverride( a, b ) { - self botMovementOverride( a, b ); + self botmovementoverride( a, b ); } do_botclearmovementoverride() { - self botClearMovementOverride(); + self botclearmovementoverride(); } do_botclearbuttonoverride( a ) { - self botClearButtonOverride( a ); + self botclearbuttonoverride( a ); } do_botbuttonoverride( a, b ) { - self botButtonOverride( a, b ); + self botbuttonoverride( a, b ); } do_botclearoverrides( a ) { - self botClearOverrides( a ); + self botclearoverrides( a ); } do_botmantleoverride() { - self botMantleOverride(); + self botmantleoverride(); } do_botclearmantleoverride() { - self botClearMantleOverride(); + self botclearmantleoverride(); } do_botclearweaponoverride() { - self botClearWeaponOverride(); + self botclearweaponoverride(); } do_botweaponoverride( a ) { - self botWeaponOverride( a ); + self botweaponoverride( a ); } do_botclearbuttonoverrides() { - self botClearButtonOverrides(); + self botclearbuttonoverrides(); } do_botaimoverride() { - self botAimOverride(); + self botaimoverride(); } do_botclearaimoverride() { - self botClearAimOverride(); + self botclearaimoverride(); } do_botmeleeparams( yaw, dist ) { - // self botMeleeParams( yaw, dist ); + // self botmeleeparams( yaw, dist ); } do_clearbotmeleeparams() { - // self botClearMeleeParams(); + // self botclearmeleeparams(); }