Author Topic: Knife Damage  (Read 439 times)

Code: [Select]
//////////////////////////////////////////////////////////////////////////////////////////////////
//   Support_RaycastingWeapons.cs  //
//Creator: Space Guy, Iban //
//Allows you to create weapons that function by instant raycasts rather than projectiles //
//Set these fields in the datablock: //
//raycastWeaponRange: Range of weapon (> 0) //
//raycastWeaponTargets: Typemasks //
//raycastWeaponPierceTargets: Typemasks (weapon fires through these targets, hitting each) //
//raycastDirectDamage: Direct Damage //
//raycastDirectDamageType: Damage Type ID //
//raycastCritDirectDamageType: Critical Hit Damage Type ID //
//raycastExplosionProjectile: Creates this projectile on impact //
//raycastExplosionSound: AudioProfile of sound to play on impact //
//raycastExplosionPlayerSound: AudioProfile of sound to play on hitting a player //
//raycastExplosionBrickSound: AudioProfile of sound to play on hitting a brick //
//raycastExplosionCritSound: AudioProfile of sound to play a critical impact //
//raycastSpreadAmt: Spread radius of weapon //
//raycastSpreadCount: Number of spreading projectiles //
//raycastTracerProjectile: Fires tracer projectiles along the spread path //
//raycastCritTracerProjectile: Fires tracer projectiles along the spread path if critical hit //
//raycastFromMuzzle: Fire from muzzle point to muzzle vector instead of eye //
// //
//Radius and Brick Damage can be done through the projectile and explosion. //
//////////////////////////////////////////////////////////////////////////////////////////////////

if($SpaceMods::Server::RaycastingWeaponsVersion > 2)
   return;

$SpaceMods::Server::RaycastingWeaponsVersion = 2;

