s1-scripts-dev/raw/maps/mp/mp_laser2.gsc
2025-05-21 16:23:17 +02:00

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 );
}
}