iw6-scripts-dev/maps/mp/mp_dart_scriptlights.gsc
2024-12-11 11:28:08 +01:00

445 lines
11 KiB
Plaintext

//contains scripted light functions used in mp_dart
#include maps\mp\_utility;
#include common_scripts\utility;
main ()
{
init_lights();
}
//===========================================
// init_lights
//===========================================
init_lights()
{
array_thread( getEntArray( "mp_dart_discoball_light", "targetname" ), ::mp_dart_discoball_light );
array_thread( getEntArray( "mp_dart_discoball_light_reverse", "targetname" ), ::mp_dart_discoball_light_reverse );
mp_dart_pulsing_light = GetEntArray( "mp_dart_pulsing_light", "targetname" );
array_thread( mp_dart_pulsing_light, maps\mp\mp_dart_scriptlights::mp_dart_pulsing_light );
mp_dart_tv_flicker = GetEntArray( "mp_dart_tv_flicker", "targetname" );
array_thread( mp_dart_tv_flicker, maps\mp\mp_dart_scriptlights::mp_dart_tv_flicker );
}
//===========================================
// setup_light_animations
//===========================================
mp_dart_discoball_light()
{
speed = 3;
time = 150000;
self rotatevelocity( ( 0, speed, 0 ), time );
}
//NEXT GEN ONLY. REVERSE ANIMATION FOR MULTIPLE LIGHTS
mp_dart_discoball_light_reverse()
{
speed = -3;
time = 150000;
self rotatevelocity( ( 0, speed, 0 ), time );
}
//Pulsing light for club
//===========================================
//UTILITIES NEEDED FOR SCRIPTED LIGHT EVENTS
//===========================================
mp_dart_restartEffect()
{
self common_scripts\_createfx::restart_fx_looper();
}
/*ent_flag_wait( msg )
{
AssertEx( ( !IsSentient( self ) && IsDefined( self ) ) || IsAlive( self ), "Attempt to check a flag on entity that is not alive or removed" );
while ( IsDefined( self ) && !self.ent_flag[ msg ] )
self waittill( msg );
}
*/
ent_flag( message )
{
AssertEx( IsDefined( message ), "Tried to check flag but the flag was not defined." );
AssertEx( IsDefined( self.ent_flag[ message ] ), "Tried to check flag " + message + " but the flag was not initialized." );
return self.ent_flag[ message ];
}
mp_dart_ent_flag_clear( message )
{
/#
AssertEx( IsDefined( self ), "Attempt to clear a flag on entity that is not defined" );
AssertEx( IsDefined( self.ent_flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message + " on entity." );
Assert( self.ent_flag[ message ] == self.ent_flags_lock[ message ] );
self.ent_flags_lock[ message ] = false;
#/
//do this check so we don't unneccessarily send a notify
if ( self.ent_flag[ message ] )
{
self.ent_flag[ message ] = false;
self notify( message );
}
}
mp_dart_ent_flag_set( message )
{
/#
AssertEx( IsDefined( self ), "Attempt to set a flag on entity that is not defined" );
AssertEx( IsDefined( self.ent_flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message + " on entity." );
Assert( self.ent_flag[ message ] == self.ent_flags_lock[ message ] );
self.ent_flags_lock[ message ] = true;
#/
self.ent_flag[ message ] = true;
self notify( message );
}
mp_dart_ent_flag_init( message )
{
if ( !isDefined( self.ent_flag ) )
{
self.ent_flag = [];
self.ent_flags_lock = [];
}
/#
if ( IsDefined( level.first_frame ) && level.first_frame == -1 )
AssertEx( !isDefined( self.ent_flag[ message ] ), "Attempt to reinitialize existing message: " + message + " on entity." );
#/
self.ent_flag[ message ] = false;
/#
self.ent_flags_lock[ message ] = false;
#/
}
mp_dart_is_light_entity( ent )
{
return ent.classname == "light_spot" || ent.classname == "light_omni" || ent.classname == "light";
}
//===========================================
//TIED MODELS FOR SCRIPTED LIGHTS
//===========================================
mp_dart_pulsing_light()
{
self endon( "stop_dynamic_light_behavior" );
self.linked_models = false;
self.lit_models = undefined;
self.unlit_models = undefined;
self.linked_lights = false;
self.linked_light_ents = [];
self.linked_prefab_ents = undefined;
self.linked_things = [];
//prefab linkto scripts. Finds lit and unlit models.
if ( isdefined( self.script_LinkTo ) )
{
self.linked_prefab_ents = self get_linked_ents();
assertex( self.linked_prefab_ents.size == 2, "Dynamic light at " + self.origin + " needs to script_LinkTo a prefab that contains both on and off light models" );
foreach( ent in self.linked_prefab_ents )
{
if ( ( isdefined( ent.script_noteworthy ) ) && ( ent.script_noteworthy == "on" ) )
{
if (!isdefined(self.lit_models))
self.lit_models[0] = ent;
else
self.lit_models[self.lit_models.size] = ent;
continue;
}
if ( ( isdefined( ent.script_noteworthy ) ) && ( ent.script_noteworthy == "off" ) )
{
if (!isdefined(self.unlit_models))
self.unlit_models[0] = ent;
else
self.unlit_models[self.unlit_models.size] = ent;
self.unlit_model = ent;
continue;
}
if ( mp_dart_is_light_entity( ent ) )
{
self.linked_lights = true;
self.linked_light_ents[ self.linked_light_ents.size ] = ent;
}
}
assertex( isdefined( self.lit_models ), "Dynamic light at " + self.origin + " needs to script_LinkTo a prefab contains a script_model light with script_noteworthy of 'on' " );
assertex( isdefined( self.unlit_models ), "Dynamic light at " + self.origin + " needs to script_LinkTo a prefab contains a script_model light with script_noteworthy of 'on' " );
self.linked_models = true;
}
//CALLS LIGHT FUNCTIONS THAT WILL TIE TO THE MODELS.
self thread mp_dart_generic_flicker_msg_watcher();
self thread mp_dart_generic_flicker();
}
//monitors level notifies to toggle the flicker light
mp_dart_generic_flicker_msg_watcher()
{
self mp_dart_ent_flag_init("flicker_on");
if(isdefined(self.script_light_startnotify) && self.script_light_startnotify != "nil")
{
for(;;)
{
level waittill(self.script_light_startnotify);
self mp_dart_ent_flag_set("flicker_on");
if(isdefined(self.script_light_stopnotify) && self.script_light_stopnotify != "nil")
{
level waittill(self.script_light_stopnotify);
self mp_dart_ent_flag_clear("flicker_on");
}
}
}
else self mp_dart_ent_flag_set("flicker_on");
}
mp_dart_generic_flicker_pause()
{
//If its turned off then, turn everything off and wait till it turns back on
// otherwise just exit
f_on = self getLightIntensity();
if(! self ent_flag("flicker_on"))
{
//Turn the light models off
if ( self.linked_models )
{
if (isdefined(self.lit_models))
{
foreach (lit_model in self.lit_models)
{
if (IsDefined (lit_model.effect))
{
lit_model.effect Delete();
lit_model.effect = undefined;
}
lit_model hide();
}
}
if (isdefined(self.unlit_models))
{
foreach (unlit_model in self.unlit_models)
unlit_model show();
}
}
//Turn the light intensity off
self setLightIntensity( 0 );
if ( self.linked_lights )
{
for ( i = 0; i < self.linked_light_ents.size; i++ )
self.linked_light_ents[ i ] setLightIntensity( 0 );
}
//Wait here til the light is turned back on
self waittill("flicker_on");
//Turn the light intensity back on
self setLightIntensity( f_on );
if ( self.linked_lights )
{
for ( i = 0; i < self.linked_light_ents.size; i++ )
self.linked_light_ents[ i ] setLightIntensity( f_on );
}
//Turn the light models back on
if ( self.linked_models )
{
if (isdefined(self.lit_models))
{
foreach (lit_model in self.lit_models)
{
lit_model show();
if (!IsDefined(lit_model.effect))
{
lit_model.effect = SpawnFx(level._effect["vfx_bulb_single"],lit_model.origin);
TriggerFX(lit_model.effect);
waitframe();
}
}
}
if (isdefined(self.unlit_models))
{
foreach (unlit_model in self.unlit_models)
unlit_model hide();
}
}
}
}
mp_dart_generic_flicker()
{
self endon( "stop_dynamic_light_behavior" );
self endon( "death" );
min_flickerless_time = .2;
max_flickerless_time = 1.0;
on = self getLightIntensity();
off = 0;
curr = on;
num = 0;
//Make the light flicker
while( isdefined( self ) )
{
//Adding a flag start/stop here
self mp_dart_generic_flicker_pause();
num = randomintrange( 1, 10 );
while ( num )
{
//Adding a flag start/stop here
self mp_dart_generic_flicker_pause();
wait( randomfloatrange( .05, .1 ) );
if ( curr > .2 )
{
curr = randomfloatrange( 0, .3 );
if ( self.linked_models )
{
foreach (lit_model in self.lit_models)
{
if (IsDefined (lit_model.effect))
{
lit_model.effect Delete();
lit_model.effect = undefined;
waitframe();
}
lit_model hide();
}
}
if (isdefined(self.unlit_models))
{
foreach (unlit_model in self.unlit_models)
unlit_model show();
}
}
else
{
curr = on;
if ( self.linked_models )
{
if (isdefined(self.lit_models))
{
foreach (lit_model in self.lit_models)
{
lit_model show();
if (!IsDefined(lit_model.effect))
{
lit_model.effect = SpawnFx(level._effect["vfx_bulb_single"],lit_model.origin);
TriggerFX(lit_model.effect);
waitframe();
}
}
}
if(isdefined(self.unlit_models))
{
foreach (unlit_model in self.unlit_models)
{
unlit_model hide();
//maps\_audio::aud_send_msg("light_flicker_on", unlit_model);
}
}
}
}
self setLightIntensity( curr );
if ( self.linked_lights )
{
for ( i = 0; i < self.linked_light_ents.size; i++ )
self.linked_light_ents[ i ] setLightIntensity( curr );
}
num -- ;
}
//This section sets the light back on for flickerless time
//Adding a flag start/stop here
self mp_dart_generic_flicker_pause();
self setLightIntensity( on );
if ( self.linked_lights )
{
for ( i = 0; i < self.linked_light_ents.size; i++ )
self.linked_light_ents[ i ] setLightIntensity( on );
}
if ( self.linked_models )
{
if (isdefined(self.lit_models))
{
foreach (lit_model in self.lit_models)
{
lit_model show();
if (!IsDefined(lit_model.effect))
{
lit_model.effect = SpawnFx(level._effect["vfx_bulb_single"],lit_model.origin);
TriggerFX(lit_model.effect);
waitframe();
}
}
}
if (isdefined(self.unlit_models))
{
foreach (unlit_model in self.unlit_models)
unlit_model hide();
}
}
wait( randomfloatrange( min_flickerless_time, max_flickerless_time ) );
}
}
//TV Flicker
mp_dart_tv_flicker()
{
full = self getLightIntensity();
old_intensity = full;
for ( ;; )
{
intensity = randomfloatrange( full * 0.3, full * 0.9 );
timer = randomfloatrange( 0.05, 0.1 );
timer *= 15;
for ( i = 0; i < timer; i++ )
{
new_intensity = intensity * ( i / timer ) + old_intensity * ( ( timer - i ) / timer );
self setLightIntensity( new_intensity );
wait( 0.05 );
}
old_intensity = intensity;
}
}