2021-02-18 13:53:14 -06:00

405 lines
10 KiB
Plaintext

#include maps\mp\_utility;
#include common_scripts\utility;
main()
{
//needs to be first for create fx
maps\mp\mp_nuked_fx::main();
precachemodel("collision_wall_128x128x10");
// move a dom spawn that is sharing space with one of the mannequins
move_spawn_point( "mp_dom_spawn", (791, 449, -20), ( 779, 445, -20 ) );
maps\mp\_load::main();
maps\mp\mp_nuked_amb::main();
maps\mp\_compass::setupMiniMap("compass_map_mp_nuked");
level.onSpawnIntermission = ::nuked_intermission;
/#
level thread devgui_nuked();
execdevgui( "devgui_mp_nuked" );
#/
// 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();
// Set up the default range of the compass
setdvar("compassmaxrange","2100");
// Set up some generic War Flag Names.
// Example from COD5: CALLSIGN_SEELOW_A is the name of the 1st flag in Selow whose string is "Cottage"
// The string must have MPUI_CALLSIGN_ and _A. Replace Mapname with the name of your map/bsp and in the
// actual string enter a keyword that names the location (Roundhouse, Missle Silo, Launchpad, Guard Tower, etc)
game["strings"]["war_callsign_a"] = &"MPUI_CALLSIGN_MAPNAME_A";
game["strings"]["war_callsign_b"] = &"MPUI_CALLSIGN_MAPNAME_B";
game["strings"]["war_callsign_c"] = &"MPUI_CALLSIGN_MAPNAME_C";
game["strings"]["war_callsign_d"] = &"MPUI_CALLSIGN_MAPNAME_D";
game["strings"]["war_callsign_e"] = &"MPUI_CALLSIGN_MAPNAME_E";
game["strings_menu"]["war_callsign_a"] = "@MPUI_CALLSIGN_MAPNAME_A";
game["strings_menu"]["war_callsign_b"] = "@MPUI_CALLSIGN_MAPNAME_B";
game["strings_menu"]["war_callsign_c"] = "@MPUI_CALLSIGN_MAPNAME_C";
game["strings_menu"]["war_callsign_d"] = "@MPUI_CALLSIGN_MAPNAME_D";
game["strings_menu"]["war_callsign_e"] = "@MPUI_CALLSIGN_MAPNAME_E";
// enable new spawning system
maps\mp\gametypes\_spawning::level_use_unified_spawning(true);
SetDvar( "scr_spawn_enemy_influencer_radius", 1600 );
SetDvar( "scr_spawn_dead_friend_influencer_radius", 1300 );
SetDvar( "scr_spawn_dead_friend_influencer_timeout_seconds", 8 );
SetDvar( "scr_spawn_dead_friend_influencer_count", 7 );
//spawn collision in yellow house to prevent players from jump-crouching into a door.
spawncollision("collision_wall_128x128x10","collider",(769.2, 329.3, 143), (0, 290.6, 0));
spawncollision("collision_wall_128x128x10","collider",(769.2, 329.3, 271), (0, 290.6, 0));
level.const_fx_exploder_end_game_glass_shatter = 5001;
level.disableOutroVisionSet = true;
level thread nuked_mannequin_init();
nuked_doomsday_clock_init();
level thread maps\mp\mp_nuked_platform::main();
level thread nuked_population_sign_think();
level thread nuked_bomb_drop_think();
/#
level thread nuked_bomb_drop_dev();
#/
}
move_spawn_point( targetname, start_point, new_point )
{
spawn_points = getentarray( targetname, "classname" );
for ( i = 0; i < spawn_points.size; i++ )
{
if ( distancesquared( spawn_points[i].origin, start_point ) < 1 )
{
spawn_points[i].origin = new_point;
return;
}
}
}
nuked_mannequin_init()
{
keep_count = 28;
level.mannequin_count = 0;
destructibles = GetEntArray( "destructible", "targetname" );
mannequins = nuked_mannequin_filter( destructibles );
if ( mannequins.size <= 0 )
{
return;
}
remove_count = mannequins.size - keep_count;
remove_count = clamp( remove_count, 0, remove_count );
mannequins = array_randomize( mannequins );
for ( i = 0; i < remove_count; i++ )
{
assert( IsDefined( mannequins[i].target ) );
collision = GetEnt( mannequins[i].target, "targetname" );
assert( IsDefined( collision ) );
collision delete();
mannequins[i] delete();
level.mannequin_count--;
}
level waittill( "prematch_over" );
level.mannequin_time = GetTime();
}
nuked_mannequin_filter( destructibles )
{
mannequins = [];
for ( i = 0; i < destructibles.size; i++ )
{
destructible = destructibles[i];
if ( IsSubStr( destructible.destructibledef, "male" ) )
{
mannequins[ mannequins.size ] = destructible;
level.mannequin_count++;
}
}
return mannequins;
}
nuked_intermission()
{
maps\mp\gametypes\_globallogic_defaults::default_onSpawnIntermission();
if ( wasLastRound() )
{
level notify( "bomb_drop" );
}
}
nuked_bomb_drop_think()
{
cameraStart = GetStruct( "endgame_camera_start", "targetname" );
cameraEnd = GetStruct( cameraStart.target, "targetname" );
bomb = GetEnt( "nuked_bomb", "targetname" );
for ( ;; )
{
camera = Spawn( "script_model", cameraStart.origin );
camera.angles = cameraStart.angles;
camera SetModel( "tag_origin" );
level waittill( "bomb_drop" );
if( level.finalkillcam && IsDefined(level.lastKillCam ) )
{
wait( 0.1 );
while( level.inFinalKillcam )
{
wait( 0.1 );
}
}
for ( i = 0; i < get_players().size; i++ )
{
player = get_players()[i];
player CameraSetPosition( camera );
player CameraSetLookAt();
player CameraActivate( true );
}
cam_move_time = set_dvar_float_if_unset( "scr_cam_move_time", "2.5" );
bomb_explode_delay = set_dvar_float_if_unset( "scr_bomb_explode_delay", "1.5" );
glass_break_delay = set_dvar_float_if_unset( "scr_glass_break_delay", "0.5" );
//white_out_delay = set_dvar_float_if_unset( "scr_white_out_delay", "1.0" );
camera MoveTo( cameraEnd.origin, cam_move_time, 0, 0 );
camera RotateTo( cameraEnd.angles, cam_move_time, 0, 0 );
bomb playSound ("amb_end_nuke");
dest = ( bomb.origin[0], bomb.origin[1], bomb.origin[2] - 3700 );
time = set_dvar_float_if_unset( "scr_bomb_time", "1.5" );
accel_time = set_dvar_float_if_unset( "scr_bomb_accel_time", ".75" );
bomb MoveTo( dest, time, accel_time, 0 );
wait( bomb_explode_delay );
playfx ( level._effect["fx_mp_nuked_nuclear_explosion"], bomb.origin);
wait( glass_break_delay );
level thread waitForGlassBreak();
cameraForward = anglestoforward( cameraEnd.angles );
explodePoint = cameraEnd.origin + 20*cameraForward;
//black = ( 0.2, 0.2, 0.2 );
//debugstar(explodePoint, 2 * 1000, black);
physicsExplosionSphere( explodePoint, 128, 128, 1 );
RadiusDamage( explodePoint, 128, 128, 128 );
//wait( white_out_delay );
camera thread vibrate();
//PrintLn( "SND NUKE play" );
//VisionSetNaked( "flash_grenade", .4 );
/#
//bomb waittill( "movedone" );
wait( 3.5 - glass_break_delay );
level notify( "bomb_reset" );
camera delete();
#/
}
}
vibrate()
{
self endon( "death" );
pitchVibrateAmplitude = 1;
vibrateAmplitude = 2;
vibrateTime = 0.05;
originalAngles = self.angles;
angles0 = ( originalAngles[0], originalAngles[1], originalAngles[2] - vibrateAmplitude );
angles1 = ( originalAngles[0], originalAngles[1], originalAngles[2] + vibrateAmplitude );
for(;;)
{
angles0 = ( originalAngles[0] - pitchVibrateAmplitude , originalAngles[1], originalAngles[2] - vibrateAmplitude );
angles1 = ( originalAngles[0] + pitchVibrateAmplitude, originalAngles[1], originalAngles[2] + vibrateAmplitude );
self RotateTo(angles0, vibrateTime );
self waittill( "rotatedone" );
self RotateTo(angles1, vibrateTime );
self waittill( "rotatedone" );
if ( vibrateAmplitude > 0 )
vibrateAmplitude -= 0.25;
pitchVibrateAmplitude = 0 - pitchVibrateAmplitude;
pitchVibrateAmplitude *= 0.66;
}
}
waitForGlassBreak()
{
level endon( "bomb_reset" );
level waittill( "glass_smash", origin );
exploder( level.const_fx_exploder_end_game_glass_shatter );
}
nuked_population_sign_think()
{
tens_model = GetEnt( "counter_tens", "targetname" );
ones_model = GetEnt( "counter_ones", "targetname" );
step = ( 360 / 10 ); // 10 digits (0-9) on the dial
// put the dials at 0
ones = 0;
tens = 0;
tens_model RotateRoll( step, 0.05 );
ones_model RotateRoll( step, 0.05 );
for ( ;; )
{
wait( 1 );
for ( ;; )
{
num_players = get_players().size;
dial = ones + ( tens * 10 );
if ( num_players < dial )
{
ones--;
time = set_dvar_float_if_unset( "scr_dial_rotate_time", "0.5" );
if ( ones < 0 )
{
ones = 9;
tens_model RotateRoll( 0 - step, time );
tens--;
}
ones_model RotateRoll( 0 - step, time );
ones_model waittill( "rotatedone" );
}
else if ( num_players > dial )
{
ones++;
time = set_dvar_float_if_unset( "scr_dial_rotate_time", "0.5" );
if ( ones > 9 )
{
ones = 0;
tens_model RotateRoll( step, time );
tens++;
}
ones_model RotateRoll( step, time );
ones_model waittill( "rotatedone" );
}
else
{
break;
}
}
}
}
nuked_doomsday_clock_init()
{
min_hand_model = GetEnt( "clock_min_hand", "targetname" );
sec_hand_model = GetEnt( "clock_sec_hand", "targetname" );
start_angle = 318;
min_hand_model RotatePitch( start_angle, 0.05 );
min_hand_model waittill( "rotatedone" );
if ( level.timelimit > 0 )
{
min_hand_model RotatePitch( 360 - start_angle, level.timelimit * 60 );
sec_hand_model RotatePitch( 360 * level.timelimit, level.timelimit * 60 );
}
else
{
sec_hand_model thread nuked_doomsday_clock_seconds_think();
}
}
nuked_doomsday_clock_seconds_think()
{
for ( ;; )
{
self RotatePitch( 360, 60 );
self waittill( "rotatedone" );
}
}
/#
nuked_bomb_drop_dev()
{
bomb = GetEnt( "nuked_bomb", "targetname" );
bomb_origin = bomb.origin;
for ( ;; )
{
level waittill( "bomb_reset" );
bomb.origin = bomb_origin;
player = getHostPlayer();
player CameraActivate( false );
VisionSetNaked( "mp_nuked", 0 );
}
}
devgui_nuked( cmd )
{
for ( ;; )
{
wait( 0.5 );
devgui_string = GetDvar( #"devgui_notify" );
switch( devgui_string )
{
case "":
break;
case "warp_to_bomb":
player = getHostPlayer();
AddDebugCommand( "noclip" );
player SetOrigin( ( 3969, 8094, 1052 ) );
player SetPlayerAngles( ( -19, 94, 0 ) );
break;
default:
level notify( devgui_string );
break;
}
SetDvar( "devgui_notify", "" );
}
}
#/