Author Topic: Multiple Coding Questions  (Read 1745 times)

Where would I find this value?

Also, is there a way to lock a player in place (but aiming with mouse still works) when he equips an item?

Also Also, when I make a weapon in MS3D, do I set it for a bounding box or a cylinder? I made one, and it looked like a big grey box in 3rd Person.

Also Also Also, I followed the vehicle tut and my vehicle won't show up on the Spawn List. It is enabled and the UI name is changed. What went wrong?
« Last Edit: August 11, 2007, 01:03:11 PM by BlockBuilderMan »

There is a "mass = 90; //3100 lbs" (or something similar) line in the Jeep code, as well as a density line under it.

Make a player datablock with no movement power. Switch the player to that when items are equipped and apply body parts/colours to the client and back to the original datablock (save it in code) when you de-equip it.

I don't use Milkshape... Make sure you have named the nodes/joints right and if you have to parent them correctly.

Have you changed the datablock name? (datablock WheeledVehicleData(JeepVehicle))

I don't know how to stop the collision appearing in 3rd person, and apparently, neither did anyone else. Just export with no collision.

Thank you so much!

EDIT: I Checked all datablocks and they are all set to <myvecname>explosion or something

EDIT2: Apparntley add-ons don't work when in a sub-folder *slaps self*



EDIT3: Crap, when I spawn my new weapon, it looks like this:




It's pretty much cross sectioned. This hasen't happened before!
« Last Edit: August 11, 2007, 08:11:00 AM by BlockBuilderMan »

It looks like you've designed it inside out - is there an option to "flip face normals" in Milkshape? Try that.

I can'f ind one, dunno if there is one. I made it normally, I don't see what happened.

EDIT: "Reverse vertex order" worked. Something must of happened when I resized it to fit the the hand.

EDIT2: What is the function when a player unequips an item? I know that equip is
Code: [Select]
function smawImage::onFire(%this, %obj, %slot)

