iw6-scripts-dev/maps/mp/killstreaks/_mrsiartillery.gsc
2024-12-11 11:28:08 +01:00

107 lines
2.9 KiB
Plaintext

#include maps\mp\_utility;
#include common_scripts\utility;
KILLSTREAK_NAME = "mrsiartillery";
init()
{
level.killstreakFuncs[ KILLSTREAK_NAME ] = ::tryUseStrike;
configData = SpawnStruct();
configData.weaponName = "airdrop_marker_mp";
configData.projectileName = "mrsiartillery_projectile_mp";
// configData.explodeVfx = LoadFX( "fx/explosions/aerial_explosion" );
// configData.model = "projectile_icbm_missile";
// configData.model = "mil_ammo_case_1_open";
//configData.impactVfx = LoadFX( "fx/explosions/wall_explosion_pm_a" );
configData.numStrikes = 6;
configData.initialDelay = 1.0;
configData.minFireDelay = 0.375;
configdata.maxFireDelay = 0.5;
configData.strikeRadius = 150;
if ( !IsDefined( level.killstreakConfigData ) )
{
level.killstreakConfigData = [];
}
level.killstreakConfigData[ KILLSTREAK_NAME ] = configData;
}
tryUseStrike( lifeId, streakName )
{
configData = level.killStreakConfigData[ KILLSTREAK_NAME ];
result = self maps\mp\killstreaks\_designator_grenade::designator_Start( KILLSTREAK_NAME, configData.weaponName, ::onTargetAcquired );
if ( ( !IsDefined( result ) || !result ) )
{
return false;
}
else
{
// self maps\mp\_matchdata::logKillstreakEvent( BOX_TYPE, self.origin );
return true;
}
}
onTargetAcquired( killstreakName, designatorEnt ) // self == player
{
configData = level.killStreakConfigData[ killstreakName ];
owner = designatorEnt.owner;
endPos = designatorEnt.origin;
designatorEnt Detonate();
doStrike( owner, killstreakName, owner.origin, endPos );
}
doStrike( owner, killstreakName, startPosition, endPosition )
{
configData = level.killStreakConfigData[ killstreakName ];
// play some firing sounds
dir = endPosition - startPosition;
xyDir = ( dir[0], dir[1], 0);
dir = VectorNormalize( dir );
strikeTarget = endPosition;
// shift up slightly to not intersect with ground
strikeOrigin = maps\mp\killstreaks\_killstreaks::findUnobstructedFiringPoint( owner, endPosition + (0, 0, 10), 10000 );
if ( IsDefined( strikeOrigin ) )
{
IPrintLn( "Firing Motar!" );
// play sounds
wait( configData.initialDelay );
// always hit the target directly once
wait( RandomFloatRange( configData.minFireDelay, configData.maxFireDelay ) );
projectile = MagicBullet( configData.projectileName, strikeOrigin, strikeTarget, owner );
// then scatter around
for ( i = 1; i < configData.numStrikes; i++ )
{
wait( RandomFloatRange( configData.minFireDelay, configData.maxFireDelay ) );
// pick target points
randomTarget = pickRandomTargetPoint( strikeTarget, configData.strikeRadius );
projectile = MagicBullet( configData.projectileName, strikeOrigin, randomTarget, owner );
}
}
else
{
IPrintLn( "Mortar LOS blocked!" );
}
}
pickRandomTargetPoint( targetPoint, strikeRadius )
{
x = RandomFloatRange( -1 * strikeRadius, strikeRadius );
y = RandomFloatRange( -1 * strikeRadius, strikeRadius );
return targetPoint + (x, y, 0);
}