Blockland Forums > Modification Help
Knife Damage
(1/1)
AirGlider:

--- Code: ---//////////////////////////////////////////////////////////////////////////////////////////////////
//   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;
}
--- End code ---
I've never changed the damage of a melee weapon. What do I change?
Greek2me:
This isn't the correct file. But you would change raycastDirectDamage in the file where the item datablocks are defined.
Treynolds416:
You should look at the file of the default sword for some reference
Navigation
Message Index

Go to full version