Author Topic: Making a ranged weapon with ammo [ SOLVED ]  (Read 6259 times)

Probably wondering what kind of ammo system I will be asking about, i'll make it as clear as possible

Say that you have infinite mags or shells or what so ever, but the gun can only shoot for a certain number of times before you have to reload.
Like you waste a full clip on a bot, zombie, or wall then you have to reload

If there's a way to insert this action in the server.cs file please let me know as well as to anything else unclear I didn't go over.
« Last Edit: June 15, 2015, 03:17:41 PM by xLEGOx »

You can use Support_Ammoguns and then a few tweaks in the weapon's .CS file to do this.
You can also set fonts for the client to see how much ammo he has. For example i use a white, Arial 15 font that is displayed to the client on the bottom right of the screen to tell them how much ammo they have.

I suggest that you tak a look at guns that do this: Warfare pack, NEKram's "stuffty Weapon Pack", H&K pack by Khain.

Also this would go in Coding Help.

You can use Support_Ammoguns and then a few tweaks in the weapon's .CS file to do this.

All right, I decided to do some tweaking on the gun using Support_AmmoGuns, the gun works but it only shoots once then it reloads.

Here's the Weapon.cs

//M420.cs

//audio
datablock AudioProfile(M420Shot1Sound)
{
   filename    = "./gunShot1.wav";
   description = AudioClose3d;
   preload = true;
};
datablock AudioProfile(bulletHitSound)
{
   filename    = "./bulletHit.wav";
   description = AudioClose3d;
   preload = true;
};
datablock AudioProfile(ClipInSound)
{
   filename    = "./ClipIn.wav";
   description = AudioClose3d;
   preload = true;
};
datablock AudioProfile(ClipOutSound)
{
   filename    = "./ClipOut.wav";
   description = AudioClose3d;
   preload = true;
};



