Author Topic: How do I allow an item to be picked up more than once?  (Read 2128 times)

I have two throwing items I made that I need to modify. I want them to be removed from the inventory when thrown and I want you to pick up more than one.

The HE Grenade does this

Multiples of the same item
Code: [Select]
package HEGrenadePackage
{
function Armor::onCollision(%this, %obj, %col, %a, %b, %c, %d, %e, %f)
{
if(%col.dataBlock $= "HEGrenadeItem" && %col.canPickup)
{
for(%i=0;%i<%this.maxTools;%i++)
{
%item = %obj.tool[%i];
if(%item $= 0 || %item $= "")
{
%freeSlot = 1;
break;
}
}

if(%freeSlot)
{
%obj.pickup(%col);
return;
}
}
Parent::onCollision(%this, %obj, %col, %a, %b, %c, %d, %e, %f);
}
};
activatePackage(HEGrenadePackage);

Removed from inventory when thrown
Code: [Select]
function hegrenadeImage::onFire(%this, %obj, %slot)
{
%obj.playthread(2, spearThrow);
Parent::OnFire(%this, %obj, %slot);

%currSlot = %obj.lastHESlot;
%obj.tool[%currSlot] = 0;
%obj.weaponCount--;
messageClient(%obj.client,'MsgItemPickup','',%currSlot,0);
serverCmdUnUseTool(%obj.client);
}

function hegrenadeImage::onDone(%this,%obj,%slot)
{
%obj.unMountImage(%slot);
}

