Author Topic: Cust. Gun, Bow, PushBroom Help!  (Read 1493 times)

Hey!

 I'm having a bit of trouble on a weapon code. The weapon code for the (Ex. Gun, Bow, Long Ranged Weps) have two common issues, the code is quite simple actually. But I'm not sure how to fix the consistent problem I run into. I'll provide images bellow for visual confirmation if it helps at all. The original bow fires one arrow at a time, with my version (GoldBow) I'm not sure where in the code, but it forces the bow to fire like an automatic weapon. This problem is consistent with the Bow, Gun, and GoldHorseRay that I am currently working on. Another issue I run into is that the sound profiles (Wav.) I have inside each Zip. folder isn't working correctly. It will play the "OnHit" but not an "WeaponDraw" or "WeaponFire".
« Last Edit: November 15, 2014, 06:10:15 PM by Yoke »

Do you have the proper states defined in the weapons datablock code?

This is a portion of the code for the GoldGun. The sequence code wasn't modified, this is what confuses me.

Quote
////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(GoldGunImage)
{
   // Basic Item properties
   shapeFile = "add-ons/weapon_gun/pistol.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; //"0.7 1.2 -0.5";
   rotation = eulerToMatrix( "0 0 0" );

   // 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 = BowItem;
   ammo = " ";
   projectile = GoldGunProjectile;
   projectileType = Projectile;

   casing = GoldGunShellDebris;
   shellExitDir        = "1.0 -1.3 1.0";
   shellExitOffset     = "0 0 0";
   shellExitVariance   = 15.0;   
   shellVelocity       = 7.0;

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

   doColorShift = true;
   colorShiftColor = GoldGunItem.colorShiftColor;//"0.400 0.196 0 1.000";

   //casing = " ";

   // 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.15;
   stateTransitionOnTimeout[0]       = "Ready";
   stateSound[0]               = weaponSwitchSound;

   stateName[1]                     = "Ready";
   stateTransitionOnTriggerDown[1]  = "Fire";
   stateAllowImageChange[1]         = true;
   stateSequence[1]   = "Ready";

   stateName[2]                    = "Fire";
   stateTransitionOnTimeout[2]     = "Smoke";
   stateTimeoutValue[2]            = 0.14;
   stateFire[2]                    = true;
   stateAllowImageChange[2]        = false;
   stateSequence[2]                = "Fire";
   stateScript[2]                  = "onFire";
   stateWaitForTimeout[2]         = true;
   stateEmitter[2]               = GoldGunFlashEmitter;
   stateEmitterTime[2]            = 0.05;
   stateEmitterNode[2]            = "muzzleNode";
   stateSound[2]               = GoldGunShot1Sound;
   stateEjectShell[2]       = true;

   stateName[3] = "Smoke";
   stateEmitter[3]               = GoldGunSmokeEmitter;
   stateEmitterTime[3]            = 0.05;
   stateEmitterNode[3]            = "muzzleNode";
   stateTimeoutValue[3]            = 0.01;
   stateTransitionOnTimeout[3]     = "Reload";

   stateName[4]         = "Reload";
   stateSequence[4]                = "Reload";
   stateTransitionOnTriggerUp[4]     = "Ready";
   stateSequence[4]   = "Ready";

};

function GoldGunImage::onFire(%this,%obj,%slot)
{
   if(%obj.getDamagePercent() < 1.0)
      %obj.playThread(2, shiftAway);
   Parent::onFire(%this,%obj,%slot);   
}

Would you mind posting all the code for one of the weapons then, just to see if you've actually done everything right.

//GoldGun.cs

//audio
datablock AudioProfile(GoldGunShot1Sound)
{
   filename    = "./GoldGunShot.wav";
   description = AudioClose3d;
   preload = true;
};
datablock AudioProfile(bulletHitSound)
{
   filename    = "./GoldGunHit.wav";
   description = AudioClose3d;
   preload = true;
};