package RaycastingFire
{
   function WeaponImage::onFire(%this,%obj,%slot)
   {
      if(%this.raycastWeaponRange <= 0)
         return Parent::onFire(%this,%obj,%slot);
     
      %targets = %this.raycastWeaponTargets;
      %ptargets = %this.raycastWeaponPierceTargets;
      %hit = 0;
      if(%this.raycastFromMuzzle)
      {
         %start = %obj.getMuzzlePoint(0);
         %aimVec = %obj.getMuzzleVector(0);
      }
      else
      {
         %start = %obj.getEyePoint();
         
         %fvec = %obj.getForwardVector();
         %fX = getWord(%fvec,0);
         %fY = getWord(%fvec,1);
         
         %evec = %obj.getEyeVector();
         %eX = getWord(%evec,0);
         %eY = getWord(%evec,1);
         %eZ = getWord(%evec,2);
         
         %eXY = mSqrt(%eX*%eX+%eY*%eY);
         
         %aimVec = %fX*%eXY SPC %fY*%eXY SPC %eZ;
      }
     
      if(%this.raycastSpreadCount <= 0)
         %shellcount = 1;
      else
         %shellcount = %this.raycastSpreadCount;
     
      %fireCrit = 0;
      %critHit = 1;
     
      for(%i=0;%i<%shellcount;%i++)
      {
         %shellCrit = 0;
         
         if(%this.raycastSpreadAmt > 0)
         {
            %spread = %this.raycastSpreadAmt;
           
            %vector = VectorScale(%aimVec, 100);
            %x = (getRandom() - 0.5) * 10 * 3.1415926 * %spread;
            %y = (getRandom() - 0.5) * 10 * 3.1415926 * %spread;
            %z = (getRandom() - 0.5) * 10 * 3.1415926 * %spread;
            %mat = MatrixCreateFromEuler(%x @ " " @ %y @ " " @ %z);
            %shotVec = vectorNormalize(MatrixMulVector(%mat, %vector));
         }
         else
            %shotVec = %aimVec;
         
         %range = %this.raycastWeaponRange*getWord(%obj.getScale(),2);
         if(%range > 100)
         {
            %rangeRem = %range - 100;
            %range = 100;
         }
         
         %end = vectorAdd(%start,vectorScale(%shotVec,%range));
         %pos = %end;
       
         %ray = ContainerRayCast(%start, %end, %targets, %obj);
         %col = getWord(%ray,0);
         if(isObject(%col))
         {
            %colType = %col.getType();
            %pos = posFromRaycast(%ray);
            %normal = normalFromRaycast(%ray);
            %end = %pos;
            %hit++;
           
            %crit = 0;
            if(isObject(CritProjectile))
            {
               if(%this.isRaycastCritical(%obj, %slot, %col, %pos, %normal, %hit))
               {
                  %crit = 1;
                  %shellCrit = 1;
                  %fireCrit = 1;
               }
            }
           
            %this.onHitObject(%obj, %slot, %col, %pos, %normal, %shotVec, %crit);
           
            if(%colType & %ptargets)
            {
               %rangeRem = %rangeRem + vectorLen(vectorSub(%pos,%start)) - 1;
               %end = vectorAdd(%end,vectorScale(%shotVec,1));
            }
            else
               %rangeRem = 0;
         }
         else
         {
            //%rangeRem = %rangeRem - 100;
            %crit = 0;
            if(isObject(CritProjectile))
            {
               if(%this.isRaycastCritical(%obj, %slot, -1, "0 0 0", "0 0 1", %hit))
               {
                  %crit = 1;
                  %shellCrit = 1;
                  %fireCrit = 1;
               }
            }
         }
         
         while(%rangeRem > 0)
         {
            %count++;
           
            %range = %rangeRem;
            if(%range >= 100)
            {
               %rangeRem = %range - 100;
               %range = 100;
            }
           
            %point = %end;
            %end = vectorAdd(%point,vectorScale(%shotVec,%range));
            %ray = ContainerRayCast(%point, %end, %targets, %obj);
            %col = getWord(%ray,0);
           
            if(isObject(%col))
            {
               %colType = %col.getType();
               %pos = posFromRaycast(%ray);
               %normal = normalFromRaycast(%ray);
               %end = %pos;
               %hit++;
               
               %crit = 0;
               if(isObject(CritProjectile))
               {
                  if(%this.isRaycastCritical(%obj, %slot, %col, %pos, %normal, %hit))
                  {
                     %crit = 1;
                     %critHit = 1;
                     %shellCrit = 1;
                     %fireCrit = 1;
                  }
               }
               
               %this.onHitObject(%obj, %slot, %col, %pos, %normal, %shotVec, %crit);
               
               if(%colType & %ptargets)
               {
                  %rangeRem = %rangeRem + vectorLen(vectorSub(%pos,%point)) - 1;
                  %end = vectorAdd(%end,vectorScale(%shotVec,1));
               }
               else
                  %rangeRem = 0;
            }
            else
            {
               %crit = 0;
               if(isObject(CritProjectile))
               {
                  if(%this.isRaycastCritical(%obj, %slot, -1, "0 0 0", "0 0 1", %hit))
                  {
                     %crit = 1;
                     %shellCrit = 1;
                     %fireCrit = 1;
                  }
               }
            }
         }
         
         if(isObject(%this.raycastTracerProjectile))
         {
            %projectile = %this.raycastTracerProjectile;
            if(%shellCrit && isObject(%this.raycastCritTracerProjectile))
               %projectile = %this.raycastCritTracerProjectile;
           
            %muzzle = %obj.getMuzzlePoint(%slot);
            %scaleFactor = getWord(%obj.getScale(),2);
           
            %p = new (%this.projectileType)()
            {
               dataBlock = %projectile;
               initialVelocity = vectorScale(vectorNormalize(vectorSub(%end,%muzzle)),%projectile.muzzleVelocity);
               initialPosition = %muzzle;
               sourceObject = %obj;
               sourceSlot = %slot;
               client = %obj.client;
            };
            %p.setScale(%scaleFactor SPC %scaleFactor SPC %scaleFactor);
            MissionCleanup.add(%p);
         }
      }
     
      if(%obj.getType() & $TypeMasks::PlayerObjectType && %fireCrit)
      {
         serverplay3d(critFireSound,%obj.getHackPosition());
         if(isObject(%obj.client) && %critHit)
            %obj.client.play2d(critHitSound);
      }
   }
   function disconnect()
   {
      Parent::disconnect();
      $SpaceMods::Server::RaycastingWeaponsVersion = -1;
      schedule(10, 0, deActivatePackage, RaycastingFire); //we probably don't want to de-activate a package while we're in it, so schedule it
   }
};activatePackage(RaycastingFire);