//shell
datablock DebrisData(M420ShellDebris)
{
   shapeFile = "./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(M420FlashParticle)
{
   dragCoefficient      = 3;
   gravityCoefficient   = -0.5;
   inheritedVelFactor   = 0.2;
   constantAcceleration = 0.0;
   lifetimeMS           = 25;
   lifetimeVarianceMS   = 15;
   textureName          = "base/data/particles/star1";
   spinSpeed      = 10.0;
   spinRandomMin      = -500.0;
   spinRandomMax      = 500.0;
   colors[0]     = "0.9 0.9 0.0 0.9";
   colors[1]     = "0.9 0.5 0.0 0.0";
   sizes[0]      = 0.5;
   sizes[1]      = 1.0;

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

   uiName = "M420 Flash";
};

datablock ParticleData(M420SmokeParticle)
{
   dragCoefficient      = 3;
   gravityCoefficient   = -0.5;
   inheritedVelFactor   = 0.2;
   constantAcceleration = 0.0;
   lifetimeMS           = 525;
   lifetimeVarianceMS   = 55;
   textureName          = "base/data/particles/cloud";
   spinSpeed      = 10.0;
   spinRandomMin      = -500.0;
   spinRandomMax      = 500.0;
   colors[0]     = "0.5 0.5 0.5 0.9";
   colors[1]     = "0.5 0.5 0.5 0.0";
   sizes[0]      = 0.15;
   sizes[1]      = 0.15;

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

   uiName = "M420 Smoke";
};


datablock ParticleData(M420ExplosionParticle)
{
   dragCoefficient      = 8;
   gravityCoefficient   = 1;
   inheritedVelFactor   = 0.2;
   constantAcceleration = 0.0;
   lifetimeMS           = 700;
   lifetimeVarianceMS   = 400;
   textureName          = "base/data/particles/cloud";
   spinSpeed      = 10.0;
   spinRandomMin      = -50.0;
   spinRandomMax      = 50.0;
   colors[0]     = "0.9 0.9 0.9 0.3";
   colors[1]     = "0.9 0.5 0.6 0.0";
   sizes[0]      = 0.25;
   sizes[1]      = 0.75;

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

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


datablock ParticleData(M420ExplosionRingParticle)
{
   dragCoefficient      = 8;
   gravityCoefficient   = -0.5;
   inheritedVelFactor   = 0.2;
   constantAcceleration = 0.0;
   lifetimeMS           = 50;
   lifetimeVarianceMS   = 35;
   textureName          = "base/data/particles/star1";
   spinSpeed      = 500.0;
   spinRandomMin      = -500.0;
   spinRandomMax      = 500.0;
   colors[0]     = "1 1 0.0 0.9";
   colors[1]     = "0.9 0.0 0.0 0.0";
   sizes[0]      = 1;
   sizes[1]      = 0;

   useInvAlpha = false;
};
datablock ParticleEmitterData(M420ExplosionRingEmitter)
{
   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 = "M420ExplosionRingParticle";

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

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

   lifeTimeMS = 150;

   particleEmitter = M420ExplosionEmitter;
   particleDensity = 5;
   particleRadius = 0.2;

   emitter[0] = M420ExplosionRingEmitter;

   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 = 0;
   lightEndRadius = 2;
   lightStartColor = "0.3 0.6 0.7";
   lightEndColor = "0 0 0";
};


AddDamageType("M420",   '<bitmap:add-ons/Weapon_M420/CI_M420> %1',    '%2 <bitmap:add-ons/Weapon_M420/CI_M420> %1',0.2,1);
datablock ProjectileData(M420Projectile)
{
   projectileShapeName = "./bullet.dts";
   directDamage        = 30;
   directDamageType    = $DamageType::M420;
   radiusDamageType    = $DamageType::M420;

   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           = M420Explosion;
   particleEmitter     = ""; //bulletTrailEmitter;

   muzzleVelocity      = 90;
   velInheritFactor    = 1;

   armingDelay         = 00;
   lifetime            = 4000;
   fadeDelay           = 3500;
   bounceElasticity    = 0.5;
   bounceFriction      = 0.20;
   isBallistic         = false;
   gravityMod = 0.0;

   hasLight    = false;
   lightRadius = 3.0;
   lightColor  = "0 0 0.5";

   uiName = "M420 Bullet";
};

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

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

   //gui stuff
   uiName = "M420";
   iconName = "./icon_M420";
   doColorShift = false;
   colorShiftColor = "1 1 1 1.000";

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

   maxAmmo = 50;
   canReload = 1;
};

////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(M420Image)
{
   // Basic Item properties
   shapeFile = "./M420.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 = M420Projectile;
   projectileType = Projectile;

   casing = M420ShellDebris;
   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 = false;
   colorShiftColor = M420Item.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.08;
   stateFire[2]                    = true;
   stateAllowImageChange[2]        = false;
   stateSequence[2]                = "Fire";
   stateScript[2]                  = "onFire";
   stateWaitForTimeout[2]         = true;
   stateEmitter[2]               = M420FlashEmitter;
   stateEmitterTime[2]            = 0.05;
   stateEmitterNode[2]            = "muzzleNode";
   stateSound[2]               = M420Shot1Sound;
   stateEjectShell[2]       = true;

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

   stateName[4]            = "LoadCheckA";
   stateScript[4]            = "onLoadCheck";
   stateTimeoutValue[4]         = 0.01;
   stateTransitionOnTimeout[4]      = "LoadCheckB";
   
   stateName[5]            = "LoadCheckB";
   stateTransitionOnAmmo[5]      = "Ready";
   stateTransitionOnNoAmmo[5]      = "ReloadWait";
   
   stateName[6]            = "ReloadWait";
   stateTimeoutValue[6]         = 0.3;
   stateTransitionOnTimeout[6]      = "Reload";
   stateWaitForTimeout[6]         = true;
   
   stateName[7]            = "Reload";
   stateTimeoutValue[7]         = 0.3;
   stateScript[7]            = "onReloadStart";
   stateTransitionOnTimeout[7]      = "ReloadB";
   stateWaitForTimeout[7]         = true;
   StateSequence[7]         = "RefillAmmo";
   stateSound[7]         = "ClipOutSound";

   stateName[8]            = "ReloadB";
   stateTimeoutValue[8]         = 0.0;
   stateTransitionOnTimeout[8]      = "Reloaded";
   stateWaitForTimeout[8]         = true;
   StateSequence[8]         = "reload2";
   stateSound[8]         = "ClipInSound";
   
   stateName[9]            = "Reloaded";
   stateTimeoutValue[9]         = 0.5;
   stateScript[9]            = "onReloaded";
   stateTransitionOnTimeout[9]      = "Ready";

   stateName[10]             = "Smoke";
   stateEmitter[10]         = gunSmokeEmitter;
   stateEmitterTime[10]         = 0.3;
   stateEmitterNode[10]         = "muzzleNode";
   stateTimeoutValue[10]         = 0.2;
   stateTransitionOnTimeout[10]      = "Ready";
   stateTransitionOnTriggerDown[10]   = "Fire";
   
   stateName[11]             = "ReloadSmoke";
   stateEmitter[11]         = gunSmokeEmitter;
   stateEmitterTime[11]         = 0.3;
   stateEmitterNode[11]         = "muzzleNode";
   stateTimeoutValue[11]         = 0.2;
   stateTransitionOnTimeout[11]      = "Reload";

   stateName[12]            = "FireLoadCheckA";
   stateScript[12]            = "onLoadCheck";
   stateTimeoutValue[12]         = 0.01;
   stateTransitionOnTimeout[12]      = "FireLoadCheckB";
   
   stateName[13]            = "FireLoadCheckB";
   stateTransitionOnAmmo[13]      = "Smoke";
   stateTransitionOnNoAmmo[13]      = "ReloadSmoke";

};

function M420Image::onFire(%this,%obj,%slot)
{
        if(%obj.getDamagePercent() < 1.0)
                %obj.playThread(2, plant);
        %projectile = %this.projectile;
        %spread = 0.0001;
        %shellcount = 1;

        for(%shell=0; %shell<%shellcount; %shell++)
        {
                %vector = %obj.getMuzzleVector(%slot);
                %objectVelocity = %obj.getVelocity();
                %vector1 = VectorScale(%vector, %projectile.muzzleVelocity);
                %vector2 = VectorScale(%objectVelocity, %projectile.velInheritFactor);
                %velocity = VectorAdd(%vector1,%vector2);
                %x = (getRandom() - 0.5) * 10 * 3.1415926 * %spread;
                %y = (getRandom() - 0.5) * 10 * 3.1415926 * %spread;
                %z = (getRandom() - 0.5) * 10 * 3.1415926 * %spread;
                %mat = MatrixcreateFromEuler(%x @ " " @ %y @ " " @ %z);
                %velocity = MatrixMulVector(%mat, %velocity);

                %p = new (%this.projectileType)()
                {
                        dataBlock = %projectile;
                        initialVelocity = %velocity;
                        initialPosition = %obj.getMuzzlePoint(%slot);
                        sourceObject = %obj;
                        sourceSlot = %slot;
                        client = %obj.client;
                };
                MissionCleanup.add(%p);
        }
        return %p;
}

function WeaponImage::onMount(%this,%obj,%slot)
{   
   Parent::onMount(%this,%obj,%slot);
   if(%this.item.maxAmmo >= 0 && (%obj.currTool == -1 || %obj.toolAmmo[%obj.currTool] $= ""))
   {
      %obj.toolAmmo[%obj.currTool] = %this.item.maxAmmo;
   }
}


I have a feeling that the error at the state parts, but for now I just need the gun to shoot more than once and then reload.

Quote
if(%this.item.maxAmmo >= 0 && (%obj.currTool == -1 || %obj.toolAmmo[%obj.currTool] $= ""))


The bold red number is the value you use to set your ammo amount, its currently set to -1. Just set that value to how many rounds you want your magazine to hold.

Okay the gun fires, but infinitely many bullets ( more than 50 )
I did some tweaking and adding missing functions that were supposed to be in the script

Here's the code :

AddDamageType("M420",   '<bitmap:add-ons/Weapon_M420/CI_M420> %1',    '%2 <bitmap:add-ons/Weapon_M420/CI_M420> %1',0.2,1);
datablock ProjectileData(M420Projectile)
{
   projectileShapeName = "./bullet.dts";
   directDamage        = 30;
   directDamageType    = $DamageType::M420;
   radiusDamageType    = $DamageType::M420;

   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           = M420Explosion;
   particleEmitter     = ""; //bulletTrailEmitter;

   muzzleVelocity      = 90;
   velInheritFactor    = 1;

   armingDelay         = 00;
   lifetime            = 4000;
   fadeDelay           = 3500;
   bounceElasticity    = 0.5;
   bounceFriction      = 0.20;
   isBallistic         = false;
   gravityMod = 0.0;

   hasLight    = false;
   lightRadius = 3.0;
   lightColor  = "0 0 0.5";

   uiName = "M420 Bullet";
};

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

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

   //gui stuff
   uiName = "M420";
   iconName = "./icon_M420";
   doColorShift = false;
   colorShiftColor = "1 1 1 1.000";

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

   maxAmmo = 50;
   canReload = 1;
};

