Update: Flakgun.cs has been updated with console error fixes by Mugzzzy.
Step #1
// ------------------------------------------
// inventoryHud.cs
// ------------------------------------------
1a) Add these to the top of the file.
$InvWeapon[12] = "Flakgun";
$NameToInv["Flakgun"] = "Flakgun";
1b) Add this to function buyFavorites and function buyDeployableFavorites
case Flakgun:
%client.player.setInventory( FlakgunAmmo, 400 );
Step #2
// ------------------------------------------
// weapons.cs
// ------------------------------------------
$WeaponsHudData[12, bitmapName] = "gui/hud_chaingun";
$WeaponsHudData[12, itemDataName] = "Flakgun";
$WeaponsHudData[12, ammoDataName] = "FlakgunAmmo";
$WeaponsHudCount = 13;
$AmmoIncrement[FlakgunAmmo] = 25;
exec("scripts/weapons/Flakgun.cs");
Step #3
// ------------------------------------------
// inventory.cs
// ------------------------------------------
3a) Add this with all the other 'case' in the function
function ShapeBase::hasAmmo( %this, %weapon )
{
switch$ ( %weapon )
{
case FlakGun:
return( %this.getInventory( FlakgununAmmo ) > 0 );
}
}
3b) Add this with all the other cleared items
function ShapeBase::clearInventory(%this)
{
%this.setInventory(Flakgun, 0);
%this.setInventory(FlakgunAmmo, 0);
}
3c)
function serverCmdGiveAll(%client)
{
if($TestCheats)
{
%player.setInventory(Flakgun, 1);
%player.setInventory(FlakgunAmmo, 999);
}
}
Step #4
// ------------------------------------------
// player.cs
// ------------------------------------------
4a) Add to player armor datablocks. Probably only want to give it to mediums and heavies.
Recommend 50 ammo for mediums and 100 for heavies.
max [Flakgun] = 1;
max [FlakgunAmmo] = 50;
4b) Add these to function armor::applyConcussion
if( %weaps[12] = %player.getInventory("Flakgun") > 0 ) %numWeapons++;
and
case 12:
%player.use("Flakgun");
Step #5
// ------------------------------------------
// hud.cs
// ------------------------------------------
Ignore this step if you use any server side reticle workarounds.
function clientCmdSetWeaponsHudActive(%slot)
{
weaponsHud.setActiveWeapon(%slot);
switch$($WeaponNames[%slot])
{
case "Flakgun":
reticleHud.setBitmap("gui/ret_chaingun");
reticleFrameHud.setVisible(true);
}
}
Step #6
// ------------------------------------------
// Ammopack.cs
// ------------------------------------------
Add ammo to ammopack, to increase with it.
$ammoItem[8] = FlakgunAmmo;
$numAmmoItems = 9;
datablock ItemData(AmmoPack)
{
max[FlakgunAmmo] = 50;
}
Step #7
// ------------------------------------------
// OptionsDlg.cs
// ------------------------------------------
$RemapName[$RemapCount] = "Flakgun";
$RemapCmd[$RemapCount] = "useFlakgun";
$RemapCount++;
Step #8
// ------------------------------------------
// ControlDefaults.cs
// ------------------------------------------
function useFlakgun( %val )
{
if ( %val )
use( Flakgun );
}
Step #9
// ------------------------------------------
// Projectiles.cs
// ------------------------------------------
The parts of this step handle the weapon's random firing and basing damage on heat.
9a) Change made to the onFire Function for randomizing the projectile:
function ShapeBaseImageData::onFire(%data, %obj, %slot)
{
if(%data.projectileSpread)
{
%vector = %obj.getMuzzleVector(%slot);
%x = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread;
%y = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread;
%z = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread;
%mat = MatrixCreateFromEuler(%x @ " " @ %y @ " " @ %z);
%vector = MatrixMulVector(%mat, %vector);
%p = new (%data.projectileType)() {
dataBlock = %datab;
initialDirection = %vector;
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
vehicleObject = %vehicle;
};
}
else
{
%p = new (%data.projectileType)() {
dataBlock = %datab;
initialDirection = %obj.getMuzzleVector(%slot);
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
vehicleObject = %vehicle;
};
}
}
should become
function ShapeBaseImageData::onFire(%data, %obj, %slot)
{
if(%data.item $= "Flakgun")
{
%position = %obj.getMuzzlePoint(%slot);
%vector = %obj.getMuzzleVector(%slot);
%range = (getRandom() * 300);
%x = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread;
%y = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread;
%z = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread;
%mat = MatrixCreateFromEuler(%x @ " " @ %y @ " " @ %z);
%vector = MatrixMulVector(%mat, %vector);
%endpos = VectorAdd(%position, VectorScale(%vector, %range));
%damageMasks = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType |
$TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType |
$TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType |
$TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType |
$TypeMasks::ForceFieldObjectType | $TypeMasks::StaticObjectType |
$TypeMasks::MoveableObjectType | $TypeMasks::DamagableItemObjectType;
%foundt = ContainerRayCast(%position, %endpos, %damageMasks);
if (%foundt)
{
%endpos = %obj.getMuzzlePoint(%slot);
}
%position = %endpos;
%p = new (%data.projectileType)() {
dataBlock = %data.projectile;
initialDirection = %vector;
initialPosition = %position;
sourceObject = %obj;
sourceSlot = %slot;
vehicleObject = %vehicle;
};
}
else if(%data.projectileSpread)
{
%vector = %obj.getMuzzleVector(%slot);
%x = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread;
%y = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread;
%z = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread;
%mat = MatrixCreateFromEuler(%x @ " " @ %y @ " " @ %z);
%vector = MatrixMulVector(%mat, %vector);
%p = new (%data.projectileType)() {
dataBlock = %datab;
initialDirection = %vector;
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
vehicleObject = %vehicle;
};
}
else
{
%p = new (%data.projectileType)() {
dataBlock = %datab;
initialDirection = %obj.getMuzzleVector(%slot);
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
vehicleObject = %vehicle;
};
}
}
9b) This handles the heat multiple of damaging of players (people standing around take little damage, people flying take lots):
function RadiusExplosion(%explosionSource, %position, %radius, %damage, %impulse, %sourceObject, %damageType)
{
if(%amount > 0)
%data.damageObject(%targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %explosionSource.theClient, %explosionSource);
should become:
if( %explosionSource.getDataBlock().getName() $= "FlakgunBullet" && %data.getClassName() $= "PlayerData" )
{
%amount = %amount * ((%targetObject.getHeat() * 4.0) + 0.1);
}
if(%amount > 0)
%data.damageObject(%targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %explosionSource.theClient, %explosionSource);
}
Step #10
// ------------------------------------------
// Flakgun.cs
// ------------------------------------------
Create a file called Flakgun.cs in your weapon's directory. Add all this into it.
//--------------------------------------
// Flakgun
//--------------------------------------
//--------------------------------------------------------------------------
// Force-Feedback Effects
//--------------------------------------
datablock EffectProfile(FlakgunSwitchEffect)
{
effectname = "weapons/chaingun_activate";
minDistance = 2.5;
};
datablock EffectProfile(FlakgunFireEffect)
{
effectname = "weapons/chaingun_fire";
minDistance = 4.0;
};
datablock EffectProfile(FlakgunSpinUpEffect)
{
effectname = "weapons/chaingun_spinup";
minDistance = 2.5;
};
datablock EffectProfile(FlakgunSpinDownEffect)
{
effectname = "weapons/chaingun_spindown";
minDistance = 2.5;
};
datablock EffectProfile(FlakgunDryFire)
{
effectname = "weapons/chaingun_dryfire";
minDistance = 2.5;
};
datablock EffectProfile(GrenadeExplosionEffect)
{
effectname = "explosions/grenade_explode";
minDistance = 10;
maxDistance = 35;
};
//--------------------------------------------------------------------------
// Sounds
//--------------------------------------
datablock AudioProfile(FlakgunSwitchSound)
{
filename = "fx/weapons/chaingun_activate.wav";
description = AudioClosest3d;
preload = true;
effect = FlakgunSwitchEffect;
};
datablock AudioProfile(FlakgunFireSound)
{
filename = "fx/weapons/chaingun_fire.wav";
description = AudioDefaultLooping3d;
preload = true;
effect = FlakgunFireEffect;
};
datablock AudioProfile(FlakgunProjectile)
{
filename = "fx/weapons/chaingun_projectile.wav";
description = ProjectileLooping3d;
preload = true;
};
datablock AudioProfile(FlakgunImpact)
{
filename = "fx/weapons/chaingun_impact.WAV";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(FlakgunSpinDownSound)
{
filename = "fx/weapons/chaingun_spindown.wav";
description = AudioClosest3d;
preload = true;
effect = FlakgunSpinDownEffect;
};
datablock AudioProfile(FlakgunSpinUpSound)
{
filename = "fx/weapons/chaingun_spinup.wav";
description = AudioClosest3d;
preload = true;
effect = FlakgunSpinUpEffect;
};
datablock AudioProfile(FlakgunDryFireSound)
{
filename = "fx/weapons/chaingun_dryfire.wav";
description = AudioClose3d;
preload = true;
effect = FlakgunDryFire;
};
datablock AudioProfile(ShrikeBlasterProjectileSound)
{
filename = "fx/vehicles/shrike_blaster_projectile.wav";
description = ProjectileLooping3d;
preload = true;
};
datablock AudioProfile(GrenadeExplosionSound)
{
filename = "fx/weapons/grenade_explode.wav";
description = AudioExplosion3d;
preload = true;
effect = GrenadeExplosionEffect;
};
//--------------------------------------------------------------------------
// Splash
//--------------------------------------------------------------------------
datablock ParticleData( FlakgunSplashParticle )
{
dragCoefficient = 1;
gravityCoefficient = 0.0;
inheritedVelFactor = 0.2;
constantAcceleration = -1.4;
lifetimeMS = 300;
lifetimeVarianceMS = 0;
textureName = "special/droplet";
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] = 0.05;
sizes[1] = 0.2;
sizes[2] = 0.2;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData( FlakgunSplashEmitter )
{
ejectionPeriodMS = 4;
periodVarianceMS = 0;
ejectionVelocity = 3;
velocityVariance = 1.0;
ejectionOffset = 0.0;
thetaMin = 0;
thetaMax = 50;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
orientParticles = true;
lifetimeMS = 100;
particles = "FlakgunSplashParticle";
};
datablock SplashData(FlakgunSplash)
{
numSegments = 10;
ejectionFreq = 10;
ejectionAngle = 20;
ringLifetime = 0.4;
lifetimeMS = 400;
velocity = 3.0;
startRadius = 0.0;
acceleration = -3.0;
texWrap = 5.0;
texture = "special/water2";
emitter[0] = FlakgunSplashEmitter;
colors[0] = "0.7 0.8 1.0 0.0";
colors[1] = "0.7 0.8 1.0 1.0";
colors[2] = "0.7 0.8 1.0 0.0";
colors[3] = "0.7 0.8 1.0 0.0";
times[0] = 0.0;
times[1] = 0.4;
times[2] = 0.8;
times[3] = 1.0;
};
//--------------------------------------------------------------------------
// Particle Effects
//--------------------------------------
datablock ParticleData(FlakgunFireParticle)
{
dragCoefficient = 2.75;
gravityCoefficient = 0.1;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 550;
lifetimeVarianceMS = 0;
textureName = "particleTest";
colors[0] = "0.46 0.36 0.26 1.0";
colors[1] = "0.46 0.36 0.26 0.0";
sizes[0] = 0.25;
sizes[1] = 0.20;
};
datablock ParticleEmitterData(FlakgunFireEmitter)
{
ejectionPeriodMS = 6;
periodVarianceMS = 0;
ejectionVelocity = 10;
velocityVariance = 1.0;
ejectionOffset = 0.0;
thetaMin = 0;
thetaMax = 12;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvance = true;
particles = "FlakgunFireParticle";
};
datablock ParticleData(GrenadeDust)
{
dragCoefficient = 1.0;
gravityCoefficient = -0.01;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 1000;
lifetimeVarianceMS = 100;
useInvAlpha = true;
spinRandomMin = -90.0;
spinRandomMax = 500.0;
textureName = "particleTest";
colors[0] = "0.3 0.3 0.275 0.5";
colors[1] = "0.3 0.425 0.27 0.5";
colors[2] = "0.3 0.345 0.574 0.234";
sizes[0] = 3.2;
sizes[1] = 4.6;
sizes[2] = 5.0;
times[0] = 0.0;
times[1] = 0.7;
times[2] = 1.0;
};
datablock ParticleData( GDebrisSmokeParticle )
{
dragCoeffiecient = 1.0;
gravityCoefficient = 0.0;
inheritedVelFactor = 0.2;
lifetimeMS = 1000;
lifetimeVarianceMS = 100;
textureName = "particleTest";
useInvAlpha = true;
spinRandomMin = -60.0;
spinRandomMax = 60.0;
colors[0] = "0.234 0.4 0.4 1.0";
colors[1] = "0.762 1.0 0.3 0.5";
colors[2] = "0.65 0.234 0.0 0.0";
sizes[0] = 0.0;
sizes[1] = 1.0;
sizes[2] = 1.0;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
//--------------------------------------------------------------------------
// Explosions
//--------------------------------------
datablock ParticleData(FlakgunExplosionParticle1)
{
dragCoefficient = 0.65;
gravityCoefficient = 0.3;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 500;
lifetimeVarianceMS = 150;
textureName = "particleTest";
colors[0] = "0.56 0.36 0.26 1.0";
colors[1] = "0.56 0.36 0.26 0.0";
sizes[0] = 0.0625;
sizes[1] = 0.2;
};
datablock ParticleEmitterData(FlakgunExplosionEmitter)
{
ejectionPeriodMS = 10;
periodVarianceMS = 0;
ejectionVelocity = 0.75;
velocityVariance = 0.25;
ejectionOffset = 0.0;
thetaMin = 0;
thetaMax = 60;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
particles = "FlakgunExplosionParticle1";
};
datablock ParticleData(FlakgunImpactSmokeParticle)
{
dragCoefficient = 0.0;
gravityCoefficient = -0.2;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 1000;
lifetimeVarianceMS = 200;
useInvAlpha = true;
spinRandomMin = -90.0;
spinRandomMax = 90.0;
textureName = "particleTest";
colors[0] = "0.7 0.7 0.7 0.0";
colors[1] = "0.7 0.7 0.7 0.4";
colors[2] = "0.7 0.7 0.7 0.0";
sizes[0] = 0.5;
sizes[1] = 0.5;
sizes[2] = 1.0;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(FlakgunImpactSmoke)
{
ejectionPeriodMS = 8;
periodVarianceMS = 1;
ejectionVelocity = 1.0;
velocityVariance = 0.5;
ejectionOffset = 0.0;
thetaMin = 0;
thetaMax = 35;
overrideAdvances = false;
particles = "FlakgunImpactSmokeParticle";
lifetimeMS = 50;
};
datablock ParticleData(FlakgunSparks)
{
dragCoefficient = 1;
gravityCoefficient = 0.0;
inheritedVelFactor = 0.2;
constantAcceleration = 0.0;
lifetimeMS = 300;
lifetimeVarianceMS = 0;
textureName = "special/spark00";
colors[0] = "0.56 0.36 0.26 1.0";
colors[1] = "0.56 0.36 0.26 1.0";
colors[2] = "1.0 0.36 0.26 0.0";
sizes[0] = 0.6;
sizes[1] = 0.2;
sizes[2] = 0.05;
times[0] = 0.0;
times[1] = 0.2;
times[2] = 1.0;
};
datablock ParticleEmitterData(FlakgunSparkEmitter)
{
ejectionPeriodMS = 4;
periodVarianceMS = 0;
ejectionVelocity = 4;
velocityVariance = 2.0;
ejectionOffset = 0.0;
thetaMin = 0;
thetaMax = 50;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
orientParticles = true;
lifetimeMS = 100;
particles = "FlakgunSparks";
};
datablock ShockwaveData(ScoutFlakgunHit)
{
width = 0.5;
numSegments = 13;
numVertSegments = 1;
velocity = 0.5;
acceleration = 2.0;
lifetimeMS = 900;
height = 0.1;
verticalCurve = 0.5;
mapToTerrain = false;
renderBottom = false;
orientToNormal = true;
texture[0] = "special/shockwave5";
texture[1] = "special/gradient";
texWrap = 3.0;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
colors[0] = "0.6 0.6 1.0 1.0";
colors[1] = "0.6 0.3 1.0 0.5";
colors[2] = "0.0 0.0 1.0 0.0";
};
datablock ParticleData(ScoutFlakgunExplosionParticle1)
{
dragCoefficient = 2;
gravityCoefficient = 0.0;
inheritedVelFactor = 0.2;
constantAcceleration = -0.0;
lifetimeMS = 600;
lifetimeVarianceMS = 000;
textureName = "special/crescent4";
colors[0] = "0.6 0.6 1.0 1.0";
colors[1] = "0.6 0.3 1.0 1.0";
colors[2] = "0.0 0.0 1.0 0.0";
sizes[0] = 0.25;
sizes[1] = 0.5;
sizes[2] = 1.0;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(ScoutFlakgunExplosionEmitter)
{
ejectionPeriodMS = 10;
periodVarianceMS = 0;
ejectionVelocity = 2;
velocityVariance = 1.5;
ejectionOffset = 0.0;
thetaMin = 80;
thetaMax = 90;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
orientParticles = true;
lifetimeMS = 200;
particles = "ScoutFlakgunExplosionParticle1";
};
datablock ExplosionData(ScoutFlakgunExplosion)
{
soundProfile = blasterExpSound;
shockwave = ScoutFlakgunHit;
emitter[0] = ScoutFlakgunExplosionEmitter;
};
datablock ParticleEmitterData( FlakDebrisSmokeEmitter )
{
ejectionPeriodMS = 7;
periodVarianceMS = 1;
ejectionVelocity = 1.0; // A little oomph at the back end
velocityVariance = 0.2;
thetaMin = 0.0;
thetaMax = 40.0;
particles = "GDebrisSmokeParticle";
};
//--------------------------------------------------------------------------
// Particle effects
//--------------------------------------
datablock DebrisData( ShellDebris )
{
shapeName = "weapon_Chaingun_ammocasing.dts";
lifetime = 3.0;
minSpinSpeed = 300.0;
maxSpinSpeed = 400.0;
elasticity = 0.5;
friction = 0.2;
numBounces = 3;
fade = true;
staticOnMaxBounce = true;
snapOnMaxBounce = true;
};
datablock DebrisData( GrenadeDebris )
{
emitters[0] = FlakDebrisSmokeEmitter;
explodeOnMaxBounce = true;
elasticity = 0.4;
friction = 0.2;
lifetime = 0.3;
lifetimeVariance = 0.02;
numBounces = 1;
};
datablock ParticleEmitterData(FlakGrenadeDustEmitter)
{
ejectionPeriodMS = 5;
periodVarianceMS = 0;
ejectionVelocity = 15.0;
velocityVariance = 0.0;
ejectionOffset = 0.0;
thetaMin = 85;
thetaMax = 85;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
lifetimeMS = 250;
particles = "GrenadeDust";
};
datablock ParticleData(GrenadeSparks)
{
dragCoefficient = 1;
gravityCoefficient = 0.0;
inheritedVelFactor = 0.2;
constantAcceleration = 0.0;
lifetimeMS = 500;
lifetimeVarianceMS = 350;
textureName = "special/bigspark";
colors[0] = "0.56 0.36 0.26 1.0";
colors[1] = "0.236 0.36 0.2 1.0";
colors[2] = "1.0 0.274 0.2 0.2";
sizes[0] = 0.5;
sizes[1] = 0.5;
sizes[2] = 0.75;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(FlakGrenadeSparksEmitter)
{
ejectionPeriodMS = 2;
periodVarianceMS = 0;
ejectionVelocity = 12;
velocityVariance = 6.75;
ejectionOffset = 0.0;
thetaMin = 0;
thetaMax = 60;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
orientParticles = true;
lifetimeMS = 100;
particles = "GrenadeSparks";
};
//--------------------------------------------------------------------------
// Projectile
//--------------------------------------
datablock DecalData(FlakgunDecal1)
{
sizeX = 0.05;
sizeY = 0.05;
textureName = "special/bullethole1";
};
datablock DecalData(FlakgunDecal2) : FlakgunDecal1
{
textureName = "special/bullethole2";
};
datablock DecalData(FlakgunDecal3) : FlakgunDecal1
{
textureName = "special/bullethole3";
};
datablock DecalData(FlakgunDecal4) : FlakgunDecal1
{
textureName = "special/bullethole4";
};
datablock DecalData(FlakgunDecal5) : FlakgunDecal1
{
textureName = "special/bullethole5";
};
datablock DecalData(FlakgunDecal6) : FlakgunDecal1
{
textureName = "special/bullethole6";
};
datablock ParticleData(FlakSmokeParticle)
{
dragCoeffiecient = 0.0;
gravityCoefficient = -0.2; // rises slowly
inheritedVelFactor = 0.00;
lifetimeMS = 700; // lasts 2 second
lifetimeVarianceMS = 150; // ...more or less
textureName = "particleTest";
useInvAlpha = true;
spinRandomMin = -30.0;
spinRandomMax = 30.0;
colors[0] = "0.9 0.9 0.9 1.0";
colors[1] = "0.6 0.6 0.6 1.0";
colors[2] = "0.4 0.4 0.4 0.0";
sizes[0] = 10;
sizes[1] = 23.5;
sizes[2] = 45.0;
times[0] = 0.0;
times[1] = 0.2;
times[2] = 1.0;
};
datablock ParticleEmitterData(FlakSmokeEmitter)
{
ejectionPeriodMS = 15;
periodVarianceMS = 5;
ejectionVelocity = 1.25;
velocityVariance = 0.50;
thetaMin = 0.0;
thetaMax = 90.0;
particles = "FlakSmokeParticle";
};
datablock ExplosionData(FlakgunExplosion)
{
soundProfile = GrenadeExplosionSound;
faceViewer = true;
explosionScale = "0.8 0.8 0.8";
debris = GrenadeDebris;
debrisThetaMin = 10;
debrisThetaMax = 50;
debrisNum = 8;
debrisVelocity = 26.0;
debrisVelocityVariance = 7.0;
emitter[0] = FlakGrenadeDustEmitter;
emitter[1] = FlakSmokeEmitter;
emitter[2] = FlakGrenadeSparksEmitter;
shakeCamera = true;
camShakeFreq = "10.0 6.0 9.0";
camShakeAmp = "20.0 20.0 20.0";
camShakeDuration = 0.25;
camShakeRadius = 10.0;
};
datablock TracerProjectileData(FlakgunBullet)
{
doDynamicClientHits = true;
directDamageType = $DamageType::chaingun;
splash = FlakgunSplash;
kickBackStrength = 0.0;
sound = FlakgunProjectile;
dryVelocity = 425.0;
wetVelocity = 100.0;
velInheritFactor = 1.0;
fizzleTimeMS = 200;
lifetimeMS = 200;
explodeOnDeath = true;
explosion = FlakgunExplosion;
radiusDamageType = $DamageType::chaingun;
directDamage = 0.0;
hasDamageRadius = true;
indirectDamage = 0.45;
damageRadius = 45;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = false;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = 3000;
tracerLength = 15.0;
tracerAlpha = false;
tracerMinPixels = 6;
tracerColor = 211.0/255.0 @ " " @ 215.0/255.0 @ " " @ 120.0/255.0 @ " 0.75";
tracerTex[0] = "special/tracer00";
tracerTex[1] = "special/tracercross";
tracerWidth = 0.30;
crossSize = 0.007;
crossViewAng = 0.990;
renderCross = true;
decalData[0] = FlakgunDecal1;
decalData[1] = FlakgunDecal2;
decalData[2] = FlakgunDecal3;
decalData[3] = FlakgunDecal4;
decalData[4] = FlakgunDecal5;
decalData[5] = FlakgunDecal6;
};
//--------------------------------------------------------------------------
// Ammo
//--------------------------------------
datablock ItemData(FlakgunAmmo)
{
className = Ammo;
catagory = "Ammo";
shapeFile = "ammo_chaingun.dts";
mass = 1;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 2;
pickUpName = "some flakgun ammo";
computeCRC = true;
};
//--------------------------------------------------------------------------
// Weapon
//--------------------------------------
datablock ShapeBaseImageData(FlakgunImage)
{
className = WeaponImage;
shapeFile = "weapon_chaingun.dts";
item = Flakgun;
showname = "Flakgun";
ammo = flakgunAmmo;
projectile = flakgunBullet;
projectileType = TracerProjectile;
emap = true;
casing = ShellDebris;
shellExitDir = "1.0 0.3 1.0";
shellExitOffset = "0.15 -0.56 -0.1";
shellExitVariance = 15.0;
shellVelocity = 3.0;
projectileSpread = 70.0 / 1000.0;
//--------------------------------------
stateName[0] = "Activate";
stateSequence[0] = "Activate";
stateSound[0] = FlakgunSwitchSound;
stateAllowImageChange[0] = false;
//
stateTimeoutValue[0] = 0.5;
stateTransitionOnTimeout[0] = "Ready";
stateTransitionOnNoAmmo[0] = "NoAmmo";
//--------------------------------------
stateName[1] = "Ready";
stateSpinThread[1] = Stop;
//
stateTransitionOnTriggerDown[1] = "Spinup";
stateTransitionOnNoAmmo[1] = "NoAmmo";
//--------------------------------------
stateName[2] = "NoAmmo";
stateTransitionOnAmmo[2] = "Ready";
stateSpinThread[2] = Stop;
stateTransitionOnTriggerDown[2] = "DryFire";
//--------------------------------------
stateName[3] = "Spinup";
stateSpinThread[3] = SpinUp;
stateSound[3] = FlakgunSpinupSound;
//
stateTimeoutValue[3] = 0.5;
stateWaitForTimeout[3] = false;
stateTransitionOnTimeout[3] = "Fire";
stateTransitionOnTriggerUp[3] = "Spindown";
//--------------------------------------
stateName[4] = "Fire";
stateSequence[4] = "Fire";
stateSequenceRandomFlash[4] = true;
stateSpinThread[4] = FullSpeed;
stateSound[4] = FlakgunFireSound;
//stateRecoil[4] = LightRecoil;
stateAllowImageChange[4] = false;
stateScript[4] = "onFire";
stateFire[4] = true;
stateEjectShell[4] = true;
//
stateTimeoutValue[4] = 0.375;
stateTransitionOnTimeout[4] = "Fire";
stateTransitionOnTriggerUp[4] = "Spindown";
stateTransitionOnNoAmmo[4] = "EmptySpindown";
//--------------------------------------
stateName[5] = "Spindown";
stateSound[5] = FlakgunSpinDownSound;
stateSpinThread[5] = SpinDown;
//
stateTimeoutValue[5] = 1.0;
stateWaitForTimeout[5] = true;
stateTransitionOnTimeout[5] = "Ready";
stateTransitionOnTriggerDown[5] = "Spinup";
//--------------------------------------
stateName[6] = "EmptySpindown";
stateSound[6] = FlakgunSpinDownSound;
stateSpinThread[6] = SpinDown;
//
stateTimeoutValue[6] = 0.5;
stateTransitionOnTimeout[6] = "NoAmmo";
//--------------------------------------
stateName[7] = "DryFire";
stateSound[7] = FlakgunDryFireSound;
stateTimeoutValue[7] = 0.5;
stateTransitionOnTimeout[7] = "NoAmmo";
};
datablock ItemData(Flakgun)
{
className = Weapon;
catagory = "Spawn Items";
shapeFile = "weapon_chaingun.dts";
image = FlakgunImage;
mass = 1;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 2;
pickUpName = "a flakgun";
computeCRC = true;
emap = true;
};