iw6-scripts/maps/mp/bots/_bots_personality.gsc
2024-02-13 13:20:49 +01:00

747 lines
21 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
setup_personalities()
{
level.bot_personality = [];
level.bot_personality_list = [];
level.bot_personality["active"][0] = "default";
level.bot_personality["active"][1] = "run_and_gun";
level.bot_personality["active"][2] = "cqb";
level.bot_personality["stationary"][0] = "camper";
level.bot_personality_type = [];
foreach ( var_5, var_1 in level.bot_personality )
{
foreach ( var_3 in var_1 )
{
level.bot_personality_type[var_3] = var_5;
level.bot_personality_list[level.bot_personality_list.size] = var_3;
}
}
level.bot_personality_types_desired = [];
level.bot_personality_types_desired["active"] = 2;
level.bot_personality_types_desired["stationary"] = 1;
level.bot_pers_init = [];
level.bot_pers_init["default"] = ::init_personality_default;
level.bot_pers_init["camper"] = ::init_personality_camper;
level.bot_pers_update["default"] = ::update_personality_default;
level.bot_pers_update["camper"] = ::update_personality_camper;
}
bot_assign_personality_functions()
{
self.personality = self botgetpersonality();
self.personality_init_function = level.bot_pers_init[self.personality];
if ( !isdefined( self.personality_init_function ) )
self.personality_init_function = level.bot_pers_init["default"];
self [[ self.personality_init_function ]]();
self.personality_update_function = level.bot_pers_update[self.personality];
if ( !isdefined( self.personality_update_function ) )
self.personality_update_function = level.bot_pers_update["default"];
}
bot_balance_personality()
{
if ( isdefined( self.personalitymanuallyset ) && self.personalitymanuallyset )
return;
if ( maps\mp\_utility::bot_is_fireteam_mode() )
return;
var_0 = [];
var_1 = [];
foreach ( var_7, var_3 in level.bot_personality )
{
var_1[var_7] = 0;
foreach ( var_5 in var_3 )
var_0[var_5] = 0;
}
foreach ( var_9 in level.players )
{
if ( isbot( var_9 ) && isdefined( var_9.team ) && var_9.team == self.team && var_9 != self && isdefined( var_9.has_balanced_personality ) )
{
var_5 = var_9 botgetpersonality();
var_7 = level.bot_personality_type[var_5];
var_0[var_5] = var_0[var_5] + 1;
var_1[var_7] = var_1[var_7] + 1;
}
}
var_11 = undefined;
while ( !isdefined( var_11 ) )
{
for ( var_12 = level.bot_personality_types_desired; var_12.size > 0; var_12[var_13] = undefined )
{
var_13 = maps\mp\bots\_bots_util::bot_get_string_index_for_integer( var_12, randomint( var_12.size ) );
var_1[var_13] = var_1[var_13] - level.bot_personality_types_desired[var_13];
if ( var_1[var_13] < 0 )
{
var_11 = var_13;
break;
}
}
}
var_14 = undefined;
var_15 = undefined;
var_16 = 9999;
var_17 = undefined;
var_18 = -9999;
var_19 = common_scripts\utility::array_randomize( level.bot_personality[var_11] );
foreach ( var_5 in var_19 )
{
if ( var_0[var_5] < var_16 )
{
var_15 = var_5;
var_16 = var_0[var_5];
}
if ( var_0[var_5] > var_18 )
{
var_17 = var_5;
var_18 = var_0[var_5];
}
}
if ( var_18 - var_16 >= 2 )
var_14 = var_15;
else
var_14 = common_scripts\utility::random( level.bot_personality[var_11] );
if ( self botgetpersonality() != var_14 )
self botsetpersonality( var_14 );
self.has_balanced_personality = 1;
}
init_personality_camper()
{
clear_camper_data();
}
init_personality_default()
{
clear_camper_data();
}
update_personality_camper()
{
if ( should_select_new_ambush_point() && !maps\mp\bots\_bots_util::bot_is_defending() && !maps\mp\bots\_bots_util::bot_is_remote_or_linked() )
{
var_0 = self botgetscriptgoaltype();
var_1 = 0;
if ( !isdefined( self.camper_time_started_hunting ) )
self.camper_time_started_hunting = 0;
var_2 = var_0 == "hunt";
var_3 = gettime() > self.camper_time_started_hunting + 10000;
if ( ( !var_2 || var_3 ) && !maps\mp\bots\_bots_util::bot_out_of_ammo() )
{
if ( !self bothasscriptgoal() )
bot_random_path();
var_1 = find_camp_node();
if ( !var_1 )
self.camper_time_started_hunting = gettime();
}
if ( isdefined( var_1 ) && var_1 )
{
self.ambush_entrances = maps\mp\bots\_bots_util::bot_queued_process( "bot_find_ambush_entrances", ::bot_find_ambush_entrances, self.node_ambushing_from, 1 );
var_4 = maps\mp\bots\_bots_strategy::bot_get_ambush_trap_item( "trap_directional", "trap", "c4" );
if ( isdefined( var_4 ) )
{
var_5 = gettime();
maps\mp\bots\_bots_strategy::bot_set_ambush_trap( var_4, self.ambush_entrances, self.node_ambushing_from, self.ambush_yaw );
var_5 = gettime() - var_5;
if ( var_5 > 0 && isdefined( self.ambush_end ) && isdefined( self.node_ambushing_from ) )
{
self.ambush_end = self.ambush_end + var_5;
self.node_ambushing_from.bot_ambush_end = self.ambush_end + 10000;
}
}
if ( !maps\mp\bots\_bots_strategy::bot_has_tactical_goal() && !maps\mp\bots\_bots_util::bot_is_defending() && isdefined( self.node_ambushing_from ) )
{
self botsetscriptgoalnode( self.node_ambushing_from, "camp", self.ambush_yaw );
thread clear_script_goal_on( "bad_path", "node_relinquished", "out_of_ammo" );
thread watch_out_of_ammo();
thread bot_add_ambush_time_delayed( "clear_camper_data", "goal" );
thread bot_watch_entrances_delayed( "clear_camper_data", "bot_add_ambush_time_delayed", self.ambush_entrances, self.ambush_yaw );
return;
}
}
else
{
if ( var_0 == "camp" )
self botclearscriptgoal();
update_personality_default();
}
}
}
update_personality_default()
{
var_0 = undefined;
var_1 = self bothasscriptgoal();
if ( var_1 )
var_0 = self botgetscriptgoal();
if ( !maps\mp\bots\_bots_strategy::bot_has_tactical_goal() && !maps\mp\bots\_bots_util::bot_is_remote_or_linked() )
{
var_2 = undefined;
var_3 = undefined;
if ( var_1 )
{
var_2 = distancesquared( self.origin, var_0 );
var_3 = self botgetscriptgoalradius();
var_4 = var_3 * 2;
if ( isdefined( self.bot_memory_goal ) && var_2 < var_4 * var_4 )
{
var_5 = botmemoryflags( "investigated" );
botflagmemoryevents( 0, gettime() - self.bot_memory_goal_time, 1, self.bot_memory_goal, var_4, "kill", var_5, self );
botflagmemoryevents( 0, gettime() - self.bot_memory_goal_time, 1, self.bot_memory_goal, var_4, "death", var_5, self );
self.bot_memory_goal = undefined;
self.bot_memory_goal_time = undefined;
}
}
if ( !var_1 || var_2 < var_3 * var_3 )
{
var_6 = bot_random_path();
if ( var_6 && randomfloat( 100 ) < 25 )
{
var_7 = maps\mp\bots\_bots_strategy::bot_get_ambush_trap_item( "trap_directional", "trap" );
if ( isdefined( var_7 ) )
{
var_8 = self botgetscriptgoal();
if ( isdefined( var_8 ) )
{
var_9 = getclosestnodeinsight( var_8 );
if ( isdefined( var_9 ) )
{
var_10 = maps\mp\bots\_bots_util::bot_queued_process( "bot_find_ambush_entrances", ::bot_find_ambush_entrances, var_9, 0 );
var_11 = maps\mp\bots\_bots_strategy::bot_set_ambush_trap( var_7, var_10, var_9 );
if ( !isdefined( var_11 ) || var_11 )
{
self botclearscriptgoal();
var_6 = bot_random_path();
}
}
}
}
}
if ( var_6 )
thread clear_script_goal_on( "enemy", "bad_path", "goal", "node_relinquished", "search_end" );
}
}
}
clear_script_goal_on( var_0, var_1, var_2, var_3, var_4 )
{
self notify( "clear_script_goal_on" );
self endon( "clear_script_goal_on" );
self endon( "death" );
self endon( "disconnect" );
self endon( "start_tactical_goal" );
var_5 = self botgetscriptgoal();
var_6 = 1;
while ( var_6 )
{
var_7 = common_scripts\utility::waittill_any_return( var_0, var_1, var_2, var_3, var_4, "script_goal_changed" );
var_6 = 0;
var_8 = 1;
if ( var_7 == "node_relinquished" || var_7 == "goal" || var_7 == "script_goal_changed" )
{
if ( !self bothasscriptgoal() )
var_8 = 0;
else
{
var_9 = self botgetscriptgoal();
var_8 = maps\mp\bots\_bots_util::bot_vectors_are_equal( var_5, var_9 );
}
}
if ( var_7 == "enemy" && isdefined( self.enemy ) )
{
var_8 = 0;
var_6 = 1;
}
if ( var_8 )
self botclearscriptgoal();
}
}
watch_out_of_ammo()
{
self notify( "watch_out_of_ammo" );
self endon( "watch_out_of_ammo" );
self endon( "death" );
self endon( "disconnect" );
while ( !maps\mp\bots\_bots_util::bot_out_of_ammo() )
wait 0.5;
self notify( "out_of_ammo" );
}
bot_add_ambush_time_delayed( var_0, var_1 )
{
self notify( "bot_add_ambush_time_delayed" );
self endon( "bot_add_ambush_time_delayed" );
self endon( "death" );
self endon( "disconnect" );
if ( isdefined( var_0 ) )
self endon( var_0 );
self endon( "node_relinquished" );
self endon( "bad_path" );
var_2 = gettime();
if ( isdefined( var_1 ) )
self waittill( var_1 );
if ( isdefined( self.ambush_end ) && isdefined( self.node_ambushing_from ) )
{
self.ambush_end = self.ambush_end + ( gettime() - var_2 );
self.node_ambushing_from.bot_ambush_end = self.ambush_end + 10000;
}
self notify( "bot_add_ambush_time_delayed" );
}
bot_watch_entrances_delayed( var_0, var_1, var_2, var_3 )
{
self notify( "bot_watch_entrances_delayed" );
if ( var_2.size > 0 )
{
self endon( "bot_watch_entrances_delayed" );
self endon( "death" );
self endon( "disconnect" );
self endon( var_0 );
self endon( "node_relinquished" );
self endon( "bad_path" );
if ( isdefined( var_1 ) )
self waittill( var_1 );
self endon( "path_enemy" );
childthread maps\mp\bots\_bots_util::bot_watch_nodes( var_2, var_3, 0, self.ambush_end );
childthread bot_monitor_watch_entrances_camp();
}
}
bot_monitor_watch_entrances_camp()
{
self notify( "bot_monitor_watch_entrances_camp" );
self endon( "bot_monitor_watch_entrances_camp" );
self notify( "bot_monitor_watch_entrances" );
self endon( "bot_monitor_watch_entrances" );
self endon( "disconnect" );
self endon( "death" );
while ( !isdefined( self.watch_nodes ) )
wait 0.05;
while ( isdefined( self.watch_nodes ) )
{
foreach ( var_1 in self.watch_nodes )
var_1.watch_node_chance[self.entity_number] = 1.0;
maps\mp\bots\_bots_strategy::prioritize_watch_nodes_toward_enemies( 0.5 );
wait( randomfloatrange( 0.5, 0.75 ) );
}
}
bot_find_ambush_entrances( var_0, var_1 )
{
self endon( "disconnect" );
var_2 = [];
var_3 = findentrances( var_0.origin );
if ( isdefined( var_3 ) && var_3.size > 0 )
{
wait 0.05;
var_4 = var_0.type != "Cover Stand" && var_0.type != "Conceal Stand";
if ( var_4 && var_1 )
var_3 = self botnodescoremultiple( var_3, "node_exposure_vis", var_0.origin, "crouch" );
foreach ( var_6 in var_3 )
{
if ( distancesquared( self.origin, var_6.origin ) < 90000 )
continue;
if ( var_4 && var_1 )
{
wait 0.05;
if ( !maps\mp\bots\_bots_util::entrance_visible_from( var_6.origin, var_0.origin, "crouch" ) )
continue;
}
var_2[var_2.size] = var_6;
}
}
return var_2;
}
bot_filter_ambush_inuse( var_0 )
{
var_1 = [];
var_2 = gettime();
var_3 = var_0.size;
for ( var_4 = 0; var_4 < var_3; var_4++ )
{
var_5 = var_0[var_4];
if ( !isdefined( var_5.bot_ambush_end ) || var_2 > var_5.bot_ambush_end )
var_1[var_1.size] = var_5;
}
return var_1;
}
bot_filter_ambush_vicinity( var_0, var_1, var_2 )
{
var_3 = [];
var_4 = [];
var_5 = var_2 * var_2;
if ( level.teambased )
{
foreach ( var_7 in level.participants )
{
if ( !maps\mp\_utility::isreallyalive( var_7 ) )
continue;
if ( !isdefined( var_7.team ) )
continue;
if ( var_7.team == var_1.team && var_7 != var_1 && isdefined( var_7.node_ambushing_from ) )
var_4[var_4.size] = var_7.node_ambushing_from.origin;
}
}
var_9 = var_4.size;
var_10 = var_0.size;
for ( var_11 = 0; var_11 < var_10; var_11++ )
{
var_12 = 0;
var_13 = var_0[var_11];
for ( var_14 = 0; !var_12 && var_14 < var_9; var_14++ )
{
var_15 = distancesquared( var_4[var_14], var_13.origin );
var_12 = var_15 < var_5;
}
if ( !var_12 )
var_3[var_3.size] = var_13;
}
return var_3;
}
clear_camper_data()
{
self notify( "clear_camper_data" );
if ( isdefined( self.node_ambushing_from ) && isdefined( self.node_ambushing_from.bot_ambush_end ) )
self.node_ambushing_from.bot_ambush_end = undefined;
self.node_ambushing_from = undefined;
self.point_to_ambush = undefined;
self.ambush_yaw = undefined;
self.ambush_entrances = undefined;
self.ambush_duration = randomintrange( 20000, 30000 );
self.ambush_end = -1;
}
should_select_new_ambush_point()
{
if ( maps\mp\bots\_bots_strategy::bot_has_tactical_goal() )
return 0;
if ( gettime() > self.ambush_end )
return 1;
if ( !self bothasscriptgoal() )
return 1;
return 0;
}
find_camp_node()
{
self notify( "find_camp_node" );
self endon( "find_camp_node" );
return maps\mp\bots\_bots_util::bot_queued_process( "find_camp_node_worker", ::find_camp_node_worker );
}
find_camp_node_worker()
{
self notify( "find_camp_node_worker" );
self endon( "find_camp_node_worker" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
clear_camper_data();
if ( level.zonecount <= 0 )
return 0;
var_0 = getzonenearest( self.origin );
var_1 = undefined;
var_2 = undefined;
var_3 = self.angles;
if ( isdefined( var_0 ) )
{
var_4 = botzonenearestcount( var_0, self.team, -1, "enemy_predict", ">", 0, "ally", "<", 1 );
if ( !isdefined( var_4 ) )
var_4 = botzonenearestcount( var_0, self.team, -1, "enemy_predict", ">", 0 );
if ( !isdefined( var_4 ) )
{
var_5 = -1;
var_6 = -1;
for ( var_7 = 0; var_7 < level.zonecount; var_7++ )
{
var_8 = distance2dsquared( getzoneorigin( var_7 ), self.origin );
if ( var_8 > var_5 )
{
var_5 = var_8;
var_6 = var_7;
}
}
var_4 = var_6;
}
var_9 = getzonepath( var_0, var_4 );
if ( isdefined( var_9 ) && var_9.size > 0 )
{
for ( var_10 = 0; var_10 <= int( var_9.size / 2 ); var_10++ )
{
var_1 = var_9[var_10];
var_2 = var_9[int( min( var_10 + 1, var_9.size - 1 ) )];
if ( botzonegetcount( var_2, self.team, "enemy_predict" ) != 0 )
break;
}
if ( isdefined( var_1 ) && isdefined( var_2 ) && var_1 != var_2 )
{
var_3 = getzoneorigin( var_2 ) - getzoneorigin( var_1 );
var_3 = vectortoangles( var_3 );
}
}
}
var_11 = undefined;
if ( isdefined( var_1 ) )
{
var_12 = 1;
var_13 = 1;
var_14 = 0;
while ( var_12 )
{
var_15 = getzonenodesbydist( var_1, 800 * var_13, 1 );
if ( var_15.size > 1024 )
var_15 = getzonenodes( var_1, 0 );
wait 0.05;
var_16 = randomint( 100 );
if ( var_16 < 66 && var_16 >= 33 )
var_3 = ( var_3[0], var_3[1] + 45, 0 );
else if ( var_16 < 33 )
var_3 = ( var_3[0], var_3[1] - 45, 0 );
if ( var_15.size > 0 )
{
var_17 = int( min( max( 1, var_15.size * 0.15 ), 5 ) );
if ( var_14 )
var_15 = self botnodepickmultiple( var_15, var_17, var_17, "node_camp", anglestoforward( var_3 ), "lenient" );
else
var_15 = self botnodepickmultiple( var_15, var_17, var_17, "node_camp", anglestoforward( var_3 ) );
var_15 = bot_filter_ambush_inuse( var_15 );
if ( !isdefined( self.can_camp_near_others ) || !self.can_camp_near_others )
{
var_18 = 800;
var_15 = bot_filter_ambush_vicinity( var_15, self, var_18 );
}
if ( var_15.size > 0 )
var_11 = common_scripts\utility::random_weight_sorted( var_15 );
}
if ( isdefined( var_11 ) )
var_12 = 0;
else if ( isdefined( self.camping_needs_fallback_camp_location ) )
{
if ( var_13 == 1 && !var_14 )
var_13 = 3;
else if ( var_13 == 3 && !var_14 )
var_14 = 1;
else if ( var_13 == 3 && var_14 )
var_12 = 0;
}
else
var_12 = 0;
if ( var_12 )
wait 0.05;
}
}
if ( !isdefined( var_11 ) || !self botnodeavailable( var_11 ) )
return 0;
self.node_ambushing_from = var_11;
self.ambush_end = gettime() + self.ambush_duration;
self.node_ambushing_from.bot_ambush_end = self.ambush_end;
self.ambush_yaw = var_3[1];
return 1;
}
find_ambush_node( var_0, var_1 )
{
clear_camper_data();
if ( isdefined( var_0 ) )
self.point_to_ambush = var_0;
else
{
var_2 = undefined;
var_3 = getnodesinradius( self.origin, 5000, 0, 2000 );
if ( var_3.size > 0 )
var_2 = self botnodepick( var_3, var_3.size * 0.25, "node_traffic" );
if ( isdefined( var_2 ) )
self.point_to_ambush = var_2.origin;
else
return 0;
}
var_4 = 2000;
if ( isdefined( var_1 ) )
var_4 = var_1;
var_5 = getnodesinradius( self.point_to_ambush, var_4, 0, 1000 );
var_6 = undefined;
if ( var_5.size > 0 )
{
var_7 = int( max( 1, int( var_5.size * 0.15 ) ) );
var_5 = self botnodepickmultiple( var_5, var_7, var_7, "node_ambush", self.point_to_ambush );
}
var_5 = bot_filter_ambush_inuse( var_5 );
if ( var_5.size > 0 )
var_6 = common_scripts\utility::random_weight_sorted( var_5 );
if ( !isdefined( var_6 ) || !self botnodeavailable( var_6 ) )
return 0;
self.node_ambushing_from = var_6;
self.ambush_end = gettime() + self.ambush_duration;
self.node_ambushing_from.bot_ambush_end = self.ambush_end;
var_8 = vectornormalize( self.point_to_ambush - self.node_ambushing_from.origin );
var_9 = vectortoangles( var_8 );
self.ambush_yaw = var_9[1];
return 1;
}
bot_random_path()
{
if ( maps\mp\bots\_bots_util::bot_is_remote_or_linked() )
return 0;
var_0 = level.bot_random_path_function[self.team];
return self [[ var_0 ]]();
}
bot_random_path_default()
{
var_0 = 0;
var_1 = 50;
if ( self.personality == "camper" )
var_1 = 0;
var_2 = undefined;
if ( randomint( 100 ) < var_1 )
var_2 = maps\mp\bots\_bots_util::bot_recent_point_of_interest();
if ( !isdefined( var_2 ) )
{
var_3 = self botfindnoderandom();
if ( isdefined( var_3 ) )
var_2 = var_3.origin;
}
if ( isdefined( var_2 ) )
var_0 = self botsetscriptgoal( var_2, 128, "hunt" );
return var_0;
}
bot_setup_callback_class()
{
if ( maps\mp\bots\_bots_loadout::bot_setup_loadout_callback() )
return "callback";
else
return "class0";
}