Author Topic: creating first add-on  (Read 890 times)

hey guys
alright so i need some assistance with this addon im creating
its an edit of the spear; but its for educational purposes
known issues --
when spear is enabled in server, it does not load any sounds or have any particles.
spear overwrites a bunch of the things, not sure whats causing it; can someone explain this issue?
Code: [Select]
//superspear.cs


datablock AudioProfile(spearExplosionSound)
{
   filename    = "./spearHit.wav";
   description = AudioClose3d;
   preload = false;
};

datablock AudioProfile(spearFireSound)
{
   filename    = "./spearFire.wav";
   description = AudioClose3d;
   preload = true;
};


//spear trail
datablock ParticleData(spearTrailParticle)
{
dragCoefficient = 3.0;
windCoefficient = 0.0;
gravityCoefficient = 0.0;
inheritedVelFactor = 1.0;
constantAcceleration = 0.0;
lifetimeMS = 3600;
lifetimeVarianceMS = 0;
spinSpeed = 10.0;
spinRandomMin = -50.0;
spinRandomMax = 50.0;
useInvAlpha = true;
animateTexture = false;
//framesPerSec = 1;

textureName = "base/data/particles/star1";
//animTexName = " ";

// Interpolation variables
colors[0] = "1 1 1 1";
colors[1] = "1 1 0.9 1";
colors[2] = "1 1 0 0.0";
sizes[0] = 0.15;
sizes[1] = 0.35;
sizes[2] = 0.05;
times[0] = 0.0;
times[1] = 0.1;
times[2] = 3.0;
};

datablock ParticleEmitterData(spearTrailEmitter)
{
   ejectionPeriodMS = 3;
   periodVarianceMS = 0;

   ejectionVelocity = 0.3; //0.25;
   velocityVariance = 0; //0.10;

   ejectionOffset = 0.3;

   thetaMin         = 0.0;
   thetaMax         = 90.0; 

   particles = spearTrailParticle;

   useEmitterColors = true;
   uiName = "Spear Trail";
};


//effects
datablock ParticleData(spearExplosionParticle)
{
dragCoefficient = 3.0;
windCoefficient = 0.0;
gravityCoefficient = 0.5;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 2900;
lifetimeVarianceMS = 300;
spinSpeed = 10.0;
spinRandomMin = -50.0;
spinRandomMax = 50.0;
useInvAlpha = true;
animateTexture = false;
//framesPerSec = 1;

textureName = "base/data/particles/star1";
//animTexName = " ";

// Interpolation variables
colors[0] = "1 1 1 0.9";
colors[1] = "1 1 1 0.0";
sizes[0] = 4.0;
sizes[1] = 7.0;
times[0] = 0.0;
times[1] = 2.0;
};

datablock ParticleEmitterData(spearExplosionEmitter)
{
   ejectionPeriodMS = 7;
   periodVarianceMS = 0;
   lifeTimeMS    = 100;
   ejectionVelocity = 8;
   velocityVariance = 1.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "spearExplosionParticle";

   uiName = "Spear Smoke";
   emitterNode = TenthEmitterNode;
};

datablock ParticleData(spearExplosionParticle2)
{
dragCoefficient = 0.1;
windCoefficient = 0.0;
gravityCoefficient = 2.0;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 3000;
lifetimeVarianceMS = 100;
spinSpeed = 10.0;
spinRandomMin = -50.0;
spinRandomMax = 50.0;
useInvAlpha = true;
animateTexture = false;
//framesPerSec = 1;

textureName = "base/data/particles/star1";
//animTexName = " ";

// Interpolation variables
colors[0] = "1 1 1 1.0";
colors[1] = "1 1 1 0.0";
sizes[0] = 0.5;
sizes[1] = 0.5;
times[0] = 0.0;
times[1] = 1.0;
};

datablock ParticleEmitterData(spearExplosionEmitter2)
{
   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   lifetimeMS       = 70;
   ejectionVelocity = 15;
   velocityVariance = 5.0;
   ejectionOffset   = 1.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "spearExplosionParticle2";

   useEmitterColors = true;
   uiName = "Spear Chunk";
   emitterNode = HalfEmitterNode;
};

