mirror of
https://github.com/PhantomGamesDevelopment/TWM2.git
synced 2026-01-20 03:54:48 +00:00
323 lines
8.9 KiB
C#
323 lines
8.9 KiB
C#
// JTLmeteorStorm.cs
|
|
//
|
|
// This script (C) 2002 by JackTL
|
|
//
|
|
// Use, modify, but give credit
|
|
//
|
|
// Functions:
|
|
//
|
|
// JTLMeteorStorm(obj,forcePlayer[1/0],maxRad,numFb,dropAlt,dropAltVariance,dbName,dbType,timeOutMS,randomRot[1/0],randomPulse[1/0],maxPulse,speedVec,offsetSpeedVec[1/0])
|
|
//
|
|
|
|
datablock ParticleData(JTLMeteorStormFireballParticle) {
|
|
dragCoeffiecient = 0.0;
|
|
gravityCoefficient = -0.2;
|
|
inheritedVelFactor = 0.0;
|
|
|
|
lifetimeMS = 700;
|
|
lifetimeVarianceMS = 0;
|
|
|
|
textureName = "particleTest";
|
|
|
|
useInvAlpha = false;
|
|
spinRandomMin = -160.0;
|
|
spinRandomMax = 160.0;
|
|
|
|
animateTexture = true;
|
|
framesPerSec = 15;
|
|
|
|
animTexName[0] = "special/Explosion/exp_0016";
|
|
animTexName[1] = "special/Explosion/exp_0018";
|
|
animTexName[2] = "special/Explosion/exp_0020";
|
|
animTexName[3] = "special/Explosion/exp_0022";
|
|
animTexName[4] = "special/Explosion/exp_0024";
|
|
animTexName[5] = "special/Explosion/exp_0026";
|
|
animTexName[6] = "special/Explosion/exp_0028";
|
|
animTexName[7] = "special/Explosion/exp_0030";
|
|
animTexName[8] = "special/Explosion/exp_0032";
|
|
|
|
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";
|
|
sizes[0] = 40.0;
|
|
sizes[1] = 15.0;
|
|
sizes[2] = 7.5;
|
|
times[0] = 0.0;
|
|
times[1] = 0.2;
|
|
times[2] = 1.0;
|
|
};
|
|
|
|
datablock ParticleEmitterData(JTLMeteorStormFireballEmitter) {
|
|
ejectionPeriodMS = 5;
|
|
periodVarianceMS = 1;
|
|
|
|
ejectionVelocity = 0.25;
|
|
velocityVariance = 0.0;
|
|
|
|
thetaMin = 0.0;
|
|
thetaMax = 30.0;
|
|
|
|
particles = "JTLMeteorStormFireballParticle";
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Explosion
|
|
//--------------------------------------
|
|
|
|
datablock ParticleData(MetExplosionSmoke)
|
|
{
|
|
dragCoeffiecient = 0.4;
|
|
gravityCoefficient = -0.30; // rises slowly
|
|
inheritedVelFactor = 0.025;
|
|
|
|
lifetimeMS = 3500;
|
|
lifetimeVarianceMS = 400;
|
|
|
|
useInvAlpha = true;
|
|
spinRandomMin = -100.0;
|
|
spinRandomMax = 100.0;
|
|
|
|
textureName = "special/Smoke/bigSmoke";
|
|
|
|
colors[0] = "0.7 0.7 0.7 1.0";
|
|
colors[1] = "0.2 0.2 0.2 1.0";
|
|
colors[2] = "0.2 0.2 0.2 1.0";
|
|
colors[3] = "0.2 0.2 0.2 1.0";
|
|
colors[4] = "0.1 0.1 0.1 0.0";
|
|
colors[5] = "0.1 0.1 0.1 0.0";
|
|
sizes[0] = 15.0;
|
|
sizes[1] = 18.0;
|
|
sizes[2] = 21.0;
|
|
sizes[3] = 24.0;
|
|
sizes[4] = 27.0;
|
|
sizes[5] = 30.0;
|
|
times[0] = 0.0;
|
|
times[1] = 0.333;
|
|
times[2] = 0.666;
|
|
times[3] = 1.0;
|
|
times[4] = 1.333;
|
|
times[5] = 1.666;
|
|
};
|
|
|
|
datablock ParticleEmitterData(MetExplosionSmokeEmitter)
|
|
{
|
|
ejectionPeriodMS = 2;
|
|
periodVarianceMS = 0;
|
|
|
|
ejectionOffset = 10.0;
|
|
|
|
ejectionVelocity = 15.0;
|
|
velocityVariance = 5.0;
|
|
|
|
thetaMin = 0.0;
|
|
thetaMax = 90.0;
|
|
|
|
lifetimeMS = 1500;
|
|
|
|
particles = "MetExplosionSmoke";
|
|
};
|
|
|
|
datablock ShockwaveData(MetShockwave)
|
|
{
|
|
width = 30.0;
|
|
numSegments = 32;
|
|
numVertSegments = 6;
|
|
velocity = 500;
|
|
acceleration = 100.0;
|
|
lifetimeMS = 500;
|
|
height = 12.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.4 1.0 0.4 0.50";
|
|
colors[1] = "0.4 1.0 0.4 0.25";
|
|
colors[2] = "0.4 1.0 0.4 0.0";
|
|
|
|
mapToTerrain = true;
|
|
orientToNormal = false;
|
|
renderBottom = false;
|
|
};
|
|
|
|
datablock ExplosionData(MetSubExplosion)
|
|
{
|
|
explosionShape = "effect_plasma_explosion.dts";
|
|
faceViewer = true;
|
|
delayMS = 0;
|
|
offset = 0.0;
|
|
playSpeed = 0.15;
|
|
|
|
sizes[0] = "35.0 35.0 35.0";
|
|
sizes[1] = "35.0 35.0 35.0";
|
|
times[0] = 0.0;
|
|
times[1] = 1.0;
|
|
};
|
|
|
|
datablock ExplosionData(MetExplosion)
|
|
{
|
|
explosionShape = "effect_plasma_explosion.dts";
|
|
soundProfile = plasmaExpSound;
|
|
|
|
particleEmitter = MetExplosionSmokeEmitter;
|
|
|
|
shockwave = MetShockwave;
|
|
shockwaveOnTerrain = false;
|
|
|
|
subExplosion[0] = MetSubExplosion;
|
|
particleDensity = 150;
|
|
particleRadius = 1.25;
|
|
faceViewer = true;
|
|
|
|
sizes[0] = "55.0 55.0 55.0";
|
|
sizes[1] = "55.0 55.0 55.0";
|
|
times[0] = 0.0;
|
|
times[1] = 1.5;
|
|
};
|
|
|
|
//---------------------------------------
|
|
// Projectile
|
|
//---------------------------------------
|
|
|
|
datablock GrenadeProjectileData(JTLMeteorStormFireball) {
|
|
projectileShapeName = "plasmabolt.dts";
|
|
scale = "40.0 40.0 40.0";
|
|
emitterDelay = -1;
|
|
directDamage = 0;
|
|
directDamageType = $DamageType::Meteor;
|
|
hasDamageRadius = true; // true;
|
|
indirectDamage = 5; // 0.5;
|
|
damageRadius = 150.0;
|
|
radiusDamageType = $DamageType::Meteor;
|
|
kickBackStrength = 5000;
|
|
explosion = MetExplosion;
|
|
splash = PlasmaSplash;
|
|
baseEmitter = JTLMeteorStormFireballEmitter;
|
|
armingDelayMS = 50;
|
|
grenadeElasticity = 0.15;
|
|
grenadeFriction = 0.4;
|
|
drag = 0.1;
|
|
gravityMod = 0.0;
|
|
sound = GrenadeProjectileSound;
|
|
|
|
hasLight = true;
|
|
lightRadius = 20.0;
|
|
lightColor = "1 1 0.5";
|
|
};
|
|
|
|
function JTLMeteorStormFireball::onExplode(%data,%proj,%pos,%mod) {
|
|
// Ass-ume gravity does not change vec.. (gravityMod = 0.0) :P
|
|
%vec = vectorNormalize(%proj.initialDirection);
|
|
if (%data.hasDamageRadius)
|
|
RadiusExplosion(%proj,vectorAdd(%pos,vectorScale(%vec,-0.1)),%data.damageRadius,%data.indirectDamage,%data.kickBackStrength,%proj.sourceObject,%data.radiusDamageType);
|
|
%pPos = %proj.getPosition();
|
|
%surface = containerRayCast(vectorAdd(%pPos,vectorScale(%vec,-0.1)),vectorAdd(%pPos,vectorScale(%vec,1)),-1,%proj);
|
|
%tObj = firstWord(%surface);
|
|
if (isObject(%tObj))
|
|
%tObj.damage(%proj,%pPos,0.4,%proj.getDataBlock().directDamageType);
|
|
// ionStormBeam(vectorAdd(%pPos,"0 0" SPC $IonStorm::Height));
|
|
}
|
|
|
|
function JTLMeteorStorm (%obj,%forcePlayer,%maxRad,%numFb,%dropAlt,%dropAltVariance,%dbName,%dbType,%timeOutMS,%randomRot,%randomPulse,%maxPulse,%speedVec,%offsetSpeedVec,%createFB,%pos,%target) {
|
|
%pi = 3.1415926535897932384626433832795; // Whoa..
|
|
if (%createFB) {
|
|
if (%randomRot)
|
|
%rot = "0 0 1" SPC getRandom() * (%pi * 2);
|
|
else
|
|
%rot = "1 0 0 0";
|
|
%fb = new (%dbType) (JTLMeteor) {
|
|
dataBlock = %dbName;
|
|
position = %pos; // Needed for non-projectile types
|
|
initialPosition = %pos;
|
|
initialDirection = %speedVec;
|
|
// sourceObject = 0;
|
|
sourceSlot = 0;
|
|
vehicleObject = 0;
|
|
};
|
|
if (isObject(%target) && $JTLMeteorStormSeek == 1 && %dbType $= "SeekerProjectile")
|
|
%fb.setObjectTarget(%target);
|
|
%fb.setRotation(%rot);
|
|
if (%randomPulse) {
|
|
%pulse = getRandom() * %maxPulse;
|
|
%iPos = vectorNormalize((getRandom() * 2) - 1 SPC (getRandom() * 2) - 1 SPC (getRandom() * 2) - 1);
|
|
%iPos = vectorAdd(%pos,%iPos);
|
|
%iVec = vectorScale(vectorNormalize(getRandom() SPC getRandom() SPC getRandom()),%pulse);
|
|
// Fix this, not for projectiles
|
|
%fb.applyImpulse(%iPos,%iVec);
|
|
}
|
|
if (%dbType $= "Item")
|
|
%fb.setVelocity(%speedVec); // Needed for non-projectile types
|
|
MissionCleanup.add(%fb);
|
|
if (%timeOutMS) {
|
|
%fb.schedule(%timeOutMS,setDamageState,Destroyed);
|
|
%fb.schedule(%timeOutMS+1000,delete);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (%forcePlayer) {
|
|
%obj = %obj.player;
|
|
}
|
|
else {
|
|
if (%obj.getClassName() $= "GameConnection" || %obj.getClassName() $= "AIConnection") {
|
|
%obj2 = %obj.getControlObject();
|
|
if (isObject(%obj2))
|
|
%obj = %obj2;
|
|
}
|
|
}
|
|
|
|
if (isObject(%obj)) {
|
|
if (%maxRad < 1)
|
|
%maxRad = 50;
|
|
if (%numFb < 1)
|
|
%numFb = 100;
|
|
if (%dropAlt < 1)
|
|
%dropAlt = 100;
|
|
if (%dropAltVariance < 1)
|
|
%dropAltVariance = 500;
|
|
if (!isObject(%dbName))
|
|
%dbName = "JTLMeteorStormFireball";
|
|
if (%dbType $= "" || %dbType $= "0")
|
|
%dbType = "GrenadeProjectile";
|
|
if (%speedVec $= "" || %speedVec $= "0")
|
|
%speedVec = "0 0 -2";
|
|
if (%maxPulse < 1)
|
|
%maxPulse = 4000;
|
|
%p = %obj.getWorldBoxCenter();
|
|
%x = getWord(%p,0);
|
|
%y = getWord(%p,1);
|
|
%z = getWord(%p,2);
|
|
for (%i = 0; %i < %numFb; %i++) {
|
|
%dVec = getRandom() * %pi * 2;
|
|
%dRad = getRandom() * %maxRad;
|
|
%dX =mSin(%dVec) * %dRad;
|
|
%dY =mCos(%dVec) * %dRad;
|
|
%dZ =%dropAlt + (getRandom() * %dropAltVariance);
|
|
if (%offsetSpeedVec) {
|
|
%v2 = vectorCross(vectorNormalize(%speedVec),"1 0 0");
|
|
%v3 = vectorCross(vectorNormalize(%speedVec),%v2);
|
|
%dPos = vectorAdd(%p,vectorScale(vectorNormalize(%speedVec),-%dZ));
|
|
%dPos = vectorAdd(%dPos,vectorScale(%v2,%dX));
|
|
%dPos = vectorAdd(%dPos,vectorScale(%v3,%dY));
|
|
}
|
|
else {
|
|
%dX = %x + %dX;
|
|
%dY = %y + %dY;
|
|
%dZ = %z + %dZ;
|
|
%dPos = %dX SPC %dY SPC %dZ;
|
|
}
|
|
JTLMeteorStorm(0,0,0,0,0,0,%dbName,%dbType,%timeOutMS,%randomRot,%randomPulse,%maxPulse,%speedVec,0,true,%dPos,%obj);
|
|
}
|
|
}
|
|
else {
|
|
error("-JTLMeteorStorm- no valid object.");
|
|
error("Usage: JTLMeteorStorm(obj,forcePlayer[1/0],maxRad,numFb,dropAlt,dropAltVariance,dbName,dbType,timeOutMS,randomRot[1/0],randomPulse[1/0],maxPulse,speedVec,offsetSpeedVec[1/0])");
|
|
}
|
|
}
|