/******************************************************************* * Decompiled By: Bog * Decompiled File: maps\mp\bots\_bots.gsc * Game: Call of Duty: Ghosts * Platform: PC * Function Count: 109 * Decompile Time: 2169 ms * Timestamp: 10/27/2023 1:17:05 AM *******************************************************************/ //Function Number: 1 func_4FDD() { if(maps\mp\_utility::func_47BB()) { return; } if(isdefined(level.createfx_enabled) && level.createfx_enabled) { return; } if(level.script == "mp_character_room") { return; } func_710C(); maps/mp/bots/_bots_personality::func_719E(); level.badplace_cylinder_func = ::badplace_cylinder; level.badplace_delete_func = ::badplace_delete; maps/mp/bots/_bots_ks::bot_killstreak_setup(); maps/mp/bots/_bots_loadout::func_44DF(); level thread func_44DF(); } //Function Number: 2 func_710C() { level.bot_funcs = []; level.bot_funcs["bots_spawn"] = ::func_778F; level.bot_funcs["bots_add_scavenger_bag"] = ::func_1576; level.bot_funcs["bots_add_to_level_targets"] = ::maps/mp/bots/_bots_util::bot_add_to_bot_level_targets; level.bot_funcs["bots_remove_from_level_targets"] = ::maps/mp/bots/_bots_util::bot_remove_from_bot_level_targets; level.bot_funcs["bots_make_entity_sentient"] = ::func_1630; level.bot_funcs["think"] = ::func_16AB; level.bot_funcs["on_killed"] = ::func_58DB; level.bot_funcs["should_do_killcam"] = ::bot_should_do_killcam; level.bot_funcs["get_attacker_ent"] = ::maps/mp/bots/_bots_util::bot_get_known_attacker; level.bot_funcs["should_pickup_weapons"] = ::bot_should_pickup_weapons; level.bot_funcs["on_damaged"] = ::bot_damage_callback; level.bot_funcs["gametype_think"] = ::func_2495; level.bot_funcs["leader_dialog"] = ::maps/mp/bots/_bots_util::func_161D; level.bot_funcs["player_spawned"] = ::func_1661; level.bot_funcs["should_start_cautious_approach"] = ::maps/mp/bots/_bots_strategy::func_7490; level.bot_funcs["know_enemies_on_start"] = ::func_161A; level.bot_funcs["bot_get_rank_xp"] = ::bot_get_rank_xp; level.bot_funcs["ai_3d_sighting_model"] = ::bot_3d_sighting_model; level.bot_funcs["dropped_weapon_think"] = ::bot_think_seek_dropped_weapons; level.bot_funcs["dropped_weapon_cancel"] = ::func_7491; level.bot_funcs["crate_can_use"] = ::crate_can_use_always; level.bot_funcs["crate_low_ammo_check"] = ::crate_low_ammo_check; level.bot_funcs["crate_should_claim"] = ::func_2036; level.bot_funcs["crate_wait_use"] = ::func_2037; level.bot_funcs["crate_in_range"] = ::func_2030; level.bot_funcs["post_teleport"] = ::bot_post_teleport; level.bot_random_path_function = []; level.bot_random_path_function["allies"] = ::maps/mp/bots/_bots_personality::bot_random_path_default; level.bot_random_path_function["axis"] = ::maps/mp/bots/_bots_personality::bot_random_path_default; level.bot_can_use_box_by_type["deployable_vest"] = ::func_1698; level.bot_can_use_box_by_type["deployable_ammo"] = ::bot_should_use_ammo_crate; level.bot_can_use_box_by_type["scavenger_bag"] = ::bot_should_use_scavenger_bag; level.bot_can_use_box_by_type["deployable_grenades"] = ::bot_should_use_grenade_crate; level.bot_can_use_box_by_type["deployable_juicebox"] = ::func_169A; level.bot_pre_use_box_of_type["deployable_ammo"] = ::func_1666; level.bot_post_use_box_of_type["deployable_ammo"] = ::bot_post_use_ammo_crate; level.bot_find_defend_node_func["capture"] = ::maps/mp/bots/_bots_strategy::find_defend_node_capture; level.bot_find_defend_node_func["capture_zone"] = ::maps/mp/bots/_bots_strategy::func_3267; level.bot_find_defend_node_func["protect"] = ::maps/mp/bots/_bots_strategy::find_defend_node_protect; level.bot_find_defend_node_func["bodyguard"] = ::maps/mp/bots/_bots_strategy::func_3265; level.bot_find_defend_node_func["patrol"] = ::maps/mp/bots/_bots_strategy::func_3268; maps/mp/bots/_bots_gametype_war::func_710C(); if(maps\mp\_utility::bot_is_fireteam_mode()) { maps/mp/bots/_bots_fireteam::bot_fireteam_setup_callbacks(); } } //Function Number: 3 codecallback_leaderdialog(param_00,param_01) { if(isdefined(level.bot_funcs) && isdefined(level.bot_funcs["leader_dialog"])) { self [[ level.bot_funcs["leader_dialog"] ]](param_00,param_01); } } //Function Number: 4 func_44DF() { thread func_535C(); thread bot_triggers(); func_45F4(); if(!func_74C4()) { } func_643A(); var_00 = botautoconnectenabled(); if(var_00 > 0) { setmatchdata("hasBots",1); if(maps\mp\_utility::bot_is_fireteam_mode()) { level thread maps/mp/bots/_bots_fireteam::func_15D3(); level thread maps/mp/bots/_bots_fireteam_commander::func_44DF(); } level thread bot_connect_monitor(); } } //Function Number: 5 func_45F4() { if(!isdefined(level.crateownerusetime)) { level.crateownerusetime = 500; } if(!isdefined(level.cratenonownerusetime)) { level.cratenonownerusetime = 3000; } level.bot_out_of_combat_time = 3000; level.bot_respawn_launcher_name = "iw6_panzerfaust3"; level.bot_fallback_weapon = "iw6_knifeonly"; level.zonecount = getzonecount(); func_45F5(); } //Function Number: 6 func_45F5() { if(isdefined(level.teleportgetactivenodesfunc)) { var_00 = [[ level.teleportgetactivenodesfunc ]](); } else { var_00 = getallnodes(); } level.bot_map_min_x = 0; level.bot_map_max_x = 0; level.bot_map_min_y = 0; level.bot_map_max_y = 0; level.bot_map_min_z = 0; level.var_1634 = 0; if(var_00.size > 1) { level.bot_map_min_x = var_00[0].origin[0]; level.bot_map_max_x = var_00[0].origin[0]; level.bot_map_min_y = var_00[0].origin[1]; level.bot_map_max_y = var_00[0].origin[1]; level.bot_map_min_z = var_00[0].origin[2]; level.var_1634 = var_00[0].origin[2]; for(var_01 = 1;var_01 < var_00.size;var_01++) { var_02 = var_00[var_01].origin; if(var_02[0] < level.bot_map_min_x) { level.bot_map_min_x = var_02[0]; } if(var_02[0] > level.bot_map_max_x) { level.bot_map_max_x = var_02[0]; } if(var_02[1] < level.bot_map_min_y) { level.bot_map_min_y = var_02[1]; } if(var_02[1] > level.bot_map_max_y) { level.bot_map_max_y = var_02[1]; } if(var_02[2] < level.bot_map_min_z) { level.bot_map_min_z = var_02[2]; } if(var_02[2] > level.var_1634) { level.var_1634 = var_02[2]; } } } level.bot_map_center = (level.bot_map_min_x + level.bot_map_max_x / 2,level.bot_map_min_y + level.bot_map_max_y / 2,level.bot_map_min_z + level.var_1634 / 2); level.bot_variables_initialized = 1; } //Function Number: 7 bot_post_teleport() { level.bot_variables_initialized = undefined; level.bot_initialized_remote_vehicles = undefined; func_45F5(); maps/mp/bots/_bots_ks_remote_vehicle::func_64D4(); } //Function Number: 8 func_74C4() { return 1; } //Function Number: 9 func_643A() { wait(1); foreach(var_01 in level.players) { if(isbot(var_01)) { var_01.equipment_enabled = 1; var_01.bot_team = var_01.team; var_01.bot_spawned_before = 1; var_01 thread [[ level.bot_funcs["think"] ]](); } } } //Function Number: 10 func_1661() { func_168C(); if(isdefined(self.prev_personality)) { maps/mp/bots/_bots_util::bot_set_personality(self.prev_personality); self.prev_personality = undefined; } } //Function Number: 11 func_168C() { if(!isdefined(self.bot_class)) { if(!bot_gametype_chooses_class()) { while(!isdefined(level.bot_loadouts_initialized)) { wait(0.05); } if(isdefined(self.override_class_function)) { self.bot_class = [[ self.override_class_function ]](); } self.bot_class = maps/mp/bots/_bots_personality::bot_setup_callback_class(); } self.bot_class = self.class; } } //Function Number: 12 func_8CAD() { for(;;) { level waittill("connected",var_00); if(!isai(var_00) && level.players.size > 0) { level.players_waiting_to_join = common_scripts\utility::array_add(level.players_waiting_to_join,var_00); childthread func_16DF(var_00); childthread bots_notify_on_disconnect(var_00); childthread func_16E0(var_00); } } } //Function Number: 13 func_16DF(param_00) { param_00 endon("bots_human_disconnected"); while(!common_scripts\utility::array_contains(level.players,param_00)) { wait(0.05); } param_00 notify("bots_human_spawned"); } //Function Number: 14 bots_notify_on_disconnect(param_00) { param_00 endon("bots_human_spawned"); param_00 waittill("disconnect"); param_00 notify("bots_human_disconnected"); } //Function Number: 15 func_16E0(param_00) { param_00 common_scripts\utility::func_8B2A("bots_human_spawned","bots_human_disconnected"); level.players_waiting_to_join = common_scripts\utility::array_remove(level.players_waiting_to_join,param_00); } //Function Number: 16 func_5354() { level.players_waiting_to_join = []; childthread func_8CAD(); for(;;) { if(level.players_waiting_to_join.size > 0) { level.pausing_bot_connect_monitor = 1; } else { level.pausing_bot_connect_monitor = 0; } wait(0.5); } } //Function Number: 17 func_8FD9(param_00) { if(maps\mp\_utility::func_50C1()) { return 1; } if(getdvar("squad_vs_squad") == "1") { return 1; } if(!level.teambased) { return 1; } if(maps\mp\gametypes\_teams::func_3AE0(param_00)) { return 1; } return 0; } //Function Number: 18 bot_connect_monitor(param_00,param_01) { level endon("game_ended"); self notify("bot_connect_monitor"); self endon("bot_connect_monitor"); level.pausing_bot_connect_monitor = 0; childthread func_5354(); maps\mp\gametypes\_hostmigration::func_8B0D(0.5); var_02 = 1.5; if(!isdefined(level.bot_cm_spawned_bots)) { level.bot_cm_spawned_bots = 0; } if(!isdefined(level.bot_cm_waited_players_time)) { level.bot_cm_waited_players_time = 0; } if(!isdefined(level.bot_cm_human_picked)) { level.bot_cm_human_picked = 0; } if(getdvar("squad_vs_squad") == "1") { while(!isdefined(level.squad_vs_squad_allies_client) && isdefined(level.squad_vs_squad_axis_client)) { wait(0.05); } wait(2); } if(getdvar("squad_match") == "1") { while(!isdefined(level.squad_match_client)) { wait(0.05); } wait(2); } if(getdvar("squad_use_hosts_squad") == "1") { while(!isdefined(level.wargame_client)) { wait(0.05); } wait(2); } for(;;) { if(level.pausing_bot_connect_monitor) { maps\mp\gametypes\_hostmigration::func_8B0D(var_02); continue; } var_03 = isdefined(level.bots_ignore_team_balance) || !level.teambased; var_04 = botgetteamlimit(0); var_05 = botgetteamlimit(1); var_06 = botgetteamdifficulty(0); var_07 = botgetteamdifficulty(1); var_08 = "allies"; var_09 = "axis"; var_0A = bot_client_counts(); var_0B = cat_array_get(var_0A,"humans"); if(var_0B > 1) { var_0C = bot_get_host_team(); if(!maps\mp\_utility::func_50C1() && isdefined(var_0C) && var_0C != "spectator") { var_08 = var_0C; var_09 = maps\mp\_utility::getotherteam(var_0C); } else { var_0D = cat_array_get(var_0A,"humans_allies"); var_0E = cat_array_get(var_0A,"humans_axis"); if(var_0E > var_0D) { var_08 = "axis"; var_09 = "allies"; } } } else { var_0F = get_human_player(); if(isdefined(var_0F)) { var_10 = var_0F bot_get_player_team(); if(isdefined(var_10) && var_10 != "spectator") { var_08 = var_10; var_09 = maps\mp\_utility::getotherteam(var_10); } } } var_11 = maps/mp/bots/_bots_util::bot_get_team_limit(); var_12 = maps/mp/bots/_bots_util::bot_get_team_limit(); if(var_11 + var_12 < maps/mp/bots/_bots_util::bot_get_client_limit()) { if(var_11 < var_04) { var_11++; } else if(var_12 < var_05) { var_12++; } } var_13 = cat_array_get(var_0A,"humans_" + var_08); var_14 = cat_array_get(var_0A,"humans_" + var_09); var_15 = var_13 + var_14; var_16 = cat_array_get(var_0A,"spectator"); var_17 = 0; var_18 = 0; while(var_16 > 0) { var_19 = var_13 + var_17 + 1 <= var_11; var_1A = var_14 + var_18 + 1 <= var_12; if(var_19 && !var_1A) { var_17++; continue; } if(!var_19 && var_1A) { var_18++; continue; } if(var_19 && var_1A) { if(var_16 % 2 == 1) { var_17++; continue; } var_18++; } var_16--; } var_1B = cat_array_get(var_0A,"bots_" + var_08); var_1C = cat_array_get(var_0A,"bots_" + var_09); var_1D = var_1B + var_1C; if(var_1D > 0) { level.bot_cm_spawned_bots = 1; } var_1E = 0; if(!level.bot_cm_human_picked) { var_1E = !func_8FEE(); if(!var_1E) { level.bot_cm_human_picked = 1; } } if(var_1E) { var_1F = !getdvarint("systemlink") && !getdvarint("onlinegame"); var_20 = !var_03 && var_05 != var_04 && !level.bot_cm_spawned_bots && level.bot_cm_waited_players_time < 10 || !maps\mp\_utility::func_36F1("prematch_done"); if(var_1F || var_20) { level.bot_cm_waited_players_time = level.bot_cm_waited_players_time + var_02; maps\mp\gametypes\_hostmigration::func_8B0D(var_02); continue; } } var_21 = int(min(var_11 - var_13 - var_17,var_04)); var_22 = int(min(var_12 - var_14 - var_18,var_05)); var_23 = 1; var_24 = var_21 + var_22 + var_0B; var_25 = var_04 + var_05 + var_0B; var_26 = [-1,-1]; while(var_24 < maps/mp/bots/_bots_util::bot_get_client_limit() && var_24 < var_25) { if(var_23 && var_21 < var_04 && func_8FD9(var_08)) { var_21++; } else if(!var_23 && var_22 < var_05 && func_8FD9(var_09)) { var_22++; } var_24 = var_21 + var_22 + var_0B; if(var_26[var_23] == var_24) { break; } var_26[var_23] = var_24; var_23 = !var_23; } if(var_04 == var_05 && !var_03 && var_17 == 1 && var_18 == 0 && var_22 > 0) { if(!isdefined(level.bot_prematchdonetime) && maps\mp\_utility::func_36F1("prematch_done")) { level.bot_prematchdonetime = gettime(); } if(var_1E && !isdefined(level.bot_prematchdonetime) || gettime() - level.bot_prematchdonetime < 10000) { var_22--; } } var_27 = var_21 - var_1B; var_28 = var_22 - var_1C; var_29 = 1; if(var_03) { var_2A = var_11 + var_12; var_2B = var_04 + var_05; var_2C = var_13 + var_14; var_2D = var_1B + var_1C; var_2E = int(min(var_2A - var_2C,var_2B)); var_2F = var_2E - var_2D; if(var_2F == 0) { var_29 = 0; } else if(var_2F > 0) { var_27 = int(var_2F / 2) + var_2F % 2; var_28 = int(var_2F / 2); } else if(var_2F < 0) { var_30 = var_2F * -1; var_27 = -1 * int(min(var_30,var_1B)); var_28 = -1 * var_30 + var_27; } } else if(!maps\mp\_utility::func_50C1() && var_27 * var_28 < 0 && maps\mp\_utility::func_36F1("prematch_done") && !isdefined(level.bots_disable_team_switching)) { var_31 = int(min(abs(var_27),abs(var_28))); if(var_27 > 0) { func_5435(var_31,var_09,var_08,var_06); } else if(var_28 > 0) { func_5435(var_31,var_08,var_09,var_07); } var_29 = 0; } if(var_29) { if(var_28 < 0) { func_2B33(var_28 * -1,var_09); } if(var_27 < 0) { func_2B33(var_27 * -1,var_08); } if(var_28 > 0) { level thread func_778F(var_28,var_09,undefined,undefined,"spawned_enemies",var_07); } if(var_27 > 0) { level thread func_778F(var_27,var_08,undefined,undefined,"spawned_allies",var_06); } if(var_28 > 0 && var_27 > 0) { level common_scripts\utility::func_8B73("spawned_enemies","spawned_allies"); } else if(var_28 > 0) { level waittill("spawned_enemies"); } else if(var_27 > 0) { level waittill("spawned_allies"); } } if(var_07 != var_06) { bots_update_difficulty(var_09,var_07); bots_update_difficulty(var_08,var_06); } maps\mp\gametypes\_hostmigration::func_8B0D(var_02); } } //Function Number: 19 bot_get_player_team() { if(isdefined(self.team)) { return self.team; } if(isdefined(self.pers["team"])) { return self.pers["team"]; } return undefined; } //Function Number: 20 bot_get_host_team() { foreach(var_01 in level.players) { if(!isai(var_01) && var_01 ishost()) { return var_01 bot_get_player_team(); } } return "spectator"; } //Function Number: 21 func_8FEE() { var_00 = 0; var_01 = 0; var_02 = 0; foreach(var_04 in level.players) { if(!isai(var_04)) { if(var_04 ishost()) { var_00 = 1; } if(func_93A7(var_04)) { var_01 = 1; if(var_04 ishost()) { var_02 = 1; } } } } return var_02 || var_01 && !var_00; } //Function Number: 22 func_93A7(param_00) { if(isdefined(param_00.team) && param_00.team != "spectator") { return 1; } if(isdefined(param_00.spectating_actively) && param_00.spectating_actively) { return 1; } if(param_00 ismlgspectator() && isdefined(param_00.team) && param_00.team == "spectator") { return 1; } return 0; } //Function Number: 23 bot_client_counts() { var_00 = []; for(var_01 = 0;var_01 < level.players.size;var_01++) { var_02 = level.players[var_01]; if(isdefined(var_02) && isdefined(var_02.team)) { var_00 = cat_array_add(var_00,"all"); var_00 = cat_array_add(var_00,var_02.team); if(isbot(var_02)) { var_00 = cat_array_add(var_00,"bots"); var_00 = cat_array_add(var_00,"bots_" + var_02.team); continue; } var_00 = cat_array_add(var_00,"humans"); var_00 = cat_array_add(var_00,"humans_" + var_02.team); } } return var_00; } //Function Number: 24 cat_array_add(param_00,param_01) { if(!isdefined(param_00)) { param_00 = []; } if(!isdefined(param_00[param_01])) { param_00[param_01] = 0; } param_00[param_01] = param_00[param_01] + 1; return param_00; } //Function Number: 25 cat_array_get(param_00,param_01) { if(!isdefined(param_00)) { return 0; } if(!isdefined(param_00[param_01])) { return 0; } return param_00[param_01]; } //Function Number: 26 func_5435(param_00,param_01,param_02,param_03) { foreach(var_05 in level.players) { if(!isdefined(var_05.team)) { continue; } if(isdefined(var_05.connected) && var_05.connected && isbot(var_05) && var_05.team == param_01) { var_05.bot_team = param_02; if(isdefined(param_03)) { var_05 maps/mp/bots/_bots_util::bot_set_difficulty(param_03); } var_05 notify("luinotifyserver","team_select",bot_lui_convert_team_to_int(param_02)); wait(0.05); var_05 notify("luinotifyserver","class_select",var_05.bot_class); param_00--; if(param_00 <= 0) { break; } else { wait(0.1); } } } } //Function Number: 27 bots_update_difficulty(param_00,param_01) { foreach(var_03 in level.players) { if(!isdefined(var_03.team)) { continue; } if(isdefined(var_03.connected) && var_03.connected && isbot(var_03) && var_03.team == param_00) { if(param_01 != var_03 botgetdifficulty()) { var_03 maps/mp/bots/_bots_util::bot_set_difficulty(param_01); } } } } //Function Number: 28 bot_drop() { kick(self.entity_number,"EXE_PLAYERKICKED_BOT_BALANCE"); wait(0.1); } //Function Number: 29 func_2B33(param_00,param_01) { var_02 = []; foreach(var_04 in level.players) { if(isdefined(var_04.connected) && var_04.connected && isbot(var_04) && !isdefined(param_01) || isdefined(var_04.team) && var_04.team == param_01) { var_02[var_02.size] = var_04; } } for(var_06 = var_02.size - 1;var_06 >= 0;var_06--) { if(param_00 <= 0) { break; } if(!maps\mp\_utility::func_4945(var_02[var_06])) { var_02[var_06] bot_drop(); var_02 = common_scripts\utility::array_remove(var_02,var_02[var_06]); param_00--; } } for(var_06 = var_02.size - 1;var_06 >= 0;var_06--) { if(param_00 <= 0) { break; } var_02[var_06] bot_drop(); param_00--; } } //Function Number: 30 bot_lui_convert_team_to_int(param_00) { if(param_00 == "axis") { return 0; } if(param_00 == "allies") { return 1; } if(param_00 == "autoassign" || param_00 == "random") { return 2; } return 3; } //Function Number: 31 func_778E(param_00,param_01,param_02) { var_03 = gettime() + -5536; while(!self canspawntestclient()) { if(gettime() >= var_03) { kick(self.entity_number,"EXE_PLAYERKICKED_BOT_BALANCE"); param_02.abort = 1; } wait(0.05); if(!isdefined(self)) { param_02.abort = 1; } } maps\mp\gametypes\_hostmigration::func_8B0D(randomfloatrange(0.25,2)); if(!isdefined(self)) { param_02.abort = 1; } self spawntestclient(); self.pers["isBot"] = 1; self.equipment_enabled = 1; self.bot_team = param_00; if(isdefined(param_02.difficulty)) { maps/mp/bots/_bots_util::bot_set_difficulty(param_02.difficulty); } if(isdefined(param_01)) { self [[ param_01 ]](); } self thread [[ level.bot_funcs["think"] ]](); param_02.ready = 1; } //Function Number: 32 func_9150(param_00,param_01) { var_02 = param_00 getrankedplayerdata("activeSquadMember"); var_03 = 0; for(var_04 = 0;var_04 < 10;var_04++) { var_03 = 0; var_05 = param_00 getrankedplayerdata("squadHQ","aiSquadMembers",var_04); if(var_05 == var_02) { var_04++; continue; } if(!isdefined(level.human_team_bot_added) || !isdefined(level.human_team_bot_added[var_05]) || level.human_team_bot_added[var_05] == 0) { return var_05; } } return -1; } //Function Number: 33 func_778F(param_00,param_01,param_02,param_03,param_04,param_05) { var_06 = gettime() + 10000; var_07 = []; var_08 = var_07.size; while(level.players.size < maps/mp/bots/_bots_util::bot_get_client_limit() && var_07.size < param_00 && gettime() < var_06) { maps\mp\gametypes\_hostmigration::func_8B0D(0.05); var_09 = undefined; if(getdvar("squad_vs_squad") == "1") { var_0A = level.squad_vs_squad_axis_client; if(param_01 == "allies") { var_0A = level.squad_vs_squad_allies_client; } if(isdefined(var_0A)) { var_0B = var_08; var_0C = var_0A getrankedplayerdata("activeSquadMember"); var_0D = 0; var_0E = 0; for(var_0F = 0;var_0F < maps/mp/bots/_bots_util::bot_get_team_limit();var_0F++) { var_0E = var_0A getrankedplayerdata("squadHQ","aiSquadMembers",var_0F); if(var_0E == var_0C) { continue; } if(var_0B == var_0D) { break; } var_0D++; } var_10 = var_0A getrankedplayerdata("squadMembers",var_0E,"name"); var_11 = var_0A getrankedplayerdata("squadMembers",var_0E,"head"); var_12 = var_0A getrankedplayerdata("squadMembers",var_0E,"body"); var_13 = var_0A getrankedplayerdata("squadMembers",var_0E,"helmet"); var_09 = addbot(var_10,var_11,var_12,var_13); if(isdefined(var_09)) { var_09.pers["squadSlot"] = var_0E; } } else if(!isdefined(level.squad_vs_squad_has_forfeited)) { if(isdefined(level.squad_vs_squad_axis_client)) { level.finalkillcam_winner = "axis"; thread maps\mp\gametypes\_gamelogic::endgame("axis",game["end_reason"]["allies_forfeited"]); } else { level.finalkillcam_winner = "allies"; thread maps\mp\gametypes\_gamelogic::endgame("allies",game["end_reason"]["axis_forfeited"]); } level.squad_vs_squad_has_forfeited = 1; } } else if(getdvar("squad_use_hosts_squad") == "1") { if(level.wargame_client.team == param_01) { if(maps\mp\_utility::func_50C1()) { var_0E = func_9150(level.wargame_client,param_01); var_10 = level.wargame_client getrankedplayerdata("squadMembers",var_0E,"name"); var_11 = level.wargame_client getrankedplayerdata("squadMembers",var_0E,"head"); var_12 = level.wargame_client getrankedplayerdata("squadMembers",var_0E,"body"); var_13 = level.wargame_client getrankedplayerdata("squadMembers",var_0E,"helmet"); var_09 = addbot(var_10,var_11,var_12,var_13); if(isdefined(var_09)) { level.human_team_bot_added[var_0E] = 1; var_09.pers["squadSlot"] = var_0E; } } else { var_0B = var_11; var_0C = level.wargame_client getprivateplayerdata("privateMatchActiveSquadMember"); var_0D = 0; var_0E = 0; for(var_0F = 0;var_0F < maps/mp/bots/_bots_util::bot_get_team_limit();var_0F++) { var_0E = var_0F; if(var_0F == var_0C) { continue; } if(var_0B == var_0D) { break; } var_0D++; } var_10 = level.wargame_client getprivateplayerdata("privateMatchSquadMembers",var_0E,"name"); var_11 = level.wargame_client getprivateplayerdata("privateMatchSquadMembers",var_0E,"head"); var_12 = level.wargame_client getprivateplayerdata("privateMatchSquadMembers",var_0E,"body"); var_13 = level.wargame_client getprivateplayerdata("privateMatchSquadMembers",var_0E,"helmet"); var_09 = addbot(var_10,var_11,var_12,var_13); if(isdefined(var_09)) { var_09.pers["squadSlot"] = var_0E; } } } else { var_09 = addbot("",0,0,0); } } else if(getdvar("squad_match") == "1") { if(param_01 == "axis") { var_0E = getenemysquaddata("squadHQ","aiSquadMembers",var_08); var_10 = getenemysquaddata("squadMembers",var_0E,"name"); var_11 = getenemysquaddata("squadMembers",var_0E,"head"); var_12 = getenemysquaddata("squadMembers",var_0E,"body"); var_13 = getenemysquaddata("squadMembers",var_0E,"helmet"); var_09 = addbot(var_10,var_11,var_12,var_13); if(isdefined(var_09)) { var_09.pers["squadSlot"] = var_0E; } } else { var_0E = func_9150(level.squad_match_client,param_02); if(var_0E > -1) { var_10 = level.squad_match_client getrankedplayerdata("squadMembers",var_0E,"name"); var_11 = level.squad_match_client getrankedplayerdata("squadMembers",var_0E,"head"); var_12 = level.squad_match_client getrankedplayerdata("squadMembers",var_0E,"body"); var_13 = level.squad_match_client getrankedplayerdata("squadMembers",var_0E,"helmet"); var_09 = addbot(var_10,var_11,var_12,var_13); if(isdefined(var_09)) { level.human_team_bot_added[var_0E] = 1; var_09.pers["squadSlot"] = var_0E; } } } } else { var_09 = addbot("",0,0,0); } if(!isdefined(var_09)) { if(isdefined(param_03) && param_03) { if(isdefined(param_04)) { self notify(param_04); } } maps\mp\gametypes\_hostmigration::func_8B0D(1); continue; } else { var_14 = spawnstruct(); var_14.bot = var_09; var_14.ready = 0; var_14.abort = 0; var_14.index = var_08; var_14.difficulty = param_05; var_07[var_07.size] = var_14; var_14.bot thread func_778E(param_01,param_02,var_14); var_08++; } } var_15 = 0; var_06 = gettime() + -5536; while(var_15 < var_07.size && gettime() < var_06) { var_15 = 0; foreach(var_14 in var_07) { if(var_14.ready || var_14.abort) { var_15++; } } wait(0.05); } if(isdefined(param_04)) { self notify(param_04); } } //Function Number: 34 bot_gametype_chooses_team() { if(!level.teambased) { return 1; } if(isdefined(level.bots_gametype_handles_team_choice) && level.bots_gametype_handles_team_choice) { return 1; } return 0; } //Function Number: 35 bot_gametype_chooses_class() { return isdefined(level.bots_gametype_handles_class_choice) && level.bots_gametype_handles_class_choice; } //Function Number: 36 func_16AB() { self notify("bot_think"); self endon("bot_think"); self endon("disconnect"); while(!isdefined(self.pers["team"])) { wait(0.05); } level.hasbots = 1; if(bot_gametype_chooses_team()) { self.bot_team = self.pers["team"]; } var_00 = self.bot_team; if(!isdefined(var_00)) { var_00 = self.pers["team"]; } maps/mp/bots/_bots_ks::bot_killstreak_setup(); self.entity_number = self getentitynumber(); var_01 = 0; if(!isdefined(self.bot_spawned_before)) { var_01 = 1; self.bot_spawned_before = 1; if(!bot_gametype_chooses_team()) { self notify("luinotifyserver","team_select",bot_lui_convert_team_to_int(var_00)); wait(0.5); if(self.pers["team"] == "spectator") { bot_drop(); } } } for(;;) { maps/mp/bots/_bots_util::bot_set_difficulty(self botgetdifficulty()); var_02 = self botgetdifficultysetting("advancedPersonality"); if(var_01 && isdefined(var_02) && var_02 != 0) { maps/mp/bots/_bots_personality::bot_balance_personality(); } maps/mp/bots/_bots_personality::func_157C(); if(var_01) { func_168C(); if(!bot_gametype_chooses_class()) { self notify("luinotifyserver","class_select",self.bot_class); } if(self.health == 0) { self waittill("spawned_player"); } if(isdefined(level.bot_funcs) && isdefined(level.bot_funcs["know_enemies_on_start"])) { self thread [[ level.bot_funcs["know_enemies_on_start"] ]](); } var_01 = 0; } bot_restart_think_threads(); wait(0.1); self waittill("death"); func_6633(); self waittill("spawned_player"); } } //Function Number: 37 func_6633() { self endon("started_spawnPlayer"); while(!self.waitingtospawn) { wait(0.05); } if(maps\mp\gametypes\_playerlogic::func_5591()) { while(self.waitingtospawn) { if(self.sessionstate == "spectator") { if(getdvarint("numlives") == 0 || self.pers["lives"] > 0) { self botpressbutton("use",0.5); } } wait(1); } } } //Function Number: 38 bot_get_rank_xp() { if(maps\mp\_utility::func_8FFB() == 0) { if(!isdefined(self.pers["rankxp"])) { self.pers["rankxp"] = 0; } return self.pers["rankxp"]; } var_00 = self botgetdifficulty(); var_01 = "bot_rank_" + var_00; if(isdefined(self.pers[var_01]) && self.pers[var_01] > 0) { return self.pers[var_01]; } var_02 = bot_random_ranks_for_difficulty(var_00); var_03 = var_02["rank"]; var_04 = var_02["prestige"]; var_05 = maps\mp\gametypes\_rank::func_3BC7(var_03); var_06 = var_05 + maps\mp\gametypes\_rank::func_3BC8(var_03); var_07 = randomintrange(var_05,var_06 + 1); self.pers[var_01] = var_07; return var_07; } //Function Number: 39 bot_3d_sighting_model(param_00) { thread bot_3d_sighting_model_thread(param_00); } //Function Number: 40 bot_3d_sighting_model_thread(param_00) { param_00 endon("disconnect"); self endon("disconnect"); level endon("game_ended"); for(;;) { if(isalive(self) && !self botcanseeentity(param_00) && common_scripts\utility::func_8E18(self.origin,self.angles,param_00.origin,self botgetfovdot())) { self botgetimperfectenemyinfo(param_00,param_00.origin); } wait(0.1); } } //Function Number: 41 bot_random_ranks_for_difficulty(param_00) { var_01 = []; var_01["rank"] = 0; var_01["prestige"] = 0; if(param_00 == "default") { return var_01; } if(!isdefined(level.bot_rnd_rank)) { level.bot_rnd_rank = []; level.bot_rnd_rank["recruit"][0] = 0; level.bot_rnd_rank["recruit"][1] = 7; level.bot_rnd_rank["regular"][0] = 9; level.bot_rnd_rank["regular"][1] = 37; level.bot_rnd_rank["hardened"][0] = 39; level.bot_rnd_rank["hardened"][1] = 57; level.bot_rnd_rank["veteran"][0] = 59; level.bot_rnd_rank["veteran"][1] = 59; } if(!isdefined(level.bot_rnd_prestige)) { level.bot_rnd_prestige = []; level.bot_rnd_prestige["recruit"][0] = 0; level.bot_rnd_prestige["recruit"][1] = 0; level.bot_rnd_prestige["regular"][0] = 0; level.bot_rnd_prestige["regular"][1] = 0; level.bot_rnd_prestige["hardened"][0] = 0; level.bot_rnd_prestige["hardened"][1] = 0; level.bot_rnd_prestige["veteran"][0] = 0; level.bot_rnd_prestige["veteran"][1] = 9; } if(isdefined(level.bot_rnd_rank[param_00][0]) && isdefined(level.bot_rnd_rank[param_00][1])) { var_01["rank"] = randomintrange(level.bot_rnd_rank[param_00][0],level.bot_rnd_rank[param_00][1] + 1); } if(isdefined(level.bot_rnd_prestige[param_00][0]) && isdefined(level.bot_rnd_prestige[param_00][1])) { var_01["prestige"] = randomintrange(level.bot_rnd_prestige[param_00][0],level.bot_rnd_prestige[param_00][1] + 1); } return var_01; } //Function Number: 42 crate_can_use_always(param_00) { if(isagent(self) && !isdefined(param_00.boxtype)) { return 0; } return 1; } //Function Number: 43 get_human_player() { var_00 = undefined; var_01 = getentarray("player","classname"); if(isdefined(var_01)) { for(var_02 = 0;var_02 < var_01.size;var_02++) { if(isdefined(var_01[var_02]) && isdefined(var_01[var_02].connected) && var_01[var_02].connected && !isai(var_01[var_02]) && !isdefined(var_00) || var_00.team == "spectator") { var_00 = var_01[var_02]; } } } return var_00; } //Function Number: 44 bot_damage_callback(param_00,param_01,param_02,param_03,param_04,param_05) { if(!isdefined(self) || !isalive(self)) { } if(param_02 == "MOD_FALLING" || param_02 == "MOD_SUICIDE") { } if(param_01 <= 0) { } if(!isdefined(param_04)) { if(!isdefined(param_00)) { } param_04 = param_00; } if(isdefined(param_04)) { if(level.teambased) { if(isdefined(param_04.team) && param_04.team == self.team) { } else if(isdefined(param_00) && isdefined(param_00.team) && param_00.team == self.team) { } } var_06 = maps/mp/bots/_bots_util::bot_get_known_attacker(param_00,param_04); if(isdefined(var_06)) { self botsetattacker(var_06); } } } //Function Number: 45 func_58DB(param_00,param_01,param_02,param_03,param_04,param_05,param_06,param_07,param_08,param_09) { self botclearscriptenemy(); self botclearscriptgoal(); var_0A = maps/mp/bots/_bots_util::bot_get_known_attacker(param_01,param_00); if(!maps\mp\_utility::bot_is_fireteam_mode() && getdvar("squad_match") != "1" && getdvar("squad_vs_squad") != "1" && isdefined(var_0A) && var_0A.classname == "script_vehicle" && isdefined(var_0A.helitype)) { var_0B = self botgetdifficultysetting("launcherRespawnChance"); if(randomfloat(1) < var_0B) { self.respawn_with_launcher = 1; } } } //Function Number: 46 bot_should_do_killcam() { if(maps\mp\_utility::bot_is_fireteam_mode()) { return 0; } var_00 = 0; var_01 = self botgetdifficulty(); if(var_01 == "recruit") { var_00 = 0.1; } else if(var_01 == "regular") { var_00 = 0.4; } else if(var_01 == "hardened") { var_00 = 0.7; } else if(var_01 == "veteran") { var_00 = 1; } return randomfloat(1) < 1 - var_00; } //Function Number: 47 bot_should_pickup_weapons() { if(maps\mp\_utility::isjuggernaut()) { return 0; } return 1; } //Function Number: 48 bot_restart_think_threads() { thread bot_think_watch_enemy(); thread maps/mp/bots/_bots_strategy::bot_think_tactical_goals(); self thread [[ level.bot_funcs["dropped_weapon_think"] ]](); thread func_16B0(); thread bot_think_crate(); thread bot_think_crate_blocking_path(); thread maps/mp/bots/_bots_ks::bot_think_killstreak(); thread maps/mp/bots/_bots_ks::func_16B4(); thread bot_think_gametype(); } //Function Number: 49 bot_think_watch_enemy(param_00) { var_01 = "spawned_player"; if(isdefined(param_00) && param_00) { var_01 = "death"; } self notify("bot_think_watch_enemy"); self endon("bot_think_watch_enemy"); self endon(var_01); self endon("disconnect"); level endon("game_ended"); self.last_enemy_sight_time = gettime(); for(;;) { if(isdefined(self.enemy)) { if(self botcanseeentity(self.enemy)) { self.last_enemy_sight_time = gettime(); } } wait(0.05); } } //Function Number: 50 bot_think_seek_dropped_weapons() { self notify("bot_think_seek_dropped_weapons"); self endon("bot_think_seek_dropped_weapons"); self endon("death"); self endon("disconnect"); level endon("game_ended"); var_00 = "throwingknife_mp"; var_01 = "throwingknifejugg_mp"; for(;;) { var_02 = 0; if(maps/mp/bots/_bots_util::bot_out_of_ammo() && self [[ level.bot_funcs["should_pickup_weapons"] ]]() && !maps/mp/bots/_bots_util::bot_is_remote_or_linked()) { var_03 = getentarray("dropped_weapon","targetname"); var_04 = common_scripts\utility::func_37D5(self.origin,var_03); if(var_04.size > 0) { var_05 = var_04[0]; bot_seek_dropped_weapon(var_05); } } if(!maps/mp/bots/_bots_util::bot_in_combat() && !maps/mp/bots/_bots_util::bot_is_remote_or_linked() && self botgetdifficultysetting("strategyLevel") > 0) { var_06 = self hasweapon(var_00); var_07 = self hasweapon(var_01); var_08 = (var_06 && self getammocount(var_00) == 0) || var_07 && self getammocount(var_01) == 0; if(var_08) { if(isdefined(self.going_for_knife)) { wait(5); continue; } var_09 = getentarray("dropped_knife","targetname"); var_0A = common_scripts\utility::func_37D5(self.origin,var_09); foreach(var_0C in var_0A) { if(!isdefined(var_0C)) { continue; } if(!isdefined(var_0C.calculated_closest_point)) { var_0D = maps/mp/bots/_bots_util::bot_queued_process("BotGetClosestNavigablePoint",::maps/mp/bots/_bots_util::func_35A6,var_0C.origin,32,self); if(isdefined(var_0C)) { var_0C.closest_point_on_grid = var_0D; var_0C.calculated_closest_point = 1; } else { continue; } } if(isdefined(var_0C.closest_point_on_grid)) { self.going_for_knife = 1; bot_seek_dropped_weapon(var_0C); } } } else if(var_06 || var_07) { self.going_for_knife = undefined; } } wait(randomfloatrange(0.25,0.75)); } } //Function Number: 51 bot_seek_dropped_weapon(param_00) { if(maps/mp/bots/_bots_strategy::bot_has_tactical_goal("seek_dropped_weapon",param_00) == 0) { var_01 = undefined; if(param_00.targetname == "dropped_weapon") { var_02 = 1; var_03 = self getweaponslistprimaries(); foreach(var_05 in var_03) { if(param_00.model == getweaponmodel(var_05)) { var_02 = 0; } } if(var_02) { var_01 = ::bot_pickup_weapon; } } var_07 = spawnstruct(); var_07.object = param_00; var_07.script_goal_radius = 12; var_07.should_abort = level.bot_funcs["dropped_weapon_cancel"]; var_07.action_thread = var_01; maps/mp/bots/_bots_strategy::bot_new_tactical_goal("seek_dropped_weapon",param_00.origin,100,var_07); } } //Function Number: 52 bot_pickup_weapon(param_00) { self botpressbutton("use",2); wait(2); } //Function Number: 53 func_7491(param_00) { if(!isdefined(param_00.object)) { return 1; } if(param_00.object.targetname == "dropped_weapon") { if(maps/mp/bots/_bots_util::bot_get_total_gun_ammo() > 0) { return 1; } } else if(param_00.object.targetname == "dropped_knife") { if(maps/mp/bots/_bots_util::bot_in_combat()) { self.going_for_knife = undefined; return 1; } } return 0; } //Function Number: 54 func_16B0(param_00) { self notify("bot_think_level_actions"); self endon("bot_think_level_actions"); self endon("death"); self endon("disconnect"); level endon("game_ended"); for(;;) { common_scripts\utility::waittill_notify_or_timeout("calculate_new_level_targets",randomfloatrange(2,10)); if(!isdefined(level.level_specific_bot_targets) || level.level_specific_bot_targets.size == 0) { continue; } if(maps/mp/bots/_bots_strategy::bot_has_tactical_goal("map_interactive_object")) { continue; } if(maps/mp/bots/_bots_util::bot_in_combat() || maps/mp/bots/_bots_util::bot_is_remote_or_linked()) { continue; } var_01 = undefined; foreach(var_03 in level.level_specific_bot_targets) { if(common_scripts\utility::array_contains(var_03.high_priority_for,self)) { var_01 = var_03; break; } } if(!isdefined(var_01)) { if(randomint(100) > 25) { continue; } var_05 = common_scripts\utility::func_37D5(self.origin,level.level_specific_bot_targets); var_06 = 256; if(isdefined(param_00)) { var_06 = param_00; } else if(self botgetscriptgoaltype() == "hunt" && self botpursuingscriptgoal()) { var_06 = 512; } if(distancesquared(self.origin,var_05[0].origin) > var_06 * var_06) { continue; } var_01 = var_05[0]; } var_07 = 0; if(var_01.bot_interaction_type == "damage") { var_07 = func_1695(var_01); if(var_07) { var_08 = var_01.origin[2] - var_01.bot_targets[0].origin[2] + 55; var_09 = var_01.origin[2] - var_01.bot_targets[1].origin[2] + 55; if(var_08 > 55 && var_09 > 55) { if(common_scripts\utility::array_contains(var_01.high_priority_for,self)) { var_01.high_priority_for = common_scripts\utility::array_remove(var_01.high_priority_for,self); } continue; } } var_0A = weaponclass(self getcurrentweapon()); if(var_0A == "spread") { var_0B = var_01.bot_targets[0].origin - var_01.origin; var_0C = var_01.bot_targets[1].origin - var_01.origin; var_0D = lengthsquared(var_0B); var_0E = lengthsquared(var_0C); if(var_0D > 22500 && var_0E > 22500) { if(common_scripts\utility::array_contains(var_01.high_priority_for,self)) { var_01.high_priority_for = common_scripts\utility::array_remove(var_01.high_priority_for,self); } continue; } } } var_0F = spawnstruct(); var_0F.object = var_01; if(var_01.bot_interaction_type == "damage") { if(var_07) { var_0F.should_abort = ::func_4DB1; } else { var_0F.should_abort = ::func_4DB2; } } if(var_01.bot_interaction_type == "use") { var_0F.action_thread = ::func_87A2; var_0F.should_abort = ::func_4DB0; var_0F.script_goal_yaw = vectortoangles(var_01.origin - var_01.bot_target.origin)[1]; maps/mp/bots/_bots_strategy::bot_new_tactical_goal("map_interactive_object",var_01.bot_target.origin,10,var_0F); continue; } if(var_01.bot_interaction_type == "damage") { if(var_07) { var_0F.action_thread = ::func_5153; var_0F.script_goal_radius = 20; } else { var_0F.action_thread = ::attack_damage_trigger; var_0F.script_goal_radius = 50; } var_10 = undefined; var_11 = maps/mp/bots/_bots_util::bot_queued_process("GetPathDistLevelAction",::maps/mp/bots/_bots_util::func_35AC,self.origin,var_01.bot_targets[0].origin); var_12 = maps/mp/bots/_bots_util::bot_queued_process("GetPathDistLevelAction",::maps/mp/bots/_bots_util::func_35AC,self.origin,var_01.bot_targets[1].origin); if(!isdefined(var_01)) { continue; } if(var_11 <= 0 && var_12 <= 0) { continue; } if(var_11 > 0) { if(var_12 < 0 || var_11 <= var_12) { var_10 = var_01.bot_targets[0]; } } if(var_12 > 0) { if(var_11 < 0 || var_12 <= var_11) { var_10 = var_01.bot_targets[1]; } } if(!var_07) { childthread func_5351(var_10); } maps/mp/bots/_bots_strategy::bot_new_tactical_goal("map_interactive_object",var_10.origin,10,var_0F); } } } //Function Number: 55 func_1695(param_00) { var_01 = self getcurrentweapon(); var_02 = maps/mp/bots/_bots_util::bot_out_of_ammo() || self.hasriotshieldequipped || isdefined(self.isjuggernautmaniac) && self.isjuggernautmaniac == 1 || weaponclass(var_01) == "grenade" || var_01 == "iw6_knifeonly_mp" || var_01 == "iw6_knifeonlyfast_mp"; return var_02; } //Function Number: 56 func_5351(param_00) { self endon("goal"); wait(0.1); for(;;) { if(weaponclass(self getcurrentweapon()) == "spread") { if(distancesquared(self.origin,param_00.origin) > 90000) { wait(0.05); continue; } } var_01 = self getnearestnode(); if(isdefined(var_01)) { if(nodesvisible(var_01,param_00)) { if(sighttracepassed(self.origin + (0,0,55),param_00.origin + (0,0,55),0,self)) { self notify("goal"); } } } wait(0.05); } } //Function Number: 57 attack_damage_trigger(param_00) { if(param_00.object.origin[2] - self geteye()[2] > 55) { if(distance2dsquared(param_00.object.origin,self.origin) < 225) { } } self botsetflag("disable_movement",1); func_4F41(param_00.object,0.3); self botpressbutton("ads",0.3); wait(0.25); var_01 = gettime(); while(isdefined(param_00.object) && !isdefined(param_00.object.already_used) && gettime() - var_01 < 5000) { func_4F41(param_00.object,0.15); self botpressbutton("ads",0.15); self botpressbutton("attack"); wait(0.1); } self botsetflag("disable_movement",0); } //Function Number: 58 func_5153(param_00) { self botsetflag("disable_movement",1); func_4F41(param_00.object,0.3); wait(0.25); var_01 = gettime(); while(isdefined(param_00.object) && !isdefined(param_00.object.already_used) && gettime() - var_01 < 5000) { func_4F41(param_00.object,0.15); self botpressbutton("melee"); wait(0.1); } self botsetflag("disable_movement",0); } //Function Number: 59 func_4F41(param_00,param_01) { var_02 = param_00.origin; if(distance2dsquared(self.origin,var_02) < 100) { var_02 = (var_02[0],var_02[1],self geteye()[2]); } self botlookatpoint(var_02,param_01,"script_forced"); } //Function Number: 60 func_87A2(param_00) { if(isagent(self)) { common_scripts\utility::_enableusability(); param_00.object enableplayeruse(self); wait(0.05); } var_01 = param_00.object.use_time; self botpressbutton("use",var_01); wait(var_01); if(isagent(self)) { common_scripts\utility::_disableusability(); if(isdefined(param_00.object)) { param_00.object disableplayeruse(self); } } } //Function Number: 61 func_4DB1(param_00) { if(func_4DB0(param_00)) { return 1; } if(!func_1695(param_00.object)) { return 1; } return 0; } //Function Number: 62 func_4DB2(param_00) { if(func_4DB0(param_00)) { return 1; } if(func_1695(param_00.object)) { return 1; } return 0; } //Function Number: 63 func_4DB0(param_00) { if(!isdefined(param_00.object)) { return 1; } if(isdefined(param_00.object.already_used)) { return 1; } if(maps/mp/bots/_bots_util::bot_in_combat()) { return 1; } return 0; } //Function Number: 64 func_2030(param_00) { if(!isdefined(param_00.owner) || param_00.owner != self) { if(distancesquared(self.origin,param_00.origin) > 4194304) { return 0; } } return 1; } //Function Number: 65 bot_crate_valid(param_00) { if(!isdefined(param_00)) { return 0; } if(!self [[ level.bot_funcs["crate_can_use"] ]](param_00)) { return 0; } if(!func_2032(param_00)) { return 0; } if(level.teambased && isdefined(param_00.bomb) && isdefined(param_00.team) && param_00.team == self.team) { return 0; } if(!self [[ level.bot_funcs["crate_in_range"] ]](param_00)) { return 0; } if(isdefined(param_00.boxtype)) { if(isdefined(level.boxsettings[param_00.boxtype]) && ![[ level.boxsettings[param_00.boxtype].canusecallback ]]()) { return 0; } if(isdefined(param_00.disabled_use_for) && isdefined(param_00.disabled_use_for[self getentitynumber()]) && param_00.disabled_use_for[self getentitynumber()]) { return 0; } if(!self [[ level.bot_can_use_box_by_type[param_00.boxtype] ]](param_00)) { return 0; } } return isdefined(param_00); } //Function Number: 66 func_2032(param_00) { if(!func_202F(param_00)) { return 0; } if(!func_2031(param_00)) { return 0; } return isdefined(param_00); } //Function Number: 67 func_202F(param_00) { if(isdefined(param_00.boxtype)) { return gettime() > param_00.birthtime + 1000; } return isdefined(param_00.droppingtoground) && !param_00.droppingtoground; } //Function Number: 68 func_2031(param_00) { if(!isdefined(param_00.on_path_grid)) { crate_calculate_on_path_grid(param_00); } return isdefined(param_00) && param_00.on_path_grid; } //Function Number: 69 node_within_use_radius_of_crate(param_00,param_01) { if(isdefined(param_01.boxtype) && param_01.boxtype == "scavenger_bag") { return abs(param_00.origin[0] - param_01.origin[0]) < 36 && abs(param_00.origin[0] - param_01.origin[0]) < 36 && abs(param_00.origin[0] - param_01.origin[0]) < 18; } var_02 = getdvarfloat("player_useRadius"); var_03 = distancesquared(param_01.origin,param_00.origin + (0,0,40)); return var_03 <= var_02 * var_02; } //Function Number: 70 crate_calculate_on_path_grid(param_00) { param_00 thread func_2034(); param_00.on_path_grid = 0; var_01 = undefined; var_02 = undefined; if(isdefined(param_00.forcedisconnectuntil)) { var_01 = param_00.forcedisconnectuntil; var_02 = gettime() + 30000; param_00.forcedisconnectuntil = var_02; param_00 notify("path_disconnect"); } wait(0.05); if(!isdefined(param_00)) { } var_03 = func_202E(param_00); if(!isdefined(param_00)) { } if(isdefined(var_03) && var_03.size > 0) { param_00.nearest_nodes = var_03; param_00.on_path_grid = 1; } else { var_04 = getdvarfloat("player_useRadius"); var_05 = getnodesinradiussorted(param_00.origin,var_04 * 2,0)[0]; var_06 = param_00 getpointinbounds(0,0,-1); var_07 = undefined; if(isdefined(param_00.boxtype) && param_00.boxtype == "scavenger_bag") { if(maps/mp/bots/_bots_util::bot_point_is_on_pathgrid(param_00.origin)) { var_07 = param_00.origin; } } else { var_07 = botgetclosestnavigablepoint(param_00.origin,var_04); } if(isdefined(var_05) && !var_05 nodeisdisconnected() && isdefined(var_07) && abs(var_05.origin[2] - var_06[2]) < 30) { param_00.nearest_points = [var_07]; param_00.nearest_nodes = [var_05]; param_00.on_path_grid = 1; } } if(isdefined(param_00.forcedisconnectuntil)) { if(param_00.forcedisconnectuntil == var_02) { param_00.forcedisconnectuntil = var_01; } } } //Function Number: 71 func_202E(param_00) { var_01 = getnodesinradiussorted(param_00.origin,256,0); for(var_02 = var_01.size;var_02 > 0;var_02--) { var_01[var_02] = var_01[var_02 - 1]; } var_01[0] = getclosestnodeinsight(param_00.origin); var_03 = undefined; if(isdefined(param_00.forcedisconnectuntil)) { var_03 = getallnodes(); } var_04 = []; var_05 = 1; if(!isdefined(param_00.boxtype)) { var_05 = 2; } for(var_02 = 0;var_02 < var_01.size;var_02++) { var_06 = var_01[var_02]; if(!isdefined(var_06) || !isdefined(param_00)) { continue; } if(var_06 nodeisdisconnected()) { continue; } if(!node_within_use_radius_of_crate(var_06,param_00)) { if(var_02 == 0) { continue; } else { break; } } wait(0.05); if(!isdefined(param_00)) { break; } if(sighttracepassed(param_00.origin,var_06.origin + (0,0,55),0,param_00)) { wait(0.05); if(!isdefined(param_00)) { break; } if(!isdefined(param_00.forcedisconnectuntil)) { var_04[var_04.size] = var_06; if(var_04.size == var_05) { return var_04; } else { continue; } } var_07 = undefined; var_08 = 0; while(!isdefined(var_07) && var_08 < 100) { var_08++; var_09 = common_scripts\utility::func_6306(var_03); if(distancesquared(var_06.origin,var_09.origin) > 250000) { var_07 = var_09; } } if(isdefined(var_07)) { var_0A = maps/mp/bots/_bots_util::bot_queued_process("GetNodesOnPathCrate",::maps/mp/bots/_bots_util::func_get_nodes_on_path,var_06.origin,var_07.origin); if(isdefined(var_0A)) { var_04[var_04.size] = var_06; if(var_04.size == var_05) { return var_04; } else { continue; } } } } } return undefined; } //Function Number: 72 crate_get_bot_target(param_00) { if(isdefined(param_00.nearest_points)) { return param_00.nearest_points[0]; } if(isdefined(param_00.nearest_nodes)) { if(param_00.nearest_nodes.size > 1) { var_01 = common_scripts\utility::array_reverse(self botnodescoremultiple(param_00.nearest_nodes,"node_exposed")); return common_scripts\utility::random_weight_sorted(var_01).origin; } else { return var_01.nearest_nodes[0].origin; } } } //Function Number: 73 crate_get_bot_target_check_distance(param_00,param_01) { var_02 = crate_get_bot_target(param_00); var_03 = param_01 * 0.9; var_03 = var_03 * var_03; if(distancesquared(param_00.origin,var_02) <= var_03) { return var_02; } return undefined; } //Function Number: 74 bot_think_crate() { self notify("bot_think_crate"); self endon("bot_think_crate"); self endon("death"); self endon("disconnect"); level endon("game_ended"); var_00 = getdvarfloat("player_useRadius"); for(;;) { var_01 = randomfloatrange(2,4); common_scripts\utility::waittill_notify_or_timeout("new_crate_to_take",var_01); if(isdefined(self.boxes) && self.boxes.size == 0) { self.boxes = undefined; } var_02 = level.carepackages; if(!maps/mp/bots/_bots_util::bot_in_combat() && isdefined(self.boxes)) { var_02 = common_scripts\utility::array_combine(var_02,self.boxes); } if(isdefined(level.bot_scavenger_bags) && maps\mp\_utility::_hasperk("specialty_scavenger")) { var_02 = common_scripts\utility::array_combine(var_02,level.bot_scavenger_bags); } var_02 = common_scripts\utility::array_removeundefined(var_02); if(var_02.size == 0) { continue; } if(maps/mp/bots/_bots_strategy::bot_has_tactical_goal("airdrop_crate") || self botgetscriptgoaltype() == "tactical" || maps/mp/bots/_bots_util::bot_is_remote_or_linked()) { continue; } var_03 = []; foreach(var_05 in var_02) { if(bot_crate_valid(var_05)) { var_03[var_03.size] = var_05; } } var_03 = common_scripts\utility::array_remove_duplicates(var_03); if(var_03.size == 0) { continue; } var_03 = common_scripts\utility::func_37D5(self.origin,var_03); var_07 = self getnearestnode(); if(!isdefined(var_07)) { continue; } var_08 = self [[ level.bot_funcs["crate_low_ammo_check"] ]](); var_09 = (var_08 || randomint(100) < 50) && !maps\mp\_utility::func_48B2(); var_0A = undefined; foreach(var_05 in var_03) { var_0C = 0; if((!isdefined(var_05.owner) || var_05.owner != self) && !isdefined(var_05.boxtype)) { var_0D = []; foreach(var_0F in level.players) { if(!isdefined(var_0F.team)) { continue; } if(!isai(var_0F) && level.teambased && var_0F.team == self.team) { if(distancesquared(var_0F.origin,var_05.origin) < 490000) { var_0D[var_0D.size] = var_0F; } } } if(var_0D.size > 0) { var_11 = var_0D[0] getnearestnode(); if(isdefined(var_11)) { var_0C = 0; foreach(var_13 in var_05.nearest_nodes) { var_0C = var_0C | nodesvisible(var_11,var_13,1); } } } } if(!var_0C) { var_15 = isdefined(var_05.bots) && isdefined(var_05.bots[self.team]) && var_05.bots[self.team] > 0; var_16 = 0; foreach(var_13 in var_05.nearest_nodes) { var_16 = var_16 | nodesvisible(var_07,var_13,1); } if(var_16 || var_09 && !var_15) { var_0A = var_05; break; } } } if(isdefined(var_0A)) { if(self [[ level.bot_funcs["crate_should_claim"] ]]()) { if(!isdefined(var_0A.boxtype)) { if(!isdefined(var_0A.bots)) { var_0A.bots = []; } var_0A.bots[self.team] = 1; } } var_1A = spawnstruct(); var_1A.object = var_0A; var_1A.start_thread = ::func_8C5B; var_1A.should_abort = ::crate_picked_up; var_1B = undefined; if(isdefined(var_0A.boxtype)) { if(isdefined(var_0A.boxtouchonly) && var_0A.boxtouchonly) { var_1A.script_goal_radius = 16; var_1A.action_thread = undefined; var_1B = var_0A.origin; } else { var_1A.script_goal_radius = 50; var_1A.action_thread = ::func_877A; var_1C = crate_get_bot_target_check_distance(var_0A,var_00); if(!isdefined(var_1C)) { continue; } var_1C = var_1C - var_0A.origin; var_1D = length(var_1C) * randomfloat(1); var_1B = var_0A.origin + vectornormalize(var_1C) * var_1D + (0,0,12); } } else { var_1A.action_thread = ::func_877C; var_1A.end_thread = ::func_7C54; var_1B = crate_get_bot_target_check_distance(var_0A,var_00); if(!isdefined(var_1B)) { continue; } var_1A.script_goal_radius = var_00 - distance(var_0A.origin,var_1B + (0,0,40)); var_1B = var_1B + (0,0,24); } if(isdefined(var_1A.script_goal_radius)) { } var_0A notify("path_disconnect"); wait(0.05); if(!isdefined(var_0A)) { continue; } maps/mp/bots/_bots_strategy::bot_new_tactical_goal("airdrop_crate",var_1B,30,var_1A); } } } //Function Number: 75 func_1698(param_00) { return 1; } //Function Number: 76 func_2036() { return 1; } //Function Number: 77 crate_low_ammo_check() { return 0; } //Function Number: 78 bot_should_use_ammo_crate(param_00) { if(self getcurrentweapon() == level.boxsettings[param_00.boxtype].minigunweapon) { return 0; } return 1; } //Function Number: 79 func_1666(param_00) { self switchtoweapon(self.secondaryweapon); wait(1); } //Function Number: 80 bot_post_use_ammo_crate(param_00) { self switchtoweapon("none"); self.secondaryweapon = self getcurrentweapon(); } //Function Number: 81 bot_should_use_scavenger_bag(param_00) { if(maps/mp/bots/_bots_util::func_15E6(0.66)) { var_01 = self getnearestnode(); if(isdefined(param_00.nearest_nodes) && isdefined(param_00.nearest_nodes[0]) && isdefined(var_01)) { if(nodesvisible(var_01,param_00.nearest_nodes[0],1)) { if(common_scripts\utility::func_8E18(self.origin,self.angles,param_00.origin,self botgetfovdot())) { return 1; } } } } return 0; } //Function Number: 82 bot_should_use_grenade_crate(param_00) { var_01 = self getweaponslistoffhands(); foreach(var_03 in var_01) { if(self getweaponammostock(var_03) == 0) { return 1; } } return 0; } //Function Number: 83 func_169A(param_00) { return 1; } //Function Number: 84 func_2034() { self notify("crate_monitor_position"); self endon("crate_monitor_position"); self endon("death"); level endon("game_ended"); for(;;) { var_00 = self.origin; wait(0.5); if(!isalive(self)) { } if(!maps/mp/bots/_bots_util::func_16C0(self.origin,var_00)) { self.on_path_grid = undefined; self.nearest_nodes = undefined; self.nearest_points = undefined; } } } //Function Number: 85 func_2037() { } //Function Number: 86 crate_picked_up(param_00) { if(!isdefined(param_00.object)) { return 1; } return 0; } //Function Number: 87 func_877C(param_00) { if(isagent(self)) { common_scripts\utility::_enableusability(); param_00.object enableplayeruse(self); wait(0.05); } self [[ level.bot_funcs["crate_wait_use"] ]](); if(isdefined(param_00.object.owner) && param_00.object.owner == self) { var_01 = level.crateownerusetime / 1000 + 0.5; } else { var_01 = level.cratenonownerusetime / 1000 + 1; } self botpressbutton("use",var_01); wait(var_01); if(isagent(self)) { common_scripts\utility::_disableusability(); if(isdefined(param_00.object)) { param_00.object disableplayeruse(self); } } if(isdefined(param_00.object)) { if(!isdefined(param_00.object.bots_used)) { param_00.object.bots_used = []; } param_00.object.bots_used[param_00.object.bots_used.size] = self; } } //Function Number: 88 func_877A(param_00) { if(isagent(self)) { common_scripts\utility::_enableusability(); param_00.object enableplayeruse(self); wait(0.05); } if(isdefined(param_00.object) && isdefined(param_00.object.boxtype)) { var_01 = param_00.object.boxtype; if(isdefined(level.bot_pre_use_box_of_type[var_01])) { self [[ level.bot_pre_use_box_of_type[var_01] ]](param_00.object); } if(isdefined(param_00.object)) { var_02 = level.boxsettings[param_00.object.boxtype].usetime / 1000 + 0.5; self botpressbutton("use",var_02); wait(var_02); if(isdefined(level.bot_post_use_box_of_type[var_01])) { self [[ level.bot_post_use_box_of_type[var_01] ]](param_00.object); } } } if(isagent(self)) { common_scripts\utility::_disableusability(); if(isdefined(param_00.object)) { param_00.object disableplayeruse(self); } } } //Function Number: 89 func_8C5B(param_00) { thread func_16CA(param_00.object); } //Function Number: 90 func_7C54(param_00) { if(isdefined(param_00.object)) { param_00.object.bots[self.team] = 0; } } //Function Number: 91 func_16CA(param_00) { param_00 endon("death"); param_00 endon("revived"); param_00 endon("disconnect"); level endon("game_ended"); var_01 = self.team; common_scripts\utility::func_8B2A("death","disconnect"); if(isdefined(param_00)) { param_00.bots[var_01] = 0; } } //Function Number: 92 bot_think_crate_blocking_path() { self notify("bot_think_crate_blocking_path"); self endon("bot_think_crate_blocking_path"); self endon("death"); self endon("disconnect"); level endon("game_ended"); var_00 = getdvarfloat("player_useRadius"); for(;;) { wait(3); if(self usebuttonpressed()) { continue; } if(maps\mp\_utility::func_4995()) { continue; } var_01 = level.carepackages; for(var_02 = 0;var_02 < var_01.size;var_02++) { var_03 = var_01[var_02]; if(!isdefined(var_03)) { continue; } if(distancesquared(self.origin,var_03.origin) < var_00 * var_00) { if(var_03.owner == self) { self botpressbutton("use",level.crateownerusetime / 1000 + 0.5); continue; } self botpressbutton("use",level.cratenonownerusetime / 1000 + 0.5); } } } } //Function Number: 93 bot_think_revive() { self notify("bot_think_revive"); self endon("bot_think_revive"); self endon("death"); self endon("disconnect"); level endon("game_ended"); if(!level.teambased) { } for(;;) { var_00 = 2; var_01 = getentarray("revive_trigger","targetname"); if(var_01.size > 0) { var_00 = 0.05; } level common_scripts\utility::waittill_notify_or_timeout("player_last_stand",var_00); if(!bot_can_revive()) { continue; } var_01 = getentarray("revive_trigger","targetname"); if(var_01.size > 1) { var_01 = sortbydistance(var_01,self.origin); if(isdefined(self.owner)) { for(var_02 = 0;var_02 < var_01.size;var_02++) { if(var_01[var_02].owner != self.owner) { continue; } if(var_02 == 0) { break; } var_03 = var_01[var_02]; var_01[var_02] = var_01[0]; var_01[0] = var_03; break; } } } for(var_02 = 0;var_02 < var_01.size;var_02++) { var_04 = var_01[var_02]; var_05 = var_04.owner; if(!isdefined(var_05)) { continue; } if(var_05 == self) { continue; } if(!isalive(var_05)) { continue; } if(var_05.team != self.team) { continue; } if(!isdefined(var_05.var_465B) || !var_05.var_465B) { continue; } if(isdefined(var_05.bots) && isdefined(var_05.bots[self.team]) && var_05.bots[self.team] > 0) { continue; } if(distancesquared(self.origin,var_05.origin) < 4194304) { var_06 = spawnstruct(); var_06.object = var_04; var_06.script_goal_radius = 64; if(isdefined(self.last_revive_fail_time) && gettime() - self.last_revive_fail_time < 1000) { var_06.script_goal_radius = 32; } var_06.start_thread = ::func_8C5C; var_06.end_thread = ::func_7C47; var_06.should_abort = ::func_5EDD; var_06.action_thread = ::revive_player; maps/mp/bots/_bots_strategy::bot_new_tactical_goal("revive",var_05.origin,60,var_06); break; } } } } //Function Number: 94 func_8C5C(param_00) { thread func_16CA(param_00.object.owner); } //Function Number: 95 func_7C47(param_00) { if(isdefined(param_00.object.owner)) { param_00.object.owner.bots[self.team] = 0; } } //Function Number: 96 func_5EDD(param_00) { if(!isdefined(param_00.object.owner) || param_00.object.owner.health <= 0) { return 1; } if(!isdefined(param_00.object.owner.var_465B) || !param_00.object.owner.var_465B) { return 1; } return 0; } //Function Number: 97 revive_player(param_00) { if(distancesquared(self.origin,param_00.object.owner.origin) > 4096) { self.last_revive_fail_time = gettime(); } if(isagent(self)) { common_scripts\utility::_enableusability(); param_00.object enableplayeruse(self); wait(0.05); } var_01 = self.team; self botpressbutton("use",level.laststandusetime / 1000 + 0.5); wait(level.laststandusetime / 1000 + 1.5); if(isdefined(param_00.object.owner)) { param_00.object.bots[var_01] = 0; } if(isagent(self)) { common_scripts\utility::_disableusability(); if(isdefined(param_00.object)) { param_00.object disableplayeruse(self); } } } //Function Number: 98 bot_can_revive() { if(isdefined(self.laststand) && self.laststand == 1) { return 0; } if(maps/mp/bots/_bots_strategy::bot_has_tactical_goal("revive")) { return 0; } if(maps/mp/bots/_bots_util::bot_is_remote_or_linked()) { return 0; } if(maps/mp/bots/_bots_util::bot_is_bodyguarding()) { return 1; } var_00 = self botgetscriptgoaltype(); if(var_00 == "none" || var_00 == "hunt" || var_00 == "guard") { return 1; } return 0; } //Function Number: 99 func_6697(param_00) { self endon("death"); self endon("disconnect"); self endon("bad_path"); self endon("goal"); param_00 common_scripts\utility::func_8B2A("death","revived"); self notify("bad_path"); } //Function Number: 100 func_161A() { self endon("death"); self endon("disconnect"); level endon("game_ended"); if(gettime() > 15000) { } while(!maps\mp\_utility::gamehasstarted() || !maps\mp\_utility::func_36F1("prematch_done")) { wait(0.05); } var_00 = undefined; var_01 = undefined; for(var_02 = 0;var_02 < level.players.size;var_02++) { var_03 = level.players[var_02]; if(isdefined(var_03) && isdefined(self.team) && isdefined(var_03.team) && isenemyteam(self.team,var_03.team)) { if(!isdefined(var_03.bot_start_known_by_enemy)) { var_00 = var_03; } if(isai(var_03) && !isdefined(var_03.bot_start_know_enemy)) { var_01 = var_03; } } } if(isdefined(var_00)) { self.bot_start_know_enemy = 1; var_00.bot_start_known_by_enemy = 1; self getenemyinfo(var_00); } if(isdefined(var_01)) { var_01.bot_start_know_enemy = 1; self.bot_start_known_by_enemy = 1; var_01 getenemyinfo(self); } } //Function Number: 101 func_1630(param_00,param_01) { if(isdefined(param_01)) { return self makeentitysentient(param_00,param_01); } return self makeentitysentient(param_00); } //Function Number: 102 bot_think_gametype() { self notify("bot_think_gametype"); self endon("bot_think_gametype"); self endon("death"); self endon("disconnect"); level endon("game_ended"); maps\mp\_utility::gameflagwait("prematch_done"); self thread [[ level.bot_funcs["gametype_think"] ]](); } //Function Number: 103 func_2495() { } //Function Number: 104 func_535C() { for(;;) { level waittill("smoke",var_00,var_01); if(var_01 == "smoke_grenade_mp" || var_01 == "smoke_grenadejugg_mp" || var_01 == "odin_projectile_smoke_mp") { var_00 thread func_3F4A(9); continue; } if(var_01 == "odin_projectile_large_rod_mp") { var_00 thread func_3F4A(2.5); } } } //Function Number: 105 func_3F4A(param_00) { self waittill("explode",var_01); var_02 = common_scripts\utility::func_7836(); var_02 show(); var_02.origin = var_01; var_03 = 0.8; wait(var_03); var_03 = 0.5; var_04 = getent("smoke_grenade_sight_clip_64_short","targetname"); if(isdefined(var_04)) { var_02 clonebrushmodeltoscriptmodel(var_04); } wait(var_03); var_03 = 0.6; var_05 = getent("smoke_grenade_sight_clip_64_tall","targetname"); if(isdefined(var_05)) { var_02 clonebrushmodeltoscriptmodel(var_05); } wait(var_03); var_03 = param_00; var_06 = getent("smoke_grenade_sight_clip_256","targetname"); if(isdefined(var_06)) { var_02 clonebrushmodeltoscriptmodel(var_06); } wait(var_03); var_02 delete(); } //Function Number: 106 func_1576(param_00) { var_01 = 0; param_00.boxtype = "scavenger_bag"; param_00.boxtouchonly = 1; if(!isdefined(level.bot_scavenger_bags)) { level.bot_scavenger_bags = []; } foreach(var_04, var_03 in level.bot_scavenger_bags) { if(!isdefined(var_03)) { var_01 = 1; level.bot_scavenger_bags[var_04] = param_00; break; } } if(!var_01) { level.bot_scavenger_bags[level.bot_scavenger_bags.size] = param_00; } foreach(var_06 in level.participants) { if(isai(var_06) && var_06 maps\mp\_utility::_hasperk("specialty_scavenger")) { var_06 notify("new_crate_to_take"); } } } //Function Number: 107 bot_triggers() { var_00 = getentarray("bot_flag_set","targetname"); foreach(var_02 in var_00) { if(!isdefined(var_02.script_noteworthy)) { continue; } var_02 thread bot_flag_trigger(var_02.script_noteworthy); } } //Function Number: 108 bot_flag_trigger(param_00) { self endon("death"); for(;;) { self waittill("trigger",var_01); if(maps\mp\_utility::isaigameparticipant(var_01)) { var_01 notify("flag_trigger_set_" + param_00); var_01 botsetflag(param_00,1); var_01 thread bot_flag_trigger_clear(param_00); } } } //Function Number: 109 bot_flag_trigger_clear(param_00) { self endon("flag_trigger_set_" + param_00); self endon("death"); self endon("disconnect"); level endon("game_ended"); common_scripts\utility::func_8AFE(); waittillframeend; self botsetflag(param_00,0); }