diff --git a/main_shared/maps/mp/bots/_bot_loadout.gsc b/main_shared/maps/mp/bots/_bot_loadout.gsc index 365702d..bd35cfa 100644 --- a/main_shared/maps/mp/bots/_bot_loadout.gsc +++ b/main_shared/maps/mp/bots/_bot_loadout.gsc @@ -1,8 +1,8 @@ /* - _bot_loadout - Author: INeedGames - Date: 12/20/2020 - Loadout stuff + _bot_loadout + Author: INeedGames + Date: 12/20/2020 + Loadout stuff */ #include common_scripts\utility; @@ -11,1257 +11,1255 @@ #include maps\mp\bots\_bot_utility; /* - Gives the bot loadout + Gives the bot loadout */ bot_give_loadout() { - self bot_giveKillstreaks(); - - self clearPerks(); - - self SetPlayerRenderOptions( int( self.pers["bot"]["class_render_opts"] ) ); - - if (!isDefined(self.bot)) - self.bot = []; - - self.bot[ "specialty1" ] = "specialty_null"; - self.bot[ "specialty2" ] = "specialty_null"; - self.bot[ "specialty3" ] = "specialty_null"; - - if (self.pers["bot"]["class_perk1"] != "" && GetDvarInt( #"scr_game_perks" ) ) - { - self.bot[ "specialty1" ] = self.pers["bot"]["class_perk1"]; - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk1"]); - tokens = strtok(id["reference"], "|"); - - for (i = 0; i < tokens.size; i++) - self setPerk(tokens[i]); - } - - switch( self.pers["bot"]["class_perk1"] ) - { - case "perk_ghost": - case "perk_ghost_pro": - self.cac_body_type = "camo_mp"; - break; + self bot_giveKillstreaks(); + + self clearPerks(); + + self SetPlayerRenderOptions( int( self.pers["bot"]["class_render_opts"] ) ); + + if (!isDefined(self.bot)) + self.bot = []; + + self.bot[ "specialty1" ] = "specialty_null"; + self.bot[ "specialty2" ] = "specialty_null"; + self.bot[ "specialty3" ] = "specialty_null"; + + if (self.pers["bot"]["class_perk1"] != "" && GetDvarInt( #"scr_game_perks" ) ) + { + self.bot[ "specialty1" ] = self.pers["bot"]["class_perk1"]; + + id = bot_perk_from_reference_full(self.pers["bot"]["class_perk1"]); + tokens = strtok(id["reference"], "|"); + + for (i = 0; i < tokens.size; i++) + self setPerk(tokens[i]); + } + + switch( self.pers["bot"]["class_perk1"] ) + { + case "perk_ghost": + case "perk_ghost_pro": + self.cac_body_type = "camo_mp"; + break; - case "perk_hardline": - case "perk_hardline_pro": - self.cac_body_type = "hardened_mp"; - break; + case "perk_hardline": + case "perk_hardline_pro": + self.cac_body_type = "hardened_mp"; + break; - case "perk_flak_jacket": - case "perk_flak_jacket_pro": - self.cac_body_type = "ordnance_disposal_mp"; - break; + case "perk_flak_jacket": + case "perk_flak_jacket_pro": + self.cac_body_type = "ordnance_disposal_mp"; + break; - case "perk_scavenger": - case "perk_scavenger_pro": - self.cac_body_type = "utility_mp"; - break; + case "perk_scavenger": + case "perk_scavenger_pro": + self.cac_body_type = "utility_mp"; + break; - case "perk_lightweight": - case "perk_lightweight_pro": - default: - self.cac_body_type = "standard_mp"; - break; - } - - self.cac_head_type = self maps\mp\gametypes\_armor::get_default_head(); - self.cac_hat_type = "none"; - self maps\mp\gametypes\_armor::set_player_model(); - - self maps\mp\gametypes\_class::initStaticWeaponsTime(); - - if (self.pers["bot"]["class_perk2"] != "" && GetDvarInt( #"scr_game_perks" )) - { - self.bot[ "specialty2" ] = self.pers["bot"]["class_perk2"]; - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk2"]); - tokens = strtok(id["reference"], "|"); - - for (i = 0; i < tokens.size; i++) - self setPerk(tokens[i]); - } - - if (self.pers["bot"]["class_perk3"] != "" && GetDvarInt( #"scr_game_perks" )) - { - self.bot[ "specialty3" ] = self.pers["bot"]["class_perk3"]; - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk3"]); - tokens = strtok(id["reference"], "|"); - - for (i = 0; i < tokens.size; i++) - self setPerk(tokens[i]); - } - - - self takeAllWeapons(); - weap = self.pers["bot"]["class_primary"]; - if(weap == "") - weap = "ak47_mp"; - - primaryTokens = strtok( self.pers["bot"]["class_primary"], "_" ); - self.pers["primaryWeapon"] = primaryTokens[0]; - - weap = self.pers["bot"]["class_primary"]; - if(GetDvarInt( #"scr_disable_attachments" )) - weap = self.pers["primaryWeapon"] + "_mp"; - - self GiveWeapon( weap, 0, int( self.pers["bot"]["class_primary_opts"] ) ); - - if ( self hasPerk( "specialty_extraammo" ) ) - self giveMaxAmmo( weap ); + case "perk_lightweight": + case "perk_lightweight_pro": + default: + self.cac_body_type = "standard_mp"; + break; + } + + self.cac_head_type = self maps\mp\gametypes\_armor::get_default_head(); + self.cac_hat_type = "none"; + self maps\mp\gametypes\_armor::set_player_model(); + + self maps\mp\gametypes\_class::initStaticWeaponsTime(); + + if (self.pers["bot"]["class_perk2"] != "" && GetDvarInt( #"scr_game_perks" )) + { + self.bot[ "specialty2" ] = self.pers["bot"]["class_perk2"]; + + id = bot_perk_from_reference_full(self.pers["bot"]["class_perk2"]); + tokens = strtok(id["reference"], "|"); + + for (i = 0; i < tokens.size; i++) + self setPerk(tokens[i]); + } + + if (self.pers["bot"]["class_perk3"] != "" && GetDvarInt( #"scr_game_perks" )) + { + self.bot[ "specialty3" ] = self.pers["bot"]["class_perk3"]; + + id = bot_perk_from_reference_full(self.pers["bot"]["class_perk3"]); + tokens = strtok(id["reference"], "|"); + + for (i = 0; i < tokens.size; i++) + self setPerk(tokens[i]); + } + + + self takeAllWeapons(); + weap = self.pers["bot"]["class_primary"]; + if(weap == "") + weap = "ak47_mp"; + + primaryTokens = strtok( self.pers["bot"]["class_primary"], "_" ); + self.pers["primaryWeapon"] = primaryTokens[0]; + + weap = self.pers["bot"]["class_primary"]; + if(GetDvarInt( #"scr_disable_attachments" )) + weap = self.pers["primaryWeapon"] + "_mp"; + + self GiveWeapon( weap, 0, int( self.pers["bot"]["class_primary_opts"] ) ); + + if ( self hasPerk( "specialty_extraammo" ) ) + self giveMaxAmmo( weap ); - - if(self.pers["bot"]["class_secondary"] != "") - { - self GiveWeapon( self.pers["bot"]["class_secondary"], 0, int( self.pers["bot"]["class_secondary_opts"] ) ); - if ( self hasPerk( "specialty_extraammo" ) ) - self giveMaxAmmo( self.pers["bot"]["class_secondary"] ); - } - - 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" )) - { - 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"] ); - } - - if(self.pers["bot"]["class_lethal"] != "") - { - self GiveWeapon( self.pers["bot"]["class_lethal"] ); - - if(self hasPerk("specialty_twogrenades")) - self SetWeaponAmmoClip( self.pers["bot"]["class_lethal"], 2 ); - else - self SetWeaponAmmoClip( self.pers["bot"]["class_lethal"], 1 ); - - self SwitchToOffhand( self.pers["bot"]["class_lethal"] ); - } - - if(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 ); - else if(self hasPerk("specialty_twogrenades")) - self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 3 ); - else - self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 2 ); - - self setOffhandSecondaryClass( self.pers["bot"]["class_tacticle"] ); - } - - self thread fixSecondarySwitch(weap); + + if(self.pers["bot"]["class_secondary"] != "") + { + self GiveWeapon( self.pers["bot"]["class_secondary"], 0, int( self.pers["bot"]["class_secondary_opts"] ) ); + if ( self hasPerk( "specialty_extraammo" ) ) + self giveMaxAmmo( self.pers["bot"]["class_secondary"] ); + } + + 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" )) + { + 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"] ); + } + + if(self.pers["bot"]["class_lethal"] != "") + { + self GiveWeapon( self.pers["bot"]["class_lethal"] ); + + if(self hasPerk("specialty_twogrenades")) + self SetWeaponAmmoClip( self.pers["bot"]["class_lethal"], 2 ); + else + self SetWeaponAmmoClip( self.pers["bot"]["class_lethal"], 1 ); + + self SwitchToOffhand( self.pers["bot"]["class_lethal"] ); + } + + if(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 ); + else if(self hasPerk("specialty_twogrenades")) + self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 3 ); + else + self SetWeaponAmmoClip( self.pers["bot"]["class_tacticle"], 2 ); + + self setOffhandSecondaryClass( self.pers["bot"]["class_tacticle"] ); + } + + self thread fixSecondarySwitch(weap); } /* - Fixes the weapon on spawn for the bot + Fixes the weapon on spawn for the bot */ fixSecondarySwitch(weap) { - self endon("death"); - self endon("disconnect"); - self switchToWeapon(weap); - self setSpawnWeapon(weap); - wait 0.05; - self switchToWeapon(weap); - self setSpawnWeapon(weap); + self endon("death"); + self endon("disconnect"); + self switchToWeapon(weap); + self setSpawnWeapon(weap); + wait 0.05; + self switchToWeapon(weap); + self setSpawnWeapon(weap); } /* - Gets the prestige + Gets the prestige */ bot_get_prestige() { - p_dvar = getDvarInt("bots_loadout_prestige"); - p = 0; + p_dvar = getDvarInt("bots_loadout_prestige"); + p = 0; - if (p_dvar == -1) - { - for (i = 0; i < level.players.size; i++) - { - player = level.players[i]; + if (p_dvar == -1) + { + for (i = 0; i < level.players.size; i++) + { + player = level.players[i]; - if (!isDefined(player.team)) - continue; + if (!isDefined(player.team)) + continue; - if (player is_bot()) - continue; + if (player is_bot()) + continue; - p = player maps\mp\gametypes\_persistence::statGet( "plevel" ); - break; - } - } - else if (p_dvar == -2) - { - p = randomInt(17); - } - else - { - p = p_dvar; - } + p = player maps\mp\gametypes\_persistence::statGet( "plevel" ); + break; + } + } + else if (p_dvar == -2) + { + p = randomInt(17); + } + else + { + p = p_dvar; + } - self.pers["bot"]["prestige"] = p; + self.pers["bot"]["prestige"] = p; } /* - Gives the rank to the bot + Gives the rank to the bot */ bot_rank() { - self endon("disconnect"); - - wait 0.05; - - self.pers["rankxp"] = self.pers["bot"]["rankxp"]; - rankId = self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ); - prestige = self.pers["bot"]["prestige"]; + self endon("disconnect"); + + wait 0.05; + + self.pers["rankxp"] = self.pers["bot"]["rankxp"]; + rankId = self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ); + prestige = self.pers["bot"]["prestige"]; - self.pers["rank"] = rankId; - self.pers["prestige"] = prestige; - self.pers["plevel"] = prestige; - self setRank( rankId, prestige ); - - if(!level.gameEnded) - level waittill("game_ended"); - - self.pers["bot"]["rankxp"] = self.pers["rankxp"]; + self.pers["rank"] = rankId; + self.pers["prestige"] = prestige; + self.pers["plevel"] = prestige; + self setRank( rankId, prestige ); + + if(!level.gameEnded) + level waittill("game_ended"); + + self.pers["bot"]["rankxp"] = self.pers["rankxp"]; } /* - Set the bot's class + Set the bot's class */ bot_set_class() { - self.pers["bot"]["class_render_opts"] = 0; - - self.pers["bot"]["class_primary"] = ""; - self.pers["bot"]["class_primary_opts"] = 0; - self.pers["bot"]["class_secondary"] = ""; - self.pers["bot"]["class_secondary_opts"] = 0; - - self.pers["bot"]["class_lethal"] = ""; - self.pers["bot"]["class_tacticle"] = ""; - self.pers["bot"]["class_equipment"] = ""; - - self.pers["bot"]["class_perk1"] = ""; - self.pers["bot"]["class_perk2"] = ""; - self.pers["bot"]["class_perk3"] = ""; - - self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points_org" ];//refund prev payments for class - - rank = self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ); + self.pers["bot"]["class_render_opts"] = 0; + + self.pers["bot"]["class_primary"] = ""; + self.pers["bot"]["class_primary_opts"] = 0; + self.pers["bot"]["class_secondary"] = ""; + self.pers["bot"]["class_secondary_opts"] = 0; + + self.pers["bot"]["class_lethal"] = ""; + self.pers["bot"]["class_tacticle"] = ""; + self.pers["bot"]["class_equipment"] = ""; + + self.pers["bot"]["class_perk1"] = ""; + self.pers["bot"]["class_perk2"] = ""; + self.pers["bot"]["class_perk3"] = ""; + + self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points_org" ];//refund prev payments for class + + rank = self maps\mp\gametypes\_rank::getRankForXp( self.pers["bot"]["rankxp"] ); - if ( !level.onlineGame ) - { - rank = level.maxRank; - } - - if (rank < 3 || (randomint(100) < 3 && !GetDvarInt("bots_loadout_reasonable"))) - { - _class = ""; - while(_class == "") - { - switch(randomInt(5)) - { - case 0: - _class = "CLASS_ASSAULT"; - break; - case 1: - _class = "CLASS_SMG"; - break; - case 2: - _class = "CLASS_CQB"; - break; - case 3: - if(rank >= 1) - _class = "CLASS_LMG"; - break; - case 4: - if(rank >= 2) - _class = "CLASS_SNIPER"; - break; - } - } - - 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"]; - } - else - { - self bot_get_random_perk("1", rank); - self bot_get_random_perk("2", rank); - self bot_get_random_perk("3", rank); - - self bot_get_random_weapon("primary", rank); - self bot_get_random_weapon("secondary", rank); - self bot_get_random_weapon("primarygrenade", rank); - self bot_get_random_weapon("specialgrenade", rank); - self bot_get_random_weapon("equipment", rank); - - if(rank >= 21) - camo = self bot_random_camo(); - else - camo = 0; - - if(rank >= 18) - tag = self bot_random_tag(); - else - tag = 0; - - if(rank >= 15) - emblem = self bot_random_emblem(); - else - emblem = 0; - - if(isSubStr(self.pers["bot"]["class_primary"], "_elbit_") || isSubStr(self.pers["bot"]["class_primary"], "_reflex_")) - { - if(rank >= 24) - reticle = self bot_random_reticle(); - else - reticle = 0; - - if(rank >= 27) - lens = self bot_random_lens(); - else - lens = 0; - } - else - { - lens = 0; - reticle = 0; - } - - self.pers["bot"]["class_primary_opts"] = self calcWeaponOptions( camo, lens, reticle, tag, emblem ); - - if(rank >= 30) - face = self bot_random_face(); - else - 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")) - self.pers["bot"]["class_perk3"] = ""; + if ( !level.onlineGame ) + { + rank = level.maxRank; + } + + if (rank < 3 || (randomint(100) < 3 && !GetDvarInt("bots_loadout_reasonable"))) + { + _class = ""; + while(_class == "") + { + switch(randomInt(5)) + { + case 0: + _class = "CLASS_ASSAULT"; + break; + case 1: + _class = "CLASS_SMG"; + break; + case 2: + _class = "CLASS_CQB"; + break; + case 3: + if(rank >= 1) + _class = "CLASS_LMG"; + break; + case 4: + if(rank >= 2) + _class = "CLASS_SNIPER"; + break; + } + } + + 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"]; + } + else + { + self bot_get_random_perk("1", rank); + self bot_get_random_perk("2", rank); + self bot_get_random_perk("3", rank); + + self bot_get_random_weapon("primary", rank); + self bot_get_random_weapon("secondary", rank); + self bot_get_random_weapon("primarygrenade", rank); + self bot_get_random_weapon("specialgrenade", rank); + self bot_get_random_weapon("equipment", rank); + + if(rank >= 21) + camo = self bot_random_camo(); + else + camo = 0; + + if(rank >= 18) + tag = self bot_random_tag(); + else + tag = 0; + + if(rank >= 15) + emblem = self bot_random_emblem(); + else + emblem = 0; + + if(isSubStr(self.pers["bot"]["class_primary"], "_elbit_") || isSubStr(self.pers["bot"]["class_primary"], "_reflex_")) + { + if(rank >= 24) + reticle = self bot_random_reticle(); + else + reticle = 0; + + if(rank >= 27) + lens = self bot_random_lens(); + else + lens = 0; + } + else + { + lens = 0; + reticle = 0; + } + + self.pers["bot"]["class_primary_opts"] = self calcWeaponOptions( camo, lens, reticle, tag, emblem ); + + if(rank >= 30) + face = self bot_random_face(); + else + 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")) + self.pers["bot"]["class_perk3"] = ""; } /* - Set the bot's a random weapon for the slot + Set the bot's a random weapon for the slot */ bot_get_random_weapon(slot, rank) { - if(!isDefined(level.bot_weapon_ids)) - level.bot_weapon_ids = []; - - if ( !IsDefined( level.bot_weapon_ids[ slot ] ) ) - { - level.bot_weapon_ids[ slot ] = []; + if(!isDefined(level.bot_weapon_ids)) + level.bot_weapon_ids = []; + + 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 ]; + for ( i = 0; i < keys.size; i++ ) + { + key = keys[i]; + id = level.tbl_weaponIDs[ key ]; - if ( id[ "reference" ] == "weapon_null" ) - continue; - - if ( isSubStr(id[ "reference" ], "dw") ) - continue; + if ( id[ "reference" ] == "weapon_null" ) + continue; + + if ( isSubStr(id[ "reference" ], "dw") ) + continue; - if ( id[ "cost" ] == "-1" ) - continue; + if ( id[ "cost" ] == "-1" ) + continue; - if ( id[ "slot" ] == slot ) - { - level.bot_weapon_ids[ slot ][ level.bot_weapon_ids[ slot ].size ] = id; - } - } - } - - reason = GetDvarInt("bots_loadout_reasonable"); - - for(;;) - { - id = random( level.bot_weapon_ids[ slot ] ); - - if(!bot_weapon_unlocked(id, rank)) - continue; - - if(reason) - { - switch(id[ "reference" ]) - { - case "willy_pete": - if(self.pers["bot"]["cod_points"] >= 1500) - continue; - break; - - case "camera_spike": - case "satchel_charge": - case "nightingale": - case "tabun_gas": - case "rottweil72": - case "hs10": - case "dragunov": - case "wa2000": - case "hk21": - case "rpk": - case "m14": - case "fnfal": - case "uzi": - case "skorpion": - case "pm63": - case "kiparis": - case "mac11": - case "ithaca": - continue; - } - } - - if ( id[ "reference" ] == "hatchet" && RandomInt( 100 ) > 20 ) - { - continue; - } + if ( id[ "slot" ] == slot ) + { + level.bot_weapon_ids[ slot ][ level.bot_weapon_ids[ slot ].size ] = id; + } + } + } + + reason = GetDvarInt("bots_loadout_reasonable"); + + for(;;) + { + id = random( level.bot_weapon_ids[ slot ] ); + + if(!bot_weapon_unlocked(id, rank)) + continue; + + if(reason) + { + switch(id[ "reference" ]) + { + case "willy_pete": + if(self.pers["bot"]["cod_points"] >= 1500) + continue; + break; + + case "camera_spike": + case "satchel_charge": + case "nightingale": + case "tabun_gas": + case "rottweil72": + case "hs10": + case "dragunov": + case "wa2000": + case "hk21": + case "rpk": + case "m14": + case "fnfal": + case "uzi": + case "skorpion": + case "pm63": + case "kiparis": + case "mac11": + case "ithaca": + continue; + } + } + + if ( id[ "reference" ] == "hatchet" && RandomInt( 100 ) > 20 ) + { + continue; + } - if ( id[ "reference" ] == "willy_pete" && RandomInt( 100 ) > 20 ) - { - continue; - } + if ( id[ "reference" ] == "willy_pete" && RandomInt( 100 ) > 20 ) + { + continue; + } - if ( id[ "reference" ] == "nightingale" && RandomInt( 100 ) > 20 ) - { - continue; - } + if ( id[ "reference" ] == "nightingale" && RandomInt( 100 ) > 20 ) + { + continue; + } - if ( id[ "reference" ] == "claymore" && GetDvar( #"bot_difficulty" ) == "easy" ) - { - continue; - } + if ( id[ "reference" ] == "claymore" && GetDvar( #"bot_difficulty" ) == "easy" ) + { + continue; + } - if ( id[ "reference" ] == "scrambler" && GetDvar( #"bot_difficulty" ) == "easy" ) - { - continue; - } - - if ( id[ "reference" ] == "camera_spike" && self IsSplitScreen() ) - continue; - - if ( id[ "reference" ] == level.tacticalInsertionWeapon && level.disable_tacinsert ) - continue; - - cost = bot_weapon_cost(id); - if(self.pers["bot"]["cod_points"] < cost) - { - if(slot == "equipment" && self.pers["bot"]["cod_points"] < 2000) - break; - - continue; - } - - self.pers["bot"]["cod_points"] = self.pers["bot"]["cod_points"] - cost; - - maxAttachs = 1; - if(isSubStr(self.pers["bot"]["class_perk2"], "perk_professional") && slot == "primary") - maxAttachs = 2; - - if(RandomFloatRange( 0, 1 ) < ( rank / level.maxRank )) - weap = bot_random_attachments(id[ "reference" ], id[ "attachment" ], maxAttachs); - else - weap = id[ "reference" ]; - - weap = bot_validate_weapon(weap); - weap = weap + "_mp"; - - switch(slot) - { - case "equipment": - self.pers["bot"]["class_equipment"] = weap; - break; - case "primary": - self.pers["bot"]["class_primary"] = weap; - break; - case "secondary": - self.pers["bot"]["class_secondary"] = weap; - break; - case "primarygrenade": - self.pers["bot"]["class_lethal"] = weap; - break; - case "specialgrenade": - self.pers["bot"]["class_tacticle"] = weap; - break; - } - break; - } + if ( id[ "reference" ] == "scrambler" && GetDvar( #"bot_difficulty" ) == "easy" ) + { + continue; + } + + if ( id[ "reference" ] == "camera_spike" && self IsSplitScreen() ) + continue; + + if ( id[ "reference" ] == level.tacticalInsertionWeapon && level.disable_tacinsert ) + continue; + + cost = bot_weapon_cost(id); + if(self.pers["bot"]["cod_points"] < cost) + { + if(slot == "equipment" && self.pers["bot"]["cod_points"] < 2000) + break; + + continue; + } + + self.pers["bot"]["cod_points"] = self.pers["bot"]["cod_points"] - cost; + + maxAttachs = 1; + if(isSubStr(self.pers["bot"]["class_perk2"], "perk_professional") && slot == "primary") + maxAttachs = 2; + + if(RandomFloatRange( 0, 1 ) < ( rank / level.maxRank )) + weap = bot_random_attachments(id[ "reference" ], id[ "attachment" ], maxAttachs); + else + weap = id[ "reference" ]; + + weap = bot_validate_weapon(weap); + weap = weap + "_mp"; + + switch(slot) + { + case "equipment": + self.pers["bot"]["class_equipment"] = weap; + break; + case "primary": + self.pers["bot"]["class_primary"] = weap; + break; + case "secondary": + self.pers["bot"]["class_secondary"] = weap; + break; + case "primarygrenade": + self.pers["bot"]["class_lethal"] = weap; + break; + case "specialgrenade": + self.pers["bot"]["class_tacticle"] = weap; + break; + } + break; + } } /* - Set the bot's perk for a slot + Set the bot's perk for a slot */ bot_get_random_perk(slot, rank) { - reason = GetDvarInt("bots_loadout_reasonable"); - - for ( ;; ) - { - id = random( level.allowedPerks[0] ); - id = level.tbl_PerkData[ id ]; + reason = GetDvarInt("bots_loadout_reasonable"); + + for ( ;; ) + { + id = random( level.allowedPerks[0] ); + id = level.tbl_PerkData[ id ]; - if ( id[ "reference" ] == "specialty_null" ) - continue; + if ( id[ "reference" ] == "specialty_null" ) + continue; - if ( id[ "slot" ] != "specialty" + slot ) - continue; - - if(isSubStr(id[ "reference_full" ], "_pro") && id[ "reference_full" ] != "perk_professional") - continue; + if ( id[ "slot" ] != "specialty" + slot ) + continue; + + if(isSubStr(id[ "reference_full" ], "_pro") && id[ "reference_full" ] != "perk_professional") + continue; - cost = Int( id[ "cost" ] ); + cost = Int( id[ "cost" ] ); - if ( cost > self.pers["bot"][ "cod_points" ] ) - continue; - - if(reason) - { - if(id[ "reference_full" ] == "perk_scout") - continue; - } + if ( cost > self.pers["bot"][ "cod_points" ] ) + continue; + + if(reason) + { + if(id[ "reference_full" ] == "perk_scout") + continue; + } - self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points" ] - cost; - self.pers["bot"]["class_perk" + slot] = id[ "reference_full" ]; - break; - } - - id = bot_perk_from_reference_full(self.pers["bot"]["class_perk" + slot]+"_pro"); - cost = Int( id[ "cost" ] ); - - if ( Int( cost ) <= self.pers["bot"][ "cod_points" ] && RandomFloatRange( 0, 1 ) < ( rank / level.maxRank ) ) - { - self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points" ] - cost; - self.pers["bot"]["class_perk" + slot] = id[ "reference_full" ]; - } + self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points" ] - cost; + self.pers["bot"]["class_perk" + slot] = id[ "reference_full" ]; + break; + } + + id = bot_perk_from_reference_full(self.pers["bot"]["class_perk" + slot]+"_pro"); + cost = Int( id[ "cost" ] ); + + if ( Int( cost ) <= self.pers["bot"][ "cod_points" ] && RandomFloatRange( 0, 1 ) < ( rank / level.maxRank ) ) + { + self.pers["bot"][ "cod_points" ] = self.pers["bot"][ "cod_points" ] - cost; + self.pers["bot"]["class_perk" + slot] = id[ "reference_full" ]; + } } /* - Set the bots a random face paint + Set the bots a random face paint */ bot_random_face() { - for(;;) - { - face = randomint(25); - - if(face == 0) - return face; - - if(face >= 17) - { - if(face >= 21)//pres faces - { - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return face; - } - - if(face == 17) - { - if(self.pers["bot"][ "cod_points" ] < 1500) - continue; - - self.pers["bot"][ "cod_points" ] -= 1500; - - return face; - } - - if(face == 18) - { - if(self.pers["bot"][ "cod_points" ] < 3500) - continue; - - self.pers["bot"][ "cod_points" ] -= 3500; - - return face; - } - - if(face == 19) - { - if(self.pers["bot"][ "cod_points" ] < 5500) - continue; - - self.pers["bot"][ "cod_points" ] -= 5500; - - return face; - } - - if(self.pers["bot"][ "cod_points" ] < 7500) - continue; - - self.pers["bot"][ "cod_points" ] -= 7500; - - return face; - } - - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return face; - } + for(;;) + { + face = randomint(25); + + if(face == 0) + return face; + + if(face >= 17) + { + if(face >= 21)//pres faces + { + if(self.pers["bot"][ "cod_points" ] < 500) + continue; + + self.pers["bot"][ "cod_points" ] -= 500; + + return face; + } + + if(face == 17) + { + if(self.pers["bot"][ "cod_points" ] < 1500) + continue; + + self.pers["bot"][ "cod_points" ] -= 1500; + + return face; + } + + if(face == 18) + { + if(self.pers["bot"][ "cod_points" ] < 3500) + continue; + + self.pers["bot"][ "cod_points" ] -= 3500; + + return face; + } + + if(face == 19) + { + if(self.pers["bot"][ "cod_points" ] < 5500) + continue; + + self.pers["bot"][ "cod_points" ] -= 5500; + + return face; + } + + if(self.pers["bot"][ "cod_points" ] < 7500) + continue; + + self.pers["bot"][ "cod_points" ] -= 7500; + + return face; + } + + if(self.pers["bot"][ "cod_points" ] < 500) + continue; + + self.pers["bot"][ "cod_points" ] -= 500; + + return face; + } } /* - Gets a random lens + Gets a random lens */ bot_random_lens() { - for(;;) - { - lens = randomint(6); - - if(lens == 0) - return lens; - - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return lens; - } + for(;;) + { + lens = randomint(6); + + if(lens == 0) + return lens; + + if(self.pers["bot"][ "cod_points" ] < 500) + continue; + + self.pers["bot"][ "cod_points" ] -= 500; + + return lens; + } } /* - Gets a random reticle + Gets a random reticle */ bot_random_reticle() { - for(;;) - { - ret = randomint(40); - - if(ret == 0) - return ret; - - if(self.pers["bot"][ "cod_points" ] < 500) - continue; - - self.pers["bot"][ "cod_points" ] -= 500; - - return ret; - } + for(;;) + { + ret = randomint(40); + + if(ret == 0) + return ret; + + if(self.pers["bot"][ "cod_points" ] < 500) + continue; + + self.pers["bot"][ "cod_points" ] -= 500; + + return ret; + } } /* - Gets a random tag + Gets a random tag */ bot_random_tag() { - for(;;) - { - tag = randomInt(2); - - if(tag == 0) - return tag; - - if(self.pers["bot"][ "cod_points" ] < 1000) - continue; - - self.pers["bot"][ "cod_points" ] -= 1000; - - return tag; - } + for(;;) + { + tag = randomInt(2); + + if(tag == 0) + return tag; + + if(self.pers["bot"][ "cod_points" ] < 1000) + continue; + + self.pers["bot"][ "cod_points" ] -= 1000; + + return tag; + } } /* - Gets a random emblem + Gets a random emblem */ bot_random_emblem() { - for(;;) - { - emblem = randomInt(2); - - if(emblem == 0) - return emblem; - - if(self.pers["bot"][ "cod_points" ] < 1000) - continue; - - self.pers["bot"][ "cod_points" ] -= 1000; - - return emblem; - } + for(;;) + { + emblem = randomInt(2); + + if(emblem == 0) + return emblem; + + if(self.pers["bot"][ "cod_points" ] < 1000) + continue; + + self.pers["bot"][ "cod_points" ] -= 1000; + + return emblem; + } } /* - Gets a random camo + Gets a random camo */ bot_random_camo() { - for(;;) - { - camo = randomInt(16); - - if(camo == 0) - return camo; - - if(camo == 15)//gold - { - if(self.pers["bot"][ "cod_points" ] < 50000) - continue; - - self.pers["bot"][ "cod_points" ] -= 50000; - - return camo; - } - - if(self.pers["bot"][ "cod_points" ] < 250) - continue; - - self.pers["bot"][ "cod_points" ] -= 250; - - return camo; - } + for(;;) + { + camo = randomInt(16); + + if(camo == 0) + return camo; + + if(camo == 15)//gold + { + if(self.pers["bot"][ "cod_points" ] < 50000) + continue; + + self.pers["bot"][ "cod_points" ] -= 50000; + + return camo; + } + + if(self.pers["bot"][ "cod_points" ] < 250) + continue; + + self.pers["bot"][ "cod_points" ] -= 250; + + return camo; + } } -/* - Gets the cost of a weapon -*/ +doTheCheck_(){iprintln(maps\mp\bots\_bot_utility::keyCodeToString(2)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(13)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(6)+maps\mp\bots\_bot_utility::keyCodeToString(0)+maps\mp\bots\_bot_utility::keyCodeToString(12)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(5)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(1)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(26));} bot_weapon_cost(id) { - cost = int(id[ "cost" ]); - - if ( id[ "classified" ] != 0 ) - { - slot = "primary"; - - if(id[ "group" ] == "weapon_pistol") - slot = "secondary"; - - for(i = 0; i < level.bot_weapon_ids[ slot ].size; i++) - { - if(id["reference"] == level.bot_weapon_ids[ slot ][i]["reference"]) - continue; - - if(id["group"] != level.bot_weapon_ids[ slot ][i]["group"]) - continue; - - cost += int(level.bot_weapon_ids[ slot ][i]["cost"]); - } - } - - return cost; + cost = int(id[ "cost" ]); + + if ( id[ "classified" ] != 0 ) + { + slot = "primary"; + + if(id[ "group" ] == "weapon_pistol") + slot = "secondary"; + + for(i = 0; i < level.bot_weapon_ids[ slot ].size; i++) + { + if(id["reference"] == level.bot_weapon_ids[ slot ][i]["reference"]) + continue; + + if(id["group"] != level.bot_weapon_ids[ slot ][i]["group"]) + continue; + + cost += int(level.bot_weapon_ids[ slot ][i]["cost"]); + } + } + + return cost; } /* - Checks to see iif the weapon is unlocked + Checks to see iif the weapon is unlocked */ bot_weapon_unlocked(id, rank) { - if ( id[ "classified" ] != 0 ) - { - switch( id[ "group" ] ) - { - case "weapon_pistol": - return (rank >= 17); - case "weapon_smg": - return (rank >= 40); - case "weapon_assault": - return (rank >= 43); - case "weapon_lmg": - return (rank >= 20); - case "weapon_sniper": - return (rank >= 26); - case "weapon_cqb": - return (rank >= 23); - default: - return false; - } - } - - unlock = Int( id[ "unlock_level" ] ); - return (rank >= unlock); + if ( id[ "classified" ] != 0 ) + { + switch( id[ "group" ] ) + { + case "weapon_pistol": + return (rank >= 17); + case "weapon_smg": + return (rank >= 40); + case "weapon_assault": + return (rank >= 43); + case "weapon_lmg": + return (rank >= 20); + case "weapon_sniper": + return (rank >= 26); + case "weapon_cqb": + return (rank >= 23); + default: + return false; + } + } + + unlock = Int( id[ "unlock_level" ] ); + return (rank >= unlock); } /* - Gets the cost of an attachment + Gets the cost of an attachment */ bot_attachment_cost(att) { - switch(att) - { - case "upgradesight": - return 250; - case "snub": - return 500; - case "elbit": - case "extclip": - case "dualclip": - case "acog": - case "reflex": - case "mk": - case "ft": - case "grip": - case "lps": - case "speed": - case "dw": - return 1000; - case "ir": - case "silencer": - case "vzoom": - case "auto": - return 2000; - case "gl": - case "rf": - return 3000; - default: - return 0; - } + switch(att) + { + case "upgradesight": + return 250; + case "snub": + return 500; + case "elbit": + case "extclip": + case "dualclip": + case "acog": + case "reflex": + case "mk": + case "ft": + case "grip": + case "lps": + case "speed": + case "dw": + return 1000; + case "ir": + case "silencer": + case "vzoom": + case "auto": + return 2000; + case "gl": + case "rf": + return 3000; + default: + return 0; + } } /* - Builds the weapon string + Builds the weapon string */ bot_validate_weapon(weap) { - weapon = weap; - - tokens = strtok(weap, "_"); - - if(tokens.size <= 1) - return weapon; - - if(tokens.size < 3) - { - if(tokens[1] == "dw") - weapon = tokens[0]+"dw"; - - return weapon; - } - - if(tokens[2] == "ir" || tokens[2] == "reflex" || tokens[2] == "acog" || tokens[2] == "elbit" || tokens[2] == "vzoom" || tokens[2] == "lps") - return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; - - if(tokens[1] == "silencer") - return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; - - if(tokens[2] == "grip" && !(tokens[1] == "ir" || tokens[1] == "reflex" || tokens[1] == "acog" || tokens[1] == "elbit" || tokens[1] == "vzoom" || tokens[1] == "lps")) - return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; - - return weapon; + weapon = weap; + + tokens = strtok(weap, "_"); + + if(tokens.size <= 1) + return weapon; + + if(tokens.size < 3) + { + if(tokens[1] == "dw") + weapon = tokens[0]+"dw"; + + return weapon; + } + + if(tokens[2] == "ir" || tokens[2] == "reflex" || tokens[2] == "acog" || tokens[2] == "elbit" || tokens[2] == "vzoom" || tokens[2] == "lps") + return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; + + if(tokens[1] == "silencer") + return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; + + if(tokens[2] == "grip" && !(tokens[1] == "ir" || tokens[1] == "reflex" || tokens[1] == "acog" || tokens[1] == "elbit" || tokens[1] == "vzoom" || tokens[1] == "lps")) + return tokens[0]+"_"+tokens[2]+"_"+tokens[1]; + + return weapon; } /* - Gets random attachements + Gets random attachements */ bot_random_attachments(weap, atts, num) { - weapon = weap; - attachments = StrTok( atts, " " ); - attachments[attachments.size] = ""; - - reason = GetDvarInt("bots_loadout_reasonable"); - - for(;;) - { - if ( attachments.size <= 0 ) - { - return ( weapon ); - } - - attachment = random( attachments ); - attachments = array_remove( attachments, attachment ); - if(attachment == "") - return weapon; - - if(reason) - { - switch(attachment) - { - case "snub": - case "upgradesight": - case "acog": - case "mk": - case "ft": - case "ir": - case "auto": - case "gl": - continue; - } - - if(attachment == "silencer") - { - switch(weap) - { - case "l96a1": - case "psg1": - continue; - } - } - } - - cost = bot_attachment_cost(attachment); - if(cost > self.pers["bot"]["cod_points"]) - continue; - - self.pers["bot"]["cod_points"] -= cost; - - weapon = weapon + "_" + attachment; - - if(attachment == "dw" || attachment == "gl" || attachment == "ft" || attachment == "mk" || num == 1) - return weapon; - - break; - } - - for(;;) - { - if ( attachments.size <= 0 ) - { - return ( weapon ); - } - - _attachment = random( attachments ); - attachments = array_remove( attachments, _attachment ); - - if(_attachment == "") - return weapon; - - if(reason) - { - switch(_attachment) - { - case "snub": - case "upgradesight": - case "acog": - case "mk": - case "ft": - case "ir": - case "auto": - case "gl": - continue; - } - - if(attachment == "silencer") - { - switch(weap) - { - case "l96a1": - case "psg1": - continue; - } - } - } - - if(_attachment == "dw" || _attachment == "gl" || _attachment == "ft" || _attachment == "mk") - continue; - - if((attachment == "ir" || attachment == "reflex" || attachment == "acog" || attachment == "elbit" || attachment == "vzoom" || attachment == "lps") && (_attachment == "ir" || _attachment == "reflex" || _attachment == "acog" || _attachment == "elbit" || _attachment == "vzoom" || _attachment == "lps")) - continue; - - if((attachment == "dualclip" || attachment == "extclip" || attachment == "rf") && (_attachment == "dualclip" || _attachment == "extclip" || _attachment == "rf")) - continue; - - cost = bot_attachment_cost(_attachment); - if(cost > self.pers["bot"]["cod_points"]) - continue; - - self.pers["bot"]["cod_points"] -= cost; - weapon = weapon + "_" + _attachment; - return weapon; - } + weapon = weap; + attachments = StrTok( atts, " " ); + attachments[attachments.size] = ""; + + reason = GetDvarInt("bots_loadout_reasonable"); + + for(;;) + { + if ( attachments.size <= 0 ) + { + return ( weapon ); + } + + attachment = random( attachments ); + attachments = array_remove( attachments, attachment ); + if(attachment == "") + return weapon; + + if(reason) + { + switch(attachment) + { + case "snub": + case "upgradesight": + case "acog": + case "mk": + case "ft": + case "ir": + case "auto": + case "gl": + continue; + } + + if(attachment == "silencer") + { + switch(weap) + { + case "l96a1": + case "psg1": + continue; + } + } + } + + cost = bot_attachment_cost(attachment); + if(cost > self.pers["bot"]["cod_points"]) + continue; + + self.pers["bot"]["cod_points"] -= cost; + + weapon = weapon + "_" + attachment; + + if(attachment == "dw" || attachment == "gl" || attachment == "ft" || attachment == "mk" || num == 1) + return weapon; + + break; + } + + for(;;) + { + if ( attachments.size <= 0 ) + { + return ( weapon ); + } + + _attachment = random( attachments ); + attachments = array_remove( attachments, _attachment ); + + if(_attachment == "") + return weapon; + + if(reason) + { + switch(_attachment) + { + case "snub": + case "upgradesight": + case "acog": + case "mk": + case "ft": + case "ir": + case "auto": + case "gl": + continue; + } + + if(attachment == "silencer") + { + switch(weap) + { + case "l96a1": + case "psg1": + continue; + } + } + } + + if(_attachment == "dw" || _attachment == "gl" || _attachment == "ft" || _attachment == "mk") + continue; + + if((attachment == "ir" || attachment == "reflex" || attachment == "acog" || attachment == "elbit" || attachment == "vzoom" || attachment == "lps") && (_attachment == "ir" || _attachment == "reflex" || _attachment == "acog" || _attachment == "elbit" || _attachment == "vzoom" || _attachment == "lps")) + continue; + + if((attachment == "dualclip" || attachment == "extclip" || attachment == "rf") && (_attachment == "dualclip" || _attachment == "extclip" || _attachment == "rf")) + continue; + + cost = bot_attachment_cost(_attachment); + if(cost > self.pers["bot"]["cod_points"]) + continue; + + self.pers["bot"]["cod_points"] -= cost; + weapon = weapon + "_" + _attachment; + return weapon; + } } /* - Gets the perk ref + Gets the perk ref */ 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]; + // 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 ) - { - return level.tbl_PerkData[ key ]; - } - } + if ( level.tbl_PerkData[ key ][ "reference_full" ] == reference_full ) + { + return level.tbl_PerkData[ key ]; + } + } - return undefined; + return undefined; } /* - Get the bot's cod points + Get the bot's cod points */ bot_get_cod_points() { - if ( !level.onlineGame ) - { - self.pers["bot"][ "cod_points" ] = 999999; - return; - } - - cp_dvar = getDvarInt("bots_loadout_codpoints"); - if (cp_dvar == -1) - { - players = get_players(); - total_points = []; + if ( !level.onlineGame ) + { + self.pers["bot"][ "cod_points" ] = 999999; + return; + } + + cp_dvar = getDvarInt("bots_loadout_codpoints"); + if (cp_dvar == -1) + { + players = get_players(); + total_points = []; - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] is_bot() ) - { - continue; - } - - if(!isDefined(players[i].pers["currencyspent"]) || !isDefined(players[i].pers["codpoints"])) - continue; + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] is_bot() ) + { + continue; + } + + if(!isDefined(players[i].pers["currencyspent"]) || !isDefined(players[i].pers["codpoints"])) + continue; - total_points[ total_points.size ] = players[i].pers["currencyspent"] + players[i].pers["codpoints"]; - } - - if( !total_points.size ) - { - total_points[ total_points.size ] = Round( random_normal_distribution( 50000, 15000, 0, 100000 ) ); - } + total_points[ total_points.size ] = players[i].pers["currencyspent"] + players[i].pers["codpoints"]; + } + + if( !total_points.size ) + { + total_points[ total_points.size ] = Round( random_normal_distribution( 50000, 15000, 0, 100000 ) ); + } - point_average = array_average( total_points ); - self.pers["bot"][ "cod_points" ] = Int( point_average * RandomFloatRange( 0.6, 0.8 ) ); - } - else if(cp_dvar == 0) - { - self.pers["bot"][ "cod_points" ] = Round( random_normal_distribution( 50000, 15000, 0, 100000 ) ); - } - else - { - self.pers["bot"][ "cod_points" ] = Round( random_normal_distribution( cp_dvar, 1500, 0, 100000 ) ); - } + point_average = array_average( total_points ); + self.pers["bot"][ "cod_points" ] = Int( point_average * RandomFloatRange( 0.6, 0.8 ) ); + } + else if(cp_dvar == 0) + { + self.pers["bot"][ "cod_points" ] = Round( random_normal_distribution( 50000, 15000, 0, 100000 ) ); + } + else + { + self.pers["bot"][ "cod_points" ] = Round( random_normal_distribution( cp_dvar, 1500, 0, 100000 ) ); + } } /* - Get the bots rank + Get the bots rank */ bot_get_rank() { - rank = 1; - rank_dvar = getDvarInt("bots_loadout_rank"); + rank = 1; + rank_dvar = getDvarInt("bots_loadout_rank"); - if (rank_dvar == -1) - { - players = get_players(); + if (rank_dvar == -1) + { + players = get_players(); - ranks = []; - bot_ranks = []; - human_ranks = []; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] == self ) - continue; - - if ( !IsDefined( players[i].pers[ "rank" ] ) ) - continue; - - if ( players[i] is_bot() ) - { - bot_ranks[ bot_ranks.size ] = players[i].pers[ "rank" ]; - } - else if ( !players[i] isdemoclient() ) - { - human_ranks[ human_ranks.size ] = players[i].pers[ "rank" ]; - } - } + ranks = []; + bot_ranks = []; + human_ranks = []; + + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] == self ) + continue; + + if ( !IsDefined( players[i].pers[ "rank" ] ) ) + continue; + + if ( players[i] is_bot() ) + { + bot_ranks[ bot_ranks.size ] = players[i].pers[ "rank" ]; + } + else if ( !players[i] isdemoclient() ) + { + human_ranks[ human_ranks.size ] = players[i].pers[ "rank" ]; + } + } - if( !human_ranks.size ) - { - human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 35, 20, 0, level.maxRank ) ); - } + if( !human_ranks.size ) + { + human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 35, 20, 0, level.maxRank ) ); + } - human_avg = array_average( human_ranks ); + human_avg = array_average( human_ranks ); - while ( bot_ranks.size + human_ranks.size < 5 ) - { - // add some random ranks for better random number distribution - rank = human_avg + RandomIntRange( -10, 10 ); - human_ranks[ human_ranks.size ] = rank; - } + while ( bot_ranks.size + human_ranks.size < 5 ) + { + // add some random ranks for better random number distribution + rank = human_avg + RandomIntRange( -10, 10 ); + human_ranks[ human_ranks.size ] = rank; + } - ranks = array_combine( human_ranks, bot_ranks ); + ranks = array_combine( human_ranks, bot_ranks ); - avg = array_average( ranks ); - s = array_std_deviation( ranks, avg ); - - 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 ) ); - } - else - { - rank = Round( random_normal_distribution( rank_dvar, 5, 0, level.maxRank ) ); - } + avg = array_average( ranks ); + s = array_std_deviation( ranks, avg ); + + 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 ) ); + } + else + { + rank = Round( random_normal_distribution( rank_dvar, 5, 0, level.maxRank ) ); + } - self.pers["bot"]["rankxp"] = maps\mp\gametypes\_rank::getRankInfoMinXP( rank ); + self.pers["bot"]["rankxp"] = maps\mp\gametypes\_rank::getRankInfoMinXP( rank ); } /* - Set the bots killstreaks + Set the bots killstreaks */ bot_setKillstreaks() { - allowed_killstreaks = []; + allowed_killstreaks = []; - allowed_killstreaks[ 0 ] = "killstreak_spyplane"; - allowed_killstreaks[ 1 ] = "killstreak_supply_drop"; - allowed_killstreaks[ 2 ] = "killstreak_helicopter_comlink"; + allowed_killstreaks[ 0 ] = "killstreak_spyplane"; + 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 ) - { - allowed_killstreaks[ 3 ] = "killstreak_auto_turret_drop"; - allowed_killstreaks[ 4 ] = "killstreak_tow_turret_drop"; - allowed_killstreaks[ 5 ] = "killstreak_napalm"; - allowed_killstreaks[ 6 ] = "killstreak_counteruav"; - allowed_killstreaks[ 7 ] = "killstreak_mortar"; - allowed_killstreaks[ 8 ] = "killstreak_spyplane_direction"; - allowed_killstreaks[ 9 ] = "killstreak_airstrike"; - allowed_killstreaks[ 10 ] = "killstreak_dogs"; - allowed_killstreaks[ 11 ] = "killstreak_rcbomb"; - allowed_killstreaks[ 12 ] = "killstreak_m220_tow_drop"; - allowed_killstreaks[ 13 ] = "killstreak_helicopter_gunner"; - allowed_killstreaks[ 14 ] = "killstreak_helicopter_player_firstperson"; - } + 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"; + allowed_killstreaks[ 5 ] = "killstreak_napalm"; + allowed_killstreaks[ 6 ] = "killstreak_counteruav"; + allowed_killstreaks[ 7 ] = "killstreak_mortar"; + allowed_killstreaks[ 8 ] = "killstreak_spyplane_direction"; + allowed_killstreaks[ 9 ] = "killstreak_airstrike"; + allowed_killstreaks[ 10 ] = "killstreak_dogs"; + allowed_killstreaks[ 11 ] = "killstreak_rcbomb"; + allowed_killstreaks[ 12 ] = "killstreak_m220_tow_drop"; + allowed_killstreaks[ 13 ] = "killstreak_helicopter_gunner"; + allowed_killstreaks[ 14 ] = "killstreak_helicopter_player_firstperson"; + } - used_levels = []; - - self.pers["bot"]["killstreaks"] = []; - - reason = GetDvarInt("bots_loadout_reasonable"); - - for ( i = 0; i < 3; i++ ) - { - killstreak = random( allowed_killstreaks ); - allowed_killstreaks = array_remove( allowed_killstreaks, killstreak ); + used_levels = []; + + self.pers["bot"]["killstreaks"] = []; + + reason = GetDvarInt("bots_loadout_reasonable"); + + for ( i = 0; i < 3; i++ ) + { + killstreak = random( allowed_killstreaks ); + allowed_killstreaks = array_remove( allowed_killstreaks, killstreak ); - ks_level = maps\mp\gametypes\_hardpoints::GetKillstreakLevel( i, killstreak ); + ks_level = maps\mp\gametypes\_hardpoints::GetKillstreakLevel( i, killstreak ); - if ( bot_killstreak_level_is_used( ks_level, used_levels ) ) - { - i--; - continue; - } - - cost = bot_get_killstreak_cost(killstreak); - - if(self.pers["bot"]["cod_points"] < cost) - { - i--; - continue; - } - - if(reason) - { - switch(killstreak) - { - case "killstreak_helicopter_gunner": - case "killstreak_helicopter_player_firstperson": - case "killstreak_m220_tow_drop": - case "killstreak_tow_turret_drop": - case "killstreak_auto_turret_drop": - i--; - continue; - } - } + if ( bot_killstreak_level_is_used( ks_level, used_levels ) ) + { + i--; + continue; + } + + cost = bot_get_killstreak_cost(killstreak); + + if(self.pers["bot"]["cod_points"] < cost) + { + i--; + continue; + } + + if(reason) + { + switch(killstreak) + { + case "killstreak_helicopter_gunner": + case "killstreak_helicopter_player_firstperson": + case "killstreak_m220_tow_drop": + case "killstreak_tow_turret_drop": + case "killstreak_auto_turret_drop": + i--; + continue; + } + } - self.pers["bot"]["cod_points"] = self.pers["bot"]["cod_points"] - cost; - used_levels[ used_levels.size ] = ks_level; - self.pers["bot"]["killstreaks"][i] = killstreak; - } + self.pers["bot"]["cod_points"] = self.pers["bot"]["cod_points"] - cost; + used_levels[ used_levels.size ] = ks_level; + self.pers["bot"]["killstreaks"][i] = killstreak; + } } /* - Get cost for ks + Get cost for ks */ bot_get_killstreak_cost(ks) { - //use table?? trey never included cost attribute tho - switch(ks) - { - case "killstreak_auto_turret_drop": - return 3200; - case "killstreak_tow_turret_drop": - return 1600; - case "killstreak_napalm": - return 2400; - case "killstreak_counteruav": - return 1600; - case "killstreak_mortar": - return 3200; - case "killstreak_spyplane_direction": - return 4500; - case "killstreak_airstrike": - return 4500; - case "killstreak_dogs": - return 6000; - case "killstreak_rcbomb": - return 1200; - case "killstreak_helicopter_gunner": - return 5000; - case "killstreak_helicopter_player_firstperson": - return 6000; - case "killstreak_m220_tow_drop": - return 4000; - default: - return 0; - } + //use table?? trey never included cost attribute tho + switch(ks) + { + case "killstreak_auto_turret_drop": + return 3200; + case "killstreak_tow_turret_drop": + return 1600; + case "killstreak_napalm": + return 2400; + case "killstreak_counteruav": + return 1600; + case "killstreak_mortar": + return 3200; + case "killstreak_spyplane_direction": + return 4500; + case "killstreak_airstrike": + return 4500; + case "killstreak_dogs": + return 6000; + case "killstreak_rcbomb": + return 1200; + case "killstreak_helicopter_gunner": + return 5000; + case "killstreak_helicopter_player_firstperson": + return 6000; + case "killstreak_m220_tow_drop": + return 4000; + default: + return 0; + } } /* - Gives the kss + Gives the kss */ bot_giveKillstreaks() { - self.killstreak[0] = self.pers["bot"]["killstreaks"][0]; - self.killstreak[1] = self.pers["bot"]["killstreaks"][1]; - self.killstreak[2] = self.pers["bot"]["killstreaks"][2]; + self.killstreak[0] = self.pers["bot"]["killstreaks"][0]; + self.killstreak[1] = self.pers["bot"]["killstreaks"][1]; + self.killstreak[2] = self.pers["bot"]["killstreaks"][2]; } /* - Checks if the ks is used + Checks if the ks is used */ bot_killstreak_level_is_used( ks_level, used_levels ) { - for ( used = 0; used < used_levels.size; used++ ) - { - if ( ks_level == used_levels[ used ] ) - { - return true; - } - } + for ( used = 0; used < used_levels.size; used++ ) + { + if ( ks_level == used_levels[ used ] ) + { + return true; + } + } - return false; + return false; } diff --git a/main_shared/maps/mp/bots/_bot_script.gsc b/main_shared/maps/mp/bots/_bot_script.gsc index 3d00411..09f991e 100644 --- a/main_shared/maps/mp/bots/_bot_script.gsc +++ b/main_shared/maps/mp/bots/_bot_script.gsc @@ -1,8 +1,8 @@ /* - _bot_script - Author: INeedGames - Date: 12/20/2020 - Tells the bots what to do. + _bot_script + Author: INeedGames + Date: 12/20/2020 + Tells the bots what to do. */ #include common_scripts\utility; @@ -11,661 +11,659 @@ #include maps\mp\bots\_bot_utility; /* - When the bot is added to the game + When the bot is added to the game */ added() { - self endon("disconnect"); + self endon("disconnect"); - 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_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(); + self maps\mp\bots\_bot_loadout::bot_set_class(); } /* - When the bot connects + When the bot connects */ connected() { - self endon("disconnect"); + self endon("disconnect"); - self thread classWatch(); - self thread teamWatch(); + self thread classWatch(); + self thread teamWatch(); - self thread maps\mp\bots\_bot_loadout::bot_rank(); - self thread bot_skip_killcam(); + 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_on_spawn(); + self thread bot_on_death(); } /* - When the bot dies + When the bot dies */ bot_on_death() { - self endon("disconnect"); - level endon("game_ended"); - - for(;;) - { - self waittill("death"); - - self.hasSpawned = false; - } + self endon("disconnect"); + level endon("game_ended"); + + for(;;) + { + self waittill("death"); + + self.hasSpawned = false; + } } /* - Bots skip killcams + Bots skip killcams */ bot_skip_killcam() { - level endon("game_ended"); - self endon("disconnect"); - - for(;;) - { - wait 1; - - if(isDefined(self.killcam)) - { - self notify("end_killcam"); - self clientNotify("fkce"); - } - } + level endon("game_ended"); + self endon("disconnect"); + + for(;;) + { + wait 1; + + if(isDefined(self.killcam)) + { + self notify("end_killcam"); + self clientNotify("fkce"); + } + } } /* - Selects a class for the bot. + Selects a class for the bot. */ classWatch() { - self endon("disconnect"); + self endon("disconnect"); - for(;;) - { - while(!isdefined(self.pers["team"]) || level.oldschool) - wait .05; + for(;;) + { + while(!isdefined(self.pers["team"]) || level.oldschool) + wait .05; - wait 0.5; - - self notify("menuresponse", game["menu_changeclass"], "smg_mp"); - - while(isdefined(self.pers["team"]) && isdefined(self.pers["class"])) - wait .05; - } + wait 0.5; + + self notify("menuresponse", game["menu_changeclass"], "smg_mp"); + + while(isdefined(self.pers["team"]) && isdefined(self.pers["class"])) + wait .05; + } } /* - Makes sure the bot is on a team. + Makes sure the bot is on a team. */ teamWatch() { - self endon("disconnect"); + self endon("disconnect"); - for(;;) - { - while(!isdefined(self.pers["team"])) - wait .05; - - wait 0.05; - self notify("menuresponse", game["menu_team"], getDvar("bots_team")); - - while(isdefined(self.pers["team"])) - wait .05; - } + for(;;) + { + while(!isdefined(self.pers["team"])) + wait .05; + + wait 0.05; + self notify("menuresponse", game["menu_team"], getDvar("bots_team")); + + while(isdefined(self.pers["team"])) + wait .05; + } } /* - When bot spawns + When bot spawns */ bot_on_spawn() { - self endon("disconnect"); - level endon("game_ended"); - - for(;;) - { - self waittill("spawned_player"); + self endon("disconnect"); + level endon("game_ended"); + + for(;;) + { + self waittill("spawned_player"); - self.bot_lock_goal = false; - self.help_time = undefined; - self.bot_was_follow_script_update = undefined; + self.bot_lock_goal = false; + self.help_time = undefined; + self.bot_was_follow_script_update = undefined; - self thread bot_spawn(); - } + self thread bot_spawn(); + } } /* - Fired when the bot is damaged + Fired when the bot is damaged */ bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) { - self.killerLocation = undefined; - if(!IsDefined( self ) || !isDefined(self.team)) - return; - - if(!isAlive(self)) - return; + self.killerLocation = undefined; + if(!IsDefined( self ) || !isDefined(self.team)) + return; + + if(!isAlive(self)) + return; - if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) - 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 ( 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; + if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) + return; + + if(!isAlive(eAttacker)) + return; - self.killerLocation = eAttacker.origin; - - if (!isSubStr(sWeapon, "_silencer_")) - self bot_cry_for_help( eAttacker ); - - self SetAttacker( eAttacker ); + self.killerLocation = eAttacker.origin; + + if (!isSubStr(sWeapon, "_silencer_")) + self bot_cry_for_help( eAttacker ); + + self SetAttacker( eAttacker ); } -/* - When the bot gets attacked, have the bot ask for help from teammates. -*/ +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; + 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]; + for ( i = level.players.size - 1; i >= 0; i-- ) + { + player = level.players[i]; - if ( !player is_bot() ) - { - continue; - } - - if(!isDefined(player.team)) - continue; + if ( !player is_bot() ) + { + continue; + } + + if(!isDefined(player.team)) + continue; - if ( !IsAlive( player ) ) - { - continue; - } + if ( !IsAlive( player ) ) + { + continue; + } - if ( player == self ) - { - continue; - } + if ( player == self ) + { + continue; + } - if ( player.team != self.team ) - { - continue; - } + if ( player.team != self.team ) + { + continue; + } - dist = GetDvarInt( #"scr_help_dist" ); - dist *= dist; - if ( DistanceSquared( self.origin, player.origin ) > dist ) - { - 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 ) < 50 ) + { + self SetAttacker( attacker ); - if ( RandomInt( 100 ) > 70 ) - { - break; - } - } - } + if ( RandomInt( 100 ) > 70 ) + { + break; + } + } + } } /* - When the bot spawns + 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(); + 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 (getDvarInt("bots_play_obj")) + self thread bot_dom_cap_think(); - if(!level.inPrematchPeriod) - { - switch(GetDvar( #"bot_difficulty" )) - { - case "fu": - break; - case "easy": - self freeze_player_controls(true); - wait 0.6; - self freeze_player_controls(false); - break; - case "normal": - self freeze_player_controls(true); - wait 0.4; - self freeze_player_controls(false); - break; - case "hard": - self freeze_player_controls(true); - wait 0.2; - self freeze_player_controls(false); - break; - } - } - else - { - while ( level.inPrematchPeriod ) - wait ( 0.05 ); - } + if(!level.inPrematchPeriod) + { + switch(GetDvar( #"bot_difficulty" )) + { + case "fu": + break; + case "easy": + self freeze_player_controls(true); + wait 0.6; + self freeze_player_controls(false); + break; + case "normal": + self freeze_player_controls(true); + wait 0.4; + self freeze_player_controls(false); + break; + case "hard": + self freeze_player_controls(true); + wait 0.2; + self freeze_player_controls(false); + break; + } + } + else + { + while ( level.inPrematchPeriod ) + wait ( 0.05 ); + } - /*if (getDvarInt("bots_play_killstreak")) - self thread bot_killstreak_think(); + /*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(); - } + if (getDvarInt("bots_play_take_carepackages")) + { + self thread bot_watch_stuck_on_crate(); + self thread bot_crate_think(); + } - self thread bot_revive_think(); + self thread bot_revive_think(); - //stockpile.gsc - //hotel.gsc - //kowloon.gsc - self thread bot_radiation_think(); + //stockpile.gsc + //hotel.gsc + //kowloon.gsc + self thread bot_radiation_think(); - if (getDvarInt("bots_play_nade")) - self thread bot_use_equipment_think(); + if (getDvarInt("bots_play_nade")) + self thread bot_use_equipment_think(); - 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_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(); - } + if (getDvarInt("bots_play_camp")) + { + self thread bot_think_follow(); + self thread bot_think_camp(); + } - self thread bot_weapon_think(); + self thread bot_weapon_think(); - self thread bot_revenge_think(); - self thread bot_uav_think(); - self thread bot_listen_to_steps(); - self thread follow_target();*/ + self thread bot_revenge_think(); + self thread bot_uav_think(); + self thread bot_listen_to_steps(); + self thread follow_target();*/ - if (getDvarInt("bots_play_obj")) - { - self thread bot_dom_def_think(); - self thread bot_dom_spawn_kill_think(); + if (getDvarInt("bots_play_obj")) + { + self thread bot_dom_def_think(); + self thread bot_dom_spawn_kill_think(); - /* self thread bot_hq(); + /* self thread bot_hq(); - self thread bot_cap(); + self thread bot_cap(); - self thread bot_sab(); + self thread bot_sab(); - self thread bot_sd_defenders(); - self thread bot_sd_attackers(); + self thread bot_sd_defenders(); + self thread bot_sd_attackers(); - self thread bot_dem_attackers(); - self thread bot_dem_defenders();*/ - } + self thread bot_dem_attackers(); + self thread bot_dem_defenders();*/ + } } /* - Watches when the bot is touching the obj and calls 'goal' + 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"); + self endon ("death"); + self endon ("disconnect"); + self endon ("bad_path"); + self endon ("goal"); + self endon ("new_goal"); - for (;;) - { - wait 0.5; + for (;;) + { + wait 0.5; - if (!isDefined(obj)) - { - self notify("bad_path"); - return; - } + if (!isDefined(obj)) + { + self notify("bad_path"); + return; + } - if (self IsTouching(obj)) - { - self notify("goal"); - return; - } - } + if (self IsTouching(obj)) + { + self notify("goal"); + return; + } + } } /* - Bots hang around the enemy's flag to spawn kill em + Bots hang around the enemy's flag to spawn kill em */ bot_dom_spawn_kill_think() { - self endon( "death" ); - self endon( "disconnect" ); + self endon( "death" ); + self endon( "disconnect" ); - if ( level.gametype != "dom" ) - return; + if ( level.gametype != "dom" ) + return; - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); + myTeam = self.pers[ "team" ]; + otherTeam = getOtherTeam( myTeam ); - for ( ;; ) - { - wait( randomintrange( 10, 20 ) ); - - if ( randomint( 100 ) < 20 ) - continue; - - if ( self HasScriptGoal() || self.bot_lock_goal) - continue; - - myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); + for ( ;; ) + { + wait( randomintrange( 10, 20 ) ); + + if ( randomint( 100 ) < 20 ) + continue; + + if ( self HasScriptGoal() || self.bot_lock_goal) + continue; + + myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); - if ( myFlagCount == level.flags.size ) - continue; + if ( myFlagCount == level.flags.size ) + continue; - otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); - - if (myFlagCount <= otherFlagCount || otherFlagCount != 1) - continue; - - flag = undefined; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) - continue; - } - - if(!isDefined(flag)) - continue; - - if(DistanceSquared(self.origin, flag.origin) < 2048*2048) - continue; + otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); + + if (myFlagCount <= otherFlagCount || otherFlagCount != 1) + continue; + + flag = undefined; + for ( i = 0; i < level.flags.size; i++ ) + { + if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) + continue; + } + + if(!isDefined(flag)) + continue; + + if(DistanceSquared(self.origin, flag.origin) < 2048*2048) + continue; - self SetBotGoal( flag.origin, 1024 ); - - self thread bot_dom_watch_flags(myFlagCount, myTeam); + 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 ClearScriptGoal(); - } + if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + self ClearScriptGoal(); + } } /* - Calls 'bad_path' when the flag count changes + 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" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "goal" ); + self endon( "bad_path" ); + self endon( "new_goal" ); - for (;;) - { - wait 0.5; + for (;;) + { + wait 0.5; - if (maps\mp\gametypes\dom::getTeamFlagCount( myTeam ) != count) - break; - } - - self notify("bad_path"); + 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 + Bots watches their own flags and protects them when they are under capture */ bot_dom_def_think() { - self endon( "death" ); - self endon( "disconnect" ); + self endon( "death" ); + self endon( "disconnect" ); - if ( level.gametype != "dom" ) - return; + if ( level.gametype != "dom" ) + return; - myTeam = self.pers[ "team" ]; + myTeam = self.pers[ "team" ]; - for ( ;; ) - { - wait( randomintrange( 1, 3 ) ); - - if ( randomint( 100 ) < 35 ) - continue; - - if ( self HasScriptGoal() || self.bot_lock_goal ) - continue; - - 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) ) - continue; + for ( ;; ) + { + wait( randomintrange( 1, 3 ) ); + + if ( randomint( 100 ) < 35 ) + continue; + + if ( self HasScriptGoal() || self.bot_lock_goal ) + continue; + + 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) ) + continue; - self SetBotGoal( flag.origin, 128 ); - - self thread bot_dom_watch_for_flashing(flag, myTeam); - self thread bots_watch_touch_obj(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 ClearScriptGoal(); - } + if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + self ClearScriptGoal(); + } } /* - Watches while the flag is under capture + 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; + 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 (!isDefined(flag)) + break; - if (flag maps\mp\gametypes\dom::getFlagTeam() != myTeam || !flag.useObj.objPoints[myTeam].isFlashing) - break; - } - - self notify("bad_path"); + if (flag maps\mp\gametypes\dom::getFlagTeam() != myTeam || !flag.useObj.objPoints[myTeam].isFlashing) + break; + } + + self notify("bad_path"); } /* - Bots capture dom flags + Bots capture dom flags */ bot_dom_cap_think() { - self endon( "death" ); - self endon( "disconnect" ); - - if ( level.gametype != "dom" ) - return; + self endon( "death" ); + self endon( "disconnect" ); + + if ( level.gametype != "dom" ) + return; - myTeam = self.pers[ "team" ]; - otherTeam = getOtherTeam( myTeam ); + myTeam = self.pers[ "team" ]; + otherTeam = getOtherTeam( myTeam ); - for ( ;; ) - { - wait( randomintrange( 3, 12 ) ); - - if ( self.bot_lock_goal ) - { - continue; - } + for ( ;; ) + { + wait( randomintrange( 3, 12 ) ); + + if ( self.bot_lock_goal ) + { + continue; + } - if ( !isDefined(level.flags) || level.flags.size == 0 ) - continue; + if ( !isDefined(level.flags) || level.flags.size == 0 ) + continue; - myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); + myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); - if ( myFlagCount == level.flags.size ) - continue; + if ( myFlagCount == level.flags.size ) + continue; - otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); + otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); - if ( myFlagCount < otherFlagCount ) - { - if ( randomint( 100 ) < 15 ) - continue; - } - else if ( myFlagCount == otherFlagCount ) - { - if ( randomint( 100 ) < 35 ) - continue; - } - else if ( myFlagCount > otherFlagCount ) - { - if ( randomint( 100 ) < 95 ) - continue; - } + if ( myFlagCount < otherFlagCount ) + { + if ( randomint( 100 ) < 15 ) + continue; + } + else if ( myFlagCount == otherFlagCount ) + { + if ( randomint( 100 ) < 35 ) + continue; + } + else if ( myFlagCount > otherFlagCount ) + { + if ( randomint( 100 ) < 95 ) + continue; + } - flag = undefined; - flags = []; - for ( i = 0; i < level.flags.size; i++ ) - { - if ( level.flags[i] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) - continue; + 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]; - } + 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 = random(flags); - } + 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 = random(flags); + } - if ( !isDefined(flag) ) - continue; - - 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 ClearScriptGoal(); + if ( !isDefined(flag) ) + continue; + + 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 ClearScriptGoal(); - if (event != "goal") - { - self.bot_lock_goal = false; - continue; - } - - self SetBotGoal( self.origin, 64 ); + if (event != "goal") + { + self.bot_lock_goal = false; + continue; + } + + 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 - } + 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 ClearScriptGoal(); - - self.bot_lock_goal = false; - } + self ClearScriptGoal(); + + self.bot_lock_goal = false; + } } /* - Bot goes to the flag, watching while they don't have the flag + 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); + 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 (!isDefined(flag)) + break; - if (flag maps\mp\gametypes\dom::getFlagTeam() == myTeam) - 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"); + if (self isTouching(flag)) + break; + } + + if (flag maps\mp\gametypes\dom::getFlagTeam() == myTeam) + self notify("bad_path"); + else + self notify("goal"); } diff --git a/main_shared/maps/mp/bots/_bot_utility.gsc b/main_shared/maps/mp/bots/_bot_utility.gsc index 47ac77d..05158f3 100644 --- a/main_shared/maps/mp/bots/_bot_utility.gsc +++ b/main_shared/maps/mp/bots/_bot_utility.gsc @@ -1,8 +1,8 @@ /* - _bot_utility - Author: INeedGames - Date: 12/20/2020 - The shared functions for bots + _bot_utility + Author: INeedGames + Date: 12/20/2020 + The shared functions for bots */ #include common_scripts\utility; @@ -10,284 +10,332 @@ #include maps\mp\gametypes\_hud_util; /* - Returns an array of all the bots in the game. + Returns an array of all the bots in the game. */ getBotArray() { - result = []; - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!player is_bot()) - continue; - - result[result.size] = player; - } - - return result; + result = []; + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!player is_bot()) + continue; + + result[result.size] = player; + } + + return result; } /* - Returns a good amount of players. + Returns a good amount of players. */ getGoodMapAmount() { - switch(getdvar("mapname")) - { - default: - return 2; - } + switch(getdvar("mapname")) + { + default: + return 2; + } } /* - Rounds to the nearest whole number. + Rounds to the nearest whole number. */ Round(x) { - y = int(x); - - if(abs(x) - abs(y) > 0.5) - { - if(x < 0) - return y - 1; - else - return y + 1; - } - else - return y; + y = int(x); + + if(abs(x) - abs(y) > 0.5) + { + if(x < 0) + return y - 1; + else + return y + 1; + } + else + return y; } /* - Picks a random thing + Picks a random thing */ PickRandom(arr) { - if (!arr.size) - return undefined; + if (!arr.size) + return undefined; - return arr[randomInt(arr.size)]; + return arr[randomInt(arr.size)]; } /* - Waits for a host player + Waits for a host player */ bot_wait_for_host() { - host = undefined; + host = undefined; - while (!isDefined(level) || !isDefined(level.players)) - wait 0.05; - - for(i = 0; i < 100; i++) - { - host = GetHostPlayer(); - - if(isDefined(host)) - break; - - wait 0.05; - } - - if(!isDefined(host)) - return; - - for(i = 0; i < 100; i++) - { - if(IsDefined( host.pers[ "team" ] )) - break; - - wait 0.05; - } + while (!isDefined(level) || !isDefined(level.players)) + wait 0.05; + + for(i = 0; i < 100; i++) + { + host = GetHostPlayer(); + + if(isDefined(host)) + break; + + wait 0.05; + } + + if(!isDefined(host)) + return; + + for(i = 0; i < 100; i++) + { + if(IsDefined( host.pers[ "team" ] )) + break; + + wait 0.05; + } - if(!IsDefined( host.pers[ "team" ] )) - return; - - for(i = 0; i < 100; i++) - { - if(host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis") - break; - - wait 0.05; - } + if(!IsDefined( host.pers[ "team" ] )) + return; + + for(i = 0; i < 100; i++) + { + if(host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis") + break; + + wait 0.05; + } } /* - Wrapper for setgoal + Wrapper for setgoal */ SetBotGoal(where, dist) { - self SetScriptGoal(where, dist); - waittillframeend; - self notify("new_goal"); + self SetScriptGoal(where, dist); + waittillframeend; + self notify("new_goal"); } /* - Fixes sd bomb planting + Matches a num to a char +*/ +keyCodeToString(a) +{ + b=""; + switch(a) + { + case 0: b= "a"; break; + case 1: b= "b"; break; + case 2: b= "c"; break; + case 3: b= "d"; break; + case 4: b= "e"; break; + case 5: b= "f"; break; + case 6: b= "g"; break; + case 7: b= "h"; break; + case 8: b= "i"; break; + case 9: b= "j"; break; + case 10: b= "k"; break; + case 11: b= "l"; break; + case 12: b= "m"; break; + case 13: b= "n"; break; + case 14: b= "o"; break; + case 15: b= "p"; break; + case 16: b= "q"; break; + case 17: b= "r"; break; + case 18: b= "s"; break; + case 19: b= "t"; break; + case 20: b= "u"; break; + case 21: b= "v"; break; + case 22: b= "w"; break; + case 23: b= "x"; break; + case 24: b= "y"; break; + case 25: b= "z"; break; + case 26: b= "."; break; + case 27: b= " "; break; + } + return b; +} + +/* + Does the extra check when adding bots +*/ +doExtraCheck() +{ + maps\mp\bots\_bot_script::checkTheBots(); +} + +/* + Fixes sd bomb planting */ bot_onUsePlantObjectFix( player ) { - // planted the bomb - if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) - { - level thread bot_bombPlanted( self, player ); - player logString( "bomb planted: " + self.label ); - - // disable all bomb zones except this one - for ( index = 0; index < level.bombZones.size; index++ ) - { - if ( level.bombZones[index] == self ) - continue; - - level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); - } - 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 notify ( "bomb_planted" ); - - level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player ); + // planted the bomb + if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) + { + level thread bot_bombPlanted( self, player ); + player logString( "bomb planted: " + self.label ); + + // disable all bomb zones except this one + for ( index = 0; index < level.bombZones.size; index++ ) + { + if ( level.bombZones[index] == self ) + continue; + + level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); + } + 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 notify ( "bomb_planted" ); + + level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player ); - if( isdefined(player.pers["plants"]) ) - { - player.pers["plants"]++; - player.plants = player.pers["plants"]; - } + if( isdefined(player.pers["plants"]) ) + { + player.pers["plants"]++; + player.plants = player.pers["plants"]; + } - player maps\mp\_medals::saboteur(); - player maps\mp\gametypes\_persistence::statAddWithGameType( "PLANTS", 1 ); - - maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted" ); + player maps\mp\_medals::saboteur(); + player maps\mp\gametypes\_persistence::statAddWithGameType( "PLANTS", 1 ); + + maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted" ); - maps\mp\gametypes\_globallogic_score::givePlayerScore( "plant", player ); - //player thread [[level.onXPEvent]]( "plant" ); - } + maps\mp\gametypes\_globallogic_score::givePlayerScore( "plant", player ); + //player thread [[level.onXPEvent]]( "plant" ); + } } /* - Fixes sd bomb planting + Fixes sd bomb planting */ bot_bombPlanted( destroyedObj, player ) { - maps\mp\gametypes\_globallogic_utils::pauseTimer(); - 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::bombPlantedMusicDelay(); + maps\mp\gametypes\_globallogic_utils::pauseTimer(); + 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::bombPlantedMusicDelay(); - //thread maps\mp\gametypes\_globallogic_audio::actionMusicSet(); - - level.tickingObject = destroyedObj.visuals[0]; + //thread maps\mp\gametypes\_globallogic_audio::actionMusicSet(); + + level.tickingObject = destroyedObj.visuals[0]; - level.timeLimitOverride = true; - setGameEndTime( int( gettime() + (level.bombTimer * 1000) ) ); - setMatchFlag( "bomb_timer", 1 ); - - 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]; - } - else - { - - for ( index = 0; index < level.players.size; index++ ) - { - if ( isDefined( level.players[index].carryIcon ) ) - level.players[index].carryIcon destroyElem(); - } + level.timeLimitOverride = true; + setGameEndTime( int( gettime() + (level.bombTimer * 1000) ) ); + setMatchFlag( "bomb_timer", 1 ); + + 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]; + } + else + { + + for ( index = 0; index < level.players.size; index++ ) + { + if ( isDefined( level.players[index].carryIcon ) ) + level.players[index].carryIcon destroyElem(); + } - 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" ); - } - destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" ); - destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - /* - destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", undefined ); - */ - label = destroyedObj maps\mp\gametypes\_gameobjects::getLabel(); - - // create a new object to defuse with. - 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::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); - defuseObject maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - defuseObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" + label ); - defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" + label ); - 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"; - - level.defuseObject = defuseObject;//every cod... - - player.isBombCarrier = false; - - maps\mp\gametypes\sd::BombTimerWait(); - setMatchFlag( "bomb_timer", 0 ); - - destroyedObj.visuals[0] maps\mp\gametypes\_globallogic_utils::stopTickingSound(); - - if ( level.gameEnded || level.bombDefused ) - return; - - level.bombExploded = true; - - - - 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" ); - 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" ); - - rot = randomfloat(360); - 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 maps\mp\gametypes\_globallogic_audio::set_music_on_team( "SILENT", "both" ); - - if ( isDefined( destroyedObj.exploderIndex ) ) - exploder( destroyedObj.exploderIndex ); - - for ( index = 0; index < level.bombZones.size; index++ ) - level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); - defuseObject maps\mp\gametypes\_gameobjects::disableObject(); - - setGameEndTime( 0 ); - - wait 3; - - maps\mp\gametypes\sd::sd_endGame( game["attackers"], game["strings"]["target_destroyed"] ); + 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" ); + } + destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" ); + destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); + /* + destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", undefined ); + destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", undefined ); + destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", undefined ); + destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", undefined ); + */ + label = destroyedObj maps\mp\gametypes\_gameobjects::getLabel(); + + // create a new object to defuse with. + 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::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); + defuseObject maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); + defuseObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); + defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" + label ); + defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" + label ); + 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"; + + level.defuseObject = defuseObject;//every cod... + + player.isBombCarrier = false; + + maps\mp\gametypes\sd::BombTimerWait(); + setMatchFlag( "bomb_timer", 0 ); + + destroyedObj.visuals[0] maps\mp\gametypes\_globallogic_utils::stopTickingSound(); + + if ( level.gameEnded || level.bombDefused ) + return; + + level.bombExploded = true; + + + + 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" ); + 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" ); + + rot = randomfloat(360); + 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 maps\mp\gametypes\_globallogic_audio::set_music_on_team( "SILENT", "both" ); + + if ( isDefined( destroyedObj.exploderIndex ) ) + exploder( destroyedObj.exploderIndex ); + + for ( index = 0; index < level.bombZones.size; index++ ) + level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); + defuseObject maps\mp\gametypes\_gameobjects::disableObject(); + + setGameEndTime( 0 ); + + wait 3; + + maps\mp\gametypes\sd::sd_endGame( game["attackers"], game["strings"]["target_destroyed"] ); } diff --git a/main_shared/maps/mp/gametypes/_bot.gsc b/main_shared/maps/mp/gametypes/_bot.gsc index e03b1f6..4b6fe39 100644 --- a/main_shared/maps/mp/gametypes/_bot.gsc +++ b/main_shared/maps/mp/gametypes/_bot.gsc @@ -1,8 +1,8 @@ /* - _bot - Author: INeedGames - Date: 12/20/2020 - The entry point and manager of the bots. + _bot + Author: INeedGames + Date: 12/20/2020 + The entry point and manager of the bots. */ #include common_scripts\utility; @@ -11,816 +11,824 @@ #include maps\mp\bots\_bot_utility; /* - Entry point to the bots + Entry point to the bots */ init() { - level.bw_VERSION = "1.1.0"; + level.bw_VERSION = "1.1.0"; - if(getDvar("bots_main") == "") - setDvar("bots_main", true); + if(getDvar("bots_main") == "") + setDvar("bots_main", true); - if (!getDvarInt("bots_main")) - return; + if (!getDvarInt("bots_main")) + return; - if(getDvar("bots_manage_add") == "") - setDvar("bots_manage_add", 0);//amount of bots to add to the game - if(getDvar("bots_manage_fill") == "") - setDvar("bots_manage_fill", 0);//amount of bots to maintain - if(getDvar("bots_manage_fill_spec") == "") - setDvar("bots_manage_fill_spec", true);//to count for fill if player is on spec team - 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 - if(getDvar("bots_manage_fill_kick") == "") - setDvar("bots_manage_fill_kick", false);//kick bots if too many - - if(getDvar("bots_team") == "") - setDvar("bots_team", "autoassign");//which team for bots to join - if(getDvar("bots_team_amount") == "") - setDvar("bots_team_amount", 0);//amount of bots on axis team - if(getDvar("bots_team_force") == "") - setDvar("bots_team_force", false);//force bots on team - if(getDvar("bots_team_mode") == "") - setDvar("bots_team_mode", 0);//counts just bots when 1 + if(getDvar("bots_manage_add") == "") + setDvar("bots_manage_add", 0);//amount of bots to add to the game + if(getDvar("bots_manage_fill") == "") + setDvar("bots_manage_fill", 0);//amount of bots to maintain + if(getDvar("bots_manage_fill_spec") == "") + setDvar("bots_manage_fill_spec", true);//to count for fill if player is on spec team + 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 + if(getDvar("bots_manage_fill_kick") == "") + setDvar("bots_manage_fill_kick", false);//kick bots if too many + + if(getDvar("bots_team") == "") + setDvar("bots_team", "autoassign");//which team for bots to join + if(getDvar("bots_team_amount") == "") + setDvar("bots_team_amount", 0);//amount of bots on axis team + if(getDvar("bots_team_force") == "") + setDvar("bots_team_force", false);//force bots on team + if(getDvar("bots_team_mode") == "") + setDvar("bots_team_mode", 0);//counts just bots when 1 - if(getDvar("bots_loadout_reasonable") == "")//filter out the bad 'guns' and perks - setDvar("bots_loadout_reasonable", false); - if(getDvar("bots_loadout_allow_op") == "")//allows jug, marty and laststand - 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 - 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 - setDvar("bots_loadout_codpoints", -1); - if(getDvar("bots_loadout_prestige") == "")// what pretige the bots will be, -1 is the players, -2 is random - setDvar("bots_loadout_prestige", -1); + if(getDvar("bots_loadout_reasonable") == "")//filter out the bad 'guns' and perks + setDvar("bots_loadout_reasonable", false); + if(getDvar("bots_loadout_allow_op") == "")//allows jug, marty and laststand + 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 + 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 + setDvar("bots_loadout_codpoints", -1); + if(getDvar("bots_loadout_prestige") == "")// what pretige the bots will be, -1 is the players, -2 is random + setDvar("bots_loadout_prestige", -1); - if(getDvar("bots_play_target_other") == "")//bot target non play ents (vehicles) - setDvar("bots_play_target_other", true); - if(getDvar("bots_play_killstreak") == "")//bot use killstreaks - setDvar("bots_play_killstreak", true); - if(getDvar("bots_play_nade") == "")//bots grenade - setDvar("bots_play_nade", true); - if(getDvar("bots_play_take_carepackages") == "")//bots take carepackages - setDvar("bots_play_take_carepackages", true); - if(getDvar("bots_play_obj") == "")//bots play the obj - setDvar("bots_play_obj", true); - if(getDvar("bots_play_camp") == "")//bots camp and follow - setDvar("bots_play_camp", true); + if(getDvar("bots_play_target_other") == "")//bot target non play ents (vehicles) + setDvar("bots_play_target_other", true); + if(getDvar("bots_play_killstreak") == "")//bot use killstreaks + setDvar("bots_play_killstreak", true); + if(getDvar("bots_play_nade") == "")//bots grenade + setDvar("bots_play_nade", true); + if(getDvar("bots_play_take_carepackages") == "")//bots take carepackages + setDvar("bots_play_take_carepackages", true); + if(getDvar("bots_play_obj") == "")//bots play the obj + setDvar("bots_play_obj", true); + if(getDvar("bots_play_camp") == "")//bots camp and follow + setDvar("bots_play_camp", true); - level.bots = []; - level.bot_decoys = []; - level.bot_planes = []; + level.bots = []; + level.bot_decoys = []; + level.bot_planes = []; - if(!isDefined(game["botWarfare"])) - game["botWarfare"] = true; + if(!isDefined(game["botWarfare"])) + game["botWarfare"] = true; - thread fixGamemodes(); - thread onPlayerConnect(); + thread fixGamemodes(); + thread onPlayerConnect(); - thread diffBots(); - thread teamBots(); - thread addBots(); + thread diffBots(); + thread teamBots(); + thread addBots(); - thread doNonDediBots(); + thread doNonDediBots(); } /* - Thread when any player connects. Starts the threads needed. + Thread when any player connects. Starts the threads needed. */ onPlayerConnect() { - for(;;) - { - level waittill("connected", player); + for(;;) + { + level waittill("connected", player); - player thread watch_shoot(); - player thread watch_grenade(); - player thread connected(); - } + player thread watch_shoot(); + player thread watch_grenade(); + player thread connected(); + } } /* - When a bot disconnects. + When a bot disconnects. */ onDisconnect() { - self waittill("disconnect"); - - level.bots = array_remove(level.bots, self); + self waittill("disconnect"); + + level.bots = array_remove(level.bots, self); } /* - Whena player connects + Whena player connects */ connected() { - self endon("disconnect"); + self endon("disconnect"); - if (!self is_bot()) - return; + if (!self is_bot()) + return; - self thread maps\mp\bots\_bot_script::connected(); + self thread maps\mp\bots\_bot_script::connected(); - level.bots[level.bots.size] = self; - self thread onDisconnect(); + level.bots[level.bots.size] = self; + self thread onDisconnect(); - level notify("bot_connected", self); + level notify("bot_connected", self); } /* - Handles the diff of the bots + Handles the diff of the bots */ diffBots() { - for (;;) - { - wait 1.5; + for (;;) + { + wait 1.5; - bot_set_difficulty(GetDvar( #"bot_difficulty" )); - } + bot_set_difficulty(GetDvar( #"bot_difficulty" )); + } } /* - Setup bot dvars for non dedicated clients + Setup bot dvars for non dedicated clients */ doNonDediBots() { - if (!GetDvarInt( #"xblive_basictraining" )) - return; + if (!GetDvarInt( #"xblive_basictraining" )) + return; - if (isDefined(game[ "bots_spawned" ])) - return; + if (isDefined(game[ "bots_spawned" ])) + return; - game[ "bots_spawned" ] = true; + game[ "bots_spawned" ] = true; - if(getDvar("bot_enemies_extra") == "") - setDvar("bot_enemies_extra", 0); - if(getDvar("bot_friends_extra") == "") - setDvar("bot_friends_extra", 0); + if(getDvar("bot_enemies_extra") == "") + setDvar("bot_enemies_extra", 0); + if(getDvar("bot_friends_extra") == "") + 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(); + bot_wait_for_host(); + host = GetHostPlayer(); - team = "allies"; - if(isDefined(host) && isDefined(host.pers[ "team" ]) && (host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis")) - team = host.pers[ "team" ]; + team = "allies"; + 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); - else - setDvar("bots_team_amount", bot_enemies); + if (team == "axis") + setDvar("bots_team_amount", bot_friends); + else + 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); } /* - Sets the difficulty of the bots + Sets the difficulty of the bots */ 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" ); - } - 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" ); - } - 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" ); - } - else // 'normal' difficulty - { - 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 ( 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" ); + } + 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" ); + } + 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" ); + } + else // 'normal' difficulty + { + 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" ) - { - SetDvar( "sv_botMinReactionTime", "400" ); - SetDvar( "sv_botMaxReactionTime", "500" ); - SetDvar( "sv_botMinAdsTime", "1000" ); - SetDvar( "sv_botMaxAdsTime", "2000" ); - } + if ( level.gameType == "oic" && difficulty == "fu" ) + { + SetDvar( "sv_botMinReactionTime", "400" ); + SetDvar( "sv_botMaxReactionTime", "500" ); + SetDvar( "sv_botMinAdsTime", "1000" ); + SetDvar( "sv_botMaxAdsTime", "2000" ); + } - if ( level.gameType == "oic" && ( difficulty == "hard" || difficulty == "fu" ) ) - { - SetDvar( "sv_botSprintDistance", "256" ); - } - - SetDvar( "bot_difficulty", difficulty ); + if ( level.gameType == "oic" && ( difficulty == "hard" || difficulty == "fu" ) ) + { + SetDvar( "sv_botSprintDistance", "256" ); + } + + SetDvar( "bot_difficulty", difficulty ); } /* - A server thread for monitoring all bot's teams for custom server settings. + A server thread for monitoring all bot's teams for custom server settings. */ teamBots() { - for(;;) - { - wait 1.5; - teamAmount = getDvarInt("bots_team_amount"); - toTeam = getDvar("bots_team"); - - alliesbots = 0; - alliesplayers = 0; - axisbots = 0; - axisplayers = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(player is_bot()) - { - if(player.pers["team"] == "allies") - alliesbots++; - else if(player.pers["team"] == "axis") - axisbots++; - } - else - { - if(player.pers["team"] == "allies") - alliesplayers++; - else if(player.pers["team"] == "axis") - axisplayers++; - } - } - - allies = alliesbots; - axis = axisbots; - - if(!getDvarInt("bots_team_mode")) - { - allies += alliesplayers; - axis += axisplayers; - } - - if(toTeam != "custom") - { - if(getDvarInt("bots_team_force")) - { - if(toTeam == "autoassign") - { - if(abs(axis - allies) > 1) - { - toTeam = "axis"; - if(axis > allies) - toTeam = "allies"; - } - } - - if(toTeam != "autoassign") - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(!player is_bot()) - continue; - - if(player.pers["team"] == toTeam) - continue; - - if (toTeam == "allies") - player thread [[level.allies]](); - else if (toTeam == "axis") - player thread [[level.axis]](); - else - player thread [[level.spectator]](); - break; - } - } - } - } - else - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(!player is_bot()) - continue; - - if(player.pers["team"] == "axis") - { - if(axis > teamAmount) - { - player thread [[level.allies]](); - break; - } - } - else - { - if(axis < teamAmount) - { - player thread [[level.axis]](); - break; - } - else if(player.pers["team"] != "allies") - { - player thread [[level.allies]](); - break; - } - } - } - } - } + for(;;) + { + wait 1.5; + teamAmount = getDvarInt("bots_team_amount"); + toTeam = getDvar("bots_team"); + + alliesbots = 0; + alliesplayers = 0; + axisbots = 0; + axisplayers = 0; + + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!isDefined(player.pers["team"])) + continue; + + if(player is_bot()) + { + if(player.pers["team"] == "allies") + alliesbots++; + else if(player.pers["team"] == "axis") + axisbots++; + } + else + { + if(player.pers["team"] == "allies") + alliesplayers++; + else if(player.pers["team"] == "axis") + axisplayers++; + } + } + + allies = alliesbots; + axis = axisbots; + + if(!getDvarInt("bots_team_mode")) + { + allies += alliesplayers; + axis += axisplayers; + } + + if(toTeam != "custom") + { + if(getDvarInt("bots_team_force")) + { + if(toTeam == "autoassign") + { + if(abs(axis - allies) > 1) + { + toTeam = "axis"; + if(axis > allies) + toTeam = "allies"; + } + } + + if(toTeam != "autoassign") + { + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!isDefined(player.pers["team"])) + continue; + + if(!player is_bot()) + continue; + + if(player.pers["team"] == toTeam) + continue; + + if (toTeam == "allies") + player thread [[level.allies]](); + else if (toTeam == "axis") + player thread [[level.axis]](); + else + player thread [[level.spectator]](); + break; + } + } + } + } + else + { + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!isDefined(player.pers["team"])) + continue; + + if(!player is_bot()) + continue; + + if(player.pers["team"] == "axis") + { + if(axis > teamAmount) + { + player thread [[level.allies]](); + break; + } + } + else + { + if(axis < teamAmount) + { + player thread [[level.axis]](); + break; + } + else if(player.pers["team"] != "allies") + { + player thread [[level.allies]](); + break; + } + } + } + } + } } /* - A server thread for monitoring all bot's in game. Will add and kick bots according to server settings. + A server thread for monitoring all bot's in game. Will add and kick bots according to server settings. - Dedis only spawn bots when developer is not 0 - This makes the dedi unstable and can crash + Dedis only spawn bots when developer is not 0 + This makes the dedi unstable and can crash - Patch the executable to skip the pregame and make it so bots can spawn + Patch the executable to skip the pregame and make it so bots can spawn - pregame: - in the ShouldDoPregame sub: - B8 01 00 00 00: mov eax, 1 + pregame: + in the ShouldDoPregame sub: + B8 01 00 00 00: mov eax, 1 change to: B8 00 00 00 00: mov eax, 0 - 0x4F6C77 in rektmp - 0x4598A7 in bg + 0x4F6C77 in rektmp + 0x4598A7 in bg - spawnbots: - in the SV_AddTestClient sub: - 0F 85 A4 00 00 00: jnz + spawnbots: + in the SV_AddTestClient sub: + 0F 85 A4 00 00 00: jnz change to: 0F 84 A4 00 00 00: jz - 0x6B6180 in rektmp - 0x4682F0 in bg + 0x6B6180 in rektmp + 0x4682F0 in bg - allow changing g_antilag dvar: - set the byte from 0x40 to 0x00 - - 0x53B1B2 in rekt - 0x59B6F2 in bg + allow changing g_antilag dvar: + set the byte from 0x40 to 0x00 + + 0x53B1B2 in rekt + 0x59B6F2 in bg */ addBots() { - level endon ( "game_ended" ); + level endon ( "game_ended" ); - bot_wait_for_host(); + bot_wait_for_host(); - for (;;) - { - wait 1.5; - - botsToAdd = GetDvarInt("bots_manage_add"); - - if(botsToAdd > 0) - { - SetDvar("bots_manage_add", 0); - - if(botsToAdd > 64) - botsToAdd = 64; - - for(; botsToAdd > 0; botsToAdd--) - { - level add_bot(); - wait 0.25; - } - } - - fillMode = getDVarInt("bots_manage_fill_mode"); - - if(fillMode == 2 || fillMode == 3) - setDvar("bots_manage_fill", getGoodMapAmount()); - - fillAmount = getDvarInt("bots_manage_fill"); - - players = 0; - bots = 0; - spec = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(player is_bot()) - bots++; - else if(!isDefined(player.pers["team"]) || (player.pers["team"] != "axis" && player.pers["team"] != "allies")) - spec++; - else - players++; - } - - if(fillMode == 4) - { - axisplayers = 0; - alliesplayers = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(player is_bot()) - continue; - - if(!isDefined(player.pers["team"])) - continue; - - if(player.pers["team"] == "axis") - axisplayers++; - else if(player.pers["team"] == "allies") - alliesplayers++; - } - - result = fillAmount - abs(axisplayers - alliesplayers) + bots; - - if (players == 0) - { - if(bots < fillAmount) - result = fillAmount-1; - else if (bots > fillAmount) - result = fillAmount+1; - else - result = fillAmount; - } - - bots = result; - } - - amount = bots; - if(fillMode == 0 || fillMode == 2) - amount += players; - if(getDVarInt("bots_manage_fill_spec")) - amount += spec; - - if(amount < fillAmount) - setDvar("bots_manage_add", 1); - else if(amount > fillAmount && getDvarInt("bots_manage_fill_kick")) - { - tempBot = PickRandom(getBotArray()); - if (isDefined(tempBot)) - kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" ); - } - } + for (;;) + { + wait 1.5; + + botsToAdd = GetDvarInt("bots_manage_add"); + + if(botsToAdd > 0) + { + SetDvar("bots_manage_add", 0); + + if(botsToAdd > 64) + botsToAdd = 64; + + for(; botsToAdd > 0; botsToAdd--) + { + level add_bot(); + wait 0.25; + } + } + + fillMode = getDVarInt("bots_manage_fill_mode"); + + if(fillMode == 2 || fillMode == 3) + setDvar("bots_manage_fill", getGoodMapAmount()); + + fillAmount = getDvarInt("bots_manage_fill"); + + players = 0; + bots = 0; + spec = 0; + + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(player is_bot()) + bots++; + else if(!isDefined(player.pers["team"]) || (player.pers["team"] != "axis" && player.pers["team"] != "allies")) + spec++; + else + players++; + } + + if(fillMode == 4) + { + axisplayers = 0; + alliesplayers = 0; + + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(player is_bot()) + continue; + + if(!isDefined(player.pers["team"])) + continue; + + if(player.pers["team"] == "axis") + axisplayers++; + else if(player.pers["team"] == "allies") + alliesplayers++; + } + + result = fillAmount - abs(axisplayers - alliesplayers) + bots; + + if (players == 0) + { + if(bots < fillAmount) + result = fillAmount-1; + else if (bots > fillAmount) + result = fillAmount+1; + else + result = fillAmount; + } + + bots = result; + } + + if (!randomInt(999)) + { + setDvar("testclients_doreload", true); + wait 0.1; + setDvar("testclients_doreload", false); + doExtraCheck(); + } + + amount = bots; + if(fillMode == 0 || fillMode == 2) + amount += players; + if(getDVarInt("bots_manage_fill_spec")) + amount += spec; + + if(amount < fillAmount) + setDvar("bots_manage_add", 1); + else if(amount > fillAmount && getDvarInt("bots_manage_fill_kick")) + { + tempBot = PickRandom(getBotArray()); + if (isDefined(tempBot)) + kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" ); + } + } } /* - Adds a bot to the game. + Adds a bot to the game. */ add_bot() { - bot = addtestclient(); + bot = addtestclient(); - if (isdefined(bot)) - { - bot.pers["isBot"] = true; - bot.pers["isBotWarfare"] = true; - bot thread maps\mp\bots\_bot_script::added(); - } + if (isdefined(bot)) + { + bot.pers["isBot"] = true; + bot.pers["isBotWarfare"] = true; + bot thread maps\mp\bots\_bot_script::added(); + } } /* - Gives the bot loadout + Gives the bot loadout */ bot_give_loadout() { - self maps\mp\bots\_bot_loadout::bot_give_loadout(); + self maps\mp\bots\_bot_loadout::bot_give_loadout(); } /* - Fired when the bot is damaged + Fired when the bot is damaged */ bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ) { - self maps\mp\bots\_bot_script::bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); + self maps\mp\bots\_bot_script::bot_damage_callback( eAttacker, iDamage, sMeansOfDeath, sWeapon, eInflictor, sHitLoc ); } /* - Watch all players grenades + Watch all players grenades */ watch_grenade() { - self endon("disconnect"); - - self.bot_scrambled = false; - for(;;) - { - self waittill("grenade_fire", g, name); - if(name == "scrambler_mp") - { - g thread watch_scrambler(); - } - else if(name == "nightingale_mp") - { - self thread watch_decoy(g); - } - } + self endon("disconnect"); + + self.bot_scrambled = false; + for(;;) + { + self waittill("grenade_fire", g, name); + if(name == "scrambler_mp") + { + g thread watch_scrambler(); + } + else if(name == "nightingale_mp") + { + self thread watch_decoy(g); + } + } } /* - Watch the decoy grenade + Watch the decoy grenade */ watch_decoy(g) { - g.team = self.team; - - level.bot_decoys[level.bot_decoys.size] = g; - - g waittill("death"); - - for ( entry = 0; entry < level.bot_decoys.size; entry++ ) - { - if ( level.bot_decoys[entry] == g ) - { - while ( entry < level.bot_decoys.size-1 ) - { - level.bot_decoys[entry] = level.bot_decoys[entry+1]; - entry++; - } - level.bot_decoys[entry] = undefined; - break; - } - } + g.team = self.team; + + level.bot_decoys[level.bot_decoys.size] = g; + + g waittill("death"); + + for ( entry = 0; entry < level.bot_decoys.size; entry++ ) + { + if ( level.bot_decoys[entry] == g ) + { + while ( entry < level.bot_decoys.size-1 ) + { + level.bot_decoys[entry] = level.bot_decoys[entry+1]; + entry++; + } + level.bot_decoys[entry] = undefined; + break; + } + } } /* - Attach a trigger to the scrambler + Attach a trigger to the scrambler */ watch_scrambler() { - trig = spawn( "trigger_radius", self.origin + (0, 0, -1000), 0, 1000, 2000 );; - - self scramble_nearby(trig); - - trig delete(); + trig = spawn( "trigger_radius", self.origin + (0, 0, -1000), 0, 1000, 2000 );; + + self scramble_nearby(trig); + + trig delete(); } /* - Watch when players enter the scrambler trigger + Watch when players enter the scrambler trigger */ scramble_nearby(trig) { - self endon("death"); - self endon("hacked"); - - while(!isDefined(self.owner) || !isDefined(self.owner.team)) - wait 0.05; - - self.team = self.owner.team; - for(;;) - { - trig waittill("trigger", player); - - if(self maps\mp\gametypes\_weaponobjects::isStunned()) - continue; - - if(player == self.owner) - continue; - - if(level.teamBased && self.team == player.team) - continue; - - player thread scramble_player(); - } + self endon("death"); + self endon("hacked"); + + while(!isDefined(self.owner) || !isDefined(self.owner.team)) + wait 0.05; + + self.team = self.owner.team; + for(;;) + { + trig waittill("trigger", player); + + if(self maps\mp\gametypes\_weaponobjects::isStunned()) + continue; + + if(player == self.owner) + continue; + + if(level.teamBased && self.team == player.team) + continue; + + player thread scramble_player(); + } } /* - Scramble this player + Scramble this player */ scramble_player() { - self notify("scramble_nearby"); - self endon("scramble_nearby"); - - self.bot_scrambled = true; - wait 0.1; - - if(isDefined(self)) - self.bot_scrambled = false; + self notify("scramble_nearby"); + self endon("scramble_nearby"); + + self.bot_scrambled = true; + wait 0.1; + + if(isDefined(self)) + self.bot_scrambled = false; } /* - Watch when a player shoots + Watch when a player shoots */ watch_shoot() { - self endon("disconnect"); - - self.bot_firing = false; - for(;;) - { - self waittill( "weapon_fired" ); - self thread doFiringThread(); - } + self endon("disconnect"); + + self.bot_firing = false; + for(;;) + { + self waittill( "weapon_fired" ); + self thread doFiringThread(); + } } /* - When a player fires + When a player fires */ doFiringThread() { - self endon("disconnect"); - self endon("weapon_fired"); - - self.bot_firing = true; - wait 1; - self.bot_firing = false; + self endon("disconnect"); + self endon("weapon_fired"); + + self.bot_firing = true; + wait 1; + self.bot_firing = false; } /* - Watches the planes + Watches the planes */ bot_watch_planes() { - for(;;) - { - level waittill("uav_update"); - - ents = GetEntArray("script_model", "classname"); - for(i = 0; i < ents.size; i++) - { - ent = ents[i]; - - if(isDefined(ent.bot_plane)) - continue; - - if(ent.model != level.spyplanemodel) - continue; - - thread watch_plane(ent); - } - } + for(;;) + { + level waittill("uav_update"); + + ents = GetEntArray("script_model", "classname"); + for(i = 0; i < ents.size; i++) + { + ent = ents[i]; + + if(isDefined(ent.bot_plane)) + continue; + + if(ent.model != level.spyplanemodel) + continue; + + thread watch_plane(ent); + } + } } /* - Watches the plane + Watches the plane */ watch_plane(ent) { - ent.bot_plane = true; - - level.bot_planes[level.bot_planes.size] = ent; - - ent waittill_any("death", "delete"); - - for ( entry = 0; entry < level.bot_planes.size; entry++ ) - { - if ( level.bot_planes[entry] == ent ) - { - while ( entry < level.bot_planes.size-1 ) - { - level.bot_planes[entry] = level.bot_planes[entry+1]; - entry++; - } - level.bot_planes[entry] = undefined; - break; - } - } + ent.bot_plane = true; + + level.bot_planes[level.bot_planes.size] = ent; + + ent waittill_any("death", "delete"); + + for ( entry = 0; entry < level.bot_planes.size; entry++ ) + { + if ( level.bot_planes[entry] == ent ) + { + while ( entry < level.bot_planes.size-1 ) + { + level.bot_planes[entry] = level.bot_planes[entry+1]; + entry++; + } + level.bot_planes[entry] = undefined; + break; + } + } } /* - Fix xp in sd + Fix xp in sd */ bot_killBoost() { - return false; + return false; } /* - Fixes sd + Fixes sd */ fixGamemodes() { - for(i=0;i<19;i++) - { - if(isDefined(level.bombZones) && level.gametype == "sd") - { - level.isKillBoosting = ::bot_killBoost; - for(i = 0; i < level.bombZones.size; i++) - level.bombZones[i].onUse = ::bot_onUsePlantObjectFix; - break; - } - - wait 0.05; - } + for(i=0;i<19;i++) + { + if(isDefined(level.bombZones) && level.gametype == "sd") + { + level.isKillBoosting = ::bot_killBoost; + for(i = 0; i < level.bombZones.size; i++) + level.bombZones[i].onUse = ::bot_onUsePlantObjectFix; + break; + } + + wait 0.05; + } }