Author Topic: Stating/Animation with Weapons  (Read 929 times)

There is this problem I have with these two weapons that are completely similiar but color and naming. From TRON Legacy. The orange and blue Light discs. So, I copied the Spear script and edited it with quite some effort, but not alot. They have an issue I can't seem to fix.

They both do not play the animations to fire. They do fire after holding, but doesn't show the animations.

I will show the "LightdiscBlue" script just that because it is almost completely similiar to "LightdiscOrange". The orange one just has different colors and naming.

Code: [Select]
//LightdiscBlue.cs


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

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


//LightdiscBlue trail
datablock ParticleData(LightdiscBlueTrailParticle)
{
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/dot";
//animTexName = " ";

// Interpolation variables
colors[0] = "0.0 0.7 0.9 0.9";
colors[1] = "0.0 0.9 1.0 0.8";
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.1;
times[2] = 1.0;
};

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

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

   ejectionOffset = 0;

   thetaMin         = 0.0;
   thetaMax         = 90.0; 

   particles = LightdiscBlueTrailParticle;

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


//effects
datablock ParticleData(LightdiscBlueExplosionParticle)
{
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] = 4.0;
sizes[1] = 7.0;
times[0] = 0.0;
times[1] = 1.0;
};

datablock ParticleEmitterData(LightdiscBlueExplosionEmitter)
{
   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 = "LightdiscBlueExplosionParticle";

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

datablock ParticleData(LightdiscBlueExplosionParticle2)
{
dragCoefficient = 0.1;
windCoefficient = 0.0;
gravityCoefficient = 2.0;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 1000;
lifetimeVarianceMS = 500;
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.5;
sizes[1] = 0.5;
times[0] = 0.0;
times[1] = 1.0;
};

datablock ParticleEmitterData(LightdiscBlueExplosionEmitter2)
{
   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 = "LightdiscBlueExplosionParticle2";

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

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

   soundProfile = LightdiscBlueExplosionSound;

   emitter[0] = LightdiscBlueExplosionEmitter;
   emitter[1] = LightdiscBlueExplosionEmitter2;
   //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 = 3.5;
   impulseForce = 2000;

   //radius damage
   radiusDamage        = 40;
   damageRadius        = 3.5;
};

//projectile
AddDamageType("LightdiscBlueDirect",   '<bitmap:add-ons/Weapon_Lightdisc/CI_Lightdisc> %1',       '%2 <bitmap:add-ons/Weapon_Lightdisc/CI_Lightdisc> %1',1,1);
datablock ProjectileData(LightdiscBlueProjectile)
{
   projectileShapeName = "./LightdiscBlue.dts";
   directDamage        = 50;
   directDamageType  = $DamageType::LightdiscBlueDirect;
   radiusDamageType  = $DamageType::LightdiscBlueDirect;
   impactImpulse    = 1000;
   verticalImpulse    = 1000;
   explosion           = LightdiscBlueExplosion;
   particleEmitter     = LightdiscBlueTrailEmitter;

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

   muzzleVelocity      = 50;
   velInheritFactor    = 1;

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

   hasLight    = True;
   lightRadius = 3.0;
   lightColor  = "0 0 1";

   uiName = "Lightdisc Blue";
};


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

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

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

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

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

////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(LightdiscBlueImage)
{
   // Basic Item properties
   shapeFile = "./LightdiscBlue.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 = LightdiscBlueItem;
   ammo = " ";
   projectile = LightdiscBlueProjectile;
   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] = LightdiscBlueFireSound;
};

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

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

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

The states might have something to do with this I think.

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

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

function LightdiscBlueImage::onFire(%this, %obj, %slot)
{
%obj.playthread(2, spearThrow);
Parent::onFire(%this, %obj, %slot);
}
Animations for the spear are named "spearX". Changing it would result in it not playing the animation.

Wait what? You mean like spearXReady and spearXThrow?

Wait what? You mean like spearXReady and spearXThrow?
No,  no, no.
I used X as the variable. Basically, it means that the animations always start with spear and end with ready or throw.
Code: [Select]
function LightdiscBlueImage::onCharge(%this, %obj, %slot)
{
%obj.playthread(2, spearReady);
}

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

function LightdiscBlueImage::onFire(%this, %obj, %slot)
{
%obj.playthread(2, spearThrow);
Parent::onFire(%this, %obj, %slot);
}
Just use that for the end to get the animation to work.

I can get confused easily sometimes. So, like: spearReadyX and spearThrowX?


Edit: ^ Obviously not because I tried this. ^
« Last Edit: May 20, 2011, 03:30:36 PM by Uxie »

I can get confused easily sometimes. So, like: spearReadyX and spearThrowX?


Edit: ^ Obviously not because I tried this. ^
Just use "spearReady" and "spearThrow". Ignore what I said earlier if it didn't make sense. :)

Just use "spearReady" and "spearThrow". Ignore what I said earlier if it didn't make sense. :)
What.

That's kinda what ISN'T working.

What.

That's kinda what ISN'T working.
Your script appears to be using "LightdiscBlueReady" and "LightdiscBlueThrow"

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

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

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

with

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

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

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

Don't use find and replace.
Code: [Select]
%obj.playthread(2, spearReady);That is the animation called when you charge the spear. It's not a spear animation, it's a player animation. All the bottom scripts call player animations, not item animations. There is not LightdiscBlueReady player animation, so it does nothing.