For the onDone function to work, you will need the 'Done' image state
stateName[#] = "Done";
stateScript[#] = "onDone";
« Last Edit: December 08, 2015, 06:09:01 PM by Masterlegodude »

I'm also getting this error making me unable to get the spear to work.

Spearexplosion emitter 2 is not a member of the explosiondata data block class.

Code: [Select]
datablock ParticleEmitterData(spearExplosionEmitter2)
{
   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   lifetimeMS       = 7;
   ejectionVelocity = 15;
   velocityVariance = 5.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "spearExplosionParticle2";

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

Either you shouldn't be putting stuff after 'Emitter' and 'Particle', or something's wrong with the explosion datablock

In the projectile, you might be setting explosion = spearexplosionemitter2;

In the projectile, you might be setting explosion = spearexplosionemitter2;

oh I see I'll change that in a minute. I got multiple spears to collect now I need to work on removing it from inventory.

Removed from inventory when thrown
Code: [Select]
function hegrenadeImage::onFire(%this, %obj, %slot)
{
%obj.playthread(2, spearThrow);
Parent::OnFire(%this, %obj, %slot);

%currSlot = %obj.lastHESlot;
%obj.tool[%currSlot] = 0;
%obj.weaponCount--;
messageClient(%obj.client,'MsgItemPickup','',%currSlot,0);
serverCmdUnUseTool(%obj.client);
}

function hegrenadeImage::onDone(%this,%obj,%slot)
{
%obj.unMountImage(%slot);
}

For the onDone function to work, you will need the 'Done' image state
stateName[#] = "Done";
stateScript[#] = "onDone";


I tried this but it only removes from my player's hand not from the inventory.

Code: [Select]
function ThrowingspearImage::onCharge(%this, %obj, %slot)
{
%obj.playthread(2, spearReady);
}

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

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

%currSlot = %obj.lastHESlot;
%obj.tool[%currSlot] = 0;
%obj.weaponCount--;
messageClient(%obj.client,'MsgItemPickup','',%currSlot,0);
serverCmdUnUseTool(%obj.client);
}

function ThrowingSpearImage::onDone(%this,%obj,%slot)
{
%obj.unMountImage(%slot);
}

That's because you have two onFire functions, remove the one above the other

That's because you have two onFire functions, remove the one above the other

I just did that before you said anything and it still doesn't work.

Code: [Select]
////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(ThrowingspearImage)
{
   // 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 = ThrowingspearItem;
   ammo = " ";
   projectile = ThrowingspearProjectile;
   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.1;
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.7;
stateWaitForTimeout[2] = false;
stateTransitionOnTriggerUp[2] = "AbortCharge";
stateScript[2]                  = "onCharge";
stateAllowImageChange[2]        = false;

stateName[3] = "AbortCharge";
stateTransitionOnTimeout[3] = "Ready";
stateTimeoutValue[3] = 0.3;
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.5;
stateFire[5] = true;
stateSequence[5] = "fire";
stateScript[5] = "onFire";
stateWaitForTimeout[5] = true;
stateAllowImageChange[5] = false;
stateSound[5] = ThrowingspearFireSound;
};

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

function ThrowingspearImage::onAbortCharge(%this, %obj, %slot)
{
%obj.playthread(2, root);
}
function ThrowingSpearImage::onFire(%this, %obj, %slot)
{
%obj.playthread(2, spearThrow);
Parent::OnFire(%this, %obj, %slot);

%currSlot = %obj.ThrowingSpearSlot;
%obj.tool[%currSlot] = 0;
%obj.weaponCount--;
messageClient(%obj.client,'MsgItemPickup','',%currSlot,0);
serverCmdUnUseTool(%obj.client);
}

function ThrowingSpearImage::onDone(%this,%obj,%slot)
{
%obj.unMountImage(%slot);
}

This is the entire script and I'm still getting the explosion datablock error even after changing it.

Code: [Select]
//Throwingspear.cs


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

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


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

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

// Interpolation variables
colors[0] = "0.75 0.75 0.75 0.3";
colors[1] = "0.75 0.75 0.75 0.2";
colors[2] = "1 1 1 0.0";
sizes[0] = 0.15;
sizes[1] = 0.35;
sizes[2] = 0.05;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};

datablock ParticleEmitterData(ThrowingspearTrailEmitter)
{
   ejectionPeriodMS = 5;
   periodVarianceMS = 0;

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

   ejectionOffset = 0;

   thetaMin         = 0.0;
   thetaMax         = 90.0; 

   particles = ThrowingspearTrailParticle;

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


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

textureName = "base/data/particles/cloud";
//animTexName = "~/data/particles/cloud";

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

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

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

datablock ParticleData(ThrowingspearExplosionParticle2)
{
dragCoefficient = 2;
windCoefficient = 1.0;
gravityCoefficient = 2.0;
inheritedVelFactor = 0.2;
constantAcceleration = 0.0;
lifetimeMS = 500;
lifetimeVarianceMS = 300;
spinSpeed = 10.0;
spinRandomMin = -50.0;
spinRandomMax = 50.0;
useInvAlpha = true;
animateTexture = false;
//framesPerSec = 1;

textureName = "base/data/particles/chunk";
//animTexName = "~/data/particles/cloud";

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

datablock ParticleEmitterData(ThrowingspearExplosionEmitter2)
{
   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   lifetimeMS       = 7;
   ejectionVelocity = 15;
   velocityVariance = 5.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "ThrowingspearExplosionParticle2";

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

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

   soundProfile = ThrowingspearExplosionSound;

   emitter[0] = ThrowingspearExplosionEmitter;
   emitter[1] = ThrowingspearExplosionEmitter2;
   //particleDensity = 1;
   //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 = 0;
   impulseForce = 100;

   //radius damage
   radiusDamage        = 0;
   damageRadius        = 0;
};

//projectile
AddDamageType("ThrowingSpearDirect",   '<bitmap:add-ons/Weapon_Throwing_Spear/CI_spear> %1',       '%2 <bitmap:add-ons/Weapon_Throwing_Spear/CI_spear> %1',1,1);

datablock ProjectileData(ThrowingspearProjectile)
{
   projectileShapeName = "./spearProjectile.dts";

   directDamage        = 50;
   directDamageType    = $DamageType::ThrowingSpearDirect;

   radiusDamage        = 0;
   damageRadius        = 0;
   radiusDamageType    = $DamageType::ThrowingSpearDirect;

   explosion             = ThrowingspearExplosionParticle2;
   stickExplosion        = ThrowingspearExplosion;
   bloodExplosion        = ThrowingspearExplosion;
   particleEmitter       = ThrowingspearTrailEmitter;
   explodeOnPlayerImpact = true;
   explodeOnDeath        = true; 

   armingDelay         = 30000;
   lifetime            = 30000;
   fadeDelay           = 30000;

   isBallistic         = true;
   bounceAngle         = 170; //stick almost all the time
   minStickVelocity    = 10;
   bounceElasticity    = 0.2;
   bounceFriction      = 0.01;   
   gravityMod = 0.25;

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

   muzzleVelocity      = 65;
   velInheritFactor    = 1;

   uiName = "Spear";
};
package ThrowingSpearPackage
{
function Armor::onCollision(%this, %obj, %col, %a, %b, %c, %d, %e, %f)
{
if(%col.dataBlock $= "ThrowingSpearItem" && %col.canPickup)
{
for(%i=0;%i<%this.maxTools;%i++)
{
%item = %obj.tool[%i];
if(%item $= 0 || %item $= "")
{
%freeSlot = 1;
break;
}
}

if(%freeSlot)
{
%obj.pickup(%col);
return;
}
}
Parent::onCollision(%this, %obj, %col, %a, %b, %c, %d, %e, %f);
}
};
activatePackage(ThrowingSpearPackage);

//////////
// item //
//////////
datablock ItemData(ThrowingspearItem)
{
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 = "Throwing Spear";
iconName = "./icon_Throwing_Spear";
doColorShift = true;
colorShiftColor = "0.400 0.196 0 1.000";

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

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

////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(ThrowingspearImage)
{
   // 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 = ThrowingspearItem;
   ammo = " ";
   projectile = ThrowingspearProjectile;
   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.1;
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.7;
stateWaitForTimeout[2] = false;
stateTransitionOnTriggerUp[2] = "AbortCharge";
stateScript[2]                  = "onCharge";
stateAllowImageChange[2]        = false;

stateName[3] = "AbortCharge";
stateTransitionOnTimeout[3] = "Ready";
stateTimeoutValue[3] = 0.3;
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.5;
stateFire[5] = true;
stateSequence[5] = "fire";
stateScript[5] = "onFire";
stateWaitForTimeout[5] = true;
stateAllowImageChange[5] = false;
stateSound[5] = ThrowingspearFireSound;
};

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

function ThrowingspearImage::onAbortCharge(%this, %obj, %slot)
{
%obj.playthread(2, root);
}
function ThrowingSpearImage::onFire(%this, %obj, %slot)
{
%obj.playthread(2, ThrowingspearThrow);
Parent::OnFire(%this, %obj, %slot);

%currSlot = %obj.ThrowingSpearSlot;
%obj.tool[%currSlot] = 0;
%obj.weaponCount--;
messageClient(%obj.client,'MsgItemPickup','',%currSlot,0);
serverCmdUnUseTool(%obj.client);
}

function ThrowingSpearImage::onDone(%this,%obj,%slot)
{
%obj.unMountImage(%slot);
}

It's still not being unmounted because you forgot the 'Done' image state and making the 'Fire' state change to the 'Done' sate when it times out

Try replacing your image states with this
Code: [Select]
stateName[0] = "Activate";
stateTimeoutValue[0] = 0.1;
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.7;
stateWaitForTimeout[2] = false;
stateTransitionOnTriggerUp[2] = "AbortCharge";
stateScript[2]                  = "onCharge";
stateAllowImageChange[2]        = false;

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

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

stateName[5] = "Fire";
stateTransitionOnTimeout[5] = "Done";
stateTimeoutValue[5] = 0.5;
stateFire[5] = true;
stateSequence[5] = "fire";
stateScript[5] = "onFire";
stateWaitForTimeout[5] = true;
stateAllowImageChange[5] = false;
stateSound[5] = ThrowingspearFireSound;

stateName[6] = "Done";
stateScript[6] = "onDone";

That didn't work. It's still only unmounting from the hand but not from my inventory.
« Last Edit: December 09, 2015, 02:29:47 AM by Lord Tony® »

Oh whoops, i didn't notice something in the onCharge function

Overwrite your ThrowingSpearImage::onCharge function's script with this
Code: [Select]
%obj.playthread(2, spearReady);
%obj.ThrowingSpearSlot = %obj.currTool;

Alright that worked, now only 2 issues left and it's ready for release.

The spear is brown here


Different color for projectile






Code: [Select]
datablock ParticleEmitterData(ThrowingspearExplosionEmitter2)
{
   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   lifetimeMS       = 7;
   ejectionVelocity = 15;
   velocityVariance = 5.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "ThrowingspearExplosionParticle2";

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



I don't understand the discoloration, the script and model is almost no different from the default spear.