mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-29 10:57:53 -05:00
3328 lines
68 KiB
Plaintext
3328 lines
68 KiB
Plaintext
/*******************************************************************
|
|
* 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);
|
|
} |