//shell
datablock DebrisData(GoldGunShellDebris)
{
   shapeFile = "add-ons/weapon_gun/gunshell.dts";
   lifetime = 2.0;
   minSpinSpeed = -400.0;
   maxSpinSpeed = 200.0;
   elasticity = 0.5;
   friction = 0.2;
   numBounces = 3;
   staticOnMaxBounce = true;
   snapOnMaxBounce = false;
   fade = true;

   gravModifier = 2;
};


//muzzle flash effects
datablock ParticleData(GoldGunFlashParticle)
{
   dragCoefficient      = 3;
   gravityCoefficient   = -0.5;
   inheritedVelFactor   = 0.2;
   constantAcceleration = 0.0;
   lifetimeMS           = 25;
   lifetimeVarianceMS   = 15;
   textureName          = "base/lighting/flare";
   spinSpeed      = 10.0;
   spinRandomMin      = -500.0;
   spinRandomMax      = 500.0;
        colors[1]     = "1 0.85 0 1";
        colors[2]     = "1 0.85 0 0.8";
        colors[3]     = "1 0.85 0 0.6";
        sizes[1]      = 0.6;
        sizes[2]      = 0.7;
        sizes[3]      = 0.5;
        times[1] = 0;
        times[2] = 0.04;
        times[3] = 1;

   useInvAlpha = false;
};
datablock ParticleEmitterData(GoldGunFlashEmitter)
{
   ejectionPeriodMS = 3;
   periodVarianceMS = 0;
   ejectionVelocity = 1.0;
   velocityVariance = 1.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "GoldGunFlashParticle";

   uiName = "GoldGun Flash";
};

datablock ParticleData(GoldGunSmokeParticle)
{
   dragCoefficient      = 3;
   gravityCoefficient   = -0.5;
   inheritedVelFactor   = 0.2;
   constantAcceleration = 0.0;
   lifetimeMS           = 525;
   lifetimeVarianceMS   = 55;
   textureName          = "base/lighting/flare";
   spinSpeed      = 10.0;
   spinRandomMin      = -500.0;
   spinRandomMax      = 500.0;
        colors[1]     = "1 0.85 0 1";
        colors[2]     = "1 0.85 0 0.8";
        colors[3]     = "1 0.85 0 0.6";
        sizes[1]      = 0.6;
        sizes[2]      = 0.7;
        sizes[3]      = 0.5;
        times[1] = 0;
        times[2] = 0.04;
        times[3] = 1;

   useInvAlpha = false;
};
datablock ParticleEmitterData(GoldGunSmokeEmitter)
{
   ejectionPeriodMS = 3;
   periodVarianceMS = 0;
   ejectionVelocity = 1.0;
   velocityVariance = 1.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "GoldGunSmokeParticle";

   uiName = "GoldGun Smoke";
};


datablock ParticleData(GoldGunExplosionParticle)
{
   dragCoefficient      = 8;
   gravityCoefficient   = 1;
   inheritedVelFactor   = 0.2;
   constantAcceleration = 0.0;
   lifetimeMS           = 700;
   lifetimeVarianceMS   = 400;
   textureName          = "base/lighting/flare";
   spinSpeed      = 10.0;
   spinRandomMin      = -50.0;
   spinRandomMax      = 50.0;
        colors[1]     = "1 0.85 0 1";
        colors[2]     = "1 0.85 0 0.8";
        colors[3]     = "1 0.85 0 0.6";
        sizes[1]      = 0.6;
        sizes[2]      = 0.7;
        sizes[3]      = 0.5;
        times[1] = 0;
        times[2] = 0.04;
        times[3] = 1;

   useInvAlpha = true;
};
datablock ParticleEmitterData(GoldGunExplosionEmitter)
{
   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   ejectionVelocity = 2;
   velocityVariance = 1.0;
   ejectionOffset   = 0.0;
   thetaMin         = 89;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "GoldGunExplosionParticle";

   useEmitterColors = true;
   uiName = "GoldGun Hit Dust";
};


