1574 lines
59 KiB
Plaintext
1574 lines
59 KiB
Plaintext
#using scripts\codescripts\struct;
|
|
|
|
#using scripts\shared\clientfield_shared;
|
|
#using scripts\shared\filter_shared;
|
|
#using scripts\shared\math_shared;
|
|
#using scripts\shared\system_shared;
|
|
#using scripts\shared\util_shared;
|
|
#using scripts\shared\postfx_shared;
|
|
#using scripts\shared\vehicleriders_shared;
|
|
|
|
|
|
|
|
|
|
#namespace vehicle;
|
|
|
|
function autoexec __init__sytem__() { system::register("vehicle_shared",&__init__,undefined,undefined); }
|
|
|
|
function __init__()
|
|
{
|
|
level._customVehicleCBFunc = &spawned_callback;
|
|
|
|
clientfield::register( "vehicle", "toggle_lockon", 1, 1, "int", &field_toggle_lockon_handler, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_sounds", 1, 1, "int", &field_toggle_sounds, !true, !true );
|
|
clientfield::register( "vehicle", "use_engine_damage_sounds", 1, 2, "int", &field_use_engine_damage_sounds, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_treadfx", 1, 1, "int", &field_toggle_treadfx, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_exhaustfx", 1, 1, "int", &field_toggle_exhaustfx_handler, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_lights", 1, 2, "int", &field_toggle_lights_handler, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_lights_group1", 1, 1, "int", &field_toggle_lights_group_handler1, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_lights_group2", 1, 1, "int", &field_toggle_lights_group_handler2, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_lights_group3", 1, 1, "int", &field_toggle_lights_group_handler3, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_lights_group4", 1, 1, "int", &field_toggle_lights_group_handler4, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_ambient_anim_group1", 1, 1, "int", &field_toggle_ambient_anim_handler1, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_ambient_anim_group2", 1, 1, "int", &field_toggle_ambient_anim_handler2, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_ambient_anim_group3", 1, 1, "int", &field_toggle_ambient_anim_handler3, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_emp_fx", 1, 1, "int", &field_toggle_emp, !true, !true );
|
|
clientfield::register( "vehicle", "toggle_burn_fx", 1, 1, "int", &field_toggle_burn, !true, !true );
|
|
clientfield::register( "vehicle", "deathfx", 1, 2, "int", &field_do_deathfx, !true, !true );
|
|
clientfield::register( "vehicle", "alert_level", 1, 2, "int", &field_update_alert_level, !true, !true );
|
|
clientfield::register( "vehicle", "set_lighting_ent", 1, 1, "int", &util::field_set_lighting_ent, !true, !true );
|
|
clientfield::register( "vehicle", "use_lighting_ent", 1, 1, "int", &util::field_use_lighting_ent, !true, !true );
|
|
clientfield::register( "vehicle", "damage_level", 1, 3, "int", &field_update_damage_state, !true, !true );
|
|
clientfield::register( "vehicle", "spawn_death_dynents", 1, 2, "int", &field_death_spawn_dynents, !true, !true );
|
|
clientfield::register( "vehicle", "spawn_gib_dynents", 1, 1, "int", &field_gib_spawn_dynents, !true, !true );
|
|
|
|
clientfield::register( "helicopter", "toggle_lockon", 1, 1, "int", &field_toggle_lockon_handler, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_sounds", 1, 1, "int", &vehicle::field_toggle_sounds, !true, !true );
|
|
clientfield::register( "helicopter", "use_engine_damage_sounds", 1, 2, "int", &field_use_engine_damage_sounds, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_treadfx", 1, 1, "int", &field_toggle_treadfx, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_exhaustfx", 1, 1, "int", &field_toggle_exhaustfx_handler, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_lights", 1, 2, "int", &field_toggle_lights_handler, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_lights_group1", 1, 1, "int", &field_toggle_lights_group_handler1, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_lights_group2", 1, 1, "int", &field_toggle_lights_group_handler2, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_lights_group3", 1, 1, "int", &field_toggle_lights_group_handler3, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_lights_group4", 1, 1, "int", &field_toggle_lights_group_handler4, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_ambient_anim_group1", 1, 1, "int", &field_toggle_ambient_anim_handler1, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_ambient_anim_group2", 1, 1, "int", &field_toggle_ambient_anim_handler2, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_ambient_anim_group3", 1, 1, "int", &field_toggle_ambient_anim_handler3, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_emp_fx", 1, 1, "int", &field_toggle_emp, !true, !true );
|
|
clientfield::register( "helicopter", "toggle_burn_fx", 1, 1, "int", &field_toggle_burn, !true, !true );
|
|
clientfield::register( "helicopter", "deathfx", 1, 1, "int", &field_do_deathfx, !true, !true );
|
|
clientfield::register( "helicopter", "alert_level", 1, 2, "int", &field_update_alert_level, !true, !true );
|
|
clientfield::register( "helicopter", "set_lighting_ent", 1, 1, "int", &util::field_set_lighting_ent, !true, !true );
|
|
clientfield::register( "helicopter", "use_lighting_ent", 1, 1, "int", &util::field_use_lighting_ent, !true, !true );
|
|
clientfield::register( "helicopter", "damage_level", 1, 3, "int", &field_update_damage_state, !true, !true );
|
|
clientfield::register( "helicopter", "spawn_death_dynents", 1, 2, "int", &field_death_spawn_dynents, !true, !true );
|
|
clientfield::register( "helicopter", "spawn_gib_dynents", 1, 1, "int", &field_gib_spawn_dynents, !true, !true );
|
|
|
|
clientfield::register( "plane", "toggle_treadfx", 1, 1, "int", &field_toggle_treadfx, !true, !true );
|
|
|
|
clientfield::register( "toplayer", "toggle_dnidamagefx", 1, 1, "int", &field_toggle_dnidamagefx, !true, !true );
|
|
|
|
clientfield::register( "toplayer", "toggle_flir_postfx", 1, 2, "int", &toggle_flir_postfxbundle, !true, !true );
|
|
|
|
clientfield::register( "toplayer", "static_postfx", 1, 1, "int", &set_static_postfxbundle, !true, !true );
|
|
}
|
|
|
|
function add_vehicletype_callback( vehicletype, callback )
|
|
{
|
|
if ( !isdefined( level.vehicleTypeCallbackArray ) )
|
|
{
|
|
level.vehicleTypeCallbackArray = [];
|
|
}
|
|
|
|
level.vehicleTypeCallbackArray[vehicletype] = callback;
|
|
}
|
|
|
|
function spawned_callback( localClientNum )
|
|
{
|
|
if ( isdefined( self.vehicleridersbundle ) )
|
|
{
|
|
set_vehicleriders_bundle( self.vehicleridersbundle );
|
|
}
|
|
|
|
vehicletype = self.vehicletype;
|
|
if( isdefined( level.vehicleTypeCallbackArray ) )
|
|
{
|
|
if ( isdefined( vehicletype ) && isdefined( level.vehicleTypeCallbackArray[vehicletype] ) )
|
|
{
|
|
self thread [[level.vehicleTypeCallbackArray[vehicletype]]]( localClientNum );
|
|
}
|
|
else if( isdefined( self.scriptvehicletype ) && isdefined( level.vehicleTypeCallbackArray[self.scriptvehicletype] ) )
|
|
{
|
|
self thread [[level.vehicleTypeCallbackArray[self.scriptvehicletype]]]( localClientNum );
|
|
}
|
|
}
|
|
}
|
|
|
|
function rumble( localClientNum )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
if( !isdefined( self.rumbletype ) || ( self.rumbleradius == 0 ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Init undefined variables
|
|
if( !isdefined( self.rumbleon ) )
|
|
{
|
|
self.rumbleon = true;
|
|
}
|
|
|
|
// need to decide if these variables should readOnly or not...
|
|
// if( !isdefined( self.rumblescale ) )
|
|
// {
|
|
// self.rumblescale = 0.15;
|
|
// }
|
|
// if( !isdefined( self.rumbleduration ) )
|
|
// {
|
|
// self.rumbleduration = 4.5;
|
|
// }
|
|
// if( !isdefined( self.rumbleradius ) )
|
|
// {
|
|
// self.rumbleradius = 600;
|
|
// }
|
|
// if( !isdefined( self.rumblebasetime ) )
|
|
// {
|
|
// self.rumblebasetime = 1;
|
|
// }
|
|
// if( !isdefined( self.rumbleadditionaltime ) )
|
|
// {
|
|
// self.rumbleadditionaltime = 1;
|
|
// }
|
|
|
|
height = self.rumbleradius * 2;
|
|
zoffset = -1 * self.rumbleradius;
|
|
|
|
self.player_touching = 0;
|
|
|
|
// This is threaded on each vehicle, per local client - so we only need to be concerned with checking on
|
|
// client that we've been threaded on.
|
|
|
|
radius_squared = self.rumbleradius * self.rumbleradius;
|
|
|
|
wait 2; // hack to let the getloaclplayers return a valid local player
|
|
|
|
while( 1 )
|
|
{
|
|
if( !isdefined( level.localPlayers[localClientNum] ) || ( distancesquared( self.origin, level.localPlayers[localClientNum].origin ) > radius_squared ) || self getspeed() == 0 )
|
|
{
|
|
wait( 0.2 );
|
|
continue;
|
|
}
|
|
|
|
if( isdefined( self.rumbleon ) && !self.rumbleon )
|
|
{
|
|
wait( 0.2 );
|
|
continue;
|
|
}
|
|
|
|
self PlayRumbleLoopOnEntity( localClientNum, self.rumbletype );
|
|
|
|
while( isdefined( level.localPlayers[localClientNum] ) && ( distancesquared( self.origin, level.localPlayers[localClientNum].origin ) < radius_squared ) && ( self getspeed() > 0 ) )
|
|
{
|
|
self earthquake( self.rumblescale, self.rumbleduration, self.origin, self.rumbleradius ); // scale duration source radius
|
|
time_to_wait = self.rumblebasetime + randomfloat( self.rumbleadditionaltime );
|
|
if( time_to_wait <= 0 )
|
|
{
|
|
time_to_wait = 0.05;
|
|
}
|
|
wait( time_to_wait );
|
|
}
|
|
|
|
if ( isdefined( level.localPlayers[localClientNum] ) )
|
|
{
|
|
self StopRumble( localClientNum, self.rumbletype );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
function kill_treads_forever()
|
|
{
|
|
//PrintLn("****CLIENT:: killing the tread_fx");
|
|
self notify( "kill_treads_forever" );
|
|
}
|
|
|
|
function play_exhaust( localClientNum )
|
|
{
|
|
if( isdefined(self.csf_no_exhaust) && self.csf_no_exhaust )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( !isdefined( self.exhaust_fx ) && isdefined( self.exhaustfxname ) )
|
|
{
|
|
if( !isdefined( level._effect ) )
|
|
{
|
|
level._effect = [];
|
|
}
|
|
|
|
if ( !isdefined( level._effect[self.exhaustfxname] ) )
|
|
{
|
|
level._effect[self.exhaustfxname] = self.exhaustfxname;
|
|
}
|
|
self.exhaust_fx = level._effect[self.exhaustfxname];
|
|
}
|
|
|
|
if( isdefined( self.exhaust_fx ) && isdefined( self.exhaustFxTag1 ) )
|
|
{
|
|
if( isalive(self) )
|
|
{
|
|
Assert( isdefined( self.exhaustFxTag1 ), self.vehicletype + " vehicle exhaust effect is set, but tag 1 is undefined. Please update the vehicle gdt entry" );
|
|
|
|
self endon( "entityshutdown" );
|
|
|
|
self wait_for_DObj( localClientNum );
|
|
self.exhaust_id_left = PlayFXOnTag( localClientNum, self.exhaust_fx, self, self.exhaustFxTag1 );
|
|
|
|
if( !isdefined( self.exhaust_id_right ) && IsDefined( self.exhaustFxTag2 ) )
|
|
{
|
|
self.exhaust_id_right = PlayFXOnTag( localClientNum, self.exhaust_fx, self, self.exhaustFxTag2 );
|
|
}
|
|
|
|
self thread kill_exhaust_watcher( localClientNum );
|
|
}
|
|
}
|
|
}
|
|
|
|
function kill_exhaust_watcher( localClientNum )
|
|
{
|
|
self waittill( "stop_exhaust_fx" );
|
|
|
|
if ( isdefined( self.exhaust_id_left ) )
|
|
{
|
|
StopFX( localClientNum, self.exhaust_id_left );
|
|
self.exhaust_id_left = undefined;
|
|
}
|
|
|
|
if ( isdefined( self.exhaust_id_right ) )
|
|
{
|
|
StopFX( localClientNum, self.exhaust_id_right );
|
|
self.exhaust_id_right = undefined;
|
|
}
|
|
}
|
|
|
|
function stop_exhaust( localClientNum )
|
|
{
|
|
self notify( "stop_exhaust_fx" );
|
|
}
|
|
|
|
function aircraft_dustkick()
|
|
{
|
|
waittillframeend;
|
|
|
|
self endon( "kill_treads_forever" );
|
|
self endon( "entityshutdown" );
|
|
|
|
if(!IsDefined(self))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( isdefined(self.csf_no_tread) && self.csf_no_tread ) //-- set by clientside flag
|
|
{
|
|
return;
|
|
}
|
|
|
|
const maxHeight = 1200;
|
|
const minHeight = 350;
|
|
|
|
const slowestRepeatWait = 0.2;
|
|
const fastestRepeatWait = 0.1;
|
|
|
|
if( (self.vehicleclass == "plane_mig17" || self.vehicleclass == "plane_mig21") ) //-- GLOCKE: added in just for jets for Flash Point
|
|
{
|
|
numFramesPerTrace = 1;
|
|
}
|
|
else
|
|
{
|
|
numFramesPerTrace = 3;
|
|
}
|
|
doTraceThisFrame = numFramesPerTrace;
|
|
|
|
const defaultRepeatRate = 1.0;
|
|
repeatRate = defaultRepeatRate;
|
|
|
|
trace = undefined;
|
|
d = undefined;
|
|
|
|
trace_ent = self;
|
|
|
|
while( isdefined( self ) )
|
|
{
|
|
|
|
if( repeatRate <= 0 )
|
|
{
|
|
repeatRate = defaultRepeatRate;
|
|
}
|
|
|
|
if( (self.vehicleclass == "plane_mig17" || self.vehicleclass == "plane_mig21") ) //-- GLOCKE: added in just for jets for Flash Point
|
|
{
|
|
repeatRate = 0.02;
|
|
}
|
|
|
|
waitrealtime( repeatRate );
|
|
|
|
if( !isdefined( self ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
doTraceThisFrame-- ;
|
|
|
|
if( doTraceThisFrame <= 0 )
|
|
{
|
|
doTraceThisFrame = numFramesPerTrace;
|
|
|
|
trace = tracepoint( trace_ent.origin, trace_ent.origin -( 0, 0, 100000 ) );
|
|
/*
|
|
trace["fraction"]
|
|
trace["normal"]
|
|
trace["position"]
|
|
trace["surfacetype"]
|
|
*/
|
|
|
|
d = distance( trace_ent.origin, trace["position"] );
|
|
|
|
if( d > minHeight )
|
|
{
|
|
repeatRate = ( ( d - minHeight ) / ( maxHeight - minHeight ) ) * ( slowestRepeatWait - fastestRepeatWait ) + fastestRepeatWait;
|
|
}
|
|
else
|
|
{
|
|
repeatRate = fastestRepeatWait;
|
|
}
|
|
}
|
|
|
|
if( isdefined( trace ) )
|
|
{
|
|
if( d > maxHeight )
|
|
{
|
|
repeatRate = defaultRepeatRate;
|
|
continue;
|
|
}
|
|
|
|
if( !isdefined( trace["surfacetype"] ) )
|
|
{
|
|
trace["surfacetype"] = "dirt";
|
|
}
|
|
|
|
/*
|
|
if( isdefined( self.treadfxnamearray[trace["surfacetype"]] ) )
|
|
{
|
|
playfx( 0, self.treadfxnamearray[trace["surfacetype"]], trace["position"] );
|
|
//print3d( trace["position"], "+" + self.treadfxnamearray[trace["surfacetype"]], ( 0, 1, 0 ), 1, 3, 30 );
|
|
}
|
|
else
|
|
{
|
|
//-- Glocke (12/16/2008) converted to prints from asserts while I come up with a better solution with Laufer
|
|
/#println("SCRIPT PRINT: Unknown surface type " + trace["surfacetype"] + " for vehicle type " + self.vehicletype);#/
|
|
return;
|
|
}
|
|
*/
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
function weapon_fired()
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
const shock_distance = 400 * 400;
|
|
const rumble_distance = 500 * 500;
|
|
while( true )
|
|
{
|
|
self waittill( "weapon_fired" );
|
|
//println( "<<<<<< CSC VEHICLE_WEAPON_FIRED START" );
|
|
|
|
players = level.localPlayers;
|
|
for( i = 0; i < players.size; i++ )
|
|
{
|
|
player_distance = DistanceSquared( self.origin, players[i].origin );
|
|
//println( "<<<<<< CSC VEHICLE_WEAPON_FIRED PLAYER DISTANCE = " + player_distance );
|
|
|
|
// RUMBLE ------------
|
|
if( player_distance < rumble_distance )
|
|
{
|
|
if( isdefined(self.shootrumble) && self.shootrumble != "" )
|
|
{
|
|
//println( "<<<<<< CSC VEHICLE_WEAPON_FIRED RUMBLE " + self.shootrumble );
|
|
PlayRumbleOnPosition( i, self.shootrumble, self.origin + ( 0, 0, 32 ) );
|
|
}
|
|
}
|
|
|
|
// SHOCK -------------
|
|
if( player_distance < shock_distance )
|
|
{
|
|
fraction = player_distance / shock_distance;
|
|
time = 4 - ( 3 * fraction );
|
|
|
|
if( isdefined( players[i] ) )
|
|
{
|
|
if( isdefined(self.shootshock) && self.shootshock != "" )
|
|
{
|
|
//println( "<<<<<< CSC VEHICLE_WEAPON_FIRED SHELLSHOCK " + self.shootshock );
|
|
players[i] ShellShock( i, self.shootshock, time );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function wait_for_DObj( localClientNum )
|
|
{
|
|
count = 30;
|
|
while( !self HasDObj( localClientNum ) )
|
|
{
|
|
if( count < 0 )
|
|
{
|
|
/#
|
|
IPrintLnBold( "WARNING: Failing to turn on fx lights for vehicle because no DOBJ!" );
|
|
#/
|
|
return;
|
|
}
|
|
{wait(.016);};
|
|
count -= 1;
|
|
}
|
|
}
|
|
|
|
function lights_on( localClientNum, team )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
lights_off( localClientNum ); // make sure we kill all of the old fx
|
|
|
|
wait_for_DObj( localClientNum );
|
|
|
|
if( isdefined( self.lightfxnamearray ) )
|
|
{
|
|
if( !isdefined( self.light_fx_handles ) )
|
|
{
|
|
self.light_fx_handles = [];
|
|
}
|
|
|
|
for( i = 0; i < self.lightfxnamearray.size; i++ )
|
|
{
|
|
self.light_fx_handles[ i ] = PlayFXOnTag( localClientNum, self.lightfxnamearray[i], self, self.lightfxtagarray[i] );
|
|
SetFXIgnorePause( localClientNum, self.light_fx_handles[ i ], true );
|
|
if( IsDefined( team ) )
|
|
{
|
|
SetFXTeam( localClientNum, self.light_fx_handles[ i ], team );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function addAnimToList( animItem, &listOn, &listOff, playWhenOff, id, maxID )
|
|
{
|
|
if ( isdefined( animItem ) && id <= maxID )
|
|
{
|
|
if ( playWhenOff === true )
|
|
{
|
|
if ( !isdefined( listOff ) ) listOff = []; else if ( !IsArray( listOff ) ) listOff = array( listOff ); listOff[listOff.size]=animItem;;
|
|
}
|
|
else
|
|
{
|
|
if ( !isdefined( listOn ) ) listOn = []; else if ( !IsArray( listOn ) ) listOn = array( listOn ); listOn[listOn.size]=animItem;;
|
|
}
|
|
}
|
|
}
|
|
|
|
function ambient_anim_toggle( localClientNum, groupID, isOn )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
if( !isdefined( self.scriptbundlesettings ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
|
|
|
|
if ( !isdefined( settings ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
wait_for_DObj( localClientNum );
|
|
|
|
listOn = [];
|
|
listOff = [];
|
|
|
|
switch ( groupID )
|
|
{
|
|
case 1:
|
|
addAnimToList( settings.ambient_group1_anim1, listOn, listOff, settings.ambient_group1_off1, 1, settings.ambient_group1_numslots );
|
|
addAnimToList( settings.ambient_group1_anim2, listOn, listOff, settings.ambient_group1_off2, 2, settings.ambient_group1_numslots );
|
|
addAnimToList( settings.ambient_group1_anim3, listOn, listOff, settings.ambient_group1_off3, 3, settings.ambient_group1_numslots );
|
|
addAnimToList( settings.ambient_group1_anim4, listOn, listOff, settings.ambient_group1_off4, 4, settings.ambient_group1_numslots );
|
|
break;
|
|
case 2:
|
|
addAnimToList( settings.ambient_group2_anim1, listOn, listOff, settings.ambient_group2_off1, 1, settings.ambient_group2_numslots );
|
|
addAnimToList( settings.ambient_group2_anim2, listOn, listOff, settings.ambient_group2_off2, 2, settings.ambient_group2_numslots );
|
|
addAnimToList( settings.ambient_group2_anim3, listOn, listOff, settings.ambient_group2_off3, 3, settings.ambient_group2_numslots );
|
|
addAnimToList( settings.ambient_group2_anim4, listOn, listOff, settings.ambient_group2_off4, 4, settings.ambient_group2_numslots );
|
|
break;
|
|
case 3:
|
|
addAnimToList( settings.ambient_group3_anim1, listOn, listOff, settings.ambient_group3_off1, 1, settings.ambient_group3_numslots );
|
|
addAnimToList( settings.ambient_group3_anim2, listOn, listOff, settings.ambient_group3_off2, 2, settings.ambient_group3_numslots );
|
|
addAnimToList( settings.ambient_group3_anim3, listOn, listOff, settings.ambient_group3_off3, 3, settings.ambient_group3_numslots );
|
|
addAnimToList( settings.ambient_group3_anim4, listOn, listOff, settings.ambient_group3_off4, 4, settings.ambient_group3_numslots );
|
|
break;
|
|
case 4:
|
|
addAnimToList( settings.ambient_group4_anim1, listOn, listOff, settings.ambient_group4_off1, 1, settings.ambient_group4_numslots );
|
|
addAnimToList( settings.ambient_group4_anim2, listOn, listOff, settings.ambient_group4_off2, 2, settings.ambient_group4_numslots );
|
|
addAnimToList( settings.ambient_group4_anim3, listOn, listOff, settings.ambient_group4_off3, 3, settings.ambient_group4_numslots );
|
|
addAnimToList( settings.ambient_group4_anim4, listOn, listOff, settings.ambient_group4_off4, 4, settings.ambient_group4_numslots );
|
|
break;
|
|
}
|
|
|
|
if ( isOn )
|
|
{
|
|
weightOn = 1.0;
|
|
weightOff = 0.0;
|
|
}
|
|
else
|
|
{
|
|
weightOn = 0.0;
|
|
weightOff = 1.0;
|
|
}
|
|
|
|
for ( i = 0; i < listOn.size; i++ )
|
|
{
|
|
self SetAnim( listOn[i], weightOn, 0.2, 1.0 );
|
|
}
|
|
|
|
for ( i = 0; i < listOff.size; i++ )
|
|
{
|
|
self SetAnim( listOff[i], weightOff, 0.2, 1.0 );
|
|
}
|
|
}
|
|
|
|
function field_toggle_ambient_anim_handler1( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self ambient_anim_toggle( localClientNum, 1, newVal );
|
|
}
|
|
|
|
function field_toggle_ambient_anim_handler2( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self ambient_anim_toggle( localClientNum, 2, newVal );
|
|
}
|
|
|
|
function field_toggle_ambient_anim_handler3( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self ambient_anim_toggle( localClientNum, 3, newVal );
|
|
}
|
|
|
|
function field_toggle_ambient_anim_handler4( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self ambient_anim_toggle( localClientNum, 4, newVal );
|
|
}
|
|
|
|
function lights_group_toggle( localClientNum, id, isOn )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
if( !isdefined( self.scriptbundlesettings ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
|
|
|
|
if ( !isdefined( settings ) || !isdefined( settings.lightgroups_numGroups ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
wait_for_DObj( localClientNum );
|
|
|
|
groupID = id - 1;
|
|
|
|
// remove old fx
|
|
if ( isdefined( self.lightfxgroups ) && groupID < self.lightfxgroups.size )
|
|
{
|
|
foreach( fx_handle in self.lightfxgroups[ groupID ] )
|
|
{
|
|
StopFX( localClientNum, fx_handle );
|
|
}
|
|
}
|
|
|
|
if ( !isOn )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// initialize
|
|
if ( !isdefined( self.lightfxgroups ) )
|
|
{
|
|
self.lightfxgroups = [];
|
|
for ( i = 0; i < settings.lightgroups_numGroups; i++ )
|
|
{
|
|
newfxhandlearray = [];
|
|
if ( !isdefined( self.lightfxgroups ) ) self.lightfxgroups = []; else if ( !IsArray( self.lightfxgroups ) ) self.lightfxgroups = array( self.lightfxgroups ); self.lightfxgroups[self.lightfxgroups.size]=newfxhandlearray;;
|
|
}
|
|
}
|
|
|
|
self.lightfxgroups[groupID] = [];
|
|
|
|
fxList = [];
|
|
tagList = [];
|
|
|
|
switch ( groupID )
|
|
{
|
|
case 0:
|
|
addFxAndTagToLists( settings.lightgroups_1_fx1, settings.lightgroups_1_tag1, fxList, tagList, 1, settings.lightgroups_1_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_1_fx2, settings.lightgroups_1_tag2, fxList, tagList, 2, settings.lightgroups_1_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_1_fx3, settings.lightgroups_1_tag3, fxList, tagList, 3, settings.lightgroups_1_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_1_fx4, settings.lightgroups_1_tag4, fxList, tagList, 4, settings.lightgroups_1_numslots );
|
|
break;
|
|
case 1:
|
|
addFxAndTagToLists( settings.lightgroups_2_fx1, settings.lightgroups_2_tag1, fxList, tagList, 1, settings.lightgroups_2_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_2_fx2, settings.lightgroups_2_tag2, fxList, tagList, 2, settings.lightgroups_2_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_2_fx3, settings.lightgroups_2_tag3, fxList, tagList, 3, settings.lightgroups_2_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_2_fx4, settings.lightgroups_2_tag4, fxList, tagList, 4, settings.lightgroups_2_numslots );
|
|
break;
|
|
case 2:
|
|
addFxAndTagToLists( settings.lightgroups_3_fx1, settings.lightgroups_3_tag1, fxList, tagList, 1, settings.lightgroups_3_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_3_fx2, settings.lightgroups_3_tag2, fxList, tagList, 2, settings.lightgroups_3_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_3_fx3, settings.lightgroups_3_tag3, fxList, tagList, 3, settings.lightgroups_3_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_3_fx4, settings.lightgroups_3_tag4, fxList, tagList, 4, settings.lightgroups_3_numslots );
|
|
break;
|
|
case 3:
|
|
addFxAndTagToLists( settings.lightgroups_4_fx1, settings.lightgroups_4_tag1, fxList, tagList, 1, settings.lightgroups_4_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_4_fx2, settings.lightgroups_4_tag2, fxList, tagList, 2, settings.lightgroups_4_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_4_fx3, settings.lightgroups_4_tag3, fxList, tagList, 3, settings.lightgroups_4_numslots );
|
|
addFxAndTagToLists( settings.lightgroups_4_fx4, settings.lightgroups_4_tag4, fxList, tagList, 4, settings.lightgroups_4_numslots );
|
|
break;
|
|
}
|
|
|
|
for ( i = 0; i < fxList.size; i++ )
|
|
{
|
|
fx_handle = PlayFXOnTag( localClientNum, fxList[i], self, tagList[i] );
|
|
if ( !isdefined( self.lightfxgroups[groupID] ) ) self.lightfxgroups[groupID] = []; else if ( !IsArray( self.lightfxgroups[groupID] ) ) self.lightfxgroups[groupID] = array( self.lightfxgroups[groupID] ); self.lightfxgroups[groupID][self.lightfxgroups[groupID].size]=fx_handle;;
|
|
}
|
|
}
|
|
|
|
function field_toggle_lights_group_handler1( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self lights_group_toggle( localClientNum, 1, newVal );
|
|
}
|
|
function field_toggle_lights_group_handler2( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self lights_group_toggle( localClientNum, 2, newVal );
|
|
}
|
|
function field_toggle_lights_group_handler3( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self lights_group_toggle( localClientNum, 3, newVal );
|
|
}
|
|
function field_toggle_lights_group_handler4( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self lights_group_toggle( localClientNum, 4, newVal );
|
|
}
|
|
|
|
function delete_alert_lights( localClientNum )
|
|
{
|
|
if( isdefined( self.alert_light_fx_handles ) )
|
|
{
|
|
for( i = 0; i < self.alert_light_fx_handles.size; i++ )
|
|
{
|
|
StopFX( localClientNum, self.alert_light_fx_handles[ i ] );
|
|
}
|
|
}
|
|
|
|
self.alert_light_fx_handles = undefined;
|
|
}
|
|
|
|
function lights_off( localClientNum )
|
|
{
|
|
if( isdefined( self.light_fx_handles ) )
|
|
{
|
|
for( i = 0; i < self.light_fx_handles.size; i++ )
|
|
{
|
|
StopFX( localClientNum, self.light_fx_handles[ i ] );
|
|
}
|
|
}
|
|
|
|
self.light_fx_handles = undefined;
|
|
|
|
delete_alert_lights( localClientNum );
|
|
}
|
|
|
|
function field_toggle_emp( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self thread toggle_fx_bundle( localClientNum, "emp_base", newVal == 1 );
|
|
}
|
|
|
|
function field_toggle_burn( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self thread toggle_fx_bundle( localClientNum, "burn_base", newVal == 1 );
|
|
}
|
|
|
|
function toggle_fx_bundle( localClientNum, name, turnOn )
|
|
{
|
|
if( !isdefined( self.settings ) && isdefined( self.scriptbundlesettings ) )
|
|
{
|
|
self.settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
|
|
}
|
|
|
|
if( !isdefined( self.settings ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
self endon( "entityshutdown" );
|
|
self notify( "end_toggle_field_fx_" + name );
|
|
self endon( "end_toggle_field_fx_" + name );
|
|
wait_for_DObj( localClientNum );
|
|
|
|
if ( !isdefined( self.fx_handles ) )
|
|
{
|
|
self.fx_handles = [];
|
|
}
|
|
|
|
if ( isdefined( self.fx_handles[ name ] ) )
|
|
{
|
|
handle = self.fx_handles[ name ];
|
|
if ( IsArray( handle ) )
|
|
{
|
|
foreach( handleElement in handle )
|
|
{
|
|
StopFX( localClientNum, handleElement );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
StopFX( localClientNum, handle );
|
|
}
|
|
}
|
|
|
|
if( turnOn )
|
|
{
|
|
for( i = 1; ; i++ )
|
|
{
|
|
fx = GetStructField( self.settings, name + "_fx_" + i );
|
|
if ( !isdefined( fx ) )
|
|
{
|
|
return;
|
|
}
|
|
tag = GetStructField( self.settings, name + "_tag_" + i );
|
|
delay = GetStructField( self.settings, name + "_delay_" + i );
|
|
self thread delayed_fx_thread( localClientNum, name, fx, tag, delay );
|
|
}
|
|
}
|
|
}
|
|
|
|
function delayed_fx_thread( localClientNum, name, fx, tag, delay )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
self endon( "end_toggle_field_fx_" + name );
|
|
|
|
if ( !isdefined( tag ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( delay ) && delay > 0 )
|
|
{
|
|
wait delay;
|
|
}
|
|
|
|
fx_handle = PlayFxOnTag( localClientNum, fx, self, tag );
|
|
if ( !isdefined( self.fx_handles[ name ] ) ) self.fx_handles[ name ] = []; else if ( !IsArray( self.fx_handles[ name ] ) ) self.fx_handles[ name ] = array( self.fx_handles[ name ] ); self.fx_handles[ name ][self.fx_handles[ name ].size]=fx_handle;;
|
|
}
|
|
|
|
function field_toggle_sounds( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
if( ( isdefined(self.vehicleclass) && (self.vehicleclass == "helicopter" ) ) )
|
|
{
|
|
if(newVal)
|
|
{
|
|
self notify( "stop_heli_sounds" );
|
|
self.should_not_play_sounds = true;
|
|
}
|
|
else
|
|
{
|
|
self notify( "play_heli_sounds" );
|
|
self.should_not_play_sounds = false;
|
|
}
|
|
}
|
|
|
|
if(newVal)
|
|
{
|
|
self disablevehiclesounds();
|
|
}
|
|
else
|
|
{
|
|
self enablevehiclesounds();
|
|
}
|
|
}
|
|
|
|
function field_toggle_dnidamagefx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
if( newVal )
|
|
{
|
|
self thread postfx::PlayPostfxBundle( "pstfx_dni_vehicle_dmg" );
|
|
}
|
|
}
|
|
|
|
function toggle_flir_postfxbundle( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
player = self;
|
|
if( newval == oldVal )
|
|
return;
|
|
|
|
if( !isdefined( player ) || !( player IsLocalPlayer() ) )
|
|
return;
|
|
|
|
if( newVal == 0 )
|
|
{
|
|
player thread postfx::stopPlayingPostfxBundle();
|
|
update_ui_fullscreen_filter_model( localClientNum, 0 );
|
|
}
|
|
else if( newVal == 1 )
|
|
{
|
|
if ( player ShouldChangeScreenPostFx( localClientNum ) )
|
|
{
|
|
player thread postfx::PlayPostfxBundle( "pstfx_infrared" );
|
|
update_ui_fullscreen_filter_model( localClientNum, 2 );
|
|
}
|
|
}
|
|
else if( newVal == 2 )
|
|
{
|
|
should_change = true;
|
|
|
|
|
|
if ( player ShouldChangeScreenPostFx( localClientNum ) )
|
|
{
|
|
player thread postfx::PlayPostfxBundle( "pstfx_flir" );
|
|
update_ui_fullscreen_filter_model( localClientNum, 1 );
|
|
}
|
|
}
|
|
}
|
|
|
|
function ShouldChangeScreenPostFx( localClientNum )
|
|
{
|
|
player = self;
|
|
|
|
assert( isdefined( player ) );
|
|
|
|
if ( player GetInKillCam( localClientNum ) )
|
|
{
|
|
killCamEntity = player GetKillCamEntity( localClientNum );
|
|
if ( isdefined( killCamEntity ) && ( killCamEntity != player ) )
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function set_static_postfxbundle( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
player = self;
|
|
if( newval == oldVal )
|
|
return;
|
|
|
|
if( !isdefined( player ) || !( player IsLocalPlayer() ) )
|
|
return;
|
|
|
|
if( newVal == 0 )
|
|
{
|
|
player thread postfx::stopPlayingPostfxBundle();
|
|
}
|
|
else if( newVal == 1 )
|
|
{
|
|
player thread postfx::PlayPostfxBundle( "pstfx_static" );
|
|
}
|
|
}
|
|
|
|
function update_ui_fullscreen_filter_model( localClientNum, vision_set_value )
|
|
{
|
|
//note: use the VEHICLE_VISION_SET enum to determine values to use
|
|
controllerModel = GetUIModelForController( localClientNum );
|
|
model = GetUIModel( controllerModel, "vehicle.fullscreenFilter" );
|
|
if ( isdefined( model ) )
|
|
{
|
|
SetUIModelValue( model, vision_set_value );
|
|
}
|
|
}
|
|
|
|
function field_toggle_treadfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
|
|
if( ( isdefined(self.vehicleclass) && (self.vehicleclass == "helicopter" ) ) || ( isdefined(self.vehicleclass) && (self.vehicleclass == "plane") ) )
|
|
{
|
|
/#PrintLn("****CLIENT:: Vehicle Flag Plane");#/
|
|
|
|
if(newVal)
|
|
{
|
|
if(isdefined(bNewEnt) && bNewEnt)
|
|
{
|
|
self.csf_no_tread = true;
|
|
}
|
|
else
|
|
{
|
|
self kill_treads_forever();
|
|
}
|
|
}
|
|
else // Flag being cleared.
|
|
{
|
|
if(isdefined(self.csf_no_tread))
|
|
{
|
|
self.csf_no_tread = false;
|
|
}
|
|
self kill_treads_forever();
|
|
self thread aircraft_dustkick();
|
|
}
|
|
}
|
|
else // Non-helicopter version...
|
|
{
|
|
if(newVal)
|
|
{
|
|
/#PrintLn("****CLIENT:: Vehicle Flag Tread FX Set");#/
|
|
if(isdefined(bNewEnt) && bNewEnt)
|
|
{
|
|
/#PrintLn("****CLIENT:: TreadFX NewEnt: " + self GetEntityNumber());#/
|
|
self.csf_no_tread = true;
|
|
}
|
|
else
|
|
{
|
|
/#PrintLn("****CLIENT:: TreadFX OldEnt" + self GetEntityNumber());#/
|
|
self kill_treads_forever();
|
|
}
|
|
}
|
|
else // Flag being cleared.
|
|
{
|
|
/#PrintLn("****CLIENT:: Vehicle Flag Tread FX Clear");#/
|
|
if(isdefined(self.csf_no_tread))
|
|
{
|
|
self.csf_no_tread = false;
|
|
}
|
|
self kill_treads_forever();
|
|
}
|
|
}
|
|
}
|
|
|
|
function field_use_engine_damage_sounds( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
if( ( isdefined(self.vehicleclass) && (self.vehicleclass == "helicopter" ) ) )
|
|
{
|
|
switch ( newVal )
|
|
{
|
|
case 0:
|
|
{
|
|
self.engine_damage_low = false;
|
|
self.engine_damage_high = false;
|
|
} break;
|
|
case 1: // Low
|
|
{
|
|
self.engine_damage_low = true;
|
|
self.engine_damage_high = false;
|
|
} break;
|
|
case 1: // High
|
|
{
|
|
self.engine_damage_low = false;
|
|
self.engine_damage_high = true;
|
|
} break;
|
|
}
|
|
//TODO T7 - bring this over from SP if we need it
|
|
//self helicopter_sounds::update_helicopter_sounds();
|
|
}
|
|
}
|
|
|
|
function field_do_deathfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self endon( "entityshutdown" );
|
|
|
|
if ( newVal == 2 ) // EMP specific death
|
|
{
|
|
self field_do_empdeathfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump );
|
|
}
|
|
else
|
|
{
|
|
self field_do_standarddeathfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump );
|
|
}
|
|
}
|
|
|
|
function field_do_standarddeathfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
if( newVal && !bInitialSnap )
|
|
{
|
|
wait_for_DObj( localClientNum );
|
|
|
|
if( isdefined( self.deathfxname ) )
|
|
{
|
|
if ( isdefined( self.deathfxtag ) && self.deathfxtag != "" )
|
|
{
|
|
handle = PlayFXOnTag( localClientNum, self.deathfxname, self, self.deathfxtag );
|
|
}
|
|
else
|
|
{
|
|
handle = PlayFX( localClientNum, self.deathfxname, self.origin );
|
|
}
|
|
SetFXIgnorePause( localClientNum, handle, true );
|
|
}
|
|
|
|
self PlaySound( localClientNum, self.deathfxsound );
|
|
|
|
if ( isdefined( self.deathquakescale ) && self.deathquakescale > 0 )
|
|
{
|
|
self Earthquake( self.deathquakescale, self.deathquakeduration, self.origin, self.deathquakeradius );
|
|
}
|
|
}
|
|
}
|
|
|
|
function field_do_empdeathfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
if( !isdefined( self.settings ) && isdefined( self.scriptbundlesettings ) )
|
|
{
|
|
self.settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
|
|
}
|
|
|
|
if( !isdefined( self.settings ) )
|
|
{
|
|
self field_do_standarddeathfx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump );
|
|
return;
|
|
}
|
|
|
|
if( newVal && !bInitialSnap )
|
|
{
|
|
wait_for_DObj( localClientNum );
|
|
|
|
s = self.settings;
|
|
|
|
if( isdefined( s.emp_death_fx_1 ) )
|
|
{
|
|
if ( isdefined( s.emp_death_tag_1 ) && s.emp_death_tag_1 != "" )
|
|
{
|
|
handle = PlayFXOnTag( localClientNum, s.emp_death_fx_1, self, s.emp_death_tag_1 );
|
|
}
|
|
else
|
|
{
|
|
handle = PlayFX( localClientNum, s.emp_death_tag_1, self.origin );
|
|
}
|
|
SetFXIgnorePause( localClientNum, handle, true );
|
|
}
|
|
|
|
self PlaySound( localClientNum, s.emp_death_sound_1 );
|
|
|
|
// TODO: perhaps we want to make emp death quake settings
|
|
if ( isdefined( self.deathquakescale ) && self.deathquakescale > 0 )
|
|
{
|
|
self Earthquake( self.deathquakescale * 0.25, self.deathquakeduration * 2.0, self.origin, self.deathquakeradius );
|
|
}
|
|
}
|
|
}
|
|
|
|
function field_update_alert_level( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
vehicle::delete_alert_lights( localClientNum );
|
|
|
|
if( !isdefined( self.scriptbundlesettings ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( !isdefined( self.alert_light_fx_handles ) )
|
|
{
|
|
self.alert_light_fx_handles = [];
|
|
}
|
|
|
|
settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
|
|
|
|
switch( newVal )
|
|
{
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
if( isdefined( settings.unawarelightfx1 ) )
|
|
{
|
|
self.alert_light_fx_handles[ 0 ] = PlayFXOnTag( localClientNum, settings.unawarelightfx1, self, settings.lighttag1 );
|
|
}
|
|
break;
|
|
case 2:
|
|
if( isdefined( settings.alertlightfx1 ) )
|
|
{
|
|
self.alert_light_fx_handles[ 0 ] = PlayFXOnTag( localClientNum, settings.alertlightfx1, self, settings.lighttag1 );
|
|
}
|
|
break;
|
|
case 3:
|
|
if( isdefined( settings.combatlightfx1 ) )
|
|
{
|
|
self.alert_light_fx_handles[ 0 ] = PlayFXOnTag( localClientNum, settings.combatlightfx1, self, settings.lighttag1 );
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
function field_toggle_exhaustfx_handler( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
if(newVal)
|
|
{
|
|
if(isdefined(bNewEnt) && bNewEnt)
|
|
{
|
|
self.csf_no_exhaust = true;
|
|
}
|
|
else
|
|
{
|
|
self stop_exhaust( localClientNum );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(isdefined(self.csf_no_exhaust))
|
|
{
|
|
self.csf_no_exhaust = false;
|
|
}
|
|
self stop_exhaust( localClientNum );
|
|
|
|
self play_exhaust( localClientNum );
|
|
}
|
|
}
|
|
|
|
function control_lights_groups( localClientNum, on )
|
|
{
|
|
if( !isdefined( self.scriptbundlesettings ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
|
|
|
|
if ( !isdefined( settings ) || !isdefined( settings.lightgroups_numGroups ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( settings.lightgroups_numGroups >= 1 && settings.lightgroups_1_always_on !== true )
|
|
{
|
|
lights_group_toggle( localClientNum, 1, on );
|
|
}
|
|
if ( settings.lightgroups_numGroups >= 2 && settings.lightgroups_2_always_on !== true )
|
|
{
|
|
lights_group_toggle( localClientNum, 2, on );
|
|
}
|
|
if ( settings.lightgroups_numGroups >= 3 && settings.lightgroups_3_always_on !== true )
|
|
{
|
|
lights_group_toggle( localClientNum, 3, on );
|
|
}
|
|
if ( settings.lightgroups_numGroups >= 4 && settings.lightgroups_4_always_on !== true )
|
|
{
|
|
lights_group_toggle( localClientNum, 4, on );
|
|
}
|
|
}
|
|
|
|
function field_toggle_lights_handler( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
//lights:
|
|
//0 - turn on normal
|
|
//1 - turn off
|
|
//2 - override to allied color
|
|
//3 - override to axis color
|
|
|
|
if( newVal == 1 )
|
|
{
|
|
self lights_off( localClientNum );
|
|
}
|
|
else // Flag being cleared.
|
|
{
|
|
if( newVal == 2 )
|
|
{
|
|
self lights_on( localClientNum, "allies" );
|
|
}
|
|
else if( newVal == 3 )
|
|
{
|
|
self lights_on( localClientNum, "axis" );
|
|
}
|
|
else
|
|
{
|
|
self lights_on( localClientNum );
|
|
}
|
|
}
|
|
|
|
control_lights_groups( localClientNum, newVal != 1 );
|
|
}
|
|
|
|
function field_toggle_lockon_handler( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
//TODO T7 - work with code to get this back if needed
|
|
/*if(newVal)
|
|
{
|
|
self SetVehicleLockedOn( true );
|
|
}
|
|
else
|
|
{
|
|
self SetVehicleLockedOn( false );
|
|
}*/
|
|
}
|
|
|
|
function addFxAndTagToLists( fx, tag, &fxList, &tagList, id, maxID )
|
|
{
|
|
if ( isdefined( fx ) && isdefined( tag ) && id <= maxID )
|
|
{
|
|
if ( !isdefined( fxList ) ) fxList = []; else if ( !IsArray( fxList ) ) fxList = array( fxList ); fxList[fxList.size]=fx;;
|
|
if ( !isdefined( tagList ) ) tagList = []; else if ( !IsArray( tagList ) ) tagList = array( tagList ); tagList[tagList.size]=tag;;
|
|
}
|
|
}
|
|
|
|
function field_update_damage_state( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
if( !isdefined( self.scriptbundlesettings ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
|
|
|
|
if ( isdefined( self.damage_state_fx_handles ) )
|
|
{
|
|
foreach( fx_handle in self.damage_state_fx_handles )
|
|
{
|
|
StopFX( localClientNum, fx_handle );
|
|
}
|
|
}
|
|
|
|
self.damage_state_fx_handles = [];
|
|
|
|
fxList = [];
|
|
tagList = [];
|
|
sound = undefined;
|
|
|
|
switch( newVal )
|
|
{
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
addFxAndTagToLists( settings.damagestate_lv1_fx1, settings.damagestate_lv1_tag1, fxList, tagList, 1, settings.damagestate_lv1_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv1_fx2, settings.damagestate_lv1_tag2, fxList, tagList, 2, settings.damagestate_lv1_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv1_fx3, settings.damagestate_lv1_tag3, fxList, tagList, 3, settings.damagestate_lv1_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv1_fx4, settings.damagestate_lv1_tag4, fxList, tagList, 4, settings.damagestate_lv1_numslots );
|
|
sound = settings.damagestate_lv1_sound;
|
|
break;
|
|
case 2:
|
|
addFxAndTagToLists( settings.damagestate_lv2_fx1, settings.damagestate_lv2_tag1, fxList, tagList, 1, settings.damagestate_lv2_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv2_fx2, settings.damagestate_lv2_tag2, fxList, tagList, 2, settings.damagestate_lv2_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv2_fx3, settings.damagestate_lv2_tag3, fxList, tagList, 3, settings.damagestate_lv2_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv2_fx4, settings.damagestate_lv2_tag4, fxList, tagList, 4, settings.damagestate_lv2_numslots );
|
|
sound = settings.damagestate_lv2_sound;
|
|
break;
|
|
case 3:
|
|
addFxAndTagToLists( settings.damagestate_lv3_fx1, settings.damagestate_lv3_tag1, fxList, tagList, 1, settings.damagestate_lv3_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv3_fx2, settings.damagestate_lv3_tag2, fxList, tagList, 2, settings.damagestate_lv3_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv3_fx3, settings.damagestate_lv3_tag3, fxList, tagList, 3, settings.damagestate_lv3_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv3_fx4, settings.damagestate_lv3_tag4, fxList, tagList, 4, settings.damagestate_lv3_numslots );
|
|
sound = settings.damagestate_lv3_sound;
|
|
break;
|
|
case 4:
|
|
addFxAndTagToLists( settings.damagestate_lv4_fx1, settings.damagestate_lv4_tag1, fxList, tagList, 1, settings.damagestate_lv4_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv4_fx2, settings.damagestate_lv4_tag2, fxList, tagList, 2, settings.damagestate_lv4_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv4_fx3, settings.damagestate_lv4_tag3, fxList, tagList, 3, settings.damagestate_lv4_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv4_fx4, settings.damagestate_lv4_tag4, fxList, tagList, 4, settings.damagestate_lv4_numslots );
|
|
sound = settings.damagestate_lv4_sound;
|
|
break;
|
|
case 5:
|
|
addFxAndTagToLists( settings.damagestate_lv5_fx1, settings.damagestate_lv5_tag1, fxList, tagList, 1, settings.damagestate_lv5_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv5_fx2, settings.damagestate_lv5_tag2, fxList, tagList, 2, settings.damagestate_lv5_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv5_fx3, settings.damagestate_lv5_tag3, fxList, tagList, 3, settings.damagestate_lv5_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv5_fx4, settings.damagestate_lv5_tag4, fxList, tagList, 4, settings.damagestate_lv5_numslots );
|
|
sound = settings.damagestate_lv5_sound;
|
|
break;
|
|
case 6:
|
|
addFxAndTagToLists( settings.damagestate_lv6_fx1, settings.damagestate_lv6_tag1, fxList, tagList, 1, settings.damagestate_lv6_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv6_fx2, settings.damagestate_lv6_tag2, fxList, tagList, 2, settings.damagestate_lv6_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv6_fx3, settings.damagestate_lv6_tag3, fxList, tagList, 3, settings.damagestate_lv6_numslots );
|
|
addFxAndTagToLists( settings.damagestate_lv6_fx4, settings.damagestate_lv6_tag4, fxList, tagList, 4, settings.damagestate_lv6_numslots );
|
|
sound = settings.damagestate_lv6_sound;
|
|
break;
|
|
}
|
|
|
|
for( i = 0; i < fxList.size; i++ )
|
|
{
|
|
fx_handle = PlayFXOnTag( localClientNum, fxList[i], self, tagList[i] );
|
|
if ( !isdefined( self.damage_state_fx_handles ) ) self.damage_state_fx_handles = []; else if ( !IsArray( self.damage_state_fx_handles ) ) self.damage_state_fx_handles = array( self.damage_state_fx_handles ); self.damage_state_fx_handles[self.damage_state_fx_handles.size]=fx_handle;;
|
|
}
|
|
|
|
if ( isdefined( self ) && isdefined( sound ) )
|
|
{
|
|
self PlaySound( localClientNum, sound );
|
|
}
|
|
}
|
|
|
|
function field_death_spawn_dynents( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
if( !isdefined( self.scriptbundlesettings ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
|
|
|
|
if( localClientNum == 0 ) // dynents are shared between clients
|
|
{
|
|
velocity = self GetVelocity();
|
|
|
|
numDynents = (isdefined(settings.death_dynent_count)?settings.death_dynent_count:0);
|
|
for( i = 0; i < numDynents; i++ )
|
|
{
|
|
model = GetStructField( settings, "death_dynmodel" + i );
|
|
|
|
if( !isdefined( model ) )
|
|
continue;
|
|
|
|
gibpart = GetStructField( settings, "death_dynent_gib" + i );
|
|
if ( self.gibbed === true && gibpart === true )
|
|
continue;
|
|
|
|
pitch = (isdefined(GetStructField( settings, "death_dynent_force_pitch" + i ))?GetStructField( settings, "death_dynent_force_pitch" + i ):0);
|
|
yaw = (isdefined(GetStructField( settings, "death_dynent_force_yaw" + i ))?GetStructField( settings, "death_dynent_force_yaw" + i ):0);
|
|
angles = ( RandomFloatRange( pitch - 15, pitch + 15 ), RandomFloatRange( yaw - 20, yaw + 20 ), RandomFloatRange( -20, 20 ) );
|
|
direction = AnglesToForward( self.angles + angles );
|
|
|
|
minscale = (isdefined(GetStructField( settings, "death_dynent_force_minscale" + i ))?GetStructField( settings, "death_dynent_force_minscale" + i ):0);
|
|
maxscale = (isdefined(GetStructField( settings, "death_dynent_force_maxscale" + i ))?GetStructField( settings, "death_dynent_force_maxscale" + i ):0);
|
|
|
|
force = direction * RandomFloatRange( minscale, maxscale );
|
|
|
|
offset = ( (isdefined(GetStructField( settings, "death_dynent_offsetX" + i ))?GetStructField( settings, "death_dynent_offsetX" + i ):0),
|
|
(isdefined(GetStructField( settings, "death_dynent_offsetY" + i ))?GetStructField( settings, "death_dynent_offsetY" + i ):0),
|
|
(isdefined(GetStructField( settings, "death_dynent_offsetZ" + i ))?GetStructField( settings, "death_dynent_offsetZ" + i ):0) );
|
|
|
|
switch( newVal )
|
|
{
|
|
case 0: // no FX
|
|
break;
|
|
case 1:
|
|
fx = GetStructField( settings, "death_dynent_fx" + i );
|
|
break;
|
|
case 2: // EMP FX
|
|
fx = GetStructField( settings, "death_dynent_elec_fx" + i );
|
|
break;
|
|
case 3: // Burn FX
|
|
fx = GetStructField( settings, "death_dynent_fire_fx" + i );
|
|
break;
|
|
}
|
|
|
|
offset = RotatePoint( offset, self.angles );
|
|
|
|
if ( newVal > 1 && isdefined( fx ) )
|
|
{
|
|
dynent = CreateDynEntAndLaunch( localClientNum, model, self.origin + offset, self.angles, (0,0,0), velocity * 0.8, fx );
|
|
}
|
|
else if ( newVal == 1 && isdefined( fx ) )
|
|
{
|
|
dynent = CreateDynEntAndLaunch( localClientNum, model, self.origin + offset, self.angles, (0,0,0), velocity * 0.8, fx );
|
|
}
|
|
else
|
|
{
|
|
dynent = CreateDynEntAndLaunch( localClientNum, model, self.origin + offset, self.angles, (0,0,0), velocity * 0.8 );
|
|
}
|
|
|
|
if ( isdefined( dynent ) )
|
|
{
|
|
hitOffset = ( randomFloatRange( -5, 5 ), randomFloatRange( -5, 5 ), randomFloatRange( -5, 5 ) );
|
|
LaunchDynent( dynent, force, hitOffset );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function field_gib_spawn_dynents( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
if( !isdefined( self.scriptbundlesettings ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
|
|
|
|
if( localClientNum == 0 ) // dynents are shared between clients
|
|
{
|
|
velocity = self GetVelocity();
|
|
|
|
numDynents = 2;
|
|
for( i = 0; i < numDynents; i++ )
|
|
{
|
|
model = GetStructField( settings, "servo_gib_model" + i );
|
|
|
|
if( !isdefined( model ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
self.gibbed = true; // prevent gibbed death part from spawning on death
|
|
|
|
origin = self.origin;
|
|
angles = self.angles;
|
|
hidetag = GetStructField( settings, "servo_gib_tag" + i );
|
|
if ( isdefined( hidetag ) )
|
|
{
|
|
origin = self GetTagOrigin( hidetag );
|
|
angles = self GetTagAngles( hidetag );
|
|
}
|
|
|
|
pitch = (isdefined(GetStructField( settings, "servo_gib_force_pitch" + i ))?GetStructField( settings, "servo_gib_force_pitch" + i ):0);
|
|
yaw = (isdefined(GetStructField( settings, "servo_gib_force_yaw" + i ))?GetStructField( settings, "servo_gib_force_yaw" + i ):0);
|
|
relative_angles = ( RandomFloatRange( pitch - 5, pitch + 5 ), RandomFloatRange( yaw - 5, yaw + 5 ), RandomFloatRange( -5, 5 ) );
|
|
direction = AnglesToForward( angles + relative_angles );
|
|
|
|
minscale = (isdefined(GetStructField( settings, "servo_gib_force_minscale" + i ))?GetStructField( settings, "servo_gib_force_minscale" + i ):0);
|
|
maxscale = (isdefined(GetStructField( settings, "servo_gib_force_maxscale" + i ))?GetStructField( settings, "servo_gib_force_maxscale" + i ):0);
|
|
|
|
force = direction * RandomFloatRange( minscale, maxscale );
|
|
|
|
offset = ( (isdefined(GetStructField( settings, "servo_gib_offsetX" + i ))?GetStructField( settings, "servo_gib_offsetX" + i ):0),
|
|
(isdefined(GetStructField( settings, "servo_gib_offsetY" + i ))?GetStructField( settings, "servo_gib_offsetY" + i ):0),
|
|
(isdefined(GetStructField( settings, "servo_gib_offsetZ" + i ))?GetStructField( settings, "servo_gib_offsetZ" + i ):0) );
|
|
|
|
fx = GetStructField( settings, "servo_gib_fx" + i );
|
|
|
|
offset = RotatePoint( offset, angles );
|
|
|
|
if ( isdefined( fx ) )
|
|
{
|
|
dynent = CreateDynEntAndLaunch( localClientNum, model, origin + offset, angles, (0,0,0), velocity * 0.8, fx );
|
|
}
|
|
else
|
|
{
|
|
dynent = CreateDynEntAndLaunch( localClientNum, model, origin + offset, angles, (0,0,0), velocity * 0.8 );
|
|
}
|
|
|
|
if ( isdefined( dynent ) )
|
|
{
|
|
hitOffset = ( randomFloatRange( -5, 5 ), randomFloatRange( -5, 5 ), randomFloatRange( -5, 5 ) );
|
|
LaunchDynent( dynent, force, hitOffset );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// Generic Full-Screen Damage Filter System
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// yuck
|
|
function autoexec build_damage_filter_list()
|
|
{
|
|
if ( !isdefined( level.vehicle_damage_filters ) )
|
|
{
|
|
level.vehicle_damage_filters = [];
|
|
}
|
|
|
|
level.vehicle_damage_filters[ 0 ] = "generic_filter_vehicle_damage";
|
|
level.vehicle_damage_filters[ 1 ] = "generic_filter_sam_damage";
|
|
level.vehicle_damage_filters[ 2 ] = "generic_filter_f35_damage";
|
|
level.vehicle_damage_filters[ 3 ] = "generic_filter_vehicle_damage_sonar";
|
|
level.vehicle_damage_filters[ 4 ] = "generic_filter_rts_vehicle_damage";
|
|
}
|
|
|
|
function init_damage_filter( materialid )
|
|
{
|
|
level.localPlayers[0].damage_filter_intensity = 0;
|
|
|
|
materialname = level.vehicle_damage_filters[ materialid ];
|
|
|
|
filter::init_filter_vehicle_damage( level.localPlayers[0], materialname );
|
|
filter::enable_filter_vehicle_damage( level.localPlayers[0], 3, materialname );
|
|
filter::set_filter_vehicle_damage_amount( level.localPlayers[0], 3, 0 );
|
|
filter::set_filter_vehicle_sun_position( level.localPlayers[0], 3, 0, 0 );
|
|
}
|
|
|
|
function damage_filter_enable( localClientNum, materialid )
|
|
{
|
|
filter::enable_filter_vehicle_damage( level.localPlayers[0], 3, level.vehicle_damage_filters[ materialid ] );
|
|
|
|
level.localPlayers[0].damage_filter_intensity = 0;
|
|
filter::set_filter_vehicle_damage_amount( level.localPlayers[0], 3, level.localPlayers[0].damage_filter_intensity );
|
|
}
|
|
|
|
function damage_filter_disable( localClientNum )
|
|
{
|
|
level notify( "damage_filter_off" );
|
|
|
|
level.localPlayers[0].damage_filter_intensity = 0;
|
|
filter::set_filter_vehicle_damage_amount( level.localPlayers[0], 3, level.localPlayers[0].damage_filter_intensity );
|
|
|
|
filter::disable_filter_vehicle_damage( level.localPlayers[0], 3 );
|
|
|
|
}
|
|
|
|
function damage_filter_off( localClientNum )
|
|
{
|
|
level endon( "damage_filter" );
|
|
level endon( "damage_filter_off" );
|
|
level endon( "damage_filter_heavy" );
|
|
|
|
if(!isdefined(level.localPlayers[0].damage_filter_intensity ))
|
|
return;
|
|
|
|
while ( level.localPlayers[0].damage_filter_intensity > 0 )
|
|
{
|
|
level.localPlayers[0].damage_filter_intensity -= 1 / 0.33 * 0.016667;
|
|
if ( level.localPlayers[0].damage_filter_intensity < 0 )
|
|
level.localPlayers[0].damage_filter_intensity = 0;
|
|
|
|
filter::set_filter_vehicle_damage_amount( level.localPlayers[0], 3, level.localPlayers[0].damage_filter_intensity );
|
|
|
|
wait( 0.016667 );
|
|
}
|
|
}
|
|
|
|
function damage_filter_light( localClientNum )
|
|
{
|
|
level endon( "damage_filter_off" );
|
|
level endon( "damage_filter_heavy" );
|
|
|
|
level notify( "damage_filter" );
|
|
|
|
while ( level.localPlayers[0].damage_filter_intensity < 0.5 )
|
|
{
|
|
level.localPlayers[0].damage_filter_intensity += 0.5 / 0.1 * 0.016667;
|
|
if ( level.localPlayers[0].damage_filter_intensity > 0.5 )
|
|
level.localPlayers[0].damage_filter_intensity = 0.5;
|
|
|
|
filter::set_filter_vehicle_damage_amount( level.localPlayers[0], 3, level.localPlayers[0].damage_filter_intensity );
|
|
|
|
wait( 0.016667 );
|
|
}
|
|
}
|
|
|
|
function damage_filter_heavy( localClientNum )
|
|
{
|
|
level endon( "damage_filter_off" );
|
|
|
|
level notify( "damage_filter_heavy" );
|
|
|
|
while ( level.localPlayers[0].damage_filter_intensity < 1 )
|
|
{
|
|
level.localPlayers[0].damage_filter_intensity += 0.5 / 0.1 * 0.016667;
|
|
if ( level.localPlayers[0].damage_filter_intensity > 1 )
|
|
level.localPlayers[0].damage_filter_intensity = 1;
|
|
|
|
filter::set_filter_vehicle_damage_amount( level.localPlayers[0], 3, level.localPlayers[0].damage_filter_intensity );
|
|
|
|
wait( 0.016667 );
|
|
}
|
|
}
|
|
|