360 lines
8.8 KiB
Plaintext
360 lines
8.8 KiB
Plaintext
#include maps\mp\_utility;
|
|
#include maps\mp\gametypes\_hud_util;
|
|
#include common_scripts\utility;
|
|
|
|
|
|
//============================================
|
|
// constants
|
|
//============================================
|
|
CONST_DRONE_HIVE_DEBUG = false;
|
|
CONST_MISSILE_COUNT = 0;
|
|
|
|
|
|
//============================================
|
|
// init
|
|
//============================================
|
|
init()
|
|
{
|
|
level.killstreakFuncs["drone_hive"] = ::tryUseDroneHive;
|
|
|
|
level.droneMissileSpawnArray = GetEntArray( "remoteMissileSpawn", "targetname" );
|
|
|
|
foreach( missileSpawn in level.droneMissileSpawnArray )
|
|
{
|
|
missileSpawn.targetEnt = GetEnt( missileSpawn.target, "targetname" );
|
|
}
|
|
}
|
|
|
|
|
|
//============================================
|
|
// tryUseDroneHive
|
|
//============================================
|
|
tryUseDroneHive( rank, num_missiles, missile_name, altitude, baby_missile_name )
|
|
{
|
|
/#
|
|
if( (!IsDefined(level.droneMissileSpawnArray) || !level.droneMissileSpawnArray.size) )
|
|
{
|
|
AssertMsg( "map needs remoteMissileSpawn entities" );
|
|
}
|
|
#/
|
|
self notify( "action_use" );
|
|
level thread maps\mp\alien\_music_and_dialog::PlayVOForPredator( self );
|
|
return useDroneHive( self, rank, num_missiles, missile_name, altitude, baby_missile_name );
|
|
}
|
|
|
|
|
|
//============================================
|
|
// useDroneHive
|
|
//============================================
|
|
useDroneHive( player, rank, num_missiles, missile_name, altitude, baby_missile_name )
|
|
{
|
|
player setUsingRemote( "remotemissile" );
|
|
|
|
self VisionSetNakedForPlayer( "black_bw", 0.75 );
|
|
self maps\mp\alien\_utility::restore_client_fog( 0 );
|
|
self thread set_visionset_for_watching_players( "black_bw", 0.75, 1.0 );
|
|
//blackOutWait = self waittill_any_timeout( 0.2, "disconnect", "death" );
|
|
|
|
level thread runDroneHive( player, rank, num_missiles, missile_name, altitude, baby_missile_name );
|
|
// level thread monitorDisownKillstreaks( player );
|
|
level thread monitorGameEnd( player, rank );
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//============================================
|
|
// useDroneHive
|
|
//============================================
|
|
runDroneHive( player, rank, num_missiles, missile_name, altitude, baby_missile_name )
|
|
{
|
|
player endon( "killstreak_disowned" );
|
|
level endon( "game_ended" );
|
|
|
|
if ( !IsDefined( missile_name ) )
|
|
missile_name = "switchblade_rocket_mp";
|
|
|
|
if ( !IsDefined( num_missiles ) )
|
|
num_missiles = 0;
|
|
|
|
player notifyOnPlayerCommand( "missileTargetSet", "+attack" );
|
|
remoteMissileSpawn = getClosest( player.origin,level.droneMissileSpawnArray );
|
|
|
|
startPos = remoteMissileSpawn.origin;
|
|
targetPos = player.origin;
|
|
vector = VectorNormalize( startPos - targetPos );
|
|
startPos = ( vector * altitude ) + targetPos;
|
|
|
|
/#
|
|
if( CONST_DRONE_HIVE_DEBUG )
|
|
{
|
|
level thread drawLine( startPos, targetPos, 15, (1,0,0) );
|
|
}
|
|
#/
|
|
|
|
rocket = MagicBullet( missile_name, startpos, targetPos, player );
|
|
rocket SetCanDamage( true );
|
|
|
|
if( num_missiles != 0 )
|
|
rocket DisableMissileBoosting();
|
|
|
|
rocket.team = player.team;
|
|
|
|
rocket.type = "remote";
|
|
rocket.owner = player;
|
|
rocket.entityNumber = rocket GetEntityNumber();
|
|
|
|
level.rockets[ rocket.entityNumber ] = rocket;
|
|
level.remoteMissileInProgress = true;
|
|
|
|
level thread monitorDeath( rocket );
|
|
level thread monitorBoost( rocket );
|
|
|
|
missileEyes( player, rocket, rank );
|
|
// player setDepthOfField( 0, 96, 768, 4000, 4, 0 );
|
|
player notify( "action_use" );
|
|
|
|
player SetClientOmnvar( "ui_predator_missile", 1 );
|
|
|
|
missileCount = 0;
|
|
|
|
while( true )
|
|
{
|
|
result = rocket waittill_any_return( "death", "missileTargetSet" );
|
|
|
|
if( result == "death" )
|
|
break;
|
|
|
|
if ( missileCount < num_missiles )
|
|
{
|
|
level thread spawnSwitchBlade( rocket, missileCount, baby_missile_name );
|
|
missileCount++;
|
|
}
|
|
|
|
if( missileCount == num_missiles )
|
|
rocket EnableMissileBoosting();
|
|
}
|
|
|
|
player.turn_off_class_skill_activation = undefined;
|
|
returnPlayer( player, rank );
|
|
}
|
|
|
|
|
|
//============================================
|
|
// getEnemyTargets
|
|
//============================================
|
|
getEnemyTargets( owner )
|
|
{
|
|
enemyTargets = [];
|
|
|
|
foreach ( agent in level.agentArray )
|
|
{
|
|
// only active
|
|
if ( !IsDefined( agent.isActive ) || !agent.isActive )
|
|
continue;
|
|
|
|
enemyTargets[ enemyTargets.size ] = agent;
|
|
}
|
|
|
|
return enemyTargets;
|
|
|
|
}
|
|
|
|
|
|
//============================================
|
|
// spawnSwitchBlade
|
|
//============================================
|
|
spawnSwitchBlade( rocket, spawnOnLeft, baby_missile_name )
|
|
{
|
|
rocket.owner playLocalSound( "ammo_crate_use" );
|
|
|
|
forwardDir = AnglesToForward( rocket.angles );
|
|
rightDir = AnglesToRight( rocket.angles );
|
|
spawnOffset = (35,35,35);
|
|
targetOffset = (15000,15000,15000);
|
|
|
|
if(spawnOnLeft)
|
|
spawnOffset = spawnOffset * -1;
|
|
|
|
result = BulletTrace( rocket.origin, rocket.origin + (forwardDir * targetOffset), false, rocket );
|
|
|
|
targetOffset = targetOffset * result["fraction"];
|
|
startPoistion = rocket.origin + (rightDir * spawnOffset );
|
|
targetLocation = startPoistion + (forwardDir * targetOffset );
|
|
|
|
targets = rocket.owner getEnemyTargets( rocket.owner );
|
|
|
|
missile = MagicBullet( baby_missile_name, startPoistion, targetLocation, rocket.owner );
|
|
|
|
TargetArea = 262144; //512*512
|
|
|
|
foreach ( targ in targets )
|
|
{
|
|
if ( Distance2dsquared( targ.origin, targetLocation ) < TargetArea )
|
|
{
|
|
missile Missile_SetTargetEnt( targ );
|
|
break;
|
|
}
|
|
}
|
|
|
|
missile SetCanDamage( true );
|
|
|
|
missile.team = rocket.team;
|
|
|
|
missile.owner = rocket.owner;
|
|
missile.entityNumber = missile GetEntityNumber();
|
|
|
|
level.rockets[ missile.entityNumber ] = missile;
|
|
level thread monitorDeath( rocket );
|
|
}
|
|
|
|
|
|
//============================================
|
|
// getNextMissileSpawnIndex
|
|
//============================================
|
|
getNextMissileSpawnIndex( oldIndex )
|
|
{
|
|
index = oldIndex + 1;
|
|
|
|
if( index == level.droneMissileSpawnArray.size )
|
|
{
|
|
index = 0;
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
|
|
//============================================
|
|
// monitorBoost
|
|
//============================================
|
|
monitorBoost( rocket )
|
|
{
|
|
rocket endon( "death" );
|
|
|
|
while( true )
|
|
{
|
|
rocket.owner waittill( "missileTargetSet" );
|
|
rocket notify( "missileTargetSet" );
|
|
}
|
|
}
|
|
|
|
|
|
//============================================
|
|
// missileEyes
|
|
//============================================
|
|
missileEyes( player, rocket, rank )
|
|
{
|
|
delayTime = 1.0;
|
|
|
|
player freezeControlsWrapper( true );
|
|
|
|
if ( rank >= 1 )
|
|
player thread delayedFOFOverlay();
|
|
|
|
player CameraLinkTo( rocket, "tag_origin" );
|
|
player ControlsLinkTo( rocket );
|
|
player VisionSetMissilecamForPlayer( "default", delayTime );
|
|
player set_visionset_for_watching_players( "default", delayTime, undefined, true );
|
|
player VisionSetMissilecamForPlayer( game["thermal_vision_trinity"], 0.0 );
|
|
level thread unfreezeControls( player, delayTime );
|
|
}
|
|
|
|
delayedFOFOverlay()
|
|
{
|
|
self endon ( "death" );
|
|
self endon ( "disconnect" );
|
|
level endon ( "game_ended" );
|
|
|
|
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( 0.25 );
|
|
|
|
self ThermalVisionFOFOverlayOn();
|
|
}
|
|
|
|
//============================================
|
|
// unfreezeControls
|
|
//============================================
|
|
unfreezeControls( player, delayTime, i )
|
|
{
|
|
player endon( "disconnect" );
|
|
|
|
wait( delayTime - 0.35 );
|
|
player freezeControlsWrapper( false );
|
|
}
|
|
|
|
|
|
//============================================
|
|
// monitorDisownKillstreaks
|
|
//============================================
|
|
monitorDisownKillstreaks( player, rank )
|
|
{
|
|
player endon( "end_kill_streak" );
|
|
|
|
player waittill( "killstreak_disowned" );
|
|
|
|
level thread returnPlayer( player, rank );
|
|
}
|
|
|
|
|
|
//============================================
|
|
// monitorGameEnd
|
|
//============================================
|
|
monitorGameEnd( player, rank )
|
|
{
|
|
player endon( "end_kill_streak" );
|
|
|
|
level waittill( "game_ended" );
|
|
|
|
level thread returnPlayer( player, rank );
|
|
}
|
|
|
|
|
|
//============================================
|
|
// monitorDeath
|
|
//============================================
|
|
monitorDeath( killStreakEnt )
|
|
{
|
|
killStreakEnt waittill( "death" );
|
|
|
|
level.rockets[ killStreakEnt.entityNumber ] = undefined;
|
|
level.remoteMissileInProgress = undefined;
|
|
}
|
|
|
|
|
|
//============================================
|
|
// returnPlayer
|
|
//============================================
|
|
returnPlayer( player, rank )
|
|
{
|
|
if( !IsDefined(player) )
|
|
return;
|
|
|
|
player SetClientOmnvar( "ui_predator_missile", 2 );
|
|
player notify( "end_kill_streak" );
|
|
|
|
player freezeControlsWrapper( true );
|
|
if ( rank >= 1 )
|
|
{
|
|
player ThermalVisionFOFOverlayOff();
|
|
}
|
|
|
|
player ControlsUnlink();
|
|
// player setDepthOfField( 0, 96, 768, 4000, 6, 1.8 );
|
|
player setExitPredatorVisionSet();
|
|
|
|
wait( 0.95 );
|
|
|
|
player CameraUnlink();
|
|
player SetClientOmnvar( "ui_predator_missile", 0 );
|
|
player clearUsingRemote();
|
|
if ( IsDefined( player.last_weapon ) )
|
|
player SwitchToWeapon( player.last_weapon );
|
|
}
|
|
|
|
setExitPredatorVisionSet()
|
|
{
|
|
transition_time = 0.5;
|
|
|
|
self VisionSetNakedForPlayer( "", transition_time );
|
|
self VisionSetStage( 0, transition_time );
|
|
} |