1271 lines
30 KiB
Plaintext
1271 lines
30 KiB
Plaintext
#include common_scripts\utility;
|
|
#include maps\mp\_utility;
|
|
#include maps\mp\gametypes\_hostmigration;
|
|
|
|
main()
|
|
{
|
|
maps\mp\mp_snow_precache::main();
|
|
maps\createart\mp_snow_art::main();
|
|
maps\mp\mp_snow_fx::main();
|
|
thread maps\mp\_fx::func_glass_handler(); // Text on glass
|
|
|
|
flag_init( "satellite_crashed" );
|
|
flag_init( "satellite_incoming" );
|
|
|
|
level.snow_satellite_allowed = allowLevelKillstreaks();
|
|
level thread satellite_fall();
|
|
|
|
precache();
|
|
|
|
|
|
level.mapCustomCrateFunc = ::snowCustomCrateFunc;
|
|
level.mapCustomKillstreakFunc = ::snowCustomKillstreakFunc;
|
|
level.mapCustomBotKillstreakFunc = ::snowCustomBotKillstreakFunc;
|
|
|
|
maps\mp\_load::main();
|
|
|
|
PreCacheShader( "fullscreen_dirtylense" );
|
|
|
|
|
|
maps\mp\_compass::setupMiniMap( "compass_map_mp_snow" );
|
|
|
|
// dvar_name current_gen_val next_gen_val
|
|
setdvar_cg_ng( "r_specularColorScale", 2.3 , 10 );
|
|
setdvar_cg_ng( "r_diffuseColorScale" , 1.2 , 3 );
|
|
setdvar( "r_ssaorejectdepth", 1500);
|
|
setdvar( "r_ssaofadedepth", 1200);
|
|
|
|
SetDvar( "r_sky_fog_intensity" , "1" );
|
|
SetDvar( "r_sky_fog_min_angle" , "74.6766" );
|
|
SetDvar( "r_sky_fog_max_angle" , "91.2327" );
|
|
SetDvar( "r_lightGridEnableTweaks", 1 );
|
|
SetDvar( "r_lightGridIntensity" , 1.33 );
|
|
|
|
if( level.ps3 )
|
|
{
|
|
setdvar( "sm_sunShadowScale", "0.6" ); // optimization
|
|
}
|
|
else if( level.xenon )
|
|
{
|
|
setdvar( "sm_sunShadowScale", "0.7" ); // optimization
|
|
}
|
|
|
|
game[ "attackers" ] = "allies";
|
|
game[ "defenders" ] = "axis";
|
|
|
|
|
|
flag_init( "satellite_active" );
|
|
flag_init( "satellite_charged" );
|
|
|
|
level thread lighthouse();
|
|
level thread snowmen();
|
|
|
|
waitframe();
|
|
|
|
// targetname animname min_wait max_wait
|
|
level thread group_anim( "buoy" , "mp_snow_buoy_sway", 0.2 , 1.0 );
|
|
level thread group_anim( "boat" , "mp_snow_boat_sway", 0.2 , 1.0 );
|
|
|
|
// level thread rotating_windows();
|
|
level thread fishing_boat();
|
|
level thread rotate_helicopter_rotor();
|
|
level thread ice();
|
|
level thread initExtraCollision();
|
|
}
|
|
|
|
initExtraCollision()
|
|
{
|
|
collision1 = GetEnt( "player32x32x8", "targetname" );
|
|
collision1Ent = spawn( "script_model", (-1646.94, 881.505, -2.82839) );
|
|
collision1Ent.angles = ( 270, 211.182, 123.817);
|
|
collision1Ent CloneBrushmodelToScriptmodel( collision1 );
|
|
|
|
collision4 = GetEnt( "clip64x64x128", "targetname" );
|
|
collision4Ent = spawn( "script_model", (245, 2512, -64) );
|
|
collision4Ent.angles = ( 0,0,0 );
|
|
collision4Ent CloneBrushmodelToScriptmodel( collision4 );
|
|
|
|
collision5 = GetEnt( "clip256x256x128", "targetname" );
|
|
collision5Ent = spawn( "script_model", (-1536, -1312, -136) );
|
|
collision5Ent.angles = ( 0,0,0 );
|
|
collision5Ent CloneBrushmodelToScriptmodel( collision5 );
|
|
|
|
collision6 = GetEnt( "clip256x256x128", "targetname" );
|
|
collision6Ent = spawn( "script_model", (-1484, -1440, -136) );
|
|
collision6Ent.angles = ( 0,45,0 );
|
|
collision6Ent CloneBrushmodelToScriptmodel( collision6 );
|
|
|
|
if ( is_gen4() )
|
|
{
|
|
collision2 = GetEnt( "player64x64x128", "targetname" );
|
|
collision2Ent = spawn( "script_model", (-1474, 966, -136) );
|
|
collision2Ent.angles = (0, 352, 0);
|
|
collision2Ent CloneBrushmodelToScriptmodel( collision2 );
|
|
|
|
collision3 = GetEnt( "clip128x128x8", "targetname" );
|
|
collision3Ent = spawn( "script_model", (1700, 872, -48) );
|
|
collision3Ent.angles = (0, 335, 0);
|
|
collision3Ent CloneBrushmodelToScriptmodel( collision3 );
|
|
}
|
|
}
|
|
|
|
fishing_boat()
|
|
{
|
|
boats = GetEntArray( "fishing_boat", "targetname" );
|
|
foreach ( boat in boats )
|
|
{
|
|
anim_ref = Spawn( "script_model", boat.origin );
|
|
anim_ref.angles = ( 0, 0, 0 );
|
|
anim_ref SetModel( "generic_prop_raven" );
|
|
boat LinkTo( anim_ref, "tag_origin" );
|
|
anim_ref ScriptModelPlayAnimDeltaMotion( "mp_snow_fishingboat_sway_prop" );
|
|
|
|
boat_misc_models = GetEnt( boat.target, "targetname" );
|
|
if(IsDefined(boat_misc_models))
|
|
{
|
|
boat_misc_models LinkTo( anim_ref, "tag_origin" );
|
|
boat_misc_models ScriptModelPlayAnimDeltaMotion( "mp_snow_fishingboat_sway" );
|
|
}
|
|
|
|
boat.no_moving_platfrom_death = true; //Prevents the boat from destroying objects placed near the dock
|
|
}
|
|
}
|
|
|
|
lighthouse()
|
|
{
|
|
lighthouse = GetEnt( "lighthouse", "targetname" );
|
|
|
|
prop = Spawn( "script_model", lighthouse.origin );
|
|
prop.angles = lighthouse.angles;
|
|
prop SetModel( "generic_prop_raven" );
|
|
|
|
lighthouse LinkTo( prop, "j_prop_1" );
|
|
|
|
prop ScriptModelPlayAnimDeltaMotion( "mp_snow_lighthouse_scan" );
|
|
|
|
fx_ent = Spawn( "script_model", lighthouse.origin +( 0, 0, 70 ) );
|
|
fx_ent.angles = lighthouse.angles;
|
|
fx_ent SetModel( "tag_origin" );
|
|
fx_ent LinkTo( prop, "j_prop_1" );
|
|
lighthouse.fx_ent = fx_ent;
|
|
|
|
level thread lighthouse_play_fx_onConnect( lighthouse );
|
|
}
|
|
|
|
snowmen()
|
|
{
|
|
snowmen = GetScriptableArray( "snowman", "targetname" );
|
|
foreach ( man in snowmen )
|
|
{
|
|
man thread snowman_death_watch();
|
|
}
|
|
}
|
|
|
|
snowman_death_watch()
|
|
{
|
|
self waittill( "death" );
|
|
self maps\mp\_movers::notify_moving_platform_invalid();
|
|
}
|
|
|
|
lighthouse_play_fx_onConnect( lighthouse )
|
|
{
|
|
while ( true )
|
|
{
|
|
level waittill( "connected", player );
|
|
PlayFXOnTagForClients( level._effect[ "mp_snow_lighthouse" ], lighthouse.fx_ent, "tag_origin", player );
|
|
}
|
|
}
|
|
|
|
precache()
|
|
{
|
|
PrecacheMpAnim( "mp_snow_boat_sway" );
|
|
PrecacheMpAnim( "mp_snow_buoy_sway" );
|
|
PrecacheMpAnim( "mp_snow_fishingboat_sway" );
|
|
PrecacheMpAnim( "mp_snow_fishingboat_sway_prop" );
|
|
PrecacheMpAnim( "mp_snow_tree_fall" );
|
|
PrecacheMpAnim( "mp_snow_tree_prefall_loop" );
|
|
}
|
|
|
|
is_dynamic_path()
|
|
{
|
|
return IsDefined( self.spawnflags ) && self.spawnflags & 1;
|
|
}
|
|
|
|
is_ai_sight_line()
|
|
{
|
|
return IsDefined( self.spawnflags ) && self.spawnflags & 2;
|
|
}
|
|
|
|
satellite_fall()
|
|
{
|
|
if ( GetDvar( "r_reflectionProbeGenerate" ) == "1" )
|
|
return;
|
|
|
|
if ( level.snow_satellite_allowed )
|
|
{
|
|
level thread play_satellite_static_on_connect();
|
|
}
|
|
|
|
|
|
waitframe(); //allow load main to finish
|
|
|
|
tree_broken_stump = GetEnt( "tree_broken_stump", "targetname" );
|
|
tree_broken_top = GetEnt( "tree_broken_top", "targetname" );
|
|
|
|
anim_ref = Spawn( "script_model", tree_broken_stump.origin );
|
|
anim_ref.angles = ( 0, 0, 0 );
|
|
anim_ref SetModel( "generic_prop_raven" );
|
|
anim_ref ScriptModelPlayAnimDeltaMotion( "mp_snow_tree_prefall_loop" );
|
|
tree_broken_stump LinkTo( anim_ref, "j_prop_1", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
tree_broken_top LinkTo( anim_ref, "j_prop_2", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
|
|
pre_crash_group = satellite_group( "satellite_pre_crash" );
|
|
post_crash_group = satellite_group( "satellite_post_crash" );
|
|
|
|
if ( !IsDefined( pre_crash_group ) || !IsDefined( post_crash_group ) )
|
|
return;
|
|
|
|
post_crash_group satellite_group_hide();
|
|
|
|
if ( !level.snow_satellite_allowed )
|
|
{
|
|
satellite_set_post_crash( pre_crash_group, post_crash_group );
|
|
return;
|
|
}
|
|
|
|
flash_trigger = GetEnt( "satellite_flash_trigger", "targetname" );
|
|
kill_trigger = GetEnt( "satellite_kill_trigger", "targetname" );
|
|
|
|
satellite_start = getstruct( "sat_start", "targetname" );
|
|
satellite_start_kill_trigger = GetEnt( "sat_start_kill_trigger", "targetname" );
|
|
if ( IsDefined( satellite_start_kill_trigger ) )
|
|
{
|
|
satellite_start_kill_trigger.start_origin = satellite_start_kill_trigger.origin;
|
|
satellite_start_kill_trigger.start_angles = satellite_start_kill_trigger.angles;
|
|
satellite_start_kill_trigger EnableLinkTo();
|
|
}
|
|
|
|
if ( level.createFX_enabled )
|
|
{
|
|
while ( !IsDefined( level.player ) )
|
|
waitframe();
|
|
level.players = [ level.player ];
|
|
level.characters = [];
|
|
}
|
|
else
|
|
{
|
|
gameFlagWait( "prematch_done" );
|
|
}
|
|
|
|
while ( 1 )
|
|
{
|
|
sat_model = Spawn( "script_model", satellite_start.origin );
|
|
sat_model.angles = satellite_start.angles;
|
|
sat_model SetModel( "tag_origin" );
|
|
|
|
killstreak_player = satellite_killstreak_wait();
|
|
killstreak_team = undefined;
|
|
if ( IsDefined( killstreak_player ) )
|
|
{
|
|
killstreak_team = killstreak_player.team;
|
|
}
|
|
|
|
flag_set( "satellite_incoming" );
|
|
wait( 0.5 );
|
|
|
|
move_speed = 2000;
|
|
|
|
if ( IsDefined( satellite_start_kill_trigger ) )
|
|
{
|
|
satellite_start_kill_trigger LinkTo( sat_model );
|
|
satellite_start_kill_trigger thread monitor_touching();
|
|
}
|
|
|
|
level thread play_satellite_fx_on_model( sat_model );
|
|
sat_model PlaySoundOnMovingEnt( "scn_satellite_entry" );
|
|
|
|
current = satellite_start;
|
|
|
|
move_count = 0;
|
|
while ( IsDefined( current.target ) )
|
|
{
|
|
move_count++;
|
|
goal = getstruct( current.target, "targetname" );
|
|
|
|
dist = Distance( current.origin, goal.origin );
|
|
move_time = dist / move_speed;
|
|
sat_model MoveTo( goal.origin, move_time );
|
|
level.satellite = sat_model;
|
|
|
|
if ( move_count == 1 )
|
|
{
|
|
sat_model RotateVelocity( ( -360, 0, 0 ), move_time );
|
|
}
|
|
else
|
|
{
|
|
sat_model RotateVelocity( ( 0, 1500, 1500 ), move_time );
|
|
}
|
|
|
|
sat_model waittill( "movedone" );
|
|
|
|
if ( move_count == 1 )
|
|
{
|
|
anim_ref ScriptModelClearAnim();
|
|
anim_ref ScriptModelPlayAnim( "mp_snow_tree_fall" );
|
|
exploder( "2" );
|
|
|
|
foreach ( player in level.players )
|
|
{
|
|
player PlayRumbleOnEntity( "artillery_rumble" );
|
|
}
|
|
|
|
sat_model PlaySound( "scn_satellite_skip" );
|
|
}
|
|
else
|
|
{
|
|
flag_clear( "satellite_incoming" );
|
|
satellite_flash( sat_model.origin, 2000, 0, flash_trigger );
|
|
Earthquake( 0.5, 3, sat_model.origin, 2000 );
|
|
PlayFX( level._effect[ "satellite_fall_impact" ], sat_model.origin );
|
|
|
|
while( level.inGracePeriod )
|
|
{
|
|
waitframe(); // to make sure everybody dies if a host migration takes place during the satellite crash
|
|
}
|
|
|
|
foreach ( character in level.characters )
|
|
{
|
|
if ( character IsTouching( kill_trigger ) )
|
|
{
|
|
if ( IsDefined( killstreak_player ) && ( !level.teamBased || ( character.team != killstreak_team ) ) )
|
|
{
|
|
character DoDamage( character.health + 1000, character.origin, killstreak_player, sat_model, "MOD_EXPLOSIVE" );
|
|
}
|
|
else
|
|
{
|
|
character maps\mp\_movers::mover_suicide();
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( IsDefined( level.littleBirds ) )
|
|
{
|
|
foreach ( littlebird in level.littleBirds )
|
|
{
|
|
if ( littlebird IsTouching( kill_trigger ) )
|
|
{
|
|
littlebird notify( "death" );
|
|
}
|
|
}
|
|
}
|
|
sat_model PlaySound( "scn_satellite_impact" );
|
|
|
|
waitframe();
|
|
satellite_set_post_crash( pre_crash_group, post_crash_group );
|
|
}
|
|
|
|
current = goal;
|
|
}
|
|
|
|
if ( IsDefined( satellite_start_kill_trigger ) )
|
|
{
|
|
satellite_start_kill_trigger Unlink();
|
|
satellite_start_kill_trigger.origin = satellite_start_kill_trigger.start_origin;
|
|
satellite_start_kill_trigger.angles = satellite_start_kill_trigger.start_angles;
|
|
}
|
|
sat_model Delete();
|
|
|
|
if ( !levelFlag( "post_game_level_event_active" ) )
|
|
{
|
|
// if it's FFA and the owner is gone, don't add the uplink to the list, becaues it messes up uplink calculations
|
|
if ( !level.teamBased && !IsDefined( killstreak_player ) )
|
|
continue;
|
|
|
|
satellite_use_loc = getstruct( "satellite_use_loc", "targetname" );
|
|
|
|
killstreak_upLinkEnt = Spawn( "script_origin", satellite_use_loc.origin );
|
|
killstreak_upLinkEnt.angles = ( 0, 0, 0 );
|
|
killstreak_upLinkEnt.owner = killstreak_player;
|
|
killstreak_upLinkEnt.team = killstreak_team;
|
|
killstreak_upLinkEnt.immediateDeath = false;
|
|
if ( IsDefined( killstreak_player ) )
|
|
{
|
|
killstreak_upLinkEnt SetOtherEnt( killstreak_player ); // player might have quit, and this doesn't handle undefined
|
|
}
|
|
maps\mp\killstreaks\_uplink::addUplinkToLevelList( killstreak_upLinkEnt );
|
|
|
|
|
|
allow_repeat_debug = false;
|
|
|
|
/#
|
|
// allow_repeat_debug = true;
|
|
#/
|
|
|
|
if ( !allow_repeat_debug )
|
|
break;
|
|
|
|
/#
|
|
satellite_killstreak_wait();
|
|
flag_clear( "satellite_crashed" );
|
|
pre_crash_group satellite_group_show();
|
|
post_crash_group satellite_group_hide();
|
|
|
|
maps\mp\killstreaks\_uplink::removeUplinkFromLevelList( killstreak_upLinkEnt );
|
|
killstreak_upLinkEnt Delete();
|
|
|
|
if ( level.createFX_enabled )
|
|
{
|
|
common_scripts\_exploder::stop_exploder_proc( "1" );
|
|
common_scripts\_exploder::stop_exploder_proc( "2" );
|
|
common_scripts\_exploder::stop_exploder_proc( "3" );
|
|
common_scripts\_exploder::stop_exploder_proc( "4" );
|
|
common_scripts\_exploder::stop_exploder_proc( "32" );
|
|
}
|
|
#/
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
monitor_touching()
|
|
{
|
|
level endon( "satellite_crashed" );
|
|
|
|
while ( 1 )
|
|
{
|
|
if ( IsDefined( level.littleBirds ) )
|
|
{
|
|
if ( level.littleBirds.size > 0 )
|
|
{
|
|
foreach ( littlebird in level.littleBirds )
|
|
{
|
|
if ( littlebird IsTouching( self ) )
|
|
{
|
|
littlebird notify( "death" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
waitframe();
|
|
}
|
|
}
|
|
|
|
satellite_set_post_crash( pre_crash_group, post_crash_group )
|
|
{
|
|
flag_set( "satellite_crashed" );
|
|
foreach ( player in level.players )
|
|
{
|
|
player thread play_exploder_when_not_in_killcam();
|
|
}
|
|
pre_crash_group satellite_group_hide();
|
|
post_crash_group satellite_group_show();
|
|
level thread play_crater_fire_on_connect();
|
|
}
|
|
|
|
play_exploder_when_not_in_killcam()
|
|
{
|
|
self endon( "disconnect" );
|
|
|
|
while ( self isInKillcam() )
|
|
{
|
|
waitframe();
|
|
}
|
|
exploder( "32", self );
|
|
}
|
|
|
|
satellite_flash( test_origin, test_radius, test_dot, test_volume )
|
|
{
|
|
foreach ( player in level.players )
|
|
{
|
|
player_eye = player GetEye();
|
|
dir_to_sat = test_origin - player_eye;
|
|
|
|
dist_to_sat = Length( dir_to_sat );
|
|
if ( dist_to_sat > test_radius )
|
|
continue;
|
|
|
|
dir_to_sat = VectorNormalize( dir_to_sat );
|
|
|
|
look_dir = AnglesToForward( player GetPlayerAngles() );
|
|
|
|
dot = VectorDot( look_dir, dir_to_sat );
|
|
|
|
if ( dot < test_dot )
|
|
continue;
|
|
|
|
if ( IsDefined( test_volume ) )
|
|
{
|
|
if ( !player IsTouching( test_volume ) )
|
|
continue;
|
|
}
|
|
|
|
player ShellShock( "flashbang_mp", max( 2.0, 4 * ( 1 -( dist_to_sat / test_radius ) ) ) );
|
|
}
|
|
}
|
|
|
|
satellite_group_hide()
|
|
{
|
|
if ( IsDefined( self.satellite_group_hide ) && self.satellite_group_hide )
|
|
return;
|
|
|
|
self.satellite_group_hide = true;
|
|
self.origin -= ( 0, 0, 1000 );
|
|
|
|
foreach ( ent in self.clip )
|
|
{
|
|
ent satellite_clip_hide();
|
|
}
|
|
|
|
self DontInterpolate();
|
|
}
|
|
|
|
satellite_clip_hide()
|
|
{
|
|
if ( self is_dynamic_path() )
|
|
self ConnectPaths();
|
|
|
|
if ( self is_ai_sight_line() )
|
|
self SetAISightLineVisible( false );
|
|
|
|
self maps\mp\_movers::notify_moving_platform_invalid();
|
|
|
|
self.old_contents = self SetContents( 0 );
|
|
self NotSolid();
|
|
self Hide();
|
|
}
|
|
|
|
satellite_group_show()
|
|
{
|
|
if ( IsDefined( self.satellite_group_hide ) && !self.satellite_group_hide )
|
|
return;
|
|
|
|
self.satellite_group_hide = false;
|
|
self.origin += ( 0, 0, 1000 );
|
|
|
|
foreach ( ent in self.clip )
|
|
{
|
|
ent satellite_clip_show();
|
|
}
|
|
self DontInterpolate();
|
|
}
|
|
|
|
satellite_clip_show()
|
|
{
|
|
self Solid();
|
|
self SetContents( self.old_contents );
|
|
self Show();
|
|
|
|
if ( self is_dynamic_path() )
|
|
self DisconnectPaths();
|
|
|
|
if ( self is_ai_sight_line() )
|
|
self SetAISightLineVisible( true );
|
|
}
|
|
|
|
satellite_group( targetname )
|
|
{
|
|
struct = getstruct( targetname, "targetname" );
|
|
if ( !IsDefined( struct ) )
|
|
return undefined;
|
|
|
|
parent = Spawn( "script_model", struct.origin );
|
|
parent SetModel( "tag_origin" );
|
|
|
|
parent.clip = [];
|
|
parent.linked = [];
|
|
|
|
ents = GetEntArray( struct.target, "targetname" );
|
|
foreach ( ent in ents )
|
|
{
|
|
if ( ent.classname == "script_brushmodel" )
|
|
{
|
|
parent.clip[ parent.clip.size ] = ent;
|
|
}
|
|
else
|
|
{
|
|
parent.linked[ parent.linked.size ] = ent;
|
|
ent LinkTo( parent );
|
|
//ent WillNeverChange();
|
|
}
|
|
}
|
|
|
|
return parent;
|
|
}
|
|
|
|
satellite_killstreak_wait()
|
|
{
|
|
/#
|
|
level thread satellite_killstreak_wait_dvar();
|
|
#/
|
|
|
|
level thread satellite_activate_at_end_of_match();
|
|
|
|
level thread satellite_killstreak_notify_wait();
|
|
level waittill( "satellite_start", killstreak_player );
|
|
return killstreak_player;
|
|
}
|
|
|
|
satellite_activate_at_end_of_match()
|
|
{
|
|
level endon( "satellite_start" );
|
|
|
|
if ( !level.snow_satellite_allowed )
|
|
return;
|
|
|
|
level waittill ( "spawning_intermission" );
|
|
level thread satellite_end_of_match();
|
|
|
|
level notify( "satellite_start" );
|
|
}
|
|
|
|
satellite_end_of_match()
|
|
{
|
|
levelFlagSet( "post_game_level_event_active" );
|
|
VisionSetNaked( "", 0.5 );
|
|
|
|
wait 15;
|
|
levelFlagClear( "post_game_level_event_active" );
|
|
}
|
|
|
|
satellite_killstreak_notify_wait()
|
|
{
|
|
level waittill( "snow_satellite_killstreak", killstreak_player );
|
|
level notify( "satellite_start", killstreak_player );
|
|
}
|
|
|
|
/#
|
|
satellite_killstreak_wait_dvar()
|
|
{
|
|
level endon( "satellite_start" );
|
|
|
|
dvar_name = "trigger_satellite";
|
|
default_value = 0;
|
|
SetDevDvarIfUninitialized( dvar_name, default_value );
|
|
while ( 1 )
|
|
{
|
|
|
|
value = GetDvarInt( dvar_name, default_value );
|
|
if ( value == default_value )
|
|
{
|
|
waitframe();
|
|
}
|
|
else
|
|
{
|
|
SetDvar( dvar_name, default_value );
|
|
level notify( "satellite_start", level.player );
|
|
}
|
|
}
|
|
}
|
|
|
|
#/
|
|
|
|
//satellite_wait(game_frac)
|
|
//{
|
|
// level endon("satellite_start");
|
|
// /#
|
|
// level thread satellite_wait_dvar();
|
|
// #/
|
|
//
|
|
// if(IsDefined(game_frac) && !level.createFX_enabled)
|
|
// level thread satellite_wait_time(game_frac);
|
|
// level waittill("satellite_start");
|
|
//}
|
|
//
|
|
//satellite_wait_time(game_frac)
|
|
//{
|
|
// level endon("satellite_start");
|
|
// wait_game_percent_complete( game_frac );
|
|
// level notify("satellite_start");
|
|
//}
|
|
//
|
|
///#
|
|
//satellite_wait_dvar()
|
|
//{
|
|
// level endon("satellite_start");
|
|
//
|
|
// dvar_name = "trigger_satellite";
|
|
// default_value = 0;
|
|
// SetDevDvarIfUninitialized(dvar_name, default_value);
|
|
// while(1)
|
|
// {
|
|
//
|
|
// value = GetDvarInt(dvar_name, default_value);
|
|
// if(value==default_value)
|
|
// {
|
|
// waitframe();
|
|
// }
|
|
// else
|
|
// {
|
|
// SetDvar(dvar_name, default_value);
|
|
// level notify("satellite_start");
|
|
// }
|
|
// }
|
|
//}
|
|
//#/
|
|
|
|
move_satellite( end )
|
|
{
|
|
start = self.origin;
|
|
fall_time = 3.0;
|
|
accel_time = 3.0;
|
|
|
|
while ( 1 )
|
|
{
|
|
self MoveTo( end, fall_time, accel_time, 0 );
|
|
wait( fall_time + 3.0 );
|
|
self MoveTo( start, 0.1 );
|
|
wait( 0.1 );
|
|
}
|
|
|
|
}
|
|
|
|
play_satellite_static_on_connect()
|
|
{
|
|
while ( 1 )
|
|
{
|
|
level waittill( "connected", player );
|
|
player thread run_func_after_spawn( ::satellite_static );
|
|
}
|
|
|
|
}
|
|
|
|
play_crater_fire_on_connect()
|
|
{
|
|
while ( 1 )
|
|
{
|
|
level waittill( "connected", player );
|
|
player thread run_func_after_spawn( ::call_fire_exploder_on_spawn );
|
|
}
|
|
}
|
|
|
|
call_fire_exploder_on_spawn()
|
|
{
|
|
self endon( "disconnect" );
|
|
exploder( "32", self );
|
|
}
|
|
|
|
//Self == player
|
|
run_func_after_spawn( func )
|
|
{
|
|
self endon( "disconnect" );
|
|
self endon( "death" );
|
|
|
|
self waittill( "spawned_player" );
|
|
|
|
self thread [[ func ]]();
|
|
}
|
|
|
|
play_satellite_fx_on_model( sat_model )
|
|
{
|
|
PlayFXOnTag( level._effect[ "satellite_fall" ], sat_model, "tag_origin" );
|
|
PlayFXOnTag( level._effect[ "satellite_fall_child0" ], sat_model, "tag_origin" );
|
|
wait( 0.7 );
|
|
PlayFXOnTag( level._effect[ "satellite_fall_child1" ], sat_model, "tag_origin" );
|
|
wait( 0.7 );
|
|
PlayFXOnTag( level._effect[ "satellite_fall_child2" ], sat_model, "tag_origin" );
|
|
wait( 0.7 );
|
|
PlayFXOnTag( level._effect[ "satellite_fall_child3" ], sat_model, "tag_origin" );
|
|
wait( 0.7 );
|
|
PlayFXOnTag( level._effect[ "satellite_fall_child4" ], sat_model, "tag_origin" );
|
|
wait( 0.7 );
|
|
PlayFXOnTag( level._effect[ "satellite_fall_child5" ], sat_model, "tag_origin" );
|
|
wait( 0.7 );
|
|
PlayFXOnTag( level._effect[ "satellite_fall_child6" ], sat_model, "tag_origin" );
|
|
wait( 0.7 );
|
|
PlayFXOnTag( level._effect[ "satellite_fall_child7" ], sat_model, "tag_origin" );
|
|
wait( 0.7 );
|
|
PlayFXOnTag( level._effect[ "satellite_fall_child8" ], sat_model, "tag_origin" );
|
|
}
|
|
|
|
group_anim( targetname, animname, min_wait, max_wait )
|
|
{
|
|
animating_objects = GetEntArray( targetname, "targetname" );
|
|
foreach ( object in animating_objects )
|
|
{
|
|
if ( IsDefined( min_wait ) && IsDefined( max_wait ) )
|
|
{
|
|
wait( RandomFloatRange( min_wait, max_wait ) );
|
|
}
|
|
|
|
anim_ref = Spawn( "script_model", object.origin );
|
|
anim_ref.angles = ( 0, 0, 0 );
|
|
anim_ref SetModel( "generic_prop_raven" );
|
|
object LinkTo( anim_ref, "tag_origin" );
|
|
anim_ref ScriptModelPlayAnimDeltaMotion( animname );
|
|
|
|
// for subobjects linked to the main object
|
|
if ( IsDefined( object.target ) )
|
|
{
|
|
subobjects = GetEntArray( object.target, "targetname" );
|
|
foreach ( subobject in subobjects )
|
|
{
|
|
subobject LinkTo( anim_ref, "j_prop_1" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
rotating_windows()
|
|
{
|
|
windows = GetEntArray ( "rotating_window", "targetname" );
|
|
array_thread( windows, ::rotating_windows_init );
|
|
}
|
|
|
|
rotating_windows_init()
|
|
{
|
|
if ( !IsDefined( self.target ) )
|
|
return;
|
|
|
|
structs = getstructarray( self.target, "targetname" );
|
|
foreach ( struct in structs )
|
|
{
|
|
switch( struct.script_noteworthy )
|
|
{
|
|
case "open_angles":
|
|
self.open_angles = struct.angles;
|
|
break;
|
|
case "closed_angles":
|
|
self.closed_angles = struct.angles;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
ents = GetEntArray( self.target, "targetname" );
|
|
self.hide_when_closed = [];
|
|
foreach ( ent in ents )
|
|
{
|
|
switch( ent.script_noteworthy )
|
|
{
|
|
case "open_trigger":
|
|
self.open_trigger = ent;
|
|
break;
|
|
case "close_trigger":
|
|
self.close_trigger = ent;
|
|
break;
|
|
case "hide_when_closed":
|
|
self.hide_when_closed[ self.hide_when_closed.size ] = ent;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
self SetCanDamage( false );
|
|
self thread rotating_windows_run();
|
|
}
|
|
|
|
rotating_windows_run()
|
|
{
|
|
window_node = Spawn( "script_model", self.origin );
|
|
window_node.angles = self.open_angles;
|
|
window_node SetModel( "tag_origin" );
|
|
self LinkTo( window_node, "tag_origin" );
|
|
|
|
start_closed = false;
|
|
if ( IsDefined( self.script_noteworthy ) && ( self.script_noteworthy == "start_closed" ) )
|
|
{
|
|
start_closed = true;
|
|
self.open_trigger trigger_off();
|
|
foreach ( hide_me in self.hide_when_closed )
|
|
{
|
|
hide_me Hide();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self.close_trigger trigger_off();
|
|
foreach ( hide_me in self.hide_when_closed )
|
|
{
|
|
hide_me Show();
|
|
}
|
|
}
|
|
|
|
pitch_rotation = AngleClamp( self.closed_angles[ 0 ] - self.open_angles[ 0 ] );
|
|
|
|
while ( 1 )
|
|
{
|
|
if ( start_closed )
|
|
{
|
|
start_closed = false;
|
|
}
|
|
else
|
|
{
|
|
self.open_trigger trigger_off();
|
|
self.close_trigger trigger_on();
|
|
self.close_trigger waittill( "trigger" );
|
|
foreach ( hide_me in self.hide_when_closed )
|
|
{
|
|
hide_me Hide();
|
|
}
|
|
window_node RotatePitch( pitch_rotation, 0.3, 0, 0 );
|
|
wait( 1 );
|
|
}
|
|
|
|
self.open_trigger trigger_on();
|
|
self.close_trigger trigger_off();
|
|
|
|
self.open_trigger waittill( "trigger" );
|
|
window_node RotatePitch( -1 * pitch_rotation, 0.3, 0, 0 );
|
|
wait( 0.3 );
|
|
foreach ( hide_me in self.hide_when_closed )
|
|
{
|
|
hide_me Show();
|
|
}
|
|
wait( 0.7 );
|
|
}
|
|
}
|
|
|
|
satellite_scrambler()
|
|
{
|
|
scrambler_loc_struct = getstruct( "satellite_use_loc", "targetname" );
|
|
scrambler = Spawn( "script_model", scrambler_loc_struct.origin );
|
|
scrambler.angles = scrambler_loc_struct.angles;
|
|
|
|
scrambler MakeScrambler( self );
|
|
}
|
|
|
|
rotate_helicopter_rotor()
|
|
{
|
|
rotor = GetEnt( "heli_rotor_top", "targetname" );
|
|
rotor RotateVelocity( ( 0, -300, 0 ), 36000, 0, 0 ); // 10 hours...
|
|
|
|
rotor_back = GetEnt( "heli_rotor_back", "targetname" );
|
|
if ( IsDefined( rotor_back ) )
|
|
rotor_back RotateVelocity( ( -300, 0, 0 ), 36000, 0, 0 ); // 10 hours...
|
|
}
|
|
|
|
satellite_static()
|
|
{
|
|
self endon( "disconnect" );
|
|
|
|
static_center = getstruct( "satellite_use_loc", "targetname" );
|
|
self maps\mp\killstreaks\_emp_common::staticFieldInit();
|
|
static_dist = 512;
|
|
static_dist_squared = static_dist * static_dist;
|
|
|
|
while ( 1 )
|
|
{
|
|
in_range = Length2DSquared( self.origin - static_center.origin ) < static_dist_squared;
|
|
if ( in_range && flag( "satellite_crashed" ) )
|
|
{
|
|
self maps\mp\killstreaks\_emp_common::staticFieldSetStrength( 1 );
|
|
}
|
|
else
|
|
{
|
|
self maps\mp\killstreaks\_emp_common::staticFieldSetStrength( 0 );
|
|
}
|
|
|
|
wait( 0.5 );
|
|
}
|
|
}
|
|
|
|
satellite_static_emp_watch()
|
|
{
|
|
level waittill_either ( "emp_update" );
|
|
}
|
|
|
|
ice()
|
|
{
|
|
ice_pieces = GetEntArray( "ice", "targetname" );
|
|
array_thread( ice_pieces, ::ice_init );
|
|
}
|
|
|
|
ice_init()
|
|
{
|
|
|
|
self.start_origin = self.origin;
|
|
|
|
// self.anim_ref = spawn( "script_model", self.origin );
|
|
// self.anim_ref.angles = (0,RandomFloatRange(0,360),0);
|
|
// self.anim_ref SetModel( "generic_prop_raven" );
|
|
//
|
|
// self Linkto( self.anim_ref, "j_prop_1" );
|
|
|
|
self.anim_ref = self;
|
|
|
|
targets = GetEntArray( self.target, "targetname" );
|
|
|
|
foreach ( target in targets )
|
|
{
|
|
switch( target.script_noteworthy )
|
|
{
|
|
case "border":
|
|
self.border = target;
|
|
break;
|
|
case "trigger_sink":
|
|
self.trigger = target;
|
|
self.trigger EnableLinkTo();
|
|
self.trigger LinkTo( self );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
self thread ice_damage_watch();
|
|
}
|
|
|
|
ice_damage_watch()
|
|
{
|
|
self SetCanDamage( true );
|
|
self.health = 30;
|
|
|
|
while ( 1 )
|
|
{
|
|
self waittill( "damage" );
|
|
if ( self.health <= 0 )
|
|
break;
|
|
}
|
|
|
|
if ( IsDefined( self.script_fxid ) )
|
|
{
|
|
exploder( self.script_fxid );
|
|
}
|
|
|
|
self PlaySound( "pond_ice_crack" );
|
|
|
|
self.border Delete();
|
|
|
|
// self.anim_ref ScriptModelPlayAnim("mp_snow_buoy_sway");
|
|
self thread ice_float();
|
|
self thread ice_player_watch();
|
|
self thread ice_sink();
|
|
}
|
|
|
|
ice_float()
|
|
{
|
|
loop_count = 0;
|
|
while ( 1 )
|
|
{
|
|
moveTime = RandomFloatRange( 3, 5 );
|
|
new_angles = ( RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ) );
|
|
new_angles = VectorNormalize( new_angles );
|
|
new_angles *= 3;
|
|
if ( loop_count <= 2 )
|
|
{
|
|
new_angles *= 3 - loop_count;
|
|
moveTime /= 3 - loop_count;
|
|
}
|
|
|
|
self RotateTo( new_angles, moveTime );
|
|
self waittill( "rotatedone" );
|
|
loop_count++;
|
|
}
|
|
}
|
|
|
|
ice_player_watch()
|
|
{
|
|
self.sink_time = 0;
|
|
while ( 1 )
|
|
{
|
|
self.trigger waittill( "trigger" );
|
|
self.sink_time = GetTime() + 200;
|
|
}
|
|
}
|
|
|
|
ice_sink()
|
|
{
|
|
sink_speed = 40;
|
|
raise_speed = 20;
|
|
|
|
raise_origin = self.start_origin;
|
|
sink_origin = raise_origin - ( 0, 0, 100 );
|
|
|
|
while ( 1 )
|
|
{
|
|
while ( self.sink_time < GetTime() )
|
|
waitframe();
|
|
|
|
dist = Distance( self.origin, sink_origin );
|
|
move_time = dist / sink_speed;
|
|
self.anim_ref MoveTo( sink_origin, move_time );
|
|
|
|
while ( self.sink_time >= GetTime() )
|
|
waitframe();
|
|
|
|
dist = Distance( self.origin, raise_origin );
|
|
move_time = dist / raise_speed;
|
|
self.anim_ref MoveTo( raise_origin, move_time, 0, move_time );
|
|
}
|
|
}
|
|
|
|
wait_game_percent_complete( time_percent, score_percent )
|
|
{
|
|
if ( !IsDefined( score_percent ) )
|
|
score_percent = time_percent;
|
|
|
|
gameFlagWait( "prematch_done" );
|
|
|
|
if ( !IsDefined( level.startTime ) )
|
|
return;
|
|
|
|
score_limit = getScoreLimit();
|
|
time_limit = getTimeLimit() * 60;
|
|
|
|
ignore_score = false;
|
|
ignore_time = false;
|
|
|
|
if ( ( score_limit <= 0 ) && ( time_limit <= 0 ) )
|
|
{
|
|
ignore_score = true;
|
|
time_limit = 10 * 60;
|
|
}
|
|
else if ( score_limit <= 0 )
|
|
{
|
|
ignore_score = true;
|
|
}
|
|
else if ( time_limit <= 0 )
|
|
{
|
|
ignore_time = true;
|
|
}
|
|
|
|
time_threshold = time_percent * time_limit;
|
|
score_threshold = score_percent * score_limit;
|
|
|
|
higher_score = get_highest_score();
|
|
timePassed = ( GetTime() - level.startTime ) / 1000;
|
|
|
|
if ( ignore_score )
|
|
{
|
|
while ( timePassed < time_threshold )
|
|
{
|
|
wait( 0.5 );
|
|
timePassed = ( GetTime() - level.startTime ) / 1000;
|
|
}
|
|
}
|
|
else if ( ignore_time )
|
|
{
|
|
while ( higher_score < score_threshold )
|
|
{
|
|
wait( 0.5 );
|
|
higher_score = get_highest_score();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while ( ( timePassed < time_threshold ) && ( higher_score < score_threshold ) )
|
|
{
|
|
wait( 0.5 );
|
|
higher_score = get_highest_score();
|
|
timePassed = ( GetTime() - level.startTime ) / 1000;
|
|
}
|
|
}
|
|
}
|
|
|
|
get_highest_score()
|
|
{
|
|
highestScore = 0;
|
|
if ( level.teamBased )
|
|
{
|
|
if ( IsDefined( game[ "teamScores" ] ) )
|
|
{
|
|
highestScore = game[ "teamScores" ][ "allies" ];
|
|
if ( game[ "teamScores" ][ "axis" ] > highestScore )
|
|
{
|
|
highestScore = game[ "teamScores" ][ "axis" ];
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( IsDefined( level.players ) )
|
|
{
|
|
foreach ( player in level.players )
|
|
{
|
|
if ( IsDefined( player.score ) && player.score > highestScore )
|
|
highestScore = player.score;
|
|
}
|
|
}
|
|
}
|
|
return highestScore;
|
|
}
|
|
|
|
SNOW_SATELLITE_WEIGHT = 55;
|
|
snowCustomCrateFunc()
|
|
{
|
|
if ( !IsDefined( game[ "player_holding_level_killstrek" ] ) )
|
|
game[ "player_holding_level_killstrek" ] = false;
|
|
|
|
if ( !level.snow_satellite_allowed || game[ "player_holding_level_killstrek" ] )
|
|
return;
|
|
|
|
//"Press and hold [{+activate}] for Satellite Crash."
|
|
maps\mp\killstreaks\_airdrop::addCrateType( "airdrop_assault", "snow_satellite", SNOW_SATELLITE_WEIGHT, maps\mp\killstreaks\_airdrop::killstreakCrateThink, maps\mp\killstreaks\_airdrop::get_friendly_crate_model(), maps\mp\killstreaks\_airdrop::get_enemy_crate_model(), &"KILLSTREAKS_HINTS_SNOW_SATELLITE" );
|
|
level thread watch_for_snow_satellite_crate();
|
|
}
|
|
|
|
watch_for_snow_satellite_crate()
|
|
{
|
|
while ( 1 )
|
|
{
|
|
level waittill( "createAirDropCrate", dropCrate );
|
|
|
|
if ( IsDefined( dropCrate ) && IsDefined( dropCrate.crateType ) && dropCrate.crateType == "snow_satellite" )
|
|
{
|
|
//Only allow satellite killstreak once
|
|
disable_snow_satellite();
|
|
captured = wait_for_capture( dropCrate );
|
|
|
|
if ( !captured )
|
|
{
|
|
//reEnable Sat Crash care packages if it expires with out anyone picking it up
|
|
maps\mp\killstreaks\_airdrop::changeCrateWeight( "airdrop_assault", "snow_satellite", SNOW_SATELLITE_WEIGHT );
|
|
}
|
|
else
|
|
{
|
|
//Once its picked up it needs to remain off.
|
|
game[ "player_holding_level_killstrek" ] = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//death and capture are sent on the same frame but death is processed first :(
|
|
wait_for_capture( dropCrate )
|
|
{
|
|
result = watch_for_air_drop_death( dropCrate );
|
|
return !IsDefined( result ); //If !isdefined the captured notify was also sent.
|
|
}
|
|
|
|
watch_for_air_drop_death( dropCrate )
|
|
{
|
|
dropCrate endon( "captured" );
|
|
|
|
dropCrate waittill( "death" );
|
|
waittillframeend;
|
|
|
|
return true;
|
|
}
|
|
|
|
disable_snow_satellite()
|
|
{
|
|
maps\mp\killstreaks\_airdrop::changeCrateWeight( "airdrop_assault", "snow_satellite", 0 );
|
|
}
|
|
|
|
snowCustomKillstreakFunc()
|
|
{
|
|
AddDebugCommand( "devgui_cmd \"MP/Killstreak/Level Event:5/Care Package/snow Satellite\" \"set scr_devgivecarepackage snow_satellite; set scr_devgivecarepackagetype airdrop_assault\"\n" );
|
|
AddDebugCommand( "devgui_cmd \"MP/Killstreak/Level Event:5/snow Satellite\" \"set scr_givekillstreak snow_satellite\"\n" );
|
|
|
|
level.killStreakFuncs [ "snow_satellite" ] = ::tryUseSnowSatellite;
|
|
level.killstreakWeildWeapons[ "snow_satellite_mp" ] = "snow_satellite";
|
|
}
|
|
|
|
snowCustomBotKillstreakFunc()
|
|
{
|
|
AddDebugCommand( "devgui_cmd \"MP/Bots(Killstreak)/Level Events:5/snow Satellite\" \"set scr_testclients_givekillstreak snow_satellite\"\n" );
|
|
maps\mp\bots\_bots_ks::bot_register_killstreak_func( "snow_satellite", maps\mp\bots\_bots_ks::bot_killstreak_simple_use );
|
|
}
|
|
|
|
tryUseSnowSatellite( lifeId, streakName )
|
|
{
|
|
game[ "player_holding_level_killstrek" ] = false;
|
|
level notify( "snow_satellite_killstreak", self );
|
|
return true;
|
|
}
|