datablock ExplosionData(spearExplosion)
{
   //explosionShape = "";
   lifeTimeMS = 150;

   soundProfile = spearExplosionSound;

   emitter[0] = spearExplosionEmitter;
   emitter[1] = sspearExplosionEmitter2;
   //particleDensity = 30;
   //particleRadius = 1.0;

   faceViewer     = true;
   explosionScale = "1 1 1";

   shakeCamera = true;
   camShakeFreq = "7.0 8.0 7.0";
   camShakeAmp = "1.0 1.0 1.0";
   camShakeDuration = 0.5;
   camShakeRadius = 15.0;

   // Dynamic light
   lightStartRadius = 4;
   lightEndRadius = 3;
   lightStartColor = "0.45 0.3 0.1";
   lightEndColor = "0 0 0";

   //impulse
   impulseRadius = 1;
   impulseForce = 800;

   //radius damage
   radiusDamage        = 20;
   damageRadius        = 3;
};

//projectile
AddDamageType("superSpearDirect",   '<bitmap:add-ons/Weapon_Spear/CI_spear> %1',       '%2 <bitmap:add-ons/Weapon_Spear/CI_spear> %1',1,1);
AddDamageType("superSpearRadius",   '<bitmap:add-ons/Weapon_Spear/CI_spearRadius> %1', '%2 <bitmap:add-ons/Weapon_Spear/CI_spearRadius> %1',1,0);
datablock ProjectileData(superspearProjectile)
{
   projectileShapeName = "./spearProjectile.dts";
   directDamage        = 10;
   directDamageType  = $DamageType::superSpearDirect;
   radiusDamageType  = $DamageType::superSpearRadius;
   impactImpulse    = 1000;
   verticalImpulse    = 1000;
   explosion           = spearExplosion;
   particleEmitter     = spearTrailEmitter;

   brickExplosionRadius = 2;
   brickExplosionImpact = true; //destroy a brick if we hit it directly?
   brickExplosionForce  = 20;
   brickExplosionMaxVolume = 5000;
   brickExplosionMaxVolumeFloating = 5000;

   muzzleVelocity      = 50;
   velInheritFactor    = 1;

   armingDelay         = 0;
   lifetime            = 20000;
   fadeDelay           = 19500;
   bounceElasticity    = 0;
   bounceFriction      = 0;
   isBallistic         = true;
   gravityMod = 0.80;

   hasLight    = true;
   lightRadius = 3;
   lightColor  = "1 1 1";

   uiName = "SuperSpear";
};


//////////
// item //
//////////
datablock ItemData(superspearItem)
{
category = "Weapon";  // Mission editor category
className = "Weapon"; // For inventory system

// Basic Item Properties
shapeFile = "./spear.dts";
mass = 1;
density = 0.2;
elasticity = 0.2;
friction = 0.6;
emap = true;

//gui stuff
uiName = "SuperSpear";
iconName = "./icon_spear";
doColorShift = true;
colorShiftColor = "0.400 0.196 0 1.000";

// Dynamic properties defined by the scripts
image = superspearImage;
canDrop = true;
};

//function spear::onUse(%this,%user)
//{
// //mount the image in the right hand slot
// %user.mountimage(%this.image, $RightHandSlot);
//}

////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(superspearImage)
{
   // Basic Item properties
   shapeFile = "./spear.dts";
   emap = true;

   // Specify mount point & offset for 3rd person, and eye offset
   // for first person rendering.
   mountPoint = 0;
   offset = "0 0 0";
   //eyeOffset = "0.1 0.2 -0.55";

   // When firing from a point offset from the eye, muzzle correction
   // will adjust the muzzle vector to point to the eye LOS point.
   // Since this weapon doesn't actually fire from the muzzle point,
   // we need to turn this off. 
   correctMuzzleVector = true;

   // Add the WeaponImage namespace as a parent, WeaponImage namespace
   // provides some hooks into the inventory system.
   className = "WeaponImage";

   // Projectile && Ammo.
   item = superspearItem;
   ammo = " ";
   projectile = superspearProjectile;
   projectileType = Projectile;

   //melee particles shoot from eye node for consistancy
   melee = false;
   //raise your arm up or not
   armReady = true;

   //casing = " ";
   doColorShift = true;
   colorShiftColor = "0.400 0.196 0 1.000";

   // Images have a state system which controls how the animations
   // are run, which sounds are played, script callbacks, etc. This
   // state system is downloaded to the client so that clients can
   // predict state changes and animate accordingly.  The following
   // system supports basic ready->fire->reload transitions as
   // well as a no-ammo->dryfire idle state.

   // Initial start up state
stateName[0] = "Activate";
stateTimeoutValue[0] = 0;
stateTransitionOnTimeout[0] = "Ready";
stateSequence[0] = "ready";
stateSound[0] = weaponSwitchSound;

stateName[1] = "Ready";
stateTransitionOnTriggerDown[1] = "Charge";
stateAllowImageChange[1] = true;

stateName[2]                    = "Charge";
stateTransitionOnTimeout[2] = "Armed";
stateTimeoutValue[2]            = 0;
stateWaitForTimeout[2] = false;
stateTransitionOnTriggerUp[2] = "AbortCharge";
stateScript[2]                  = "onCharge";
stateAllowImageChange[2]        = false;

stateName[3] = "AbortCharge";
stateTransitionOnTimeout[3] = "Ready";
stateTimeoutValue[3] = 0;
stateWaitForTimeout[3] = true;
stateScript[3] = "onAbortCharge";
stateAllowImageChange[3] = false;

stateName[4] = "Armed";
stateTransitionOnTriggerUp[4] = "Fire";
stateAllowImageChange[4] = false;

stateName[5] = "Fire";
stateTransitionOnTimeout[5] = "Ready";
stateTimeoutValue[5] = 0.1;
stateFire[5] = true;
stateSequence[5] = "fire";
stateScript[5] = "onFire";
stateWaitForTimeout[5] = true;
stateAllowImageChange[5] = false;
stateSound[5] = spearFireSound;
};