datablock ParticleData(GoldGunExplosionRingParticle)
{
   dragCoefficient      = 8;
   gravityCoefficient   = -0.5;
   inheritedVelFactor   = 0.2;
   constantAcceleration = 0.0;
   lifetimeMS           = 50;
   lifetimeVarianceMS   = 35;
   textureName          = "base/lighting/flare";
   spinSpeed      = 500.0;
   spinRandomMin      = -500.0;
   spinRandomMax      = 500.0;
        colors[1]     = "1 0.85 0 1";
        colors[2]     = "1 0.85 0 0.8";
        colors[3]     = "1 0.85 0 0.6";
        sizes[1]      = 0.6;
        sizes[2]      = 0.7;
        sizes[3]      = 0.5;
        times[1] = 0;
        times[2] = 0.04;
        times[3] = 1;

   useInvAlpha = false;
};
datablock ParticleEmitterData(GoldGunExplosionRingEmitter)
{
   lifeTimeMS = 50;

   ejectionPeriodMS = 3;
   periodVarianceMS = 0;
   ejectionVelocity = 0;
   velocityVariance = 0.0;
   ejectionOffset   = 0.0;
   thetaMin         = 89;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "GoldGunExplosionRingParticle";

   useEmitterColors = true;
   uiName = "GoldGun Hit Flash";
};

datablock ExplosionData(GoldGunExplosion)
{
   //explosionShape = "";
   soundProfile = bulletHitSound;

   lifeTimeMS = 150;

   particleEmitter = GoldGunExplosionEmitter;
   particleDensity = 5;
   particleRadius = 0.2;

   emitter[0] = GoldGunExplosionRingEmitter;

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

   shakeCamera = false;
   camShakeFreq = "10.0 11.0 10.0";
   camShakeAmp = "1.0 1.0 1.0";
   camShakeDuration = 0.5;
   camShakeRadius = 10.0;

   // Dynamic light
   lightStartRadius = 2;
   lightEndRadius = 0;
   lightStartColor = "1 0.5 0.3 0.4";
   lightEndColor = "0 0 0";
};


AddDamageType("GoldGun",   '<bitmap:add-ons/Weapon_GoldGun/CI_GoldGun> %1',    '%2 <bitmap:add-ons/Weapon_GoldGun/CI_GoldGun> %1',0.2,1);
datablock ProjectileData(GoldGunProjectile)
{
   projectileShapeName = "add-ons/weapon_gun/bullet.dts";
   directDamage        = 35;
   directDamageType    = $DamageType::GoldGun;
   radiusDamageType    = $DamageType::GoldGun;

   brickExplosionRadius = 0;
   brickExplosionImpact = true;          //destroy a brick if we hit it directly?
   brickExplosionForce  = 10;
   brickExplosionMaxVolume = 1;          //max volume of bricks that we can destroy
   brickExplosionMaxVolumeFloati ng = 2;  //max volume of bricks that we can destroy if they aren't connected to the ground

   impactImpulse        = 400;
   verticalImpulse     = 400;
   explosion           = GoldGunExplosion;
   particleEmitter     = "base/lighting/flare"; //bulletTrailEmitter;

   muzzleVelocity      = 300;
   velInheritFactor    = 1;

   armingDelay         = 00;
   lifetime            = 4000;
   mask                = $TypeMasks::FxBrickAlwaysObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType;
   fadeDelay           = 3500;
   bounceElasticity    = 0.5;
   bounceFriction      = 0.20;
   isBallistic         = false;
   gravityMod = 0.0;

   hasLight    = true;
   lightRadius = 1.0;
   lightColor  = "1 0.5 0.3 0.4";
   uiName = "GoldGun Bullet";
};

datablock particleData(GoldGunParticleA)
{
        colors[1]     = "1 0.85 0 1";
        colors[2]     = "1 0.85 0 0.8";
        colors[3]     = "1 0.85 0 0.6";
        sizes[1]      = 1.6;
        sizes[2]      = 1.7;
        sizes[3]      = 1.5;
        times[1] = 0;
        times[2] = 0.04;
        times[3] = 1;
   gravityCoefficient = -0.5;
   lifetimeMS         = 400;
   lifetimeVarianceMS = 200;
   spinRandomMax      = 90;
   spinRandomMin      = -90;
   textureName        = "base/lighting/flare";
};