////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(M420Image)
{
   // Basic Item properties
   shapeFile = "./M420.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 = M420Projectile;
   projectileType = Projectile;

   casing = M420ShellDebris;
   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 = false;
   colorShiftColor = M420Item.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.62;
   stateTransitionOnTimeout[0]          = "LoadCheckA";
   StateSound[0]            = "UziEquipSound";

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

   stateName[2]                       = "Fire";
   stateTransitionOnTimeout[2]        = "Delay";
   stateTimeoutValue[2]               = 0.00;
   stateFire[2]                       = true;
   stateAllowImageChange[2]           = false;
   stateScript[2]                     = "onFire";
   stateEjectShell[2]               = true;
   stateEmitter[2]            = gunFlashEmitter;
   stateEmitterTime[2]         = 0.06;
   stateEmitterNode[2]         = "muzzleNode";
   stateWaitForTimeout[2]         = true;
   stateSound[2]            = m420Shot1Sound;

   stateName[3]            = "Delay";
   stateTransitionOnTimeout[3]        = "FireLoadCheckA";
   stateTimeoutValue[3]               = 0.06;
   stateEmitter[3]            = gunSmokeEmitter;
   stateEmitterTime[3]         = 0.05;
   stateEmitterNode[3]         = "muzzleNode";

   //Torque switches states instantly if there is an ammo/noammo state, regardless of stateWaitForTimeout
   
   stateName[4]            = "LoadCheckA";
   stateScript[4]            = "onLoadCheck";
   stateTimeoutValue[4]         = 0.01;
   stateTransitionOnTimeout[4]      = "LoadCheckB";
   
   stateName[5]            = "LoadCheckB";
   stateTransitionOnAmmo[5]      = "Ready";
   stateTransitionOnNoAmmo[5]      = "ReloadWait";
   
   stateName[6]            = "ReloadWait";
   stateTimeoutValue[6]         = 0.3;
   stateTransitionOnTimeout[6]      = "Reload";
   stateWaitForTimeout[6]         = true;
   
   stateName[7]            = "Reload";
   stateTimeoutValue[7]         = 0.3;
   stateScript[7]            = "onReloadStart";
   stateTransitionOnTimeout[7]      = "ReloadB";
   stateWaitForTimeout[7]         = true;
   StateSequence[7]         = "RefillAmmo";
   stateSound[7]            = ClipOutSound;

   stateName[8]            = "ReloadB";
   stateTimeoutValue[8]         = 0.0;
   stateTransitionOnTimeout[8]      = "Reloaded";
   stateWaitForTimeout[8]         = true;
   stateSound[8]            = ClipInSound;
   
   stateName[9]            = "Reloaded";
   stateTimeoutValue[9]         = 0.5;
   stateScript[9]            = "onReloaded";
   stateTransitionOnTimeout[9]      = "Ready";

   stateName[10]             = "Smoke";
   stateEmitter[10]         = gunSmokeEmitter;
   stateEmitterTime[10]         = 0.3;
   stateEmitterNode[10]         = "muzzleNode";
   stateTimeoutValue[10]         = 0.2;
   stateTransitionOnTimeout[10]      = "Ready";
   stateTransitionOnTriggerDown[10]   = "Fire";
   
   stateName[11]             = "ReloadSmoke";
   stateEmitter[11]         = gunSmokeEmitter;
   stateEmitterTime[11]         = 0.3;
   stateEmitterNode[11]         = "muzzleNode";
   stateTimeoutValue[11]         = 0.2;
   stateTransitionOnTimeout[11]      = "Reload";

   stateName[12]            = "FireLoadCheckA";
   stateScript[12]            = "onLoadCheck";
   stateTimeoutValue[12]         = 0.01;
   stateTransitionOnTimeout[12]      = "FireLoadCheckB";
   
   stateName[13]            = "FireLoadCheckB";
   stateTransitionOnAmmo[13]      = "Smoke";
   stateTransitionOnNoAmmo[13]      = "ReloadSmoke";
};

