// 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; }