291 lines
6.9 KiB
Plaintext
291 lines
6.9 KiB
Plaintext
#include common_scripts\utility;
|
|
#include maps\mp\_utility;
|
|
|
|
// the nuke ended the game in MW2, for MW3 it will be an MOAB, not end the game but kill the other team and emp them for 60 seconds, it will also change the visionset for the level
|
|
|
|
init()
|
|
{
|
|
level.nukeVisionSet = "alien_nuke";
|
|
level.nukeVisionSetFailed = "alien_nuke_blast";
|
|
|
|
if ( level.script == "mp_alien_last" )
|
|
{
|
|
level._effect[ "nuke_flash" ] = loadfx( "vfx/moments/alien/player_nuke_flash_alien_last" );
|
|
}
|
|
else
|
|
{
|
|
level._effect[ "nuke_flash" ] = loadfx( "fx/explosions/player_death_nuke_flash_alien" );
|
|
}
|
|
|
|
SetDvarIfUninitialized( "scr_nukeTimer", 10 );
|
|
SetDvarIfUninitialized( "scr_nukeCancelMode", 0 );
|
|
|
|
level.nukeTimer = getDvarInt( "scr_nukeTimer" );
|
|
level.cancelMode = getDvarInt( "scr_nukeCancelMode" );
|
|
|
|
level.nukeInfo = spawnStruct();
|
|
level.nukeInfo.xpScalar = 2;
|
|
level.nukeDetonated = undefined;
|
|
|
|
level thread onPlayerConnect();
|
|
}
|
|
|
|
delaythread_nuke( delay, func )
|
|
{
|
|
level endon ( "nuke_cancelled" );
|
|
|
|
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( delay );
|
|
|
|
thread [[ func ]]();
|
|
}
|
|
|
|
// used in aliens mode
|
|
doNukeSimple()
|
|
{
|
|
level.nukeInfo.player = self;
|
|
level.nukeInfo.team = self.pers["team"];
|
|
level.nukeIncoming = true;
|
|
|
|
level thread delaythread_nuke( (level.nukeTimer - 3.3), ::nukeSoundIncoming );
|
|
level thread delaythread_nuke( level.nukeTimer, ::nukeSoundExplosion );
|
|
level thread delaythread_nuke( level.nukeTimer, ::nukeSlowMo );
|
|
level thread delaythread_nuke( level.nukeTimer, ::nukeEffects );
|
|
level thread delaythread_nuke( (level.nukeTimer + 0.25), ::nukeVision );
|
|
level thread delaythread_nuke( (level.nukeTimer + 1.5), ::nukeDeath );
|
|
//level thread delaythread_nuke( (level.nukeTimer + 1.5), ::nukeEarthquake );
|
|
|
|
// need objects to play sound off of, i'm keeping them on level so we don't spawn them more than once if multiple nukes get called in a match
|
|
if( !IsDefined( level.nuke_soundObject ) )
|
|
{
|
|
level.nuke_soundObject = Spawn( "script_origin", (0,0,1) );
|
|
level.nuke_soundObject hide();
|
|
}
|
|
}
|
|
|
|
nukeDeath()
|
|
{
|
|
level notify( "nuke_death" );
|
|
}
|
|
|
|
nukeSoundIncoming()
|
|
{
|
|
level endon ( "nuke_cancelled" );
|
|
|
|
if( IsDefined( level.nuke_soundObject ) )
|
|
level.nuke_soundObject PlaySound( "nuke_incoming" );
|
|
}
|
|
|
|
nukeSoundExplosion()
|
|
{
|
|
level endon ( "nuke_cancelled" );
|
|
|
|
if( IsDefined( level.nuke_soundObject ) )
|
|
{
|
|
level.nuke_soundObject PlaySound( "nuke_explosion" );
|
|
level.nuke_soundObject PlaySound( "nuke_wave" );
|
|
}
|
|
}
|
|
|
|
nukeEffects()
|
|
{
|
|
level endon ( "nuke_cancelled" );
|
|
|
|
level.nukeDetonated = true;
|
|
|
|
foreach( player in level.players )
|
|
{
|
|
playerForward = anglestoforward( player.angles );
|
|
playerForward = ( playerForward[0], playerForward[1], 0 );
|
|
playerForward = VectorNormalize( playerForward );
|
|
|
|
nukeDistance = 5000;
|
|
|
|
nukeLoc = player.origin + ( playerForward * nukeDistance );
|
|
// nuke location override: from aliens
|
|
if ( isdefined( level.nukeLoc ) )
|
|
nukeLoc = level.nukeLoc;
|
|
|
|
nukeAngles = ( 0, (player.angles[1] + 180), 90 );
|
|
// nuke angle override: from aliens
|
|
if ( IsDefined( level.nukeAngles ) )
|
|
nukeAngles = level.nukeAngles;
|
|
|
|
nukeEnt = Spawn( "script_model", nukeLoc );
|
|
nukeEnt setModel( "tag_origin" );
|
|
nukeEnt.angles = nukeAngles;
|
|
|
|
nukeEnt thread nukeEffect( player );
|
|
}
|
|
}
|
|
|
|
nukeEffect( player )
|
|
{
|
|
level endon ( "nuke_cancelled" );
|
|
|
|
player endon( "disconnect" );
|
|
|
|
waitframe();
|
|
PlayFXOnTagForClients( level._effect[ "nuke_flash" ], self, "tag_origin", player );
|
|
}
|
|
|
|
nukeSlowMo()
|
|
{
|
|
level endon ( "nuke_cancelled" );
|
|
|
|
//SetSlowMotion( <startTimescale>, <endTimescale>, <deltaTime> )
|
|
SetSlowMotion( 1.0, 0.25, 0.5 );
|
|
level waittill( "nuke_death" );
|
|
SetSlowMotion( 0.25, 1, 2.0 );
|
|
}
|
|
|
|
nukeVision()
|
|
{
|
|
level endon ( "nuke_cancelled" );
|
|
|
|
level.nukeVisionInProgress = true;
|
|
|
|
// level waittill( "nuke_death" );
|
|
|
|
transition_time = 0.75;
|
|
foreach ( player in level.players )
|
|
{
|
|
// if spectating player is spectating someone who escaped
|
|
if ( isdefined( player.sessionstate ) && player.sessionstate == "spectator" )
|
|
{
|
|
spectated_player = player GetSpectatingPlayer();
|
|
if ( isdefined( spectated_player ) )
|
|
{
|
|
// go with what spectated player is using
|
|
if ( ( isdefined( spectated_player.nuke_escaped ) && spectated_player.nuke_escaped ) )
|
|
player set_vision_for_nuke_escaped( transition_time );
|
|
else
|
|
player set_vision_for_nuke_failed( transition_time );
|
|
}
|
|
else
|
|
{
|
|
// use failed vision if player isnt spectating anyone, meaning he could be looking at nuke from bad angle
|
|
player set_vision_for_nuke_failed( transition_time );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( ( isdefined( player.nuke_escaped ) && player.nuke_escaped ) )
|
|
player set_vision_for_nuke_escaped( transition_time );
|
|
else
|
|
player set_vision_for_nuke_failed( transition_time );
|
|
}
|
|
}
|
|
|
|
fog_nuke(transition_time);
|
|
// restore_fog( 0 );
|
|
// VisionSetPain( level.nukeVisionSet );
|
|
}
|
|
|
|
// Julian - Kyle, you may use the following functions to replace vision change with your fx
|
|
set_vision_for_nuke_escaped( transition_time )
|
|
{
|
|
self VisionSetNakedForPlayer( level.nukeVisionSet, transition_time );
|
|
self VisionSetPainForPlayer( level.nukeVisionSet );
|
|
}
|
|
|
|
set_vision_for_nuke_failed( transition_time )
|
|
{
|
|
PlayFXOnTagForClients( level._effect[ "vfx/moments/alien/nuke_fail_screen_flash" ], self, "tag_eye",self);
|
|
self VisionSetNakedForPlayer( level.nukeVisionSetFailed, transition_time );
|
|
self VisionSetPainForPlayer( level.nukeVisionSetFailed );
|
|
}
|
|
|
|
|
|
fog_nuke(transition_time)
|
|
{
|
|
if ( !isdefined( level.nuke_fog_setting ) )
|
|
return;
|
|
|
|
ent = level.nuke_fog_setting;
|
|
|
|
SetExpFog(
|
|
ent.startDist,
|
|
ent.halfwayDist,
|
|
ent.red,
|
|
ent.green,
|
|
ent.blue,
|
|
ent.HDRColorIntensity,
|
|
ent.maxOpacity,
|
|
transition_time,
|
|
ent.sunRed,
|
|
ent.sunGreen,
|
|
ent.sunBlue,
|
|
ent.HDRSunColorIntensity,
|
|
ent.sunDir,
|
|
ent.sunBeginFadeAngle,
|
|
ent.sunEndFadeAngle,
|
|
ent.normalFogScale,
|
|
ent.skyFogIntensity,
|
|
ent.skyFogMinAngle,
|
|
ent.skyFogMaxAngle );
|
|
}
|
|
|
|
restore_fog( transition_time )
|
|
{
|
|
if ( !isdefined( level.restore_fog_setting ) )
|
|
return;
|
|
|
|
ent = level.restore_fog_setting;
|
|
|
|
SetExpFog(
|
|
ent.startDist,
|
|
ent.halfwayDist,
|
|
ent.red,
|
|
ent.green,
|
|
ent.blue,
|
|
ent.HDRColorIntensity,
|
|
ent.maxOpacity,
|
|
transition_time,
|
|
ent.sunRed,
|
|
ent.sunGreen,
|
|
ent.sunBlue,
|
|
ent.HDRSunColorIntensity,
|
|
ent.sunDir,
|
|
ent.sunBeginFadeAngle,
|
|
ent.sunEndFadeAngle,
|
|
ent.normalFogScale,
|
|
ent.skyFogIntensity,
|
|
ent.skyFogMinAngle,
|
|
ent.skyFogMaxAngle );
|
|
}
|
|
|
|
nukeEarthquake()
|
|
{
|
|
level endon ( "nuke_cancelled" );
|
|
|
|
level waittill( "nuke_death" );
|
|
|
|
// TODO: need to get a different position to call this on
|
|
//earthquake( 0.6, 10, nukepos, 100000 );
|
|
|
|
//foreach( player in level.players )
|
|
//player PlayRumbleOnEntity( "damage_heavy" );
|
|
}
|
|
|
|
onPlayerConnect()
|
|
{
|
|
for(;;)
|
|
{
|
|
level waittill("connected", player);
|
|
player thread onPlayerSpawned();
|
|
}
|
|
}
|
|
|
|
onPlayerSpawned()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
for(;;)
|
|
{
|
|
self waittill( "spawned_player" );
|
|
|
|
// make sure the vision set stays on between deaths
|
|
if( IsDefined( level.nukeDetonated ) )
|
|
self VisionSetNakedForPlayer( level.nukeVisionSet, 0 );
|
|
}
|
|
} |