datablock particleEmitterData(GoldGunEmitterA)
{
   ejectionOffset   = 0.09;
   ejectionPeriodMS = 50;
   ejectionVelocity = 0.2;
   particles        = GoldGunParticleA;
   periodVarianceMS = 2;
   thetaMax         = 180;
   velocityVariance = 0;
};
datablock particleData(GoldGunParticleB)
{
        colors[1]     = "1 0.85 0 1";
        colors[2]     = "1 0.85 0 0.8";
        colors[3]     = "1 0.85 0 0.6";
        sizes[1]      = 1.1;
        sizes[2]      = 1.2;
        sizes[3]      = 1.3;
        times[1] = 0;
        times[2] = 0.04;
        times[3] = 1;
   gravityCoefficient = -0.4;
   dragCoefficient    = 2;
   lifetimeMS         = 400;
   lifetimeVarianceMS = 200;

   spinRandomMax      = 0;
   spinRandomMin      = 0;
   textureName        = "base/lighting/flare";
};

datablock particleEmitterData(GoldGunEmitterB)
{
   ejectionOffset   = -0.0;
   ejectionPeriodMS = 10;
   ejectionVelocity = 0;
   particles        = GoldGunParticleB;
   periodVarianceMS = 2;
   thetaMin       = 0.0;
   thetaMax         = 0.1;
   velocityVariance = 0;
   orientParticles  = true;
   phiVariance       = 10;
};
datablock shapeBaseImageData(GoldGunImage : wandImage)
{
   projectile = GoldGunProjectile;
   showBricks = false;
   colorShiftColor = "1 0.85 0 1";
   stateEmitter[1] = GoldGunEmitterA;
   stateEmitter[3] = GoldGunEmitterB;
};

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

    // Basic Item Properties
   shapeFile = "add-ons/weapon_gun/pistol.dts";
   rotate = false;
   mass = 1;
   density = 0.2;
   elasticity = 0.2;
   friction = 0.6;
   emap = true;

   //gui stuff
   uiName = "GoldGun";
   iconName = "";
   doColorShift = true;
   colorShiftColor = "1 0.85 0 1";

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

////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(GoldGunImage)
{
   // Basic Item properties
   shapeFile = "add-ons/weapon_gun/pistol.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; //"0.7 1.2 -0.5";
   rotation = eulerToMatrix( "0 0 0" );

   // 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 = BowItem;
   ammo = " ";
   projectile = GoldGunProjectile;
   projectileType = Projectile;

   casing = GoldGunShellDebris;
   shellExitDir        = "1.0 -1.3 1.0";
   shellExitOffset     = "0 0 0";
   shellExitVariance   = 15.0;   
   shellVelocity       = 7.0;

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

   doColorShift = true;
   colorShiftColor = GoldGunItem.colorShiftColor;//"0.400 0.196 0 1.000";

   //casing = " ";

   // 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.15;
   stateTransitionOnTimeout[0]       = "Ready";
   stateSound[0]               = weaponSwitchSound;

   stateName[1]                     = "Ready";
   stateTransitionOnTriggerDown[1]  = "Fire";
   stateAllowImageChange[1]         = true;
   stateSequence[1]   = "Ready";

   stateName[2]                    = "Fire";
   stateTransitionOnTimeout[2]     = "Smoke";
   stateTimeoutValue[2]            = 0.14;
   stateFire[2]                    = true;
   stateAllowImageChange[2]        = false;
   stateSequence[2]                = "Fire";
   stateScript[2]                  = "onFire";
   stateWaitForTimeout[2]         = true;
   stateEmitter[2]               = GoldGunFlashEmitter;
   stateEmitterTime[2]            = 0.05;
   stateEmitterNode[2]            = "muzzleNode";
   stateSound[2]               = GoldGunShot1Sound;
   stateEjectShell[2]       = true;

   stateName[3] = "Smoke";
   stateEmitter[3]               = GoldGunSmokeEmitter;
   stateEmitterTime[3]            = 0.05;
   stateEmitterNode[3]            = "muzzleNode";
   stateTimeoutValue[3]            = 0.01;
   stateTransitionOnTimeout[3]     = "Reload";

   stateName[4]         = "Reload";
   stateSequence[4]                = "Reload";
   stateTransitionOnTriggerUp[4]     = "Ready";
   stateSequence[4]   = "Ready";

};

