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

1368 lines
35 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init_color_grouping( var_0 )
{
common_scripts\utility::flag_init( "player_looks_away_from_spawner" );
common_scripts\utility::flag_init( "friendly_spawner_locked" );
level.arrays_of_colorcoded_nodes = [];
level.arrays_of_colorcoded_nodes["axis"] = [];
level.arrays_of_colorcoded_nodes["allies"] = [];
level.arrays_of_colorcoded_volumes = [];
level.arrays_of_colorcoded_volumes["axis"] = [];
level.arrays_of_colorcoded_volumes["allies"] = [];
var_1 = [];
var_1 = common_scripts\utility::array_combine( var_1, getentarray( "trigger_multiple", "code_classname" ) );
var_1 = common_scripts\utility::array_combine( var_1, getentarray( "trigger_radius", "code_classname" ) );
var_1 = common_scripts\utility::array_combine( var_1, getentarray( "trigger_once", "code_classname" ) );
level.color_teams = [];
level.color_teams["allies"] = "allies";
level.color_teams["axis"] = "axis";
level.color_teams["team3"] = "axis";
level.color_teams["neutral"] = "neutral";
var_2 = getentarray( "info_volume", "code_classname" );
foreach ( var_4 in var_0 )
{
if ( isdefined( var_4.script_color_allies ) )
var_4 add_node_to_global_arrays( var_4.script_color_allies, "allies" );
if ( isdefined( var_4.script_color_axis ) )
var_4 add_node_to_global_arrays( var_4.script_color_axis, "axis" );
}
foreach ( var_7 in var_2 )
{
if ( isdefined( var_7.script_color_allies ) )
var_7 add_volume_to_global_arrays( var_7.script_color_allies, "allies" );
if ( isdefined( var_7.script_color_axis ) )
var_7 add_volume_to_global_arrays( var_7.script_color_axis, "axis" );
}
foreach ( var_10 in var_1 )
{
if ( isdefined( var_10.script_color_allies ) )
var_10 thread trigger_issues_orders( var_10.script_color_allies, "allies" );
if ( isdefined( var_10.script_color_axis ) )
var_10 thread trigger_issues_orders( var_10.script_color_axis, "axis" );
}
level.color_node_type_function = [];
add_cover_node( "BAD NODE" );
add_cover_node( "Cover Stand" );
add_cover_node( "Cover Crouch" );
add_cover_node( "Cover Prone" );
add_cover_node( "Cover Crouch Window" );
add_cover_node( "Cover Right" );
add_cover_node( "Cover Left" );
add_cover_node( "Cover Wide Left" );
add_cover_node( "Cover Wide Right" );
add_cover_node( "Cover Multi" );
add_cover_node( "Conceal Stand" );
add_cover_node( "Conceal Crouch" );
add_cover_node( "Conceal Prone" );
add_cover_node( "Reacquire" );
add_cover_node( "Balcony" );
add_cover_node( "Scripted" );
add_cover_node( "Begin" );
add_cover_node( "End" );
add_cover_node( "Turret" );
add_path_node( "Ambush" );
add_path_node( "Guard" );
add_path_node( "Path" );
add_path_node( "Exposed" );
level.colorlist = [];
level.colorlist[level.colorlist.size] = "r";
level.colorlist[level.colorlist.size] = "b";
level.colorlist[level.colorlist.size] = "y";
level.colorlist[level.colorlist.size] = "c";
level.colorlist[level.colorlist.size] = "g";
level.colorlist[level.colorlist.size] = "p";
level.colorlist[level.colorlist.size] = "o";
level.colorchecklist["red"] = "r";
level.colorchecklist["r"] = "r";
level.colorchecklist["blue"] = "b";
level.colorchecklist["b"] = "b";
level.colorchecklist["yellow"] = "y";
level.colorchecklist["y"] = "y";
level.colorchecklist["cyan"] = "c";
level.colorchecklist["c"] = "c";
level.colorchecklist["green"] = "g";
level.colorchecklist["g"] = "g";
level.colorchecklist["purple"] = "p";
level.colorchecklist["p"] = "p";
level.colorchecklist["orange"] = "o";
level.colorchecklist["o"] = "o";
level.currentcolorforced = [];
level.currentcolorforced["allies"] = [];
level.currentcolorforced["axis"] = [];
level.lastcolorforced = [];
level.lastcolorforced["allies"] = [];
level.lastcolorforced["axis"] = [];
foreach ( var_13 in level.colorlist )
{
level.arrays_of_colorforced_ai["allies"][var_13] = [];
level.arrays_of_colorforced_ai["axis"][var_13] = [];
level.currentcolorforced["allies"][var_13] = undefined;
level.currentcolorforced["axis"][var_13] = undefined;
}
thread player_color_node();
var_15 = getspawnerteamarray( "allies" );
level._color_friendly_spawners = [];
foreach ( var_17 in var_15 )
level._color_friendly_spawners[var_17.classname] = var_17;
}
convert_color_to_short_string()
{
self.script_forcecolor = level.colorchecklist[self.script_forcecolor];
}
ai_picks_destination( var_0 )
{
if ( isdefined( self.script_forcecolor ) )
{
convert_color_to_short_string();
self.currentcolorcode = var_0;
var_1 = self.script_forcecolor;
level.arrays_of_colorforced_ai[get_team()][var_1] = common_scripts\utility::array_add( level.arrays_of_colorforced_ai[get_team()][var_1], self );
thread goto_current_colorindex();
return;
}
}
goto_current_colorindex()
{
if ( !isdefined( self.currentcolorcode ) )
return;
var_0 = level.arrays_of_colorcoded_nodes[get_team()][self.currentcolorcode];
left_color_node();
if ( !isalive( self ) )
return;
if ( !maps\_utility::has_color() )
return;
if ( !isdefined( var_0 ) )
{
var_1 = level.arrays_of_colorcoded_volumes[get_team()][self.currentcolorcode];
send_ai_to_colorvolume( var_1, self.currentcolorcode );
return;
}
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
{
var_3 = var_0[var_2];
if ( isalive( var_3.color_user ) && !isplayer( var_3.color_user ) )
continue;
thread ai_sets_goal_with_delay( var_3 );
thread decrementcolorusers( var_3 );
return;
}
no_node_to_go_to();
}
no_node_to_go_to()
{
}
get_color_list()
{
var_0 = [];
var_0[var_0.size] = "r";
var_0[var_0.size] = "b";
var_0[var_0.size] = "y";
var_0[var_0.size] = "c";
var_0[var_0.size] = "g";
var_0[var_0.size] = "p";
var_0[var_0.size] = "o";
return var_0;
}
array_remove_dupes( var_0 )
{
var_1 = [];
foreach ( var_3 in var_0 )
var_1[var_3] = 1;
var_5 = [];
foreach ( var_8, var_7 in var_1 )
var_5[var_5.size] = var_8;
return var_5;
}
get_colorcodes_from_trigger( var_0, var_1 )
{
return get_colorcodes( var_0, var_1 );
}
get_colorcodes( var_0, var_1 )
{
var_2 = strtok( var_0, " " );
var_2 = array_remove_dupes( var_2 );
var_3 = [];
var_4 = [];
var_5 = [];
var_6 = get_color_list();
foreach ( var_8 in var_2 )
{
var_9 = undefined;
foreach ( var_9 in var_6 )
{
if ( issubstr( var_8, var_9 ) )
break;
}
if ( !colorcode_is_used_in_map( var_1, var_8 ) )
continue;
var_4[var_9] = var_8;
var_3[var_3.size] = var_9;
var_5[var_5.size] = var_8;
}
var_2 = var_5;
var_13 = [];
var_13["colorCodes"] = var_2;
var_13["colorCodesByColorIndex"] = var_4;
var_13["colors"] = var_3;
return var_13;
}
colorcode_is_used_in_map( var_0, var_1 )
{
if ( isdefined( level.arrays_of_colorcoded_nodes[var_0][var_1] ) )
return 1;
return isdefined( level.arrays_of_colorcoded_volumes[var_0][var_1] );
}
trigger_issues_orders( var_0, var_1 )
{
var_2 = get_colorcodes_from_trigger( var_0, var_1 );
var_3 = var_2["colorCodes"];
var_4 = var_2["colorCodesByColorIndex"];
var_5 = var_2["colors"];
var_0 = undefined;
self endon( "death" );
for (;;)
{
self waittill( "trigger" );
if ( isdefined( self.activated_color_trigger ) )
{
self.activated_color_trigger = undefined;
continue;
}
activate_color_trigger_internal( var_3, var_5, var_1, var_4 );
if ( isdefined( self.script_oneway ) && self.script_oneway )
thread trigger_delete_target_chain();
}
}
trigger_delete_target_chain()
{
var_0 = [];
var_1 = self;
while ( isdefined( var_1 ) )
{
var_0[var_0.size] = var_1;
if ( !isdefined( var_1.targetname ) )
break;
var_2 = getentarray( var_1.targetname, "target" );
var_1 = undefined;
foreach ( var_4 in var_2 )
{
if ( !isdefined( var_4.script_color_allies ) && !isdefined( var_4.script_color_axis ) )
continue;
var_1 = var_4;
}
}
maps\_utility::array_delete( var_0 );
}
activate_color_trigger( var_0 )
{
if ( var_0 == "allies" )
thread get_colorcodes_and_activate_trigger( self.script_color_allies, var_0 );
else
thread get_colorcodes_and_activate_trigger( self.script_color_axis, var_0 );
}
get_colorcodes_and_activate_trigger( var_0, var_1 )
{
var_2 = get_colorcodes_from_trigger( var_0, var_1 );
var_3 = var_2["colorCodes"];
var_4 = var_2["colorCodesByColorIndex"];
var_5 = var_2["colors"];
activate_color_trigger_internal( var_3, var_5, var_1, var_4 );
}
activate_color_trigger_internal( var_0, var_1, var_2, var_3 )
{
return activate_color_code_internal( var_0, var_1, var_2, var_3 );
}
activate_color_code_internal( var_0, var_1, var_2, var_3 )
{
for ( var_4 = 0; var_4 < var_0.size; var_4++ )
{
if ( !isdefined( level.arrays_of_colorcoded_spawners[var_2][var_0[var_4]] ) )
continue;
level.arrays_of_colorcoded_spawners[var_2][var_0[var_4]] = common_scripts\utility::array_removeundefined( level.arrays_of_colorcoded_spawners[var_2][var_0[var_4]] );
for ( var_5 = 0; var_5 < level.arrays_of_colorcoded_spawners[var_2][var_0[var_4]].size; var_5++ )
level.arrays_of_colorcoded_spawners[var_2][var_0[var_4]][var_5].currentcolorcode = var_0[var_4];
}
foreach ( var_7 in var_1 )
{
level.arrays_of_colorforced_ai[var_2][var_7] = maps\_utility::array_removedead( level.arrays_of_colorforced_ai[var_2][var_7] );
level.lastcolorforced[var_2][var_7] = level.currentcolorforced[var_2][var_7];
level.currentcolorforced[var_2][var_7] = var_3[var_7];
}
var_11 = [];
for ( var_4 = 0; var_4 < var_0.size; var_4++ )
{
if ( same_color_code_as_last_time( var_2, var_1[var_4] ) )
continue;
var_12 = var_0[var_4];
if ( !isdefined( level.arrays_of_colorcoded_ai[var_2][var_12] ) )
continue;
var_11[var_12] = issue_leave_node_order_to_ai_and_get_ai( var_12, var_1[var_4], var_2 );
}
for ( var_4 = 0; var_4 < var_0.size; var_4++ )
{
var_12 = var_0[var_4];
if ( !isdefined( var_11[var_12] ) )
continue;
if ( same_color_code_as_last_time( var_2, var_1[var_4] ) )
continue;
if ( !isdefined( level.arrays_of_colorcoded_ai[var_2][var_12] ) )
continue;
issue_color_order_to_ai( var_12, var_1[var_4], var_2, var_11[var_12] );
}
}
same_color_code_as_last_time( var_0, var_1 )
{
if ( !isdefined( level.lastcolorforced[var_0][var_1] ) )
return 0;
return level.lastcolorforced[var_0][var_1] == level.currentcolorforced[var_0][var_1];
}
process_cover_node_with_last_in_mind_allies( var_0, var_1 )
{
if ( issubstr( var_0.script_color_allies, var_1 ) )
self.cover_nodes_last[self.cover_nodes_last.size] = var_0;
else
self.cover_nodes_first[self.cover_nodes_first.size] = var_0;
}
process_cover_node_with_last_in_mind_axis( var_0, var_1 )
{
if ( issubstr( var_0.script_color_axis, var_1 ) )
self.cover_nodes_last[self.cover_nodes_last.size] = var_0;
else
self.cover_nodes_first[self.cover_nodes_first.size] = var_0;
}
process_cover_node( var_0, var_1 )
{
self.cover_nodes_first[self.cover_nodes_first.size] = var_0;
}
process_path_node( var_0, var_1 )
{
self.path_nodes[self.path_nodes.size] = var_0;
}
prioritize_colorcoded_nodes( var_0, var_1, var_2 )
{
var_3 = level.arrays_of_colorcoded_nodes[var_0][var_1];
var_4 = spawnstruct();
var_4.path_nodes = [];
var_4.cover_nodes_first = [];
var_4.cover_nodes_last = [];
var_5 = isdefined( level.lastcolorforced[var_0][var_2] );
for ( var_6 = 0; var_6 < var_3.size; var_6++ )
{
var_7 = var_3[var_6];
var_4 [[ level.color_node_type_function[var_7.type][var_5][var_0] ]]( var_7, level.lastcolorforced[var_0][var_2] );
}
var_4.cover_nodes_first = common_scripts\utility::array_randomize( var_4.cover_nodes_first );
var_8 = [];
var_3 = [];
foreach ( var_10, var_7 in var_4.cover_nodes_first )
{
if ( isdefined( var_7.script_colorlast ) )
{
var_8[var_8.size] = var_7;
var_3[var_10] = undefined;
continue;
}
var_3[var_3.size] = var_7;
}
for ( var_6 = 0; var_6 < var_4.cover_nodes_last.size; var_6++ )
var_3[var_3.size] = var_4.cover_nodes_last[var_6];
for ( var_6 = 0; var_6 < var_4.path_nodes.size; var_6++ )
var_3[var_3.size] = var_4.path_nodes[var_6];
foreach ( var_7 in var_8 )
var_3[var_3.size] = var_7;
level.arrays_of_colorcoded_nodes[var_0][var_1] = var_3;
}
get_prioritized_colorcoded_nodes( var_0, var_1, var_2 )
{
return level.arrays_of_colorcoded_nodes[var_0][var_1];
}
get_colorcoded_volume( var_0, var_1 )
{
return level.arrays_of_colorcoded_volumes[var_0][var_1];
}
issue_leave_node_order_to_ai_and_get_ai( var_0, var_1, var_2 )
{
level.arrays_of_colorcoded_ai[var_2][var_0] = maps\_utility::array_removedead( level.arrays_of_colorcoded_ai[var_2][var_0] );
var_3 = level.arrays_of_colorcoded_ai[var_2][var_0];
var_3 = common_scripts\utility::array_combine( var_3, level.arrays_of_colorforced_ai[var_2][var_1] );
var_4 = [];
foreach ( var_6 in var_3 )
{
if ( isdefined( var_6.currentcolorcode ) && var_6.currentcolorcode == var_0 )
continue;
var_4[var_4.size] = var_6;
}
var_3 = var_4;
if ( !var_3.size )
return;
common_scripts\utility::array_thread( var_3, ::left_color_node );
return var_3;
}
send_ai_to_colorvolume( var_0, var_1 )
{
self notify( "stop_color_move" );
self.currentcolorcode = var_1;
if ( isdefined( var_0.target ) )
{
var_2 = getnode( var_0.target, "targetname" );
if ( isdefined( var_2 ) )
self setgoalnode( var_2 );
}
self.fixednode = 0;
self setgoalvolumeauto( var_0 );
}
issue_color_order_to_ai( var_0, var_1, var_2, var_3 )
{
var_4 = var_3;
var_5 = [];
if ( isdefined( level.arrays_of_colorcoded_nodes[var_2][var_0] ) )
{
prioritize_colorcoded_nodes( var_2, var_0, var_1 );
var_5 = get_prioritized_colorcoded_nodes( var_2, var_0, var_1 );
}
else
{
var_6 = get_colorcoded_volume( var_2, var_0 );
common_scripts\utility::array_thread( var_3, ::send_ai_to_colorvolume, var_6, var_0 );
}
var_7 = 0;
var_8 = var_3.size;
for ( var_9 = 0; var_9 < var_5.size; var_9++ )
{
var_10 = var_5[var_9];
if ( isalive( var_10.color_user ) )
continue;
var_11 = common_scripts\utility::getclosest( var_10.origin, var_3 );
var_3 = common_scripts\utility::array_remove( var_3, var_11 );
var_11 take_color_node( var_10, var_0, self, var_7 );
var_7++;
if ( !var_3.size )
return;
}
}
take_color_node( var_0, var_1, var_2, var_3 )
{
self notify( "stop_color_move" );
self.currentcolorcode = var_1;
thread process_color_order_to_ai( var_0, var_2, var_3 );
}
player_color_node()
{
for (;;)
{
var_0 = undefined;
if ( !isdefined( level.player.node ) )
{
wait 0.05;
continue;
}
var_1 = level.player.node.color_user;
var_0 = level.player.node;
var_0.color_user = level.player;
for (;;)
{
if ( !isdefined( level.player.node ) )
break;
if ( level.player.node != var_0 )
break;
wait 0.05;
}
var_0.color_user = undefined;
var_0 color_node_finds_a_user();
}
}
color_node_finds_a_user()
{
if ( isdefined( self.script_color_allies ) )
color_node_finds_user_from_colorcodes( self.script_color_allies, "allies" );
if ( isdefined( self.script_color_axis ) )
color_node_finds_user_from_colorcodes( self.script_color_axis, "axis" );
}
color_node_finds_user_from_colorcodes( var_0, var_1 )
{
if ( isdefined( self.color_user ) )
return;
var_2 = strtok( var_0, " " );
var_2 = array_remove_dupes( var_2 );
common_scripts\utility::array_levelthread( var_2, ::color_node_finds_user_for_colorcode, var_1 );
}
color_node_finds_user_for_colorcode( var_0, var_1 )
{
var_2 = var_0[0];
if ( !isdefined( level.currentcolorforced[var_1][var_2] ) )
return;
if ( level.currentcolorforced[var_1][var_2] != var_0 )
return;
var_3 = maps\_utility::get_force_color_guys( var_1, var_2 );
for ( var_4 = 0; var_4 < var_3.size; var_4++ )
{
var_5 = var_3[var_4];
if ( var_5 occupies_colorcode( var_0 ) )
continue;
var_5 take_color_node( self, var_0 );
return;
}
}
occupies_colorcode( var_0 )
{
if ( !isdefined( self.currentcolorcode ) )
return 0;
return self.currentcolorcode == var_0;
}
ai_sets_goal_with_delay( var_0 )
{
self endon( "death" );
self endon( "stop_color_move" );
my_current_node_delays();
thread ai_sets_goal( var_0 );
}
ai_sets_goal( var_0 )
{
self notify( "stop_going_to_node" );
set_goal_and_volume( var_0 );
var_1 = level.arrays_of_colorcoded_volumes[get_team()][self.currentcolorcode];
if ( isdefined( self.script_careful ) )
thread careful_logic( var_0, var_1 );
}
set_goal_and_volume( var_0 )
{
if ( isdefined( self.colornode_func ) )
self thread [[ self.colornode_func ]]( var_0 );
if ( isdefined( self._colors_go_line ) )
{
thread maps\_anim::anim_single_queue( self, self._colors_go_line );
self._colors_go_line = undefined;
}
if ( isdefined( self.colornode_setgoal_func ) )
self thread [[ self.colornode_setgoal_func ]]( var_0 );
else
self setgoalnode( var_0 );
if ( is_using_forcegoal_radius( var_0 ) )
thread forcegoal_radius( var_0 );
else if ( isdefined( var_0.radius ) && var_0.radius > 0 )
self.goalradius = var_0.radius;
var_1 = level.arrays_of_colorcoded_volumes[get_team()][self.currentcolorcode];
if ( isdefined( var_1 ) )
self setfixednodesafevolume( var_1 );
else
self clearfixednodesafevolume();
if ( isdefined( var_0.fixednodesaferadius ) )
self.fixednodesaferadius = var_0.fixednodesaferadius;
else if ( isdefined( level.fixednodesaferadius_default ) )
self.fixednodesaferadius = level.fixednodesaferadius_default;
else
self.fixednodesaferadius = 64;
}
is_using_forcegoal_radius( var_0 )
{
if ( !isdefined( self.script_forcegoal ) )
return 0;
if ( !self.script_forcegoal )
return 0;
if ( !isdefined( var_0.fixednodesaferadius ) )
return 0;
if ( self.fixednode )
return 0;
else
return 1;
}
forcegoal_radius( var_0 )
{
self endon( "death" );
self endon( "stop_going_to_node" );
self.goalradius = var_0.fixednodesaferadius;
common_scripts\utility::waittill_either( "goal", "damage" );
if ( isdefined( var_0.radius ) && var_0.radius > 0 )
self.goalradius = var_0.radius;
}
careful_logic( var_0, var_1 )
{
self endon( "death" );
self endon( "stop_being_careful" );
self endon( "stop_going_to_node" );
thread recover_from_careful_disable( var_0 );
for (;;)
{
wait_until_an_enemy_is_in_safe_area( var_0, var_1 );
use_big_goal_until_goal_is_safe( var_0, var_1 );
self.fixednode = 1;
set_goal_and_volume( var_0 );
}
}
recover_from_careful_disable( var_0 )
{
self endon( "death" );
self endon( "stop_going_to_node" );
self waittill( "stop_being_careful" );
self.fixednode = 1;
set_goal_and_volume( var_0 );
}
use_big_goal_until_goal_is_safe( var_0, var_1 )
{
self setgoalpos( self.origin );
self.goalradius = 1024;
self.fixednode = 0;
if ( isdefined( var_1 ) )
{
for (;;)
{
wait 1;
if ( self isknownenemyinradius( var_0.origin, self.fixednodesaferadius ) )
continue;
if ( self isknownenemyinvolume( var_1 ) )
continue;
return;
}
}
else
{
for (;;)
{
if ( !isknownenemyinradius_tmp( var_0.origin, self.fixednodesaferadius ) )
return;
wait 1;
}
}
}
isknownenemyinradius_tmp( var_0, var_1 )
{
var_2 = getaiarray( "axis" );
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
{
if ( distance2d( var_2[var_3].origin, var_0 ) < var_1 )
return 1;
}
return 0;
}
wait_until_an_enemy_is_in_safe_area( var_0, var_1 )
{
if ( isdefined( var_1 ) )
{
for (;;)
{
if ( self isknownenemyinradius( var_0.origin, self.fixednodesaferadius ) )
return;
if ( self isknownenemyinvolume( var_1 ) )
return;
wait 1;
}
}
else
{
for (;;)
{
if ( isknownenemyinradius_tmp( var_0.origin, self.fixednodesaferadius ) )
return;
wait 1;
}
}
}
my_current_node_delays()
{
if ( !isdefined( self.node ) )
return 0;
if ( isdefined( self.script_color_delay_override ) )
{
wait( self.script_color_delay_override );
return 1;
}
return self.node maps\_utility::script_delay();
}
process_color_order_to_ai( var_0, var_1, var_2 )
{
thread decrementcolorusers( var_0 );
self endon( "stop_color_move" );
self endon( "death" );
if ( isdefined( var_1 ) )
var_1 maps\_utility::script_delay();
if ( !my_current_node_delays() )
{
if ( isdefined( var_2 ) )
wait( var_2 * randomfloatrange( 0.2, 0.35 ) );
}
ai_sets_goal( var_0 );
self.color_ordered_node_assignment = var_0;
for (;;)
{
self waittill( "node_taken", var_3 );
if ( isplayer( var_3 ) )
wait 0.05;
var_0 = get_best_available_new_colored_node();
if ( isdefined( var_0 ) )
{
if ( isalive( self.color_node.color_user ) && self.color_node.color_user == self )
self.color_node.color_user = undefined;
self.color_node = var_0;
var_0.color_user = self;
ai_sets_goal( var_0 );
}
}
}
get_best_available_colored_node()
{
var_0 = level.currentcolorforced[get_team()][self.script_forcecolor];
var_1 = get_prioritized_colorcoded_nodes( get_team(), var_0, self.script_forcecolor );
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
{
if ( !isalive( var_1[var_2].color_user ) )
return var_1[var_2];
}
}
get_best_available_new_colored_node()
{
var_0 = level.currentcolorforced[get_team()][self.script_forcecolor];
var_1 = get_prioritized_colorcoded_nodes( get_team(), var_0, self.script_forcecolor );
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
{
if ( var_1[var_2] == self.color_node )
continue;
if ( !isalive( var_1[var_2].color_user ) )
return var_1[var_2];
}
}
process_stop_short_of_node( var_0 )
{
self endon( "stopScript" );
self endon( "death" );
if ( isdefined( self.node ) )
return;
if ( distance( var_0.origin, self.origin ) < 32 )
{
reached_node_but_could_not_claim_it( var_0 );
return;
}
var_1 = gettime();
wait_for_killanimscript_or_time( 1 );
var_2 = gettime();
if ( var_2 - var_1 >= 1000 )
reached_node_but_could_not_claim_it( var_0 );
}
wait_for_killanimscript_or_time( var_0 )
{
self endon( "killanimscript" );
wait( var_0 );
}
reached_node_but_could_not_claim_it( var_0 )
{
var_1 = getaiarray();
var_2 = undefined;
for ( var_3 = 0; var_3 < var_1.size; var_3++ )
{
if ( !isdefined( var_1[var_3].node ) )
continue;
if ( var_1[var_3].node != var_0 )
continue;
var_1[var_3] notify( "eject_from_my_node" );
wait 1;
self notify( "eject_from_my_node" );
return 1;
}
return 0;
}
decrementcolorusers( var_0 )
{
var_0.color_user = self;
self.color_node = var_0;
self endon( "stop_color_move" );
self waittill( "death" );
self.color_node.color_user = undefined;
}
colorislegit( var_0 )
{
for ( var_1 = 0; var_1 < level.colorlist.size; var_1++ )
{
if ( var_0 == level.colorlist[var_1] )
return 1;
}
return 0;
}
add_volume_to_global_arrays( var_0, var_1 )
{
var_2 = strtok( var_0, " " );
var_2 = array_remove_dupes( var_2 );
foreach ( var_4 in var_2 )
{
level.arrays_of_colorcoded_volumes[var_1][var_4] = self;
level.arrays_of_colorcoded_ai[var_1][var_4] = [];
level.arrays_of_colorcoded_spawners[var_1][var_4] = [];
}
}
add_node_to_global_arrays( var_0, var_1 )
{
self.color_user = undefined;
var_2 = strtok( var_0, " " );
var_2 = array_remove_dupes( var_2 );
foreach ( var_4 in var_2 )
{
if ( isdefined( level.arrays_of_colorcoded_nodes[var_1] ) && isdefined( level.arrays_of_colorcoded_nodes[var_1][var_4] ) )
{
level.arrays_of_colorcoded_nodes[var_1][var_4] = common_scripts\utility::array_add( level.arrays_of_colorcoded_nodes[var_1][var_4], self );
continue;
}
level.arrays_of_colorcoded_nodes[var_1][var_4][0] = self;
level.arrays_of_colorcoded_ai[var_1][var_4] = [];
level.arrays_of_colorcoded_spawners[var_1][var_4] = [];
}
}
left_color_node()
{
if ( !isdefined( self.color_node ) )
return;
if ( isdefined( self.color_node.color_user ) && self.color_node.color_user == self )
self.color_node.color_user = undefined;
self.color_node = undefined;
self notify( "stop_color_move" );
}
getcolornumberarray()
{
var_0 = [];
if ( issubstr( self.classname, "axis" ) || issubstr( self.classname, "enemy" ) || issubstr( self.classname, "team3" ) )
{
var_0["team"] = "axis";
var_0["colorTeam"] = self.script_color_axis;
}
if ( issubstr( self.classname, "ally" ) || self.type == "civilian" )
{
var_0["team"] = "allies";
var_0["colorTeam"] = self.script_color_allies;
}
if ( !isdefined( var_0["colorTeam"] ) )
var_0 = undefined;
return var_0;
}
removespawnerfromcolornumberarray()
{
var_0 = getcolornumberarray();
if ( !isdefined( var_0 ) )
return;
var_1 = var_0["team"];
var_2 = var_0["colorTeam"];
var_3 = strtok( var_2, " " );
var_3 = array_remove_dupes( var_3 );
for ( var_4 = 0; var_4 < var_3.size; var_4++ )
level.arrays_of_colorcoded_spawners[var_1][var_3[var_4]] = common_scripts\utility::array_remove( level.arrays_of_colorcoded_spawners[var_1][var_3[var_4]], self );
}
add_cover_node( var_0 )
{
level.color_node_type_function[var_0][1]["allies"] = ::process_cover_node_with_last_in_mind_allies;
level.color_node_type_function[var_0][1]["axis"] = ::process_cover_node_with_last_in_mind_axis;
level.color_node_type_function[var_0][0]["allies"] = ::process_cover_node;
level.color_node_type_function[var_0][0]["axis"] = ::process_cover_node;
}
add_path_node( var_0 )
{
level.color_node_type_function[var_0][1]["allies"] = ::process_path_node;
level.color_node_type_function[var_0][0]["allies"] = ::process_path_node;
level.color_node_type_function[var_0][1]["axis"] = ::process_path_node;
level.color_node_type_function[var_0][0]["axis"] = ::process_path_node;
}
colornode_spawn_reinforcement( var_0, var_1 )
{
level endon( "kill_color_replacements" );
level endon( "kill_hidden_reinforcement_waiting" );
var_2 = spawn_hidden_reinforcement( var_0, var_1 );
if ( isdefined( level.friendly_startup_thread ) )
var_2 thread [[ level.friendly_startup_thread ]]();
var_2 thread colornode_replace_on_death();
}
colornode_replace_on_death()
{
level endon( "kill_color_replacements" );
self endon( "_disable_reinforcement" );
if ( isdefined( self.replace_on_death ) )
return;
self.replace_on_death = 1;
var_0 = self.classname;
var_1 = self.script_forcecolor;
waittillframeend;
if ( isalive( self ) )
self waittill( "death" );
var_2 = level.current_color_order;
if ( !isdefined( self.script_forcecolor ) )
return;
thread colornode_spawn_reinforcement( var_0, self.script_forcecolor );
if ( isdefined( self ) && isdefined( self.script_forcecolor ) )
var_1 = self.script_forcecolor;
if ( isdefined( self ) && isdefined( self.origin ) )
var_3 = self.origin;
for (;;)
{
if ( get_color_from_order( var_1, var_2 ) == "none" )
return;
var_4 = maps\_utility::get_force_color_guys( "allies", var_2[var_1] );
if ( !isdefined( level.color_doesnt_care_about_heroes ) )
var_4 = maps\_utility::remove_heroes_from_array( var_4 );
if ( !isdefined( level.color_doesnt_care_about_classname ) )
var_4 = maps\_utility::remove_without_classname( var_4, var_0 );
if ( !var_4.size )
{
wait 2;
continue;
}
var_5 = common_scripts\utility::getclosest( level.player.origin, var_4 );
waittillframeend;
if ( !isalive( var_5 ) )
continue;
var_5 maps\_utility::set_force_color( var_1 );
if ( isdefined( level.friendly_promotion_thread ) )
var_5 [[ level.friendly_promotion_thread ]]( var_1 );
var_1 = var_2[var_1];
}
}
get_color_from_order( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
return "none";
if ( !isdefined( var_1 ) )
return "none";
if ( !isdefined( var_1[var_0] ) )
return "none";
return var_1[var_0];
}
friendly_spawner_vision_checker()
{
level.friendly_respawn_vision_checker_thread = 1;
var_0 = 0;
for (;;)
{
for (;;)
{
if ( !respawn_friendlies_without_vision_check() )
break;
wait 0.05;
}
wait 1;
if ( !isdefined( level.respawn_spawner_org ) )
continue;
var_1 = level.player.origin - level.respawn_spawner_org;
if ( length( var_1 ) < 200 )
{
player_sees_spawner();
continue;
}
var_2 = anglestoforward( ( 0, level.player getplayerangles()[1], 0 ) );
var_3 = vectornormalize( var_1 );
var_4 = vectordot( var_2, var_3 );
if ( var_4 < 0.2 )
{
player_sees_spawner();
continue;
}
var_0++;
if ( var_0 < 3 )
continue;
common_scripts\utility::flag_set( "player_looks_away_from_spawner" );
}
}
get_color_spawner( var_0 )
{
if ( isdefined( var_0 ) )
{
if ( !isdefined( level._color_friendly_spawners[var_0] ) )
{
var_1 = getspawnerteamarray( "allies" );
foreach ( var_3 in var_1 )
{
if ( var_3.classname != var_0 )
continue;
level._color_friendly_spawners[var_0] = var_3;
break;
}
}
}
if ( !isdefined( var_0 ) )
{
var_3 = common_scripts\utility::random( level._color_friendly_spawners );
if ( !isdefined( var_3 ) )
{
var_1 = [];
foreach ( var_6, var_3 in level._color_friendly_spawners )
{
if ( isdefined( var_3 ) )
var_1[var_6] = var_3;
}
level._color_friendly_spawners = var_1;
return common_scripts\utility::random( level._color_friendly_spawners );
}
return var_3;
}
return level._color_friendly_spawners[var_0];
}
respawn_friendlies_without_vision_check()
{
if ( isdefined( level.respawn_friendlies_force_vision_check ) )
return 0;
return common_scripts\utility::flag( "respawn_friendlies" );
}
wait_until_vision_check_satisfied_or_disabled()
{
if ( common_scripts\utility::flag( "player_looks_away_from_spawner" ) )
return;
level endon( "player_looks_away_from_spawner" );
for (;;)
{
if ( respawn_friendlies_without_vision_check() )
return;
wait 0.05;
}
}
spawn_hidden_reinforcement( var_0, var_1 )
{
level endon( "kill_color_replacements" );
level endon( "kill_hidden_reinforcement_waiting" );
var_2 = undefined;
for (;;)
{
if ( !respawn_friendlies_without_vision_check() )
{
if ( !isdefined( level.friendly_respawn_vision_checker_thread ) )
thread friendly_spawner_vision_checker();
for (;;)
{
wait_until_vision_check_satisfied_or_disabled();
common_scripts\utility::flag_waitopen( "friendly_spawner_locked" );
if ( common_scripts\utility::flag( "player_looks_away_from_spawner" ) || respawn_friendlies_without_vision_check() )
break;
}
common_scripts\utility::flag_set( "friendly_spawner_locked" );
}
var_3 = get_color_spawner( var_0 );
var_3.count = 1;
var_4 = var_3.origin;
var_3.origin = level.respawn_spawner_org;
var_2 = var_3 stalingradspawn();
var_3.origin = var_4;
if ( maps\_utility::spawn_failed( var_2 ) )
{
thread lock_spawner_for_awhile();
wait 1;
continue;
}
level notify( "reinforcement_spawned", var_2 );
break;
}
for (;;)
{
if ( !isdefined( var_1 ) )
break;
if ( get_color_from_order( var_1, level.current_color_order ) == "none" )
break;
var_1 = level.current_color_order[var_1];
}
if ( isdefined( var_1 ) )
var_2 maps\_utility::set_force_color( var_1 );
thread lock_spawner_for_awhile();
return var_2;
}
lock_spawner_for_awhile()
{
common_scripts\utility::flag_set( "friendly_spawner_locked" );
if ( isdefined( level.friendly_respawn_lock_func ) )
[[ level.friendly_respawn_lock_func ]]();
else
wait 2;
common_scripts\utility::flag_clear( "friendly_spawner_locked" );
}
player_sees_spawner()
{
var_0 = 0;
common_scripts\utility::flag_clear( "player_looks_away_from_spawner" );
}
kill_color_replacements()
{
common_scripts\utility::flag_clear( "friendly_spawner_locked" );
level notify( "kill_color_replacements" );
var_0 = getaiarray();
common_scripts\utility::array_thread( var_0, ::remove_replace_on_death );
}
remove_replace_on_death()
{
self.replace_on_death = undefined;
}
get_team( var_0 )
{
if ( isdefined( self.team ) && !isdefined( var_0 ) )
var_0 = self.team;
return level.color_teams[var_0];
}