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

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