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

1139 lines
32 KiB
Plaintext

#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\agents\_agent_utility;
main()
{
maps\mp\mp_dome_ns_precache::main();
anim_precache();
maps\createart\mp_dome_ns_art::main();
maps\mp\mp_dome_ns_fx::main();
common_scripts\_pipes::main();
level.mapCustomCrateFunc = ::dome_nsCustomCrateFunc;
level.mapCustomKillstreakFunc = ::dome_nsCustomKillstreakFunc;
level.mapCustomBotKillstreakFunc = ::dome_nsCustomBotKillstreakFunc;
level.deployableBoxGiveWeaponFunc = maps\mp\mp_alien_weapon::give_alien_weapon;
maps\mp\_load::main();
mp_dome_ns_flag_init();
SetDvar("r_globalGenericMaterialScale",4.0);
// maps\mp\mp_dome_ns_alien::setup_callbacks();
maps\mp\_compass::setupMiniMap( "compass_map_mp_dome_ns" );
setdvar( "r_lightGridEnableTweaks", 1 );
setdvar( "r_lightGridIntensity", 1.33 );
//reactive motion settings
setdvar( "r_reactiveMotionWindAmplitudeScale", 0.4 );
SetDvar( "r_reactiveMotionPlayerRadius", 20.0 );
game["attackers"] = "allies";
game["defenders"] = "axis";
alien_weapon_setup();
thread auto_door_setup();
thread crane_platform();
thread always_open_door();
maps\mp\mp_alien_weapon::init();
if ( level.ps3 )
{
SetDvar( "sm_sunShadowScale", "0.3" ); // ps3 optimization
SetDvar( "sm_sunsamplesizenear", ".15" );
}
else if ( level.xenon )
{
SetDvar( "sm_sunShadowScale", "0.55" + "" ); // optimization
SetDvar( "sm_sunsamplesizenear", ".25" );
}
else
{
SetDvar( "sm_sunShadowScale", "1.0" ); // optimization
// SetDvar( "sm_sunsamplesizenear", ".27" );
}
setdvar_cg_ng( "r_specularColorScale", 3.0, 7.5 );
level.pipesDamage = false;
thread maps\mp\_dlcalienegg::setupEggForMap( "alienEasterEgg" );
}
mp_dome_ns_flag_init()
{
flag_init( "crane_usable" );
flag_init( "misters_on" );
}
set_up_shootable_pipes()
{
pipes = GetEntArray ( "pipe_shootable", "targetname" );
foreach ( pipe in pipes )
{
pipe.script_noteworthy = "steam";
}
}
anim_precache()
{
PrecacheMpAnim ( "mp_dome_ns_crane_cargo_01" );
PrecacheMpAnim ( "mp_dome_ns_crane_cargo_02" );
PrecacheMpAnim ( "mp_dome_ns_crane_cargo_start" );
PrecacheMpAnim ( "mp_dome_ns_crane_01" );
PrecacheMpAnim ( "mp_dome_ns_crane_02" );
PrecacheMpAnim ( "mp_dome_ns_crane_start" );
// PrecacheMpAnim ( "mp_dome_ns_showerdoor_open" );
// PrecacheMpAnim ( "mp_dome_ns_showerdoor_close" );
PrecacheMpAnim ( "mp_dome_ns_showerdoor_open_l" );
PrecacheMpAnim ( "mp_dome_ns_showerdoor_close_l" );
PrecacheMpAnim ( "mp_dome_ns_showerdoor_open_r" );
PrecacheMpAnim ( "mp_dome_ns_showerdoor_close_r" );
PreCacheModel ( "mp_dns_crane_debris" );
}
alien_weapon_setup()
{
// platform_origin = GetEnt( "platform_origin", "targetname" );
trigger = GetEnt ( "alien_weapon_trigger", "targetname" );
// trigger EnableLinkTo();
// trigger LinkTo( platform_origin );
thread alien_weapon_trigger_watcher ( trigger );
}
alien_weapon_trigger_watcher( trigger )
{
trigger MakeUnusable();
flag_wait ( "crane_usable" );
platform_origin = GetEnt( "platform_origin", "targetname" );
trigger MakeUsable();
trigger EnableLinkTo();
trigger LinkTo( platform_origin );
trigger SetHintString ( &"MP_DOME_NS_GET_ALIEN_GUN" );
while ( 1 )
{
if ( level.remaining_alien_weapons == 0 )
break;
trigger waittill ( "trigger", triggerer );
triggerer maps\mp\mp_alien_weapon::give_alien_weapon();
}
alien_gun_model = GetEnt ( "alien_gun_model", "targetname" );
alien_gun_model hide();
trigger MakeUnusable();
trigger SetHintString ( "" );
}
#using_animtree ( "animated_props_dlc2" );
crane_platform()
{
thread crane_available_check();
test_bed = GetEnt ( "het_bed_proxy", "targetname" );
test_bed delete();
cooldown_time = 2;
level.platform_lights = [];
// Get all the Ents needed to make the basket happen
platform_origin = GetEnt( "platform_origin", "targetname" );
platform_model = GetEnt( "moving_platform_model", "targetname" );
alien_gun_model = GetEnt ( "alien_gun_model", "targetname" );
platform_sfx_origin = GetEnt( "platform_sfx_origin", "targetname" );
platform_death_trigger = GetEnt ( "platform_death_trigger", "targetname" );
crane = GetEnt ( "dome_crane", "targetname" );
platforms = GetEntArray ( "moving_platform", "targetname" );
// Because I can't just use a noteworthy on the models, it has to be manually added to the array
platforms[platforms.size] = platform_model;
platforms[platforms.size] = alien_gun_model;
// Side blocker disconnects the paths that are blocked by the sides of the container when it's down
side_blockerB = GetEnt ( "side_blockerB", "targetname" );
// Attach collision for animated crane
arm_base_jnt_collision = GetEnt( "arm_base_jnt_collision", "targetname" );
arm_mid_jnt_collision = GetEnt( "arm_mid_jnt_collision", "targetname" );
arm_end_jnt_collision = GetEnt( "arm_end_jnt_collision", "targetname" );
operators_cab_jnt_collision = GetEnt( "operators_cab_jnt_collision", "targetname" );
hook_jnt_collision = GetEnt( "hook_jnt_collision", "targetname" );
arm_base_jnt_collision LinkTo( crane, "arm_base_jnt" );
arm_mid_jnt_collision LinkTo( crane, "arm_mid_jnt" );
arm_end_jnt_collision LinkTo( crane, "arm_end_jnt" );
operators_cab_jnt_collision LinkTo( crane, "operators_cab_jnt" );
hook_jnt_collision LinkTo( crane, "hook_jnt" );
arm_base_jnt_collision.destroyAirdropOnCollision = true;
arm_mid_jnt_collision.destroyAirdropOnCollision = true;
arm_end_jnt_collision.destroyAirdropOnCollision = true;
operators_cab_jnt_collision.destroyAirdropOnCollision = true;
hook_jnt_collision.destroyAirdropOnCollision = true;
arm_base_jnt_collision.no_moving_platfrom_death = true;
arm_mid_jnt_collision.no_moving_platfrom_death = true;
arm_end_jnt_collision.no_moving_platfrom_death = true;
operators_cab_jnt_collision.no_moving_platfrom_death = true;
hook_jnt_collision.no_moving_platfrom_death = true;
// Set up and attach triggers
gate_watchers = GetEntArray ( "gate_watcher", "targetname" );
crane_occupied_watcher = GetEnt ( "crane_occupied_watcher", "targetname" );
foreach ( gate_watcher in gate_watchers )
{
gate_watcher EnableLinkTo();
gate_watcher LinkTo ( platform_origin );
}
platform_death_trigger EnableLinkTo();
platform_death_trigger LinkTo ( platform_origin );
crane_occupied_watcher EnableLinkTo();
crane_occupied_watcher LinkTo ( platform_origin );
thread disable_drones_watcher( crane_occupied_watcher );
waitframe();
// Initial positions for platform and crane
platform_origin ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_cargo_start" );
crane ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_start" );
wait 1;
foreach( platform in platforms )
{
platform LinkTo( platform_origin, "tag_origin" );
platform.destroyAirdropOnCollision = true;
}
platform_sfx_origin LinkTo( platform_origin, "tag_origin" );
side_blockerB Solid();
side_blockerB ConnectPaths();
side_blockerB NotSolid();//iw6-depot/iw6-dlc/game/xanim_export/mp_dome_ns/mp_dome_ns_crane_cargo_02.XANIM_EXPORT
crane_gate_blocker = GetEnt( "crane_gate_blocker", "targetname" );
crane_gate_blocker LinkTo( platform_origin );
crane_gate_blocker.no_moving_platfrom_death = true;
crane_audio_org = GetEnt( "crane_audio_org", "targetname" );
trip = 1; // trip 1 is going from start to new location, trip -1 is going from new back to start location
flag_wait ( "crane_usable" );
// Set up the mini-map icon for the crane
Objective_Add( 31, "active", platform_model.origin,"waypoint_man_basket" );
Objective_OnEntityWithRotation( 31, platform_model );
crane_gate_blocker Unlink();
crane_gate_blocker NotSolid();
//crane_gate_blocker MoveTo ( crane_gate_blocker.origin + (0,0,256), 0.05 );
wait 0.1;
crane_gate_blocker LinkTo( platform_origin );
triggerA = GetEnt ( "platform_toggle_triggerA", "targetname" );
triggerA SetHintString ( &"MP_DOME_NS_ACTIVATE_CRANE" );
triggerA MakeUsable();
triggerB = GetEnt ( "platform_toggle_triggerB", "targetname" );
triggerB SetHintString ( &"MP_DOME_NS_ACTIVATE_CRANE" );
triggerB MakeUnusable();
thread gate_watcher( gate_watchers, triggerA );
thread gate_watcher( gate_watchers, triggerB );
while ( 1 )
{
// Wait for the player to push the button
level waittill ( "crane_triggered" );
thread fx_crane_light( platform_sfx_origin );
crane_gate_move( crane_gate_blocker, platform_origin, "down" );
// platform_origin ScriptModelClearAnim();
// crane ScriptModelClearAnim();
// Going from HET to excavator
if (trip == 1)
{
triggerA PlaySound("scn_crane_button_activate");
triggerA MakeUnusable();
platform_origin ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_cargo_01" );
platform_model ScriptModelPlayAnim ( "mp_dome_ns_crane_cargo_01_gate" );
crane ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_01" );
// Bit of a hack since notetrack utility functions do not seem to work in MP
anim_length = GetAnimLength( %mp_dome_ns_crane_cargo_01_gate );
percent = GetNotetrackTimes ( %mp_dome_ns_crane_cargo_01_gate, "gate_open" );
time = anim_length * percent[0];
}
// Going from excavator to HET
else
{
triggerB PlaySound("scn_crane_button_activate");
triggerB MakeUnusable();
platform_origin ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_cargo_02" );
platform_model ScriptModelPlayAnim ( "mp_dome_ns_crane_cargo_02_gate" );
crane ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_02" );
// Bit of a hack since notetrack utility functions do not seem to work in MP
percent = GetNotetrackTimes ( %mp_dome_ns_crane_cargo_02_gate, "gate_open" );
anim_length = GetAnimLength( %mp_dome_ns_crane_cargo_02_gate );
time = anim_length * percent[0];
// Connect the side paths.
side_blockerB Solid();
side_blockerB ConnectPaths();
side_blockerB NotSolid();
}
/* Sfx for bar lowering */
thread sfx_crane_bar(trip, 0, "down");
crane_audio_org thread sfx_crane_start();
platform_sfx_origin thread sfx_crane_platform_start();
// Activate unresolved collision handling
foreach ( platform in platforms )
{
platform.unresolved_collision_func = ::crane_damage_manager;
platform.unresolved_collision_notify_min = 1;
platform.unresolved_collision_kill = true;
platform.owner = level.triggerer;
}
/* Sfx for bar raising */
thread sfx_crane_bar(trip, time, "up");
// Wait until the notetrack
wait time;
// Rotate gate up
crane_gate_move( crane_gate_blocker, platform_origin, "up" );
// turn on the backup death trigger
platform_death_trigger thread death_trigger_manager();
// Landing at excavator
if (trip == 1)
{
// Manage the nodes around the landing area
side_blockerB Solid();
side_blockerB DisConnectPaths();
side_blockerB NotSolid();
sfx_time = anim_length - time;
crane_audio_org thread sfx_crane_stop(sfx_time, 2);
platform_sfx_origin thread sfx_crane_stop_impt(sfx_time, 0.2);
}
// Landing at HET
else
{
sfx_time = anim_length - time;
crane_audio_org thread sfx_crane_stop(sfx_time, 1.8);
platform_sfx_origin thread sfx_crane_stop_impt(sfx_time, 0.4);
}
// Wait the remainder of the anim
wait (anim_length - time);
wait cooldown_time;
if (trip == 1)
{
triggerB SetHintString ( &"MP_DOME_NS_ACTIVATE_CRANE" );
triggerB MakeUsable();
}
else
{
triggerA SetHintString ( &"MP_DOME_NS_ACTIVATE_CRANE" );
triggerA MakeUsable();
}
// flip the trip variable
trip = trip*(0-1);
level notify ( "platform_move_done" );
}
}
// This function serves as an emergency backup for when the unresolved collision handler fails.
death_trigger_manager()
{
level endon ( "platform_move_done" );
while ( 1 )
{
// Reset array
agents_in_trigger = [];
// Get all the Players/Dogs/Squadmates/Juggernauts/Aliens
agents = maps\mp\agents\_agent_utility::getActiveAgentsOfType( "all" );
agents = array_combine ( agents, level.players );
// agents = array_combine ( agents, level.remote_uav );
// Remove spectators
foreach ( agent in agents )
{
if( isPlayer(agent) && (agent.sessionstate == "intermission" || agent.sessionstate == "spectator" || !isReallyAlive ( agent )) )
agents = array_remove ( agents, agent );
}
// waitframe();
// How many agents are in the trigger?
agents_in_trigger = self GetIsTouchingEntities( agents );
foreach ( agent in agents_in_trigger )
{
self crane_damage_manager( agent );
}
wait .1;
}
}
disable_drones_watcher( trigger )
{
while ( 1 )
{
// Wait until the game has started before checking against players
if ( IsDefined ( level.players ))
{
break;
}
wait 1;
}
while ( 1 )
{
touchers = trigger GetIsTouchingEntities ( level.players );
foreach ( toucher in touchers )
{
if ( isdefined ( toucher.drones_disabled ))
continue;
toucher.drones_disabled = true;
toucher.seekers_disabled = true;
toucher thread enable_drones_watcher( trigger );
}
wait 0.05;
}
}
enable_drones_watcher( trigger )
{
if ( !isPlayer ( self ) )
self endon ( "death" );
self endon ( "disconnect" );
while ( self isTouching( trigger ) )
wait( 0.05 );
self.drones_disabled = undefined;
self.seekers_disabled = undefined;
}
gate_watcher( gate_triggers, crane_trigger )
{
while ( 1 )
{
crane_trigger waittill ( "trigger", triggerer );
players_in_trigger = [];
players_in_this_trigger = [];
players = level.players;
// Remove spectators
foreach ( player in players )
{
if( player.sessionstate == "intermission" || player.sessionstate == "spectator" || !isReallyAlive ( player ) )
player = array_remove ( players, player );
}
// How many agents are in the triggers?
foreach ( trigger in gate_triggers )
{
players_in_this_trigger = trigger GetIsTouchingEntities( players );
players_in_trigger = array_combine ( players_in_trigger, players_in_this_trigger );
}
if ( players_in_trigger.size > 0 )
{
triggerer PlaySoundToPlayer ( "alien_miasma_alarm", triggerer );
}
else
{
level notify ( "crane_triggered" );
level.triggerer = triggerer;
}
}
}
crane_gate_move( crane_gate_blocker, platform_origin, direction )
{
if ( direction == "up" )
{
level notify ( "basket_descending" );
crane_gate_blocker NotSolid();
}
else
{
crane_gate_blocker Solid();
}
}
crane_available_check()
{
platform_model= GetEnt( "moving_platform_model", "targetname" );
platform_origin = GetEnt( "platform_origin", "targetname" );
crane = GetEnt ( "dome_crane", "targetname" );
level.crane_targets = 3;
thread crane_target_setup( "crane_target_1", "arm_base_jnt", 5 );
thread crane_target_setup( "crane_target_2", "arm_mid_jnt", 6 );
thread crane_target_setup( "crane_target_3", "arm_end_jnt", 7 );
while ( level.crane_targets == 3 )
{
if ( getdvarint( "scr_activateCrane" ) == 1 )
break;
wait 0.05;
}
platform_model playsound("scn_dome_crane_platform_01");
// platform_origin ScriptModelClearAnim();
// crane ScriptModelClearAnim();
platform_origin ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_cargo_drop1" );
platform_model ScriptModelPlayAnim ( "mp_dome_ns_crane_cargo_drop1_gate" );
crane ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_drop1" );
anim_length = GetAnimLength( %mp_dome_ns_crane_drop1 );
wait anim_length;
while ( level.crane_targets == 2 )
{
if ( getdvarint( "scr_activateCrane" ) == 1 )
break;
wait 0.05;
}
platform_model playsound("scn_dome_crane_platform_02");
// platform_origin ScriptModelClearAnim();
// crane ScriptModelClearAnim();
platform_origin ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_cargo_drop2" );
platform_model ScriptModelPlayAnim ( "mp_dome_ns_crane_cargo_drop2_gate" );
crane ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_drop2" );
anim_length = GetAnimLength( %mp_dome_ns_crane_drop2 );
wait anim_length;
while ( level.crane_targets == 1 )
{
if ( getdvarint( "scr_activateCrane" ) == 1 )
break;
wait 0.05;
}
platform_model playsound("scn_dome_crane_platform_03");
// platform_origin ScriptModelClearAnim();
// crane ScriptModelClearAnim();
platform_origin ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_cargo_drop3" );
platform_model ScriptModelPlayAnim( "mp_dome_ns_crane_cargo_drop3_gate" );
crane ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_drop3" );
platform_debris = spawn ( "script_model", crane.origin );
platform_debris.angles = crane.angles;
platform_debris SetModel ( "mp_dns_crane_debris" );
platform_debris ScriptModelPlayAnimDeltaMotion( "mp_dome_ns_crane_drop3_debris" );
anim_length = GetAnimLength( %mp_dome_ns_crane_drop3 );
wait anim_length - .8;
//play the crate impact fx
exploder(4);
wait .2;
blockers = GetEntArray ( "crane_platform_blocker", "targetname" );
nodes = GetNodeArray ( "traverse_platform", "targetname" );
foreach ( node in nodes )
{
ConnectNodePair( node, GetNode( node.target, "targetname" ) );
}
// Disallow the nodes on the HET
bad_nodes = GetNodeArray ( "no_agent_spawn_node", "script_noteworthy" );
bad_nodes array_combine ( bad_nodes, nodes );
foreach ( node in bad_nodes )
{
node.no_agent_spawn = true;
}
foreach ( blocker in blockers )
{
if ( blocker.classname == "script_brushmodel" )
blocker ConnectPaths();
blocker delete();
}
wait 1;
flag_set ( "crane_usable" );
platform_model man_cage_button_fx();
}
man_cage_button_fx()
{
flag_wait("crane_usable");
while(1)
{
StopFXOnTag(level._effect[ "vfx_red_light" ], self, "tag_fx_red");
PlayFXOnTag(level._effect[ "vfx_green_light" ], self, "tag_fx_green");
// Wait for the player to push the button
level waittill ( "crane_triggered" );
PlayFXOnTag(level._effect[ "vfx_red_light" ], self, "tag_fx_red");
StopFXOnTag(level._effect[ "vfx_green_light" ], self, "tag_fx_green");
//stay red until done moving, then loop back to green
level waittill ( "platform_move_done" );
}
}
crane_target_setup( targetname, joint, exploderID )
{
crane_target = GetEnt ( targetname, "targetname" );
crane = GetEnt ( "dome_crane", "targetname" );
crane_target LinkTo( crane, joint );
// disallow destruction of the locks if gametype has weapon restrictions
if ( level.gameType == "oic" || level.gameType == "gun" || level.gameType == "infect" || level.gameType == "horde" || level.gameType == "sotf" || level.gameType == "sotf_ffa"|| isMLGMatch() )
{
crane_target delete();
return;
}
crane_target SetCanDamage( true );
crane_target.health = 100000;
while ( 1 )
{
crane_target waittill ( "damage", damage, attacker, direction_vec, P, type );
if ( damage >= 75 && ( type == "MOD_EXPLOSIVE" || type == "MOD_PROJECTILE_SPLASH" || type == "MOD_PROJECTILE" || type == "MOD_GRENADE_SPLASH" || type == "MOD_GRENADE" || type == "SPLASH" ))
{
crane_target playsound("scn_dome_crane_explo_01");
crane_target delete();
level.crane_targets --;
exploder(exploderID);
break;
}
}
}
crane_damage_manager( hitEnt )
{
if ( isdefined ( level.triggerer) )
{
// Same Team
if ( IsDefined (hitEnt.team) && hitEnt.team == level.triggerer.team )
hitEnt DoDamage( 1000, hitEnt.origin, self, self, "MOD_CRUSH" );
else
hitEnt DoDamage( 1000, hitEnt.origin, level.triggerer, self, "MOD_CRUSH" );
// self RadiusDamage( hitEnt.origin, 1, 10000, 9999, level.triggerer, "MOD_CRUSH" );
}
else
{
hitEnt DoDamage( 1000, hitEnt.origin, undefined, undefined, "MOD_CRUSH" );
// self RadiusDamage( hitEnt.origin, 1, 10000, 9999, undefined, "MOD_CRUSH" );
}
}
clean_tube_watcher( )
{
trigger = GetEnt ( "trigger_clean_tube_spray", "targetname" );
while ( 1 )
{
// Reset array
agents_in_trigger = [];
// Get all the Players/Dogs/Squadmates/Juggernauts/Aliens
agents = maps\mp\agents\_agent_utility::getActiveAgentsOfType( "all" );
agents = array_combine ( agents, level.players );
agents = array_combine ( agents, level.remote_uav );
// Remove spectators
foreach ( agent in agents )
{
if( isPlayer(agent) && (agent.sessionstate == "intermission" || agent.sessionstate == "spectator" || !isReallyAlive ( agent )) )
agents = array_remove ( agents, agent );
}
waitframe();
// How many agents are in the trigger?
agents_in_trigger = trigger GetIsTouchingEntities( agents );
// Prevent spawning flying drones in the tube.
foreach ( agent in agents_in_trigger )
{
if (IsPlayer(agent))
agent.drones_disabled = true;
agent thread enable_drones_watcher( trigger );
}
// Someone (or something) is in the tube.
if ( agents_in_trigger.size > 0 )
{
ActivateClientExploder ( 70 );
thread sfx_misters_on();
}
else
thread sfx_misters_off();
wait .75;
}
}
door_trigger_watcher( trigger )
{
while ( 1 )
{
// Get all the Players/Dogs/Squadmates/Juggernauts/Aliens
agents = maps\mp\agents\_agent_utility::getActiveAgentsOfType( "all" );
agents = array_combine ( agents, level.players );
agents = array_combine ( agents, level.remote_uav );
// Remove spectators
foreach ( agent in agents )
{
if( isPlayer(agent) && (agent.sessionstate == "intermission" || agent.sessionstate == "spectator" || !isReallyAlive ( agent )) )
agents = array_remove ( agents, agent );
}
waitframe();
// How many agents are in the trigger?
agents_in_trigger = trigger GetIsTouchingEntities( agents );
// If it's none, the door should close.
if ( agents_in_trigger.size == 0 )
{
trigger notify ( "unoccupied" );
}
// Otherwise, it should open
else
{
trigger notify ( "occupied" );
}
wait .25;
}
}
// Auto Door scripts
// An auto door trigger should have the targetname of "trigger_automatic_door".
// Give the trigger a script_parameters value of "target=X;" where "X" is the targetname of all the door parts. X should be unique per door.
always_open_door()
{
door_model_r = GetEnt ( "door_open_right", "targetname" );
door_model_l = GetEnt ( "door_open_left", "targetname" );
door_model_r ScriptModelPlayAnimDeltaMotion ( "mp_dome_ns_showerdoor_open_l" );
door_model_l ScriptModelPlayAnimDeltaMotion ( "mp_dome_ns_showerdoor_open_r" );
}
auto_door_setup()
{
while ( 1 )
{
// Wait until the game has started before checking against players
if ( IsDefined ( level.players ))
{
break;
}
wait 1;
}
// Piggybacking off of the players existing check above to launch the clean tube stuff.
thread clean_tube_watcher();
triggers = GetEntArray( "trigger_automatic_door", "targetname" );
foreach ( trigger in triggers )
{
thread door_trigger_watcher( trigger );
thread auto_door_manager( trigger );
}
}
auto_door_manager( trigger )
{
// Delay after opening fully until it checks to close
close_delay = 2;
door_entities = GetEntArray ( trigger.target, "targetname" );
// For some reason, I have to define these variables before I can assign an entity to them, or else it doesn't work.
left_door = 1;
right_door = 1;
closed_left = 1;
closed_right = 1;
open_left = 1;
open_right = 1;
door_animated_right = 1;
door_animated_left = 1;
foreach( piece in door_entities )
{
parameters = piece.script_parameters;
if ( piece.script_parameters == "door_left;")
thing = piece;
if ( !IsDefined( parameters ) )
parameters = "";
params = StrTok( parameters, ";" );
foreach ( param in params )
{
if ( params[0] == "door_left" )
left_door = piece;
if ( params[0] == "door_right" )
right_door = piece;
if ( params[0] == "closed_left" )
closed_left = piece;
if ( params[0] == "closed_right" )
closed_right = piece;
if ( params[0] == "open_left" )
open_left = piece;
if ( params[0] == "open_right" )
open_right = piece;
if ( params[0] == "door_animated_right" )
door_animated_right = piece;
if ( params[0] == "door_animated_left" )
door_animated_left = piece;
}
}
// The door should never be blocked for AI, so they know they can go through it.
waitframe();
left_door ConnectPaths();
right_door ConnectPaths();
closed = closed_right.origin;
left_door LinkTo( closed_left );
right_door LinkTo( closed_right );
while ( 1 )
{
// If the trigger state is defined, the door is open
trigger waittill ( "occupied" );
// if ( isdefined ( trigger.state ) )
{
left_door maps\mp\_movers::notify_moving_platform_invalid();
right_door maps\mp\_movers::notify_moving_platform_invalid();
closed_left MoveTo( open_left.origin, .5 );
closed_right MoveTo( open_right.origin, .5 );
door_animated_left ScriptModelPlayAnimDeltaMotion ( "mp_dome_ns_showerdoor_open_r" );
door_animated_right ScriptModelPlayAnimDeltaMotion ( "mp_dome_ns_showerdoor_open_l" );
door_animated_left PlaySound("scn_dome_ns_glass_door_open");
door_animated_right PlaySound("scn_dome_ns_glass_door_open");
wait .5;
wait close_delay;
}
trigger waittill ( "unoccupied" );
// else
{
closed_left MoveTo( closed, .5 );
closed_right MoveTo( closed, .5 );
door_animated_left ScriptModelPlayAnimDeltaMotion ( "mp_dome_ns_showerdoor_close_r" );
door_animated_right ScriptModelPlayAnimDeltaMotion ( "mp_dome_ns_showerdoor_close_l" );
door_animated_left PlaySound("scn_dome_ns_glass_door_close");
door_animated_right PlaySound("scn_dome_ns_glass_door_close");
wait .5;
}
wait .1;
}
}
fx_crane_light( platform_sfx_origin )
{
PlayFXOnTag ( level._effect[ "vfx_dome_ns_man_cage_flare" ], platform_sfx_origin, "tag_origin" );
level waittill ( "platform_move_done" );
StopFXOnTag ( level._effect[ "vfx_dome_ns_man_cage_flare" ], platform_sfx_origin, "tag_origin" );
}
// Custom Killstreak functions
DOME_NS_ALIEN_DOG_WEIGHT = 200;
dome_nsCustomCrateFunc()
{
if(!IsDefined(game["player_holding_level_killstreak"]))
game["player_holding_level_killstreak"] = false;
if(!allowLevelKillstreaks() || game["player_holding_level_killstreak"])
return;
// SEEKER ADDITION
maps\mp\killstreaks\_airdrop::addCrateType( "airdrop_assault", "dome_seekers", DOME_NS_ALIEN_DOG_WEIGHT, maps\mp\killstreaks\_airdrop::killstreakCrateThink, maps\mp\killstreaks\_airdrop::get_friendly_crate_model(), maps\mp\killstreaks\_airdrop::get_enemy_crate_model(), &"MP_DOME_NS_SEEKERS_PICKUP" );
// level thread watch_for_dome_ns_meteor_crate();
level thread watch_for_dome_ns_alien_dog_crate();
}
watch_for_dome_ns_alien_dog_crate()
{
while(1)
{
level waittill("createAirDropCrate", dropCrate);
if(IsDefined(dropCrate) && IsDefined(dropCrate.crateType) && dropCrate.crateType=="dome_seekers")
{
maps\mp\killstreaks\_airdrop::changeCrateWeight("airdrop_assault", "dome_seekers", 0);
captured = wait_for_capture(dropCrate);
if(!captured)
{
//reEnable seeker care package if it expires with out anyone picking it up
maps\mp\killstreaks\_airdrop::changeCrateWeight("airdrop_assault", "dome_seekers", DOME_NS_ALIEN_DOG_WEIGHT);
}
else
{
//Once it's picked up it needs to remain off.
game["player_holding_level_killstreak"] = 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;
}
dome_nsCustomKillstreakFunc()
{
// Create the debug menu entries for the player
AddDebugCommand("devgui_cmd \"MP/Killstreak/Level Event:7/Care Package/Seekers\" \"set scr_devgivecarepackage dome_seekers; set scr_devgivecarepackagetype airdrop_assault\"\n");
AddDebugCommand("devgui_cmd \"MP/Killstreak/Level Event:7/Seekers\" \"set scr_givekillstreak dome_seekers\"\n");
AddDebugCommand("devgui_cmd \"MP/Killstreak/Level Event:7/Seeker Debug Mode\" \"set scr_alienDebugMode 1\"\n");
AddDebugCommand("devgui_cmd \"MP/Killstreak/Level Event:7/Activate Crane\" \"set scr_activateCrane 1\"\n");
level.killstreakWeildWeapons["killstreak_level_event_mp"] = "dome_seekers"; // level killstreak for mp_dome_ns
level.killStreakFuncs[ "dome_seekers" ] = ::tryUseAlien;
}
tryUseAlien( lifeId, streakName )
{
// In debug mode, only one alien is spawned
if ( getdvarint( "scr_alienDebugMode" ) == 1 )
{
number_of_aliens = 1;
}
else{
number_of_aliens = 3;
}
// limit the number of active "squadmate" agents allowed per game
// Based on CONST_MAX_ACTIVE_KILLSTREAK_AGENTS_PER_GAME, which is currently 5.
if( getNumActiveAgents( ) + number_of_aliens >= 5 )
{
self iPrintLnBold( &"KILLSTREAKS_AGENT_MAX" );
return false;
}
// try to spawn the agent on a path node near the player
nearestPathNode = self getValidSpawnPathNodeNearPlayer( true );
if( !IsDefined(nearestPathNode) || IsDefined ( self.seekers_disabled ) )
{
self iPrintLnBold( &"MP_DOME_NS_SEEKERS_UNAVAILABLE" );
return false;
}
thread maps\mp\mp_dome_ns_alien::useAlien( nearestPathNode, number_of_aliens );
return true;
}
dome_nsCustomBotKillstreakFunc()
{
AddDebugCommand("devgui_cmd \"MP/Bots(Killstreak)/Level Events:5/Seekers\" \"set scr_testclients_givekillstreak dome_seekers\"\n");
maps\mp\bots\_bots_ks::bot_register_killstreak_func( "dome_seekers", maps\mp\bots\_bots_ks::bot_killstreak_simple_use );
}
/* Audio scripting */
sfx_misters_on()
{
if (flag("misters_on"))
return;
flag_set("misters_on");
if (!IsDefined( level.mister_01 ))
level.mister_01 = Spawn( "script_origin", (1735, 1546, -133) );
if (!IsDefined( level.mister_02 ))
level.mister_02 = Spawn( "script_origin", (1745, 1707, -140) );
if (!IsDefined( level.mister_03 ))
level.mister_03 = Spawn( "script_origin", (1753, 1835, -140) );
if (!IsDefined( level.mister_04 ))
level.mister_04 = Spawn( "script_origin", (1698, 1952, -140) );
if (!IsDefined( level.mister_05 ))
level.mister_05 = Spawn( "script_origin", (1540, 1981, -133) );
level.mister_01 PlayLoopSound("emt_dome_ns_mist_01");
level.mister_02 PlayLoopSound("emt_dome_ns_mist_02");
level.mister_03 PlayLoopSound("emt_dome_ns_mist_03");
level.mister_04 PlayLoopSound("emt_dome_ns_mist_01");
level.mister_05 PlayLoopSound("emt_dome_ns_mist_02");
}
sfx_misters_off()
{
if (!flag("misters_on"))
return;
flag_clear("misters_on");
level.mister_01 StopLoopSound();
level.mister_02 StopLoopSound();
level.mister_03 StopLoopSound();
level.mister_04 StopLoopSound();
level.mister_05 StopLoopSound();
}
sfx_crane_start()
{
wait 0.3;
self PlaySound("scn_crane_start");
wait 2.4;
self PlayLoopSound("scn_crane_mvmt_lp");
}
sfx_crane_platform_start()
{
self PlaySound("scn_crane_platform_start");
self thread sfx_crane_rattle();
}
sfx_crane_stop(time, mod)
{
wait time - mod;
//IPrintLnBold("Stopping");
self PlaySound("scn_crane_stop");
wait 0.3;
self StopLoopSound("scn_crane_mvmt_lp");
}
sfx_crane_stop_impt(time, mod)
{
//IPrintLnBold("7 - stopping");
//self PlaySound("scn_crane_rattle");
wait time - mod;
//IPrintLnBold("Impt");
self PlaySound("scn_crane_stop_impt");
}
sfx_crane_rattle()
{
wait 3;
//IPrintLnBold("1");
//self PlaySound("scn_crane_rattle");
wait RandomIntRange(3, 4);
//IPrintLnBold("2");
self PlaySound("scn_crane_rattle");
wait RandomIntRange(9, 12);
//IPrintLnBold("3");
self PlaySound("scn_crane_rattle");
wait RandomIntRange(9, 11);
//IPrintLnBold("4");
self PlaySound("scn_crane_rattle");
wait 7.5;
//IPrintLnBold("5");
self PlaySound("scn_crane_rattle");
//wait RandomIntRange(6, 8);
//IPrintLnBold("6");
//self PlaySound("scn_crane_rattle");
}
sfx_crane_bar( trip, sfx_time, direction )
{
if ( direction == "up" )
{
wait sfx_time - 0.8;
if (trip == 1)
{
//IPrintLnBold("Trip 1: Up");
coord_01 = (-296, 1403, -200);
coord_02 = (-362, 1285, -200);
}
else
{
//IPrintLnBold("Trip 2: Up");
coord_01 = (970, 292, -245);
coord_02 = (1086, 253, -245);
}
soundalias = "scn_crane_bar_up";
soundalias2 = "scn_crane_bar_down";
}
else
{
wait 0.12;
if (trip == 1)
{
//IPrintLnBold("Trip 1: Down");
coord_01 = (970, 292, -250);
coord_02 = (1090, 266, -250);
}
else
{
//IPrintLnBold("Trip 2: Down");
coord_01 = (-281, 1391, -200);
coord_02 = (-345, 1283, -200);
}
soundalias = "scn_crane_bar_down";
soundalias2 = "scn_crane_bar_up";
}
if (!IsDefined( level.sfx_crane_bar_01 ))
level.sfx_crane_bar_01 = Spawn( "script_origin", coord_01 );
if (!IsDefined( level.sfx_crane_bar_02 ))
level.sfx_crane_bar_02 = Spawn( "script_origin", coord_02 );
// Face towards truck
level.sfx_crane_bar_01 PlaySound(soundalias);
// Face away from truck
level.sfx_crane_bar_02 PlaySound(soundalias2);
wait 2;
level.sfx_crane_bar_01 delete();
level.sfx_crane_bar_02 delete();
}