mirror of
https://github.com/ineedbots/iw4_bot_warfare.git
synced 2025-04-21 21:45:43 +00:00
nuke mod
This commit is contained in:
parent
db01609694
commit
f984d2b55a
@ -19,15 +19,44 @@ init()
|
||||
|
||||
setDvarIfUninitialized( "scr_nukeTimer", 10 );
|
||||
setDvarIfUninitialized( "scr_nukeCancelMode", 0 );
|
||||
setDvarIfUninitialized( "scr_nuke_is_moab", true );
|
||||
setDvarIfUninitialized( "scr_nuke_kills_all", true );
|
||||
|
||||
level.nukeTimer = getDvarInt( "scr_nukeTimer" );
|
||||
level.cancelMode = getDvarInt( "scr_nukeCancelMode" );
|
||||
level.nukeEndsGame = getDvarInt( "scr_nuke_is_moab" );
|
||||
level.nukeKillsAll = getDvarInt( "scr_nuke_kills_all" );
|
||||
|
||||
/#
|
||||
setDevDvarIfUninitialized( "scr_nukeDistance", 5000 );
|
||||
setDevDvarIfUninitialized( "scr_nukeEndsGame", true );
|
||||
setDevDvarIfUninitialized( "scr_nukeDebugPosition", false );
|
||||
#/
|
||||
level.moabXP = [];
|
||||
|
||||
level thread onPlayerConnect();
|
||||
}
|
||||
|
||||
onPlayerConnect()
|
||||
{
|
||||
for(;;)
|
||||
{
|
||||
level waittill("connected", player);
|
||||
player thread onPlayerSpawned();
|
||||
}
|
||||
}
|
||||
|
||||
onPlayerSpawned()
|
||||
{
|
||||
self endon("disconnect");
|
||||
|
||||
for(;;)
|
||||
{
|
||||
self waittill( "spawned_player" );
|
||||
|
||||
if(isDefined(level.moabXP[self.team]) || isDefined(level.moabXP[self.guid]))
|
||||
self.xpScaler = 2;
|
||||
}
|
||||
}
|
||||
|
||||
tryUseNuke( lifeId, allowCancel )
|
||||
@ -61,6 +90,7 @@ delaythread_nuke( delay, func )
|
||||
|
||||
doNuke( allowCancel )
|
||||
{
|
||||
level notify ( "nuke_cancelled" );
|
||||
level endon ( "nuke_cancelled" );
|
||||
|
||||
level.nukeInfo = spawnStruct();
|
||||
@ -69,8 +99,11 @@ doNuke( allowCancel )
|
||||
|
||||
level.nukeIncoming = true;
|
||||
|
||||
if(level.nukeEndsGame)
|
||||
maps\mp\gametypes\_gamelogic::pauseTimer();
|
||||
|
||||
level.timeLimitOverride = true;
|
||||
level.scoreLimitOverride = true;
|
||||
setGameEndTime( int( gettime() + (level.nukeTimer * 1000) ) );
|
||||
setDvar( "ui_bomb_timer", 4 ); // Nuke sets '4' to avoid briefcase icon showing
|
||||
|
||||
@ -109,27 +142,47 @@ doNuke( allowCancel )
|
||||
if ( level.cancelMode && allowCancel )
|
||||
level thread cancelNukeOnDeath( self );
|
||||
|
||||
// leaks if lots of nukes are called due to endon above.
|
||||
// leaks if lots of nukes are called due to endon above. FIXED
|
||||
clockObject = spawn( "script_origin", (0,0,0) );
|
||||
clockObject hide();
|
||||
level thread killClockObjectOnEndOn(clockObject);
|
||||
|
||||
while ( !isDefined( level.nukeDetonated ) )
|
||||
{
|
||||
clockObject playSound( "ui_mp_nukebomb_timer" );
|
||||
wait( 1.0 );
|
||||
}
|
||||
|
||||
clockObject notify("death");
|
||||
clockObject delete();
|
||||
}
|
||||
|
||||
killClockObjectOnEndOn(clockObject)
|
||||
{
|
||||
clockObject endon("death");
|
||||
level waittill( "nuke_cancelled" );
|
||||
clockObject delete();
|
||||
}
|
||||
|
||||
cancelNukeOnDeath( player )
|
||||
{
|
||||
level endon ( "nuke_cancelled" );
|
||||
player waittill_any( "death", "disconnect" );
|
||||
|
||||
if ( isDefined( player ) && level.cancelMode == 2 )
|
||||
player thread maps\mp\killstreaks\_emp::EMP_Use( 0, 0 );
|
||||
|
||||
level.nukeIncoming = undefined;
|
||||
|
||||
level.nukeDetonated = undefined;
|
||||
|
||||
maps\mp\gametypes\_gamelogic::resumeTimer();
|
||||
level.timeLimitOverride = false;
|
||||
level.scoreLimitOverride = false;
|
||||
level notify( "update_scorelimit" );
|
||||
|
||||
foreach(player in level.players)
|
||||
player.nuked = undefined;
|
||||
|
||||
setDvar( "ui_bomb_timer", 0 ); // Nuke sets '4' to avoid briefcase icon showing
|
||||
|
||||
@ -163,6 +216,33 @@ nukeEffects()
|
||||
setGameEndTime( 0 );
|
||||
|
||||
level.nukeDetonated = true;
|
||||
|
||||
if ( !level.nukeEndsGame )
|
||||
{
|
||||
if ( level.teamBased )
|
||||
{
|
||||
level thread maps\mp\killstreaks\_emp::EMP_JamTeam(level.otherTeam[level.nukeInfo.team], 60, 5, level.nukeInfo.player, true);
|
||||
|
||||
foreach (player in level.players)
|
||||
{
|
||||
if(level.nukeInfo.team == player.team)
|
||||
{
|
||||
player.xpScaler = 2;
|
||||
}
|
||||
}
|
||||
level.moabXP[level.nukeInfo.team] = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
level thread maps\mp\killstreaks\_emp::EMP_JamPlayers(level.nukeInfo.player, 60, 5, true);
|
||||
if(isDefined(level.nukeInfo.player))
|
||||
{
|
||||
level.nukeInfo.player.xpScaler = 2;
|
||||
level.moabXP[level.nukeInfo.player.guid] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
level maps\mp\killstreaks\_emp::destroyActiveVehicles( level.nukeInfo.player );
|
||||
|
||||
foreach( player in level.players )
|
||||
@ -187,10 +267,21 @@ nukeEffects()
|
||||
#/
|
||||
|
||||
nukeEnt thread nukeEffect( player );
|
||||
player.nuked = true;
|
||||
|
||||
level thread killClockObjectOnEndOn(nukeEnt);
|
||||
level thread killNukeEntOn(nukeEnt);
|
||||
}
|
||||
}
|
||||
|
||||
killNukeEntOn(nukeEnt)
|
||||
{
|
||||
nukeEnt endon("death");
|
||||
level endon ( "nuke_cancelled" );
|
||||
level waittill("nuke_death");
|
||||
nukeEnt notify("death");
|
||||
nukeEnt delete();
|
||||
}
|
||||
|
||||
nukeEffect( player )
|
||||
{
|
||||
level endon ( "nuke_cancelled" );
|
||||
@ -225,6 +316,14 @@ nukeSlowMo()
|
||||
setSlowMotion( 0.25, 1, 2.0 );
|
||||
}
|
||||
|
||||
fixVisionOnCancel()
|
||||
{
|
||||
level waittill ( "nuke_cancelled" );
|
||||
//reset nuke vision
|
||||
visionSetNaked( getDvar( "mapname" ), 2.0 );
|
||||
level.nukeVisionInProgress = undefined;
|
||||
}
|
||||
|
||||
nukeVision()
|
||||
{
|
||||
level endon ( "nuke_cancelled" );
|
||||
@ -235,9 +334,21 @@ nukeVision()
|
||||
level waittill( "nuke_death" );
|
||||
|
||||
visionSetNaked( "mpnuke_aftermath", 5 );
|
||||
|
||||
level thread fixVisionOnCancel();
|
||||
|
||||
|
||||
if( level.NukeEndsGame )
|
||||
{
|
||||
wait 5;
|
||||
level.nukeVisionInProgress = undefined;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 3.5;
|
||||
level notify ( "nuke_cancelled" );
|
||||
}
|
||||
}
|
||||
|
||||
nukeDeath()
|
||||
{
|
||||
@ -247,17 +358,30 @@ nukeDeath()
|
||||
|
||||
maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
|
||||
|
||||
AmbientStop(1);
|
||||
|
||||
foreach( player in level.players )
|
||||
{
|
||||
if(level.teamBased)
|
||||
{
|
||||
if ( !level.nukeKillsAll && level.nukeInfo.team == player.pers["team"] )
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !level.nukeKillsAll && level.nukeInfo.player == player )
|
||||
continue;
|
||||
}
|
||||
|
||||
player.nuked = true;
|
||||
|
||||
if ( isAlive( player ) )
|
||||
player thread maps\mp\gametypes\_damage::finishPlayerDamageWrapper( level.nukeInfo.player, level.nukeInfo.player, 999999, 0, "MOD_EXPLOSIVE", "nuke_mp", player.origin, player.origin, "none", 0, 0 );
|
||||
}
|
||||
|
||||
level.postRoundTime = 10;
|
||||
if( level.NukeEndsGame )
|
||||
{
|
||||
AmbientStop(1);
|
||||
|
||||
nukeEndsGame = true;
|
||||
level.postRoundTime = 10;
|
||||
|
||||
if ( level.teamBased )
|
||||
thread maps\mp\gametypes\_gamelogic::endGame( level.nukeInfo.team, game["strings"]["nuclear_strike"], true );
|
||||
@ -269,6 +393,24 @@ nukeDeath()
|
||||
thread maps\mp\gametypes\_gamelogic::endGame( level.nukeInfo, game["strings"]["nuclear_strike"], true );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0.05;
|
||||
|
||||
maps\mp\gametypes\_gamelogic::resumeTimer();
|
||||
level.timeLimitOverride = false;
|
||||
level.scoreLimitOverride = false;
|
||||
level notify( "update_scorelimit" );
|
||||
|
||||
//allow next nuke to be called in, reset nuke variables
|
||||
level.nukeIncoming = undefined;
|
||||
level.nukeDetonated = undefined;
|
||||
|
||||
//allow ridable killstreaks
|
||||
foreach(player in level.players)
|
||||
player.nuked = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
nukeEarthquake()
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user