t5_bot_warfare/mods/patch_mp/maps/mp/mp_cosmodrome.gsc
2021-02-18 13:53:14 -06:00

717 lines
20 KiB
Plaintext

#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\_events;
main()
{
precachemodel("tag_origin");
level.onSpawnIntermission = ::cosmodrome_intermission;
/#
level thread devgui_cosmodrome();
execdevgui( "devgui_mp_cosmodrome" );
#/
//needs to be first for create fx
maps\mp\mp_cosmodrome_fx::main();
precachemodel("collision_wall_128x128x10");
precachemodel("collision_geo_128x128x128");
precachemodel("collision_wall_512x512x10");
precachemodel("collision_geo_mc_8x560x190");
precachemodel("collision_geo_mc_4x52x190");
precachemodel("collision_geo_mc_4x156x190");
maps\mp\_load::main();
if ( GetDvarInt( #"xblive_wagermatch" ) == 1 )
{
maps\mp\_compass::setupMiniMap("compass_map_mp_cosmodrome_wager");
}
else
{
maps\mp\_compass::setupMiniMap("compass_map_mp_cosmodrome");
}
maps\mp\mp_cosmodrome_amb::main();
// If the team nationalites change in this file,
// you must update the team nationality in the level's csc file as well!
maps\mp\gametypes\_teamset_urbanspecops::level_init();
level thread rocket_arm_think();
level thread rocket_think();
level thread radar_dish_think();
level thread distant_rockets_think();
// spawn collision to prevent players from sneaking under a small area by the rocket
spawncollision("collision_wall_128x128x10","collider",(1558, -179, -362), (0, 225, 0));
// spawn collision to prevent players from sneaking inside 2 vents
spawncollision("collision_wall_128x128x10","collider",(-699, 1457, -60), (0, 270, 0));
spawncollision("collision_wall_128x128x10","collider",(-699, 1329, -60), (0, 270, 0));
// spawn collision to prevent players from strafe jumping onto pipes.
spawncollision("collision_geo_128x128x128","collider",(1408.5, 863, -126.5), (0, 0, 0));
spawncollision("collision_geo_128x128x128","collider",(1536.5, 863, -126.5), (0, 0, 0));
// spawn collision to prevent players from jumping up onto walls by the rocket
spawncollision("collision_wall_512x512x10","collider",(1224, -160, 240), (0, 0, 0));
spawncollision("collision_wall_512x512x10","collider",(1348, -160, 240), (0, 0, 0));
// Spawn collision to keep players from walking onto a small ledge of collision on the green girders.
spawncollision("collision_wall_128x128x10","collider",(1911, 1018, -82), (0, 270, 0));
// not sure if this is the best way to determine that the map has been trimmed down
if ( isSmallMapVersion() )
{
//spawning missile clip collision to catch grenades, rockets and crossbow bolts on the wager match boundary
spawncollision("collision_geo_mc_8x560x190","collider",(-393, 396.5, -72), (0, 270, 0));
spawncollision("collision_geo_mc_4x52x190","collider",(-358, 676.5, -74), (0, 0, 0));
spawncollision("collision_geo_mc_4x156x190","collider",(-328.5, 758, -74), (0, 270, 0));
}
// enable new spawning system
maps\mp\gametypes\_spawning::level_use_unified_spawning(true);
SetDvar( "scr_spawn_enemy_influencer_radius", 1700 );
SetDvar( "scr_spawn_dead_friend_influencer_radius", 1300 );
SetDvar( "scr_spawn_dead_friend_influencer_timeout_seconds", 10 );
SetDvar( "scr_spawn_dead_friend_influencer_count", 7 );
}
isSmallMapVersion()
{
if ( GetDvarInt( #"xblive_wagermatch" ) == 1 )
{
return true;
}
gametype = getDvar( #"g_gametype" );
if ( gametype == "oic" )
return true;
if ( gametype == "hlnd" )
return true;
if ( gametype == "shrp" )
return true;
if ( gametype == "gun" )
return true;
return false;
}
cosmodrome_intermission()
{
maps\mp\gametypes\_globallogic_defaults::default_onSpawnIntermission();
rocket_base = GetEnt( "cosmodrome_rocket_base", "script_noteworthy" );
if ( !IsDefined( rocket_base ) )
{
return;
}
if ( IsDefined( level.rocket_camera ) && level.rocket_camera == true )
{
lookat = Spawn( "script_model", rocket_base.origin + ( 0, 0, 1024 ) );
lookat SetModel( "tag_origin" );
lookat LinkTo( rocket_base );
self CameraSetPosition( self.origin );
self CameraSetLookAt( lookat );
self CameraActivate( true );
}
}
rocket_arm_think()
{
start_pitch = set_dvar_int_if_unset( "scr_rocket_arm_pitch", "90" );
rotate_time = set_dvar_int_if_unset( "scr_rocket_arm_rotate_secs", "30" );
wait_time = set_dvar_int_if_unset( "scr_rocket_arm_wait_secs", "5" );
arm_base = GetEnt( "cosmodrome_rocket_arm_base", "targetname" );
AssertEx( IsDefined( arm_base ), "Unable to find entity with targetname: 'cosmodrome_rocket_arm_base'" );
arm = GetEntArray( "cosmodrome_rocket_arm", "targetname" );
AssertEx( IsDefined( arm ), "Unable to find entity with targetname: 'cosmodrome_rocket_arm'" );
for ( i = 0; i < arm.size; i++ )
{
arm[i] LinkTo( arm_base );
}
if ( !IsDefined( arm_base.angles_target ) )
{
arm_base.angles_target = arm_base.angles;
}
arm_base.angles = ( start_pitch, arm_base.angles[1], arm_base.angles[2] );
//IPrintLnBold ("rocket is MOVING?");
wait ( wait_time );
//IPrintLnBold ("start arm sound");
arm_base playloopsound("evt_rocket_lp",.2);
arm_base PlaySound ("evt_rocket_start");
arm_base RotateTo( arm_base.angles_target, rotate_time );
wait(rotate_time);
arm_base stoploopsound(.3);
arm_base PlaySound ("evt_rocket_end");
// IPrintLnBold (rotate_time);
// stop loppsound with fade
// play oneshot attach
// stop loop sound
}
rocket_prelaunch( rocket_base )
{
//this will play vo for countdown and delay the launch by 10 seconds
snd_countdown ();
// move the claw arms away from the rocket
claw_r = GetEntArray("claw_r", "targetname");
claw_l = GetEntArray("claw_l", "targetname");
claw_arm_r = GetEntArray("claw_arm_r", "targetname");
claw_arm_l = GetEntArray("claw_arm_l", "targetname");
mover_r = GetEnt("claw_r_mover", "targetname");
mover_l = GetEnt("claw_l_mover", "targetname");
move_here_r = GetEnt("claw_r_move_here", "targetname");
move_here_l = GetEnt("claw_l_move_here", "targetname");
for(i = 0 ; i < claw_r.size; i++)
{
claw_r[i] LinkTo(mover_r);
}
for(i = 0 ; i < claw_l.size; i++)
{
claw_l[i] LinkTo(mover_l);
}
mover_r MoveTo(move_here_r.origin, 3.0);
mover_l MoveTo(move_here_l.origin, 3.0);
// play sound on the arms
thread snd_rocket_gantry ( mover_r, mover_l);
wait(4.0);
for(i = 0; i < claw_r.size; i++)
{
claw_r[i] Unlink();
claw_r[i] LinkTo(move_here_r);
}
for(i = 0; i < claw_l.size; i++)
{
claw_l[i] Unlink();
claw_l[i] LinkTo(move_here_l);
}
for(i = 0; i < claw_arm_r.size; i++)
{
claw_arm_r[i] LinkTo(move_here_r);
}
for(i = 0; i < claw_arm_l.size; i++)
{
claw_arm_l[i] LinkTo(move_here_l);
}
move_here_r RotateYaw(75, 3.0);
move_here_l RotateYaw(-75, 3.0);
// wait to launch
rocket_base playsound ("evt_cosmo_launch");
playsoundatposition("evt_cosmo_air_distf",(0,0,0));
playsoundatposition("evt_cosmo_air_distr",(0,0,0));
wait(5);
}
Rocket_Think()
{
level.const_fx_exploder_rocket_coolant = 2;
level.rocket_camera = false;
flag_init( "rocket_launch_grenade_detonate" );
rocket = GetEntArray( "cosmodrome_rocket", "targetname" );
AssertEx( IsDefined( rocket ), "Unable to find entity with targetname: 'cosmodrome_rocket'" );
array_thread( rocket, ::rocket_sticky_grenade_think );
rocket_base = GetEnt( "cosmodrome_rocket_base", "script_noteworthy" );
AssertEx( IsDefined( rocket_base ), "Unable to find entity with script_noteworthy: 'cosmodrome_rocket_base'" );
level.rocket_base = rocket_base;
rocket_damage_triggers = GetEntArray( "cosmodrome_rocket_damage_trigger", "targetname" );
rocket_collision = GetEntArray( "rocket_collision", "targetname" );
killCamEnt = spawn( "script_model", rocket_base.origin );
rocket_base.killCamEnt = killCamEnt;
killCamEnt.startTime = gettime();
killCamEnt linkTo( rocket_base, "tag_origin", (50,0,-1000), ( 0,0,0 ) );
rocket_timer_init();
wait( 3 );
exploder( level.const_fx_exploder_rocket_coolant );
event = level waittill_any_return( "rocket_launch", "rocket_launch_skip_prelaunch" );
if ( event == "rocket_launch" )
{
rocket_prelaunch( rocket_base );
}
level.rocket_camera = true;
// pre-launch fx
earthquake_origin = rocket_base GetTagOrigin( "tag_engine" );
earthquake( .25, 4, earthquake_origin, 4096 );
//play 3d launch aounds on rocket_base, and 2 st 2d sounds
wait( 3.5 );
flag_set( "rocket_launch_grenade_detonate" );
// launch fx
earthquake( .35, 15, earthquake_origin, 4096 );
array_thread( rocket_damage_triggers, ::rocket_damage_think );
array_thread( rocket_damage_triggers, ::destroy_greandes_in_trigger );
rocket_base SetClientFlag( level.const_flag_rocket_fx );
exploder_stop( level.const_fx_exploder_rocket_coolant );
// move pieces
array_thread( rocket, ::rocket_move );
// stop damage
wait( 6 );
level notify( "rocket_damage_stop" );
wait( 2 );
level.rocket_camera = false;
for ( i = 0; i < rocket_damage_triggers.size; i++ )
{
rocket_damage_triggers[i] delete();
}
for ( i = 0; i < rocket_collision.size; i++ )
{
rocket_collision[i] delete();
}
}
snd_rocket_gantry ( orignr, originl)
{
orignr playsound ("evt_gantry_disengage");
orignr playsound ("evt_rocket_start");
// originl playsound ("evt_rocket_start");
}
snd_countdown()
{
//wait 2;
countdownl = spawn("script_origin", (480, -1256, 224));
countdownr = spawn("script_origin", (152, 1488, 224));
clientnotify ( "snd_rocket_launch" );
if( IsDefined(countdownl)&& IsDefined(countdownr) )
{
countdownl playsound( "vox_mp_com_1a_rua1" );
wait .112;
countdownr playsound( "vox_mp_com_1a_rua1" );
wait 16.5;
thread snd_launch ();
}
}
snd_launch ()
{
countdownl = spawn("script_origin", (480, -1256, 224));
countdownr = spawn("script_origin", (152, 1488, 224));
wait 2;
countdownl playsound( "vox_mp_com_2a_rua1" );
wait .112;
countdownr playsound( "vox_mp_com_2a_rua1" );
}
rocket_sticky_grenade_think()
{
self endon( "death" );
for ( ;; )
{
self waittill( "grenade_stuck", grenade_ent );
grenade_ent thread sticky_grenade_think();
}
}
sticky_grenade_think()
{
self endon( "death" );
level endon( "rocket_damage_stop" );
flag_wait( "rocket_launch_grenade_detonate" );
wait( 0.05 );
self Detonate();
}
//Self is the trigger. This loops to make sure any grenade or claymore that's touching the damage trigger explodes.
destroy_greandes_in_trigger()
{
self endon( "death" );
level endon( "rocket_damage_stop" );
flag_wait( "rocket_launch_grenade_detonate" );
for( ;; )
{
grenades = GetEntArray( "grenade", "classname" );
for ( i = 0; i < grenades.size; i++ )
{
if( grenades[i] IsTouching( self ))
{
grenades[i] Detonate();
}
}
wait 1;
}
}
rocket_timer_init()
{
level waittill( "prematch_over" );
event = set_dvar_if_unset( "scr_rocket_event", "end" );
trigger1 = set_dvar_int_if_unset( "scr_rocket_event_trigger1", "0" );
trigger2 = set_dvar_int_if_unset( "scr_rocket_event_trigger2", "0" );
if ( rocket_launch_abort() )
{
return;
}
switch ( event )
{
case "end":
add_timed_event( 0, "rocket_launch" );
add_score_event( level.scorelimit, "rocket_launch" );
// AE 11-2-09: putting in the distant rocket timing
add_score_event( int(level.scorelimit * 0.5), "distant_rocket_launch" );
break;
case "time":
assert( trigger1 >= 0 );
add_timed_event( trigger1, "rocket_launch" );
// AE 11-2-09: putting in the distant rocket timing
add_timed_event( int(trigger1 * 0.5), "distant_rocket_launch" );
break;
case "percent":
assert( trigger1 >= 0 );
assert( trigger1 <= 100 );
minutes = ( trigger1 * 0.01 ) * level.timelimit;
add_timed_event( minutes * 60, "rocket_launch" );
// AE 11-2-09: putting in the distant rocket timing
add_timed_event( int(minutes * 60 * 0.5), "distant_rocket_launch" );
score = ( trigger1 * 0.01 ) * level.scorelimit;
add_score_event( score, "rocket_launch" );
// AE 11-2-09: putting in the distant rocket timing
add_score_event( int(score * 0.5), "distant_rocket_launch" );
break;
case "random_time":
assert( trigger1 >= 0 );
assert( trigger2 >= 0 );
assert( trigger1 < trigger2 );
time = RandomIntRange( trigger1, trigger2 + 1 );
add_timed_event( trigger1, "rocket_launch" );
// AE 11-2-09: putting in the distant rocket timing
add_timed_event( int(trigger1 * 0.5), "distant_rocket_launch" );
break;
case "random_percent":
assert( trigger1 >= 0 );
assert( trigger1 <= 100 );
assert( trigger2 >= 0 );
assert( trigger2 <= 100 );
assert( trigger1 < trigger2 );
percent = RandomIntRange( trigger1, trigger2 + 1 );
minutes = ( percent * 0.01 ) * level.timelimit;
add_timed_event( minutes * 60, "rocket_launch" );
// AE 11-2-09: putting in the distant rocket timing
add_timed_event( int(minutes * 60 * 0.5), "distant_rocket_launch" );
percent = RandomIntRange( trigger1, trigger2 + 1 );
score = ( percent * 0.01 ) * level.scorelimit;
add_score_event( score, "rocket_launch" );
// AE 11-2-09: putting in the distant rocket timing
add_score_event( int(score * 0.5), "distant_rocket_launch" );
break;
default:
error( "Unknown event type: '" + event + "' used in dvar 'scr_rocket_event'" );
break;
}
}
rocket_launch_abort()
{
launch_abort = set_dvar_int_if_unset( "scr_rocket_event_off", "0" );
assert( launch_abort >= 0 );
assert( launch_abort <= 100 );
if ( RandomInt( 101 ) < launch_abort )
{
return true;
}
return false;
}
rocket_move()
{
self MoveTo( self.origin + ( 0, 0, 50000 ), 50, 45 );
self waittill( "movedone" );
self delete();
}
rocket_damage_think()
{
level endon( "rocket_damage_stop" );
damage_interval_secs = 1;
assert( self.classname == "trigger_radius" );
/#
if ( set_dvar_int_if_unset( "scr_rocket_debug", "0" ) != 0 )
{
drawcylinder( self.origin, self.radius, self.height, undefined, "rocket_damage_stop" );
}
#/
for( ;; )
{
self waittill( "trigger", ent );
if(IsPlayer(ent))
{
player = ent;
if ( player.sessionstate != "playing" )
{
continue;
}
if ( !IsDefined( player.rocket_damage_time ) )
{
player.rocket_damage_time = GetTime();
}
if ( player.rocket_damage_time > GetTime() )
{
continue;
}
player shellshock( "tabun_gas_mp", damage_interval_secs );
player.rocket_damage_time = GetTime() + ( damage_interval_secs * 1000 );
player DoDamage( RandomIntRange( 40, 60 ), self.origin, self, level.rocket_base, 0, "MOD_SUICIDE" );
}
//This kill dogs in the radius trigger
else if ( IsAI( ent ))
{
ent DoDamage( ent.health * 2, ent.origin);
}
//This kills RC bombs in the radius trigger
else if(IsDefined( ent.targetname ) && ent.targetname == "rcbomb" )
{
//Destroy RC bomb
ent maps\mp\_rcbomb::rcbomb_force_explode();
}
}
}
radar_dish_think()
{
radar_dish = GetEnt( "cosmodrome_radar_dish", "targetname" );
AssertEx( IsDefined( radar_dish ), "Unable to find entity with targetname: 'cosmodrome_radar_dish'" );
for ( ;; )
{
rotate_time = set_dvar_int_if_unset( "scr_radar_dish_rotate_secs", "30" );
if ( rotate_time <= 0 )
{
return;
}
radar_dish RotateYaw( 360, rotate_time );
radar_dish waittill( "rotatedone" );
}
}
devgui_cosmodrome( cmd )
{
for ( ;; )
{
wait( 0.5 );
devgui_string = GetDvar( #"devgui_notify" );
switch( devgui_string )
{
case "":
break;
case "rocket_arm":
SetDvar( "scr_rocket_arm_wait_secs", "0" );
level thread rocket_arm_think();
break;
default:
level notify( devgui_string );
break;
}
SetDvar( "devgui_notify", "" );
}
}
distant_rockets_think()
{
// have the rockets in the distance going off
distant_rocket = GetEntArray( "distant_rocket", "targetname" );
AssertEx( IsDefined( distant_rocket ), "Unable to find entity with targetname: 'distant_rocket'" );
distant_rocket_gantry1 = GetEntArray("distant_rocket_gantry1", "targetname");
AssertEx( IsDefined( distant_rocket_gantry1 ), "Unable to find entity with targetname: 'distant_rocket_gantry1'" );
distant_rocket_gantry2 = GetEntArray("distant_rocket_gantry2", "targetname");
AssertEx( IsDefined( distant_rocket_gantry2 ), "Unable to find entity with targetname: 'distant_rocket_gantry2'" );
distant_rocket_arm1 = GetEntArray( "distant_rocket_arm1", "targetname" );
AssertEx( IsDefined( distant_rocket_arm1 ), "Unable to find entity with targetname: 'distant_rocket_arm1'" );
distant_rocket_arm2 = GetEntArray( "distant_rocket_arm2", "targetname" );
AssertEx( IsDefined( distant_rocket_arm2 ), "Unable to find entity with targetname: 'distant_rocket_arm2'" );
distant_rocket_arm3 = GetEntArray( "distant_rocket_arm3", "targetname" );
AssertEx( IsDefined( distant_rocket_arm3 ), "Unable to find entity with targetname: 'distant_rocket_arm3'" );
distant_rocket_arm4 = GetEntArray( "distant_rocket_arm4", "targetname" );
AssertEx( IsDefined( distant_rocket_arm4 ), "Unable to find entity with targetname: 'distant_rocket_arm4'" );
distant_rocket_engine = GetEnt( "distant_rocket_engine", "script_noteworthy" );
AssertEx( IsDefined( distant_rocket_engine ), "Unable to find entity with script_noteworthy: 'distant_rocket_engine'" );
distant_rocket_engine SetModel("tag_origin");
distant_rocket_engine.angles = (-90, 0, 0);
wait( 3 );
level waittill( "distant_rocket_launch" );
// splay sound on the gantry
thread snd_distant_gantry (distant_rocket_engine, distant_rocket_engine);
// play sound for arms
thread snd_distant_rocket_arm (distant_rocket_engine);
// move the gantry away from the rocket
array_thread( distant_rocket_gantry1, ::distant_rocket_gantry1_move );
array_thread( distant_rocket_gantry2, ::distant_rocket_gantry2_move );
wait(10);
// move the arms away from the rocket
array_thread( distant_rocket_arm1, ::distant_rocket_arm1_move );
array_thread( distant_rocket_arm2, ::distant_rocket_arm2_move );
array_thread( distant_rocket_arm3, ::distant_rocket_arm3_move );
array_thread( distant_rocket_arm4, ::distant_rocket_arm4_move );
// wait to launch
wait(8);
// pre-launch fx
// TODO: small earthquakes??
//earthquake_origin = rocket_base GetTagOrigin( "tag_engine" );
//earthquake( .25, 4, earthquake_origin, 4096 );
// play 3d launch aounds on distant_rocket_engine, and 2 st 2d sounds
distant_rocket_engine playsound ("evt_dist_cosmo_launch");
//playsoundatposition("evt_dist_cosmo_air_distf",(0,0,0));
distant_rocket_engine playsound ("evt_dist_cosmo_air_distf");
wait( 3.5 );
// launch fx
//earthquake( .35, 15, earthquake_origin, 4096 );
playfxontag( level._effect["rocket_blast_trail"], distant_rocket_engine, "tag_origin" );
// move pieces
array_thread( distant_rocket, ::rocket_move );
}
distant_rocket_gantry1_move() // self == distant_rocket_gantry
{
self RotatePitch(-45, 10.0);
self waittill("rotatedone");
}
distant_rocket_gantry2_move() // self == distant_rocket_gantry
{
self RotatePitch(45, 10.0);
self waittill("rotatedone");
}
distant_rocket_arm1_move() // self == distant_rocket_arm
{
self RotatePitch(-45, 6.0);
self waittill("rotatedone");
}
distant_rocket_arm2_move() // self == distant_rocket_arm
{
self RotateRoll(-45, 6.0);
self waittill("rotatedone");
}
distant_rocket_arm3_move() // self == distant_rocket_arm
{
self RotatePitch(45, 6.0);
self waittill("rotatedone");
}
distant_rocket_arm4_move() // self == distant_rocket_arm
{
self RotateRoll(45, 6.0);
self waittill("rotatedone");
}
snd_distant_rocket_arm ( distant_rocket_engine )
{
//IPrintLnBold ("this is in the distant rocket arm section - snd_distant_rocket_arm");
distant_rocket_engine playloopsound ("evt_dist_rocket_lp", .5);
distant_rocket_engine PlaySound ("evt_dist_rocket_start");
//self waittill("rotatedone");
wait (16);
distant_rocket_engine stoploopsound(.3);
distant_rocket_engine PlaySound ("evt_dist_rocket_end");
}
snd_distant_gantry ( orignr, originl)
{
//IPrintLnBold ("this is playing dist rocket start");
orignr playsound ("evt_dist_gantry_disengage");
orignr playsound ("evt_dist_rocket_start");
}