5402 lines
137 KiB
Plaintext
5402 lines
137 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
setup_script_gatetrigger( var_0 )
|
|
{
|
|
var_1 = [];
|
|
|
|
if ( isdefined( var_0.script_gatetrigger ) )
|
|
return level.vehicle_gatetrigger[var_0.script_gatetrigger];
|
|
|
|
return var_1;
|
|
}
|
|
|
|
setup_vehicle_spawners()
|
|
{
|
|
var_0 = _getvehiclespawnerarray();
|
|
|
|
foreach ( var_2 in var_0 )
|
|
var_2 thread vehicle_spawn_think();
|
|
}
|
|
|
|
vehicle_spawn_think()
|
|
{
|
|
self endon( "entitydeleted" );
|
|
|
|
if ( isdefined( self.script_kill_vehicle_spawner ) )
|
|
{
|
|
var_0 = self.script_kill_vehicle_spawner;
|
|
|
|
if ( !isdefined( level.vehicle_killspawn_groups[var_0] ) )
|
|
level.vehicle_killspawn_groups[var_0] = [];
|
|
|
|
level.vehicle_killspawn_groups[var_0][level.vehicle_killspawn_groups[var_0].size] = self;
|
|
}
|
|
|
|
if ( isdefined( self.script_deathflag ) )
|
|
thread maps\_spawner::vehicle_spawner_deathflag();
|
|
|
|
thread vehicle_linked_entities_think();
|
|
self.count = 1;
|
|
self.spawn_functions = [];
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = undefined;
|
|
self waittill( "spawned", var_1 );
|
|
self.count--;
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
continue;
|
|
|
|
var_1.spawn_funcs = self.spawn_functions;
|
|
var_1.spawner = self;
|
|
var_1 thread maps\_spawner::run_spawn_functions();
|
|
}
|
|
}
|
|
|
|
vehicle_linked_entities_think()
|
|
{
|
|
if ( !isdefined( self.script_vehiclecargo ) )
|
|
return;
|
|
|
|
if ( !isdefined( self.script_linkto ) )
|
|
return;
|
|
|
|
var_0 = getentarray( self.script_linkto, "script_linkname" );
|
|
|
|
if ( var_0.size == 0 )
|
|
return;
|
|
|
|
var_1 = var_0[0].targetname;
|
|
var_0 = getentarray( var_1, "targetname" );
|
|
var_2 = undefined;
|
|
|
|
foreach ( var_4 in var_0 )
|
|
{
|
|
if ( var_4.classname == "script_origin" )
|
|
var_2 = var_4;
|
|
|
|
var_4 hide();
|
|
}
|
|
|
|
foreach ( var_4 in var_0 )
|
|
{
|
|
if ( var_4 != var_2 )
|
|
var_4 linkto( var_2 );
|
|
}
|
|
|
|
self waittill( "spawned", var_8 );
|
|
|
|
foreach ( var_4 in var_0 )
|
|
{
|
|
var_4 show();
|
|
|
|
if ( var_4 != var_2 )
|
|
var_4 linkto( var_8 );
|
|
}
|
|
|
|
var_8 waittill( "death" );
|
|
common_scripts\utility::array_call( var_0, ::delete );
|
|
}
|
|
|
|
is_trigger_once()
|
|
{
|
|
if ( !isdefined( self.classname ) )
|
|
return 0;
|
|
|
|
if ( self.classname == "trigger_multiple" )
|
|
return 1;
|
|
|
|
if ( self.classname == "trigger_radius" )
|
|
return 1;
|
|
|
|
if ( self.classname == "trigger_lookat" )
|
|
return 1;
|
|
|
|
return self.classname == "trigger_disk";
|
|
}
|
|
|
|
trigger_process( var_0 )
|
|
{
|
|
var_1 = var_0 is_trigger_once();
|
|
var_0.processed_trigger = undefined;
|
|
|
|
if ( isdefined( var_0.script_noteworthy ) && var_0.script_noteworthy == "trigger_multiple" )
|
|
var_1 = 0;
|
|
|
|
var_2 = setup_script_gatetrigger( var_0 );
|
|
var_3 = isdefined( var_0.script_vehiclespawngroup );
|
|
var_4 = isdefined( var_0.script_vehicledetour ) && ( is_node_script_origin( var_0 ) || is_node_script_struct( var_0 ) );
|
|
var_5 = isdefined( var_0.detoured ) && !( is_node_script_origin( var_0 ) || is_node_script_struct( var_0 ) );
|
|
var_6 = 1;
|
|
|
|
while ( var_6 )
|
|
{
|
|
var_0 waittill( "trigger", var_7 );
|
|
|
|
if ( isdefined( var_0.script_vehicletriggergroup ) )
|
|
{
|
|
if ( !isdefined( var_7.script_vehicletriggergroup ) )
|
|
continue;
|
|
|
|
if ( var_7.script_vehicletriggergroup != var_0.script_vehicletriggergroup )
|
|
continue;
|
|
}
|
|
|
|
if ( isdefined( var_0.enabled ) && !var_0.enabled )
|
|
var_0 waittill( "enable" );
|
|
|
|
if ( isdefined( var_0.script_flag_set ) )
|
|
common_scripts\utility::flag_set( var_0.script_flag_set );
|
|
|
|
if ( isdefined( var_0.script_flag_clear ) )
|
|
common_scripts\utility::flag_clear( var_0.script_flag_clear );
|
|
|
|
if ( var_4 )
|
|
var_7 thread path_detour_script_origin( var_0 );
|
|
else if ( var_5 && isdefined( var_7 ) )
|
|
var_7 thread path_detour( var_0 );
|
|
|
|
var_0 maps\_utility::script_delay();
|
|
|
|
if ( var_1 )
|
|
var_6 = 0;
|
|
|
|
if ( isdefined( var_0.script_vehiclegroupdelete ) )
|
|
{
|
|
if ( !isdefined( level.vehicle_deletegroup[var_0.script_vehiclegroupdelete] ) )
|
|
level.vehicle_deletegroup[var_0.script_vehiclegroupdelete] = [];
|
|
|
|
common_scripts\utility::array_levelthread( level.vehicle_deletegroup[var_0.script_vehiclegroupdelete], maps\_utility::deleteent );
|
|
}
|
|
|
|
if ( var_3 )
|
|
_scripted_spawn( var_0.script_vehiclespawngroup );
|
|
|
|
if ( var_2.size > 0 && var_1 )
|
|
common_scripts\utility::array_levelthread( var_2, ::path_gate_open );
|
|
|
|
if ( isdefined( var_0.script_vehiclestartmove ) )
|
|
{
|
|
if ( !isdefined( level.vehicle_startmovegroup[var_0.script_vehiclestartmove] ) )
|
|
return;
|
|
|
|
common_scripts\utility::array_levelthread( level.vehicle_startmovegroup[var_0.script_vehiclestartmove], ::_gopath );
|
|
}
|
|
}
|
|
}
|
|
|
|
trigger_process_optimized( var_0, var_1 )
|
|
{
|
|
var_2 = var_0 is_trigger_once();
|
|
var_0.processed_trigger = undefined;
|
|
|
|
if ( isdefined( var_0.script_noteworthy ) && var_0.script_noteworthy == "trigger_multiple" )
|
|
var_2 = 0;
|
|
|
|
var_3 = setup_script_gatetrigger( var_0 );
|
|
var_4 = isdefined( var_0.script_vehiclespawngroup );
|
|
var_5 = isdefined( var_0.script_vehicledetour ) && ( is_node_script_origin( var_0 ) || is_node_script_struct( var_0 ) );
|
|
var_6 = isdefined( var_0.detoured ) && !( is_node_script_origin( var_0 ) || is_node_script_struct( var_0 ) );
|
|
var_7 = 1;
|
|
|
|
if ( isdefined( var_0.script_vehicletriggergroup ) )
|
|
{
|
|
if ( !isdefined( var_1.script_vehicletriggergroup ) )
|
|
return;
|
|
|
|
if ( var_1.script_vehicletriggergroup != var_0.script_vehicletriggergroup )
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( var_0.enabled ) && !var_0.enabled )
|
|
var_0 waittill( "enable" );
|
|
|
|
if ( isdefined( var_0.script_flag_set ) )
|
|
common_scripts\utility::flag_set( var_0.script_flag_set );
|
|
|
|
if ( isdefined( var_0.script_flag_clear ) )
|
|
common_scripts\utility::flag_clear( var_0.script_flag_clear );
|
|
|
|
if ( var_5 )
|
|
var_1 thread path_detour_script_origin( var_0 );
|
|
else if ( var_6 && isdefined( var_1 ) )
|
|
var_1 thread path_detour( var_0 );
|
|
|
|
var_0 maps\_utility::script_delay();
|
|
|
|
if ( var_2 )
|
|
var_7 = 0;
|
|
|
|
if ( isdefined( var_0.script_vehiclegroupdelete ) )
|
|
{
|
|
if ( !isdefined( level.vehicle_deletegroup[var_0.script_vehiclegroupdelete] ) )
|
|
level.vehicle_deletegroup[var_0.script_vehiclegroupdelete] = [];
|
|
|
|
common_scripts\utility::array_levelthread( level.vehicle_deletegroup[var_0.script_vehiclegroupdelete], maps\_utility::deleteent );
|
|
}
|
|
|
|
if ( var_4 )
|
|
_scripted_spawn( var_0.script_vehiclespawngroup );
|
|
|
|
if ( var_3.size > 0 && var_2 )
|
|
common_scripts\utility::array_levelthread( var_3, ::path_gate_open );
|
|
|
|
if ( isdefined( var_0.script_vehiclestartmove ) )
|
|
{
|
|
if ( !isdefined( level.vehicle_startmovegroup[var_0.script_vehiclestartmove] ) )
|
|
return;
|
|
|
|
common_scripts\utility::array_levelthread( level.vehicle_startmovegroup[var_0.script_vehiclestartmove], ::_gopath );
|
|
}
|
|
}
|
|
|
|
path_detour_get_detourpath( var_0 )
|
|
{
|
|
var_1 = undefined;
|
|
|
|
foreach ( var_3 in level.vehicle_detourpaths[var_0.script_vehicledetour] )
|
|
{
|
|
if ( var_3 != var_0 )
|
|
{
|
|
if ( !islastnode( var_3 ) )
|
|
var_1 = var_3;
|
|
}
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
path_detour_script_origin( var_0 )
|
|
{
|
|
var_1 = path_detour_get_detourpath( var_0 );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
thread _vehicle_paths( var_1 );
|
|
}
|
|
|
|
crash_detour_check( var_0 )
|
|
{
|
|
return ( isdefined( self.deaddriver ) || self.health < self.healthbuffer || var_0.script_crashtype == "forced" ) && ( !isdefined( var_0.derailed ) || var_0.script_crashtype == "plane" );
|
|
}
|
|
|
|
crash_derailed_check( var_0 )
|
|
{
|
|
return isdefined( var_0.derailed ) && var_0.derailed;
|
|
}
|
|
|
|
path_detour( var_0 )
|
|
{
|
|
var_1 = getvehiclenode( var_0.target, "targetname" );
|
|
var_2 = path_detour_get_detourpath( var_1 );
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
return;
|
|
|
|
if ( var_0.detoured && !isdefined( var_2.script_vehicledetourgroup ) )
|
|
return;
|
|
|
|
if ( isdefined( var_2.script_crashtype ) )
|
|
{
|
|
if ( !crash_detour_check( var_2 ) )
|
|
return;
|
|
|
|
self notify( "crashpath", var_2 );
|
|
var_2.derailed = 1;
|
|
self notify( "newpath" );
|
|
_setswitchnode( var_0, var_2 );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if ( crash_derailed_check( var_2 ) )
|
|
return;
|
|
|
|
if ( isdefined( var_2.script_vehicledetourgroup ) )
|
|
{
|
|
if ( !isdefined( self.script_vehicledetourgroup ) )
|
|
return;
|
|
|
|
if ( var_2.script_vehicledetourgroup != self.script_vehicledetourgroup )
|
|
return;
|
|
}
|
|
|
|
self notify( "newpath" );
|
|
_setswitchnode( var_1, var_2 );
|
|
thread detour_flag( var_2 );
|
|
|
|
if ( !islastnode( var_1 ) && !( isdefined( var_0.scriptdetour_persist ) && var_0.scriptdetour_persist ) )
|
|
var_0.detoured = 1;
|
|
|
|
self.attachedpath = var_2;
|
|
thread _vehicle_paths();
|
|
|
|
if ( self vehicle_isphysveh() && isdefined( var_1.script_transmission ) )
|
|
thread reverse_node( var_1 );
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
reverse_node( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_0 waittillmatch( "trigger", self );
|
|
self.veh_transmission = var_0.script_transmission;
|
|
|
|
if ( self.veh_transmission == "forward" )
|
|
wheeldirectionchange( 1 );
|
|
else
|
|
wheeldirectionchange( 0 );
|
|
}
|
|
|
|
_setswitchnode( var_0, var_1 )
|
|
{
|
|
self setswitchnode( var_0, var_1 );
|
|
}
|
|
|
|
detour_flag( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self.detouringpath = var_0;
|
|
var_0 waittillmatch( "trigger", self );
|
|
self.detouringpath = undefined;
|
|
}
|
|
|
|
vehicle_levelstuff( var_0, var_1 )
|
|
{
|
|
if ( isdefined( var_0.script_linkname ) )
|
|
level.vehicle_link = array_2dadd( level.vehicle_link, var_0.script_linkname, var_0 );
|
|
|
|
if ( isdefined( var_0.script_vehiclestartmove ) )
|
|
level.vehicle_startmovegroup = array_2dadd( level.vehicle_startmovegroup, var_0.script_vehiclestartmove, var_0 );
|
|
|
|
if ( isdefined( var_0.script_vehiclegroupdelete ) )
|
|
level.vehicle_deletegroup = array_2dadd( level.vehicle_deletegroup, var_0.script_vehiclegroupdelete, var_0 );
|
|
}
|
|
|
|
spawn_array( var_0 )
|
|
{
|
|
var_1 = [];
|
|
var_2 = maps\_utility::ent_flag_exist( "no_riders_until_unload" );
|
|
|
|
foreach ( var_4 in var_0 )
|
|
{
|
|
var_4.count = 1;
|
|
var_5 = 0;
|
|
|
|
if ( isdefined( var_4.script_drone ) )
|
|
{
|
|
var_5 = 1;
|
|
var_6 = maps\_utility::dronespawn_bodyonly( var_4 );
|
|
var_6 maps\_drone_base::drone_give_soul();
|
|
}
|
|
else
|
|
{
|
|
var_7 = isdefined( var_4.script_stealth ) && common_scripts\utility::flag( "_stealth_enabled" ) && !common_scripts\utility::flag( "_stealth_spotted" );
|
|
var_8 = var_4;
|
|
|
|
if ( isdefined( var_4.script_spawn_pool ) )
|
|
var_8 = maps\_spawner::get_spawner_from_pool( var_4, 1 );
|
|
|
|
if ( isdefined( var_4.script_forcespawn ) || var_2 )
|
|
var_6 = var_8 stalingradspawn( var_7 );
|
|
else
|
|
var_6 = var_8 dospawn( var_7 );
|
|
|
|
if ( isdefined( var_4.script_spawn_pool ) )
|
|
{
|
|
if ( isdefined( var_4.script_startingposition ) )
|
|
var_6.script_startingposition = var_4.script_startingposition;
|
|
}
|
|
}
|
|
|
|
if ( !var_5 && !isalive( var_6 ) )
|
|
continue;
|
|
|
|
var_1[var_1.size] = var_6;
|
|
}
|
|
|
|
var_1 = remove_non_riders_from_array( var_1 );
|
|
return var_1;
|
|
}
|
|
|
|
remove_non_riders_from_array( var_0 )
|
|
{
|
|
var_1 = [];
|
|
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
if ( !ai_should_be_added( var_3 ) )
|
|
continue;
|
|
|
|
var_1[var_1.size] = var_3;
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
ai_should_be_added( var_0 )
|
|
{
|
|
if ( isalive( var_0 ) )
|
|
return 1;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return 0;
|
|
|
|
if ( !isdefined( var_0.classname ) )
|
|
return 0;
|
|
|
|
return var_0.classname == "script_model";
|
|
}
|
|
|
|
spawn_group()
|
|
{
|
|
if ( maps\_utility::ent_flag_exist( "no_riders_until_unload" ) && !maps\_utility::ent_flag( "no_riders_until_unload" ) )
|
|
return [];
|
|
|
|
var_0 = get_vehicle_ai_spawners();
|
|
|
|
if ( !var_0.size )
|
|
return [];
|
|
|
|
var_1 = [];
|
|
var_2 = spawn_array( var_0 );
|
|
var_2 = common_scripts\utility::array_combine( var_2, get_vehicle_ai_riders() );
|
|
var_2 = sort_by_startingpos( var_2 );
|
|
|
|
foreach ( var_4 in var_2 )
|
|
thread maps\_vehicle_aianim::guy_enter( var_4 );
|
|
|
|
return var_2;
|
|
}
|
|
|
|
spawn_unload_group( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
return spawn_group();
|
|
|
|
var_1 = get_vehicle_ai_spawners();
|
|
|
|
if ( !var_1.size )
|
|
return [];
|
|
|
|
var_2 = [];
|
|
var_3 = self.classname;
|
|
|
|
if ( isdefined( level.vehicle_unloadgroups[var_3] ) && isdefined( level.vehicle_unloadgroups[var_3][var_0] ) )
|
|
{
|
|
var_4 = level.vehicle_unloadgroups[var_3][var_0];
|
|
|
|
foreach ( var_6 in var_4 )
|
|
var_2[var_2.size] = var_1[var_6];
|
|
|
|
var_8 = spawn_array( var_2 );
|
|
|
|
for ( var_9 = 0; var_9 < var_4.size; var_9++ )
|
|
var_8[var_9].script_startingposition = var_4[var_9];
|
|
|
|
var_8 = common_scripts\utility::array_combine( var_8, get_vehicle_ai_riders() );
|
|
var_8 = sort_by_startingpos( var_8 );
|
|
|
|
foreach ( var_11 in var_8 )
|
|
thread maps\_vehicle_aianim::guy_enter( var_11 );
|
|
|
|
return var_8;
|
|
}
|
|
else
|
|
return spawn_group();
|
|
}
|
|
|
|
sort_by_startingpos( var_0 )
|
|
{
|
|
var_1 = [];
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in var_0 )
|
|
{
|
|
if ( isdefined( var_4.script_startingposition ) )
|
|
{
|
|
var_1[var_1.size] = var_4;
|
|
continue;
|
|
}
|
|
|
|
var_2[var_2.size] = var_4;
|
|
}
|
|
|
|
return common_scripts\utility::array_combine( var_1, var_2 );
|
|
}
|
|
|
|
setup_groundnode_detour( var_0 )
|
|
{
|
|
var_1 = getvehiclenode( var_0.targetname, "target" );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
return;
|
|
|
|
var_1.detoured = 0;
|
|
add_proccess_trigger( var_1 );
|
|
}
|
|
|
|
turn_unloading_drones_to_ai()
|
|
{
|
|
var_0 = maps\_vehicle_aianim::get_unload_group();
|
|
|
|
foreach ( var_3, var_2 in self.riders )
|
|
{
|
|
if ( !isalive( var_2 ) )
|
|
continue;
|
|
|
|
if ( isdefined( var_0[var_2.vehicle_position] ) )
|
|
self.riders[var_3] = maps\_vehicle_aianim::guy_becomes_real_ai( var_2, var_2.vehicle_position );
|
|
}
|
|
}
|
|
|
|
add_proccess_trigger( var_0 )
|
|
{
|
|
if ( isdefined( var_0.processed_trigger ) )
|
|
return;
|
|
|
|
level.vehicle_processtriggers[level.vehicle_processtriggers.size] = var_0;
|
|
var_0.processed_trigger = 1;
|
|
}
|
|
|
|
islastnode( var_0 )
|
|
{
|
|
if ( !isdefined( var_0.target ) )
|
|
return 1;
|
|
|
|
if ( !isdefined( getvehiclenode( var_0.target, "targetname" ) ) && !isdefined( get_vehiclenode_any_dynamic( var_0.target ) ) )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
get_path_getfunc( var_0 )
|
|
{
|
|
var_1 = ::get_from_vehicle_node;
|
|
|
|
if ( _ishelicopter() && isdefined( var_0.target ) )
|
|
{
|
|
if ( isdefined( get_from_entity( var_0.target ) ) )
|
|
var_1 = ::get_from_entity;
|
|
|
|
if ( isdefined( get_from_spawnstruct( var_0.target ) ) )
|
|
var_1 = ::get_from_spawnstruct;
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
node_wait( var_0, var_1, var_2 )
|
|
{
|
|
if ( isdefined( self.unique_id ) )
|
|
var_3 = "node_flag_triggered" + self.unique_id;
|
|
else
|
|
var_3 = "node_flag_triggered";
|
|
|
|
nodes_flag_triggered( var_3, var_0, var_2 );
|
|
|
|
if ( self.attachedpath == var_0 )
|
|
{
|
|
self notify( "node_wait_terminated" );
|
|
waittillframeend;
|
|
return;
|
|
}
|
|
|
|
var_0 maps\_utility::ent_flag_wait_vehicle_node( var_3 );
|
|
var_0 maps\_utility::ent_flag_clear( var_3, 1 );
|
|
var_0 notify( "processed_node" + var_3 );
|
|
}
|
|
|
|
nodes_flag_triggered( var_0, var_1, var_2 )
|
|
{
|
|
for ( var_3 = 0; isdefined( var_1 ) && var_3 < 3; var_1 = [[ var_2 ]]( var_1.target ) )
|
|
{
|
|
var_3++;
|
|
thread node_flag_triggered( var_0, var_1 );
|
|
|
|
if ( !isdefined( var_1.target ) )
|
|
return;
|
|
}
|
|
}
|
|
|
|
node_flag_triggered( var_0, var_1 )
|
|
{
|
|
if ( var_1 maps\_utility::ent_flag_exist( var_0 ) )
|
|
return;
|
|
|
|
var_1 maps\_utility::ent_flag_init( var_0 );
|
|
thread node_flag_triggered_cleanup( var_1, var_0 );
|
|
var_1 endon( "processed_node" + var_0 );
|
|
self endon( "death" );
|
|
self endon( "newpath" );
|
|
self endon( "node_wait_terminated" );
|
|
var_1 waittill( "trigger" );
|
|
var_1 maps\_utility::ent_flag_set( var_0 );
|
|
}
|
|
|
|
node_flag_triggered_cleanup( var_0, var_1 )
|
|
{
|
|
var_0 endon( "processed_node" + var_1 );
|
|
common_scripts\utility::waittill_any( "death", "newpath", "node_wait_terminated" );
|
|
var_0 maps\_utility::ent_flag_clear( var_1, 1 );
|
|
}
|
|
|
|
vehicle_paths_non_heli( var_0 )
|
|
{
|
|
self notify( "newpath" );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
self.attachedpath = var_0;
|
|
|
|
var_1 = self.attachedpath;
|
|
self.currentnode = self.attachedpath;
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
return;
|
|
|
|
self endon( "newpath" );
|
|
self endon( "death" );
|
|
var_2 = var_1;
|
|
var_3 = undefined;
|
|
var_4 = var_1;
|
|
var_5 = get_path_getfunc( var_1 );
|
|
|
|
while ( isdefined( var_4 ) )
|
|
{
|
|
node_wait( var_4, var_3, var_5 );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( isdefined( var_4.optimized_process_trigger ) )
|
|
level thread trigger_process_optimized( var_4, self );
|
|
|
|
self.currentnode = var_4;
|
|
|
|
if ( isdefined( var_4.gateopen ) && !var_4.gateopen )
|
|
thread path_gate_wait_till_open( var_4 );
|
|
|
|
if ( isdefined( var_4.script_noteworthy ) )
|
|
{
|
|
self notify( var_4.script_noteworthy );
|
|
self notify( "noteworthy", var_4.script_noteworthy );
|
|
}
|
|
|
|
waittillframeend;
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( isdefined( var_4.script_prefab_exploder ) )
|
|
{
|
|
var_4.script_exploder = var_4.script_prefab_exploder;
|
|
var_4.script_prefab_exploder = undefined;
|
|
}
|
|
|
|
if ( isdefined( var_4.script_exploder ) )
|
|
{
|
|
var_6 = var_4.script_exploder_delay;
|
|
|
|
if ( isdefined( var_6 ) )
|
|
level maps\_utility::delaythread( var_6, common_scripts\utility::exploder, var_4.script_exploder );
|
|
else
|
|
level common_scripts\utility::exploder( var_4.script_exploder );
|
|
}
|
|
|
|
if ( isdefined( var_4.script_flag_set ) )
|
|
common_scripts\utility::flag_set( var_4.script_flag_set );
|
|
|
|
if ( isdefined( var_4.script_ent_flag_set ) )
|
|
maps\_utility::ent_flag_set( var_4.script_ent_flag_set );
|
|
|
|
if ( isdefined( var_4.script_ent_flag_clear ) )
|
|
maps\_utility::ent_flag_clear( var_4.script_ent_flag_clear );
|
|
|
|
if ( isdefined( var_4.script_flag_clear ) )
|
|
common_scripts\utility::flag_clear( var_4.script_flag_clear );
|
|
|
|
if ( isdefined( var_4.script_noteworthy ) )
|
|
{
|
|
if ( var_4.script_noteworthy == "kill" )
|
|
_force_kill();
|
|
|
|
if ( var_4.script_noteworthy == "godon" )
|
|
self.godmode = 1;
|
|
|
|
if ( var_4.script_noteworthy == "godoff" )
|
|
self.godmode = 0;
|
|
|
|
if ( var_4.script_noteworthy == "deleteme" )
|
|
{
|
|
level thread maps\_utility::deleteent( self );
|
|
return;
|
|
}
|
|
|
|
if ( var_4.script_noteworthy == "engineoff" )
|
|
self vehicle_turnengineoff();
|
|
}
|
|
|
|
if ( isdefined( var_4.script_crashtypeoverride ) )
|
|
self.script_crashtypeoverride = var_4.script_crashtypeoverride;
|
|
|
|
if ( isdefined( var_4.script_badplace ) )
|
|
self.script_badplace = var_4.script_badplace;
|
|
|
|
if ( isdefined( var_4.script_turretmg ) )
|
|
{
|
|
if ( var_4.script_turretmg )
|
|
_mgon();
|
|
else
|
|
_mgoff();
|
|
}
|
|
|
|
if ( isdefined( var_4.script_team ) )
|
|
self.script_team = var_4.script_team;
|
|
|
|
if ( isdefined( var_4.script_turningdir ) )
|
|
self notify( "turning", var_4.script_turningdir );
|
|
|
|
if ( isdefined( var_4.script_deathroll ) )
|
|
{
|
|
if ( var_4.script_deathroll == 0 )
|
|
thread deathrolloff();
|
|
else
|
|
thread deathrollon();
|
|
}
|
|
|
|
if ( isdefined( var_4.script_vehicleaianim ) )
|
|
{
|
|
if ( isdefined( var_4.script_parameters ) && var_4.script_parameters == "queue" )
|
|
self.queueanim = 1;
|
|
}
|
|
|
|
if ( isdefined( var_4.script_wheeldirection ) )
|
|
wheeldirectionchange( var_4.script_wheeldirection );
|
|
|
|
if ( vehicle_should_unload( ::node_wait, var_4 ) )
|
|
thread unload_node( var_4 );
|
|
|
|
if ( isdefined( var_4.script_transmission ) )
|
|
{
|
|
self.veh_transmission = var_4.script_transmission;
|
|
|
|
if ( self.veh_transmission == "forward" )
|
|
wheeldirectionchange( 1 );
|
|
else
|
|
wheeldirectionchange( 0 );
|
|
}
|
|
|
|
if ( isdefined( var_4.script_brake ) )
|
|
self.veh_brake = var_4.script_brake;
|
|
|
|
if ( isdefined( var_4.script_pathtype ) )
|
|
self.veh_pathtype = var_4.script_pathtype;
|
|
|
|
if ( isdefined( var_4.script_ent_flag_wait ) )
|
|
{
|
|
var_7 = 35;
|
|
|
|
if ( isdefined( var_4.script_decel ) )
|
|
var_7 = var_4.script_decel;
|
|
|
|
self vehicle_setspeed( 0, var_7 );
|
|
maps\_utility::ent_flag_wait( var_4.script_ent_flag_wait );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
var_8 = 60;
|
|
|
|
if ( isdefined( var_4.script_accel ) )
|
|
var_8 = var_4.script_accel;
|
|
|
|
self resumespeed( var_8 );
|
|
}
|
|
|
|
if ( isdefined( var_4.script_delay ) )
|
|
{
|
|
var_7 = 35;
|
|
|
|
if ( isdefined( var_4.script_decel ) )
|
|
var_7 = var_4.script_decel;
|
|
|
|
self vehicle_setspeed( 0, var_7 );
|
|
|
|
if ( isdefined( var_4.target ) )
|
|
thread overshoot_next_node( [[ var_5 ]]( var_4.target ) );
|
|
|
|
var_4 maps\_utility::script_delay();
|
|
self notify( "delay_passed" );
|
|
var_8 = 60;
|
|
|
|
if ( isdefined( var_4.script_accel ) )
|
|
var_8 = var_4.script_accel;
|
|
|
|
self resumespeed( var_8 );
|
|
}
|
|
|
|
if ( isdefined( var_4.script_flag_wait ) )
|
|
{
|
|
var_9 = 0;
|
|
|
|
if ( !common_scripts\utility::flag( var_4.script_flag_wait ) || isdefined( var_4.script_delay_post ) )
|
|
{
|
|
var_9 = 1;
|
|
var_8 = 5;
|
|
var_7 = 35;
|
|
|
|
if ( isdefined( var_4.script_accel ) )
|
|
var_8 = var_4.script_accel;
|
|
|
|
if ( isdefined( var_4.script_decel ) )
|
|
var_7 = var_4.script_decel;
|
|
|
|
_vehicle_stop_named( "script_flag_wait_" + var_4.script_flag_wait, var_8, var_7 );
|
|
thread overshoot_next_node( [[ var_5 ]]( var_4.target ) );
|
|
}
|
|
|
|
common_scripts\utility::flag_wait( var_4.script_flag_wait );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( isdefined( var_4.script_delay_post ) )
|
|
{
|
|
wait( var_4.script_delay_post );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
}
|
|
|
|
var_8 = 10;
|
|
|
|
if ( isdefined( var_4.script_accel ) )
|
|
var_8 = var_4.script_accel;
|
|
|
|
if ( var_9 )
|
|
_vehicle_resume_named( "script_flag_wait_" + var_4.script_flag_wait );
|
|
|
|
self notify( "delay_passed" );
|
|
}
|
|
|
|
if ( isdefined( self.set_lookat_point ) )
|
|
{
|
|
self.set_lookat_point = undefined;
|
|
self clearlookatent();
|
|
}
|
|
|
|
if ( isdefined( var_4.script_vehicle_lights_off ) )
|
|
thread lights_off( var_4.script_vehicle_lights_off );
|
|
|
|
if ( isdefined( var_4.script_vehicle_lights_on ) )
|
|
thread lights_on( var_4.script_vehicle_lights_on );
|
|
|
|
if ( isdefined( var_4.script_forcecolor ) )
|
|
thread vehicle_script_forcecolor_riders( var_4.script_forcecolor );
|
|
|
|
var_3 = var_4;
|
|
|
|
if ( !isdefined( var_4.target ) )
|
|
break;
|
|
|
|
var_4 = [[ var_5 ]]( var_4.target );
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
{
|
|
var_4 = var_3;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( isdefined( var_4.script_land ) )
|
|
thread _vehicle_landvehicle();
|
|
|
|
self notify( "reached_dynamic_path_end" );
|
|
|
|
if ( isdefined( self.script_vehicle_selfremove ) )
|
|
{
|
|
self notify( "delete" );
|
|
self delete();
|
|
}
|
|
}
|
|
|
|
vehicle_paths_helicopter( var_0, var_1, var_2 )
|
|
{
|
|
self notify( "newpath" );
|
|
self endon( "newpath" );
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 0;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
self.attachedpath = var_0;
|
|
|
|
var_3 = self.attachedpath;
|
|
self.currentnode = self.attachedpath;
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
return;
|
|
|
|
var_4 = var_3;
|
|
|
|
if ( var_1 )
|
|
self waittill( "start_dynamicpath" );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
{
|
|
var_5 = spawnstruct();
|
|
var_5.origin = maps\_utility::add_z( self.origin, var_2 );
|
|
heli_wait_node( var_5, undefined );
|
|
}
|
|
|
|
var_6 = undefined;
|
|
var_7 = var_3;
|
|
var_8 = get_path_getfunc( var_3 );
|
|
|
|
while ( isdefined( var_7 ) )
|
|
{
|
|
if ( isdefined( var_7.script_linkto ) )
|
|
set_lookat_from_dest( var_7 );
|
|
|
|
heli_wait_node( var_7, var_6, var_2 );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self.currentnode = var_7;
|
|
|
|
if ( isdefined( var_7.gateopen ) && !var_7.gateopen )
|
|
thread path_gate_wait_till_open( var_7 );
|
|
|
|
var_7 notify( "trigger", self );
|
|
|
|
if ( isdefined( var_7.script_helimove ) )
|
|
{
|
|
self setyawspeedbyname( var_7.script_helimove );
|
|
|
|
if ( var_7.script_helimove == "faster" )
|
|
self setmaxpitchroll( 25, 50 );
|
|
}
|
|
|
|
if ( isdefined( var_7.script_noteworthy ) )
|
|
{
|
|
self notify( var_7.script_noteworthy );
|
|
self notify( "noteworthy", var_7.script_noteworthy );
|
|
}
|
|
|
|
waittillframeend;
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( isdefined( var_7.script_prefab_exploder ) )
|
|
{
|
|
var_7.script_exploder = var_7.script_prefab_exploder;
|
|
var_7.script_prefab_exploder = undefined;
|
|
}
|
|
|
|
if ( isdefined( var_7.script_exploder ) )
|
|
{
|
|
var_9 = var_7.script_exploder_delay;
|
|
|
|
if ( isdefined( var_9 ) )
|
|
level maps\_utility::delaythread( var_9, common_scripts\utility::exploder, var_7.script_exploder );
|
|
else
|
|
level common_scripts\utility::exploder( var_7.script_exploder );
|
|
}
|
|
|
|
if ( isdefined( var_7.script_flag_set ) )
|
|
common_scripts\utility::flag_set( var_7.script_flag_set );
|
|
|
|
if ( isdefined( var_7.script_ent_flag_set ) )
|
|
maps\_utility::ent_flag_set( var_7.script_ent_flag_set );
|
|
|
|
if ( isdefined( var_7.script_ent_flag_clear ) )
|
|
maps\_utility::ent_flag_clear( var_7.script_ent_flag_clear );
|
|
|
|
if ( isdefined( var_7.script_flag_clear ) )
|
|
common_scripts\utility::flag_clear( var_7.script_flag_clear );
|
|
|
|
if ( isdefined( var_7.script_noteworthy ) )
|
|
{
|
|
if ( var_7.script_noteworthy == "kill" )
|
|
_force_kill();
|
|
|
|
if ( var_7.script_noteworthy == "godon" )
|
|
self.godmode = 1;
|
|
|
|
if ( var_7.script_noteworthy == "godoff" )
|
|
self.godmode = 0;
|
|
|
|
if ( var_7.script_noteworthy == "deleteme" )
|
|
{
|
|
level thread maps\_utility::deleteent( self );
|
|
return;
|
|
}
|
|
|
|
if ( var_7.script_noteworthy == "engineoff" )
|
|
self vehicle_turnengineoff();
|
|
}
|
|
|
|
if ( isdefined( var_7.script_crashtypeoverride ) )
|
|
self.script_crashtypeoverride = var_7.script_crashtypeoverride;
|
|
|
|
if ( isdefined( var_7.script_badplace ) )
|
|
self.script_badplace = var_7.script_badplace;
|
|
|
|
if ( isdefined( var_7.script_turretmg ) )
|
|
{
|
|
if ( var_7.script_turretmg )
|
|
_mgon();
|
|
else
|
|
_mgoff();
|
|
}
|
|
|
|
if ( isdefined( var_7.script_team ) )
|
|
self.script_team = var_7.script_team;
|
|
|
|
if ( isdefined( var_7.script_turningdir ) )
|
|
self notify( "turning", var_7.script_turningdir );
|
|
|
|
if ( isdefined( var_7.script_deathroll ) )
|
|
{
|
|
if ( var_7.script_deathroll == 0 )
|
|
thread deathrolloff();
|
|
else
|
|
thread deathrollon();
|
|
}
|
|
|
|
if ( isdefined( var_7.script_vehicleaianim ) )
|
|
{
|
|
if ( isdefined( var_7.script_parameters ) && var_7.script_parameters == "queue" )
|
|
self.queueanim = 1;
|
|
}
|
|
|
|
if ( isdefined( var_7.script_wheeldirection ) )
|
|
wheeldirectionchange( var_7.script_wheeldirection );
|
|
|
|
if ( vehicle_should_unload( ::heli_wait_node, var_7 ) )
|
|
thread unload_node( var_7 );
|
|
|
|
if ( self vehicle_isphysveh() )
|
|
{
|
|
if ( isdefined( var_7.script_transmission ) )
|
|
{
|
|
self.veh_transmission = var_7.script_transmission;
|
|
|
|
if ( self.veh_transmission == "forward" )
|
|
wheeldirectionchange( 1 );
|
|
else
|
|
wheeldirectionchange( 0 );
|
|
}
|
|
|
|
if ( isdefined( var_7.script_pathtype ) )
|
|
self.veh_pathtype = var_7.script_pathtype;
|
|
}
|
|
|
|
if ( isdefined( var_7.script_flag_wait ) )
|
|
{
|
|
common_scripts\utility::flag_wait( var_7.script_flag_wait );
|
|
|
|
if ( isdefined( var_7.script_delay_post ) )
|
|
wait( var_7.script_delay_post );
|
|
|
|
self notify( "delay_passed" );
|
|
}
|
|
|
|
if ( isdefined( self.set_lookat_point ) )
|
|
{
|
|
self.set_lookat_point = undefined;
|
|
self clearlookatent();
|
|
}
|
|
|
|
if ( isdefined( var_7.script_vehicle_lights_off ) )
|
|
thread lights_off( var_7.script_vehicle_lights_off );
|
|
|
|
if ( isdefined( var_7.script_vehicle_lights_on ) )
|
|
thread lights_on( var_7.script_vehicle_lights_on );
|
|
|
|
if ( isdefined( var_7.script_forcecolor ) )
|
|
thread vehicle_script_forcecolor_riders( var_7.script_forcecolor );
|
|
|
|
var_6 = var_7;
|
|
|
|
if ( !isdefined( var_7.target ) )
|
|
break;
|
|
|
|
var_7 = [[ var_8 ]]( var_7.target );
|
|
|
|
if ( !isdefined( var_7 ) )
|
|
{
|
|
var_7 = var_6;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( isdefined( var_7.script_land ) )
|
|
thread _vehicle_landvehicle();
|
|
|
|
self notify( "reached_dynamic_path_end" );
|
|
|
|
if ( isdefined( self.script_vehicle_selfremove ) )
|
|
self delete();
|
|
}
|
|
|
|
vehicle_should_unload( var_0, var_1 )
|
|
{
|
|
if ( isdefined( var_1.script_unload ) )
|
|
return 1;
|
|
|
|
if ( var_0 != ::node_wait )
|
|
return 0;
|
|
|
|
if ( !islastnode( var_1 ) )
|
|
return 0;
|
|
|
|
if ( isdefined( self.dontunloadonend ) )
|
|
return 0;
|
|
|
|
if ( self.vehicletype == "empty" )
|
|
return 0;
|
|
|
|
return !is_script_vehicle_selfremove();
|
|
}
|
|
|
|
overshoot_next_node( var_0 )
|
|
{
|
|
|
|
}
|
|
|
|
is_script_vehicle_selfremove()
|
|
{
|
|
if ( !isdefined( self.script_vehicle_selfremove ) )
|
|
return 0;
|
|
|
|
return self.script_vehicle_selfremove;
|
|
}
|
|
|
|
heli_wait_node( var_0, var_1, var_2 )
|
|
{
|
|
self endon( "newpath" );
|
|
|
|
if ( isdefined( var_0.script_unload ) && isdefined( self.fastropeoffset ) )
|
|
{
|
|
var_0.radius = 2;
|
|
|
|
if ( isdefined( var_0.ground_pos ) )
|
|
var_0.origin = var_0.ground_pos + ( 0, 0, self.fastropeoffset );
|
|
else
|
|
{
|
|
var_3 = maps\_utility::groundpos( var_0.origin ) + ( 0, 0, self.fastropeoffset );
|
|
|
|
if ( var_3[2] > var_0.origin[2] - 2000 )
|
|
var_0.origin = maps\_utility::groundpos( var_0.origin ) + ( 0, 0, self.fastropeoffset );
|
|
}
|
|
|
|
self sethoverparams( 0, 0, 0 );
|
|
}
|
|
|
|
if ( isdefined( var_0.script_unload ) && isdefined( self.parachute_unload ) )
|
|
{
|
|
var_0.radius = 100;
|
|
|
|
if ( isdefined( var_0.ground_pos ) )
|
|
var_0.origin = var_0.ground_pos + ( 0, 0, self.dropoff_height );
|
|
else
|
|
var_0.origin = maps\_utility::groundpos( var_0.origin ) + ( 0, 0, self.dropoff_height );
|
|
}
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_4 = var_1.script_airresistance;
|
|
var_5 = var_1.speed;
|
|
var_6 = var_1.script_accel;
|
|
var_7 = var_1.script_decel;
|
|
}
|
|
else
|
|
{
|
|
var_4 = undefined;
|
|
var_5 = undefined;
|
|
var_6 = undefined;
|
|
var_7 = undefined;
|
|
}
|
|
|
|
var_8 = isdefined( var_0.script_stopnode ) && var_0.script_stopnode;
|
|
var_9 = isdefined( var_0.script_unload );
|
|
var_10 = isdefined( var_0.script_flag_wait ) && !common_scripts\utility::flag( var_0.script_flag_wait );
|
|
var_11 = !isdefined( var_0.target );
|
|
var_12 = isdefined( var_0.script_delay );
|
|
|
|
if ( isdefined( var_0.angles ) )
|
|
var_13 = var_0.angles[1];
|
|
else
|
|
var_13 = 0;
|
|
|
|
if ( self.health <= 0 )
|
|
return;
|
|
|
|
var_14 = var_0.origin;
|
|
|
|
if ( isdefined( var_2 ) )
|
|
var_14 = maps\_utility::add_z( var_14, var_2 );
|
|
|
|
if ( isdefined( self.heliheightoverride ) )
|
|
var_14 = ( var_14[0], var_14[1], self.heliheightoverride );
|
|
|
|
self vehicle_helisetai( var_14, var_5, var_6, var_7, var_0.script_goalyaw, var_0.script_anglevehicle, var_13, var_4, var_12, var_8, var_9, var_10, var_11 );
|
|
|
|
if ( isdefined( var_0.radius ) )
|
|
{
|
|
self setneargoalnotifydist( var_0.radius );
|
|
common_scripts\utility::waittill_any( "near_goal", "goal" );
|
|
}
|
|
else
|
|
self waittill( "goal" );
|
|
|
|
if ( isdefined( self.optimized_process_trigger ) )
|
|
level thread trigger_process_optimized( var_0, self );
|
|
|
|
if ( isdefined( var_0.script_firelink ) )
|
|
{
|
|
if ( !isdefined( level.helicopter_firelinkfunk ) )
|
|
{
|
|
|
|
}
|
|
|
|
thread [[ level.helicopter_firelinkfunk ]]( var_0 );
|
|
}
|
|
|
|
var_0 maps\_utility::script_delay();
|
|
|
|
if ( isdefined( self.path_gobbler ) )
|
|
maps\_utility::deletestruct_ref( var_0 );
|
|
}
|
|
|
|
path_gate_open( var_0 )
|
|
{
|
|
var_0.gateopen = 1;
|
|
var_0 notify( "gate opened" );
|
|
}
|
|
|
|
path_gate_wait_till_open( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self.waitingforgate = 1;
|
|
_vehicle_stop_named( "path_gate_wait_till_open", 5, 15 );
|
|
var_0 waittill( "gate opened" );
|
|
self.waitingforgate = 0;
|
|
|
|
if ( self.health > 0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( isdefined( self.waitingforgate ) && self.waitingforgate )
|
|
return;
|
|
|
|
_vehicle_resume_named( "path_gate_wait_till_open" );
|
|
}
|
|
}
|
|
|
|
remove_vehicle_spawned_thisframe()
|
|
{
|
|
wait 0.05;
|
|
self.vehicle_spawned_thisframe = undefined;
|
|
}
|
|
|
|
vehicle_init( var_0 )
|
|
{
|
|
var_1 = var_0.classname;
|
|
|
|
if ( isdefined( level.vehicle_hide_list[var_1] ) )
|
|
{
|
|
foreach ( var_3 in level.vehicle_hide_list[var_1] )
|
|
var_0 hidepart( var_3 );
|
|
}
|
|
|
|
if ( var_0.vehicletype == "empty" )
|
|
{
|
|
var_0 thread getonpath();
|
|
return;
|
|
}
|
|
|
|
var_0 maps\_utility::set_ai_number();
|
|
|
|
if ( !isdefined( var_0.modeldummyon ) )
|
|
var_0.modeldummyon = 0;
|
|
|
|
var_5 = var_0.vehicletype;
|
|
var_0 vehicle_life();
|
|
var_0 vehicle_setteam();
|
|
|
|
if ( !isdefined( level.vehicleinitthread[var_0.vehicletype][var_0.classname] ) )
|
|
{
|
|
|
|
}
|
|
|
|
var_0 thread [[ level.vehicleinitthread[var_0.vehicletype][var_0.classname] ]]();
|
|
var_0 thread maingun_fx();
|
|
var_0 thread playtankexhaust();
|
|
|
|
if ( !isdefined( var_0.script_avoidplayer ) )
|
|
var_0.script_avoidplayer = 0;
|
|
|
|
if ( isdefined( level.vehicle_draw_thermal ) )
|
|
{
|
|
if ( level.vehicle_draw_thermal )
|
|
var_0 thermaldrawenable();
|
|
}
|
|
|
|
var_0 maps\_utility::ent_flag_init( "unloaded" );
|
|
var_0 maps\_utility::ent_flag_init( "loaded" );
|
|
var_0.riders = [];
|
|
var_0.unloadque = [];
|
|
var_0.unload_group = "default";
|
|
var_0.fastroperig = [];
|
|
|
|
if ( isdefined( level.vehicle_attachedmodels ) && isdefined( level.vehicle_attachedmodels[var_1] ) )
|
|
{
|
|
var_6 = level.vehicle_attachedmodels[var_1];
|
|
var_7 = getarraykeys( var_6 );
|
|
|
|
foreach ( var_9 in var_7 )
|
|
{
|
|
var_0.fastroperig[var_9] = undefined;
|
|
var_0.fastroperiganimating[var_9] = 0;
|
|
}
|
|
}
|
|
|
|
var_0 thread vehicle_badplace();
|
|
|
|
if ( isdefined( var_0.script_vehicle_lights_on ) )
|
|
var_0 thread lights_on( var_0.script_vehicle_lights_on );
|
|
|
|
if ( isdefined( var_0.script_godmode ) )
|
|
var_0.godmode = 1;
|
|
|
|
var_0.damage_functions = [];
|
|
|
|
if ( !var_0 ischeap() || var_0 ischeapshieldenabled() )
|
|
var_0 thread friendlyfire_shield();
|
|
|
|
var_0 thread maps\_vehicle_aianim::handle_attached_guys();
|
|
|
|
if ( isdefined( var_0.script_friendname ) )
|
|
var_0 setvehiclelookattext( var_0.script_friendname, &"" );
|
|
|
|
if ( !var_0 ischeap() )
|
|
var_0 thread vehicle_handleunloadevent();
|
|
|
|
if ( isdefined( var_0.script_dontunloadonend ) )
|
|
var_0.dontunloadonend = 1;
|
|
|
|
if ( !var_0 ischeap() )
|
|
var_0 thread vehicle_shoot_shock();
|
|
|
|
var_0 thread vehicle_rumble();
|
|
|
|
if ( isdefined( var_0.script_physicsjolt ) && var_0.script_physicsjolt )
|
|
var_0 thread maps\_utility::physicsjolt_proximity();
|
|
|
|
var_0 thread vehicle_treads();
|
|
var_0 thread idle_animations();
|
|
var_0 thread animate_drive_idle();
|
|
|
|
if ( isdefined( var_0.script_deathflag ) )
|
|
var_0 thread maps\_spawner::vehicle_deathflag();
|
|
|
|
if ( !var_0 ischeap() )
|
|
var_0 thread mginit();
|
|
|
|
if ( isdefined( level.vehiclespawncallbackthread ) )
|
|
level thread [[ level.vehiclespawncallbackthread ]]( var_0 );
|
|
|
|
vehicle_levelstuff( var_0 );
|
|
|
|
if ( isdefined( var_0.script_team ) )
|
|
var_0 setvehicleteam( var_0.script_team );
|
|
|
|
if ( !var_0 ischeap() )
|
|
var_0 thread disconnect_paths_whenstopped();
|
|
|
|
var_0 thread getonpath();
|
|
|
|
if ( isdefined( level.ignorewash ) )
|
|
var_11 = level.ignorewash;
|
|
else
|
|
var_11 = 0;
|
|
|
|
if ( var_0 hashelicopterdustkickup() && !var_11 )
|
|
var_0 thread aircraft_wash_thread();
|
|
|
|
if ( var_0 vehicle_isphysveh() )
|
|
{
|
|
if ( isdefined( var_0.script_pathtype ) )
|
|
var_0.veh_pathtype = var_0.script_pathtype;
|
|
}
|
|
|
|
var_0 spawn_group();
|
|
var_0 thread vehicle_kill();
|
|
var_0 apply_truckjunk();
|
|
}
|
|
|
|
ischeapshieldenabled()
|
|
{
|
|
return isdefined( level.cheap_vehicles_have_shields ) && level.cheap_vehicles_have_shields;
|
|
}
|
|
|
|
kill_damage( var_0 )
|
|
{
|
|
if ( !isdefined( level.vehicle_death_radiusdamage ) || !isdefined( level.vehicle_death_radiusdamage[var_0] ) )
|
|
return;
|
|
|
|
if ( isdefined( self.deathdamage_max ) )
|
|
var_1 = self.deathdamage_max;
|
|
else
|
|
var_1 = level.vehicle_death_radiusdamage[var_0].maxdamage;
|
|
|
|
if ( isdefined( self.deathdamage_min ) )
|
|
var_2 = self.deathdamage_min;
|
|
else
|
|
var_2 = level.vehicle_death_radiusdamage[var_0].mindamage;
|
|
|
|
if ( isdefined( level.vehicle_death_radiusdamage[var_0].delay ) )
|
|
wait( level.vehicle_death_radiusdamage[var_0].delay );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( level.vehicle_death_radiusdamage[var_0].bkillplayer )
|
|
level.player enablehealthshield( 0 );
|
|
|
|
self radiusdamage( self.origin + level.vehicle_death_radiusdamage[var_0].offset, level.vehicle_death_radiusdamage[var_0].range, var_1, var_2, self );
|
|
|
|
if ( level.vehicle_death_radiusdamage[var_0].bkillplayer )
|
|
level.player enablehealthshield( 1 );
|
|
}
|
|
|
|
vehicle_kill()
|
|
{
|
|
self endon( "nodeath_thread" );
|
|
var_0 = self.vehicletype;
|
|
var_1 = self.classname;
|
|
var_2 = self.model;
|
|
var_3 = self.targetname;
|
|
var_4 = undefined;
|
|
var_5 = undefined;
|
|
var_6 = undefined;
|
|
var_7 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
if ( isdefined( self ) )
|
|
self waittill( "death", var_4, var_5, var_6 );
|
|
|
|
if ( isdefined( self.custom_death_script ) )
|
|
self thread [[ self.custom_death_script ]]();
|
|
|
|
if ( !var_7 )
|
|
{
|
|
var_7 = 1;
|
|
|
|
if ( isdefined( var_4 ) && isdefined( var_5 ) )
|
|
{
|
|
var_4 maps\_player_stats::register_kill( self, var_5, var_6 );
|
|
|
|
if ( isdefined( self.damage_type ) )
|
|
self.damage_type = undefined;
|
|
}
|
|
|
|
if ( maps\_utility::is_specialop() && !maps\_utility::is_survival() && isdefined( var_4 ) && isplayer( var_4 ) )
|
|
{
|
|
if ( var_4.team != self.script_team )
|
|
var_4 thread maps\_utility::givexp( "kill", 500 );
|
|
|
|
if ( isdefined( self.riders ) )
|
|
{
|
|
foreach ( var_9 in self.riders )
|
|
{
|
|
if ( isalive( var_9 ) && isai( var_9 ) )
|
|
var_4 thread maps\_utility::givexp( "kill" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
self notify( "clear_c4" );
|
|
|
|
if ( isdefined( self.rumbletrigger ) )
|
|
self.rumbletrigger delete();
|
|
|
|
if ( isdefined( self.mgturret ) )
|
|
{
|
|
common_scripts\utility::array_levelthread( self.mgturret, ::turret_deleteme );
|
|
self.mgturret = undefined;
|
|
}
|
|
|
|
if ( isdefined( self.script_team ) )
|
|
level.vehicles[self.script_team] = common_scripts\utility::array_remove( level.vehicles[self.script_team], self );
|
|
|
|
if ( isdefined( self.script_linkname ) )
|
|
level.vehicle_link[self.script_linkname] = common_scripts\utility::array_remove( level.vehicle_link[self.script_linkname], self );
|
|
|
|
if ( isdefined( self.script_vehiclestartmove ) )
|
|
level.vehicle_startmovegroup[self.script_vehiclestartmove] = common_scripts\utility::array_remove( level.vehicle_startmovegroup[self.script_vehiclestartmove], self );
|
|
|
|
if ( isdefined( self.script_vehiclegroupdelete ) )
|
|
level.vehicle_deletegroup[self.script_vehiclegroupdelete] = common_scripts\utility::array_remove( level.vehicle_deletegroup[self.script_vehiclegroupdelete], self );
|
|
|
|
if ( !isdefined( self ) || is_corpse() )
|
|
{
|
|
if ( isdefined( self.riders ) )
|
|
{
|
|
foreach ( var_9 in self.riders )
|
|
{
|
|
if ( isdefined( var_9 ) )
|
|
var_9 delete();
|
|
}
|
|
}
|
|
|
|
if ( is_corpse() )
|
|
{
|
|
self.riders = [];
|
|
continue;
|
|
}
|
|
|
|
self notify( "delete_destructible" );
|
|
return;
|
|
}
|
|
|
|
var_13 = undefined;
|
|
|
|
if ( isdefined( self.vehicle_rumble_unique ) )
|
|
var_13 = self.vehicle_rumble_unique;
|
|
else if ( isdefined( level.vehicle_rumble_override ) && isdefined( level.vehicle_rumble_override[var_1] ) )
|
|
var_13 = level.vehicle_rumble_override;
|
|
else if ( isdefined( level.vehicle_rumble[var_1] ) )
|
|
var_13 = level.vehicle_rumble[var_1];
|
|
|
|
if ( isdefined( var_13 ) )
|
|
self stoprumble( var_13.rumble );
|
|
|
|
if ( isdefined( level.vehicle_death_thread[var_0] ) )
|
|
thread [[ level.vehicle_death_thread[var_0] ]]();
|
|
|
|
common_scripts\utility::array_levelthread( self.riders, maps\_vehicle_aianim::guy_vehicle_death, var_4, var_0 );
|
|
thread kill_damage( var_1 );
|
|
thread kill_badplace( var_1 );
|
|
thread kill_lights( var_1 );
|
|
maps\_vehicle_aianim::delete_corpses_around_vehicle();
|
|
|
|
if ( isdefined( level.vehicle_deathmodel[var_1] ) )
|
|
thread set_death_model( level.vehicle_deathmodel[var_1], level.vehicle_deathmodel_delay[var_1] );
|
|
else if ( isdefined( level.vehicle_deathmodel[var_2] ) )
|
|
thread set_death_model( level.vehicle_deathmodel[var_2], level.vehicle_deathmodel_delay[var_2] );
|
|
|
|
var_14 = vehicle_should_do_rocket_death( var_2, var_4, var_5 );
|
|
var_15 = self.origin;
|
|
thread kill_death_anim_thread( var_1 );
|
|
thread _kill_fx( var_2, var_14 );
|
|
|
|
if ( self.code_classname == "script_vehicle" )
|
|
thread kill_jolt( var_1 );
|
|
|
|
if ( isdefined( self.delete_on_death ) )
|
|
{
|
|
wait 0.05;
|
|
|
|
if ( !isdefined( self.dontdisconnectpaths ) && !self vehicle_isphysveh() )
|
|
self disconnectpaths();
|
|
|
|
_freevehicle();
|
|
wait 0.05;
|
|
vehicle_finish_death( var_2 );
|
|
self delete();
|
|
continue;
|
|
}
|
|
|
|
if ( isdefined( self.free_on_death ) )
|
|
{
|
|
self notify( "newpath" );
|
|
|
|
if ( !isdefined( self.dontdisconnectpaths ) )
|
|
self disconnectpaths();
|
|
|
|
vehicle_kill_badplace_forever();
|
|
_freevehicle();
|
|
return;
|
|
}
|
|
|
|
vehicle_do_crash( var_2, var_4, var_5, var_14 );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( !var_14 )
|
|
var_15 = self.origin;
|
|
|
|
if ( isdefined( level.vehicle_death_earthquake[var_1] ) )
|
|
earthquake( level.vehicle_death_earthquake[var_1].scale, level.vehicle_death_earthquake[var_1].duration, var_15, level.vehicle_death_earthquake[var_1].radius );
|
|
|
|
wait 0.5;
|
|
|
|
if ( is_corpse() )
|
|
continue;
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
while ( isdefined( self.dontfreeme ) && isdefined( self ) )
|
|
wait 0.05;
|
|
|
|
if ( !isdefined( self ) )
|
|
continue;
|
|
|
|
if ( self vehicle_isphysveh() )
|
|
{
|
|
while ( isdefined( self ) && self.veh_speed != 0 )
|
|
wait 1;
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self disconnectpaths();
|
|
self notify( "kill_badplace_forever" );
|
|
self kill();
|
|
self notify( "newpath" );
|
|
self vehicle_turnengineoff();
|
|
return;
|
|
}
|
|
else
|
|
_freevehicle();
|
|
|
|
if ( self.modeldummyon )
|
|
self hide();
|
|
}
|
|
|
|
if ( _vehicle_is_crashing() )
|
|
{
|
|
self delete();
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
|
|
_freevehicle()
|
|
{
|
|
self freevehicle();
|
|
maps\_utility::delaythread( 0.05, ::extra_vehicle_cleanup );
|
|
}
|
|
|
|
extra_vehicle_cleanup()
|
|
{
|
|
self notify( "newpath" );
|
|
self.accuracy = undefined;
|
|
self.attachedguys = undefined;
|
|
self.attackback = undefined;
|
|
self.badshot = undefined;
|
|
self.badshotcount = undefined;
|
|
self.currenthealth = undefined;
|
|
self.currentnode = undefined;
|
|
self.damage_functions = undefined;
|
|
self.delayer = undefined;
|
|
self.fastroperig = undefined;
|
|
self.getinorgs = undefined;
|
|
self.hasstarted = undefined;
|
|
self.healthbuffer = undefined;
|
|
self.offsetone = undefined;
|
|
self.offsetrange = undefined;
|
|
self.rocket_destroyed_for_achievement = undefined;
|
|
self.rumble_basetime = undefined;
|
|
self.rumble_duration = undefined;
|
|
self.rumble_radius = undefined;
|
|
self.script_attackai = undefined;
|
|
self.script_avoidplayer = undefined;
|
|
self.script_attackai = undefined;
|
|
self.script_avoidplayer = undefined;
|
|
self.script_bulletshield = undefined;
|
|
self.script_disconnectpaths = undefined;
|
|
self.script_linkname = undefined;
|
|
self.script_mp_style_helicopter = undefined;
|
|
self.script_team = undefined;
|
|
self.script_turret = undefined;
|
|
self.script_turretmg = undefined;
|
|
self.script_vehicleride = undefined;
|
|
self.script_vehiclespawngroup = undefined;
|
|
self.script_vehiclestartmove = undefined;
|
|
self.shotcount = undefined;
|
|
self.shotsatzerospeed = undefined;
|
|
self.spawn_funcs = undefined;
|
|
self.spawn_functions = undefined;
|
|
self.tank_queue = undefined;
|
|
self.target = undefined;
|
|
self.target_min_range = undefined;
|
|
self.troop_cache = undefined;
|
|
self.troop_cache = undefined;
|
|
self.troop_cache_update_next = undefined;
|
|
self.turret_damage_max = undefined;
|
|
self.turret_damage_min = undefined;
|
|
self.turret_damage_range = undefined;
|
|
self.badplacemodifier = undefined;
|
|
self.attachedpath = undefined;
|
|
self.badplacemodifier = undefined;
|
|
self.rumble_randomaditionaltime = undefined;
|
|
self.rumble_scale = undefined;
|
|
self.rumbleon = undefined;
|
|
self.rumbletrigger = undefined;
|
|
self.runningtovehicle = undefined;
|
|
self.script_nomg = undefined;
|
|
self.script_startinghealth = undefined;
|
|
self.teleported_to_path_section = undefined;
|
|
self.turret_damage_range = undefined;
|
|
self.turretaccmaxs = undefined;
|
|
self.turretaccmins = undefined;
|
|
self.turretfiretimer = undefined;
|
|
self.turretonvistarg = undefined;
|
|
self.turretonvistarg_failed = undefined;
|
|
self.unique_id = undefined;
|
|
self.unload_group = undefined;
|
|
self.unloadque = undefined;
|
|
self.usedpositions = undefined;
|
|
self.vehicle_spawner = undefined;
|
|
self.waitingforgate = undefined;
|
|
self.water_splash_function = undefined;
|
|
self.water_splash_reset_function = undefined;
|
|
self.offsetzero = undefined;
|
|
self.script_accuracy = undefined;
|
|
self.water_splash_reset_function = undefined;
|
|
self.wheeldir = undefined;
|
|
self.dontunloadonend = undefined;
|
|
self.dontdisconnectpaths = undefined;
|
|
self.script_godmode = undefined;
|
|
self.ent_flag = undefined;
|
|
self.export = undefined;
|
|
self.godmode = undefined;
|
|
self.vehicletype = undefined;
|
|
self.vehicle_stop_named = undefined;
|
|
self.enable_rocket_death = undefined;
|
|
self.touching_trigger_ent = undefined;
|
|
self.default_target_vec = undefined;
|
|
self.script_badplace = undefined;
|
|
self.water_splash_info = undefined;
|
|
}
|
|
|
|
_vehicle_is_crashing()
|
|
{
|
|
return isdefined( self.crashing ) && self.crashing == 1;
|
|
}
|
|
|
|
#using_animtree("vehicles");
|
|
|
|
vehicle_finish_death( var_0 )
|
|
{
|
|
if ( isdefined( self.dont_finish_death ) && self.dont_finish_death )
|
|
return;
|
|
|
|
self notify( "death_finished" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self useanimtree( #animtree );
|
|
|
|
if ( isdefined( level.vehicle_driveidle[var_0] ) )
|
|
self clearanim( level.vehicle_driveidle[var_0], 0 );
|
|
|
|
if ( isdefined( level.vehicle_driveidle_r[var_0] ) )
|
|
self clearanim( level.vehicle_driveidle_r[var_0], 0 );
|
|
}
|
|
|
|
vehicle_should_do_rocket_death( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( self.alwaysrocketdeath ) || self.alwaysrocketdeath == 0 )
|
|
{
|
|
if ( isdefined( self.enablerocketdeath ) && self.enablerocketdeath == 0 )
|
|
return 0;
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
return 0;
|
|
|
|
if ( !( var_2 == "MOD_PROJECTILE" || var_2 == "MOD_PROJECTILE_SPLASH" ) )
|
|
return 0;
|
|
}
|
|
|
|
if ( isdefined( self.is_anim_based_death ) && self.is_anim_based_death )
|
|
return 1;
|
|
|
|
return vehicle_has_rocket_death( var_0 );
|
|
}
|
|
|
|
vehicle_has_rocket_death( var_0 )
|
|
{
|
|
return isdefined( level.vehicle_death_fx["rocket_death" + self.classname] ) && isdefined( self.enablerocketdeath ) && self.enablerocketdeath == 1;
|
|
}
|
|
|
|
vehicle_do_crash( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = "tank";
|
|
|
|
if ( self vehicle_isphysveh() )
|
|
var_4 = "physics";
|
|
else if ( isdefined( self.script_crashtypeoverride ) )
|
|
var_4 = self.script_crashtypeoverride;
|
|
else if ( _ishelicopter() )
|
|
var_4 = "helicopter";
|
|
else if ( isdefined( self.currentnode ) && crash_path_check( self.currentnode ) )
|
|
var_4 = "none";
|
|
|
|
switch ( var_4 )
|
|
{
|
|
case "helicopter":
|
|
thread helicopter_crash( var_1, var_2, var_3 );
|
|
break;
|
|
case "tank":
|
|
if ( !isdefined( self.rollingdeath ) )
|
|
self vehicle_setspeed( 0, 25 );
|
|
else
|
|
{
|
|
self vehicle_setspeed( 8, 25 );
|
|
self waittill( "deathrolloff" );
|
|
self vehicle_setspeed( 0, 25 );
|
|
}
|
|
|
|
self notify( "deadstop" );
|
|
|
|
if ( !isdefined( self.dontdisconnectpaths ) )
|
|
self disconnectpaths();
|
|
|
|
if ( isdefined( self.tankgetout ) && self.tankgetout > 0 )
|
|
self waittill( "animsdone" );
|
|
|
|
break;
|
|
case "physics":
|
|
self vehphys_crash();
|
|
self notify( "deadstop" );
|
|
|
|
if ( !isdefined( self.dontdisconnectpaths ) )
|
|
self disconnectpaths();
|
|
|
|
if ( isdefined( self.tankgetout ) && self.tankgetout > 0 )
|
|
self waittill( "animsdone" );
|
|
|
|
break;
|
|
}
|
|
|
|
if ( isdefined( level.vehicle_hasmainturret[var_0] ) && level.vehicle_hasmainturret[var_0] )
|
|
self clearturrettarget();
|
|
|
|
if ( _ishelicopter() )
|
|
{
|
|
if ( isdefined( self.crashing ) && self.crashing == 1 )
|
|
self waittill( "crash_done" );
|
|
}
|
|
else
|
|
{
|
|
while ( !is_corpse() && isdefined( self ) && self vehicle_getspeed() > 0 )
|
|
wait 0.1;
|
|
}
|
|
|
|
self notify( "stop_looping_death_fx" );
|
|
vehicle_finish_death( var_0 );
|
|
}
|
|
|
|
is_corpse()
|
|
{
|
|
var_0 = 0;
|
|
|
|
if ( isdefined( self ) && self.classname == "script_vehicle_corpse" )
|
|
var_0 = 1;
|
|
|
|
return var_0;
|
|
}
|
|
|
|
set_death_model( var_0, var_1 )
|
|
{
|
|
if ( isdefined( self.skipmodelswapdeath ) && self.skipmodelswapdeath )
|
|
return;
|
|
|
|
if ( isdefined( var_1 ) && var_1 > 0 )
|
|
wait( var_1 );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
var_2 = _get_dummy();
|
|
|
|
if ( isdefined( self.clear_anims_on_death ) )
|
|
var_2 clearanim( %root, 0 );
|
|
|
|
if ( isdefined( self ) )
|
|
var_2 setmodel( var_0 );
|
|
}
|
|
|
|
helicopter_crash( var_0, var_1, var_2 )
|
|
{
|
|
if ( isdefined( var_0 ) && isplayer( var_0 ) )
|
|
self.achievement_attacker = var_0;
|
|
|
|
self.crashing = 1;
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
detach_getoutrigs();
|
|
|
|
if ( !var_2 )
|
|
thread helicopter_crash_move( var_0, var_1 );
|
|
}
|
|
|
|
kill_riders( var_0 )
|
|
{
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( !isalive( var_2 ) )
|
|
continue;
|
|
|
|
if ( !isdefined( var_2.ridingvehicle ) && !isdefined( var_2.drivingvehicle ) )
|
|
continue;
|
|
|
|
if ( isdefined( var_2.magic_bullet_shield ) )
|
|
var_2 maps\_utility::stop_magic_bullet_shield();
|
|
|
|
var_2 kill();
|
|
}
|
|
}
|
|
|
|
vehicle_rider_death_detection( var_0, var_1 )
|
|
{
|
|
if ( isdefined( self.vehicle_position ) && self.vehicle_position != 0 )
|
|
return;
|
|
|
|
self.health = 1;
|
|
var_0 endon( "death" );
|
|
self.baseaccuracy = 0.15;
|
|
self waittill( "death" );
|
|
var_0 notify( "driver_died" );
|
|
kill_riders( var_1 );
|
|
}
|
|
|
|
vehicle_becomes_crashable()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "enable_spline_path" );
|
|
waittillframeend;
|
|
self.riders = maps\_utility::remove_dead_from_array( self.riders );
|
|
|
|
if ( self.riders.size )
|
|
{
|
|
common_scripts\utility::array_thread( self.riders, ::vehicle_rider_death_detection, self, self.riders );
|
|
common_scripts\utility::waittill_either( "veh_collision", "driver_died" );
|
|
kill_riders( self.riders );
|
|
wait 0.25;
|
|
}
|
|
|
|
self notify( "script_crash_vehicle" );
|
|
self vehphys_crash();
|
|
}
|
|
|
|
_vehicle_landvehicle( var_0, var_1 )
|
|
{
|
|
self notify( "newpath" );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 2;
|
|
|
|
self setneargoalnotifydist( var_0 );
|
|
self sethoverparams( 0, 0, 0 );
|
|
self cleargoalyaw();
|
|
self settargetyaw( common_scripts\utility::flat_angle( self.angles )[1] );
|
|
_setvehgoalpos_wrap( maps\_utility::groundpos( self.origin ), 1 );
|
|
self waittill( "goal" );
|
|
}
|
|
|
|
lights_on( var_0, var_1 )
|
|
{
|
|
var_2 = strtok( var_0, " " );
|
|
common_scripts\utility::array_levelthread( var_2, ::lights_on_internal, var_1 );
|
|
}
|
|
|
|
group_light( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( level.vehicle_lights_group ) )
|
|
level.vehicle_lights_group = [];
|
|
|
|
if ( !isdefined( level.vehicle_lights_group[var_0] ) )
|
|
level.vehicle_lights_group[var_0] = [];
|
|
|
|
if ( !isdefined( level.vehicle_lights_group[var_0][var_2] ) )
|
|
level.vehicle_lights_group[var_0][var_2] = [];
|
|
|
|
foreach ( var_4 in level.vehicle_lights_group[var_0][var_2] )
|
|
{
|
|
if ( var_1 == var_4 )
|
|
return;
|
|
}
|
|
|
|
level.vehicle_lights_group[var_0][var_2][level.vehicle_lights_group[var_0][var_2].size] = var_1;
|
|
}
|
|
|
|
lights_delayfxforframe()
|
|
{
|
|
level notify( "new_lights_delayfxforframe" );
|
|
level endon( "new_lights_delayfxforframe" );
|
|
|
|
if ( !isdefined( level.fxdelay ) )
|
|
level.fxdelay = 0;
|
|
|
|
level.fxdelay = level.fxdelay + randomfloatrange( 0.2, 0.4 );
|
|
|
|
if ( level.fxdelay > 2 )
|
|
level.fxdelay = 0;
|
|
|
|
wait 0.05;
|
|
level.fxdelay = undefined;
|
|
}
|
|
|
|
kill_lights( var_0 )
|
|
{
|
|
lights_off_internal( "all", var_0 );
|
|
}
|
|
|
|
vehicle_aim_turret_at_angle( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_1 = anglestoforward( self.angles + ( 0, var_0, 0 ) );
|
|
var_1 = var_1 * 10000;
|
|
var_1 = var_1 + ( 0, 0, 70 );
|
|
self setturrettargetvec( var_1 );
|
|
}
|
|
|
|
vehicle_landvehicle( var_0, var_1 )
|
|
{
|
|
return _vehicle_landvehicle( var_0, var_1 );
|
|
}
|
|
|
|
vehicle_spawns_targets_and_rides()
|
|
{
|
|
var_0 = getentarray( self.target, "targetname" );
|
|
var_1 = [];
|
|
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
if ( var_3.code_classname == "info_vehicle_node" )
|
|
continue;
|
|
|
|
var_1[var_1.size] = var_3;
|
|
}
|
|
|
|
var_1 = common_scripts\utility::get_array_of_closest( self.origin, var_1 );
|
|
|
|
foreach ( var_7, var_6 in var_1 )
|
|
var_6 thread maps\_utility::add_spawn_function( ::guy_spawns_and_gets_in_vehicle, self, var_7 );
|
|
|
|
common_scripts\utility::array_thread( var_1, maps\_utility::spawn_ai );
|
|
self waittill( "guy_entered" );
|
|
wait 3;
|
|
thread vehicle_becomes_crashable();
|
|
|
|
if ( !self.riders.size )
|
|
return;
|
|
|
|
_gopath();
|
|
leave_path_for_spline_path();
|
|
}
|
|
|
|
spawn_vehicle_and_attach_to_spline_path( var_0 )
|
|
{
|
|
if ( level.enemy_snowmobiles.size >= 8 )
|
|
return;
|
|
|
|
var_1 = maps\_utility::spawn_vehicle();
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_1 vehphys_setspeed( var_0 );
|
|
|
|
var_1 thread vehicle_becomes_crashable();
|
|
var_1 endon( "death" );
|
|
var_1.dontunloadonend = 1;
|
|
var_1 _gopath( var_1 );
|
|
var_1 leave_path_for_spline_path();
|
|
}
|
|
|
|
leave_path_for_spline_path()
|
|
{
|
|
self endon( "script_crash_vehicle" );
|
|
common_scripts\utility::waittill_either( "enable_spline_path", "reached_end_node" );
|
|
var_0 = get_my_spline_node( self.origin );
|
|
|
|
if ( isdefined( level.drive_spline_path_fun ) )
|
|
var_0 thread [[ level.drive_spline_path_fun ]]( self );
|
|
}
|
|
|
|
get_my_spline_node( var_0 )
|
|
{
|
|
var_0 = ( var_0[0], var_0[1], 0 );
|
|
var_1 = common_scripts\utility::get_array_of_closest( var_0, level.snowmobile_path );
|
|
var_2 = [];
|
|
|
|
for ( var_3 = 0; var_3 < 3; var_3++ )
|
|
var_2[var_3] = var_1[var_3];
|
|
|
|
foreach ( var_5 in level.snowmobile_path )
|
|
{
|
|
foreach ( var_7 in var_2 )
|
|
{
|
|
if ( var_7 == var_5 )
|
|
return var_7;
|
|
}
|
|
}
|
|
}
|
|
|
|
guy_spawns_and_gets_in_vehicle( var_0, var_1 )
|
|
{
|
|
_mount_snowmobile( var_0, var_1 );
|
|
}
|
|
|
|
_mount_snowmobile( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "long_death" );
|
|
|
|
if ( maps\_utility::doinglongdeath() )
|
|
return;
|
|
|
|
var_2 = [];
|
|
var_2[0] = "snowmobile_driver";
|
|
var_2[1] = "snowmobile_passenger";
|
|
var_3 = [];
|
|
var_3["snowmobile_driver"] = "tag_driver";
|
|
var_3["snowmobile_passenger"] = "tag_passenger";
|
|
var_4 = var_2[var_1];
|
|
var_5 = var_3[var_4];
|
|
var_6 = var_0 gettagorigin( var_5 );
|
|
var_7 = var_0 gettagangles( var_5 );
|
|
var_8 = undefined;
|
|
var_9 = undefined;
|
|
var_10 = 9999999;
|
|
|
|
foreach ( var_16, var_12 in level.snowmobile_mount_anims[var_4] )
|
|
{
|
|
var_13 = maps\_utility::getanim_generic( var_16 );
|
|
var_14 = getstartorigin( var_6, var_7, var_13 );
|
|
var_15 = distance( self.origin, var_14 );
|
|
|
|
if ( var_15 < var_10 )
|
|
{
|
|
var_10 = var_15;
|
|
var_9 = var_14;
|
|
var_8 = var_16;
|
|
}
|
|
}
|
|
|
|
var_9 = common_scripts\utility::drop_to_ground( var_9 );
|
|
self.goalradius = 8;
|
|
self.disablearrivals = 1;
|
|
self setgoalpos( var_9 );
|
|
self waittill( "goal" );
|
|
var_0 maps\_anim::anim_generic( self, var_8, var_5 );
|
|
var_0 thread maps\_vehicle_aianim::guy_enter( self );
|
|
self.disablearrivals = 0;
|
|
}
|
|
|
|
waittill_stable( var_0 )
|
|
{
|
|
var_1 = 12;
|
|
var_2 = 400;
|
|
var_3 = gettime() + var_2;
|
|
|
|
if ( isdefined( self.dropoff_height ) )
|
|
{
|
|
var_4 = maps\_utility::groundpos( var_0.origin ) + ( 0, 0, self.dropoff_height );
|
|
self settargetyaw( var_0.angles[1] );
|
|
self setvehgoalpos( var_4, 1 );
|
|
self waittill( "goal" );
|
|
}
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
if ( abs( self.angles[0] ) > var_1 || abs( self.angles[2] ) > var_1 )
|
|
var_3 = gettime() + var_2;
|
|
|
|
if ( gettime() > var_3 )
|
|
break;
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
_vehicle_badplace()
|
|
{
|
|
if ( !isdefined( self.script_badplace ) )
|
|
return;
|
|
|
|
self endon( "kill_badplace_forever" );
|
|
|
|
if ( !self vehicle_isphysveh() )
|
|
self endon( "death" );
|
|
|
|
self endon( "delete" );
|
|
|
|
if ( isdefined( level.custombadplacethread ) )
|
|
{
|
|
self thread [[ level.custombadplacethread ]]();
|
|
return;
|
|
}
|
|
|
|
var_0 = isdefined( level.vehicle_hasmainturret[self.model] ) && level.vehicle_hasmainturret[self.model];
|
|
var_1 = 0.5;
|
|
var_2 = 17;
|
|
var_3 = 17;
|
|
|
|
for (;;)
|
|
{
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( !isdefined( self.script_badplace ) || !self.script_badplace )
|
|
{
|
|
while ( isdefined( self ) && ( !isdefined( self.script_badplace ) || !self.script_badplace ) )
|
|
wait 0.5;
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
}
|
|
|
|
var_4 = self vehicle_getspeed();
|
|
|
|
if ( var_4 <= 0 )
|
|
{
|
|
wait( var_1 );
|
|
continue;
|
|
}
|
|
|
|
if ( var_4 < 5 )
|
|
var_5 = 200;
|
|
else if ( var_4 > 5 && var_4 < 8 )
|
|
var_5 = 350;
|
|
else
|
|
var_5 = 500;
|
|
|
|
if ( isdefined( self.badplacemodifier ) )
|
|
var_5 = var_5 * self.badplacemodifier;
|
|
|
|
if ( var_0 )
|
|
var_6 = anglestoforward( self gettagangles( "tag_turret" ) );
|
|
else
|
|
var_6 = anglestoforward( self.angles );
|
|
|
|
badplace_arc( self.unique_id + "arc", var_1, self.origin, var_5 * 1.9, 300, var_6, var_2, var_3, "axis", "team3", "allies" );
|
|
badplace_cylinder( self.unique_id + "cyl", var_1, self.origin, 200, 300, "axis", "team3", "allies" );
|
|
wait( var_1 + 0.05 );
|
|
}
|
|
}
|
|
|
|
_vehicle_unload( var_0 )
|
|
{
|
|
self notify( "unloading" );
|
|
var_1 = [];
|
|
|
|
if ( maps\_utility::ent_flag_exist( "no_riders_until_unload" ) )
|
|
{
|
|
maps\_utility::ent_flag_set( "no_riders_until_unload" );
|
|
var_1 = spawn_unload_group( var_0 );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
maps\_utility::spawn_failed( var_3 );
|
|
}
|
|
|
|
if ( isdefined( var_0 ) )
|
|
self.unload_group = var_0;
|
|
|
|
foreach ( var_6 in self.riders )
|
|
{
|
|
if ( isalive( var_6 ) )
|
|
var_6 notify( "unload" );
|
|
}
|
|
|
|
var_1 = maps\_vehicle_aianim::animate_guys( "unload" );
|
|
var_8 = level.vehicle_unloadgroups[self.classname];
|
|
|
|
if ( isdefined( var_8 ) )
|
|
{
|
|
var_1 = [];
|
|
var_9 = maps\_vehicle_aianim::get_unload_group();
|
|
|
|
foreach ( var_12, var_11 in self.riders )
|
|
{
|
|
if ( isdefined( var_9[var_11.vehicle_position] ) )
|
|
var_1[var_1.size] = var_11;
|
|
}
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
lights_off_internal( var_0, var_1, var_2 )
|
|
{
|
|
if ( isdefined( var_2 ) )
|
|
var_1 = var_2;
|
|
else if ( !isdefined( var_1 ) )
|
|
var_1 = self.classname;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = "all";
|
|
|
|
if ( !isdefined( self.lights ) )
|
|
return;
|
|
|
|
if ( !isdefined( level.vehicle_lights_group[var_1][var_0] ) )
|
|
return;
|
|
|
|
var_3 = level.vehicle_lights_group[var_1][var_0];
|
|
var_4 = 0;
|
|
var_5 = 2;
|
|
|
|
if ( isdefined( self.maxlightstopsperframe ) )
|
|
var_5 = self.maxlightstopsperframe;
|
|
|
|
foreach ( var_7 in var_3 )
|
|
{
|
|
var_8 = level.vehicle_lights[var_1][var_7];
|
|
|
|
if ( maps\_utility::hastag( self.model, var_8.tag ) )
|
|
stopfxontag( var_8.effect, self, var_8.tag );
|
|
|
|
var_4++;
|
|
|
|
if ( var_4 >= var_5 )
|
|
{
|
|
var_4 = 0;
|
|
wait 0.05;
|
|
}
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self.lights[var_7] = undefined;
|
|
}
|
|
}
|
|
|
|
lights_on_internal( var_0, var_1 )
|
|
{
|
|
level.lastlighttime = gettime();
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = "all";
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = self.classname;
|
|
|
|
if ( !isdefined( level.vehicle_lights_group ) )
|
|
return;
|
|
|
|
if ( !isdefined( level.vehicle_lights_group[var_1] ) || !isdefined( level.vehicle_lights_group[var_1][var_0] ) )
|
|
return;
|
|
|
|
thread lights_delayfxforframe();
|
|
|
|
if ( !isdefined( self.lights ) )
|
|
self.lights = [];
|
|
|
|
var_2 = level.vehicle_lights_group[var_1][var_0];
|
|
var_3 = 0;
|
|
var_4 = [];
|
|
|
|
foreach ( var_6 in var_2 )
|
|
{
|
|
if ( isdefined( self.lights[var_6] ) )
|
|
continue;
|
|
|
|
var_7 = level.vehicle_lights[var_1][var_6];
|
|
|
|
if ( isdefined( var_7.delay ) )
|
|
var_8 = var_7.delay;
|
|
else
|
|
var_8 = 0;
|
|
|
|
for ( var_8 = var_8 + level.fxdelay; isdefined( var_4["" + var_8] ); var_8 = var_8 + 0.05 )
|
|
{
|
|
|
|
}
|
|
|
|
var_4["" + var_8] = 1;
|
|
self endon( "death" );
|
|
childthread common_scripts\utility::noself_delaycall_proc( ::playfxontag, var_8, var_7.effect, self, var_7.tag );
|
|
self.lights[var_6] = 1;
|
|
|
|
if ( !isdefined( self ) )
|
|
break;
|
|
}
|
|
|
|
level.fxdelay = 0;
|
|
}
|
|
|
|
_setvehgoalpos_wrap( var_0, var_1 )
|
|
{
|
|
if ( self.health <= 0 )
|
|
return;
|
|
|
|
if ( isdefined( self.originheightoffset ) )
|
|
var_0 = var_0 + ( 0, 0, self.originheightoffset );
|
|
|
|
self setvehgoalpos( var_0, var_1 );
|
|
}
|
|
|
|
helicopter_crash_move( var_0, var_1 )
|
|
{
|
|
self endon( "in_air_explosion" );
|
|
|
|
if ( isdefined( self.perferred_crash_location ) )
|
|
var_2 = self.perferred_crash_location;
|
|
else
|
|
{
|
|
var_3 = get_unused_crash_locations();
|
|
var_2 = common_scripts\utility::getclosest( self.origin, var_3 );
|
|
}
|
|
|
|
var_2.claimed = 1;
|
|
self notify( "newpath" );
|
|
self notify( "deathspin" );
|
|
var_4 = 0;
|
|
var_5 = 0;
|
|
|
|
if ( isdefined( var_2.script_parameters ) && var_2.script_parameters == "direct" )
|
|
var_5 = 1;
|
|
|
|
if ( isdefined( self.heli_crash_indirect_zoff ) )
|
|
{
|
|
var_5 = 0;
|
|
var_4 = self.heli_crash_indirect_zoff;
|
|
}
|
|
|
|
if ( var_5 )
|
|
{
|
|
var_6 = 60;
|
|
self vehicle_setspeed( var_6, 15, 10 );
|
|
self setneargoalnotifydist( var_2.radius );
|
|
self setvehgoalpos( var_2.origin, 0 );
|
|
thread helicopter_crash_flavor( var_2.origin, var_6 );
|
|
common_scripts\utility::waittill_any( "goal", "near_goal" );
|
|
helicopter_crash_path( var_2 );
|
|
}
|
|
else
|
|
{
|
|
var_7 = ( var_2.origin[0], var_2.origin[1], self.origin[2] + var_4 );
|
|
|
|
if ( isdefined( self.heli_crash_lead ) )
|
|
{
|
|
var_7 = self.origin + self.heli_crash_lead * self vehicle_getvelocity();
|
|
var_7 = ( var_7[0], var_7[1], var_7[2] + var_4 );
|
|
}
|
|
|
|
self vehicle_setspeed( 40, 10, 10 );
|
|
self setneargoalnotifydist( 300 );
|
|
self setvehgoalpos( var_7, 1 );
|
|
thread helicopter_crash_flavor( var_7, 40 );
|
|
var_8 = "blank";
|
|
|
|
while ( var_8 != "death" )
|
|
{
|
|
var_8 = common_scripts\utility::waittill_any( "goal", "near_goal", "death" );
|
|
|
|
if ( !isdefined( var_8 ) && !isdefined( self ) )
|
|
{
|
|
var_2.claimed = undefined;
|
|
self notify( "crash_done" );
|
|
return;
|
|
}
|
|
else
|
|
var_8 = "death";
|
|
}
|
|
|
|
self setvehgoalpos( var_2.origin, 0 );
|
|
self waittill( "goal" );
|
|
helicopter_crash_path( var_2 );
|
|
}
|
|
|
|
var_2.claimed = undefined;
|
|
self notify( "stop_crash_loop_sound" );
|
|
self notify( "crash_done" );
|
|
}
|
|
|
|
helicopter_crash_path( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
while ( isdefined( var_0.target ) )
|
|
{
|
|
var_0 = common_scripts\utility::getstruct( var_0.target, "targetname" );
|
|
var_1 = 56;
|
|
|
|
if ( isdefined( var_0.radius ) )
|
|
var_1 = var_0.radius;
|
|
|
|
self setneargoalnotifydist( var_1 );
|
|
self setvehgoalpos( var_0.origin, 0 );
|
|
common_scripts\utility::waittill_any( "goal", "near_goal" );
|
|
}
|
|
}
|
|
|
|
helicopter_crash_flavor( var_0, var_1 )
|
|
{
|
|
self endon( "crash_done" );
|
|
self clearlookatent();
|
|
var_2 = 0;
|
|
|
|
if ( isdefined( self.preferred_crash_style ) )
|
|
{
|
|
var_2 = self.preferred_crash_style;
|
|
|
|
if ( self.preferred_crash_style < 0 )
|
|
{
|
|
var_3 = [ 1, 2, 2 ];
|
|
var_4 = 5;
|
|
var_5 = randomint( var_4 );
|
|
var_6 = 0;
|
|
|
|
foreach ( var_9, var_8 in var_3 )
|
|
{
|
|
var_6 = var_6 + var_8;
|
|
|
|
if ( var_5 < var_6 )
|
|
{
|
|
var_2 = var_9;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
switch ( var_2 )
|
|
{
|
|
case 1:
|
|
thread helicopter_crash_zigzag();
|
|
break;
|
|
case 2:
|
|
thread helicopter_crash_directed( var_0, var_1 );
|
|
break;
|
|
case 3:
|
|
thread helicopter_in_air_explosion();
|
|
break;
|
|
case 0:
|
|
default:
|
|
thread helicopter_crash_rotate();
|
|
break;
|
|
}
|
|
}
|
|
|
|
helicopter_in_air_explosion()
|
|
{
|
|
self notify( "crash_done" );
|
|
self notify( "in_air_explosion" );
|
|
}
|
|
|
|
helicopter_crash_directed( var_0, var_1 )
|
|
{
|
|
self endon( "crash_done" );
|
|
self clearlookatent();
|
|
self setmaxpitchroll( randomintrange( 20, 90 ), randomintrange( 5, 90 ) );
|
|
self setyawspeed( 400, 100, 100 );
|
|
var_2 = 90 * randomintrange( -2, 3 );
|
|
|
|
for (;;)
|
|
{
|
|
var_3 = var_0 - self.origin;
|
|
var_4 = vectortoyaw( var_3 );
|
|
var_4 = var_4 + var_2;
|
|
self settargetyaw( var_4 );
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
helicopter_crash_zigzag()
|
|
{
|
|
self endon( "crash_done" );
|
|
self clearlookatent();
|
|
self setyawspeed( 400, 100, 100 );
|
|
var_0 = randomint( 2 );
|
|
|
|
for (;;)
|
|
{
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
var_1 = randomintrange( 20, 120 );
|
|
|
|
if ( var_0 )
|
|
self settargetyaw( self.angles[1] + var_1 );
|
|
else
|
|
self settargetyaw( self.angles[1] - var_1 );
|
|
|
|
var_0 = 1 - var_0;
|
|
var_2 = randomfloatrange( 0.5, 1.0 );
|
|
wait( var_2 );
|
|
}
|
|
}
|
|
|
|
helicopter_crash_rotate()
|
|
{
|
|
self endon( "crash_done" );
|
|
self clearlookatent();
|
|
self setyawspeed( 400, 100, 100 );
|
|
|
|
for (;;)
|
|
{
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
var_0 = randomintrange( 90, 120 );
|
|
self settargetyaw( self.angles[1] + var_0 );
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
get_unused_crash_locations()
|
|
{
|
|
var_0 = [];
|
|
level.helicopter_crash_locations = common_scripts\utility::array_removeundefined( level.helicopter_crash_locations );
|
|
|
|
foreach ( var_2 in level.helicopter_crash_locations )
|
|
{
|
|
if ( isdefined( var_2.claimed ) )
|
|
continue;
|
|
|
|
var_0[var_0.size] = var_2;
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
detach_getoutrigs()
|
|
{
|
|
if ( !isdefined( self.fastroperig ) )
|
|
return;
|
|
|
|
if ( !self.fastroperig.size )
|
|
return;
|
|
|
|
var_0 = getarraykeys( self.fastroperig );
|
|
|
|
for ( var_1 = 0; var_1 < var_0.size; var_1++ )
|
|
self.fastroperig[var_0[var_1]] unlink();
|
|
}
|
|
|
|
_get_dummy()
|
|
{
|
|
if ( self.modeldummyon )
|
|
var_0 = self.modeldummy;
|
|
else
|
|
var_0 = self;
|
|
|
|
return var_0;
|
|
}
|
|
|
|
crash_path_check( var_0 )
|
|
{
|
|
var_1 = var_0;
|
|
|
|
while ( isdefined( var_1 ) )
|
|
{
|
|
if ( isdefined( var_1.detoured ) && var_1.detoured == 0 )
|
|
{
|
|
var_2 = path_detour_get_detourpath( getvehiclenode( var_1.target, "targetname" ) );
|
|
|
|
if ( isdefined( var_2 ) && isdefined( var_2.script_crashtype ) )
|
|
return 1;
|
|
}
|
|
|
|
if ( isdefined( var_1.target ) )
|
|
{
|
|
var_1 = getvehiclenode( var_1.target, "targetname" );
|
|
continue;
|
|
}
|
|
|
|
var_1 = undefined;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
vehicle_kill_badplace_forever()
|
|
{
|
|
self notify( "kill_badplace_forever" );
|
|
}
|
|
|
|
kill_jolt( var_0 )
|
|
{
|
|
if ( isdefined( level.vehicle_death_jolt[var_0] ) )
|
|
{
|
|
self.dontfreeme = 1;
|
|
wait( level.vehicle_death_jolt[var_0].delay );
|
|
}
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self joltbody( self.origin + ( 23, 33, 64 ), 3 );
|
|
wait 2;
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self.dontfreeme = undefined;
|
|
}
|
|
|
|
_kill_fx( var_0, var_1 )
|
|
{
|
|
if ( common_scripts\utility::isdestructible() || isdefined( self.is_anim_based_death ) && self.is_anim_based_death )
|
|
return;
|
|
|
|
level notify( "vehicle_explosion", self.origin );
|
|
self notify( "explode", self.origin );
|
|
|
|
if ( isdefined( self.ignore_death_fx ) && self.ignore_death_fx )
|
|
return;
|
|
|
|
var_2 = self.vehicletype;
|
|
var_3 = self.classname;
|
|
|
|
if ( var_1 )
|
|
var_3 = "rocket_death" + var_3;
|
|
|
|
foreach ( var_5 in level.vehicle_death_fx[var_3] )
|
|
thread kill_fx_thread( var_0, var_5, var_2 );
|
|
}
|
|
|
|
kill_fx_thread( var_0, var_1, var_2 )
|
|
{
|
|
if ( isdefined( var_1.waitdelay ) )
|
|
{
|
|
if ( var_1.waitdelay >= 0 )
|
|
wait( var_1.waitdelay );
|
|
else
|
|
self waittill( "death_finished" );
|
|
}
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( isdefined( var_1.notifystring ) )
|
|
self notify( var_1.notifystring );
|
|
|
|
var_3 = _get_dummy();
|
|
|
|
if ( isdefined( var_1.selfdeletedelay ) )
|
|
common_scripts\utility::delaycall( var_1.selfdeletedelay, ::delete );
|
|
|
|
if ( isdefined( var_1.effect ) )
|
|
{
|
|
if ( var_1.beffectlooping && !isdefined( self.delete_on_death ) )
|
|
{
|
|
if ( isdefined( var_1.tag ) )
|
|
{
|
|
if ( isdefined( var_1.stayontag ) && var_1.stayontag == 1 )
|
|
thread loop_fx_on_vehicle_tag( var_1.effect, var_1.delay, var_1.tag );
|
|
else
|
|
thread playloopedfxontag( var_1.effect, var_1.delay, var_1.tag );
|
|
}
|
|
else
|
|
{
|
|
var_4 = var_3.origin + ( 0, 0, 100 ) - var_3.origin;
|
|
playfx( var_1.effect, var_3.origin, var_4 );
|
|
}
|
|
}
|
|
else if ( isdefined( var_1.tag ) )
|
|
{
|
|
playfxontag( var_1.effect, deathfx_ent(), var_1.tag );
|
|
|
|
if ( isdefined( var_1.remove_deathfx_entity_delay ) )
|
|
deathfx_ent() common_scripts\utility::delaycall( var_1.remove_deathfx_entity_delay, ::delete );
|
|
}
|
|
else
|
|
{
|
|
var_4 = var_3.origin + ( 0, 0, 100 ) - var_3.origin;
|
|
playfx( var_1.effect, var_3.origin, var_4 );
|
|
}
|
|
}
|
|
|
|
if ( isdefined( var_1.sound ) && !isdefined( self.delete_on_death ) )
|
|
{
|
|
if ( var_1.bsoundlooping )
|
|
thread death_firesound( var_1.sound );
|
|
else
|
|
common_scripts\utility::play_sound_in_space( var_1.sound );
|
|
}
|
|
}
|
|
|
|
loop_fx_on_vehicle_tag( var_0, var_1, var_2 )
|
|
{
|
|
self endon( "stop_looping_death_fx" );
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
playfxontag( var_0, deathfx_ent(), var_2 );
|
|
wait( var_1 );
|
|
}
|
|
}
|
|
|
|
death_firesound( var_0 )
|
|
{
|
|
thread maps\_utility::play_loop_sound_on_tag( var_0, undefined, 0, 1 );
|
|
common_scripts\utility::waittill_any( "fire_extinguish", "stop_crash_loop_sound" );
|
|
|
|
if ( !isdefined( self ) )
|
|
{
|
|
iprintln( "^1DEBUG: Infinite looping sound for a vehicle could be happening right now..." );
|
|
return;
|
|
}
|
|
|
|
self notify( "stop sound" + var_0 );
|
|
}
|
|
|
|
deathfx_ent()
|
|
{
|
|
if ( isdefined( self.death_fx_on_self ) && self.death_fx_on_self )
|
|
return self;
|
|
|
|
if ( !isdefined( self.deathfx_ent ) )
|
|
{
|
|
var_0 = spawn( "script_model", ( 0, 0, 0 ) );
|
|
var_1 = _get_dummy();
|
|
var_0 setmodel( self.model );
|
|
var_0.origin = var_1.origin;
|
|
var_0.angles = var_1.angles;
|
|
var_0 notsolid();
|
|
var_0 hide();
|
|
var_0 linkto( var_1 );
|
|
self.deathfx_ent = var_0;
|
|
}
|
|
else
|
|
self.deathfx_ent setmodel( self.model );
|
|
|
|
return self.deathfx_ent;
|
|
}
|
|
|
|
playloopedfxontag( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = _get_dummy();
|
|
var_4 = spawn( "script_origin", var_3.origin );
|
|
self endon( "fire_extinguish" );
|
|
thread playloopedfxontag_originupdate( var_2, var_4 );
|
|
|
|
for (;;)
|
|
{
|
|
playfx( var_0, var_4.origin, var_4.upvec );
|
|
wait( var_1 );
|
|
}
|
|
}
|
|
|
|
playloopedfxontag_originupdate( var_0, var_1 )
|
|
{
|
|
var_1.angles = self gettagangles( var_0 );
|
|
var_1.origin = self gettagorigin( var_0 );
|
|
var_1.forwardvec = anglestoforward( var_1.angles );
|
|
var_1.upvec = anglestoup( var_1.angles );
|
|
|
|
while ( isdefined( self ) && self.code_classname == "script_vehicle" && self vehicle_getspeed() > 0 )
|
|
{
|
|
var_2 = _get_dummy();
|
|
var_1.angles = var_2 gettagangles( var_0 );
|
|
var_1.origin = var_2 gettagorigin( var_0 );
|
|
var_1.forwardvec = anglestoforward( var_1.angles );
|
|
var_1.upvec = anglestoup( var_1.angles );
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
kill_badplace( var_0 )
|
|
{
|
|
if ( !isdefined( level.vehicle_death_badplace[var_0] ) )
|
|
return;
|
|
|
|
var_1 = level.vehicle_death_badplace[var_0];
|
|
|
|
if ( isdefined( var_1.delay ) )
|
|
wait( var_1.delay );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
badplace_cylinder( "vehicle_kill_badplace", var_1.duration, self.origin, var_1.radius, var_1.height, var_1.team1, var_1.team2 );
|
|
}
|
|
|
|
turret_deleteme( var_0 )
|
|
{
|
|
if ( isdefined( self ) )
|
|
{
|
|
if ( isdefined( var_0.deletedelay ) )
|
|
wait( var_0.deletedelay );
|
|
}
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_0 delete();
|
|
}
|
|
|
|
apply_truckjunk()
|
|
{
|
|
if ( !isdefined( self.truckjunk ) )
|
|
return;
|
|
|
|
var_0 = self.truckjunk;
|
|
self.truckjunk = [];
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( isdefined( var_2.spawner ) )
|
|
{
|
|
var_3 = common_scripts\utility::spawn_tag_origin();
|
|
var_3.spawner = var_2.spawner;
|
|
}
|
|
else
|
|
{
|
|
var_3 = spawn( "script_model", self.origin );
|
|
var_3 setmodel( var_2.model );
|
|
}
|
|
|
|
var_4 = "tag_body";
|
|
|
|
if ( isdefined( var_2.script_ghettotag ) )
|
|
{
|
|
var_3.script_ghettotag = var_2.script_ghettotag;
|
|
var_3.base_origin = var_2.origin;
|
|
var_3.base_angles = var_2.angles;
|
|
var_4 = var_2.script_ghettotag;
|
|
}
|
|
|
|
if ( isdefined( var_2.destroyefx ) )
|
|
var_2 thread truckjunk_dyn( var_3 );
|
|
|
|
if ( isdefined( var_2.script_noteworthy ) )
|
|
var_3.script_noteworthy = var_2.script_noteworthy;
|
|
|
|
if ( isdefined( var_2.script_parameters ) )
|
|
var_3.script_parameters = var_2.script_parameters;
|
|
|
|
var_3 linkto( self, var_4, var_2.origin, var_2.angles );
|
|
|
|
if ( isdefined( var_2.destructible_type ) )
|
|
{
|
|
var_3.destructible_type = var_2.destructible_type;
|
|
var_3 common_scripts\_destructible::setup_destructibles( 1 );
|
|
}
|
|
|
|
self.truckjunk[self.truckjunk.size] = var_3;
|
|
}
|
|
}
|
|
|
|
truckjunk_dyn( var_0 )
|
|
{
|
|
var_0 endon( "death" );
|
|
var_0 setcandamage( 1 );
|
|
var_0.health = 8000;
|
|
var_0 waittill( "damage" );
|
|
var_0 hide();
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
var_1.origin = var_0.origin;
|
|
var_1.angles = var_0.angles;
|
|
var_1 linkto( var_0 );
|
|
playfxontag( self.destroyefx, var_1, "tag_origin" );
|
|
}
|
|
|
|
truckjunk()
|
|
{
|
|
var_0 = getent( self.target, "targetname" );
|
|
var_1 = ghetto_tag_create( var_0 );
|
|
|
|
if ( isspawner( self ) )
|
|
var_1.spawner = self;
|
|
|
|
if ( isdefined( self.targetname ) )
|
|
{
|
|
var_2 = getent( self.targetname, "target" );
|
|
|
|
if ( isspawner( var_2 ) )
|
|
var_1.spawner = var_2;
|
|
}
|
|
|
|
if ( isdefined( self.script_noteworthy ) )
|
|
var_1.script_noteworthy = self.script_noteworthy;
|
|
|
|
if ( isdefined( self.script_parameters ) )
|
|
var_1.script_parameters = self.script_parameters;
|
|
|
|
if ( isdefined( self.script_fxid ) )
|
|
var_1.destroyefx = common_scripts\utility::getfx( self.script_fxid );
|
|
|
|
if ( !isdefined( var_0.truckjunk ) )
|
|
var_0.truckjunk = [];
|
|
|
|
if ( isdefined( self.script_startingposition ) )
|
|
var_1.script_startingposition = self.script_startingposition;
|
|
|
|
if ( isdefined( self.destructible_type ) )
|
|
{
|
|
maps\_utility::precache_destructible( self.destructible_type );
|
|
var_1.destructible_type = self.destructible_type;
|
|
}
|
|
|
|
var_0.truckjunk[var_0.truckjunk.size] = var_1;
|
|
|
|
if ( !isdefined( self.classname ) )
|
|
return;
|
|
|
|
if ( isspawner( self ) )
|
|
return;
|
|
|
|
self delete();
|
|
}
|
|
|
|
ghetto_tag_create( var_0 )
|
|
{
|
|
var_1 = spawnstruct();
|
|
var_2 = "tag_body";
|
|
|
|
if ( isdefined( self.script_ghettotag ) )
|
|
{
|
|
var_2 = self.script_ghettotag;
|
|
var_1.script_ghettotag = self.script_ghettotag;
|
|
}
|
|
|
|
var_1.origin = self.origin - var_0 gettagorigin( var_2 );
|
|
|
|
if ( !isdefined( self.angles ) )
|
|
var_3 = ( 0, 0, 0 );
|
|
else
|
|
var_3 = self.angles;
|
|
|
|
var_1.angles = var_3 - var_0 gettagangles( var_2 );
|
|
var_1.model = self.model;
|
|
|
|
if ( isdefined( self.script_modelname ) )
|
|
{
|
|
precachemodel( self.script_modelname );
|
|
var_1.model = self.script_modelname;
|
|
}
|
|
|
|
if ( isdefined( var_1.targetname ) )
|
|
level.struct_class_names["targetname"][var_1.targetname] = undefined;
|
|
|
|
if ( isdefined( var_1.target ) )
|
|
level.struct_class_names["target"][var_1.target] = undefined;
|
|
|
|
return var_1;
|
|
}
|
|
|
|
_getvehiclespawnerarray( var_0 )
|
|
{
|
|
var_1 = getentarray( "script_vehicle", "code_classname" );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in var_1 )
|
|
{
|
|
if ( !isdefined( var_4.targetname ) )
|
|
continue;
|
|
|
|
if ( var_4.targetname == var_0 )
|
|
var_2 = common_scripts\utility::array_add( var_2, var_4 );
|
|
}
|
|
|
|
var_1 = var_2;
|
|
}
|
|
|
|
var_6 = [];
|
|
|
|
foreach ( var_4 in var_1 )
|
|
{
|
|
if ( isspawner( var_4 ) )
|
|
var_6[var_6.size] = var_4;
|
|
}
|
|
|
|
return var_6;
|
|
}
|
|
|
|
_getvehiclespawnerarray_by_spawngroup( var_0 )
|
|
{
|
|
var_1 = _getvehiclespawnerarray();
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in var_1 )
|
|
{
|
|
if ( isdefined( var_4.script_vehiclespawngroup ) && var_4.script_vehiclespawngroup == var_0 )
|
|
var_2[var_2.size] = var_4;
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
manual_tag_linkto( var_0, var_1 )
|
|
{
|
|
for (;;)
|
|
{
|
|
if ( !isdefined( self ) )
|
|
break;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
break;
|
|
|
|
var_2 = var_0 gettagorigin( var_1 );
|
|
var_3 = var_0 gettagangles( var_1 );
|
|
self.origin = var_2;
|
|
self.angles = var_3;
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
humvee_antenna_animates( var_0 )
|
|
{
|
|
self useanimtree( #animtree );
|
|
humvee_antenna_animates_until_death( var_0 );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self clearanim( var_0["idle"], 0 );
|
|
self clearanim( var_0["rot_l"], 0 );
|
|
self clearanim( var_0["rot_r"], 0 );
|
|
}
|
|
|
|
humvee_antenna_animates_until_death( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = self.veh_speed / 18;
|
|
|
|
if ( var_1 <= 0.0001 )
|
|
var_1 = 0.0001;
|
|
|
|
var_2 = randomfloatrange( 0.3, 0.7 );
|
|
self setanim( var_0["idle"], var_1, 0, var_2 );
|
|
var_2 = randomfloatrange( 0.1, 0.8 );
|
|
self setanim( var_0["rot_l"], 1, 0, var_2 );
|
|
var_2 = randomfloatrange( 0.1, 0.8 );
|
|
self setanim( var_0["rot_r"], 1, 0, var_2 );
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
vehicle_script_forcecolor_riders( var_0 )
|
|
{
|
|
foreach ( var_2 in self.riders )
|
|
{
|
|
if ( isai( var_2 ) )
|
|
{
|
|
var_2 maps\_utility::set_force_color( var_0 );
|
|
continue;
|
|
}
|
|
|
|
if ( isdefined( var_2.spawner ) )
|
|
{
|
|
var_2.spawner.script_forcecolor = var_0;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
|
|
update_steering( var_0 )
|
|
{
|
|
if ( var_0.update_time == gettime() )
|
|
return var_0.steering;
|
|
|
|
var_0.update_time = gettime();
|
|
|
|
if ( var_0.steering_enable )
|
|
{
|
|
var_1 = clamp( 0 - var_0.angles[2], 0 - var_0.steering_maxroll, var_0.steering_maxroll ) / var_0.steering_maxroll;
|
|
|
|
if ( isdefined( var_0.leanasitturns ) && var_0.leanasitturns )
|
|
{
|
|
var_2 = var_0 vehicle_getsteering();
|
|
var_2 = var_2 * -1.0;
|
|
var_1 = var_1 + var_2;
|
|
|
|
if ( var_1 != 0 )
|
|
{
|
|
var_3 = 1.0 / abs( var_1 );
|
|
|
|
if ( var_3 < 1 )
|
|
var_1 = var_1 * var_3;
|
|
}
|
|
}
|
|
|
|
var_4 = var_1 - var_0.steering;
|
|
|
|
if ( var_4 != 0 )
|
|
{
|
|
var_5 = var_0.steering_maxdelta / abs( var_4 );
|
|
|
|
if ( var_5 < 1 )
|
|
var_4 = var_4 * var_5;
|
|
|
|
var_0.steering = var_0.steering + var_4;
|
|
}
|
|
}
|
|
else
|
|
var_0.steering = 0;
|
|
|
|
return var_0.steering;
|
|
}
|
|
|
|
get_from_spawnstruct( var_0 )
|
|
{
|
|
return common_scripts\utility::getstruct( var_0, "targetname" );
|
|
}
|
|
|
|
get_from_entity( var_0 )
|
|
{
|
|
var_1 = getentarray( var_0, "targetname" );
|
|
|
|
if ( isdefined( var_1 ) && var_1.size > 0 )
|
|
return var_1[randomint( var_1.size )];
|
|
|
|
return undefined;
|
|
}
|
|
|
|
get_from_spawnstruct_target( var_0 )
|
|
{
|
|
return common_scripts\utility::getstruct( var_0, "target" );
|
|
}
|
|
|
|
get_from_entity_target( var_0 )
|
|
{
|
|
return getent( var_0, "target" );
|
|
}
|
|
|
|
get_from_vehicle_node( var_0 )
|
|
{
|
|
return getvehiclenode( var_0, "targetname" );
|
|
}
|
|
|
|
set_lookat_from_dest( var_0 )
|
|
{
|
|
var_1 = getent( var_0.script_linkto, "script_linkname" );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
return;
|
|
|
|
self setlookatent( var_1 );
|
|
self.set_lookat_point = 1;
|
|
}
|
|
|
|
damage_hint_bullet_only()
|
|
{
|
|
level.armordamagehints = 0;
|
|
self.displayingdamagehints = 0;
|
|
thread damage_hints_cleanup();
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
self waittill( "damage", var_0, var_1, var_2, var_3, var_4 );
|
|
|
|
if ( !isplayer( var_1 ) )
|
|
continue;
|
|
|
|
if ( isdefined( self.has_semtex_on_it ) )
|
|
continue;
|
|
|
|
var_4 = tolower( var_4 );
|
|
|
|
switch ( var_4 )
|
|
{
|
|
case "bullet":
|
|
case "mod_rifle_bullet":
|
|
case "mod_pistol_bullet":
|
|
if ( !level.armordamagehints )
|
|
{
|
|
if ( isdefined( level.thrown_semtex_grenades ) && level.thrown_semtex_grenades > 0 )
|
|
break;
|
|
|
|
level.armordamagehints = 1;
|
|
self.displayingdamagehints = 1;
|
|
var_1 maps\_utility::display_hint( "invulerable_bullets" );
|
|
wait 4;
|
|
level.armordamagehints = 0;
|
|
|
|
if ( isdefined( self ) )
|
|
self.displayingdamagehints = 0;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
damage_hints()
|
|
{
|
|
level.armordamagehints = 0;
|
|
self.displayingdamagehints = 0;
|
|
thread damage_hints_cleanup();
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
self waittill( "damage", var_0, var_1, var_2, var_3, var_4 );
|
|
|
|
if ( !isplayer( var_1 ) )
|
|
continue;
|
|
|
|
if ( isdefined( self.has_semtex_on_it ) )
|
|
continue;
|
|
|
|
var_4 = tolower( var_4 );
|
|
|
|
switch ( var_4 )
|
|
{
|
|
case "bullet":
|
|
case "mod_rifle_bullet":
|
|
case "mod_pistol_bullet":
|
|
case "mod_grenade_splash":
|
|
case "mod_grenade":
|
|
if ( !level.armordamagehints )
|
|
{
|
|
if ( isdefined( level.thrown_semtex_grenades ) && level.thrown_semtex_grenades > 0 )
|
|
break;
|
|
|
|
level.armordamagehints = 1;
|
|
self.displayingdamagehints = 1;
|
|
|
|
if ( var_4 == "mod_grenade" || var_4 == "mod_grenade_splash" )
|
|
var_1 maps\_utility::display_hint( "invulerable_frags" );
|
|
else
|
|
var_1 maps\_utility::display_hint( "invulerable_bullets" );
|
|
|
|
wait 4;
|
|
level.armordamagehints = 0;
|
|
|
|
if ( isdefined( self ) )
|
|
self.displayingdamagehints = 0;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
damage_hints_cleanup()
|
|
{
|
|
self waittill( "death" );
|
|
|
|
if ( self.displayingdamagehints )
|
|
level.armordamagehints = 0;
|
|
}
|
|
|
|
copy_attachments( var_0 )
|
|
{
|
|
var_1 = self getattachsize();
|
|
var_2 = [];
|
|
|
|
for ( var_3 = 0; var_3 < var_1; var_3++ )
|
|
var_2[var_3] = tolower( self getattachmodelname( var_3 ) );
|
|
|
|
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
|
|
var_0 attach( var_2[var_3], tolower( self getattachtagname( var_3 ) ) );
|
|
}
|
|
|
|
lights_off( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = strtok( var_0, " ", var_1 );
|
|
common_scripts\utility::array_levelthread( var_3, ::lights_off_internal, var_1, var_2 );
|
|
}
|
|
|
|
aircraft_wash_thread( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "death_finished" );
|
|
self notify( "stop_kicking_up_dust" );
|
|
self endon( "stop_kicking_up_dust" );
|
|
var_1 = 350;
|
|
var_2 = 2000;
|
|
|
|
if ( isdefined( level.treadfx_maxheight ) )
|
|
var_2 = level.treadfx_maxheight;
|
|
|
|
var_3 = 100 / var_2;
|
|
var_4 = 0.15;
|
|
var_5 = 0.05;
|
|
var_6 = 0.5;
|
|
var_7 = 3;
|
|
var_8 = var_7;
|
|
var_9 = _isairplane();
|
|
|
|
if ( var_9 )
|
|
var_6 = 0.15;
|
|
|
|
var_10 = undefined;
|
|
var_11 = undefined;
|
|
var_12 = self;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_12 = var_0;
|
|
|
|
var_13 = ( 0, 0, 1 );
|
|
var_14 = "";
|
|
|
|
for (;;)
|
|
{
|
|
wait( var_6 );
|
|
var_15 = anglestoup( var_12.angles ) * -1;
|
|
var_8++;
|
|
|
|
if ( var_8 > var_7 )
|
|
{
|
|
var_8 = var_7;
|
|
var_10 = bullettrace( var_12.origin, var_12.origin + var_15 * var_2, 0, var_12 );
|
|
}
|
|
|
|
if ( var_10["fraction"] == 1 || var_10["fraction"] < var_3 )
|
|
continue;
|
|
|
|
var_16 = distance( var_12.origin, var_10["position"] );
|
|
var_17 = get_wash_fx( self, var_10, var_15, var_16 );
|
|
|
|
if ( !isdefined( var_17 ) )
|
|
continue;
|
|
|
|
var_6 = ( var_16 - var_1 ) / ( var_2 - var_1 ) * ( var_4 - var_5 ) + var_5;
|
|
var_6 = max( var_6, var_5 );
|
|
|
|
if ( !isdefined( var_10 ) )
|
|
continue;
|
|
|
|
if ( !isdefined( var_10["position"] ) )
|
|
continue;
|
|
|
|
var_18 = var_10["position"];
|
|
var_19 = var_10["normal"];
|
|
var_16 = vectordot( var_18 - var_12.origin, var_19 );
|
|
var_20 = var_12.origin + ( 0, 0, var_16 );
|
|
var_13 = var_18 - var_20;
|
|
|
|
if ( vectordot( var_10["normal"], ( 0, 0, 1 ) ) == -1 )
|
|
continue;
|
|
|
|
if ( length( var_13 ) < 1 )
|
|
var_13 = var_12.angles + ( 0, 180, 0 );
|
|
|
|
playfx( var_17, var_18, var_19, var_13 );
|
|
}
|
|
}
|
|
|
|
debug_draw_arrow( var_0, var_1, var_2 )
|
|
{
|
|
|
|
}
|
|
|
|
get_wash_fx( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = var_1["surfacetype"];
|
|
var_5 = undefined;
|
|
var_6 = vectordot( ( 0, 0, -1 ), var_2 );
|
|
|
|
if ( var_6 >= 0.97 )
|
|
var_5 = undefined;
|
|
else if ( var_6 >= 0.92 )
|
|
var_5 = "_bank";
|
|
else
|
|
var_5 = "_bank_lg";
|
|
|
|
return get_wash_effect( var_0.classname, var_4, var_5 );
|
|
}
|
|
|
|
get_wash_effect( var_0, var_1, var_2 )
|
|
{
|
|
if ( isdefined( var_2 ) )
|
|
{
|
|
var_3 = var_1 + var_2;
|
|
|
|
if ( !isdefined( level._vehicle_effect[var_0][var_3] ) && var_1 != "default" )
|
|
return get_wash_effect( var_0, "default", var_2 );
|
|
else
|
|
return level._vehicle_effect[var_0][var_3];
|
|
}
|
|
|
|
return get_vehicle_effect( var_0, var_1 );
|
|
}
|
|
|
|
get_vehicle_effect( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( level._vehicle_effect[var_0][var_1] ) && var_1 != "default" )
|
|
return get_vehicle_effect( var_0, "default" );
|
|
else
|
|
return level._vehicle_effect[var_0][var_1];
|
|
|
|
return undefined;
|
|
}
|
|
|
|
no_treads()
|
|
{
|
|
return _ishelicopter() || _isairplane();
|
|
}
|
|
|
|
vehicle_treads()
|
|
{
|
|
var_0 = self.classname;
|
|
|
|
if ( !isdefined( level._vehicle_effect[var_0] ) )
|
|
return;
|
|
|
|
if ( no_treads() )
|
|
return;
|
|
|
|
if ( isdefined( level.tread_override_thread ) )
|
|
self thread [[ level.tread_override_thread ]]( "tag_origin", "back_left", ( 160, 0, 0 ) );
|
|
else
|
|
{
|
|
if ( isdefined( level.vehicle_single_tread_list ) && isdefined( level.vehicle_single_tread_list[self.vehicletype] ) )
|
|
{
|
|
thread do_single_tread();
|
|
return;
|
|
}
|
|
|
|
thread do_multiple_treads();
|
|
}
|
|
}
|
|
|
|
do_multiple_treads()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "kill_treads_forever" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = tread_wait();
|
|
|
|
if ( var_0 == -1 )
|
|
{
|
|
wait 0.1;
|
|
continue;
|
|
}
|
|
|
|
var_1 = _get_dummy();
|
|
tread( var_1, var_0, "tag_wheel_back_left", "back_left", 0 );
|
|
wait 0.05;
|
|
tread( var_1, var_0, "tag_wheel_back_right", "back_right", 0 );
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
tread_wait()
|
|
{
|
|
var_0 = self vehicle_getspeed();
|
|
|
|
if ( !var_0 )
|
|
return -1;
|
|
|
|
var_0 = var_0 * 17.6;
|
|
var_1 = 1 / var_0;
|
|
var_1 = clamp( var_1 * 35, 0.1, 0.3 );
|
|
|
|
if ( isdefined( self.treadfx_freq_scale ) )
|
|
var_1 = var_1 * self.treadfx_freq_scale;
|
|
|
|
wait( var_1 );
|
|
return var_1;
|
|
}
|
|
|
|
tread( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
var_6 = get_treadfx( self, var_3 );
|
|
|
|
if ( !isdefined( var_6 ) )
|
|
return;
|
|
|
|
var_7 = var_0 gettagangles( var_2 );
|
|
var_8 = anglestoforward( var_7 );
|
|
var_9 = self gettagorigin( var_2 );
|
|
|
|
if ( var_4 )
|
|
{
|
|
var_10 = self gettagorigin( var_5 );
|
|
var_9 = ( var_9 + var_10 ) / 2;
|
|
}
|
|
|
|
playfx( var_6, var_9, anglestoup( var_7 ), var_8 * var_1 );
|
|
}
|
|
|
|
get_treadfx( var_0, var_1 )
|
|
{
|
|
var_2 = self getwheelsurface( var_1 );
|
|
|
|
if ( !isdefined( var_0.vehicletype ) )
|
|
{
|
|
var_3 = -1;
|
|
return var_3;
|
|
}
|
|
|
|
var_4 = var_0.classname;
|
|
return get_vehicle_effect( var_4, var_2 );
|
|
}
|
|
|
|
do_single_tread()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "kill_treads_forever" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = tread_wait();
|
|
|
|
if ( var_0 == -1 )
|
|
{
|
|
wait 0.1;
|
|
continue;
|
|
}
|
|
|
|
var_1 = _get_dummy();
|
|
var_1 tread( var_1, var_0, "tag_wheel_back_left", "back_left", 1, "tag_wheel_back_right" );
|
|
}
|
|
}
|
|
|
|
_ishelicopter()
|
|
{
|
|
return isdefined( level.helicopter_list[self.vehicletype] );
|
|
}
|
|
|
|
_isairplane()
|
|
{
|
|
return isdefined( level.airplane_list[self.vehicletype] );
|
|
}
|
|
|
|
ischeap()
|
|
{
|
|
if ( !isdefined( self.script_cheap ) )
|
|
return 0;
|
|
|
|
if ( !self.script_cheap )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
hashelicopterdustkickup()
|
|
{
|
|
if ( !_ishelicopter() && !_isairplane() )
|
|
return 0;
|
|
|
|
if ( ischeap() )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
hashelicopterturret()
|
|
{
|
|
if ( !isdefined( self.vehicletype ) )
|
|
return 0;
|
|
|
|
if ( ischeap() )
|
|
return 0;
|
|
|
|
if ( self.vehicletype == "cobra" )
|
|
return 1;
|
|
|
|
if ( self.vehicletype == "cobra_player" )
|
|
return 1;
|
|
|
|
if ( self.vehicletype == "viper" )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
disconnect_paths_whenstopped()
|
|
{
|
|
self endon( "death" );
|
|
var_0 = 0;
|
|
|
|
if ( isdefined( self.script_disconnectpaths ) && !self.script_disconnectpaths )
|
|
var_0 = 1;
|
|
|
|
if ( var_0 )
|
|
{
|
|
self.dontdisconnectpaths = 1;
|
|
return;
|
|
}
|
|
|
|
wait( randomfloat( 1 ) );
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
if ( self vehicle_getspeed() < 1 )
|
|
{
|
|
if ( !isdefined( self.dontdisconnectpaths ) )
|
|
self disconnectpaths();
|
|
else
|
|
{
|
|
|
|
}
|
|
|
|
self notify( "speed_zero_path_disconnect" );
|
|
|
|
while ( self vehicle_getspeed() < 1 )
|
|
wait 0.05;
|
|
}
|
|
|
|
self connectpaths();
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
mginit()
|
|
{
|
|
var_0 = self.classname;
|
|
|
|
if ( isdefined( self.script_nomg ) && self.script_nomg > 0 )
|
|
return;
|
|
|
|
if ( !isdefined( level.vehicle_mgturret[var_0] ) )
|
|
return;
|
|
|
|
var_1 = 0;
|
|
|
|
if ( isdefined( self.script_mg_angle ) )
|
|
var_1 = self.script_mg_angle;
|
|
|
|
var_2 = level.vehicle_mgturret[var_0];
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
return;
|
|
|
|
var_3 = isdefined( self.script_noteworthy ) && self.script_noteworthy == "onemg";
|
|
|
|
foreach ( var_7, var_5 in var_2 )
|
|
{
|
|
var_6 = spawnturret( "misc_turret", ( 0, 0, 0 ), var_5.info );
|
|
|
|
if ( isdefined( var_5.offset_tag ) )
|
|
var_6 linkto( self, var_5.tag, var_5.offset_tag, ( 0, -1 * var_1, 0 ) );
|
|
else
|
|
var_6 linkto( self, var_5.tag, ( 0, 0, 0 ), ( 0, -1 * var_1, 0 ) );
|
|
|
|
var_6 setmodel( var_5.model );
|
|
var_6.angles = self.angles;
|
|
var_6.isvehicleattached = 1;
|
|
var_6.ownervehicle = self;
|
|
var_6.script_team = self.script_team;
|
|
var_6 thread maps\_mgturret::burst_fire_unmanned();
|
|
var_6 makeunusable();
|
|
set_turret_team( var_6 );
|
|
level thread maps\_mgturret::mg42_setdifficulty( var_6, maps\_utility::getdifficulty() );
|
|
|
|
if ( isdefined( self.script_fireondrones ) )
|
|
var_6.script_fireondrones = self.script_fireondrones;
|
|
|
|
if ( isdefined( var_5.deletedelay ) )
|
|
var_6.deletedelay = var_5.deletedelay;
|
|
|
|
if ( isdefined( var_5.maxrange ) )
|
|
var_6.maxrange = var_5.maxrange;
|
|
|
|
if ( isdefined( var_5.defaultdroppitch ) )
|
|
var_6 setdefaultdroppitch( var_5.defaultdroppitch );
|
|
|
|
self.mgturret[var_7] = var_6;
|
|
|
|
if ( var_3 )
|
|
break;
|
|
}
|
|
|
|
foreach ( var_10, var_6 in self.mgturret )
|
|
{
|
|
var_9 = level.vehicle_mgturret[var_0][var_10].defaultonmode;
|
|
|
|
if ( isdefined( var_9 ) )
|
|
var_6 turret_set_default_on_mode( var_9 );
|
|
}
|
|
|
|
if ( !isdefined( self.script_turretmg ) )
|
|
self.script_turretmg = 1;
|
|
|
|
if ( self.script_turretmg == 0 )
|
|
thread _mgoff();
|
|
else
|
|
{
|
|
self.script_turretmg = 1;
|
|
thread _mgon();
|
|
}
|
|
}
|
|
|
|
turret_set_default_on_mode( var_0 )
|
|
{
|
|
self.defaultonmode = var_0;
|
|
}
|
|
|
|
set_turret_team( var_0 )
|
|
{
|
|
switch ( self.script_team )
|
|
{
|
|
case "allies":
|
|
case "friendly":
|
|
var_0 setturretteam( "allies" );
|
|
break;
|
|
case "axis":
|
|
case "enemy":
|
|
var_0 setturretteam( "axis" );
|
|
break;
|
|
case "team3":
|
|
var_0 setturretteam( "team3" );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
animate_drive_idle()
|
|
{
|
|
self endon( "suspend_drive_anims" );
|
|
|
|
if ( !isdefined( self.wheeldir ) )
|
|
self.wheeldir = 1;
|
|
|
|
var_0 = self.model;
|
|
var_1 = -1;
|
|
var_2 = undefined;
|
|
self useanimtree( #animtree );
|
|
|
|
if ( !isdefined( level.vehicle_driveidle[var_0] ) )
|
|
return;
|
|
|
|
if ( !isdefined( level.vehicle_driveidle_r[var_0] ) )
|
|
level.vehicle_driveidle_r[var_0] = level.vehicle_driveidle[var_0];
|
|
|
|
self endon( "death" );
|
|
var_3 = level.vehicle_driveidle_normal_speed[var_0];
|
|
var_4 = 1.0;
|
|
|
|
if ( isdefined( level.vehicle_driveidle_animrate ) && isdefined( level.vehicle_driveidle_animrate[var_0] ) )
|
|
var_4 = level.vehicle_driveidle_animrate[var_0];
|
|
|
|
var_5 = self.wheeldir;
|
|
var_6 = self;
|
|
var_7 = level.vehicle_driveidle[var_0];
|
|
|
|
for (;;)
|
|
{
|
|
if ( isdefined( level.animate_drive_idle_on_dummies ) )
|
|
var_6 = _get_dummy();
|
|
|
|
if ( !var_3 )
|
|
{
|
|
if ( isdefined( self.suspend_driveanims ) )
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
var_6 setanim( level.vehicle_driveidle[var_0], 1, 0.2, var_4 );
|
|
return;
|
|
}
|
|
|
|
var_8 = self vehicle_getspeed();
|
|
|
|
if ( self.modeldummyon && isdefined( self.dummyspeed ) )
|
|
var_8 = self.dummyspeed;
|
|
|
|
if ( var_5 != self.wheeldir )
|
|
{
|
|
var_9 = 0;
|
|
|
|
if ( self.wheeldir )
|
|
{
|
|
var_7 = level.vehicle_driveidle[var_0];
|
|
var_9 = 1 - var_6 getnormalanimtime( level.vehicle_driveidle_r[var_0] );
|
|
var_6 clearanim( level.vehicle_driveidle_r[var_0], 0 );
|
|
}
|
|
else
|
|
{
|
|
var_7 = level.vehicle_driveidle_r[var_0];
|
|
var_9 = 1 - var_6 getnormalanimtime( level.vehicle_driveidle[var_0] );
|
|
var_6 clearanim( level.vehicle_driveidle[var_0], 0 );
|
|
}
|
|
|
|
var_2 = 0.01;
|
|
|
|
if ( var_2 >= 1 || var_2 == 0 )
|
|
var_2 = 0.01;
|
|
|
|
var_5 = self.wheeldir;
|
|
}
|
|
|
|
var_10 = var_8 / var_3;
|
|
|
|
if ( var_10 != var_1 )
|
|
{
|
|
var_6 setanim( var_7, 1, 0.05, var_10 );
|
|
var_1 = var_10;
|
|
}
|
|
|
|
if ( isdefined( var_2 ) )
|
|
{
|
|
var_6 setanimtime( var_7, var_2 );
|
|
var_2 = undefined;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
setup_dynamic_detour( var_0, var_1 )
|
|
{
|
|
var_2 = [[ var_1 ]]( var_0.targetname );
|
|
var_2.detoured = 0;
|
|
}
|
|
|
|
setup_ai()
|
|
{
|
|
foreach ( var_1 in getaiarray() )
|
|
{
|
|
if ( isdefined( var_1.script_vehicleride ) )
|
|
level.vehicle_rideai = array_2dadd( level.vehicle_rideai, var_1.script_vehicleride, var_1 );
|
|
}
|
|
|
|
foreach ( var_1 in getspawnerarray() )
|
|
{
|
|
if ( isdefined( var_1.script_vehicleride ) )
|
|
level.vehicle_ridespawners = array_2dadd( level.vehicle_ridespawners, var_1.script_vehicleride, var_1 );
|
|
}
|
|
|
|
if ( isdefined( level.spawn_pool_enabled ) )
|
|
{
|
|
foreach ( var_6 in level.struct )
|
|
{
|
|
if ( isdefined( var_6.script_vehicleride ) && isdefined( var_6.script_spawn_pool ) )
|
|
level.vehicle_ridespawners = array_2dadd( level.vehicle_ridespawners, var_6.script_vehicleride, var_6 );
|
|
}
|
|
}
|
|
}
|
|
|
|
array_2dadd( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( var_0[var_1] ) )
|
|
var_0[var_1] = [];
|
|
|
|
var_0[var_1][var_0[var_1].size] = var_2;
|
|
return var_0;
|
|
}
|
|
|
|
is_node_script_origin( var_0 )
|
|
{
|
|
return isdefined( var_0.classname ) && var_0.classname == "script_origin";
|
|
}
|
|
|
|
node_trigger_process()
|
|
{
|
|
var_0 = 0;
|
|
|
|
if ( isdefined( self.spawnflags ) && self.spawnflags & 1 )
|
|
{
|
|
if ( isdefined( self.script_crashtype ) )
|
|
level.vehicle_crashpaths[level.vehicle_crashpaths.size] = self;
|
|
|
|
level.vehicle_startnodes[level.vehicle_startnodes.size] = self;
|
|
}
|
|
|
|
if ( isdefined( self.script_vehicledetour ) && isdefined( self.targetname ) )
|
|
{
|
|
var_1 = undefined;
|
|
|
|
if ( isdefined( get_from_entity( self.targetname ) ) )
|
|
var_1 = ::get_from_entity_target;
|
|
|
|
if ( isdefined( get_from_spawnstruct( self.targetname ) ) )
|
|
var_1 = ::get_from_spawnstruct_target;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
setup_dynamic_detour( self, var_1 );
|
|
var_0 = 1;
|
|
}
|
|
else
|
|
setup_groundnode_detour( self );
|
|
|
|
level.vehicle_detourpaths = array_2dadd( level.vehicle_detourpaths, self.script_vehicledetour, self );
|
|
|
|
if ( level.vehicle_detourpaths[self.script_vehicledetour].size > 2 )
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
if ( isdefined( self.script_gatetrigger ) )
|
|
{
|
|
level.vehicle_gatetrigger = array_2dadd( level.vehicle_gatetrigger, self.script_gatetrigger, self );
|
|
self.gateopen = 0;
|
|
}
|
|
|
|
if ( isdefined( self.script_flag_set ) )
|
|
{
|
|
if ( !isdefined( level.flag[self.script_flag_set] ) )
|
|
common_scripts\utility::flag_init( self.script_flag_set );
|
|
}
|
|
|
|
if ( isdefined( self.script_flag_clear ) )
|
|
{
|
|
if ( !isdefined( level.flag[self.script_flag_clear] ) )
|
|
common_scripts\utility::flag_init( self.script_flag_clear );
|
|
}
|
|
|
|
if ( isdefined( self.script_flag_wait ) )
|
|
{
|
|
if ( !isdefined( level.flag[self.script_flag_wait] ) )
|
|
common_scripts\utility::flag_init( self.script_flag_wait );
|
|
}
|
|
|
|
if ( isdefined( self.script_vehiclespawngroup ) || isdefined( self.script_vehiclestartmove ) || isdefined( self.script_gatetrigger ) || isdefined( self.script_vehiclegroupdelete ) )
|
|
var_0 = 1;
|
|
|
|
if ( var_0 )
|
|
add_proccess_trigger( self );
|
|
}
|
|
|
|
setup_triggers()
|
|
{
|
|
level.vehicle_processtriggers = [];
|
|
var_0 = [];
|
|
var_0 = common_scripts\utility::array_combine( getallvehiclenodes(), getentarray( "script_origin", "code_classname" ) );
|
|
var_0 = common_scripts\utility::array_combine( var_0, level.struct );
|
|
var_0 = common_scripts\utility::array_combine( var_0, getentarray( "trigger_radius", "code_classname" ) );
|
|
var_0 = common_scripts\utility::array_combine( var_0, getentarray( "trigger_disk", "code_classname" ) );
|
|
var_0 = common_scripts\utility::array_combine( var_0, getentarray( "trigger_multiple", "code_classname" ) );
|
|
var_0 = common_scripts\utility::array_combine( var_0, getentarray( "trigger_lookat", "code_classname" ) );
|
|
common_scripts\utility::array_thread( var_0, ::node_trigger_process );
|
|
}
|
|
|
|
is_node_script_struct( var_0 )
|
|
{
|
|
if ( !isdefined( var_0.targetname ) )
|
|
return 0;
|
|
|
|
return isdefined( common_scripts\utility::getstruct( var_0.targetname, "targetname" ) );
|
|
}
|
|
|
|
setup_vehicles( var_0 )
|
|
{
|
|
var_1 = [];
|
|
level.failed_spawnvehicles = [];
|
|
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
if ( var_3 check_spawn_group_isspawner() )
|
|
continue;
|
|
else
|
|
var_1[var_1.size] = var_3;
|
|
}
|
|
|
|
check_failed_spawn_groups();
|
|
|
|
foreach ( var_6 in var_1 )
|
|
thread vehicle_init( var_6 );
|
|
}
|
|
|
|
check_failed_spawn_groups()
|
|
{
|
|
if ( !level.failed_spawnvehicles.size )
|
|
{
|
|
level.failed_spawnvehicles = undefined;
|
|
return;
|
|
}
|
|
|
|
foreach ( var_1 in level.failed_spawnvehicles )
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
check_spawn_group_isspawner()
|
|
{
|
|
if ( isdefined( self.script_vehiclespawngroup ) && !isspawner( self ) )
|
|
{
|
|
level.failed_spawnvehicles[level.failed_spawnvehicles.size] = self;
|
|
return 1;
|
|
}
|
|
|
|
return isspawner( self );
|
|
}
|
|
|
|
vehicle_life()
|
|
{
|
|
var_0 = self.classname;
|
|
|
|
if ( !isdefined( level.vehicle_life ) || !isdefined( level.vehicle_life[var_0] ) )
|
|
wait 2;
|
|
|
|
if ( isdefined( self.script_startinghealth ) )
|
|
self.health = self.script_startinghealth;
|
|
else if ( level.vehicle_life[var_0] == -1 )
|
|
return;
|
|
else if ( isdefined( level.vehicle_life_range_low[var_0] ) && isdefined( level.vehicle_life_range_high[var_0] ) )
|
|
self.health = randomint( level.vehicle_life_range_high[var_0] - level.vehicle_life_range_low[var_0] ) + level.vehicle_life_range_low[var_0];
|
|
else
|
|
self.health = level.vehicle_life[var_0];
|
|
|
|
if ( isdefined( level.destructible_model[self.model] ) )
|
|
{
|
|
self.health = 2000;
|
|
self.destructible_type = level.destructible_model[self.model];
|
|
common_scripts\_destructible::setup_destructibles( 1 );
|
|
}
|
|
}
|
|
|
|
setturretfireondrones( var_0 )
|
|
{
|
|
if ( isdefined( self.mgturret ) && self.mgturret.size )
|
|
{
|
|
foreach ( var_2 in self.mgturret )
|
|
var_2.script_fireondrones = var_0;
|
|
}
|
|
}
|
|
|
|
getnormalanimtime( var_0 )
|
|
{
|
|
var_1 = self getanimtime( var_0 );
|
|
var_2 = getanimlength( var_0 );
|
|
|
|
if ( var_1 == 0 )
|
|
return 0;
|
|
|
|
return self getanimtime( var_0 ) / getanimlength( var_0 );
|
|
}
|
|
|
|
rotor_anim()
|
|
{
|
|
var_0 = getanimlength( maps\_utility::getanim( "rotors" ) );
|
|
|
|
for (;;)
|
|
{
|
|
self setanim( maps\_utility::getanim( "rotors" ), 1, 0, 1 );
|
|
wait( var_0 );
|
|
}
|
|
}
|
|
|
|
suspend_drive_anims()
|
|
{
|
|
self notify( "suspend_drive_anims" );
|
|
var_0 = self.model;
|
|
self clearanim( level.vehicle_driveidle[var_0], 0 );
|
|
self clearanim( level.vehicle_driveidle_r[var_0], 0 );
|
|
}
|
|
|
|
idle_animations()
|
|
{
|
|
self useanimtree( #animtree );
|
|
|
|
if ( !isdefined( level.vehicle_idleanim[self.model] ) )
|
|
return;
|
|
|
|
foreach ( var_1 in level.vehicle_idleanim[self.model] )
|
|
self setanim( var_1 );
|
|
}
|
|
|
|
vehicle_rumble()
|
|
{
|
|
self endon( "kill_rumble_forever" );
|
|
var_0 = self.classname;
|
|
var_1 = undefined;
|
|
|
|
if ( isdefined( self.vehicle_rumble_unique ) )
|
|
var_1 = self.vehicle_rumble_unique;
|
|
else if ( isdefined( level.vehicle_rumble_override ) && isdefined( level.vehicle_rumble_override[var_0] ) )
|
|
var_1 = level.vehicle_rumble_override;
|
|
else if ( isdefined( level.vehicle_rumble[var_0] ) )
|
|
var_1 = level.vehicle_rumble[var_0];
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
return;
|
|
|
|
var_2 = var_1.radius * 2;
|
|
var_3 = -1 * var_1.radius;
|
|
var_4 = spawn( "trigger_radius", self.origin + ( 0, 0, var_3 ), 0, var_1.radius, var_2 );
|
|
var_4 enablelinkto();
|
|
var_4 linkto( self );
|
|
self.rumbletrigger = var_4;
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( self.rumbleon ) )
|
|
self.rumbleon = 1;
|
|
|
|
if ( isdefined( var_1.scale ) )
|
|
self.rumble_scale = var_1.scale;
|
|
else
|
|
self.rumble_scale = 0.15;
|
|
|
|
if ( isdefined( var_1.duration ) )
|
|
self.rumble_duration = var_1.duration;
|
|
else
|
|
self.rumble_duration = 4.5;
|
|
|
|
if ( isdefined( var_1.radius ) )
|
|
self.rumble_radius = var_1.radius;
|
|
else
|
|
self.rumble_radius = 600;
|
|
|
|
if ( isdefined( var_1.basetime ) )
|
|
self.rumble_basetime = var_1.basetime;
|
|
else
|
|
self.rumble_basetime = 1;
|
|
|
|
if ( isdefined( var_1.randomaditionaltime ) )
|
|
self.rumble_randomaditionaltime = var_1.randomaditionaltime;
|
|
else
|
|
self.rumble_randomaditionaltime = 1;
|
|
|
|
var_4.radius = self.rumble_radius;
|
|
|
|
for (;;)
|
|
{
|
|
var_4 waittill( "trigger" );
|
|
|
|
if ( self vehicle_getspeed() == 0 || !self.rumbleon )
|
|
{
|
|
wait 0.1;
|
|
continue;
|
|
}
|
|
|
|
self playrumblelooponentity( var_1.rumble );
|
|
|
|
while ( level.player istouching( var_4 ) && self.rumbleon && self vehicle_getspeed() > 0 )
|
|
{
|
|
earthquake( self.rumble_scale, self.rumble_duration, self.origin, self.rumble_radius );
|
|
wait( self.rumble_basetime + randomfloat( self.rumble_randomaditionaltime ) );
|
|
}
|
|
|
|
self stoprumble( var_1.rumble );
|
|
}
|
|
}
|
|
|
|
vehicle_kill_treads_forever()
|
|
{
|
|
self notify( "kill_treads_forever" );
|
|
}
|
|
|
|
isstationary()
|
|
{
|
|
var_0 = self.vehicletype;
|
|
|
|
if ( isdefined( level.vehicle_isstationary[var_0] ) && level.vehicle_isstationary[var_0] )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
vehicle_shoot_shock()
|
|
{
|
|
if ( !isdefined( level.vehicle_shoot_shock[self.classname] ) )
|
|
return;
|
|
|
|
if ( getdvar( "disable_tank_shock_minspec" ) == "1" )
|
|
return;
|
|
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( level.vehicle_shoot_shock_overlay ) )
|
|
{
|
|
level.vehicle_shoot_shock_overlay = newhudelem();
|
|
level.vehicle_shoot_shock_overlay.x = 0;
|
|
level.vehicle_shoot_shock_overlay.y = 0;
|
|
level.vehicle_shoot_shock_overlay setshader( "black", 640, 480 );
|
|
level.vehicle_shoot_shock_overlay.alignx = "left";
|
|
level.vehicle_shoot_shock_overlay.aligny = "top";
|
|
level.vehicle_shoot_shock_overlay.horzalign = "fullscreen";
|
|
level.vehicle_shoot_shock_overlay.vertalign = "fullscreen";
|
|
level.vehicle_shoot_shock_overlay.alpha = 0;
|
|
}
|
|
|
|
self endon( "stop_vehicle_shoot_shock" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "weapon_fired" );
|
|
|
|
if ( isdefined( self.shock_distance ) )
|
|
var_0 = self.shock_distance;
|
|
else
|
|
var_0 = 400;
|
|
|
|
if ( isdefined( self.black_distance ) )
|
|
var_1 = self.black_distance;
|
|
else
|
|
var_1 = 800;
|
|
|
|
var_2 = distance( self.origin, level.player.origin );
|
|
|
|
if ( var_2 > var_1 )
|
|
continue;
|
|
|
|
level.vehicle_shoot_shock_overlay.alpha = 0.5;
|
|
level.vehicle_shoot_shock_overlay fadeovertime( 0.2 );
|
|
level.vehicle_shoot_shock_overlay.alpha = 0;
|
|
|
|
if ( var_2 > var_0 )
|
|
continue;
|
|
|
|
if ( isdefined( level.player.flashendtime ) && level.player.flashendtime - gettime() > 200 )
|
|
continue;
|
|
|
|
if ( isdefined( self.shellshock_audio_disabled ) && self.shellshock_audio_disabled )
|
|
continue;
|
|
|
|
var_3 = var_2 / var_0;
|
|
var_4 = 4 - 3 * var_3;
|
|
level.player shellshock( level.vehicle_shoot_shock[self.classname], var_4 );
|
|
}
|
|
}
|
|
|
|
vehicle_setteam()
|
|
{
|
|
var_0 = self.classname;
|
|
|
|
if ( !isdefined( self.script_team ) && isdefined( level.vehicle_team[var_0] ) )
|
|
self.script_team = level.vehicle_team[var_0];
|
|
|
|
level.vehicles[self.script_team] = common_scripts\utility::array_add( level.vehicles[self.script_team], self );
|
|
}
|
|
|
|
vehicle_handleunloadevent()
|
|
{
|
|
self endon( "death" );
|
|
var_0 = self.vehicletype;
|
|
|
|
if ( !maps\_utility::ent_flag_exist( "unloaded" ) )
|
|
maps\_utility::ent_flag_init( "unloaded" );
|
|
}
|
|
|
|
get_vehiclenode_any_dynamic( var_0 )
|
|
{
|
|
var_1 = getvehiclenode( var_0, "targetname" );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = getent( var_0, "targetname" );
|
|
else if ( _ishelicopter() )
|
|
{
|
|
|
|
}
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = common_scripts\utility::getstruct( var_0, "targetname" );
|
|
|
|
return var_1;
|
|
}
|
|
|
|
vehicle_resumepathvehicle()
|
|
{
|
|
if ( !_ishelicopter() )
|
|
{
|
|
self resumespeed( 35 );
|
|
return;
|
|
}
|
|
|
|
var_0 = undefined;
|
|
|
|
if ( isdefined( self.currentnode.target ) )
|
|
var_0 = get_vehiclenode_any_dynamic( self.currentnode.target );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return;
|
|
|
|
_vehicle_paths( var_0 );
|
|
}
|
|
|
|
has_frontarmor()
|
|
{
|
|
return isdefined( level.vehicle_frontarmor[self.vehicletype] );
|
|
}
|
|
|
|
grenadeshielded( var_0 )
|
|
{
|
|
if ( !isdefined( self.script_grenadeshield ) )
|
|
return 0;
|
|
|
|
var_0 = tolower( var_0 );
|
|
|
|
if ( !isdefined( var_0 ) || !issubstr( var_0, "grenade" ) )
|
|
return 0;
|
|
|
|
if ( self.script_grenadeshield )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
bulletshielded( var_0 )
|
|
{
|
|
if ( !isdefined( self.script_bulletshield ) )
|
|
return 0;
|
|
|
|
var_0 = tolower( var_0 );
|
|
|
|
if ( !isdefined( var_0 ) || !issubstr( var_0, "bullet" ) || issubstr( var_0, "explosive" ) )
|
|
return 0;
|
|
|
|
if ( self.script_bulletshield )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
explosive_bulletshielded( var_0 )
|
|
{
|
|
if ( !isdefined( self.script_explosive_bullet_shield ) )
|
|
return 0;
|
|
|
|
var_0 = tolower( var_0 );
|
|
|
|
if ( !isdefined( var_0 ) || !issubstr( var_0, "explosive" ) )
|
|
return 0;
|
|
|
|
if ( self.script_explosive_bullet_shield )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
vehicle_should_regenerate( var_0, var_1 )
|
|
{
|
|
return !isdefined( var_0 ) && self.script_team != "neutral" || attacker_isonmyteam( var_0 ) || attacker_troop_isonmyteam( var_0 ) || common_scripts\utility::isdestructible() || is_invulnerable_from_ai( var_0 ) || bulletshielded( var_1 ) || explosive_bulletshielded( var_1 ) || grenadeshielded( var_1 ) || var_1 == "MOD_MELEE";
|
|
}
|
|
|
|
friendlyfire_shield()
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( level.unstoppable_friendly_fire_shield ) )
|
|
self endon( "stop_friendlyfire_shield" );
|
|
|
|
var_0 = self.classname;
|
|
|
|
if ( isdefined( level.vehicle_bulletshield[var_0] ) && !isdefined( self.script_bulletshield ) )
|
|
self.script_bulletshield = level.vehicle_bulletshield[var_0];
|
|
|
|
if ( isdefined( level.vehicle_grenadeshield[var_0] ) && !isdefined( self.script_grenadeshield ) )
|
|
self.script_grenadeshield = level.vehicle_bulletshield[var_0];
|
|
|
|
if ( isdefined( self.script_mp_style_helicopter ) )
|
|
{
|
|
self.script_mp_style_helicopter = 1;
|
|
self.bullet_armor = 5000;
|
|
self.health = 350;
|
|
}
|
|
else
|
|
self.script_mp_style_helicopter = 0;
|
|
|
|
self.healthbuffer = 20000;
|
|
self.health = self.health + self.healthbuffer;
|
|
self.currenthealth = self.health;
|
|
var_1 = undefined;
|
|
var_2 = undefined;
|
|
|
|
for ( var_3 = undefined; self.health > 0; var_3 = undefined )
|
|
{
|
|
self waittill( "damage", var_4, var_1, var_5, var_6, var_2, var_7, var_8, var_9, var_10, var_3 );
|
|
|
|
foreach ( var_12 in self.damage_functions )
|
|
thread [[ var_12 ]]( var_4, var_1, var_5, var_6, var_2, var_7, var_8 );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_1 maps\_player_stats::register_shot_hit();
|
|
|
|
if ( vehicle_should_regenerate( var_1, var_2 ) || _is_godmode() )
|
|
self.health = self.currenthealth;
|
|
else if ( has_frontarmor() )
|
|
{
|
|
regen_front_armor( var_1, var_4 );
|
|
self.currenthealth = self.health;
|
|
}
|
|
else if ( hit_bullet_armor( var_2 ) )
|
|
{
|
|
self.health = self.currenthealth;
|
|
self.bullet_armor = self.bullet_armor - var_4;
|
|
}
|
|
else
|
|
self.currenthealth = self.health;
|
|
|
|
if ( common_scripts\_destructible::getdamagetype( var_2 ) == "splash" )
|
|
self.rocket_destroyed_for_achievement = 1;
|
|
else
|
|
self.rocket_destroyed_for_achievement = undefined;
|
|
|
|
if ( self.health < self.healthbuffer && !isdefined( self.vehicle_stays_alive ) )
|
|
break;
|
|
|
|
var_4 = undefined;
|
|
var_1 = undefined;
|
|
var_5 = undefined;
|
|
var_6 = undefined;
|
|
var_2 = undefined;
|
|
var_7 = undefined;
|
|
var_8 = undefined;
|
|
var_9 = undefined;
|
|
var_10 = undefined;
|
|
}
|
|
|
|
self notify( "death", var_1, var_2, var_3 );
|
|
}
|
|
|
|
hit_bullet_armor( var_0 )
|
|
{
|
|
if ( !self.script_mp_style_helicopter )
|
|
return 0;
|
|
|
|
if ( self.bullet_armor <= 0 )
|
|
return 0;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return 0;
|
|
|
|
if ( !issubstr( var_0, "BULLET" ) )
|
|
return 0;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
regen_front_armor( var_0, var_1 )
|
|
{
|
|
var_2 = anglestoforward( self.angles );
|
|
var_3 = vectornormalize( var_0.origin - self.origin );
|
|
|
|
if ( vectordot( var_2, var_3 ) > 0.86 )
|
|
self.health = self.health + int( var_1 * level.vehicle_frontarmor[self.vehicletype] );
|
|
}
|
|
|
|
_is_godmode()
|
|
{
|
|
if ( isdefined( self.godmode ) && self.godmode )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
is_invulnerable_from_ai( var_0 )
|
|
{
|
|
if ( !isdefined( self.script_ai_invulnerable ) )
|
|
return 0;
|
|
|
|
if ( isdefined( var_0 ) && isai( var_0 ) && self.script_ai_invulnerable == 1 )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
attacker_troop_isonmyteam( var_0 )
|
|
{
|
|
if ( isdefined( self.script_team ) && self.script_team == "allies" && isdefined( var_0 ) && isplayer( var_0 ) )
|
|
return 1;
|
|
else if ( isai( var_0 ) && var_0.team == self.script_team )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
attacker_isonmyteam( var_0 )
|
|
{
|
|
if ( isdefined( var_0 ) && isdefined( var_0.script_team ) && isdefined( self.script_team ) && var_0.script_team == self.script_team )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
vehicle_badplace()
|
|
{
|
|
return _vehicle_badplace();
|
|
}
|
|
|
|
wheeldirectionchange( var_0 )
|
|
{
|
|
self.wheeldir = common_scripts\utility::ter_op( var_0 <= 0, 0, 1 );
|
|
}
|
|
|
|
maingun_fx()
|
|
{
|
|
if ( isdefined( level.maingun_fx_override ) )
|
|
{
|
|
thread [[ level.maingun_fx_override ]]();
|
|
return;
|
|
}
|
|
|
|
var_0 = self.model;
|
|
|
|
if ( !isdefined( level.vehicle_deckdust[var_0] ) )
|
|
return;
|
|
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "weapon_fired" );
|
|
playfxontag( level.vehicle_deckdust[var_0], self, "tag_engine_exhaust" );
|
|
var_1 = self gettagorigin( "tag_flash" );
|
|
var_2 = physicstrace( var_1, var_1 + ( 0, 0, -128 ) );
|
|
physicsexplosionsphere( var_2, 192, 100, 1 );
|
|
}
|
|
}
|
|
|
|
playtankexhaust()
|
|
{
|
|
self endon( "death" );
|
|
var_0 = self.model;
|
|
|
|
if ( !isdefined( level.vehicle_exhaust[var_0] ) )
|
|
return;
|
|
|
|
var_1 = 0.1;
|
|
|
|
for (;;)
|
|
{
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( !isalive( self ) )
|
|
return;
|
|
|
|
playfxontag( level.vehicle_exhaust[var_0], _get_dummy(), "tag_engine_exhaust" );
|
|
wait( var_1 );
|
|
}
|
|
}
|
|
|
|
getonpath( var_0 )
|
|
{
|
|
var_1 = undefined;
|
|
var_2 = self.vehicletype;
|
|
|
|
if ( isdefined( self.vehicle_spawner ) )
|
|
{
|
|
if ( isdefined( self.vehicle_spawner.dontgetonpath ) && self.dontgetonpath )
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( self.target ) )
|
|
{
|
|
var_1 = getvehiclenode( self.target, "targetname" );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
{
|
|
var_3 = getentarray( self.target, "targetname" );
|
|
|
|
foreach ( var_5 in var_3 )
|
|
{
|
|
if ( var_5.code_classname == "script_origin" )
|
|
{
|
|
var_1 = var_5;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = common_scripts\utility::getstruct( self.target, "targetname" );
|
|
}
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
{
|
|
if ( _ishelicopter() )
|
|
self vehicle_setspeed( 60, 20, 10 );
|
|
|
|
return;
|
|
}
|
|
|
|
self.attachedpath = var_1;
|
|
|
|
if ( !_ishelicopter() )
|
|
{
|
|
self.origin = var_1.origin;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
self attachpath( var_1 );
|
|
}
|
|
else if ( isdefined( self.speed ) )
|
|
self vehicle_setspeedimmediate( self.speed, 20 );
|
|
else if ( isdefined( var_1.speed ) )
|
|
{
|
|
var_7 = 20;
|
|
var_8 = 10;
|
|
|
|
if ( isdefined( var_1.script_accel ) )
|
|
var_7 = var_1.script_accel;
|
|
|
|
if ( isdefined( var_1.script_decel ) )
|
|
var_7 = var_1.script_decel;
|
|
|
|
self vehicle_setspeedimmediate( var_1.speed, var_7, var_8 );
|
|
}
|
|
else
|
|
self vehicle_setspeed( 60, 20, 10 );
|
|
|
|
thread _vehicle_paths( undefined, _ishelicopter() );
|
|
}
|
|
|
|
_vehicle_resume_named( var_0 )
|
|
{
|
|
var_1 = self.vehicle_stop_named[var_0];
|
|
self.vehicle_stop_named[var_0] = undefined;
|
|
|
|
if ( self.vehicle_stop_named.size )
|
|
return;
|
|
|
|
self resumespeed( var_1 );
|
|
}
|
|
|
|
_vehicle_stop_named( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( self.vehicle_stop_named ) )
|
|
self.vehicle_stop_named = [];
|
|
|
|
self vehicle_setspeed( 0, var_1, var_2 );
|
|
self.vehicle_stop_named[var_0] = var_1;
|
|
}
|
|
|
|
unload_node( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( isdefined( self.ent_flag["prep_unload"] ) && maps\_utility::ent_flag( "prep_unload" ) )
|
|
return;
|
|
|
|
if ( issubstr( self.classname, "snowmobile" ) )
|
|
{
|
|
while ( self.veh_speed > 15 )
|
|
wait 0.05;
|
|
}
|
|
|
|
if ( !isdefined( var_0.script_flag_wait ) && !isdefined( var_0.script_delay ) )
|
|
self notify( "newpath" );
|
|
|
|
var_1 = getnode( var_0.targetname, "target" );
|
|
|
|
if ( isdefined( var_1 ) && self.riders.size )
|
|
{
|
|
foreach ( var_3 in self.riders )
|
|
{
|
|
if ( isai( var_3 ) )
|
|
var_3 thread maps\_spawner::go_to_node( var_1 );
|
|
}
|
|
}
|
|
|
|
if ( _ishelicopter() )
|
|
{
|
|
if ( isdefined( self.parachute_unload ) )
|
|
{
|
|
self setmaxpitchroll( 0, 0 );
|
|
waittill_dropoff_height();
|
|
common_scripts\utility::delaycall( 5, ::setmaxpitchroll, 15, 15 );
|
|
}
|
|
else
|
|
{
|
|
self sethoverparams( 0, 0, 0 );
|
|
waittill_stable( var_0 );
|
|
}
|
|
}
|
|
else if ( !isdefined( self.moving_unload ) || !self.moving_unload )
|
|
self vehicle_setspeed( 0, 35 );
|
|
|
|
if ( isdefined( var_0.script_noteworthy ) )
|
|
{
|
|
if ( var_0.script_noteworthy == "wait_for_flag" )
|
|
common_scripts\utility::flag_wait( var_0.script_flag );
|
|
}
|
|
|
|
_vehicle_unload( var_0.script_unload );
|
|
|
|
if ( maps\_vehicle_aianim::riders_unloadable( var_0.script_unload ) )
|
|
{
|
|
if ( isdefined( self.parachute_unload ) )
|
|
{
|
|
if ( isdefined( var_0.script_noteworthy ) )
|
|
{
|
|
if ( var_0.script_noteworthy == "para_unload_stop" )
|
|
self waittill( "unloaded" );
|
|
}
|
|
}
|
|
else
|
|
self waittill( "unloaded" );
|
|
}
|
|
|
|
if ( isdefined( var_0.script_flag_wait ) || isdefined( var_0.script_delay ) )
|
|
return;
|
|
|
|
if ( isdefined( self ) )
|
|
thread vehicle_resumepathvehicle();
|
|
}
|
|
|
|
move_turrets_here( var_0 )
|
|
{
|
|
var_1 = self.classname;
|
|
|
|
if ( !isdefined( self.mgturret ) )
|
|
return;
|
|
|
|
if ( self.mgturret.size == 0 )
|
|
return;
|
|
|
|
foreach ( var_4, var_3 in self.mgturret )
|
|
{
|
|
var_3 unlink();
|
|
var_3 linkto( var_0, level.vehicle_mgturret[var_1][var_4].tag, ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
}
|
|
}
|
|
|
|
vehicle_pathdetach()
|
|
{
|
|
self.attachedpath = undefined;
|
|
self notify( "newpath" );
|
|
self setgoalyaw( common_scripts\utility::flat_angle( self.angles )[1] );
|
|
self setvehgoalpos( self.origin + ( 0, 0, 4 ), 1 );
|
|
}
|
|
|
|
waittill_dropoff_height()
|
|
{
|
|
var_0 = 4;
|
|
var_1 = 400;
|
|
var_2 = gettime() + var_1;
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
var_3 = self.origin[2] - self.currentnode.origin[2];
|
|
|
|
if ( abs( var_3 ) <= var_0 )
|
|
return;
|
|
else
|
|
var_2 = gettime() + var_1;
|
|
|
|
if ( gettime() > var_2 )
|
|
{
|
|
iprintln( "Chopper parachute unload: waittill_dropoff_height timed out!" );
|
|
break;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
deathrollon()
|
|
{
|
|
if ( self.health > 0 )
|
|
self.rollingdeath = 1;
|
|
}
|
|
|
|
deathrolloff()
|
|
{
|
|
self.rollingdeath = undefined;
|
|
self notify( "deathrolloff" );
|
|
}
|
|
|
|
_mgoff()
|
|
{
|
|
self.script_turretmg = 0;
|
|
|
|
if ( _ishelicopter() && hashelicopterturret() )
|
|
{
|
|
if ( isdefined( level.chopperturretfunc ) )
|
|
{
|
|
self thread [[ level.chopperturretofffunc ]]();
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ( !isdefined( self.mgturret ) )
|
|
return;
|
|
|
|
foreach ( var_2, var_1 in self.mgturret )
|
|
{
|
|
if ( isdefined( var_1.script_fireondrones ) )
|
|
var_1.script_fireondrones = 0;
|
|
|
|
var_1 setmode( "manual" );
|
|
}
|
|
}
|
|
|
|
_mgon()
|
|
{
|
|
self.script_turretmg = 1;
|
|
|
|
if ( _ishelicopter() && hashelicopterturret() )
|
|
{
|
|
self thread [[ level.chopperturretonfunc ]]();
|
|
return;
|
|
}
|
|
|
|
if ( !isdefined( self.mgturret ) )
|
|
return;
|
|
|
|
foreach ( var_1 in self.mgturret )
|
|
{
|
|
var_1 show();
|
|
|
|
if ( isdefined( var_1.script_fireondrones ) )
|
|
var_1.script_fireondrones = 1;
|
|
|
|
if ( isdefined( var_1.defaultonmode ) )
|
|
{
|
|
if ( var_1.defaultonmode != "sentry" )
|
|
var_1 setmode( var_1.defaultonmode );
|
|
}
|
|
else
|
|
var_1 setmode( "auto_nonai" );
|
|
|
|
set_turret_team( var_1 );
|
|
}
|
|
}
|
|
|
|
_force_kill()
|
|
{
|
|
if ( common_scripts\utility::isdestructible() )
|
|
common_scripts\_destructible::force_explosion();
|
|
else
|
|
{
|
|
self kill();
|
|
self setcandamage( 0 );
|
|
}
|
|
}
|
|
|
|
get_vehicle_ai_riders()
|
|
{
|
|
if ( !isdefined( self.script_vehicleride ) )
|
|
return [];
|
|
|
|
if ( !isdefined( level.vehicle_rideai[self.script_vehicleride] ) )
|
|
return [];
|
|
|
|
return level.vehicle_rideai[self.script_vehicleride];
|
|
}
|
|
|
|
get_vehicle_ai_spawners()
|
|
{
|
|
var_0 = [];
|
|
|
|
if ( isdefined( self.target ) )
|
|
{
|
|
var_1 = getentarray( self.target, "targetname" );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( !issubstr( var_3.code_classname, "actor" ) )
|
|
continue;
|
|
|
|
if ( !( var_3.spawnflags & 1 ) )
|
|
continue;
|
|
|
|
if ( isdefined( var_3.dont_auto_ride ) )
|
|
continue;
|
|
|
|
var_0[var_0.size] = var_3;
|
|
}
|
|
|
|
if ( isdefined( level.spawn_pool_enabled ) )
|
|
{
|
|
var_1 = common_scripts\utility::getstructarray( self.target, "targetname" );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( isdefined( var_3.script_spawn_pool ) )
|
|
var_0[var_0.size] = var_3;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !isdefined( self.script_vehicleride ) )
|
|
return var_0;
|
|
|
|
if ( isdefined( level.vehicle_ridespawners[self.script_vehicleride] ) )
|
|
var_0 = common_scripts\utility::array_combine( var_0, level.vehicle_ridespawners[self.script_vehicleride] );
|
|
|
|
return var_0;
|
|
}
|
|
|
|
_vehicle_paths( var_0, var_1, var_2 )
|
|
{
|
|
if ( _ishelicopter() )
|
|
vehicle_paths_helicopter( var_0, var_1, var_2 );
|
|
else
|
|
vehicle_paths_non_heli( var_0 );
|
|
}
|
|
|
|
_gopath( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = self;
|
|
|
|
if ( isdefined( var_0.script_vehiclestartmove ) )
|
|
level.vehicle_startmovegroup[var_0.script_vehiclestartmove] = common_scripts\utility::array_remove( level.vehicle_startmovegroup[var_0.script_vehiclestartmove], var_0 );
|
|
|
|
var_0 endon( "death" );
|
|
|
|
if ( isdefined( var_0.hasstarted ) )
|
|
return;
|
|
else
|
|
var_0.hasstarted = 1;
|
|
|
|
var_0 maps\_utility::script_delay();
|
|
var_0 notify( "start_vehiclepath" );
|
|
|
|
if ( var_0 _ishelicopter() )
|
|
var_0 notify( "start_dynamicpath" );
|
|
else
|
|
var_0 startpath();
|
|
}
|
|
|
|
_scripted_spawn( var_0 )
|
|
{
|
|
var_1 = _getvehiclespawnerarray_by_spawngroup( var_0 );
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in var_1 )
|
|
var_2[var_2.size] = _vehicle_spawn( var_4 );
|
|
|
|
return var_2;
|
|
}
|
|
|
|
_vehicle_spawn( var_0 )
|
|
{
|
|
var_1 = var_0 vehicle_dospawn();
|
|
|
|
if ( !isdefined( var_0.spawned_count ) )
|
|
var_0.spawned_count = 0;
|
|
|
|
var_0.spawned_count++;
|
|
var_0.vehicle_spawned_thisframe = var_1;
|
|
var_0.last_spawned_vehicle = var_1;
|
|
var_0 thread remove_vehicle_spawned_thisframe();
|
|
var_1.vehicle_spawner = var_0;
|
|
|
|
if ( isdefined( var_0.truckjunk ) )
|
|
var_1.truckjunk = var_0.truckjunk;
|
|
|
|
thread vehicle_init( var_1 );
|
|
var_0 notify( "spawned", var_1 );
|
|
return var_1;
|
|
}
|
|
|
|
kill_vehicle_spawner( var_0 )
|
|
{
|
|
var_0 waittill( "trigger" );
|
|
maps\_utility::array_delete( level.vehicle_killspawn_groups[var_0.script_kill_vehicle_spawner] );
|
|
level.vehicle_killspawn_groups[var_0.script_kill_vehicle_spawner] = [];
|
|
}
|
|
|
|
precache_scripts()
|
|
{
|
|
var_0 = [];
|
|
var_1 = getentarray( "script_vehicle", "code_classname" );
|
|
level.needsprecaching = [];
|
|
var_2 = [];
|
|
var_0 = [];
|
|
|
|
if ( !isdefined( level.vehicleinitthread ) )
|
|
level.vehicleinitthread = [];
|
|
|
|
foreach ( var_4 in var_1 )
|
|
{
|
|
var_4.vehicletype = tolower( var_4.vehicletype );
|
|
|
|
if ( var_4.vehicletype == "empty" )
|
|
continue;
|
|
|
|
if ( isdefined( var_4.spawnflags ) && var_4.spawnflags & 1 )
|
|
var_2[var_2.size] = var_4;
|
|
|
|
var_0[var_0.size] = var_4;
|
|
|
|
if ( !isdefined( level.vehicleinitthread[var_4.vehicletype] ) )
|
|
level.vehicleinitthread[var_4.vehicletype] = [];
|
|
|
|
var_5 = "classname: " + var_4.classname;
|
|
precachesetup( var_5, var_4 );
|
|
}
|
|
|
|
if ( level.needsprecaching.size > 0 )
|
|
{
|
|
foreach ( var_8 in level.needsprecaching )
|
|
{
|
|
|
|
}
|
|
|
|
level waittill( "never" );
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
precachesetup( var_0, var_1 )
|
|
{
|
|
if ( isdefined( level.vehicleinitthread[var_1.vehicletype][var_1.classname] ) )
|
|
return;
|
|
|
|
if ( var_1.classname == "script_vehicle" )
|
|
return;
|
|
|
|
var_2 = 0;
|
|
|
|
foreach ( var_4 in level.needsprecaching )
|
|
{
|
|
if ( var_4 == var_0 )
|
|
var_2 = 1;
|
|
}
|
|
|
|
if ( !var_2 )
|
|
level.needsprecaching[level.needsprecaching.size] = var_0;
|
|
}
|
|
|
|
setup_levelvars()
|
|
{
|
|
if ( isdefined( level.vehicle_setup_levelvars ) )
|
|
return;
|
|
|
|
level.vehicle_setup_levelvars = 1;
|
|
level.vehicle_deletegroup = [];
|
|
level.vehicle_startmovegroup = [];
|
|
level.vehicle_rideai = [];
|
|
level.vehicle_deathswitch = [];
|
|
level.vehicle_ridespawners = [];
|
|
level.vehicle_gatetrigger = [];
|
|
level.vehicle_crashpaths = [];
|
|
level.vehicle_link = [];
|
|
level.vehicle_detourpaths = [];
|
|
level.vehicle_startnodes = [];
|
|
level.vehicle_killspawn_groups = [];
|
|
level.helicopter_crash_locations = getentarray( "helicopter_crash_location", "targetname" );
|
|
level.helicopter_crash_locations = common_scripts\utility::array_combine( level.helicopter_crash_locations, maps\_utility::getstructarray_delete( "helicopter_crash_location", "targetname" ) );
|
|
level.vehicles = [];
|
|
level.vehicles["allies"] = [];
|
|
level.vehicles["axis"] = [];
|
|
level.vehicles["neutral"] = [];
|
|
level.vehicles["team3"] = [];
|
|
|
|
if ( !isdefined( level.vehicle_team ) )
|
|
level.vehicle_team = [];
|
|
|
|
if ( !isdefined( level.vehicle_deathmodel ) )
|
|
level.vehicle_deathmodel = [];
|
|
|
|
if ( !isdefined( level.vehicle_death_thread ) )
|
|
level.vehicle_death_thread = [];
|
|
|
|
if ( !isdefined( level.vehicle_driveidle ) )
|
|
level.vehicle_driveidle = [];
|
|
|
|
if ( !isdefined( level.vehicle_driveidle_r ) )
|
|
level.vehicle_driveidle_r = [];
|
|
|
|
if ( !isdefined( level.attack_origin_condition_threadd ) )
|
|
level.attack_origin_condition_threadd = [];
|
|
|
|
if ( !isdefined( level.vehiclefireanim ) )
|
|
level.vehiclefireanim = [];
|
|
|
|
if ( !isdefined( level.vehiclefireanim_settle ) )
|
|
level.vehiclefireanim_settle = [];
|
|
|
|
if ( !isdefined( level.vehicle_hasname ) )
|
|
level.vehicle_hasname = [];
|
|
|
|
if ( !isdefined( level.vehicle_turret_requiresrider ) )
|
|
level.vehicle_turret_requiresrider = [];
|
|
|
|
if ( !isdefined( level.vehicle_rumble ) )
|
|
level.vehicle_rumble = [];
|
|
|
|
if ( !isdefined( level.vehicle_rumble_override ) )
|
|
level.vehicle_rumble_override = [];
|
|
|
|
if ( !isdefined( level.vehicle_mgturret ) )
|
|
level.vehicle_mgturret = [];
|
|
|
|
if ( !isdefined( level.vehicle_isstationary ) )
|
|
level.vehicle_isstationary = [];
|
|
|
|
if ( !isdefined( level.vehicle_death_earthquake ) )
|
|
level.vehicle_death_earthquake = [];
|
|
|
|
if ( !isdefined( level._vehicle_effect ) )
|
|
level._vehicle_effect = [];
|
|
|
|
if ( !isdefined( level.vehicle_unloadgroups ) )
|
|
level.vehicle_unloadgroups = [];
|
|
|
|
if ( !isdefined( level.vehicle_aianims ) )
|
|
level.vehicle_aianims = [];
|
|
|
|
if ( !isdefined( level.vehicle_unloadwhenattacked ) )
|
|
level.vehicle_unloadwhenattacked = [];
|
|
|
|
if ( !isdefined( level.vehicle_exhaust ) )
|
|
level.vehicle_exhaust = [];
|
|
|
|
if ( !isdefined( level.vehicle_deckdust ) )
|
|
level.vehicle_deckdust = [];
|
|
|
|
if ( !isdefined( level.vehicle_shoot_shock ) )
|
|
level.vehicle_shoot_shock = [];
|
|
|
|
if ( !isdefined( level.vehicle_hide_list ) )
|
|
level.vehicle_hide_list = [];
|
|
|
|
if ( !isdefined( level.vehicle_frontarmor ) )
|
|
level.vehicle_frontarmor = [];
|
|
|
|
if ( !isdefined( level.destructible_model ) )
|
|
level.destructible_model = [];
|
|
|
|
if ( !isdefined( level.vehicle_types ) )
|
|
level.vehicle_types = [];
|
|
|
|
if ( !isdefined( level.vehicle_grenadeshield ) )
|
|
level.vehicle_grenadeshield = [];
|
|
|
|
if ( !isdefined( level.vehicle_bulletshield ) )
|
|
level.vehicle_bulletshield = [];
|
|
|
|
if ( !isdefined( level.vehicle_death_jolt ) )
|
|
level.vehicle_death_jolt = [];
|
|
|
|
if ( !isdefined( level.vehicle_death_badplace ) )
|
|
level.vehicle_death_badplace = [];
|
|
|
|
if ( !isdefined( level.vehicle_idleanim ) )
|
|
level.vehicle_idleanim = [];
|
|
|
|
if ( !isdefined( level.helicopter_list ) )
|
|
level.helicopter_list = [];
|
|
|
|
if ( !isdefined( level.airplane_list ) )
|
|
level.airplane_list = [];
|
|
|
|
if ( !isdefined( level.vehicle_single_tread_list ) )
|
|
level.vehicle_single_tread_list = [];
|
|
|
|
if ( !isdefined( level.vehicle_death_anim ) )
|
|
level.vehicle_death_anim = [];
|
|
|
|
maps\_vehicle_aianim::setup_aianimthreads();
|
|
}
|
|
|
|
setvehgoalpos_wrap( var_0, var_1 )
|
|
{
|
|
return _setvehgoalpos_wrap( var_0, var_1 );
|
|
}
|
|
|
|
vehicle_liftoffvehicle( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 512;
|
|
|
|
var_1 = self.origin + ( 0, 0, var_0 );
|
|
self setneargoalnotifydist( 10 );
|
|
setvehgoalpos_wrap( var_1, 1 );
|
|
self waittill( "goal" );
|
|
}
|
|
|
|
move_effects_ent_here( var_0 )
|
|
{
|
|
var_1 = deathfx_ent();
|
|
var_1 unlink();
|
|
var_1 linkto( var_0 );
|
|
}
|
|
|
|
model_dummy_death()
|
|
{
|
|
var_0 = self.modeldummy;
|
|
var_0 endon( "death" );
|
|
var_0 endon( "stop_model_dummy_death" );
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
self waittill( "death" );
|
|
waittillframeend;
|
|
}
|
|
|
|
var_0 delete();
|
|
}
|
|
|
|
move_lights_here( var_0, var_1 )
|
|
{
|
|
var_0 lights_on_internal( "all", self.classname );
|
|
wait 0.3;
|
|
thread lights_off( "all", self.classname );
|
|
}
|
|
|
|
spawn_vehicles_from_targetname_newstyle( var_0 )
|
|
{
|
|
var_1 = [];
|
|
var_2 = getentarray( var_0, "targetname" );
|
|
var_3 = [];
|
|
|
|
foreach ( var_5 in var_2 )
|
|
{
|
|
if ( !isdefined( var_5.code_classname ) || var_5.code_classname != "script_vehicle" )
|
|
continue;
|
|
|
|
if ( isspawner( var_5 ) )
|
|
var_1[var_1.size] = _vehicle_spawn( var_5 );
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
kill_death_anim_thread( var_0 )
|
|
{
|
|
if ( !isdefined( level.vehicle_death_anim[var_0] ) )
|
|
return;
|
|
|
|
if ( isdefined( self.skipanimbaseddeath ) && self.skipanimbaseddeath )
|
|
return;
|
|
|
|
if ( isarray( level.vehicle_death_anim[var_0] ) )
|
|
{
|
|
if ( isdefined( self.preferred_death_anim ) )
|
|
var_1 = self.preferred_death_anim;
|
|
else
|
|
var_1 = common_scripts\utility::random( level.vehicle_death_anim[var_0] );
|
|
|
|
return kill_death_anim_thread_picked( var_1 );
|
|
}
|
|
|
|
return kill_death_anim_thread_picked( level.vehicle_death_anim[var_0] );
|
|
}
|
|
|
|
kill_death_anim_thread_picked( var_0 )
|
|
{
|
|
self.killdeathanimating = 1;
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
self vehicle_orientto( var_1.origin, var_1.angles, 0, 0 );
|
|
self vehicle_turnengineoff();
|
|
self notify( "kill_death_anim", var_0 );
|
|
|
|
if ( isstring( var_0 ) )
|
|
{
|
|
self setcandamage( 0 );
|
|
var_1 maps\_anim::anim_single_solo( self, var_0 );
|
|
}
|
|
else
|
|
{
|
|
self useanimtree( #animtree );
|
|
self animscripted( "vehicle_death_anim", var_1.origin, var_1.angles, var_0 );
|
|
self setneargoalnotifydist( 30 );
|
|
self setvehgoalpos( var_1.origin, 1 );
|
|
self setgoalyaw( var_1.angles[1] );
|
|
self waittillmatch( "vehicle_death_anim", "end" );
|
|
}
|
|
|
|
var_1 delete();
|
|
thread delayed_delete( 7 );
|
|
}
|
|
|
|
delayed_delete( var_0 )
|
|
{
|
|
wait 7;
|
|
|
|
if ( isdefined( self ) )
|
|
self delete();
|
|
}
|
|
|
|
unmatched_death_rig_light_waits_for_lights_off()
|
|
{
|
|
if ( !isdefined( self.has_unmatching_deathmodel_rig ) )
|
|
return;
|
|
|
|
while ( isdefined( self.lights ) && self.lights.size )
|
|
wait 0.05;
|
|
}
|