Advertisement
Ze_Operator

Ze Operator's Pad

Apr 6th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.18 KB | None | 0 0
  1. //########## Melee Code
  2. //Special thanks to Gravity Cat for the Block Code.
  3.  
  4. //### Sounds
  5.  
  6. datablock AudioProfile(FW_MeleeSwingSound)
  7. {
  8.   filename = "./swing.wav";
  9.   description = AudioClose3d;
  10.   preload = true;
  11. };
  12.  
  13. datablock AudioProfile(FW_MeleeHit1Sound : FW_MeleeSwingSound){filename = "./swordhit1.wav";};
  14. datablock AudioProfile(FW_MeleeHit2Sound : FW_MeleeSwingSound){filename = "./swordhit2.wav";};
  15. datablock AudioProfile(FW_MeleeFleshHitSound : FW_MeleeSwingSound){filename = "./swordfleshhit.wav";};
  16.  
  17. //### Effects
  18.  
  19. datablock ProjectileData(FW_MeleeProjectile)
  20. {
  21.   uiName = "";
  22.   explosion = hammerProjectile.explosion;
  23.   lifetime = 1;
  24.   fadeDelay = 1;
  25.   explodeOnDeath = true;
  26. };
  27.  
  28. //### Functions
  29.  
  30. function FW_MeleeRaycast(%this,%obj)
  31. {
  32.   %raycast = containerRayCast(%obj.getMuzzlePoint(0),VectorAdd(%obj.getMuzzlePoint(0),VectorScale(%obj.getMuzzleVector(0),%this.range)),$TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::VehicleObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::fxBrickObjectType | $TypeMasks::StaticObjectType,%obj);
  33.   if(isObject(firstWord(%raycast)))
  34.   {
  35.     %col = firstWord(%raycast);
  36.     %pos = posFromRaycast(%raycast);
  37.     %p = new Projectile()
  38.     {
  39.       dataBlock = %this.projectile;
  40.       initialPosition = %pos;
  41.       initialVelocity = %obj.getMuzzleVector(0);
  42.       sourceObject = %obj;
  43.       sourceSlot = 0;
  44.       client = %obj.client;
  45.     };
  46.     MissionCleanup.add(%p);
  47.     if(%col.getType() & $TypeMasks::PlayerObjectType)
  48.     {
  49.       if(isObject(%col.getMountedImage(0)) && %col.getMountedImage(0).FW_MeleeSystem == 1)
  50.         if(%col.getImageState(0) $= "Block")
  51.         {
  52.           %eyePoint = %obj.getPosition();
  53.           %v = %obj.getEyeVector();
  54.           %mag2 = VectorLen(%V);
  55.           %x = (getWord(%eyePoint,0) - getWord(%col.getPosition(),0));
  56.           %y = (getWord(%eyePoint,1) - getWord(%col.getPosition(),1));
  57.           %z = (getWord(%eyePoint,2) - getWord(%col.getPosition(),2));
  58.           %u = %x SPC %y SPC %z;
  59.           %mag1 = VectorLen(%u);
  60.           %result = VectorDot(%v,%u) / (%mag1*%mag2);
  61.           %angle = mRadtoDeg(mAcos(%result));
  62.           %angle -= 180;
  63.           if(%angle > -70 && %angle < 70)
  64.           {
  65.             if(%this.FW_MeleeBlock < %col.getMountedImage(0).FW_MeleeBlock)
  66.               %chance = 0;
  67.             else
  68.               %chance = 1;
  69.             if(%chance) %col.setImageAmmo(0,1);
  70.             %rnd = getRandom(1,2);
  71.             if(%rnd == 1) serverPlay3D(FW_MeleeHit1Sound,%obj.getTransform());
  72.             if(%rnd == 2) serverPlay3D(FW_MeleeHit2Sound,%obj.getTransform());
  73.             return;
  74.           }
  75.          
  76.           //Poot Reflect Code here...I think.
  77.         }
  78.       serverPlay3D(FW_MeleeFleshHitSound,%obj.getTransform());
  79.       if(getMiniGameFromObject(%col) == -1) return;
  80.       if(miniGameCanDamage(%obj,%col) == 0) return;
  81.       if(%col.isCrouched() == 1) { %col.damage(%obj,%pos,%this.directDamage*2,%this.directDamageType); return; }
  82.       %colscale = getWord(%col.getScale(),2);
  83.       if(getWord(%pos,2) > getWord(%col.getWorldBoxCenter(),2) - 3.3*%colscale) { %col.damage(%obj,%pos,%this.headDamage,%this.directDamageType); return; }
  84.       %col.damage(%obj,%pos,%this.directDamage,%this.directDamageType);
  85.       return;
  86.     }
  87.     %rnd = getRandom(1,2);
  88.     if(%rnd == 1) serverPlay3D(FW_MeleeHit1Sound,%obj.getTransform());
  89.     if(%rnd == 2) serverPlay3D(FW_MeleeHit2Sound,%obj.getTransform());
  90.     if(%col.getType() & $TypeMasks::VehicleObjectType)
  91.     {
  92.       if(getMiniGameFromObject(%col) != -1 && miniGameCanDamage(%obj,%col) != 0) %col.damage(%obj,%pos,%this.vehicleDamage,%this.directDamageType);
  93.     }
  94.   }
  95. }
  96.  
  97. package FW_MeleePackage
  98. {
  99.   function Armor::onTrigger(%this,%player,%slot,%val)
  100.   {
  101.     if(isObject(%player)) {
  102.     if(%player.getMountedImage(0).FW_MeleeSecondary == 1 && %slot $= 4)
  103.     {
  104.       if(%player.getImageState(0) $= "Ready" && %val) %player.setImageAmmo(0,0);
  105.       if(%player.getImageState(0) $= "Block" && !%val) %player.setImageAmmo(0,1);
  106.     } }
  107.     parent::onTrigger(%this,%player,%slot,%val);
  108.   }
  109. };
  110. activatePackage(FW_MeleePackage);
  111.  
  112.  
  113.  
  114.  
  115. //########## Sword
  116.  
  117. //### Projectiles
  118.  
  119. AddDamageType("FW_FWSword",'<bitmap:Add-ons/Weapon_FlintlockWeapons/CI_cutlass> %1','%2 <bitmap:Add-ons/Weapon_FlintlockWeapons/CI_cutlass> %1',0.2,1);
  120.  
  121. //### Item
  122.  
  123. datablock ItemData(FW_FWSwordItem)
  124. {
  125.   uiName = "Default Finisher Sword";
  126.   iconName = "./icon_cutlass";
  127.   image = FW_FWSwordImage;
  128.   category = Weapon;
  129.   className = Weapon;
  130.   shapeFile = "./cutlass.dts";
  131.   mass = 1;
  132.   density = 0.2;
  133.   elasticity = 0;
  134.   friction = 0.6;
  135.   emap = true;
  136.   doColorShift = true;
  137.   colorShiftColor = "1 1 1 1";
  138.   canDrop = true;
  139. };
  140.  
  141. //### Item Image
  142.  
  143. datablock shapeBaseImageData(FW_FWSwordImage)
  144. {
  145.   shapeFile = "./cutlass.dts";
  146.   emap = true;
  147.   correctMuzzleVector = true;
  148.   className = "WeaponImage";
  149.   item = FW_FWSwordItem;
  150.   ammo = "";
  151.   projectile = FW_MeleeProjectile;
  152.   FW_MeleeSystem = 1;
  153.   FW_MeleeSecondary = 1;
  154.   FW_MeleeBlock = 2;
  155.   directDamage = 60;
  156.   headDamage = 100;
  157.   vehicleDamage = 1;
  158.   directDamageType = $DamageType::FW_FWSword;
  159.   range = 4;
  160.   melee = false;
  161.   doReaction = false;
  162.   armReady = true;
  163.   doColorShift = true;
  164.   colorShiftColor = "1 1 1 1";
  165.  
  166.   stateName[0] = "Activate";
  167.   stateTimeoutValue[0] = 0.1;
  168.   stateTransitionOnTimeout[0] = "Ready";
  169.   stateSound[0] = weaponSwitchSound;
  170.  
  171.   stateName[1] = "Ready";
  172.   stateTransitionOnTriggerDown[1] = "Fire";
  173.   stateTransitionOnNoAmmo[1] = "Block";
  174.   stateAllowImageChange[1] = true;
  175.   stateSequence[1] = "Ready";
  176.  
  177.   stateName[2] = "PreFire";
  178.   stateTimeoutValue[2] = 0.1;
  179.   stateWaitForTimeout[2] = true;
  180.   stateTransitionOnTimeout[2] = "Fire";
  181.   stateTransitionOnTriggerUp[2] = "Ready";
  182.   stateAllowImageChange[2] = false;
  183.   stateSequence[2] = "Ready";
  184.   stateScript[2] = "onPreFire";
  185.  
  186.   stateName[3] = "Fire";
  187.   stateTimeoutValue[3] = 0.4;
  188.   stateWaitForTimeout[3] = true;
  189.   stateTransitionOnTimeout[3] = "PostFire";
  190.   stateAllowImageChange[3] = false;
  191.   stateScript[3] = "onFire";
  192.   stateSound[3] = FW_MeleeSwingSound;
  193.  
  194.   stateName[4] = "PostFire";
  195.   stateTransitionOnTriggerUp[4] = "Ready";
  196.   stateAllowImageChange[4] = true;
  197.   stateSequence[4] = "Ready";
  198.  
  199.   stateName[5] = "Block";
  200.   stateTransitionOnTimeout[5] = "Block";
  201.   stateAllowImageChange[5] = true;
  202.   stateSequence[5] = "Block";
  203.   stateWaitForTimeout[5] = false;
  204.   stateTransitionOnAmmo[5] = "Ready";
  205. };
  206.  
  207. function FW_FWSwordImage::onPreFire(%this,%obj,%slot)
  208. {
  209.   %obj.playThread(2,wrench);
  210. }
  211.  
  212. function FW_FWSwordImage::onFire(%this,%obj,%slot)
  213. {
  214.   %obj.playThread(2,activate);
  215.   FW_MeleeRaycast(%this,%obj);
  216.  
  217. //REFLECTOR PIXEL CODE
  218.         //%obj.setImageAmmo(0, 0); //Disable the gun.
  219.         %client = %obj.client;
  220.         %eye = %client.player.getEyeTransform(); //Because I hate typing it out over and over again.
  221.         %mask = $TypeMasks::ProjectileObjectType; //I was originally planning to make it shove players around, but I decided this should be better for medium-long range encounters.
  222.         InitContainerRadiusSearch(%eye, 12, %mask);
  223.         while(isObject(%Proj = containerSearchNext()))
  224.         {
  225.                 if(!miniGameCanDamage(%Proj, %obj) && (isObject(%proj.client.minigame) || isObject(%client.minigame))) //Don't touch it if it's involved in a different minigame
  226.                                 continue;
  227.                 %velAvg = (mAbs(getWord(%proj.getVelocity(), 0)) + mAbs(getWord(%proj.getVelocity(), 1)) + mAbs(getWord(%proj.getVelocity(), 2))) / 3;
  228.                 if(!%proj.origVelocity || %proj.origVelocity < %proj.getDatablock().muzzleVelocity / 2) //We don't want too small of an original velocity to base our reflections on, otherwise we couldn't get it above half normal speed.
  229.                         %proj.origVelocity = %velAvg; //Speed cap is based on how fast the projectile was at first deflection.
  230.                 %repelForce = ((15 - vectorDist(%eye, %proj.getTransform())) / 6) * %velAvg; //Allow us to boost the speed based on what it already is, instead of the default speed.
  231.                 if(%repelForce > %proj.origVelocity * 2.25)
  232.                         %repelForce = (2.25 * %proj.origVelocity); //We have to cap it at some point.
  233.                 if(%repelForce <= %proj.getDatablock().muzzleVelocity / 2)
  234.                         %repelForce = (%proj.getDatablock().muzzleVelocity / 2); //Also imposing a minimum.
  235.                 %repelDir = vectorNormalize(vectorSub(%proj.getTransform(), %eye));
  236.  
  237.                         %anglediff = vectorSub(%repelDir,vectorNormalize(%client.player.getEyeVector()));
  238.                 %anglediffavg = (mAbs(getWord(%angleDiff, 0)) + mAbs(getWord(%angleDiff, 1)) + mAbs(getWord(%angleDiff, 2))) / 3;
  239.                 if(%anglediffavg > 0.3) //Makeshift vector angle comparison. It doesn't work as accurately as I wish it did, but I'm not all that good with vectors.
  240.                                 continue;
  241.  
  242.                 if(vectorDist(%eye, %proj.getTransform()) <= 6 && isObject(%proj.client.player) && %client != %proj.client)
  243.                 {
  244.                         %ownerDir = vectorNormalize(vectorSub(%proj.client.player.getEyeTransform(), %eye));
  245.                         %ownerAngleDiff = vectorSub(%ownerDir, vectorNormalize(%client.player.getEyeVector()));
  246.                         %ownerAngleDiffAvg = (mAbs(getWord(%ownerAngleDiff, 0)) + mAbs(getWord(%ownerAngleDiff, 1)) + mAbs(getWord(%ownerAngleDiff, 2))) / 3; //I thought I've seen a cone-search function somewhere before...
  247.                         if(%anglediffavg <= 0.5) //If they're out of our sight, we don't send it at them.
  248.                                 %repelDir = vectorNormalize(vectorSub(%proj.client.player.getEyeTransform(), %proj.getTransform())); //Step in and tell us where it should go.
  249.                 }
  250.                
  251.                 %newVelocity = vectorScale(%repelDir, %repelForce); //Get our final calculations as to where we should shoot this thing.
  252.                
  253.                 serverPlay3d(blocksucessSound, %proj.getPosition());
  254.                 %obj.setImageAmmo(0, 1); //Reenable the gun if we actually used it on something
  255.                
  256.                 %p = new Projectile() //Because Projectile::Redirect didn't work, and Projectile::SetVelocity doesn't exist for some reason.
  257.                 {
  258.                         initialVelocity                = %newVelocity;
  259.                         origVelocity                = %proj.origVelocity;
  260.                         initialPosition                = %proj.getPosition();
  261.                         datablock                        = %proj.getDatablock();
  262.                         sourceObject                = %proj.client.player;
  263.                         sourceSlot                        = %proj.sourceSlot;
  264.                         client                                = %client; //Change the owner to us so we can damage the original attacker.
  265.                         scale                                = %proj.getScale();
  266.                 };
  267.                 missionCleanup.add(%p);
  268.                 %proj.delete(); //Do away with the old one so we don't get facerocketed.
  269.         }
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement