Author Topic: scripting help needed  (Read 313 times)

The following script belongs to the stone add-on from the element spell pack. I want to know what will I have to change about this script to ether decrease the amount of MP needed to use the attack with the magician player types or increase the amount of mp the player will have when equipped with the stone weapon. Ether or would be help full but if you know both plz post both and the number of the lines containing the part of the script needing be changed. Alos I will need to know what to do with it. (no irrelevant comments plz)



datablock audioProfile(StoneExplodeSound)
{
   fileName = "Add-Ons/Weapon_ElementalSpells/Sounds/StoneExplode.wav";
   description = AudioDefault3D;
   preload = true;
};
datablock audioProfile(StoneFireSound)
{
   fileName = "Add-Ons/Weapon_ElementalSpells/Sounds/StoneFire.wav";
   description = AudioClosest3D;
   preload = true;
};

datablock ParticleData(StoneAmbientParticle)
{
   dragCoefficient = 0;
   windCoefficient = 0;
   gravityCoefficient = 0.35;
   inheritedVelFactor = 0.25;
   constantAcceleration = 0;
   lifetimeMS = 1200;
   lifetimeVarianceMS = 500;
   spinSpeed = 0;
   spinRandomMin = -900;
   spinRandomMax = 900;
   useInvAlpha = true;
   framesPerSec = 1;
   textureName = "base/data/particles/cloud";

   colors[0] = "0.6 0.35 0 1";
   colors[1] = "0.5 0.25 0 1";
   colors[2] = "0.25 0.125 0 0";
   sizes[0] = 0.25;
   sizes[1] = 0.33;
   sizes[2] = 0.1;
   times[0] = 0;
   times[1] = 0.5;
   times[2] = 1;
};
datablock ParticleEmitterData(StoneAmbientEmitter)
{
   ejectionPeriodMS = 30;
   periodVarianceMS = 5;
   ejectionVelocity = 1;
   velocityVariance = 0;
   ejectionOffset = 0;
   thetaMin = 0;
   thetaMax = 180;
   phiReferenceVel = 0;
   phiVariance = 360;
   particles = StoneAmbientParticle;
   uiName = "Stone - Ambient";
};

datablock DebrisData(stoneShardDebris)
{
   emitters = StoneAmbientEmitter;

   shapeFile = "Add-Ons/Weapon_ElementalSpells/OtherShapes/StoneShard.dts";
   lifetime = 3;
   minSpinSpeed = -200;
   maxSpinSpeed = 200;
   elasticity = 0.5;
   friction = 0.2;
   numBounces = 1;
   staticOnMaxBounce = true;
   snapOnMaxBounce = false;
   fade = true;

   gravModifier = 1.5;
};

datablock ParticleData(StoneExplosionParticle)
{
   dragCoefficient = 1;
   windCoefficient = 0;
   gravityCoefficient = 1;
   inheritedVelFactor = 0;
   constantAcceleration = 0;
   lifetimeMS = 1100;
   lifetimeVarianceMS = 300;
   spinSpeed = 0;
   spinRandomMin = -900;
   spinRandomMax = 900;
   useInvAlpha = true;
   textureName = "base/data/particles/cloud";
   colors[0] = "0.8 0.65 0.30 1";
   colors[1] = "0.75 0.50 0 1";
   colors[2] = "0.50 0.25 0 0";
   sizes[0] = 0.8;
   sizes[1] = 0.7;
   sizes[2] = 0.6;
   times[0] = 0;
   times[1] = 0.5;
   times[2] = 1;
};
datablock ParticleEmitterData(StoneExplosionEmitter)
{
   ejectionPeriodMS = 1;
   periodVarianceMS = 0;
   ejectionVelocity = 25;
   velocityVariance = 0;
   ejectionOffset = 1;
   thetaMin = 0;
   thetaMax = 75;
   phiReferenceVel = 0;
   phiVariance = 360;
   particles = StoneExplosionParticle;
   lifetimeMS = 300;
};

datablock ExplosionData(StoneExplosion)
{
   soundProfile = StoneExplodeSound;

   lifeTimeMS = 200;

   particleEmitter = StoneExplosionEmitter;
   particleDensity = 100;
   particleRadius = 5;

   debris = stoneShardDebris;
   debrisNum = 5;
   debrisNumVariance = 1;
   debrisPhiMin = 0;
   debrisPhiMax = 360;
   debrisThetaMin = 15;
   debrisThetaMax = 60;
   debrisVelocity = 22;
   debrisVelocityVariance = 2;

   emitter[0] = StoneExplosionEmitter;

   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;

   lightStartRadius = 10;
   lightEndRadius = 1;
   lightStartColor = "1 0.5 0";
   lightEndColor = "1 0.5 0";
};

