1 #using scripts\codescripts\struct;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\math_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\vehicle_shared;
8 #using scripts\shared\callbacks_shared;
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\version.gsh;
13 #using scripts\mp\_helicopter_sounds;
14 #using scripts\mp\_util;
16 #insert scripts\mp\killstreaks\_killstreaks.gsh;
18 #using scripts\shared\duplicaterender_mgr;
19 #insert scripts\shared\duplicaterender.gsh;
21 #precache( "client_fx", "killstreaks/fx_heli_smk_trail_engine_33" );
22 #precache( "client_fx", "killstreaks/fx_heli_smk_trail_engine_66" );
23 #precache( "client_fx", "killstreaks/fx_drgnfire_rotor_wash_runner" );
24 #precache( "client_fx", "killstreaks/fx_ed_lights_green" );
25 #precache( "client_fx", "killstreaks/fx_ed_lights_red" );
26 #precache( "client_fx", "killstreaks/fx_sc_lights_grn" );
27 #precache( "client_fx", "killstreaks/fx_sc_lights_red" );
28 #precache( "client_fx", "killstreaks/fx_vtol_lights_grn" );
29 #precache( "client_fx", "killstreaks/fx_vtol_lights_red" );
30 #precache( "client_fx", "killstreaks/fx_vtol_thruster" );
31 #precache( "client_fx", "killstreaks/fx_drone_hunter_lights" );
33 #using_animtree( "mp_vehicles" );
35 #namespace helicopter;
37 #define ACTIVE_CAMO_NORMAL "mc/hud_outline_predator_camo_active_enemy_scorestreak"
38 #define ACTIVE_CAMO_FLICKER "mc/hud_outline_predator_camo_disruption_enemy_scorestreak"
39 #define ACTIVE_CAMO_REVEAL "mc/hud_outline_predator_scorestreak"
41 #define CAMO_REVEAL_TIME 0.5
42 #define CAMO_TURNOFF_MODEL_RENDER .5
48 level.chopper_fx[
"damage"][
"light_smoke"] =
"killstreaks/fx_heli_smk_trail_engine_33";
49 level.chopper_fx[
"damage"][
"heavy_smoke"] =
"killstreaks/fx_heli_smk_trail_engine_66";
51 level._effect[
"qrdrone_prop"] =
"killstreaks/fx_drgnfire_rotor_wash_runner";
52 level._effect[
"heli_guard_light"][
"friendly"] =
"killstreaks/fx_sc_lights_grn";
53 level._effect[
"heli_guard_light"][
"enemy"] =
"killstreaks/fx_sc_lights_red";
54 level._effect[
"heli_comlink_light"][
"common"] =
"killstreaks/fx_drone_hunter_lights";
55 level._effect[
"heli_gunner_light"][
"friendly"] =
"killstreaks/fx_vtol_lights_grn";
56 level._effect[
"heli_gunner_light"][
"enemy"] =
"killstreaks/fx_vtol_lights_red";
58 level._effect[
"heli_gunner"][
"vtol_fx"] =
"killstreaks/fx_vtol_thruster";
59 level._effect[
"heli_gunner"][
"vtol_fx_ft"] =
"killstreaks/fx_vtol_thruster";
101 player waittill(
"entityshutdown" );
102 player.markerFX = undefined;
103 if( isdefined( player.markerObj ) )
105 player.markerObj Delete();
107 if( isdefined( player.markerFXHandle ) )
109 KillFX( localClientNum, player.markerFXHandle );
110 player.markerFXHandle = undefined;
116 if (
self HasAnimTree() ==
false )
117 self UseAnimTree( #animtree );
120 function active_camo_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
140 self notify(
"endtest" );
147 self notify(
"endtest" );
148 self endon(
"endtest" );
150 self endon(
"entityshutdown" );
165 priorValue = startVal;
166 while( ( startVal >= 0 ) && ( startVal <= 1 ) )
168 self MapShaderConstant( local_client_num, 0,
"scriptVector0", startVal, 0, 0, 0 );
187 priorValue = startVal;
190 self MapShaderConstant( local_client_num, 0,
"scriptVector0", endVal, 0, 0, 0 );
202 self endon(
"entityshutdown" );
203 self endon(
"death" );
206 self SetAnim( %veh_anim_future_heli_gearup_bay_open, 1.0, 0.0, 1.0 );
211 self endon(
"entityshutdown" );
212 self endon(
"death" );
216 self SetAnim( %o_drone_supply_care_idle, 1.0, 0.0, 1.0 );
220 self SetAnim( %o_drone_supply_care_drop, 1.0, 0.0, 0.3 );
226 self endon(
"entityshutdown" );
227 self endon(
"death" );
232 self SetAnim( %o_drone_supply_agr_idle, 1.0, 0.0, 1.0 );
236 self SetAnim( %o_drone_supply_agr_drop, 1.0, 0.0, 0.3 );
240 function warnMissileLocking( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
242 if ( newVal && !(
self IsLocalClientDriver(localClientNum)) )
248 function warnMissileLocked( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
250 if ( newVal && !(
self IsLocalClientDriver(localClientNum)) )
256 function warnMissileFired( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
258 if ( newVal && !(
self IsLocalClientDriver(localClientNum)) )
266 if (isdefined(
self.exhaustLeftFxHandle))
268 deletefx( localClientNum,
self.exhaustLeftFxHandle );
269 self.exhaustLeftFxHandle = undefined;
272 if (isdefined(
self.exhaustRightFxHandlee))
274 deletefx( localClientNum,
self.exhaustRightFxHandle );
275 self.exhaustRightFxHandle = undefined;
278 if (isdefined(
self.lightFXID))
280 deletefx( localClientNum,
self.lightFXID );
281 self.lightFXID = undefined;
284 if (isdefined(
self.propFXID))
286 deletefx( localClientNum,
self.propFXID );
287 self.propFXID = undefined;
290 if (isdefined(
self.vtolLeftFXID))
292 deletefx( localClientNum,
self.vtolLeftFXID );
293 self.vtolLeftFXID = undefined;
296 if (isdefined(
self.vtolRightFXID))
298 deletefx( localClientNum,
self.vtolRightFXID );
299 self.vtolRightFXID = undefined;
306 self endon(
"entityshutdown" );
308 if ( isdefined(
self.vehicletype ) )
310 if (
self.vehicletype ==
"remote_mortar_vehicle_mp" )
315 if (
self.vehicletype ==
"vehicle_straferun_mp" )
321 if( isdefined(
self.exhaustfxname ) &&
self.exhaustfxname !=
"" )
323 self.exhaustFx =
self.exhaustfxname;
326 if( isdefined(
self.exhaustFx) )
328 self.exhaustLeftFxHandle = PlayFXOnTag( localClientNum,
self.exhaustFx,
self,
"tag_engine_left" );
332 self.exhaustRightFxHandle = PlayFXOnTag( localClientNum,
self.exhaustFx,
self,
"tag_engine_right" );
337 /# PrintLn(
"Client: _helicopter.csc - startfx() - exhaust rotor fx is not loaded"); #/
340 if( isdefined(
self.vehicletype ) )
342 light_fx = undefined;
345 switch(
self.vehicletype )
348 light_fx =
"heli_comlink_light";
350 case "heli_player_gunner_mp":
352 self.vtolLeftFXID = PlayFXOnTag( localClientNum, level._effect[
"heli_gunner"][
"vtol_fx"],
self,
"tag_engine_left" );
353 self.vtolRightFXID = PlayFXOnTag( localClientNum, level._effect[
"heli_gunner"][
"vtol_fx_ft"],
self,
"tag_engine_right" );
354 light_fx =
"heli_gunner_light";
356 case "heli_guard_mp":
357 light_fx =
"heli_guard_light";
360 prop_fx =
"qrdrone_prop";
364 if ( isdefined( light_fx ) )
368 self.lightFXID = PlayFXOnTag( localClientNum, level._effect[light_fx][
"friendly"],
self,
"tag_origin" );
372 self.lightFXID = PlayFXOnTag( localClientNum, level._effect[light_fx][
"enemy"],
self,
"tag_origin" );
376 if ( isdefined( prop_fx ) && !
self IsLocalClientDriver( localClientNum ))
378 self.propFXID = PlayFXOnTag( localClientNum, level._effect[prop_fx],
self,
"tag_origin" );
387 self endon(
"entityshutdown" );
396 while( isdefined(
self ) )
411 self endon(
"entityshutdown" );
413 last_damage_state =
self GetHeliDamageState();
418 if ( last_damage_state !=
self GetHeliDamageState() )
420 if (
self GetHeliDamageState() == 2 )
423 stopfx( localClientNum, fx );
425 fx =
trail_fx( localClientNum, level.chopper_fx[
"damage"][
"light_smoke"],
"tag_engine_left" );
427 else if (
self GetHeliDamageState() == 1 )
430 stopfx( localClientNum, fx );
432 fx =
trail_fx( localClientNum, level.chopper_fx[
"damage"][
"heavy_smoke"],
"tag_engine_left" );
437 stopfx( localClientNum, fx );
439 self notify(
"stop trail" );
441 last_damage_state =
self GetHeliDamageState();
449 id = playfxontag( localClientNum,
trail_fx,
self, trail_tag );
456 self endon(
"entityshutdown" );
457 self endon(
"heli_comlink_lights_off" );
466 if( !isdefined(
self.light_fx_handles_heli_comlink ) )
468 self.light_fx_handles_heli_comlink = [];
471 self.light_fx_handles_heli_comlink[ 0 ] = PlayFXOnTag( localClientNum, level._effect[
"heli_comlink_light"][
"common"],
self,
"tag_fx_light_left" );
472 self.light_fx_handles_heli_comlink[ 1 ] = PlayFXOnTag( localClientNum, level._effect[
"heli_comlink_light"][
"common"],
self,
"tag_fx_light_right" );
473 self.light_fx_handles_heli_comlink[ 2 ] = PlayFXOnTag( localClientNum, level._effect[
"heli_comlink_light"][
"common"],
self,
"tag_fx_tail" );
474 self.light_fx_handles_heli_comlink[ 3 ] = PlayFXOnTag( localClientNum, level._effect[
"heli_comlink_light"][
"common"],
self,
"tag_fx_scanner" );
476 if( isdefined(
self.team ) )
478 for ( i = 0; i <
self.light_fx_handles_heli_comlink.size; i++ )
479 SetFXTeam( localClientNum,
self.light_fx_handles_heli_comlink[ i ],
self.owner.team );
485 self notify(
"heli_comlink_lights_off" );
487 if ( isdefined(
self.light_fx_handles_heli_comlink ) )
489 for( i = 0; i <
self.light_fx_handles_heli_comlink.size; i++ )
491 if ( isdefined(
self.light_fx_handles_heli_comlink[ i ] ) )
493 DeleteFX( localClientNum,
self.light_fx_handles_heli_comlink[ i ] );
497 self.light_fx_handles_heli_comlink = undefined;
503 self endon(
"entityshutdown" );
509 while( isdefined( player.markerObj ) )
511 viewAngles = GetLocalClientAngles( localClientNum );
513 forwardVector = VectorScale( AnglesToForward( viewAngles ), killstreakCoreBundle.ksMaxAirdropTargetRange );
514 results = BulletTrace( player GetEye(), player GetEye() + forwardVector,
false, player );
516 player.markerObj.origin = results[
"position"];
526 if( isdefined( crate.thrusterFxHandle0 ) )
527 StopFX( localClientNum, crate.thrusterFxHandle0 );
528 if( isdefined( crate.thrusterFxHandle1 ) )
529 StopFX( localClientNum, crate.thrusterFxHandle1 );
530 if( isdefined( crate.thrusterFxHandle2 ) )
531 StopFX( localClientNum, crate.thrusterFxHandle2 );
532 if( isdefined( crate.thrusterFxHandle3 ) )
533 StopFX( localClientNum, crate.thrusterFxHandle3 );
535 crate.thrusterFxHandle0 = undefined;
536 crate.thrusterFxHandle1 = undefined;
537 crate.thrusterFxHandle2 = undefined;
538 crate.thrusterFxHandle3 = undefined;
545 crate notify(
"CleanupThrustersThread_singleton" );
546 crate endon(
"CleanupThrustersThread_singleton" );
548 crate waittill(
"entityshutdown" );
558 if( ( newVal != oldVal ) && isdefined( params.ksThrusterFX ) )
564 crate.thrusterFxHandle0 = PlayFXOnTag( localClientNum, params.ksThrusterFX, crate,
"tag_thruster_fx_01" );
565 crate.thrusterFxHandle1 = PlayFXOnTag( localClientNum, params.ksThrusterFX, crate,
"tag_thruster_fx_02" );
566 crate.thrusterFxHandle2 = PlayFXOnTag( localClientNum, params.ksThrusterFX, crate,
"tag_thruster_fx_03" );
567 crate.thrusterFxHandle3 = PlayFXOnTag( localClientNum, params.ksThrusterFX, crate,
"tag_thruster_fx_04" );
578 function mothership_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
587 if( ( newVal != oldVal ) && isdefined( params.ksThrusterFX ) )
593 crate.thrusterFxHandle0 = PlayFXOnTag( localClientNum, params.ksThrusterFX, crate,
"tag_thruster_fx_01" );
594 crate.thrusterFxHandle1 = PlayFXOnTag( localClientNum, params.ksThrusterFX, crate,
"tag_thruster_fx_02" );
595 crate.thrusterFxHandle2 = PlayFXOnTag( localClientNum, params.ksThrusterFX, crate,
"tag_thruster_fx_03" );
596 crate.thrusterFxHandle3 = PlayFXOnTag( localClientNum, params.ksThrusterFX, crate,
"tag_thruster_fx_04" );
609 self endon(
"entityshutdown" );
618 player.markerFX = killstreakCoreBundle.fxValidLocation;
620 else if ( newVal == 2 )
622 player.markerFX = killstreakCoreBundle.fxInvalidLocation;
626 player.markerFX = undefined;
630 if ( isdefined( player.markerObj ) && !( player.markerObj hasdobj( localClientNum ) ) )
636 if( isdefined( player.markerFXHandle ) )
638 KillFX( localClientNum, player.markerFXHandle ) ;
639 player.markerFXHandle = undefined;
642 if ( isdefined( player.markerFX ) )
644 if( !isdefined( player.markerObj ) )
646 player.markerObj =
Spawn( localClientNum, ( 0, 0, 0 ),
"script_model" );
647 player.markerObj.angles = ( 270, 0, 0 );
649 player.markerObj SetModel(
"wpn_t7_none_world" );
656 player.markerFXHandle = PlayFXOnTag( localClientNum, player.markerFX, player.markerObj,
"tag_origin" );
658 else if( isdefined( player.markerObj ) )
660 player.markerObj Delete();