construction-mod/scripts/MPM/Nuclear_blast.cs
2025-06-05 12:37:16 +02:00

1357 lines
34 KiB
C#

//--------------------------------------
// Arrow IV Nuclear Launcher
//--------------------------------------
//-----------------------------------------
//-----------------------------------------
//Copyright (C) Dave "Uranium - 235" Schutz
//-----------------------------------------
//-----------------------------------------
//--------------------------------------------------------------------------
// Sounds
//--------------------------------------
datablock AudioProfile(NuclearSwitchSound)
{
filename = "fx/weapons/missile_launcher_activate.wav";
description = AudioClosest3d;
preload = true;
effect = NuclearSwitchEffect;
};
datablock AudioProfile(NuclearProjectileSound)
{
filename = "fx/weapons/missile_projectile.wav";
description = ProjectileLooping3d;
preload = true;
};
datablock AudioProfile(NuclearReloadSound)
{
filename = "fx/weapons/weapon.missilereload.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(NuclearLockSound)
{
filename = "fx/weapons/missile_launcher_searching.WAV";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(NuclearDryFireSound)
{
filename = "fx/weapons/missile_launcher_dryfire.wav";
description = AudioClose3d;
preload = true;
effect = NuclearDryFireEffect;
};
datablock AudioProfile(NukeDeathSound)
{
filename = "voice/derm1/gbl.brag.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(NuclearFireSound)
{
filename = "fx/weapons/grenade_flash_explode.wav";
description = AudioDefault3d;
preload = true;
effect = NuclearFireEffect;
};
datablock AudioProfile(NuclearExplosionSound)
{
filename = "fx/vehicles/bomber_bomb_impact.wav";
description = AudioBIGExplosion3d;
preload = true;
effect = NuclearExplosionEffect;
};
//----------------------------------------------------------------------------
// Explosion smoke particles
//----------------------------------------------------------------------------
datablock ParticleData(NuclearSmokeParticle)
{
dragCoeffiecient = 0.0;
gravityCoefficient = -0.02;
inheritedVelFactor = 0.1;
lifetimeMS = 8200;
lifetimeVarianceMS = 100;
textureName = "particleTest";
useInvAlpha = true;
spinRandomMin = -90.0;
spinRandomMax = 90.0;
colors[0] = "1.0 0.75 0.0 0.0";
colors[1] = "0.7 0.7 0.7 1.0";
colors[2] = "0.5 0.5 0.5 0.0";
sizes[0] = 4;
sizes[1] = 6;
sizes[2] = 8;
times[0] = 0.0;
times[1] = 0.1;
times[2] = 1.0;
};
datablock ParticleEmitterData(NuclearSmokeEmitter)
{
ejectionPeriodMS = 10;
periodVarianceMS = 0;
ejectionVelocity = 1.5;
velocityVariance = 0.3;
thetaMin = 0.0;
thetaMax = 25.0;
particles = "NuclearSmokeParticle";
};
datablock ParticleData(NuclearFireParticle)
{
dragCoeffiecient = 0.0;
gravityCoefficient = 0.0;
inheritedVelFactor = 1.0;
lifetimeMS = 1000;
lifetimeVarianceMS = 000;
textureName = "particleTest";
spinRandomMin = -135;
spinRandomMax = 135;
colors[0] = "1.0 0.75 0.2 1.0";
colors[1] = "1.0 0.5 0.0 1.0";
colors[2] = "1.0 0.40 0.0 0.0";
sizes[0] = 2;
sizes[1] = 4;
sizes[2] = 5.5;
times[0] = 0.0;
times[1] = 0.3;
times[2] = 1.0;
};
datablock ParticleEmitterData(NuclearFireEmitter)
{
ejectionPeriodMS = 15;
periodVarianceMS = 0;
ejectionVelocity = 15.0;
velocityVariance = 0.0;
thetaMin = 0.0;
thetaMax = 0.0;
particles = "NuclearFireParticle";
};
//---------------------------------------------------------------------------
// Shockwaves
//---------------------------------------------------------------------------
datablock ShockwaveData(NuclearShockwave)
{
width = 5;
numSegments = 20;
numVertSegments = 4;
velocity = 100;
acceleration = -10.0; // was 40
lifetimeMS = 8200;
height = 2.0; // was 1.0
verticalCurve = 0.5;
mapToTerrain = true;
renderBottom = true;
texture[0] = "special/shockwave4";
texture[1] = "special/gradient";
texWrap = 6.0;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
colors[0] = "1.0 0.7 0.5 1.0";
colors[1] = "1.0 0.5 0.2 1.0";
colors[2] = "1.0 0.25 0.1 0.0";
};
datablock ShockwaveData(NuclearShockwave2)
{
width = 20.0;
numSegments = 50;
numVertSegments = 4;
velocity = 350;
acceleration = 0.0; // was 40
lifetimeMS = 3000;
height = 300.0; // was 1.0
verticalCurve = 0.5;
mapToTerrain = false;
orientToNormal = false;
renderBottom = true;
texture[0] = "special/shockwave4";
texture[1] = "special/gradient";
texWrap = 6.0;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
colors[0] = "0.7 0.7 1.0 1.0";
colors[1] = "0.7 0.7 1.0 0.5";
colors[2] = "0.7 0.7 1.0 1.0";
};
datablock ShockwaveData(NuclearShockwave3)
{
width = 6.0;
numSegments = 32;
numVertSegments = 60;
velocity = 150;
acceleration = -5.0;
lifetimeMS = 8000;
height = 20.0;
verticalCurve = 0.5;
is2D = false;
texture[0] = "special/shockwave4";
texture[1] = "special/gradient";
texWrap = 6.0;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
colors[0] = "0.8 0.8 0.0 0.50";
colors[1] = "0.4 0.4 0.0 0.25";
colors[2] = "0.4 0.4 0.0 0.0";
mapToTerrain = true;
orientToNormal = false;
renderBottom = true;
};
//--------------------------------------------------------------------------
// Particle effects
//--------------------------------------
//----------------------------------------------------
//Condensation
//----------------------------------------------------
datablock ParticleData(NuclearCapSmokeParticle)
{
dragCoefficient = 0.25;
gravityCoefficient = -0.01;
windCoefficient = 0;
inheritedVelFactor = 0.025;
constantAcceleration = 0;
lifetimeMS = 30000;
lifetimeVarianceMS = 100;
useInvAlpha = 1;
spinRandomMin = -90;
spinRandomMax = 90;
textureName = "particleTest";
colors[0] = "0.3 0.3 0.3 0.5";
colors[1] = "0.3 0.3 0.3 0.5";
colors[2] = "0.3 0.3 0.3 0.0";
sizes[0] = 50;
sizes[1] = 50;
sizes[2] = 50;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(NuclearCapSmokeEmitter)
{
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 40.0;
velocityVariance = 5;
ejectionOffset = 0;
thetaMin = 90;
thetaMax = 180;
phiReferenceVel = 0;
phiVariance = 360;
lifeTimeMS = 5000;
orientParticles = 0;
orientOnVelocity = 1;
particles = "NuclearCapSmokeParticle";
};
datablock ParticleData(NuclearStemSmokeParticle)
{
dragCoeffiecient = 0.0;
gravityCoefficient = 0.0;
inheritedVelFactor = 0.0;
windcoefficient = 0.0;
lifetimeMS = 30000;
lifetimeVarianceMS = 100;
textureName = "particleTest";
useInvAlpha = true;
spinRandomMin = -90.0;
spinRandomMax = 90.0;
colors[0] = "0.3 0.3 0.3 0.5";
colors[1] = "0.3 0.3 0.3 0.5";
colors[2] = "0.3 0.3 0.3 0.0";
sizes[0] = 50;
sizes[1] = 50;
sizes[2] = 50;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(NuclearStemSmokeEmitter)
{
ejectionPeriodMS = 10;
periodVarianceMS = 0;
ejectionVelocity = 2.0;
velocityVariance = 1.0;
thetaMin = 0.0;
thetaMax = 90.0;
particles = "NuclearStemSmokeParticle";
};
datablock ParticleData(NuclearDustParticle)
{
dragCoefficient = 1.0;
gravityCoefficient = 0.00;
windcoefficient = 0.0;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 30000;
lifetimeVarianceMS = 100;
useInvAlpha = true;
spinRandomMin = -90.0;
spinRandomMax = 90.0;
textureName = "particleTest";
colors[0] = "0.3 0.3 0.3 0.5";
colors[1] = "0.3 0.3 0.3 0.5";
colors[2] = "0.3 0.3 0.3 0.0";
sizes[0] = 50;
sizes[1] = 50;
sizes[2] = 50;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(NuclearDustEmitter)
{
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 150.0;
velocityVariance = 150.0;
ejectionOffset = 0.0;
thetaMin = 85;
thetaMax = 85;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
lifetimeMS = 3000;
particles = "NuclearDustParticle";
};
datablock ParticleData(LargeCondensationParticle)
{
dragCoefficient = 1;
gravityCoefficient = 0;
windCoefficient = 0;
inheritedVelFactor = 0;
constantAcceleration = 0;
lifetimeMS = 12000;
lifetimeVarianceMS = 1000;
useInvAlpha = 0;
spinRandomMin = -90;
spinRandomMax = 500;
textureName = "particleTest";
times[0] = 0;
times[1] = 0.33;
times[2] = 1;
colors[0] = "0.7 0.8 1.0 1.0";
colors[1] = "0.7 0.8 1.0 0.5";
colors[2] = "0.7 0.8 1.0 0.0";
sizes[0] = 30;
sizes[1] = 30;
sizes[2] = 30;
};
datablock ParticleEmitterData(LargeCondensationEmitter)
{
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 2.66935;
velocityVariance = 2.59677;
ejectionOffset = 325;
thetaMin = 90;
thetaMax = 90;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = 0;
lifeTimeMS = 750;
orientParticles= 0;
orientOnVelocity = 0;
particles = "LargeCondensationParticle";
};
datablock ParticleData(SmallCondensationParticle)
{
dragCoefficient = 1;
gravityCoefficient = -0.01;
windCoefficient = 0;
inheritedVelFactor = 0;
constantAcceleration = 0;
lifetimeMS = 12000;
lifetimeVarianceMS = 1000;
useInvAlpha = 0;
spinRandomMin = -90;
spinRandomMax = 500;
textureName = "particleTest";
times[0] = 0;
times[1] = 0.5;
times[2] = 1;
colors[0] = "0.7 0.8 1.0 1.0";
colors[1] = "0.7 0.8 1.0 0.5";
colors[2] = "0.7 0.8 1.0 0.0";
sizes[0] = 30;
sizes[1] = 30;
sizes[2] = 30;
};
datablock ParticleEmitterData(SmallCondensationEmitter)
{
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 2.66935;
velocityVariance = 2.59677;
ejectionOffset = 275;
thetaMin = 90;
thetaMax = 90;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = 0;
lifeTimeMS = 750;
orientParticles= 0;
orientOnVelocity = 0;
particles = "SmallCondensationParticle";
};
datablock ParticleData(UpperRingParticle)
{
dragCoefficient = 1.0;
gravityCoefficient = 0;
windCoefficient = 0;
inheritedVelFactor = 0;
constantAcceleration = 0;
lifetimeMS = 12000;
lifetimeVarianceMS = 1000;
useInvAlpha = 0;
spinRandomMin = -90;
spinRandomMax = 500;
textureName = "particleTest";
times[0] = 0;
times[1] = 0.5;
times[2] = 1;
colors[0] = "0.7 0.8 1.0 1.0";
colors[1] = "0.7 0.8 1.0 0.5";
colors[2] = "0.7 0.8 1.0 0.0";
sizes[0] = 30;
sizes[1] = 30;
sizes[2] = 30;
};
datablock ParticleEmitterData(UpperRingEmitter)
{
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 50;
velocityVariance = 50;
ejectionOffset = 150;
thetaMin = 90;
thetaMax = 90;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = 0;
lifeTimeMS = 8000;
orientParticles= 0;
orientOnVelocity = 1;
particles = "UpperRingParticle";
};
datablock ParticleData(NuclearSplashParticle)
{
dragCoefficient = 0;
gravityCoefficient = 0.1;
windCoefficient = 0;
inheritedVelFactor = 0;
constantAcceleration = 0;
lifetimeMS = 10000;
lifetimeVarianceMS = 1000;
useInvAlpha = 0;
spinRandomMin = 0;
spinRandomMax = 0;
textureName = "special/droplet";
times[0] = 0;
times[1] = 0.5;
times[2] = 1;
colors[0] = "0.7 0.8 1.0 1.0";
colors[1] = "0.7 0.8 1.0 0.5";
colors[2] = "0.7 0.8 1.0 0.0";
sizes[0] = 4.74194;
sizes[1] = 4.74194;
sizes[2] = 4.74194;
};
datablock ParticleEmitterData(NuclearSplashEmitter)
{
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 10;
velocityVariance = 10;
ejectionOffset = 10;
thetaMin = 0;
thetaMax = 31.2097;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = 0;
lifeTimeMS = 10000;
orientParticles= 1;
orientOnVelocity = 1;
particles = "NuclearSplashParticle";
};
datablock ParticleData(DomeCondensationParticle)
{
dragCoefficient = 0.1;
gravityCoefficient = 0;
windCoefficient = 0;
inheritedVelFactor = 0;
constantAcceleration = 0;
lifetimeMS = 15000;
lifetimeVarianceMS = 0;
useInvAlpha = 0;
spinRandomMin = -90;
spinRandomMax = 500;
textureName = "particleTest";
times[0] = 0;
times[1] = 0.5;
times[2] = 1;
colors[0] = "0.7 0.8 1.0 1.0";
colors[1] = "0.7 0.8 1.0 0.5";
colors[2] = "0.7 0.8 1.0 0.0";
sizes[0] = 7;
sizes[1] = 7;
sizes[2] = 7;
};
datablock ParticleEmitterData(DomeCondensationEmitter)
{
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 10;
velocityVariance = 1;
ejectionOffset = 10;
thetaMin = 90;
thetaMax = 0;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = 0;
lifeTimeMS = 3000;
orientParticles= 0;
orientOnVelocity = 1;
particles = "DomeCondensationParticle";
};
// More explosions
datablock ExplosionData(RingExplosion1)
{
emitter[0] = SmallCondensationEmitter;
shakeCamera = true;
camShakeFreq = "10.0 11.0 10.0";
camShakeAmp = "20.0 20.0 20.0";
camShakeDuration = 0.5;
camShakeRadius = 10.0;
sizes[0] = "0.01 0.01 0.01";
sizes[1] = "0.01 0.01 0.01";
times[0] = 0.0;
times[1] = 1.0;
};
datablock ExplosionData(RingExplosion2)
{
emitter[0] = LargeCondensationEmitter;
shakeCamera = true;
camShakeFreq = "10.0 11.0 10.0";
camShakeAmp = "20.0 20.0 20.0";
camShakeDuration = 0.5;
camShakeRadius = 10.0;
sizes[0] = "0.01 0.01 0.01";
sizes[1] = "0.01 0.01 0.01";
times[0] = 0.0;
times[1] = 1.0;
};
datablock ExplosionData(UpperRingExplosion)
{
emitter[0] = UpperRingEmitter;
shakeCamera = true;
camShakeFreq = "10.0 11.0 10.0";
camShakeAmp = "20.0 20.0 20.0";
camShakeDuration = 0.5;
camShakeRadius = 10.0;
sizes[0] = "0.01 0.01 0.01";
sizes[1] = "0.01 0.01 0.01";
times[0] = 0.0;
times[1] = 1.0;
};
datablock ExplosionData(DustExplosion)
{
emitter[0] = NuclearDustEmitter;
shakeCamera = true;
camShakeFreq = "10.0 11.0 10.0";
camShakeAmp = "20.0 20.0 20.0";
camShakeDuration = 0.5;
camShakeRadius = 10.0;
sizes[0] = "0.01 0.01 0.01";
sizes[1] = "0.01 0.01 0.01";
times[0] = 0.0;
times[1] = 1.0;
};
datablock ExplosionData(CapExplosion)
{
emitter[0] = NuclearCapSmokeEmitter;
shakeCamera = true;
camShakeFreq = "10.0 11.0 10.0";
camShakeAmp = "20.0 20.0 20.0";
camShakeDuration = 0.5;
camShakeRadius = 10.0;
sizes[0] = "0.01 0.01 0.01";
sizes[1] = "0.01 0.01 0.01";
times[0] = 0.0;
times[1] = 1.0;
};
datablock ExplosionData(NuclearSplash)
{
emitter[0] = NuclearSplashEmitter;
shakeCamera = true;
camShakeFreq = "10.0 11.0 10.0";
camShakeAmp = "20.0 20.0 20.0";
camShakeDuration = 0.5;
camShakeRadius = 10.0;
sizes[0] = "0.01 0.01 0.01";
sizes[1] = "0.01 0.01 0.01";
times[0] = 0.0;
times[1] = 1.0;
};
datablock ExplosionData(DomeCondensationExplosion)
{
emitter[0] = DomeCondensationEmitter;
shakeCamera = true;
camShakeFreq = "10.0 11.0 10.0";
camShakeAmp = "20.0 20.0 20.0";
camShakeDuration = 0.5;
camShakeRadius = 10.0;
sizes[0] = "0.01 0.01 0.01";
sizes[1] = "0.01 0.01 0.01";
times[0] = 0.0;
times[1] = 1.0;
};
//---------------------------------------------------------------------------
// Explosions
//---------------------------------------------------------------------------
datablock ExplosionData(NuclearExplosion1)
{
shockwave = NuclearShockwave2;
shockwaveOnTerrain = false;
explosionShape = "effect_plasma_explosion.dts";
playSpeed = 0.05;
soundProfile = NuclearExplosionSound;
faceViewer = true;
sizes[0] = "100.0 100.0 100.0";
shakeCamera = true;
camShakeFreq = "6.0 7.0 7.0";
camShakeAmp = "100.0 100.0 100.0";
camShakeDuration = 1.0;
camShakeRadius = 7.0;
};
datablock ExplosionData(NuclearExplosion2)
{
shockwave = NuclearShockwave;
shockwaveOnTerrain = false;
explosionShape = "effect_plasma_explosion.dts";
playSpeed = 0.05;
soundProfile = NuclearExplosionSound;
faceViewer = true;
sizes[0] = "100.0 100.0 100.0";
shakeCamera = true;
camShakeFreq = "6.0 7.0 7.0";
camShakeAmp = "70.0 70.0 70.0";
camShakeDuration = 1.0;
camShakeRadius = 7.0;
};
datablock ExplosionData(NuclearExplosion3)
{
explosionShape = "effect_plasma_explosion.dts";
playSpeed = 0.05;
soundProfile = NuclearExplosionSound;
faceViewer = true;
shockwave = NuclearShockwave3;
shockwaveOnTerrain = false;
sizes[0] = "150.0 150.0 150.0";
shakeCamera = true;
camShakeFreq = "6.0 7.0 7.0";
camShakeAmp = "70.0 70.0 70.0";
camShakeDuration = 1.0;
camShakeRadius = 7.0;
};
datablock ExplosionData(NuclearExplosion4)
{
explosionShape = "effect_plasma_explosion.dts";
playSpeed = 0.05;
soundProfile = NuclearExplosionSound;
faceViewer = true;
sizes[0] = "250.0 250.0 250.0";
shakeCamera = true;
camShakeFreq = "6.0 7.0 7.0";
camShakeAmp = "70.0 70.0 70.0";
camShakeDuration = 1.0;
camShakeRadius = 7.0;
};
datablock ExplosionData(NuclearMainExplosion)
{
soundProfile = NuclearExplosionSound;
subExplosion[0] = NuclearExplosion1;
subExplosion[1] = NuclearExplosion2;
subExplosion[2] = NuclearExplosion3;
subExplosion[3] = NuclearExplosion4;
subExplosion[4] = DustExplosion;
};
//--------------------------------------------------------------------------
// Projectile
//--------------------------------------
datablock SeekerProjectileData(ShoulderNuclear)
{
casingShapeName = "weapon_missile_casement.dts";
projectileShapeName = "weapon_missile_projectile.dts";
hasDamageRadius = true;
indirectDamage = 1000.0;
damageRadius = 250.0;
radiusDamageType = $DamageType::Missile;
kickBackStrength = 100000;
Underwaterexplosion = "NuclearSplash";
splash = BlasterSplash;
velInheritFactor = 0.5;
depthTolerance = 10.0; // depth at which it uses underwater explosion
baseEmitter = NuclearSmokeEmitter;
delayEmitter = NuclearFireEmitter;
puffEmitter = NuclearPuffEmitter;
bubbleEmitter = GrenadeBubbleEmitter;
bubbleEmitTime = 1.0;
exhaustEmitter = NuclearExhaustEmitter;
exhaustTimeMs = 2000;
exhaustNodeName = "muzzlePoint1";
lifetimeMS = 1800000; //60000
muzzleVelocity = 1.0; //1
maxVelocity = 100.0; //80 100
turningSpeed = 120.0; //110 120
acceleration = 10.0; //200 10
proximityRadius = 5;
terrainAvoidanceSpeed = 480; //180
terrainScanAhead = 25; //25
terrainHeightFail = 3; //12
terrainAvoidanceRadius = 100; //100
flareDistance = 50; //200
flareAngle = 5; //30
sound = NuclearProjectileSound;
hasLight = true;
lightRadius = 5.0;
lightColor = "0.2 0.05 0";
useFlechette = true;
flechetteDelayMs = 550;
casingDeb = FlechetteDebris;
explodeOnWaterImpact = false;
};
datablock LinearProjectileData(RingProjectile1)
{
projectileShapeName = "weapon_missile_Projectile.dts";
emitterDelay = -1;
directDamage = 0.0;
hasDamageRadius = true;
indirectDamage = 1.0;
damageRadius = 500.0;
radiusDamageType = $DamageType::EMP;
kickBackStrength = 0;
sound = discProjectileSound;
explosion = "RingExplosion1";
underwaterExplosion = "RingExplosion1";
splash = DiscSplash;
dryVelocity = 180;
wetVelocity = 180;
velInheritFactor = 0.5;
fizzleTimeMS = 1500;
lifetimeMS = 1500;
explodeOnDeath = true;
reflectOnWaterImpactAngle = 15.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = 5000;
activateDelayMS = -1;
};
datablock LinearProjectileData(RingProjectile2)
{
projectileShapeName = "weapon_missile_Projectile.dts";
emitterDelay = -1;
directDamage = 0.0;
hasDamageRadius = true;
indirectDamage = 1000.0;
damageRadius = 250.0;
radiusDamageType = $DamageType::Nuclear;
kickBackStrength = 0;
sound = discProjectileSound;
explosion = "RingExplosion2";
underwaterExplosion = "RingExplosion2";
splash = DiscSplash;
depthTolerance = 10.0; // depth at which it uses underwater explosion
dryVelocity = 180;
wetVelocity = 180;
velInheritFactor = 0.5;
fizzleTimeMS = 1000;
lifetimeMS = 1000;
explodeOnDeath = true;
reflectOnWaterImpactAngle = 15.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = 5000;
activateDelayMS = 200;
};
datablock LinearProjectileData(StemProjectile1)
{
projectileShapeName = "weapon_missile_Projectile.dts";
emitterDelay = 1;
directDamage = 0.0;
hasDamageRadius = true;
indirectDamage = 1000.0;
damageRadius = 250.0;
radiusDamageType = $DamageType::Nuclear;
kickBackStrength = 0;
baseEmitter = NuclearStemSmokeEmitter;
dryVelocity = 50;
wetVelocity = 50;
velInheritFactor = 0.5;
fizzleTimeMS = 5000;
lifetimeMS = 5000;
explodeOnDeath = true;
reflectOnWaterImpactAngle = 15.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = 5000;
activateDelayMS = 200;
};
datablock LinearProjectileData(StemProjectile2)
{
projectileShapeName = "weapon_missile_Projectile.dts";
emitterDelay = 1;
directDamage = 0.0;
hasDamageRadius = true;
indirectDamage = 1000.0;
damageRadius = 250.0;
radiusDamageType = $DamageType::Nuclear;
kickBackStrength = 0;
explosion = "CapExplosion";
underwaterExplosion = "CapExplosion";
dryVelocity = 50;
wetVelocity = 50;
velInheritFactor = 0.5;
fizzleTimeMS = 4000;
lifetimeMS = 4000;
explodeOnDeath = true;
reflectOnWaterImpactAngle = 15.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = 4000;
activateDelayMS = 200;
};
datablock LinearProjectileData(UpperRingProjectile1)
{
projectileShapeName = "weapon_missile_Projectile.dts";
emitterDelay = 1;
directDamage = 0.0;
hasDamageRadius = true;
indirectDamage = 1000.0;
damageRadius = 250.0;
radiusDamageType = $DamageType::Nuclear;
kickBackStrength = 0;
explosion = "UpperRingExplosion";
underwaterExplosion = "UpperRingExplosion";
dryVelocity = 180;
wetVelocity = 180;
velInheritFactor = 0.5;
fizzleTimeMS = 2000;
lifetimeMS = 2000;
explodeOnDeath = true;
reflectOnWaterImpactAngle = 15.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = 2000;
activateDelayMS = -1;
};
datablock LinearProjectileData(DustProjectile1)
{
projectileShapeName = "weapon_missile_Projectile.dts";
emitterDelay = -1;
directDamage = 0.0;
hasDamageRadius = true;
indirectDamage = 1000.0;
damageRadius = 250.0;
radiusDamageType = $DamageType::Nuclear;
kickBackStrength = 35000;
maxWhiteout = 2.0;
sound = discProjectileSound;
explosion = "NuclearMainExplosion";
underwaterExplosion = "NuclearMainExplosion";
splash = DiscSplash;
dryVelocity = 180;
wetVelocity = 180;
velInheritFactor = 0.5;
fizzleTimeMS = 100;
lifetimeMS = 100;
explodeOnDeath = true;
reflectOnWaterImpactAngle = 15.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = 5000;
activateDelayMS = 200;
};
//--------------------------------------------------------------------------
// Ammo
//--------------------------------------
datablock ItemData(NuclearAmmo)
{
className = Ammo;
catagory = "Ammo";
shapeFile = "ammo_missile.dts";
mass = 5;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 2;
pickUpName = "an Arrow IV nuclear missile";
computeCRC = true;
};
//--------------------------------------------------------------------------
// Weapon
//--------------------------------------
datablock ItemData(Nuclear)
{
className = Weapon;
catagory = "Spawn Items";
shapeFile = "turret_tank_barrelmortar.dts";
image = NuclearImage;
mass = 50;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 2;
pickUpName = "an Arrow IV nuclear launch platform";
computeCRC = true;
emap = true;
};
datablock ShapeBaseImageData(NuclearImage)
{
className = WeaponImage;
shapeFile = "turret_missile_large.dts";
item = Nuclear;
offset = "0.2 0.5 0";
armThread = lookms;
emap = true;
usesenergy = true;
minenergy = 0;
projectile = ShoulderNuclear;
projectileType = SeekerProjectile;
isSeeker = true;
seekRadius = 100000;
maxSeekAngle = 25;
seekTime = 1.0;
minSeekHeat = 0.5; // the heat that must be present on a target to lock it.
// only target objects outside this range
minTargetingDistance = 2;
stateName[0] = "Activate";
stateTransitionOnTimeout[0] = "ActivateReady";
stateTimeoutValue[0] = 0.5;
stateSequence[0] = "Activate";
stateSound[0] = NuclearSwitchSound;
stateName[1] = "ActivateReady";
stateTransitionOnLoaded[1] = "Ready";
stateTransitionOnNoAmmo[1] = "NoAmmo";
stateSound[1] = NuclearIdleSound;
stateName[2] = "Ready";
stateTransitionOnNoAmmo[2] = "NoAmmo";
stateTransitionOnTriggerDown[2] = "CheckWet";
stateName[3] = "Fire";
stateTransitionOnTimeout[3] = "Reload";
stateTimeoutValue[3] = 1.5;
stateFire[3] = true;
stateRecoil[3] = LightRecoil;
stateAllowImageChange[3] = false;
stateSequence[3] = "Fire";
stateScript[3] = "onFire";
stateSound[3] = NuclearFireSound;
stateName[4] = "Reload";
stateTransitionOnNoAmmo[4] = "NoAmmo";
stateTransitionOnTimeout[4] = "Ready";
stateTimeoutValue[4] = 0.75;
stateAllowImageChange[4] = false;
stateSequence[4] = "Reload";
stateSound[4] = NuclearReloadSound;
stateName[5] = "NoAmmo";
stateTransitionOnAmmo[5] = "Reload";
stateSequence[5] = "NoAmmo";
stateTransitionOnTriggerDown[5] = "DryFire";
stateName[6] = "DryFire";
stateSound[6] = NuclearDryFireSound;
stateTimeoutValue[6] = 1.0;
stateTransitionOnTimeout[6] = "ActivateReady";
stateName[7] = "CheckTarget";
stateTransitionOnNoTarget[7] = "Fire";
stateTransitionOnTarget[7] = "Fire";
stateName[8] = "CheckWet";
stateTransitionOnWet[8] = "WetFire";
stateTransitionOnNotWet[8] = "CheckTarget";
stateName[9] = "WetFire";
stateTransitionOnNoAmmo[9] = "NoAmmo";
stateTransitionOnTimeout[9] = "Reload";
stateSound[9] = NuclearFireSound;
stateRecoil[3] = LightRecoil;
stateTimeoutValue[9] = 0.25;
stateSequence[3] = "Fire";
stateScript[9] = "onWetFire";
stateAllowImageChange[9] = false;
};
function ShoulderNuclear::onExplode(%data, %proj, %pos, %mod)
{
if (%data.hasDamageRadius)
RadiusExplosion(%proj, %pos, %data.damageRadius, %data.indirectDamage, %data.kickBackStrength, %proj.sourceObject, %data.radiusDamageType);
for(%i=0;%i<1;%i++)
{
%p = new LinearProjectile() {
dataBlock = RingProjectile2;
initialDirection = "0 0 1";
initialPosition = %pos;
//sourceObject = %projectile.sourceObject;
sourceSlot = %projectile.sourceSlot;
vehicleObject = %projectile.vehicleObject;
};
MissionCleanup.add(%p);
}
%p = new LinearProjectile() {
dataBlock = RingProjectile1;
initialDirection = "0 0 1";
initialPosition = %pos;
//sourceObject = %projectile.sourceObject;
sourceSlot = %projectile.sourceSlot;
vehicleObject = %projectile.vehicleObject;
};
MissionCleanup.add(%p);
%p = new LinearProjectile() {
dataBlock = DustProjectile1;
initialDirection = "0 0 1";
initialPosition = %pos;
//sourceObject = %projectile.sourceObject;
sourceSlot = %projectile.sourceSlot;
vehicleObject = %projectile.vehicleObject;
};
MissionCleanup.add(%p);
%p = new LinearProjectile() {
dataBlock = StemProjectile1;
initialDirection = "0 0 1";
initialPosition = %pos;
//sourceObject = %projectile.sourceObject;
sourceSlot = %projectile.sourceSlot;
vehicleObject = %projectile.vehicleObject;
};
MissionCleanup.add(%p);
%p = new LinearProjectile() {
dataBlock = UpperRingProjectile1;
initialDirection = "0 0 1";
initialPosition = %pos;
//sourceObject = %projectile.sourceObject;
sourceSlot = %projectile.sourceSlot;
vehicleObject = %projectile.vehicleObject;
};
MissionCleanup.add(%p);
%p = new LinearProjectile() {
dataBlock = StemProjectile2;
initialDirection = "0 0 1";
initialPosition = %pos;
//sourceObject = %projectile.sourceObject;
sourceSlot = %projectile.sourceSlot;
vehicleObject = %projectile.vehicleObject;
};
MissionCleanup.add(%p);
}
datablock ShapeBaseImageData(NuclearImage1)
{
shapeFile = "stackable1m.dts";
offset = "1.0 1.0 0.5";
rotation = "90 90 1 90";
};
datablock ShapeBaseImageData(NuclearImage2)
{
shapeFile = "turret_missile_large.dts";
offset = "0.2 2.0 0";
rotation = "0 0 0 0";
};
datablock ShapeBaseImageData(NuclearImage3)
{
shapeFile = "weapon_targeting.dts";
offset = "-0.15 0.1 0.0";
rotation = "0 100 0 1";
};
datablock ShapeBaseImageData(NuclearImage4)
{
shapeFile = "turret_tank_barrelmortar.dts";
offset = "0.2 0 0";
rotation = "0 0 0 0";
};
datablock TargetProjectileData(LaserTargeter)
{
directDamage = 0.0;
hasDamageRadius = false;
indirectDamage = 0.0;
damageRadius = 0.0;
velInheritFactor = 1.0;
maxRifleRange = 10000;
beamColor = "0.6 0.0 0.0";
startBeamWidth = 0.05;
pulseBeamWidth = 0.025;
beamFlareAngle = 0.0;
minFlareSize = 0.0;
maxFlareSize = 0.0;
pulseSpeed = 1.0;
pulseLength = 0.150;
textureName[0] = "special/nonlingradient";
textureName[1] = "special/flare";
textureName[2] = "special/pulse";
textureName[3] = "special/generic_scorch";
beacon = false;
};
function NuclearImage::onMount(%this,%obj,%slot)
{
Parent::onMount(%data,%obj,%slot);
%obj.mountImage(NuclearImage1,4);
%obj.mountImage(NuclearImage2,5);
%obj.mountImage(NuclearImage3,6);
%obj.mountImage(NuclearImage4,7);
%mVec = %obj.getMuzzleVector(0);
%mPos = %obj.getMuzzlePoint(0);
%nmVec = VectorNormalize(%mVec);
%scmVec = VectorScale(%nmVec, 1000);
%mEnd = VectorAdd(%mPos, %scmVec);
%searchResult = containerRayCast(%mPos, %mEnd, $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::TurretObjectType | $TypeMasks::ItemObjectType, 1);
%raycastPt = posFrRaycast(%searchResult);
CommandToClient(%obj.client, 'BottomPrint', "<spush><font:Sui Generis:14>>>>Arrow IV Nuclear Launch Platform<<<<spop>\n<spush><font:Arial:14>Perfect for flexing your administrative might.\nIt's a nuke. Need we say more? (Blast: 250-300 meters)<spop>", 3, 3 );
//%obj.setImageLoaded(1, true);
%t = new TargetProjectile() {
dataBlock = "LaserTargeter";
initialDirection = %obj.getMuzzleVector(%slot);
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = 6;
vehicleObject = 0;
};
MissionCleanup.add(%t);
%obj.t = %t;
}
function NuclearImage::onUnMount(%this,%obj,%slot)
{
if(isObject(%obj.t))
%obj.t.delete();
Parent::onunMount(%this,%obj,%slot);
%obj.unmountImage(4);
%obj.unmountImage(5);
%obj.unmountImage(6);
%obj.unmountImage(7);
}
function GameConnection::GiveNuclear(%cl)
{
%cl.player.MountImage(Nuclearimage,0);
}
function NuclearImage::onFire(%data,%obj,%slot) // ADDED HERE
{
%p = Parent::onFire(%data, %obj, %slot);
MissileSet.add(%p);
%target = %obj.getLockedTarget();
if(%target)
%p.setObjectTarget(%target);
else if(%obj.isLocked())
%p.setPositionTarget(%obj.getLockedPosition());
else
%p.setNoTarget();
}
function NuclearImage::onWetFire(%data, %obj, %slot)
{
%p = Parent::onFire(%data, %obj, %slot);
MissileSet.add(%p);
%target = %obj.getLockedTarget();
if(%target)
%p.setObjectTarget(%target);
else if(%obj.isLocked())
%p.setPositionTarget(%obj.getLockedPosition());
else
%p.setNoTarget();
}