AddDamageType("StoneSpike", '<bitmap:Add-Ons/Weapon_ElementalSpells/Icons/CI_Stone> %1', '%2 <bitmap:Add-Ons/Weapon_ElementalSpells/Icons/CI_Stone> %1', 1, 1);

datablock ProjectileData(StoneMProjectile)
{
   shapeFile = "base/data/shapes/empty.dts";
   directDamage = 0;
   directDamageType = $DamageType::StoneSpike;
   radiusDamageType = $DamageType::StoneSpike;

   brickExplosionRadius = 5;
   brickExplosionImpact = true;
   brickExplosionForce = 50;
   brickExplosionMaxVolume = 15;
   brickExplosionMaxVolumeFloati ng = 25;

   impactImpulse = 0;
   verticalImpulse = 0;
   explosion = StoneExplosion;
   particleEmitter = StoneAmbientEmitter;

   muzzleVelocity = 60;
   velInheritFactor = 1;

   armingDelay = 0;
   lifetime = 4000;
   fadeDelay = 3500;
   bounceElasticity = 0.5;
   bounceFriction = 0.20;
   isBallistic = true;
   gravityMod = 1;

   hasLight = true;
   lightRadius = 2;
   lightColor = "1 0.5 0";

   uiName = "Stone Spike";
};

datablock StaticShapeData(StoneSpikeData)
{
   category = "Statics";
   shapeFile = "Add-Ons/Weapon_ElementalSpells/OtherShapes/StoneSpike.dts";
   skinName = 'null';
};

function StoneMProjectile::onCollision(%this, %obj, %col, %fade, %pos, %normal)
{
   if(strPos(%col.getClassName(), "Player") != -1)
   {
      %start = %col.getPosition();
      %end = vectorAdd(%start, "0 0 " @ -2 * getWord(%col.getScale(), 2));
      %ray = containerRayCast(%start, %end, $TypeMasks::FxBrickObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType);
      if(!isObject(%col = firstWord(%ray)))
      {
         return;
      }
      %pos = posFromRaycast(%ray);
      %normal = normalFromRaycast(%ray);
   }
   if(%col.getType() & $TypeMasks::InteriorObjectType || %col.getType() & $TypeMasks::FxBrickObjectType || %col.getType() & $TypeMasks::TerrainObjectType)
   {
      %scale = %obj.getScale();
      %spike = new TSstatic()
      {
         datablock = StoneSpikeData;
         shapeName = "Add-Ons/Weapon_ElementalSpells/OtherShapes/StoneSpike.dts";
         position = %pos;
         rotation = "0 0 0 0";
         scale = %scale;
      };
      MissionCleanup.add(%spike);
      for(%i = 2; %i <= 24; %i++)
      {
         %spike.schedule(%i * 200, setScale, vectorScale(%scale, 1 / (%i / 2)));
      }
      StoneSpikeData.schedule(10, doDamage, %spike, %obj.sourceObject, %pos, %scale);
      %spike.schedule(5000, delete);
   }
}

function StoneSpikeData::doDamage(%data, %spike, %obj, %pos, %scale)
{
   %scale = getWord(%scale, 2);
   %typemasks = $Typemasks::PlayerObjectType | $Typemasks::VehicleObjectType;
   InitContainerRadiusSearch(%pos, 3 * %scale, %typemasks);
   while(isObject(%hit = ContainerSearchNext()))
   {
      if(minigameCanDamage(%obj, %hit) && getMinigameFromObject(%hit).weaponDamage)
      {
         %hit.damage(%obj, %pos, 10 * %scale, $DamageType::StoneSpike);
         %add = vectorScale(vectorAdd("0 0 10", getRandom(-2, 2) SPC getRandom(-2, 2) SPC getRandom(0, 5)), %scale);
         %hit.setVelocity(vectorAdd(%hit.getVelocity(), %add));
         %hit.lastPusher = %obj.sourceObject;
         %hit.lastPushTime = getSimTime();
      }
   }
   %boxpos = vectorAdd(%pos, "0 0 " @ %scale * 3);
   %boxsize = vectorScale("3 3 7", %scale);
   InitContainerBoxSearch(%boxpos, %boxsize, %typemasks);
   while(isObject(%hit = ContainerSearchNext()))
   {
      if(minigameCanDamage(%obj, %hit) && getMinigameFromObject(%hit).weaponDamage)
      {
         %hit.damage(%obj, %pos, 15 * %scale, $DamageType::StoneSpike);
         %hit.lastPusher = %obj.sourceObject;
         %hit.lastPushTime = getSimTime();
         %add = vectorScale(vectorAdd("0 0 10", getRandom(-5, 5) SPC getRandom(-5, 5) SPC getRandom(0, 5)), %scale);
         %hit.setVelocity(vectorAdd(%hit.getVelocity(), %add));
      }
   }
}