function spearImage::onCharge(%this, %obj, %slot)
{
%obj.playthread(2, spearReady);
}

function spearImage::onAbortCharge(%this, %obj, %slot)
{
%obj.playthread(2, root);
}

function spearImage::onFire(%this, %obj, %slot)
{
%obj.playthread(2, spearThrow);
Parent::onFire(%this, %obj, %slot);
}

new problems emerging as i solve old ones
1 : fixed some stuff, projectiles appear now but they aren't the costum ones i set it to.
2 : ok new problem, projectile wont spawn, console says "superSpearImage has invalid projectile"
oh i guess i shouldn't rename it to superSpearImage, tryin that.

oh god its getting worse
1 : ok so it wasn't superspearimage
2 : it kindof was but im not sure what the problem is anymore
3 : holy forget the item wont even appear in my inventory anymore
senfd help
Code: [Select]
//superspear.cs


datablock AudioProfile(spearExplosionSound)
{
   filename    = "./spearHit.wav";
   description = AudioClose3d;
   preload = false;
};

datablock AudioProfile(spearFireSound)
{
   filename    = "./spearFire.wav";
   description = AudioClose3d;
   preload = true;
};


//spear trail
datablock ParticleData(spearTrailParticle)
{
dragCoefficient = 1.0;
windCoefficient = 0.0;
gravityCoefficient = 2.4;
inheritedVelFactor = 0.3;
constantAcceleration = 0.3;
lifetimeMS = 3400;
lifetimeVarianceMS = 0;
spinSpeed = 70.0;
spinRandomMin = -350.0;
spinRandomMax = 350.0;
useInvAlpha = true;
animateTexture = false;
//framesPerSec = 1;

textureName = "base/data/particles/star1";
//animTexName = " ";

// Interpolation variables
colors[0] = "1 1 1 1";
colors[1] = "1 1 0.9 1";
colors[2] = "1 1 0 0.0";
sizes[0] = 0.15;
sizes[1] = 0.35;
sizes[2] = 0.65;
times[0] = 0.0;
times[1] = 0.1;
times[2] = 3.3;
};

datablock ParticleEmitterData(spearTrailEmitter)
{
   ejectionPeriodMS = 3;
   periodVarianceMS = 0;

   ejectionVelocity = 0.3; //0.25;
   velocityVariance = 0; //0.10;

   ejectionOffset = 0.05;

   thetaMin         = 0.0;
   thetaMax         = 90.0; 

   particles = spearTrailParticle;

   useEmitterColors = true;
   uiName = "Spear Trail";
};


//effects
datablock ParticleData(spearExplosionParticle)
{
dragCoefficient = 0.1;
windCoefficient = 0.0;
gravityCoefficient = -0.1;
inheritedVelFactor = 0.7;
constantAcceleration = 0.1;
lifetimeMS = 2900;
lifetimeVarianceMS = 300;
spinSpeed = 20.0;
spinRandomMin = -100.0;
spinRandomMax = 100.0;
useInvAlpha = true;
animateTexture = false;
//framesPerSec = 1;

textureName = "base/data/particles/star1";
//animTexName = " ";

// Interpolation variables
colors[0] = "1 1 1 0.9";
colors[1] = "1 1 1 0.0";
sizes[0] = 4.0;
sizes[1] = 7.0;
times[0] = 0.0;
times[1] = 2.0;
};