function WeaponImage::onHitObject(%this,%obj,%slot,%col,%pos,%normal,%shotVec,%crit)
{
   if(!isObject(%col))
      return;
   
   %colType = %col.getType(); //%col changes to CorpseObjectType if you kill a player
   
   if(!isObject(CritProjectile))
      %crit = 0;
   
   if(%this.raycastDirectDamage > 0 && %colType & ($TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType))
   {
      if(isObject(%col.spawnBrick) && %col.spawnBrick.getGroup().client == %obj.client)
         %dmg = 1;
      if(miniGameCanDamage(%obj,%col) == 1 || %dmg)
         %this.onRaycastDamage(%obj,%slot,%col,%pos,%normal,%shotVec,%crit);
   }
   
   if(isObject(%this.raycastExplosionProjectile))
   {
      %scaleFactor = getWord(%obj.getScale(), 2);
      %p = new Projectile()
      {
         dataBlock = %this.raycastExplosionProjectile;
         initialPosition = %pos;
         initialVelocity = %normal;
         sourceObject = %obj;
         client = %obj.client;
         sourceSlot = 0;
         originPoint = %pos;
      };
      MissionCleanup.add(%p);
      %p.setScale(%scaleFactor SPC %scaleFactor SPC %scaleFactor);
      %p.explode();
   }
   
   if(isObject(%this.raycastExplosionSound))
      serverplay3d(%this.raycastExplosionSound,%pos);
   
   if(isObject(%this.raycastExplosionCritSound) && %crit)
      serverplay3d(%this.raycastExplosionCritSound,%pos);
   
   %colPlayer = (%colType & $TypeMasks::PlayerObjectType);
   
   if(%colPlayer && isObject(%this.raycastExplosionPlayerSound))
      serverplay3d(%this.raycastExplosionPlayerSound,%pos);
   else if(!%colPlayer && isObject(%this.raycastExplosionBrickSound))
      serverplay3d(%this.raycastExplosionBrickSound,%pos);
}

function WeaponImage::onRaycastDamage(%this,%obj,%slot,%col,%pos,%normal,%shotVec,%crit)
{
   %damageType = $DamageType::Direct;
   if(%this.raycastDirectDamageType)
      %damageType = %this.raycastDirectDamageType;
   
   %scale = getWord(%obj.getScale(), 2);
   %directDamage = mClampF(%this.raycastDirectDamage, -100, 100) * %scale;
   
   if(%crit)
   {
      if(%this.raycastCritDirectDamageType)
         %damageType = %this.raycastCritDirectDamageType;
     
      %directDamage = %directDamage * 3;
     
      %colscale = getWord(%col.getScale(),2);
      %col.spawnExplosion(critProjectile,%colscale);
      if(isObject(%col.client))
         %col.client.play2d(critRecieveSound);
   }
   
   if(%this.raycastImpactImpulse > 0)
      %col.applyImpulse(%pos,vectorScale(%shotVec,%this.raycastImpactImpulse));
   
   if(%this.raycastVerticalImpulse > 0)
      %col.applyImpulse(%pos,vectorScale("0 0 1",%this.raycastVerticalImpulse));
   
   %col.damage(%obj, %pos, %directDamage, %damageType);
}

function WeaponImage::isRaycastCritical(%this,%obj,%slot,%col,%pos,%normal,%hit)
{
   return 0;
}
I've never changed the damage of a melee weapon. What do I change?

This isn't the correct file. But you would change raycastDirectDamage in the file where the item datablocks are defined.

You should look at the file of the default sword for some reference