datablock ItemData(StoneMItem)
{
   category = "Weapon";
   className = "Weapon";

   shapeFile = "Add-Ons/Weapon_ElementalSpells/ItemShapes/Stone.dts";
   rotate = false;
   mass = 0.5;
   density = 0.7;
   elasticity = 0.6;
   friction = 0.6;
   emap = true;

   uiName = "Magic - Stone";
   iconName = "Add-Ons/Weapon_ElementalSpells/Icons/Icon_Stone";
   doColorShift = false;
   colorShiftColor = "1 1 1 1";

   image = StoneMImage;
   canDrop = true;
};

datablock ShapeBaseImageData(StoneMImage)
{
   shapeFile = "base/data/shapes/empty.dts";
   emap = true;

   mountPoint = 0;
   offset = "0 0 0";
   eyeOffset = 0;
   rotation = "0 0 0";

   correctMuzzleVector = true;

   className = "WeaponImage";

   item = StoneMItem;
   ammo = " ";
   MPused = 75;
   projectile = StoneMProjectile;
   projectileType = Projectile;

   melee = false;
   armReady = true;

   doColorShift = false;
   colorShiftColor = "1 1 1 1";

   NoAbsorb["FireM"] = 1; //Damage from type "FireM" is not reduced
   NoAbsorb["WindM"] = 1; //Damage from type "WindM" is not reduced

   stateName[0]                   = "Activate";
   stateTimeoutValue[0]           = 0.15;
   stateTransitionOnTimeout[0]    = "Ready";
   stateSound[0]                  = weaponSwitchSound;

   stateName[1]                   = "Ready";
   stateTransitionOnTriggerDown[1]= "Fire";
   stateAllowImageChange[1]       = true;
   stateEmitter[1]                = StoneAmbientEmitter;
   stateEmitterTime[1]            = 300;

   stateName[2]                   = "Fire";
   stateTransitionOnTimeout[2]    = "Reload";
   stateTimeoutValue[2]           = 1;
   stateFire[2]                   = true;
   stateAllowImageChange[2]       = false;
   stateSequence[2]               = "Fire";
   stateScript[2]                 = "onFire";
   stateWaitForTimeout[2]         = true;
   stateSound[2]                  = StoneFireSound;
   stateEjectShell[2]             = true;

   stateName[3]                   = "Reload";
   stateTransitionOnTriggerUp[3]  = "Ready";
};

function StoneMImage::onFire(%this, %obj, %slot)
{
   if(%obj.lst[%this] > getSimTime())
   {
      return;
   }
   %obj.lst[%this] = getSimTime() + 1000;
   if(%obj.getDatablock().isMage)
   {
      if(%obj.hasEnergy(%this.MPused))
      {
         parent::onFire(%this, %obj, %slot);
         %obj.setEnergyLevel(%obj.getEnergyLevel() - %this.MPused);
      }
      else if(isObject(%client = %obj.getControllingClient()))
      {
         %client.centerPrint("\c4Not enough MP!<br>\c3" @ %obj.getEnergyLevel() @ "/" @ %this.MPused, 3);
      }
   }
   else
   {
      parent::onFire(%this, %obj, %slot);
   }
}

package MagicStone
{
   function armor::damage(%this, %obj, %sourceObject, %pos, %amt, %type)
   {
      %img = %obj.getMountedImage(0);
      if(%img == StoneMImage.getID())
      {
         if(!%img.NoAbsorb[$DamageType_Array[%type]])
         {
            %amt*= 0.75;
         }
      }
      parent::damage(%this, %obj, %sourceObject, %pos, %amt, %type);
   }
};
activatePackage(MagicStone);

Put this in Coding Help. And never copypaste the code into the OP without [code ] tags.