Sorry about the title, this is a simplified tut for a concept ChildKiller posted in his "James Bond pack" tut, from code originally by Badshot, and including a bug fix I found (the hard way, of course)... This tut assumes you can already set up a pack in all the other necessary .cs files, and are ready to create the pack itself. The example pack is called a "CheetahPack", and when activated, increases the player's run power, speed caps, and jump power, at the cost of energy and increased heating... Create a blank script called cheetahPack.cs, and paste this into it: Code: -------------------------------------------------------------------------------- // ------------------------------------------------------------------ // Cheetah Pack // can be used by any armor type // while activated, increases speed and jump power at cost of energy datablock EffectProfile(CheetahPackActivateEffect) { effectname = "packs/shield_on"; minDistance = 2.5; maxDistance = 2.5; }; datablock AudioProfile(CheetahPackActivateSound) { filename = "fx/packs/shield_on.wav"; description = ClosestLooping3d; preload = true; effect = CheetahPackActivateEffect; }; datablock ShapeBaseImageData(CheetahPackImage) { shapeFile = "pack_upgrade_shield.dts"; item = CheetahPack; mountPoint = 1; offset = "0 0 0"; usesEnergy = true; minEnergy = 3; stateName[0] = "Idle"; stateTransitionOnTriggerDown[0] = "Activate"; stateName[1] = "Activate"; stateScript[1] = "onActivate"; stateSequence[1] = "fire"; stateSound[1] = CheetahPackActivateSound; stateEnergyDrain[1] = 5; stateTransitionOnTriggerUp[1] = "Deactivate"; stateTransitionOnNoAmmo[1] = "Deactivate"; stateName[2] = "Deactivate"; stateScript[2] = "onDeactivate"; stateTransitionOnTimeout[2] = "Idle"; }; datablock ItemData(CheetahPack) { className = Pack; catagory = "Packs"; shapeFile = "pack_upgrade_shield.dts"; mass = 1; elasticity = 0.2; friction = 0.6; pickupRadius = 2; rotate = true; image = "CheetahPackImage"; pickUpName = "a Cheetah pack"; computeCRC = true; }; function CheetahPackImage::onMount(%data, %obj, %node) { } function CheetahPackImage::onUnmount(%data, %obj, %node) { %obj.setImageTrigger(%node, false); %client = %obj.client; if(%obj.getState() !$= "Dead") { //find the actual heat, damage and energy %curHeatLvl = %obj.client.player.getHeat(); %curDmgLvl = %obj.client.player.getDamageLevel(); %curEnergyLevel = %obj.client.player.getEnergyLevel(); // it reset the changes %armorname = %obj.getDatablock().getName(); %length = strlen(%armorname); %lastchar = getSubStr(%armorname,%length-1,%length); %newarmor = getSubStr(%armorname, 0, %length-1); if (%lastchar == 2) %obj.setDataBlock(%newarmor); //now put the original heat, damage and energy %obj.client.player.setEnergyLevel(%curEnergyLevel); %obj.client.player.setDamageLevel(%curDmgLvl); %obj.client.player.setHeat(%curHeatLvl); } } function CheetahPackImage::onActivate(%data, %obj, %slot) { messageClient(%obj.client, 'MsgCheetahPackOn', '\c2Cheetah pack on.'); %client = %obj.client; //find the actual heat, damage and energy %curHeatLvl = %obj.client.player.getHeat(); %curDmgLvl = %obj.client.player.getDamageLevel(); %curEnergyLevel = %obj.client.player.getEnergyLevel(); //here to call the second datablock %armorname = %obj.getDatablock().getName(); %length = strlen(%armorname); %lastchar = getSubStr(%armorname,%length-1,%length); %newarmor = %armorname @ 2; if (%lastchar != 2) %obj.setDataBlock(%newarmor); //now put the original heat, damage and energy %obj.client.player.setEnergyLevel(%curEnergyLevel); %obj.client.player.setDamageLevel(%curDmgLvl); %obj.client.player.setHeat(%curHeatLvl); if ( !isDemo() ) commandToClient( %obj.client, 'setShieldIconOn' ); } function CheetahPackImage::onDeactivate(%data, %obj, %slot) { messageClient(%obj.client, 'MsgCheetahPackOff', '\c2Cheetah pack off.'); %obj.setImageTrigger(%slot,false); %client = %obj.client; if(%obj.getState() !$= "Dead") { //find the actual heat, damage and energy %curHeatLvl = %obj.client.player.getHeat(); %curDmgLvl = %obj.client.player.getDamageLevel(); %curEnergyLevel = %obj.client.player.getEnergyLevel(); // it reset the changes %armorname = %obj.getDatablock().getName(); %length = strlen(%armorname); %lastchar = getSubStr(%armorname,%length-1,%length); %newarmor = getSubStr(%armorname, 0, %length-1); if (%lastchar == 2) %obj.setDataBlock(%newarmor); //now put the original heat, damage and energy %obj.client.player.setEnergyLevel(%curEnergyLevel); %obj.client.player.setDamageLevel(%curDmgLvl); %obj.client.player.setHeat(%curHeatLvl); } if ( !isDemo() ) commandToClient( %obj.client, 'setShieldIconOff' ); } function CheetahPack::onPickup(%this, %obj, %shape, %amount) { // created to prevent console errors } -------------------------------------------------------------------------------- if(%obj.getState() !$= "Dead") is the bug fix- without it, when the pack is thrown at death and the game changes datablocks again, the death animation will get lost in the shuffle, and you will get a "statue"... Next, open player.cs and create your modifiers at the top" Code: -------------------------------------------------------------------------------- $runMod = 10; $heatMod = 1.5; -------------------------------------------------------------------------------- I got this idea from base++ mod, it seems to me it is easier to create the multipliers and tweak them than to constantly figure a new replacement value for the armor... Next, create a datablock at the bottom of player.cs for each armor you want to use the pack: by sex, race, size, or mod-specific armors, like so: Code: -------------------------------------------------------------------------------- datablock PlayerData(LightMaleBiodermArmor2) : LightMaleBiodermArmor { runForce = 40.25 * 180 * $runMod; runEnergyDrain = 0.1; minRunEnergy = 0; maxForwardSpeed = 7 * $runMod; maxBackwardSpeed = 5 * $runMod; maxSideSpeed = 5 * $runMod; maxUnderwaterForwardSpeed = 4.5 * $runMod; maxUnderwaterBackwardSpeed = 3 * $runMod; maxUnderwaterSideSpeed = 3 * $runMod; jumpForce = 8.3 * 180 * $runMod; jumpEnergyDrain = 0.1; minJumpEnergy = 0; heatIncreasePerSec = 0.33 * $heatMod; maxJumpSpeed = 30 * $runMod; horizMaxSpeed = 52 * $runMod; }; -------------------------------------------------------------------------------- Then tweak the modifiers. You can have multiple packs that use this effect, just increment the armors and code: Code: -------------------------------------------------------------------------------- datablock PlayerData(LightMaleBiodermArmor3) : LightMaleBiodermArmor { // your changes }; -------------------------------------------------------------------------------- and Code: -------------------------------------------------------------------------------- %newarmor = %armorname @ 3; if (%lastchar != 3) -------------------------------------------------------------------------------- etc... etc... The example pack is tested, but not practical as posted, but it is funny... Players take damage at almost any impact at these speeds...