EDIT3: When I try to use the bullet-variance code (You know, where the bullets don't hit exactly where the crosshair is pointing) from the T21, M16, or AKS, (I was going to give credit), it doesn't change items in my hand. EG: Above my weapon (in inv) is a printer. When I scroll down (from printer) the little white circle moves down, but the item in my hand doesnt. What happened?

EDIT4: When trying to use:
Code: [Select]
function ---Image::onuse(%this, %obj, %slot);
   %client.player.setDataBlock("PlayerStopArmor");
to lock a player in place when they use a weapon, it does the same thing as for EDIT3
« Last Edit: August 11, 2007, 01:57:50 PM by BlockBuilderMan »

function smawImage::onMount(%this,%obj,%slot)
{
 Parent::onMount(%this,%obj,%slot);
 %obj.data = %obj.getDatablock();
 %obj.setDatablock(PlayerStopArmor);
}

function smawImage::onMount(%this,%obj,%slot)
{
 Parent::onMount(%this,%obj,%slot);
 %obj.setDatablock(%obj.data);
}

Thanks, but it's still doing the same thing. Maybe looking at code will help.
Code: [Select]
//Made by MrBob

//audio
datablock AudioProfile(smawShot1Sound)
{
   filename    = "./sound/gunShot1.wav";
   description = AudioClose3d;
   preload = true;
};
datablock AudioProfile(bulletHitSound)
{
   filename    = "./sound/arrowHit.wav";
   description = AudioClose3d;
   preload = true;
};


//shell
datablock DebrisData(smawShellDebris)
{
shapeFile = "./shapes/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(smawFlashParticle)
{
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(smawFlashEmitter)
{
   ejectionPeriodMS = 3;
   periodVarianceMS = 0;
   ejectionVelocity = 1.0;
   velocityVariance = 1.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "smawFlashParticle";
};

datablock ParticleData(smawSmokeParticle)
{
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(smawSmokeEmitter)
{
   ejectionPeriodMS = 3;
   periodVarianceMS = 0;
   ejectionVelocity = 1.0;
   velocityVariance = 1.0;
   ejectionOffset   = 0.0;
   thetaMin         = 0;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "smawSmokeParticle";
};


//bullet trail effects
datablock ParticleData(bulletTrailParticle)
{
dragCoefficient      = 3;
gravityCoefficient   = -0.0;
inheritedVelFactor   = 1.0;
constantAcceleration = 0.0;
lifetimeMS           = 525;
lifetimeVarianceMS   = 55;
textureName          = "base/data/particles/thinRing";
spinSpeed = 10.0;
spinRandomMin = -500.0;
spinRandomMax = 500.0;
colors[0]     = "0.3 0.3 0.9 0.4";
colors[1]     = "0.5 0.5 0.5 0.0";
sizes[0]      = 0.15;
sizes[1]      = 0.25;

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


datablock ParticleData(smawExplosionParticle)
{
dragCoefficient      = 8;
gravityCoefficient   = -0.5;
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.6 0.9";
colors[1]     = "0.9 0.5 0.6 0.0";
sizes[0]      = 0.25;
sizes[1]      = 1.0;

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


datablock ParticleData(smawExplosionRingParticle)
{
dragCoefficient      = 8;
gravityCoefficient   = -0.5;
inheritedVelFactor   = 0.2;
constantAcceleration = 0.0;
lifetimeMS           = 300;
lifetimeVarianceMS   = 100;
textureName          = "base/data/particles/star1";
spinSpeed = 10.0;
spinRandomMin = -50.0;
spinRandomMax = 50.0;
colors[0]     = "1 1 0.0 0.9";
colors[1]     = "0.9 0.0 0.0 0.0";
sizes[0]      = 0.2;
sizes[1]      = 0.2;

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

   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   ejectionVelocity = 5;
   velocityVariance = 0.0;
   ejectionOffset   = 0.0;
   thetaMin         = 89;
   thetaMax         = 90;
   phiReferenceVel  = 0;
   phiVariance      = 360;
   overrideAdvance = false;
   particles = "smawExplosionRingParticle";
};

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

   lifeTimeMS = 150;

   particleEmitter = gunExplosionEmitter;
   particleDensity = 10;
   particleRadius = 0.2;

   emitter[0] = gunExplosionRingEmitter;

   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("smaw",   '<bitmap:add-ons/ci/smaw> %1',    '%2 <bitmap:add-ons/ci/smaw> %1',0.5,1);
datablock ProjectileData(smawProjectile)
{
   projectileShapeName = "./shapes/bullet.dts";
   directDamage        = 10;
   directDamageType    = $DamageType::smaw;
   radiusDamageType    = $DamageType::smaw;

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

   impactImpulse      = 700;
   verticalImpulse   = 1000;
   explosion           = smawExplosion;
   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";
};

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

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

//gui stuff
uiName = "SMAW9";
iconName = "./ItemIcons/gun.png";
doColorShift = true;
colorShiftColor = "0.25 0.25 0.25 1.000";

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

//function BowItem::onUse(%this, %player, %InvPosition)
//{
// //check for quiver
// //if you dont have it, regular bow
// //if you do, super bow
//
// %client = %player.client;
//
// %mountPoint = %this.image.mountPoint;
// %mountedImage = %player.getMountedImage(%mountPoint);
//
//
// if(%mountedImage)
// {
// if(%mountedImage == bowImage.getId() || %mountedImage == superbowImage.getId())
// {
// //some kind of bow mounted so, unmount it
// %player.unMountImage(%mountPoint);
// messageClient(%client, 'MsgHilightInv', '', -1);
// %player.currWeaponSlot = -1;
// }
// else
// {
// //something other than bow mounted, so do bow selection and mount
// if(%player.getMountedImage($BackSlot))
// {
// if(%player.getMountedImage($BackSlot) == quiverImage.getId())
// {
// %player.mountimage(superBowImage, $RightHandSlot, 1, %skin);
// messageClient(%client, 'MsgHilightInv', '', %InvPosition);
// %player.currWeaponSlot = %invPosition;
// }
// else
// {
// %player.mountimage(bowImage, $RightHandSlot, 1, %skin);
// messageClient(%client, 'MsgHilightInv', '', %InvPosition);
// %player.currWeaponSlot = %invPosition;
// }
// }
// else
// {
// %player.mountimage(bowImage, $RightHandSlot, 1, %skin);
// messageClient(%client, 'MsgHilightInv', '', %InvPosition);
// %player.currWeaponSlot = %invPosition;
// }
// }
//
// }
// else
// {
// //nothing mounted so do bow selection and mount
// //something other than bow mounted, so do bow selection and mount
// if(%player.getMountedImage($BackSlot))
// {
// if(%player.getMountedImage($BackSlot) == quiverImage.getId())
// {
// %player.mountimage(superBowImage, $RightHandSlot, 1, %skin);
// messageClient(%client, 'MsgHilightInv', '', %InvPosition);
// %player.currWeaponSlot = %invPosition;
// }
// else
// {
// %player.mountimage(bowImage, $RightHandSlot, 1, %skin);
// messageClient(%client, 'MsgHilightInv', '', %InvPosition);
// %player.currWeaponSlot = %invPosition;
// }
// }
// else
// {
// %player.mountimage(bowImage, $RightHandSlot, 1, %skin);
// messageClient(%client, 'MsgHilightInv', '', %InvPosition);
// %player.currWeaponSlot = %invPosition;
// }
// }
//}

////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(smawImage)
{
   // Basic Item properties
   shapeFile = "./shapes/MTDM/SMAW.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 = smawProjectile;
   projectileType = Projectile;

casing = smawShellDebris;
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 = smawItem.colorShiftColor;//"0.400 0.196 0 1.000";
     
     function smawImage::onMount(%this,%obj,%slot)
     {
     Parent::onMount(%this,%obj,%slot);
     %obj.data = %obj.getDatablock();
     %obj.setDatablock(PlayerStopArmor);
     }

     function smawImage::onMount(%this,%obj,%slot)
     {
     Parent::onMount(%this,%obj,%slot);
    %obj.setDatablock(%obj.data);
    }

   //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.015;
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.014;
stateFire[2]                    = true;
stateAllowImageChange[2]        = false;
stateSequence[2]                = "Fire";
stateScript[2]                  = "onFire";
stateWaitForTimeout[2] = true;
stateEmitter[2] = smawFlashEmitter;
stateEmitterTime[2] = 0.01;
stateEmitterNode[2] = "muzzleNode";
stateSound[2] = smawShot1Sound;
stateEjectShell[2]              = true;

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

stateName[4]         = "Reload";
stateSequence[4]                = "Reload";
stateAllowImageChange[4]        = false;
stateTimeoutValue[4]            = 0.05;
stateWaitForTimeout[4]     = true;
stateTransitionOnTimeout[4]     = "Check";

stateName[5]         = "Check";
stateTransitionOnTriggerUp[5] = "StopFire";
stateTransitionOnTriggerDown[5] = "Fire";

stateName[6]                    = "StopFire";
stateTransitionOnTimeout[6]     = "Ready";
stateTimeoutValue[6]            = 0.175;
stateAllowImageChange[6]        = false;
stateWaitForTimeout[6]     = true;
//stateSequence[6]                = "Reload";
stateScript[6]                  = "onStopFire";};

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

Replace all after //Weapon Image// with this:

Code: [Select]
////////////////
//weapon image//
////////////////
datablock ShapeBaseImageData(smawImage)
{
   // Basic Item properties
   shapeFile = "./shapes/MTDM/SMAW.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 = smawProjectile;
   projectileType = Projectile;

casing = smawShellDebris;
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 = smawItem.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.015;
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.014;
stateFire[2]                    = true;
stateAllowImageChange[2]        = false;
stateSequence[2]                = "Fire";
stateScript[2]                  = "onFire";
stateWaitForTimeout[2] = true;
stateEmitter[2] = smawFlashEmitter;
stateEmitterTime[2] = 0.01;
stateEmitterNode[2] = "muzzleNode";
stateSound[2] = smawShot1Sound;
stateEjectShell[2]              = true;

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

stateName[4]         = "Reload";
stateSequence[4]                = "Reload";
stateAllowImageChange[4]        = false;
stateTimeoutValue[4]            = 0.05;
stateWaitForTimeout[4]     = true;
stateTransitionOnTimeout[4]     = "Check";

stateName[5]         = "Check";
stateTransitionOnTriggerUp[5] = "StopFire";
stateTransitionOnTriggerDown[5] = "Fire";

stateName[6]                    = "StopFire";
stateTransitionOnTimeout[6]     = "Ready";
stateTimeoutValue[6]            = 0.175;
stateAllowImageChange[6]        = false;
stateWaitForTimeout[6]     = true;
//stateSequence[6]                = "Reload";
stateScript[6]                  = "onStopFire";
};

     function smawImage::onMount(%this,%obj,%slot)
     {
     Parent::onMount(%this,%obj,%slot);
     %obj.data = %obj.getDatablock();
     %obj.setDatablock(PlayerStopArmor);
     }

     function smawImage::onMount(%this,%obj,%slot)
     {
     Parent::onMount(%this,%obj,%slot);
    %obj.setDatablock(%obj.data);
    }

function smawImage::onFire(%this,%obj,%slot)
{
if(%obj.getDamagePercent() < 1.0)
%obj.playThread(2, shiftAway);
Parent::onFire(%this,%obj,%slot);
}
The functions don't go inside the weaponimage code, it goes after. Yours causes a syntax error, meaning the weapon is never created.

I can now mount my weapon, but it won't change into the stopped player. Maybe something wrong with my playercode:

//Stop.cs

//Stops the player. Is used for MGs and other heavy weaponary


datablock PlayerData(PlayerStopArmor : PlayerStandardArmor)
{
   runForce = 0 * 90;
   runEnergyDrain = 0;
   minRunEnergy = 0;
   maxForwardSpeed = 0;
   maxBackwardSpeed = 0;
   maxSideSpeed = 0;

   maxForwardCrouchSpeed = 3;
   maxBackwardCrouchSpeed = 3;
   maxSideCrouchSpeed = 3;

   jumpForce = 2 * 90; //8.3 * 90;
   jumpEnergyDrain = 0;
   minJumpEnergy = 0;
   jumpDelay = 0;

   minJetEnergy = 0;
   jetEnergyDrain = 0;
   canJet = 0;

   uiName = "Stopped Player";
   showEnergyBar = false;

   runSurfaceAngle  = 55;
   jumpSurfaceAngle = 55;
};

try replacing this
Code: [Select]
function smawImage::onMount(%this,%obj,%slot)
{
 Parent::onMount(%this,%obj,%slot);
 %obj.data = %obj.getDatablock();
 %obj.setDatablock(PlayerStopArmor);
}

function smawImage::onMount(%this,%obj,%slot)
{
 Parent::onMount(%this,%obj,%slot);
 %obj.setDatablock(%obj.data);
}

with this
Code: [Select]
function smawImage::onMount(%this,%obj,%slot)
{
 Parent::onMount(%this,%obj,%slot);
 %obj.data = %obj.getDatablock();
 %obj.setDatablock(PlayerStopArmor);
}

function smawImage::onUnMount(%this,%obj,%slot)
{
 Parent::onUnMount(%this,%obj,%slot);
 %obj.setDatablock(%obj.data);
}

It works now, thanks zor, but turns you funky when you use it. See below


Code: [Select]
function smawImage::onMount(%this,%obj,%slot)
{
Parent::onMount(%this,%obj,%slot);
%obj.data = %obj.getDatablock();
%obj.setDatablock(PlayerStopArmor);
%obj.client.applyBodyParts();
%obj.client.applyBodyColors();
}

function smawImage::onUnMount(%this,%obj,%slot)
{
Parent::onUnMount(%this,%obj,%slot);
%obj.setDatablock(%obj.data);
%obj.client.applyBodyParts();
%obj.client.applyBodyColors();
}