datablock ParticleEmitterData(spearExplosionEmitter)
{
   ejectionPeriodMS = 7;
   periodVarianceMS = 0;
   lifeTimeMS    = 100;
   ejectionVelocity = 8;
   velocityVariance = 1.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "spearExplosionParticle";

   uiName = "Spear Smoke";
   emitterNode = TenthEmitterNode;
};

datablock ParticleData(spearExplosionParticle2)
{
dragCoefficient = 0.1;
windCoefficient = 0.0;
gravityCoefficient = 2.0;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 3000;
lifetimeVarianceMS = 100;
spinSpeed = 10.0;
spinRandomMin = -50.0;
spinRandomMax = 50.0;
useInvAlpha = true;
animateTexture = false;
//framesPerSec = 1;

textureName = "base/data/particles/star1";
//animTexName = " ";

// Interpolation variables
colors[0] = "1 1 1 1.0";
colors[1] = "1 1 1 0.0";
sizes[0] = 0.5;
sizes[1] = 0.5;
times[0] = 0.0;
times[1] = 1.0;
};

datablock ParticleEmitterData(spearExplosionEmitter2)
{
   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   lifetimeMS       = 70;
   ejectionVelocity = 15;
   velocityVariance = 5.0;
   ejectionOffset   = 1.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "spearExplosionParticle2";

   useEmitterColors = true;
   uiName = "Spear Chunk";
   emitterNode = HalfEmitterNode;
};

datablock ExplosionData(spearExplosion)
{
   //explosionShape = "";
   lifeTimeMS = 150;

   soundProfile = spearExplosionSound;

   emitter[0] = spearExplosionEmitter;
   emitter[1] = spearExplosionEmitter2;
   //particleDensity = 30;
   //particleRadius = 3.0;

   faceViewer     = true;
   explosionScale = "1 1 1";

   shakeCamera = true;
   camShakeFreq = "17.0 18.0 17.0";
   camShakeAmp = "1.0 1.0 1.0";
   camShakeDuration = 0.2;
   camShakeRadius = 15.0;

   // Dynamic light
   lightStartRadius = 6;
   lightEndRadius = 3;
   lightStartColor = "1 1 1";
   lightEndColor = "0 0 0";

   //impulse
   impulseRadius = 20;
   impulseForce = 500;

   //radius damage
   radiusDamage        = 20;
   damageRadius        = 10;
};

//projectile
AddDamageType("superSpearDirect",   '<bitmap:add-ons/Weapon_superSpear/CI_spear> %1',       '%2 <bitmap:add-ons/Weapon_superSpear/CI_spear> %1',1,1);
AddDamageType("superSpearRadius",   '<bitmap:add-ons/Weapon_superSpear/CI_spearRadius> %1', '%2 <bitmap:add-ons/Weapon_superSpear/CI_spearRadius> %1',1,0);
datablock ProjectileData(superspearProjectile)
{
   projectileShapeName = "./spearProjectile.dts";
   directDamage        = 10;
   directDamageType  = $DamageType::superSpearDirect;
   radiusDamageType  = $DamageType::superSpearRadius;
   impactImpulse    = 1000;
   verticalImpulse    = 1000;
   explosion           = spearExplosion;
   particleEmitter     = spearTrailEmitter;

   brickExplosionRadius = 2;
   brickExplosionImpact = true; //destroy a brick if we hit it directly?
   brickExplosionForce  = 20;
   brickExplosionMaxVolume = 500390;
   brickExplosionMaxVolumeFloating = 500390;

   muzzleVelocity      = 75;
   velInheritFactor    = 1;

   armingDelay         = 0;
   lifetime            = 20000;
   fadeDelay           = 19500;
   bounceElasticity    = 0;
   bounceFriction      = 0;
   isBallistic         = true;
   gravityMod = 0.80;

   hasLight    = true;
   lightRadius = 5;
   lightColor  = "1 1 1";

   uiName = "SuperSpear";
};


//////////
// item //
//////////
datablock ItemData(superspearItem)
{
category = "Weapon";  // Mission editor category
className = "Weapon"; // For inventory system

// Basic Item Properties
shapeFile = "./spear.dts";
mass = 1;
density = 0.2;
elasticity = 0.2;
friction = 0.6;
emap = true;

//gui stuff
uiName = "SuperSpear";
iconName = "./icon_spear";
doColorShift = true;
colorShiftColor = "0.400 0.196 0 1.000";

// Dynamic properties defined by the scripts
image = spearImage;
canDrop = true;
};