function M420Image::onFire(%this,%obj,%slot)
{
        if(%obj.getDamagePercent() < 1.0)
                %obj.playThread(2, plant);
        %projectile = %this.projectile;
        %spread = 0.0001;
        %shellcount = 1;

        for(%shell=0; %shell<%shellcount; %shell++)
        {
                %vector = %obj.getMuzzleVector(%slot);
                %objectVelocity = %obj.getVelocity();
                %vector1 = VectorScale(%vector, %projectile.muzzleVelocity);
                %vector2 = VectorScale(%objectVelocity, %projectile.velInheritFactor);
                %velocity = VectorAdd(%vector1,%vector2);
                %x = (getRandom() - 0.5) * 10 * 3.1415926 * %spread;
                %y = (getRandom() - 0.5) * 10 * 3.1415926 * %spread;
                %z = (getRandom() - 0.5) * 10 * 3.1415926 * %spread;
                %mat = MatrixcreateFromEuler(%x @ " " @ %y @ " " @ %z);
                %velocity = MatrixMulVector(%mat, %velocity);

                %p = new (%this.projectileType)()
                {
                        dataBlock = %projectile;
                        initialVelocity = %velocity;
                        initialPosition = %obj.getMuzzlePoint(%slot);
                        sourceObject = %obj;
                        sourceSlot = %slot;
                        client = %obj.client;
                };
                MissionCleanup.add(%p);
        }
        return %p;
}