function GoldGunImage::onFire(%this,%obj,%slot)
{
   if(%obj.getDamagePercent() < 1.0)
      %obj.playThread(2, shiftAway);
   Parent::onFire(%this,%obj,%slot);   
}

datablock shapeBaseImageData(GoldGunImage : wandImage)
{
   projectile = GoldGunProjectile;
   showBricks = false;
   colorShiftColor = "1 0.85 0 1";
   stateEmitter[1] = GoldGunEmitterA;
   stateEmitter[3] = GoldGunEmitterB;
};
This segment of code right here will end up making this code here void:
////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(GoldGunImage)
{
   // Basic Item properties
   shapeFile = "add-ons/weapon_gun/pistol.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; //"0.7 1.2 -0.5";
   rotation = eulerToMatrix( "0 0 0" );

   // 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 = BowItem;
   ammo = " ";
   projectile = GoldGunProjectile;
   projectileType = Projectile;

   casing = GoldGunShellDebris;
   shellExitDir        = "1.0 -1.3 1.0";
   shellExitOffset     = "0 0 0";
   shellExitVariance   = 15.0;   
   shellVelocity       = 7.0;

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

   doColorShift = true;
   colorShiftColor = GoldGunItem.colorShiftColor;//"0.400 0.196 0 1.000";

   //casing = " ";

   // 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.15;
   stateTransitionOnTimeout[0]       = "Ready";
   stateSound[0]               = weaponSwitchSound;

   stateName[1]                     = "Ready";
   stateTransitionOnTriggerDown[1]  = "Fire";
   stateAllowImageChange[1]         = true;
   stateSequence[1]   = "Ready";

   stateName[2]                    = "Fire";
   stateTransitionOnTimeout[2]     = "Smoke";
   stateTimeoutValue[2]            = 0.14;
   stateFire[2]                    = true;
   stateAllowImageChange[2]        = false;
   stateSequence[2]                = "Fire";
   stateScript[2]                  = "onFire";
   stateWaitForTimeout[2]         = true;
   stateEmitter[2]               = GoldGunFlashEmitter;
   stateEmitterTime[2]            = 0.05;
   stateEmitterNode[2]            = "muzzleNode";
   stateSound[2]               = GoldGunShot1Sound;
   stateEjectShell[2]       = true;

   stateName[3] = "Smoke";
   stateEmitter[3]               = GoldGunSmokeEmitter;
   stateEmitterTime[3]            = 0.05;
   stateEmitterNode[3]            = "muzzleNode";
   stateTimeoutValue[3]            = 0.01;
   stateTransitionOnTimeout[3]     = "Reload";

   stateName[4]         = "Reload";
   stateSequence[4]                = "Reload";
   stateTransitionOnTriggerUp[4]     = "Ready";
   stateSequence[4]   = "Ready";

};

I recommend getting rid of it.

I'm gonna see if it works. I'm trying to make sure that the weapon still has the golden sparkle effect when that part of the code is removed.

Well they are both ShapeBaseImageData so you can literally toss that code into the bit after //weapon image//
However all of the code is already in the second ShapeBaseImageData

It fixed the problem completely, but now the sparkle effect is gone. Is there any way I can make the weapon have the same effect without screwing up the sequence?

Just add it in on the ShapeBaseImageData you should see clearly where stateEmitter[1] and stateEmitter[3] should fit in.