//function spear::onUse(%this,%user)
//{
// //mount the image in the right hand slot
// %user.mountimage(%this.image, $RightHandSlot);
//}

////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(spearImage)
{
   // Basic Item properties
   shapeFile = "./spear.dts";
   emap = true;

   // Specify mount point & offset for 3rd person, and eye offset
   // for first person rendering.
   mountPoint = 0;
   offset = "0 0 0";
   //eyeOffset = "0.1 0.2 -0.55";

   // When firing from a point offset from the eye, muzzle correction
   // will adjust the muzzle vector to point to the eye LOS point.
   // Since this weapon doesn't actually fire from the muzzle point,
   // we need to turn this off. 
   correctMuzzleVector = true;

   // Add the WeaponImage namespace as a parent, WeaponImage namespace
   // provides some hooks into the inventory system.
   className = "WeaponImage";

   // Projectile && Ammo.
   item = superspearItem;
   ammo = " ";
   projectile = spearProjectile;
   projectileType = Projectile;

   //melee particles shoot from eye node for consistancy
   melee = false;
   //raise your arm up or not
   armReady = true;

   //casing = " ";
   doColorShift = true;
   colorShiftColor = "1 1 1 1.000";

   // Images have a state system which controls how the animations
   // are run, which sounds are played, script callbacks, etc. This
   // state system is downloaded to the client so that clients can
   // predict state changes and animate accordingly.  The following
   // system supports basic ready->fire->reload transitions as
   // well as a no-ammo->dryfire idle state.

   // Initial start up state
stateName[0] = "Activate";
stateTimeoutValue[0] = 0;
stateTransitionOnTimeout[0] = "Ready";
stateSequence[0] = "ready";
stateSound[0] = weaponSwitchSound;

stateName[1] = "Ready";
stateTransitionOnTriggerDown[1] = "Charge";
stateAllowImageChange[1] = true;

stateName[2]                    = "Charge";
stateTransitionOnTimeout[2] = "Armed";
stateTimeoutValue[2]            = 0;
stateWaitForTimeout[2] = false;
stateTransitionOnTriggerUp[2] = "AbortCharge";
stateScript[2]                  = "onCharge";
stateAllowImageChange[2]        = false;

stateName[3] = "AbortCharge";
stateTransitionOnTimeout[3] = "Ready";
stateTimeoutValue[3] = 0;
stateWaitForTimeout[3] = true;
stateScript[3] = "onAbortCharge";
stateAllowImageChange[3] = false;

stateName[4] = "Armed";
stateTransitionOnTriggerUp[4] = "Fire";
stateAllowImageChange[4] = false;

stateName[5] = "Fire";
stateTransitionOnTimeout[5] = "Ready";
stateTimeoutValue[5] = 0;
stateFire[5] = true;
stateSequence[5] = "fire";
stateScript[5] = "onFire";
stateWaitForTimeout[5] = true;
stateAllowImageChange[5] = false;
stateSound[5] = spearFireSound;
};

function spearImage::onCharge(%this, %obj, %slot)
{
%obj.playthread(2, spearReady);
}

function spearImage::onAbortCharge(%this, %obj, %slot)
{
%obj.playthread(2, root);
}

function spearImage::onFire(%this, %obj, %slot)
{
%obj.playthread(2, spearThrow);
Parent::onFire(%this, %obj, %slot);
}

I'd recommend changing all instances of spear to superSpear
including the sounds and datablocks, just to make sure when you have spear enabled it doesn't overwrite it
do note that weapon_spear is executed after weapon_superspear (reverse alphabetical), so it will overwrite anything using the same name (spearImage, spearTrailEmitter...)

ALL of it? every single instance? won't that interfer with like, if a sound isnt named "superspearfire", it wont work?
y'sure?

ok so someones helping me with this, so im learning about that kinda stuff and stuf
it should be working soon

I'm guessing one issue is "datablock ShapeBaseImageData(spearImage)", which should be superSpearImage instead of spearImage
if you wish to use the spear files, the preferred method is to force it as a required addon, but changing the names of everything will make it so it can have different sounds instead and you know for sure what is being changed

I'm guessing one issue is "datablock ShapeBaseImageData(spearImage)", which should be superSpearImage instead of spearImage
if you wish to use the spear files, the preferred method is to force it as a required addon, but changing the names of everything will make it so it can have different sounds instead and you know for sure what is being changed
ive figured it out, rename all spear stuff and check for syntax errors
yeah it'll be fine now
ok k