1354 lines
36 KiB
Plaintext
1354 lines
36 KiB
Plaintext
#include common_scripts\utility;
|
|
#include maps\mp\_utility;
|
|
#include maps\mp\gametypes\_hud_util;
|
|
#include maps\mp\_dynamic_events;
|
|
#include maps\mp\_audio;
|
|
|
|
WATER_START_DIRECTION = 1;//-1 = tide starts high and goes down. 1 = tide starts low and goes up.
|
|
WATER_HEIGHT_OFFSET = 132;
|
|
PROP_HIDE_OFFSET = 10000;
|
|
//different heights are: start: 128, end: 200, high point: 260
|
|
|
|
main()
|
|
{
|
|
maps\mp\mp_laser2_precache::main();
|
|
maps\createart\mp_laser2_art::main();
|
|
maps\mp\mp_laser2_fx::main();
|
|
thread aud_init();
|
|
|
|
//setting up fog for for reflection probe bake
|
|
/#
|
|
if ( GetDvarInt( "r_reflectionProbeGenerate" ) == 1 )
|
|
{
|
|
//This should work but doesn't
|
|
//maps\createart\mp_laser2_fog_hdr::main();
|
|
//set_fog( "mp_laser2", 0 );
|
|
|
|
//manual way
|
|
setAtmosFog( 0,(0.87037,0.923157,0.975854), (1, 1, 1), 0.03125, 0.0121191, 0.557743, 19.999, 44278.8, 5252.51, 4.06552, 218083, 1, 19.6056, 53.3102,
|
|
(0.795324, -0.208482, 0.569205), 0, 80.5889, 4915.02 );
|
|
}
|
|
#/
|
|
|
|
maps\mp\_load::main();
|
|
maps\mp\mp_laser2_lighting::main();
|
|
maps\mp\mp_laser2_aud::main();
|
|
|
|
maps\mp\_compass::setupMiniMap( "compass_map_mp_laser2" );
|
|
|
|
game["attackers"] = "allies";
|
|
game["defenders"] = "axis";
|
|
|
|
level.aerial_pathnode_offset = 450;
|
|
|
|
thread set_lighting_values();
|
|
thread set_umbra_values();
|
|
level.ospvisionset = "mp_laser2_osp";
|
|
|
|
////////////LEVEL STUFF///////////////
|
|
|
|
if(level.nextgen==true)
|
|
{
|
|
//radar dish
|
|
level thread RotateRadar();
|
|
}
|
|
|
|
// Setting a map-specific OSP light/vision set.
|
|
level.ospvisionset = "mp_laser2_osp";
|
|
level.ospLightSet = "mp_laser2_streak";
|
|
|
|
//map scorestreak
|
|
level.mapCustomKillstreakFunc = ::laser2CustomKillstreakFunc;
|
|
|
|
// OSP overrides
|
|
level.orbitalSupportOverrideFunc = ::laser2CustomOSPFunc;
|
|
|
|
// Orbital Laser overrides
|
|
level.orbitalLaserOverrideFunc = ::laser2CustomOrbitalLaserFunc;
|
|
|
|
//strafing run iverrides
|
|
thread Laser2CustomAirstrike();
|
|
|
|
//buoys
|
|
level.Anim_laserBuoy = "laser_buoy_loop";
|
|
|
|
//water
|
|
level.waterline_offset = 2;
|
|
maps\mp\_water::SetShallowWaterWeapon( "iw5_underwater_mp" );
|
|
level thread maps\mp\_water::init();
|
|
|
|
//dynamic event
|
|
PreCacheRumble( "damage_light" );
|
|
level DynamicEvent_init_sound();
|
|
level DynamicEvent_init();
|
|
level thread DynamicEvent( ::handleMovingWater, undefined, ::handleEndWater );
|
|
|
|
//Tsunami Alarm Light Animation
|
|
level.AlarmSystem = SpawnStruct();
|
|
level.AlarmSystem.SpinnerArray = GetEntArray("horizonal_spinner", "targetname");
|
|
foreach(spinner in level.AlarmSystem.SpinnerArray)
|
|
{
|
|
spinner hide();
|
|
}
|
|
|
|
// clouds
|
|
level thread HandleClouds();
|
|
|
|
//spawns
|
|
thread SpawnSetup();
|
|
}
|
|
|
|
DynamicEvent_init_sound()
|
|
{
|
|
//level.buoyDingSound = "mp_laser_buoy_ding_01";
|
|
//level.buoyDingSound_quiet = "mp_laser_buoy_ding_quiet_01";
|
|
level.tsunami_alarm = "mp_laser2_typhoon_alarm";
|
|
level.tsunami_vo_int = "mp_laser2_vo_tsunami_warning_int";
|
|
level.tsunami_vo_ext = "mp_laser2_vo_tsunami_warning_ext";
|
|
}
|
|
|
|
|
|
laser2CustomKillstreakFunc()
|
|
{
|
|
level.killstreakWeildWeapons["mp_laser2_core"] = true;
|
|
|
|
level thread maps\mp\killstreaks\streak_mp_laser2::init();
|
|
}
|
|
|
|
laser2CustomOSPFunc()
|
|
{
|
|
level.orbitalsupportoverrides.spawnAngleMin = 30; // Default Random(360)
|
|
level.orbitalsupportoverrides.spawnAngleMax = 90; // Default Random(360)
|
|
level.orbitalsupportoverrides.spawnHeight = 9541;
|
|
|
|
if(level.currentgen)
|
|
{
|
|
level.orbitalsupportoverrides.leftArc = 20; //leftArc = 25;
|
|
level.orbitalsupportoverrides.rightArc = 20; //rightArc = 25;
|
|
level.orbitalsupportoverrides.topArc = -30; //topArc = -25;
|
|
level.orbitalsupportoverrides.bottomArc = 60; //bottomArc = 60;
|
|
}
|
|
}
|
|
|
|
laser2CustomOrbitalLaserFunc()
|
|
{
|
|
level.orbitallaseroverrides.spawnHeight = 3300;
|
|
// May be necessary to change FOV with the increased height
|
|
}
|
|
|
|
Laser2CustomAirstrike()
|
|
{
|
|
if(!isdefined(level.airstrikeoverrides))
|
|
{
|
|
level.airstrikeoverrides = SpawnStruct();
|
|
}
|
|
|
|
level.airstrikeoverrides.spawnHeight = 1750;
|
|
}
|
|
|
|
set_lighting_values()
|
|
{
|
|
if ( IsUsingHDR() )
|
|
{ while (true)
|
|
{
|
|
level waittill("connected", player); // we need to set the dvars for each player as he connects.
|
|
player SetClientDvars(
|
|
"r_tonemap", "2"
|
|
);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
set_umbra_values()
|
|
|
|
{
|
|
SetDvar( "r_umbraAccurateOcclusionThreshold", 256 );
|
|
}
|
|
|
|
HandleClouds()
|
|
{
|
|
clouds_exploder_id = 122;
|
|
|
|
ActivatePersistentClientExploder( clouds_exploder_id );
|
|
|
|
level thread HandleCloudsAerialJoin();
|
|
level thread HandleCloudsAerialLeave();
|
|
}
|
|
|
|
EnableCloudsExploder( player )
|
|
{
|
|
clouds_exploder_id = 122;
|
|
|
|
specify_players = false;
|
|
player_list = [];
|
|
|
|
if ( IsDefined( player ) )
|
|
{
|
|
specify_players = true;
|
|
player_list[ player_list.size ] = player;
|
|
if ( IsDefined( player.disableCloudsCount ) )
|
|
{
|
|
player.disableCloudsCount--;
|
|
if ( player.disableCloudsCount <= 0 )
|
|
{
|
|
player.disableCloudsCount = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach ( my_player in level.players )
|
|
{
|
|
if ( IsDefined( my_player.disableCloudsCount ) )
|
|
{
|
|
my_player.disableCloudsCount--;
|
|
if ( my_player.disableCloudsCount > 0 )
|
|
{
|
|
specify_players = true;
|
|
}
|
|
else
|
|
{
|
|
my_player.disableCloudsCount = 0;
|
|
}
|
|
|
|
player_list[ player_list.size ] = my_player;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( specify_players )
|
|
{
|
|
ActivatePersistentClientExploder( clouds_exploder_id, player_list );
|
|
}
|
|
else
|
|
{
|
|
ActivatePersistentClientExploder( clouds_exploder_id );
|
|
}
|
|
}
|
|
|
|
DisableCloudsExploder( player, shouldKill )
|
|
{
|
|
clouds_exploder_id = 122;
|
|
|
|
player_list = [];
|
|
level thread common_scripts\_exploder::deactivate_clientside_exploder( clouds_exploder_id, player, shouldKill );
|
|
if ( IsDefined( player ) )
|
|
{
|
|
player_list[ player_list.size ] = player;
|
|
}
|
|
else
|
|
{
|
|
player_list = level.players;
|
|
}
|
|
|
|
foreach ( my_player in player_list )
|
|
{
|
|
if ( IsDefined( my_player.disableCloudsCount ) )
|
|
my_player.disableCloudsCount++;
|
|
else
|
|
my_player.disableCloudsCount = 1;
|
|
}
|
|
}
|
|
|
|
HandleCloudsAerialJoin()
|
|
{
|
|
while ( 1 )
|
|
{
|
|
level waittill( "player_start_aerial_view", player );
|
|
level DisableCloudsExploder( player, true );
|
|
}
|
|
}
|
|
|
|
HandleCloudsAerialLeave()
|
|
{
|
|
while ( 1 )
|
|
{
|
|
level waittill( "player_stop_aerial_view", player );
|
|
level EnableCloudsExploder( player );
|
|
}
|
|
}
|
|
|
|
|
|
#using_animtree( "animated_props" );
|
|
RotateRadar()
|
|
{
|
|
wait(0.05);
|
|
Radar01 = getent("radar_dish01_rotate", "targetname");
|
|
//Radar01 ScriptModelPlayAnim( "lsr_radar_dish_loop" );
|
|
ScriptModelPlayAnimWithNotify( Radar01, "lsr_radar_dish_loop", "ps_emt_satellite_dish_rotate", "emt_satellite_dish_rotate", "laser2_custom_end_notify", "laser2_custom_ent_end_notify", "laser2_custom_ent2_end_notify" );
|
|
}
|
|
|
|
//buoy lights
|
|
|
|
handlePropAttachments( ParentMover )
|
|
{
|
|
if( isDefined( self.target ) )
|
|
{
|
|
attachments = getentarray( self.target, "targetname" );
|
|
foreach( att in attachments )
|
|
{
|
|
if( isDefined( ParentMover ) ) //attach collision
|
|
att LinkToSynchronizedParent( ParentMover );
|
|
else
|
|
att LinkToSynchronizedParent( self );
|
|
}
|
|
}
|
|
}
|
|
|
|
//water movement stuff
|
|
DynamicEvent_init()
|
|
{
|
|
level endon ( "game_ended" );
|
|
|
|
level.water_warning = undefined;
|
|
|
|
// get all the water ents
|
|
level.ocean = undefined;
|
|
ocean_ents = getentarray( "ocean_water", "targetname" );
|
|
if( isDefined( ocean_ents ) )
|
|
{
|
|
level.ocean = ocean_ents[0];
|
|
if( ocean_ents.size > 0 )
|
|
{
|
|
level.ocean_pieces = array_remove( ocean_ents, level.ocean );
|
|
array_thread( level.ocean_pieces, ::linktoEnt, level.ocean );
|
|
}
|
|
}
|
|
|
|
level.ocean.warning_time = 30;
|
|
level.ocean.origin = level.ocean.origin - (0,0,WATER_HEIGHT_OFFSET );
|
|
ocean_underside = getent("ocean_water_underside", "targetname");
|
|
triggers = getentarray( "trigger_underwater", "targetname" );
|
|
props = getentarray( "ocean_moving_prop", "targetname" );
|
|
buoys = getentarray( "buoy", "targetname" );
|
|
traversable_props = [];
|
|
level.moving_buoys = [];
|
|
water_clip = getentarray( "water_clip", "targetname" );
|
|
level.post_event_geo = getentarray( "post_event_geo", "targetname" );
|
|
level.end_state_geo = getentarray( "end_state_geo", "targetname" );
|
|
level.post_event_nodes = getNodeArray( "post_event_node", "targetname" );
|
|
level.pre_event_nodes = getNodeArray( "pre_event_node", "targetname" );
|
|
level.goliath_bad_landing_volumes = getentarray( "goliath_bad_landing_volume", "targetname" );
|
|
level.drop_pod_bad_places = getentarray( "drop_pod_bad_place", "targetname" );
|
|
level.post_event_pathing_blockers = getentarray( "post_event_pathing_blocker", "targetname" );
|
|
level.pre_event_pathing_blockers = getentarray( "pre_event_pathing_blocker", "targetname" );
|
|
|
|
level handle_event_geo_off();
|
|
level thread handle_pathing_pre_event();
|
|
|
|
foreach( prop in props )
|
|
{
|
|
if( isDefined( prop.script_noteworthy ) && prop.script_noteworthy == "has_collision" )
|
|
traversable_props[traversable_props.size] = prop;
|
|
}
|
|
|
|
foreach( buoy in buoys )
|
|
{
|
|
if( isDefined( buoy.script_noteworthy ) && buoy.script_noteworthy == "moving" )
|
|
level.moving_buoys[level.moving_buoys.size] = buoy;
|
|
}
|
|
|
|
all_props = array_combine( props, level.moving_buoys );
|
|
|
|
// link ents to water
|
|
thread maps\mp\mp_laser2_fx::setupWaves( level.ocean );
|
|
thread maps\mp\mp_laser2_fx::setupOceanFoam( level.ocean );
|
|
|
|
if( isDefined( level.waterline_ents ) )
|
|
array_thread( level.waterline_ents, ::linktoEnt, level.ocean );
|
|
|
|
if (level.nextgen)
|
|
{
|
|
ocean_underside linktoEnt( level.ocean );
|
|
}
|
|
|
|
if( isDefined( water_clip ) && water_clip.size>0 )
|
|
array_thread( water_clip, ::linktoEnt, level.ocean );
|
|
if( isDefined( all_props ) && all_props.size>0 )
|
|
array_thread( all_props, ::linktoEnt, level.ocean );
|
|
if( isDefined( triggers ) && triggers.size > 0 && isDefined( level.ocean ) )
|
|
{
|
|
foreach( trig in triggers )
|
|
trig thread handleWaterTriggerMovement( level.ocean );
|
|
}
|
|
if( isDefined( level.goliath_bad_landing_volumes ) && level.goliath_bad_landing_volumes.size > 0 && isDefined( level.ocean ) )
|
|
{
|
|
foreach( trig in level.goliath_bad_landing_volumes )
|
|
{
|
|
if(IsDefined(trig.script_noteworthy) && trig.script_noteworthy == "dont_move_me")
|
|
{
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
trig thread handleWaterTriggerMovement( level.ocean );
|
|
}
|
|
}
|
|
}
|
|
|
|
//attach collision and buoy lights to their parent ent
|
|
if( isDefined( traversable_props ) && traversable_props.size>0 )
|
|
//array_thread( traversable_props, ::handlePropAttachments, level.ocean_prop_mover );
|
|
array_thread( traversable_props, ::handlePropAttachments, level.ocean );
|
|
if( isDefined( buoys ) && buoys.size>0 )
|
|
array_thread( buoys, ::playBuoyLights );
|
|
|
|
//buoy sound and animation
|
|
if( isDefined( level.moving_buoys ) && level.moving_buoys.size>0 )
|
|
{
|
|
array_thread( level.moving_buoys, ::PlayPropAnim, level.Anim_laserBuoy );
|
|
//array_thread( level.moving_buoys, ::handleBuoyDings, level.buoyDingSound, level.buoyDingSound_quiet );
|
|
array_thread( level.moving_buoys, ::handlePropAttachments, level.ocean );
|
|
}
|
|
|
|
//hide tidal wave mesh until dynamic event
|
|
tidal_wave = GetEnt("tidal_wave", "targetname");
|
|
tidal_wave hide();
|
|
|
|
//other settings
|
|
trigger_off( "trig_kill_00", "targetname" );
|
|
trigger_off( "trig_kill_01", "targetname" );
|
|
trigger_off( "trig_kill_02", "targetname" );
|
|
trigger_off( "trig_kill_03", "targetname" );
|
|
trigger_off( "trig_kill_04", "targetname" );
|
|
trigger_off( "trig_kill_drone_vista", "targetname" );
|
|
|
|
maps\mp\killstreaks\_aerial_utility::setup_kill_drone_trig( "trig_kill_00", "targetname" );
|
|
maps\mp\killstreaks\_aerial_utility::setup_kill_drone_trig( "trig_kill_01", "targetname" );
|
|
maps\mp\killstreaks\_aerial_utility::setup_kill_drone_trig( "trig_kill_02", "targetname" );
|
|
maps\mp\killstreaks\_aerial_utility::setup_kill_drone_trig( "trig_kill_03", "targetname" );
|
|
maps\mp\killstreaks\_aerial_utility::setup_kill_drone_trig( "trig_kill_04", "targetname" );
|
|
maps\mp\killstreaks\_aerial_utility::setup_kill_drone_trig( "trig_kill_drone_vista", "targetname" );
|
|
|
|
thread maps\mp\mp_laser2_fx::playWaves( "end_initial_waves", 4,6, "breaking_wave_01" );
|
|
level setOceanSinValuesLowTide();
|
|
//level.ocean thread oceanSinMovement( level.ocean.origin );
|
|
}
|
|
|
|
connect_paths()
|
|
{
|
|
if( isDefined( self ) )// to allow current-gen to not have these models
|
|
self ConnectPaths();
|
|
}
|
|
|
|
disconnect_paths()
|
|
{
|
|
if( isDefined( self ) )// to allow current-gen to not have these models
|
|
self DisconnectPaths();
|
|
}
|
|
|
|
connect_nodes()
|
|
{
|
|
if( isDefined( self ) )// to allow current-gen to not have these models
|
|
self ConnectNode();
|
|
}
|
|
|
|
disconnect_nodes()
|
|
{
|
|
if( isDefined( self ) )// to allow current-gen to not have these models
|
|
self DisconnectNode();
|
|
}
|
|
|
|
hideGeo()
|
|
{
|
|
if ( IsDefined( self ) && !isDefined( self.isHidden) ) // to allow current-gen to not have these models
|
|
{
|
|
self.isHidden = true;
|
|
//self.origin = self.origin - (0,0,PROP_HIDE_OFFSET);
|
|
self trigger_off();
|
|
}
|
|
}
|
|
|
|
showGeo()
|
|
{
|
|
if ( IsDefined( self ) && isDefined( self.isHidden) ) // to allow current-gen to not have these models
|
|
{
|
|
self.isHidden = undefined;
|
|
//self.origin = self.origin + (0,0,PROP_HIDE_OFFSET);
|
|
self trigger_on();
|
|
}
|
|
}
|
|
|
|
oceanSinMovement( startPoint )
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "end_initial_waves" );
|
|
|
|
self notify( "ocean_sin_movement" );
|
|
self endon( "ocean_sin_movement" );
|
|
|
|
while(true)
|
|
{
|
|
self moveto( (0, level.oceanSinAmplitude, level.oceanSinAmplitude) + startPoint, level.oceanSinPeriod / 2, level.oceanSinPeriod * 0.25, level.oceanSinPeriod * 0.25);
|
|
wait level.oceanSinPeriod / 2;
|
|
self moveto( -1 * (0, level.oceanSinAmplitude, level.oceanSinAmplitude) + startPoint, level.oceanSinPeriod / 2, level.oceanSinPeriod * 0.25, level.oceanSinPeriod * 0.25);
|
|
wait level.oceanSinPeriod / 2;
|
|
}
|
|
}
|
|
|
|
setOceanSinValuesLowTide()
|
|
{
|
|
if(level.nextgen)
|
|
{
|
|
level.oceanSinAmplitude = 12;
|
|
level.oceanSinPeriod = 10;
|
|
}
|
|
else
|
|
{
|
|
level.oceanSinAmplitude = 16;
|
|
level.oceanSinPeriod = 20;
|
|
}
|
|
}
|
|
|
|
setOceanSinValuesHighTide()
|
|
{
|
|
level.oceanSinAmplitude = 6;
|
|
level.oceanSinPeriod = 10;
|
|
}
|
|
|
|
linktoEnt( originEnt )
|
|
{
|
|
mover = self;
|
|
mover LinkToSynchronizedParent( originEnt );
|
|
}
|
|
|
|
|
|
|
|
handleBuoyDings( warningSound, quietSound )
|
|
{
|
|
level endon( "game_ended" );
|
|
|
|
while( true )
|
|
{
|
|
wait( RandomFloatRange( .05, .5 ) );
|
|
|
|
while( !isDefined( level.water_warning ) || level.water_warning != true )
|
|
{
|
|
self play_sound_on_tag( quietSound, "tag_origin" );
|
|
wait( RandomFloatRange( 3, 7 ) ); //wait( RandomFloatRange( .8, 1.2 ) );
|
|
}
|
|
|
|
while ( level.water_warning == true )
|
|
{
|
|
self play_sound_on_tag( warningSound, "tag_origin" );
|
|
wait( RandomFloatRange( 1.5, 4.5 ) ); //wait( RandomFloatRange( .8, 1.2 ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
playBuoyLights()
|
|
{
|
|
self notify( "stop_buoy_lights" );
|
|
self endon( "stop_buoy_lights" );
|
|
|
|
playfxontag( getfx( "light_buoy_red" ), self, "fx_joint_0" );
|
|
wait randomFloat(4);
|
|
stopfxontag( getfx( "light_buoy_red" ), self, "fx_joint_0" );
|
|
wait( .05 );
|
|
playfxontag( getfx( "light_buoy_red" ), self, "fx_joint_0" );
|
|
}
|
|
|
|
PlayPropAnim( animName )
|
|
{
|
|
wait( RandomFloatRange( .1, 1 ));
|
|
self ScriptModelPlayAnim( animName );
|
|
}
|
|
|
|
oceanMover_init( targetname )
|
|
{
|
|
level endon ( "game_ended" );
|
|
|
|
assertEx( isDefined( targetname ), "no targetname specified for oceanMover_init()" );
|
|
|
|
water = getent( targetname, "targetname" );
|
|
|
|
//if someone deletes the moving entities or they loose their targetnames assert and get out of function gracefully
|
|
if( !isDefined( water ))
|
|
{
|
|
AssertMsg( "water is not defined. Expecting targetname of " + targetname );
|
|
return undefined;
|
|
}
|
|
|
|
water.warning_time = 30;
|
|
//water.move_time_up = 5;//time to move
|
|
//water.han_time_down = water.warning_time;//time to move
|
|
//water.warning_dist = (0,0,0);//receading distance
|
|
//water.rise_dist = (0,0,40 + 32);
|
|
//water.dist = water.warning_dist + water.rise_dist;
|
|
//water.loc_start = water.origin;
|
|
//water.loc_end = water.origin + (WATER_START_DIRECTION * water.dist);
|
|
//water.direction = "up";
|
|
|
|
//if( WATER_START_DIRECTION == 1 )
|
|
// water.direction = "down";
|
|
|
|
return water;
|
|
}
|
|
|
|
OceanObjectMover_init( water_ent )
|
|
{
|
|
OceanObjectMover = spawn( "script_origin", (0,0,0) );
|
|
OceanObjectMover.targetname = "OceanObjectMover";
|
|
|
|
OceanObjectMover.dist_prop = (0,352,0);
|
|
|
|
//OceanObjectMover.loc_start = OceanObjectMover.origin;
|
|
//OceanObjectMover.loc_end = OceanObjectMover.origin + (WATER_START_DIRECTION * water_ent.dist) + (WATER_START_DIRECTION * OceanObjectMover.dist_prop);
|
|
|
|
return OceanObjectMover;
|
|
}
|
|
|
|
moving_water_init()
|
|
{
|
|
level endon ( "game_ended" );
|
|
thread maps\mp\mp_laser2_fx::playWaves( "end_initial_waves", 4,6, "breaking_wave_01" );
|
|
}
|
|
|
|
handleEndWater()
|
|
{
|
|
//move water
|
|
level.ocean.origin = level.ocean.origin + (0,0,72);
|
|
|
|
//handle vfx
|
|
level notify( "end_initial_waves" );
|
|
thread maps\mp\mp_laser2_fx::playWaves( undefined, 6, 8, "breaking_wave_01" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 201 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 202 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 203 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 204 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 205 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 206 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 207 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 208 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 209 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 121 );
|
|
|
|
//put all the geo in it's end state
|
|
if( isDefined( level.end_state_geo ) )
|
|
array_thread( level.end_state_geo, ::showGeo );
|
|
|
|
//spawn all the collision for stuff that comes in from the dynamic event
|
|
level handle_event_geo_on();
|
|
level delaythread( .05, ::handle_pathing_post_event );
|
|
}
|
|
|
|
handleMovingWater()
|
|
{
|
|
level endon ( "game_ended" );
|
|
|
|
//disable fog clouds for performance
|
|
level DisableCloudsExploder( undefined, false );
|
|
|
|
level.skipOceanSpawns = true;
|
|
ocean = level.ocean;
|
|
tidal_wave = GetEnt("tidal_wave", "targetname");
|
|
tidal_wave show();
|
|
ocean_model = spawn_tag_origin();
|
|
ocean_model.targetname = "ocean_tag_origin";
|
|
ocean_model show();
|
|
car = getent( "lsr_tidal_wave_car", "targetname" );
|
|
container_closed = getent( "lsr_tidal_wave_shipping_container_closed", "targetname" );
|
|
container_open = getent( "lsr_tidal_wave_shipping_container_open", "targetname" );
|
|
|
|
//tell bots not to go on the beach
|
|
create_bot_badplaces();
|
|
|
|
//kill things in the way of the water
|
|
foreach( trig in level.water_triggers )
|
|
{
|
|
trig thread killObjectsUnderWater();
|
|
}
|
|
level thread addPostEventGeoToCrateBadPlaceArray();
|
|
level thread killPlayersUsingRemoteStreaks();
|
|
|
|
wait( .05);//wait a frame for the ocean models to show
|
|
|
|
//warning
|
|
level.water_warning = true;
|
|
level notify( "end_initial_waves" );
|
|
thread maps\mp\mp_laser2_aud::start_rough_tide();//should rename this to initial tide - since we're potentially changing this
|
|
earthquake_duration = 2;
|
|
Earthquake( .3, earthquake_duration, (0,0,0), 5000 );
|
|
thread aud_dynamic_event_startup( earthquake_duration );
|
|
thread play_earthquake_rumble_for_all_players( .75 );
|
|
|
|
level delaythread( 3, ::handleTsunamiWarningSounds );
|
|
|
|
animtime_wave = 26.667;
|
|
animtime_ocean = 36.7;
|
|
|
|
animtime = animtime_ocean;
|
|
if( animtime_wave > animtime_ocean )
|
|
animtime = animtime_wave;
|
|
|
|
if( ocean.warning_time > animtime )
|
|
wait( ocean.warning_time - animtime );
|
|
else
|
|
wait( 2 );
|
|
|
|
//ocean changes
|
|
tidal_wave thread tidal_wave_notetracks();
|
|
tidal_wave ScriptModelPlayAnimDeltaMotion( "lsr_tidal_wave_mesh_anim", "tidal_wave_notetrack" );
|
|
ocean linkto( ocean_model );
|
|
ocean_model ScriptModelPlayAnimDeltaMotion( "lsr_tidal_wave_ocean_anim" );
|
|
if ( IsDefined( car )) // so current-gen can have the option to remove this model
|
|
{
|
|
car ScriptModelPlayAnimDeltaMotion( "lsr_tidal_wave_car" );
|
|
}
|
|
container_closed ScriptModelPlayAnimDeltaMotion( "lsr_tidal_wave_shipping_container_closed" );
|
|
container_open ScriptModelPlayAnimDeltaMotion( "lsr_tidal_wave_shipping_container_open" );
|
|
|
|
foreach( buoy in level.moving_buoys )
|
|
{
|
|
if( isDefined( buoy.animation ) )
|
|
{
|
|
buoy ScriptModelClearAnim();
|
|
buoy unlink();
|
|
buoy ScriptModelPlayAnimDeltaMotion( buoy.animation );
|
|
buoy thread playBuoyLights();
|
|
buoy delaythread( animtime_ocean, ::buoys_return_to_bobbing );
|
|
}
|
|
}
|
|
|
|
level delaythread( animtime_wave-3, ::stop_water_warning );
|
|
level delaythread( animtime_wave-2.9, ::play_earthquake_rumble_for_all_players, .75 );
|
|
tidal_wave delaycall( animtime_wave, ::Hide );
|
|
ocean_model delaycall( animtime_ocean, ::Hide );
|
|
ocean delaycall( animtime_ocean, ::unlink );
|
|
|
|
wait( animtime );
|
|
|
|
//handle bots
|
|
water_nodes = GetNodeArray( "water_nodes", "targetname" );
|
|
foreach( node in water_nodes )
|
|
{
|
|
NodeSetNotUsable( node, true );
|
|
}
|
|
delete_bot_badplaces();
|
|
|
|
|
|
level.skipOceanSpawns = false;
|
|
|
|
wait 2;
|
|
thread maps\mp\mp_laser2_fx::playWaves( undefined, 6, 8, "breaking_wave_01" );
|
|
|
|
level notify( "dynamic_event_complete" );
|
|
}
|
|
|
|
create_bot_badplaces()
|
|
{
|
|
BadPlace_Cylinder( "badplace_1", -1, (-1096, -688, 229.5), 300, 200 );
|
|
BadPlace_Cylinder( "badplace_2", -1, (-544, -1104, 158), 500, 200 );
|
|
BadPlace_Cylinder( "badplace_3", -1, (0, -1024, 154.286), 500, 200 );
|
|
BadPlace_Cylinder( "badplace_4", -1, (608, -1152, 153.195), 500, 200 );
|
|
BadPlace_Cylinder( "badplace_5", -1, (1360, -832, 203.4), 500, 200 );
|
|
BadPlace_Cylinder( "badplace_6", -1, (2128, -416, 159.325), 500, 200 );
|
|
BadPlace_Cylinder( "badplace_7", -1, (2464, 176, 128), 500, 200 );
|
|
}
|
|
|
|
delete_bot_badplaces()
|
|
{
|
|
BadPlace_Delete( "badplace_1" );
|
|
BadPlace_Delete( "badplace_2" );
|
|
BadPlace_Delete( "badplace_3" );
|
|
BadPlace_Delete( "badplace_4" );
|
|
BadPlace_Delete( "badplace_5" );
|
|
BadPlace_Delete( "badplace_6" );
|
|
BadPlace_Delete( "badplace_7" );
|
|
}
|
|
|
|
killObjectsUnderWater()
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "dynamic_event_complete" );
|
|
|
|
while (true)
|
|
{
|
|
if( IsDefined(level.turrets) )
|
|
{
|
|
foreach(turret in level.turrets)
|
|
{
|
|
if (turret IsTouching( self ))
|
|
{
|
|
turret notify( "death" );
|
|
}
|
|
}
|
|
}
|
|
|
|
if( isDefined( level.carepackages ) )
|
|
{
|
|
foreach(carepackage in level.carepackages)
|
|
{
|
|
if ( isDefined( carepackage ) && !IsRemovedEntity( carepackage ) && carepackage isCarepackageInPostEventGeo() )
|
|
{
|
|
if( isDefined( carepackage.crateType ) && carepackage.crateType != "juggernaut" )
|
|
carepackage maps\mp\killstreaks\_airdrop::deleteCrate( true, true );
|
|
else if( isDefined( carepackage.crateType ) && carepackage.crateType == "juggernaut" )
|
|
carepackage maps\mp\killstreaks\_juggernaut::deleteGoliathPod( true, true );
|
|
}
|
|
}
|
|
}
|
|
|
|
wait(0.05);
|
|
}
|
|
}
|
|
|
|
isCarepackageInPostEventGeo()
|
|
{
|
|
if( isDefined( level.drop_pod_bad_places ) )
|
|
{
|
|
foreach( vol in level.drop_pod_bad_places )
|
|
{
|
|
if ( IsPointInVolume( self.origin, vol ) )
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
addPostEventGeoToCrateBadPlaceArray()
|
|
{
|
|
level waittill( "post_event_geo_on" );
|
|
|
|
foreach( vol in level.drop_pod_bad_places )
|
|
{
|
|
level.orbital_util_covered_volumes[level.orbital_util_covered_volumes.size] = vol;
|
|
}
|
|
}
|
|
|
|
killPlayersUsingRemoteStreaks()
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "dynamic_event_complete" );
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
while( true )
|
|
{
|
|
foreach( player in level.players )
|
|
{
|
|
if( isDefined( player ) && isDefined( player.inwater ) && player maps\mp\_utility::isUsingRemote() )
|
|
{
|
|
player _suicide();
|
|
}
|
|
}
|
|
|
|
wait( .05 );
|
|
}
|
|
}
|
|
|
|
buoys_return_to_bobbing()
|
|
{
|
|
self linkToEnt( level.ocean );
|
|
self ScriptModelClearAnim();
|
|
|
|
wait( RandomFloatRange( .1, 1 ));
|
|
|
|
self ScriptModelPlayAnim( level.Anim_laserBuoy );
|
|
self thread playBuoyLights();
|
|
}
|
|
|
|
play_earthquake_rumble_for_all_players( time )
|
|
{
|
|
foreach( Player in level.players )
|
|
{
|
|
player thread play_earthquake_rumble( time );
|
|
}
|
|
}
|
|
|
|
play_earthquake_rumble( time )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
|
|
frames = time*20;
|
|
|
|
while( frames >= 0 )
|
|
{
|
|
self PlayRumbleOnEntity( "damage_light" );
|
|
wait( .1 );
|
|
frames = frames - 2;
|
|
}
|
|
}
|
|
|
|
stop_water_warning()
|
|
{
|
|
level.water_warning = false;
|
|
array_thread(level.AlarmSystem.SpinnerArray, ::SpinAlarmsStop);
|
|
}
|
|
|
|
//notetracks
|
|
|
|
|
|
tidal_wave_notetracks()
|
|
{
|
|
self thread event_fx();
|
|
self thread event_killtriggers();
|
|
self thread event_geo();
|
|
}
|
|
|
|
event_fx()
|
|
{
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_wave_mist_start" );
|
|
thread maps\mp\mp_laser2_fx::start_wave_mist_fx();
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_receding_foam_start" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 120 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 100 );
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_rocks1_splash" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 101 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 201 );
|
|
thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 0);
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_tower_splash" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 102 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 202 );
|
|
thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 1);
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_concrete_chunk1_splash" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 103 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 203 );
|
|
thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 2);
|
|
thread maps\mp\mp_laser2_fx::stop_wave_mist_fx();
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_wave_collapse1_splash" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 104 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 204 );
|
|
thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 3);
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_wave_collapse2_splash" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 105 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 205 );
|
|
thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 4);
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_wave_collapse3_splash" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 106 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 206 );
|
|
thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 5);
|
|
|
|
//self waittillmatch( "tidal_wave_notetrack" , "vfx_rocks2_splash" );
|
|
//level thread common_scripts\_exploder::activate_clientside_exploder( 107 );
|
|
//thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 6);
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_midbeach_splash" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 107 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 207 );
|
|
thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 6);
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_helipad_splash" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 108 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 208 );
|
|
thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 7);
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "vfx_helipad_splash2" );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 109 );
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 209 );
|
|
thread maps\mp\mp_laser2_fx::playOceanFoam("tidal_wave_lingering_foam1", 8);
|
|
|
|
wait 1.0;
|
|
//start water drips
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( 121 );
|
|
//turn fog back on
|
|
|
|
level EnableCloudsExploder();
|
|
}
|
|
|
|
event_killtriggers()
|
|
{
|
|
trigger_on( "trig_kill_drone_vista", "targetname" );
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "kill_trig_00" ); //22.61
|
|
trigger_off( "trig_kill_drone_vista", "targetname" );
|
|
trigger_on( "trig_kill_00", "targetname" );
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "kill_trig_01" ); //23.22
|
|
trigger_off( "trig_kill_00", "targetname" );
|
|
trigger_on( "trig_kill_01", "targetname" );
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "kill_trig_02" ); //23.71
|
|
trigger_off( "trig_kill_01", "targetname" );
|
|
trigger_on( "trig_kill_02", "targetname" );
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "kill_trig_03" ); //23.92
|
|
trigger_off( "trig_kill_02", "targetname" );
|
|
trigger_on( "trig_kill_03", "targetname" );
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "kill_trig_04" ); //24.17
|
|
trigger_off( "trig_kill_03", "targetname" );
|
|
trigger_on( "trig_kill_04", "targetname" );
|
|
delayThread( 1, ::trigger_off, "trig_kill_04", "targetname" );
|
|
|
|
/*
|
|
self waittillmatch( "tidal_wave_notetrack" , "kill_trig_05" ); //24.42
|
|
trigger_on( "trig_kill_05", "targetname" );
|
|
delayThread( 1, ::trigger_off, "trig_kill_05", "targetname" );
|
|
|
|
self waittillmatch( "tidal_wave_notetrack" , "kill_trig_06" ); //25.09
|
|
trigger_on( "trig_kill_06", "targetname" );
|
|
delayThread( 1, ::trigger_off, "trig_kill_06", "targetname" );
|
|
*/
|
|
}
|
|
|
|
event_geo()
|
|
{
|
|
self waittillmatch( "tidal_wave_notetrack" , "kill_trig_04" );
|
|
|
|
level handle_event_geo_on();
|
|
level handle_pathing_post_event();
|
|
}
|
|
|
|
handle_event_geo_on()
|
|
{
|
|
if ( IsDefined( level.post_event_geo )) // to allow current-gen to not have these models
|
|
{
|
|
foreach( ent in level.post_event_geo )
|
|
{
|
|
ent showGeo();
|
|
}
|
|
|
|
level notify( "post_event_geo_on" );
|
|
}
|
|
|
|
if( isDefined( level.drop_pod_bad_places ) )
|
|
{
|
|
foreach( vol in level.drop_pod_bad_places )
|
|
{
|
|
vol showGeo();
|
|
}
|
|
}
|
|
}
|
|
|
|
handle_event_geo_off()
|
|
{
|
|
if ( IsDefined( level.post_event_geo ) ) // to allow current-gen to not have these models
|
|
{
|
|
foreach( ent in level.post_event_geo )
|
|
{
|
|
ent hideGeo();
|
|
}
|
|
|
|
level notify( "post_event_geo_off" );
|
|
}
|
|
|
|
if( isDefined( level.drop_pod_bad_places ) )
|
|
{
|
|
foreach( vol in level.drop_pod_bad_places )
|
|
{
|
|
vol hideGeo();
|
|
}
|
|
}
|
|
|
|
if( isDefined( level.end_state_geo ) )
|
|
array_thread( level.end_state_geo, ::hideGeo );
|
|
}
|
|
|
|
handle_pathing_pre_event()
|
|
{
|
|
if( getdvar( "scr_dynamic_event_state", "on" ) != "endstate" && ( !IsDefined( level.dynamicEventsType ) || level.dynamicEventsType != 2 ) ) // Disabled (After)
|
|
wait( .05 );//didn't behave correctly when I had this happen imediately at the start of the level had to add a wait
|
|
|
|
//HACK
|
|
foreach( ent in level.pre_event_pathing_blockers )
|
|
{
|
|
ent disconnect_paths();
|
|
ent hideGeo();
|
|
}
|
|
|
|
foreach( ent in level.post_event_pathing_blockers )
|
|
{
|
|
ent hideGeo();
|
|
ent connect_paths();
|
|
}
|
|
//////
|
|
|
|
|
|
//if ( IsDefined( level.post_event_nodes )) // to allow current-gen to not have these models
|
|
// array_thread( level.post_event_nodes, ::disconnect_nodes );
|
|
|
|
//if ( IsDefined( level.pre_event_nodes )) // to allow current-gen to not have these models
|
|
// array_thread( level.pre_event_nodes, ::connect_nodes );
|
|
}
|
|
|
|
handle_pathing_post_event()
|
|
{
|
|
//HACK
|
|
if( isDefined( level.post_event_pathing_blockers ) )
|
|
{
|
|
foreach( ent in level.post_event_pathing_blockers )
|
|
{
|
|
ent showGeo();
|
|
ent disconnect_paths();
|
|
ent hideGeo();
|
|
}
|
|
}
|
|
|
|
if( isDefined( level.pre_event_pathing_blockers ) )
|
|
array_thread( level.pre_event_pathing_blockers, ::connect_paths );
|
|
//////
|
|
|
|
|
|
//if ( IsDefined( level.pre_event_nodes )) // to allow current-gen to not have these models
|
|
// array_thread( level.pre_event_nodes, ::disconnect_nodes );
|
|
|
|
//if ( IsDefined( level.post_event_nodes )) // to allow current-gen to not have these models
|
|
// array_thread( level.post_event_nodes, ::connect_nodes );
|
|
}
|
|
|
|
OceanObjectMover_set_goal( ocean_ent )
|
|
{
|
|
if( ocean_ent.direction == "up" && WATER_START_DIRECTION == -1 )
|
|
self.goal = self.loc_start;
|
|
else if( ocean_ent.direction == "down" && WATER_START_DIRECTION == 1 )
|
|
self.goal = self.loc_start;
|
|
else
|
|
self.goal = self.loc_end;
|
|
}
|
|
|
|
activate_splashes( exp_num, endon_msg, wait_min, wait_max )
|
|
{
|
|
level endon ( "game_ended" );
|
|
|
|
if( isDefined( endon_msg ) )
|
|
{
|
|
level notify( endon_msg );
|
|
level endon( endon_msg );
|
|
}
|
|
|
|
if( !isDefined( wait_min ) )
|
|
{
|
|
wait_min = 3;
|
|
}
|
|
|
|
if( !isDefined( wait_max ) )
|
|
{
|
|
wait_max = 5;
|
|
}
|
|
|
|
while( 1 )
|
|
{
|
|
level thread common_scripts\_exploder::activate_clientside_exploder( exp_num );
|
|
wait( RandomFloatRange( wait_min, wait_max ));
|
|
}
|
|
}
|
|
|
|
handleWatertriggerMovement( parent )
|
|
{
|
|
assertex( isDefined( parent ), "must have a parent entity to know where the water trigger should be" );
|
|
|
|
level endon( "game_ended" );
|
|
|
|
waterline_ent = undefined;
|
|
if( isDefined( self.target ) )
|
|
{
|
|
waterline_ent = getstruct( self.target, "targetname" );
|
|
}
|
|
|
|
parent_offset = self.origin - parent.origin;
|
|
|
|
self childthread MoveTrig( parent, parent_offset );
|
|
if( isDefined( waterline_ent ) )
|
|
{
|
|
waterline_offset = waterline_ent.origin[2] - self.origin[2];
|
|
offset = parent_offset + (0,0,waterline_offset);
|
|
waterline_ent childthread MoveTrig( parent, offset );
|
|
}
|
|
}
|
|
|
|
MoveTrig( parent, offset )
|
|
{
|
|
while( true )
|
|
{
|
|
self.origin = (parent.origin + offset);
|
|
wait( .05 );
|
|
}
|
|
}
|
|
|
|
//SPAWNERS
|
|
|
|
SpawnSetup()
|
|
{
|
|
level.skipOceanSpawns = false;
|
|
level.dynamicSpawns = ::GetListOfGoodSpawnPoints;
|
|
}
|
|
|
|
GetListOfGoodSpawnPoints(fullListOfSpawnPoints)
|
|
{
|
|
goodpoints = [];
|
|
|
|
// Getting all good spawns
|
|
foreach(spawn in fullListOfSpawnPoints)
|
|
{
|
|
if( !IsDefined( spawn.targetname ) || ( spawn.targetname == "" ) || spawn IsValidSpawn() == true )
|
|
{
|
|
goodpoints = add_to_array(goodpoints, spawn);
|
|
}
|
|
}
|
|
return goodpoints;
|
|
}
|
|
|
|
IsValidSpawn()
|
|
{
|
|
if( level.skipOceanSpawns == true && self.targetname == "ocean_spawn" )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
SpinAlarmsStart()
|
|
{
|
|
self show();
|
|
self RotateVelocity( (0,600,0), 12 );
|
|
|
|
TsunamiAlarmLgtEnts = GetScriptableArray( "tsunami_alarm", "targetname" );
|
|
foreach ( TsunamiAlarmLgtEnt in TsunamiAlarmLgtEnts )
|
|
TsunamiAlarmLgtEnt SetScriptablePartState("static_part", "siren_on");
|
|
|
|
}
|
|
|
|
SpinAlarmsStop()
|
|
{
|
|
self hide();
|
|
|
|
TsunamiAlarmLgtEnts = GetScriptableArray( "tsunami_alarm", "targetname" );
|
|
foreach ( TsunamiAlarmLgtEnt in TsunamiAlarmLgtEnts )
|
|
TsunamiAlarmLgtEnt SetScriptablePartState("static_part", "siren_off");
|
|
}
|
|
|
|
/*
|
|
######################
|
|
## AUDIO FUNCTIONS ##
|
|
######################
|
|
*/
|
|
|
|
aud_init()
|
|
{
|
|
}
|
|
|
|
aud_dynamic_event_startup( earthquake_duration )
|
|
{
|
|
//thread snd_script_timer( 0.1 );
|
|
thread aud_handle_earthquake( earthquake_duration );
|
|
thread aud_handle_warning_vo();
|
|
thread aud_handle_wave_incoming();
|
|
thread aud_handle_buoy_sfx();
|
|
}
|
|
|
|
aud_handle_warning_vo()
|
|
{
|
|
// TSUNAMI VO WARN - PLAY TIDE WARNING , THEN PLAY GET TO HIGHER GROUND WARNING
|
|
wait(2);
|
|
|
|
thread snd_play_in_space( "mp_laser2_vo_tsunami_warn_tide", ( 0,0,0 ) );
|
|
|
|
wait(5);
|
|
|
|
thread snd_play_in_space( "mp_laser2_vo_tsunami_warn_high_ground", ( 0,0,0 ) );
|
|
|
|
}
|
|
|
|
aud_handle_earthquake( earthquake_duration )
|
|
{
|
|
// Play Global Explosion SFX
|
|
thread snd_play_in_space( "mp_laser2_ty_initial_hit", ( 0,0,0 ) );
|
|
//wait( earthquake_duration );
|
|
}
|
|
|
|
aud_handle_buoy_sfx()
|
|
{
|
|
level endon( "aud_kill_dings" );
|
|
while(1)
|
|
{
|
|
thread snd_play_in_space( "mp_laser_buoy_ding_event", ( 150, -2295, 403 ) );
|
|
wait(0.5);
|
|
thread snd_play_in_space( "mp_laser_buoy_ding_event", ( 1026, -2381, 403 ) );
|
|
wait(6);
|
|
}
|
|
}
|
|
|
|
|
|
aud_handle_wave_incoming()
|
|
{
|
|
quake_ent = thread snd_play_loop_in_space( "mp_laser2_ty_quake_lp", ( 79, -1591, 455 ), "aud_dynamic_event_end" );
|
|
|
|
thread aud_handle_waves_crash();
|
|
|
|
quake_ent ScaleVolume( 0, 0.05 );
|
|
|
|
wait(16.5);
|
|
thread aud_handle_incoming();
|
|
|
|
quake_ent ScaleVolume( 0.8, 8 );
|
|
}
|
|
|
|
aud_handle_incoming()
|
|
{
|
|
thread snd_play_in_space( "mp_laser2_ty_incoming", ( 79, -1591, 455 ) );
|
|
wait(4);
|
|
level notify( "aud_kill_dings" );
|
|
Earthquake( .1, 4, ( 79, -1591, 455 ), 2500 );
|
|
wait( 1.2 );
|
|
Earthquake( .2, 4, ( 79, -1591, 455 ), 2500 );
|
|
wait( 2 );
|
|
Earthquake( .3, 5.5, ( 79, -1591, 455 ), 2500 );
|
|
}
|
|
|
|
|
|
aud_handle_waves_crash()
|
|
{
|
|
wait( 27 ); // FULL TIME TILL WAVE CRASH
|
|
level notify("aud_dynamic_event_end");
|
|
level._snd.dynamic_event_happened = true;
|
|
|
|
foreach( player in level.players )
|
|
{
|
|
player clientclearsoundsubmix( "mp_pre_event_mix" );
|
|
wait(0.05);
|
|
}
|
|
|
|
wait(0.05);
|
|
|
|
foreach( player in level.players )
|
|
{
|
|
player clientaddsoundsubmix( "mp_post_event_mix", 1 );
|
|
wait(0.05);
|
|
}
|
|
|
|
//thread snd_play_in_space( "mp_laser2_ty_initial_hit", ( 79, -1591, 455 ) );
|
|
}
|
|
|
|
handleTsunamiWarningSounds()
|
|
{
|
|
level endon( "game_ended" );
|
|
|
|
speakers = getentarray( "tsunami_speaker", "targetname" );
|
|
|
|
while ( level.water_warning == true )
|
|
{
|
|
if( isDefined( speakers ) )
|
|
{
|
|
foreach( speaker in speakers )
|
|
playsoundatpos( speaker.origin, level.tsunami_alarm );
|
|
playsoundatpos( (0,0,0), level.tsunami_alarm );
|
|
}
|
|
array_thread(level.AlarmSystem.SpinnerArray, ::SpinAlarmsStart);
|
|
|
|
wait( 2 );
|
|
|
|
if( !isDefined( level.water_warning ) || level.water_warning != true )
|
|
return;
|
|
|
|
foreach( speaker in speakers )
|
|
{
|
|
//playsoundatpos( speaker.origin, level.tsunami_vo_ext );
|
|
}
|
|
|
|
|
|
|
|
wait( 3 );
|
|
}
|
|
} |