function WeaponImage::onMount(%this,%obj,%slot)
{   
   Parent::onMount(%this,%obj,%slot);
   if(%this.item.maxAmmo >= 0 && (%obj.currTool == 50 || %obj.toolAmmo[%obj.currTool] $= "")) Fixed
   {
      %obj.toolAmmo[%obj.currTool] = %this.item.maxAmmo;
   }
}

function M420Image::onLoadCheck(%this,%obj,%slot)
{
   if(%obj.toolAmmo[%obj.currTool] <= 0)
      %obj.setImageAmmo(%slot,0);
   else
      %obj.setImageAmmo(%slot,1);
}

function M420Image::onReloaded(%this,%obj,%slot)
{
   %obj.toolAmmo[%obj.currTool] = 50;
   %obj.setImageAmmo(%slot,1);
}

I hope these are the final steps to fixing the problem.
Thanks Ctrooper

So are you saying you fixed it already?

Sorry, it's not fixed, just need to find how to limit the mag and make it able to reload

It's almost fixed, just need a few tweaks ^^

Here's the model of it though if you were curious about it.
I know it's pretty clustered up with attachments and such

Edit : Im guessing I need to add an onFire function so the mag can get emptied.
« Last Edit: June 10, 2015, 12:46:56 PM by xLEGOx »

Quote
Edit : Im guessing I need to add an onFire function so the mag can get emptied.

I was waiting for that.

I really hate to admit, but i'm just a beginner at all this .cs content. I'll try to make the onfire function or find one on the forums

If succeed i'll post the function and lock the topic. It's probably everything someone needed if he wanted to make an ammo gun as well.

Yes! I have found it!

function (Weapon)Image::onFire(%this,%obj,%slot)
{
        %obj.toolAmmo[%obj.currTool]--;
}

The weapon is now working the way I have wanted it to.
Source found at http://forum.blockland.us/index.php?topic=208175.0

Bump. topic is uld. must fixies

Bump. topic is uld. must fixies

It was already fixed. Pointless bump.

Requesting this be locked