1 #using scripts\codescripts\struct;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\filter_shared;
5 #using scripts\shared\math_shared;
6 #using scripts\shared\system_shared;
7 #using scripts\shared\util_shared;
8 #using scripts\shared\postfx_shared;
9 #using scripts\shared\vehicleriders_shared;
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\version.gsh;
79 if ( !isdefined( level.vehicleTypeCallbackArray ) )
81 level.vehicleTypeCallbackArray = [];
84 level.vehicleTypeCallbackArray[vehicletype] =
callback;
89 if ( isdefined(
self.vehicleridersbundle ) )
94 vehicletype =
self.vehicletype;
95 if( isdefined( level.vehicleTypeCallbackArray ) )
97 if ( isdefined( vehicletype ) && isdefined( level.vehicleTypeCallbackArray[vehicletype] ) )
99 self thread [[level.vehicleTypeCallbackArray[vehicletype]]]( localClientNum );
101 else if( isdefined(
self.scriptvehicletype ) && isdefined( level.vehicleTypeCallbackArray[
self.scriptvehicletype] ) )
103 self thread [[level.vehicleTypeCallbackArray[
self.scriptvehicletype]]]( localClientNum );
110 self endon(
"entityshutdown" );
112 if( !isdefined(
self.rumbletype ) || (
self.rumbleradius == 0 ) )
118 if( !isdefined(
self.rumbleon ) )
120 self.rumbleon =
true;
123 height =
self.rumbleradius * 2;
124 zoffset = -1 *
self.rumbleradius;
126 self.player_touching = 0;
131 radius_squared =
self.rumbleradius *
self.rumbleradius;
137 if( !isdefined( level.localPlayers[localClientNum] ) || ( distancesquared(
self.origin, level.localPlayers[localClientNum].origin ) > radius_squared ) ||
self getspeed() == 0 )
143 if( isdefined(
self.rumbleon ) && !
self.rumbleon )
149 self PlayRumbleLoopOnEntity( localClientNum,
self.rumbletype );
151 while( isdefined( level.localPlayers[localClientNum] ) && ( distancesquared(
self.origin, level.localPlayers[localClientNum].origin ) < radius_squared ) && (
self getspeed() > 0 ) )
153 self earthquake(
self.rumblescale,
self.rumbleduration,
self.origin,
self.rumbleradius );
154 time_to_wait =
self.rumblebasetime + randomfloat(
self.rumbleadditionaltime );
155 if( time_to_wait <= 0 )
159 wait( time_to_wait );
162 if ( isdefined( level.localPlayers[localClientNum] ) )
164 self StopRumble( localClientNum,
self.rumbletype );
174 self notify(
"kill_treads_forever" );
179 if( isdefined(
self.csf_no_exhaust) &&
self.csf_no_exhaust )
184 if( !isdefined(
self.exhaust_fx ) && isdefined(
self.exhaustfxname ) )
186 if( !isdefined( level._effect ) )
191 if ( !isdefined( level._effect[
self.exhaustfxname] ) )
193 level._effect[
self.exhaustfxname] =
self.exhaustfxname;
195 self.exhaust_fx = level._effect[
self.exhaustfxname];
198 if( isdefined(
self.exhaust_fx ) && isdefined(
self.exhaustFxTag1 ) )
202 Assert( isdefined(
self.exhaustFxTag1 ),
self.vehicletype +
" vehicle exhaust effect is set, but tag 1 is undefined. Please update the vehicle gdt entry" );
204 self endon(
"entityshutdown" );
207 self.exhaust_id_left = PlayFXOnTag( localClientNum,
self.exhaust_fx,
self,
self.exhaustFxTag1 );
209 if( !isdefined(
self.exhaust_id_right ) && IsDefined(
self.exhaustFxTag2 ) )
211 self.exhaust_id_right = PlayFXOnTag( localClientNum,
self.exhaust_fx,
self,
self.exhaustFxTag2 );
221 self waittill(
"stop_exhaust_fx" );
223 if ( isdefined(
self.exhaust_id_left ) )
225 StopFX( localClientNum,
self.exhaust_id_left );
226 self.exhaust_id_left = undefined;
229 if ( isdefined(
self.exhaust_id_right ) )
231 StopFX( localClientNum,
self.exhaust_id_right );
232 self.exhaust_id_right = undefined;
238 self notify(
"stop_exhaust_fx" );
245 self endon(
"kill_treads_forever" );
246 self endon(
"entityshutdown" );
253 if( isdefined(
self.csf_no_tread) &&
self.csf_no_tread )
258 const maxHeight = 1200;
259 const minHeight = 350;
261 const slowestRepeatWait = 0.2;
262 const fastestRepeatWait = 0.1;
266 numFramesPerTrace = 1;
270 numFramesPerTrace = 3;
272 doTraceThisFrame = numFramesPerTrace;
274 const defaultRepeatRate = 1.0;
275 repeatRate = defaultRepeatRate;
282 while( isdefined(
self ) )
285 if( repeatRate <= 0 )
287 repeatRate = defaultRepeatRate;
295 waitrealtime( repeatRate );
297 if( !isdefined(
self ) )
304 if( doTraceThisFrame <= 0 )
306 doTraceThisFrame = numFramesPerTrace;
308 trace = tracepoint( trace_ent.origin, trace_ent.origin -( 0, 0, 100000 ) );
310 d = distance( trace_ent.origin,
trace[
"position"] );
314 repeatRate = ( ( d - minHeight ) / ( maxHeight - minHeight ) ) * ( slowestRepeatWait - fastestRepeatWait ) + fastestRepeatWait;
318 repeatRate = fastestRepeatWait;
326 repeatRate = defaultRepeatRate;
330 if( !isdefined(
trace[
"surfacetype"] ) )
332 trace[
"surfacetype"] =
"dirt";
343 self endon(
"entityshutdown" );
345 const shock_distance = 400 * 400;
346 const rumble_distance = 500 * 500;
349 self waittill(
"weapon_fired" );
352 players = level.localPlayers;
353 for( i = 0; i < players.size; i++ )
355 player_distance = DistanceSquared(
self.origin, players[i].origin );
359 if( player_distance < rumble_distance )
361 if( isdefined(
self.shootrumble) &&
self.shootrumble !=
"" )
364 PlayRumbleOnPosition( i,
self.shootrumble,
self.origin + ( 0, 0, 32 ) );
369 if( player_distance < shock_distance )
371 fraction = player_distance / shock_distance;
372 time = 4 - ( 3 * fraction );
374 if( isdefined( players[i] ) )
376 if( isdefined(
self.shootshock) &&
self.shootshock !=
"" )
379 players[i] ShellShock( i,
self.shootshock, time );
390 while( !
self HasDObj( localClientNum ) )
395 IPrintLnBold(
"WARNING: Failing to turn on fx lights for vehicle because no DOBJ!" );
406 self endon(
"entityshutdown" );
412 if( isdefined(
self.lightfxnamearray ) )
414 if( !isdefined(
self.light_fx_handles ) )
416 self.light_fx_handles = [];
419 for( i = 0; i <
self.lightfxnamearray.size; i++ )
421 self.light_fx_handles[ i ] = PlayFXOnTag( localClientNum,
self.lightfxnamearray[i],
self,
self.lightfxtagarray[i] );
422 SetFXIgnorePause( localClientNum,
self.light_fx_handles[ i ],
true );
423 if( IsDefined( team ) )
425 SetFXTeam( localClientNum,
self.light_fx_handles[ i ], team );
433 if ( isdefined( animItem ) &&
id <= maxID )
435 if ( playWhenOff ===
true )
448 self endon(
"entityshutdown" );
450 if( !isdefined(
self.scriptbundlesettings ) )
457 if ( !isdefined( settings ) )
470 addAnimToList( settings.ambient_group1_anim1, listOn, listOff, settings.ambient_group1_off1, 1, settings.ambient_group1_numslots );
471 addAnimToList( settings.ambient_group1_anim2, listOn, listOff, settings.ambient_group1_off2, 2, settings.ambient_group1_numslots );
472 addAnimToList( settings.ambient_group1_anim3, listOn, listOff, settings.ambient_group1_off3, 3, settings.ambient_group1_numslots );
473 addAnimToList( settings.ambient_group1_anim4, listOn, listOff, settings.ambient_group1_off4, 4, settings.ambient_group1_numslots );
476 addAnimToList( settings.ambient_group2_anim1, listOn, listOff, settings.ambient_group2_off1, 1, settings.ambient_group2_numslots );
477 addAnimToList( settings.ambient_group2_anim2, listOn, listOff, settings.ambient_group2_off2, 2, settings.ambient_group2_numslots );
478 addAnimToList( settings.ambient_group2_anim3, listOn, listOff, settings.ambient_group2_off3, 3, settings.ambient_group2_numslots );
479 addAnimToList( settings.ambient_group2_anim4, listOn, listOff, settings.ambient_group2_off4, 4, settings.ambient_group2_numslots );
482 addAnimToList( settings.ambient_group3_anim1, listOn, listOff, settings.ambient_group3_off1, 1, settings.ambient_group3_numslots );
483 addAnimToList( settings.ambient_group3_anim2, listOn, listOff, settings.ambient_group3_off2, 2, settings.ambient_group3_numslots );
484 addAnimToList( settings.ambient_group3_anim3, listOn, listOff, settings.ambient_group3_off3, 3, settings.ambient_group3_numslots );
485 addAnimToList( settings.ambient_group3_anim4, listOn, listOff, settings.ambient_group3_off4, 4, settings.ambient_group3_numslots );
488 addAnimToList( settings.ambient_group4_anim1, listOn, listOff, settings.ambient_group4_off1, 1, settings.ambient_group4_numslots );
489 addAnimToList( settings.ambient_group4_anim2, listOn, listOff, settings.ambient_group4_off2, 2, settings.ambient_group4_numslots );
490 addAnimToList( settings.ambient_group4_anim3, listOn, listOff, settings.ambient_group4_off3, 3, settings.ambient_group4_numslots );
491 addAnimToList( settings.ambient_group4_anim4, listOn, listOff, settings.ambient_group4_off4, 4, settings.ambient_group4_numslots );
506 for ( i = 0; i < listOn.size; i++ )
508 self SetAnim( listOn[i], weightOn, 0.2, 1.0 );
511 for ( i = 0; i < listOff.size; i++ )
513 self SetAnim( listOff[i], weightOff, 0.2, 1.0 );
539 self endon(
"entityshutdown" );
541 if( !isdefined(
self.scriptbundlesettings ) )
548 if ( !isdefined( settings ) || !isdefined( settings.lightgroups_numGroups ) )
558 if ( isdefined(
self.lightfxgroups ) && groupID <
self.lightfxgroups.size )
560 foreach( fx_handle
in self.lightfxgroups[ groupID ] )
562 StopFX( localClientNum, fx_handle );
572 if ( !isdefined(
self.lightfxgroups ) )
574 self.lightfxgroups = [];
575 for ( i = 0; i < settings.lightgroups_numGroups; i++ )
577 newfxhandlearray = [];
578 ARRAY_ADD(
self.lightfxgroups, newfxhandlearray );
582 self.lightfxgroups[groupID] = [];
590 addFxAndTagToLists( settings.lightgroups_1_fx1, settings.lightgroups_1_tag1, fxList, tagList, 1, settings.lightgroups_1_numslots );
591 addFxAndTagToLists( settings.lightgroups_1_fx2, settings.lightgroups_1_tag2, fxList, tagList, 2, settings.lightgroups_1_numslots );
592 addFxAndTagToLists( settings.lightgroups_1_fx3, settings.lightgroups_1_tag3, fxList, tagList, 3, settings.lightgroups_1_numslots );
593 addFxAndTagToLists( settings.lightgroups_1_fx4, settings.lightgroups_1_tag4, fxList, tagList, 4, settings.lightgroups_1_numslots );
596 addFxAndTagToLists( settings.lightgroups_2_fx1, settings.lightgroups_2_tag1, fxList, tagList, 1, settings.lightgroups_2_numslots );
597 addFxAndTagToLists( settings.lightgroups_2_fx2, settings.lightgroups_2_tag2, fxList, tagList, 2, settings.lightgroups_2_numslots );
598 addFxAndTagToLists( settings.lightgroups_2_fx3, settings.lightgroups_2_tag3, fxList, tagList, 3, settings.lightgroups_2_numslots );
599 addFxAndTagToLists( settings.lightgroups_2_fx4, settings.lightgroups_2_tag4, fxList, tagList, 4, settings.lightgroups_2_numslots );
602 addFxAndTagToLists( settings.lightgroups_3_fx1, settings.lightgroups_3_tag1, fxList, tagList, 1, settings.lightgroups_3_numslots );
603 addFxAndTagToLists( settings.lightgroups_3_fx2, settings.lightgroups_3_tag2, fxList, tagList, 2, settings.lightgroups_3_numslots );
604 addFxAndTagToLists( settings.lightgroups_3_fx3, settings.lightgroups_3_tag3, fxList, tagList, 3, settings.lightgroups_3_numslots );
605 addFxAndTagToLists( settings.lightgroups_3_fx4, settings.lightgroups_3_tag4, fxList, tagList, 4, settings.lightgroups_3_numslots );
608 addFxAndTagToLists( settings.lightgroups_4_fx1, settings.lightgroups_4_tag1, fxList, tagList, 1, settings.lightgroups_4_numslots );
609 addFxAndTagToLists( settings.lightgroups_4_fx2, settings.lightgroups_4_tag2, fxList, tagList, 2, settings.lightgroups_4_numslots );
610 addFxAndTagToLists( settings.lightgroups_4_fx3, settings.lightgroups_4_tag3, fxList, tagList, 3, settings.lightgroups_4_numslots );
611 addFxAndTagToLists( settings.lightgroups_4_fx4, settings.lightgroups_4_tag4, fxList, tagList, 4, settings.lightgroups_4_numslots );
615 for ( i = 0; i < fxList.size; i++ )
617 fx_handle = PlayFXOnTag( localClientNum, fxList[i],
self, tagList[i] );
618 ARRAY_ADD(
self.lightfxgroups[groupID], fx_handle );
641 if( isdefined(
self.alert_light_fx_handles ) )
643 for( i = 0; i <
self.alert_light_fx_handles.size; i++ )
645 StopFX( localClientNum,
self.alert_light_fx_handles[ i ] );
649 self.alert_light_fx_handles = undefined;
654 if( isdefined(
self.light_fx_handles ) )
656 for( i = 0; i <
self.light_fx_handles.size; i++ )
658 StopFX( localClientNum,
self.light_fx_handles[ i ] );
662 self.light_fx_handles = undefined;
667 function field_toggle_emp( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
672 function field_toggle_burn( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
679 if( !isdefined(
self.settings ) && isdefined(
self.scriptbundlesettings ) )
684 if( !isdefined(
self.settings ) )
689 self endon(
"entityshutdown" );
690 self notify(
"end_toggle_field_fx_" +
name );
691 self endon(
"end_toggle_field_fx_" +
name );
694 if ( !isdefined(
self.fx_handles ) )
696 self.fx_handles = [];
699 if ( isdefined(
self.fx_handles[
name ] ) )
701 handle =
self.fx_handles[
name ];
702 if ( IsArray( handle ) )
704 foreach( handleElement
in handle )
706 StopFX( localClientNum, handleElement );
711 StopFX( localClientNum, handle );
719 fx = GetStructField(
self.settings,
name +
"_fx_" + i );
720 if ( !isdefined( fx ) )
724 tag = GetStructField(
self.settings,
name +
"_tag_" + i );
725 delay = GetStructField(
self.settings,
name +
"_delay_" + i );
733 self endon(
"entityshutdown" );
734 self endon(
"end_toggle_field_fx_" +
name );
736 if ( !isdefined( tag ) )
746 fx_handle = PlayFxOnTag( localClientNum, fx,
self, tag );
750 function field_toggle_sounds( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
756 self notify(
"stop_heli_sounds" );
757 self.should_not_play_sounds =
true;
761 self notify(
"play_heli_sounds" );
762 self.should_not_play_sounds =
false;
768 self disablevehiclesounds();
772 self enablevehiclesounds();
780 self thread postfx::PlayPostfxBundle(
"pstfx_dni_vehicle_dmg" );
787 if( newval == oldVal )
790 if( !isdefined( player ) || !( player IsLocalPlayer() ) )
798 else if( newVal == 1 )
802 player thread postfx::PlayPostfxBundle(
"pstfx_infrared" );
806 else if( newVal == 2 )
808 should_change =
true;
813 player thread postfx::PlayPostfxBundle(
"pstfx_flir" );
823 assert( isdefined( player ) );
825 if ( player GetInKillCam( localClientNum ) )
827 killCamEntity = player GetKillCamEntity( localClientNum );
828 if ( isdefined( killCamEntity ) && ( killCamEntity != player ) )
838 if( newval == oldVal )
841 if( !isdefined( player ) || !( player IsLocalPlayer() ) )
848 else if( newVal == 1 )
850 player thread postfx::PlayPostfxBundle(
"pstfx_static" );
857 controllerModel = GetUIModelForController( localClientNum );
858 model = GetUIModel( controllerModel,
"vehicle.fullscreenFilter" );
859 if ( isdefined( model ) )
861 SetUIModelValue( model, vision_set_value );
870 /#PrintLn(
"****CLIENT:: Vehicle Flag Plane");#/
874 if(isdefined(bNewEnt) && bNewEnt)
876 self.csf_no_tread =
true;
885 if(isdefined(
self.csf_no_tread))
887 self.csf_no_tread =
false;
897 /#PrintLn(
"****CLIENT:: Vehicle Flag Tread FX Set");#/
898 if(isdefined(bNewEnt) && bNewEnt)
900 /#PrintLn(
"****CLIENT:: TreadFX NewEnt: " +
self GetEntityNumber());#/
901 self.csf_no_tread =
true;
905 /#PrintLn(
"****CLIENT:: TreadFX OldEnt" +
self GetEntityNumber());#/
911 /#PrintLn(
"****CLIENT:: Vehicle Flag Tread FX Clear");#/
912 if(isdefined(
self.csf_no_tread))
914 self.csf_no_tread =
false;
929 self.engine_damage_low =
false;
930 self.engine_damage_high =
false;
934 self.engine_damage_low =
true;
935 self.engine_damage_high =
false;
939 self.engine_damage_low =
false;
940 self.engine_damage_high =
true;
948 function field_do_deathfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
950 self endon(
"entityshutdown" );
954 self field_do_empdeathfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump );
964 if( newVal && !bInitialSnap )
968 if( isdefined(
self.deathfxname ) )
970 if ( isdefined(
self.deathfxtag ) &&
self.deathfxtag !=
"" )
972 handle = PlayFXOnTag( localClientNum,
self.deathfxname,
self,
self.deathfxtag );
976 handle = PlayFX( localClientNum,
self.deathfxname,
self.origin );
978 SetFXIgnorePause( localClientNum, handle,
true );
981 self PlaySound( localClientNum,
self.deathfxsound );
983 if ( isdefined(
self.deathquakescale ) &&
self.deathquakescale > 0 )
985 self Earthquake(
self.deathquakescale,
self.deathquakeduration,
self.origin,
self.deathquakeradius );
990 function field_do_empdeathfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
992 if( !isdefined(
self.settings ) && isdefined(
self.scriptbundlesettings ) )
997 if( !isdefined(
self.settings ) )
1003 if( newVal && !bInitialSnap )
1009 if( isdefined( s.emp_death_fx_1 ) )
1011 if ( isdefined( s.emp_death_tag_1 ) && s.emp_death_tag_1 !=
"" )
1013 handle = PlayFXOnTag( localClientNum, s.emp_death_fx_1,
self, s.emp_death_tag_1 );
1017 handle = PlayFX( localClientNum, s.emp_death_tag_1,
self.origin );
1019 SetFXIgnorePause( localClientNum, handle,
true );
1022 self PlaySound( localClientNum, s.emp_death_sound_1 );
1025 if ( isdefined(
self.deathquakescale ) &&
self.deathquakescale > 0 )
1027 self Earthquake(
self.deathquakescale * 0.25,
self.deathquakeduration * 2.0,
self.origin,
self.deathquakeradius );
1036 if( !isdefined(
self.scriptbundlesettings ) )
1041 if( !isdefined(
self.alert_light_fx_handles ) )
1043 self.alert_light_fx_handles = [];
1053 if( isdefined( settings.unawarelightfx1 ) )
1055 self.alert_light_fx_handles[ 0 ] = PlayFXOnTag( localClientNum, settings.unawarelightfx1,
self, settings.lighttag1 );
1059 if( isdefined( settings.alertlightfx1 ) )
1061 self.alert_light_fx_handles[ 0 ] = PlayFXOnTag( localClientNum, settings.alertlightfx1,
self, settings.lighttag1 );
1065 if( isdefined( settings.combatlightfx1 ) )
1067 self.alert_light_fx_handles[ 0 ] = PlayFXOnTag( localClientNum, settings.combatlightfx1,
self, settings.lighttag1 );
1078 if(isdefined(bNewEnt) && bNewEnt)
1080 self.csf_no_exhaust =
true;
1089 if(isdefined(
self.csf_no_exhaust))
1091 self.csf_no_exhaust =
false;
1101 if( !isdefined(
self.scriptbundlesettings ) )
1108 if ( !isdefined( settings ) || !isdefined( settings.lightgroups_numGroups ) )
1113 if ( settings.lightgroups_numGroups >= 1 && settings.lightgroups_1_always_on !==
true )
1117 if ( settings.lightgroups_numGroups >= 2 && settings.lightgroups_2_always_on !==
true )
1121 if ( settings.lightgroups_numGroups >= 3 && settings.lightgroups_3_always_on !==
true )
1125 if ( settings.lightgroups_numGroups >= 4 && settings.lightgroups_4_always_on !==
true )
1149 else if( newVal == 3 )
1177 if ( isdefined( fx ) && isdefined( tag ) &&
id <= maxID )
1186 if( !isdefined(
self.scriptbundlesettings ) )
1193 if ( isdefined(
self.damage_state_fx_handles ) )
1195 foreach( fx_handle
in self.damage_state_fx_handles )
1197 StopFX( localClientNum, fx_handle );
1201 self.damage_state_fx_handles = [];
1212 addFxAndTagToLists( settings.damagestate_lv1_fx1, settings.damagestate_lv1_tag1, fxList, tagList, 1, settings.damagestate_lv1_numslots );
1213 addFxAndTagToLists( settings.damagestate_lv1_fx2, settings.damagestate_lv1_tag2, fxList, tagList, 2, settings.damagestate_lv1_numslots );
1214 addFxAndTagToLists( settings.damagestate_lv1_fx3, settings.damagestate_lv1_tag3, fxList, tagList, 3, settings.damagestate_lv1_numslots );
1215 addFxAndTagToLists( settings.damagestate_lv1_fx4, settings.damagestate_lv1_tag4, fxList, tagList, 4, settings.damagestate_lv1_numslots );
1216 sound = settings.damagestate_lv1_sound;
1219 addFxAndTagToLists( settings.damagestate_lv2_fx1, settings.damagestate_lv2_tag1, fxList, tagList, 1, settings.damagestate_lv2_numslots );
1220 addFxAndTagToLists( settings.damagestate_lv2_fx2, settings.damagestate_lv2_tag2, fxList, tagList, 2, settings.damagestate_lv2_numslots );
1221 addFxAndTagToLists( settings.damagestate_lv2_fx3, settings.damagestate_lv2_tag3, fxList, tagList, 3, settings.damagestate_lv2_numslots );
1222 addFxAndTagToLists( settings.damagestate_lv2_fx4, settings.damagestate_lv2_tag4, fxList, tagList, 4, settings.damagestate_lv2_numslots );
1223 sound = settings.damagestate_lv2_sound;
1226 addFxAndTagToLists( settings.damagestate_lv3_fx1, settings.damagestate_lv3_tag1, fxList, tagList, 1, settings.damagestate_lv3_numslots );
1227 addFxAndTagToLists( settings.damagestate_lv3_fx2, settings.damagestate_lv3_tag2, fxList, tagList, 2, settings.damagestate_lv3_numslots );
1228 addFxAndTagToLists( settings.damagestate_lv3_fx3, settings.damagestate_lv3_tag3, fxList, tagList, 3, settings.damagestate_lv3_numslots );
1229 addFxAndTagToLists( settings.damagestate_lv3_fx4, settings.damagestate_lv3_tag4, fxList, tagList, 4, settings.damagestate_lv3_numslots );
1230 sound = settings.damagestate_lv3_sound;
1233 addFxAndTagToLists( settings.damagestate_lv4_fx1, settings.damagestate_lv4_tag1, fxList, tagList, 1, settings.damagestate_lv4_numslots );
1234 addFxAndTagToLists( settings.damagestate_lv4_fx2, settings.damagestate_lv4_tag2, fxList, tagList, 2, settings.damagestate_lv4_numslots );
1235 addFxAndTagToLists( settings.damagestate_lv4_fx3, settings.damagestate_lv4_tag3, fxList, tagList, 3, settings.damagestate_lv4_numslots );
1236 addFxAndTagToLists( settings.damagestate_lv4_fx4, settings.damagestate_lv4_tag4, fxList, tagList, 4, settings.damagestate_lv4_numslots );
1237 sound = settings.damagestate_lv4_sound;
1240 addFxAndTagToLists( settings.damagestate_lv5_fx1, settings.damagestate_lv5_tag1, fxList, tagList, 1, settings.damagestate_lv5_numslots );
1241 addFxAndTagToLists( settings.damagestate_lv5_fx2, settings.damagestate_lv5_tag2, fxList, tagList, 2, settings.damagestate_lv5_numslots );
1242 addFxAndTagToLists( settings.damagestate_lv5_fx3, settings.damagestate_lv5_tag3, fxList, tagList, 3, settings.damagestate_lv5_numslots );
1243 addFxAndTagToLists( settings.damagestate_lv5_fx4, settings.damagestate_lv5_tag4, fxList, tagList, 4, settings.damagestate_lv5_numslots );
1244 sound = settings.damagestate_lv5_sound;
1247 addFxAndTagToLists( settings.damagestate_lv6_fx1, settings.damagestate_lv6_tag1, fxList, tagList, 1, settings.damagestate_lv6_numslots );
1248 addFxAndTagToLists( settings.damagestate_lv6_fx2, settings.damagestate_lv6_tag2, fxList, tagList, 2, settings.damagestate_lv6_numslots );
1249 addFxAndTagToLists( settings.damagestate_lv6_fx3, settings.damagestate_lv6_tag3, fxList, tagList, 3, settings.damagestate_lv6_numslots );
1250 addFxAndTagToLists( settings.damagestate_lv6_fx4, settings.damagestate_lv6_tag4, fxList, tagList, 4, settings.damagestate_lv6_numslots );
1251 sound = settings.damagestate_lv6_sound;
1255 for( i = 0; i < fxList.size; i++ )
1257 fx_handle = PlayFXOnTag( localClientNum, fxList[i],
self, tagList[i] );
1258 ARRAY_ADD(
self.damage_state_fx_handles, fx_handle );
1261 if ( isdefined(
self ) && isdefined( sound ) )
1263 self PlaySound( localClientNum, sound );
1269 if( !isdefined(
self.scriptbundlesettings ) )
1276 if( localClientNum == 0 )
1278 velocity =
self GetVelocity();
1280 numDynents =
VAL( settings.death_dynent_count, 0 );
1281 for( i = 0; i < numDynents; i++ )
1283 model = GetStructField( settings,
"death_dynmodel" + i );
1285 if( !isdefined( model ) )
1288 gibpart = GetStructField( settings,
"death_dynent_gib" + i );
1289 if (
self.gibbed ===
true && gibpart ===
true )
1292 pitch =
VAL( GetStructField( settings,
"death_dynent_force_pitch" + i ), 0 );
1293 yaw =
VAL( GetStructField( settings,
"death_dynent_force_yaw" + i ), 0 );
1294 angles = ( RandomFloatRange( pitch - 15, pitch + 15 ), RandomFloatRange( yaw - 20, yaw + 20 ), RandomFloatRange( -20, 20 ) );
1295 direction = AnglesToForward(
self.angles + angles );
1297 minscale =
VAL( GetStructField( settings,
"death_dynent_force_minscale" + i ), 0 );
1298 maxscale =
VAL( GetStructField( settings,
"death_dynent_force_maxscale" + i ), 0 );
1300 force = direction * RandomFloatRange( minscale, maxscale );
1302 offset = (
VAL( GetStructField( settings,
"death_dynent_offsetX" + i ), 0 ),
1303 VAL( GetStructField( settings,
"death_dynent_offsetY" + i ), 0 ),
1304 VAL( GetStructField( settings,
"death_dynent_offsetZ" + i ), 0 ) );
1311 fx = GetStructField( settings,
"death_dynent_fx" + i );
1314 fx = GetStructField( settings,
"death_dynent_elec_fx" + i );
1317 fx = GetStructField( settings,
"death_dynent_fire_fx" + i );
1321 offset = RotatePoint( offset,
self.angles );
1323 if ( newVal > 1 && isdefined( fx ) )
1325 dynent = CreateDynEntAndLaunch( localClientNum, model,
self.origin + offset,
self.angles, (0,0,0), velocity * 0.8, fx );
1327 else if ( newVal == 1 && isdefined( fx ) )
1329 dynent = CreateDynEntAndLaunch( localClientNum, model,
self.origin + offset,
self.angles, (0,0,0), velocity * 0.8, fx );
1333 dynent = CreateDynEntAndLaunch( localClientNum, model,
self.origin + offset,
self.angles, (0,0,0), velocity * 0.8 );
1336 if ( isdefined( dynent ) )
1338 hitOffset = ( randomFloatRange( -5, 5 ), randomFloatRange( -5, 5 ), randomFloatRange( -5, 5 ) );
1339 LaunchDynent( dynent, force, hitOffset );
1347 if( !isdefined(
self.scriptbundlesettings ) )
1354 if( localClientNum == 0 )
1356 velocity =
self GetVelocity();
1359 for( i = 0; i < numDynents; i++ )
1361 model = GetStructField( settings,
"servo_gib_model" + i );
1363 if( !isdefined( model ) )
1370 origin =
self.origin;
1371 angles =
self.angles;
1372 hidetag = GetStructField( settings,
"servo_gib_tag" + i );
1373 if ( isdefined( hidetag ) )
1375 origin =
self GetTagOrigin( hidetag );
1376 angles =
self GetTagAngles( hidetag );
1379 pitch =
VAL( GetStructField( settings,
"servo_gib_force_pitch" + i ), 0 );
1380 yaw =
VAL( GetStructField( settings,
"servo_gib_force_yaw" + i ), 0 );
1381 relative_angles = ( RandomFloatRange( pitch - 5, pitch + 5 ), RandomFloatRange( yaw - 5, yaw + 5 ), RandomFloatRange( -5, 5 ) );
1382 direction = AnglesToForward( angles + relative_angles );
1384 minscale =
VAL( GetStructField( settings,
"servo_gib_force_minscale" + i ), 0 );
1385 maxscale =
VAL( GetStructField( settings,
"servo_gib_force_maxscale" + i ), 0 );
1387 force = direction * RandomFloatRange( minscale, maxscale );
1389 offset = (
VAL( GetStructField( settings,
"servo_gib_offsetX" + i ), 0 ),
1390 VAL( GetStructField( settings,
"servo_gib_offsetY" + i ), 0 ),
1391 VAL( GetStructField( settings,
"servo_gib_offsetZ" + i ), 0 ) );
1393 fx = GetStructField( settings,
"servo_gib_fx" + i );
1395 offset = RotatePoint( offset, angles );
1397 if ( isdefined( fx ) )
1399 dynent = CreateDynEntAndLaunch( localClientNum, model, origin + offset, angles, (0,0,0), velocity * 0.8, fx );
1403 dynent = CreateDynEntAndLaunch( localClientNum, model, origin + offset, angles, (0,0,0), velocity * 0.8 );
1406 if ( isdefined( dynent ) )
1408 hitOffset = ( randomFloatRange( -5, 5 ), randomFloatRange( -5, 5 ), randomFloatRange( -5, 5 ) );
1409 LaunchDynent( dynent, force, hitOffset );
1421 #define MIN_FILTER_INTENSITY 0.5
1422 #define MAX_FILTER_INTENSITY 1
1423 #define FILTER_FADE_IN_TIME 0.1
1424 #define FILTER_FADE_OUT_TIME 0.33
1425 #define FILTER_FADE_IN_RATE MIN_FILTER_INTENSITY / FILTER_FADE_IN_TIME
1426 #define FILTER_FADE_OUT_RATE MAX_FILTER_INTENSITY / FILTER_FADE_OUT_TIME
1427 #define FILTER_DT 0.016667
1432 if ( !isdefined( level.vehicle_damage_filters ) )
1434 level.vehicle_damage_filters = [];
1437 level.vehicle_damage_filters[ 0 ] =
"generic_filter_vehicle_damage";
1438 level.vehicle_damage_filters[ 1 ] =
"generic_filter_sam_damage";
1439 level.vehicle_damage_filters[ 2 ] =
"generic_filter_f35_damage";
1440 level.vehicle_damage_filters[ 3 ] =
"generic_filter_vehicle_damage_sonar";
1441 level.vehicle_damage_filters[ 4 ] =
"generic_filter_rts_vehicle_damage";
1446 level.localPlayers[0].damage_filter_intensity = 0;
1448 materialname = level.vehicle_damage_filters[ materialid ];
1460 level.localPlayers[0].damage_filter_intensity = 0;
1466 level notify(
"damage_filter_off" );
1468 level.localPlayers[0].damage_filter_intensity = 0;
1477 level endon(
"damage_filter" );
1478 level endon(
"damage_filter_off" );
1479 level endon(
"damage_filter_heavy" );
1481 if(!isdefined(level.localPlayers[0].damage_filter_intensity ))
1484 while ( level.localPlayers[0].damage_filter_intensity > 0 )
1487 if ( level.localPlayers[0].damage_filter_intensity < 0 )
1488 level.localPlayers[0].damage_filter_intensity = 0;
1498 level endon(
"damage_filter_off" );
1499 level endon(
"damage_filter_heavy" );
1501 level notify(
"damage_filter" );
1517 level endon(
"damage_filter_off" );
1519 level notify(
"damage_filter_heavy" );