Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //########## Melee Code
- //Special thanks to Gravity Cat for the Block Code.
- //### Sounds
- datablock AudioProfile(FW_MeleeSwingSound)
- {
- filename = "./swing.wav";
- description = AudioClose3d;
- preload = true;
- };
- datablock AudioProfile(FW_MeleeHit1Sound : FW_MeleeSwingSound){filename = "./swordhit1.wav";};
- datablock AudioProfile(FW_MeleeHit2Sound : FW_MeleeSwingSound){filename = "./swordhit2.wav";};
- datablock AudioProfile(FW_MeleeFleshHitSound : FW_MeleeSwingSound){filename = "./swordfleshhit.wav";};
- //### Effects
- datablock ProjectileData(FW_MeleeProjectile)
- {
- uiName = "";
- explosion = hammerProjectile.explosion;
- lifetime = 1;
- fadeDelay = 1;
- explodeOnDeath = true;
- };
- //### Functions
- function FW_MeleeRaycast(%this,%obj)
- {
- %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);
- if(isObject(firstWord(%raycast)))
- {
- %col = firstWord(%raycast);
- %pos = posFromRaycast(%raycast);
- %p = new Projectile()
- {
- dataBlock = %this.projectile;
- initialPosition = %pos;
- initialVelocity = %obj.getMuzzleVector(0);
- sourceObject = %obj;
- sourceSlot = 0;
- client = %obj.client;
- };
- MissionCleanup.add(%p);
- if(%col.getType() & $TypeMasks::PlayerObjectType)
- {
- if(isObject(%col.getMountedImage(0)) && %col.getMountedImage(0).FW_MeleeSystem == 1)
- if(%col.getImageState(0) $= "Block")
- {
- %eyePoint = %obj.getPosition();
- %v = %obj.getEyeVector();
- %mag2 = VectorLen(%V);
- %x = (getWord(%eyePoint,0) - getWord(%col.getPosition(),0));
- %y = (getWord(%eyePoint,1) - getWord(%col.getPosition(),1));
- %z = (getWord(%eyePoint,2) - getWord(%col.getPosition(),2));
- %u = %x SPC %y SPC %z;
- %mag1 = VectorLen(%u);
- %result = VectorDot(%v,%u) / (%mag1*%mag2);
- %angle = mRadtoDeg(mAcos(%result));
- %angle -= 180;
- if(%angle > -70 && %angle < 70)
- {
- if(%this.FW_MeleeBlock < %col.getMountedImage(0).FW_MeleeBlock)
- %chance = 0;
- else
- %chance = 1;
- if(%chance) %col.setImageAmmo(0,1);
- %rnd = getRandom(1,2);
- if(%rnd == 1) serverPlay3D(FW_MeleeHit1Sound,%obj.getTransform());
- if(%rnd == 2) serverPlay3D(FW_MeleeHit2Sound,%obj.getTransform());
- return;
- }
- //Poot Reflect Code here...I think.
- }
- serverPlay3D(FW_MeleeFleshHitSound,%obj.getTransform());
- if(getMiniGameFromObject(%col) == -1) return;
- if(miniGameCanDamage(%obj,%col) == 0) return;
- if(%col.isCrouched() == 1) { %col.damage(%obj,%pos,%this.directDamage*2,%this.directDamageType); return; }
- %colscale = getWord(%col.getScale(),2);
- if(getWord(%pos,2) > getWord(%col.getWorldBoxCenter(),2) - 3.3*%colscale) { %col.damage(%obj,%pos,%this.headDamage,%this.directDamageType); return; }
- %col.damage(%obj,%pos,%this.directDamage,%this.directDamageType);
- return;
- }
- %rnd = getRandom(1,2);
- if(%rnd == 1) serverPlay3D(FW_MeleeHit1Sound,%obj.getTransform());
- if(%rnd == 2) serverPlay3D(FW_MeleeHit2Sound,%obj.getTransform());
- if(%col.getType() & $TypeMasks::VehicleObjectType)
- {
- if(getMiniGameFromObject(%col) != -1 && miniGameCanDamage(%obj,%col) != 0) %col.damage(%obj,%pos,%this.vehicleDamage,%this.directDamageType);
- }
- }
- }
- package FW_MeleePackage
- {
- function Armor::onTrigger(%this,%player,%slot,%val)
- {
- if(isObject(%player)) {
- if(%player.getMountedImage(0).FW_MeleeSecondary == 1 && %slot $= 4)
- {
- if(%player.getImageState(0) $= "Ready" && %val) %player.setImageAmmo(0,0);
- if(%player.getImageState(0) $= "Block" && !%val) %player.setImageAmmo(0,1);
- } }
- parent::onTrigger(%this,%player,%slot,%val);
- }
- };
- activatePackage(FW_MeleePackage);
- //########## Sword
- //### Projectiles
- AddDamageType("FW_FWSword",'<bitmap:Add-ons/Weapon_FlintlockWeapons/CI_cutlass> %1','%2 <bitmap:Add-ons/Weapon_FlintlockWeapons/CI_cutlass> %1',0.2,1);
- //### Item
- datablock ItemData(FW_FWSwordItem)
- {
- uiName = "Default Finisher Sword";
- iconName = "./icon_cutlass";
- image = FW_FWSwordImage;
- category = Weapon;
- className = Weapon;
- shapeFile = "./cutlass.dts";
- mass = 1;
- density = 0.2;
- elasticity = 0;
- friction = 0.6;
- emap = true;
- doColorShift = true;
- colorShiftColor = "1 1 1 1";
- canDrop = true;
- };
- //### Item Image
- datablock shapeBaseImageData(FW_FWSwordImage)
- {
- shapeFile = "./cutlass.dts";
- emap = true;
- correctMuzzleVector = true;
- className = "WeaponImage";
- item = FW_FWSwordItem;
- ammo = "";
- projectile = FW_MeleeProjectile;
- FW_MeleeSystem = 1;
- FW_MeleeSecondary = 1;
- FW_MeleeBlock = 2;
- directDamage = 60;
- headDamage = 100;
- vehicleDamage = 1;
- directDamageType = $DamageType::FW_FWSword;
- range = 4;
- melee = false;
- doReaction = false;
- armReady = true;
- doColorShift = true;
- colorShiftColor = "1 1 1 1";
- stateName[0] = "Activate";
- stateTimeoutValue[0] = 0.1;
- stateTransitionOnTimeout[0] = "Ready";
- stateSound[0] = weaponSwitchSound;
- stateName[1] = "Ready";
- stateTransitionOnTriggerDown[1] = "Fire";
- stateTransitionOnNoAmmo[1] = "Block";
- stateAllowImageChange[1] = true;
- stateSequence[1] = "Ready";
- stateName[2] = "PreFire";
- stateTimeoutValue[2] = 0.1;
- stateWaitForTimeout[2] = true;
- stateTransitionOnTimeout[2] = "Fire";
- stateTransitionOnTriggerUp[2] = "Ready";
- stateAllowImageChange[2] = false;
- stateSequence[2] = "Ready";
- stateScript[2] = "onPreFire";
- stateName[3] = "Fire";
- stateTimeoutValue[3] = 0.4;
- stateWaitForTimeout[3] = true;
- stateTransitionOnTimeout[3] = "PostFire";
- stateAllowImageChange[3] = false;
- stateScript[3] = "onFire";
- stateSound[3] = FW_MeleeSwingSound;
- stateName[4] = "PostFire";
- stateTransitionOnTriggerUp[4] = "Ready";
- stateAllowImageChange[4] = true;
- stateSequence[4] = "Ready";
- stateName[5] = "Block";
- stateTransitionOnTimeout[5] = "Block";
- stateAllowImageChange[5] = true;
- stateSequence[5] = "Block";
- stateWaitForTimeout[5] = false;
- stateTransitionOnAmmo[5] = "Ready";
- };
- function FW_FWSwordImage::onPreFire(%this,%obj,%slot)
- {
- %obj.playThread(2,wrench);
- }
- function FW_FWSwordImage::onFire(%this,%obj,%slot)
- {
- %obj.playThread(2,activate);
- FW_MeleeRaycast(%this,%obj);
- //REFLECTOR PIXEL CODE
- //%obj.setImageAmmo(0, 0); //Disable the gun.
- %client = %obj.client;
- %eye = %client.player.getEyeTransform(); //Because I hate typing it out over and over again.
- %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.
- InitContainerRadiusSearch(%eye, 12, %mask);
- while(isObject(%Proj = containerSearchNext()))
- {
- if(!miniGameCanDamage(%Proj, %obj) && (isObject(%proj.client.minigame) || isObject(%client.minigame))) //Don't touch it if it's involved in a different minigame
- continue;
- %velAvg = (mAbs(getWord(%proj.getVelocity(), 0)) + mAbs(getWord(%proj.getVelocity(), 1)) + mAbs(getWord(%proj.getVelocity(), 2))) / 3;
- 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.
- %proj.origVelocity = %velAvg; //Speed cap is based on how fast the projectile was at first deflection.
- %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.
- if(%repelForce > %proj.origVelocity * 2.25)
- %repelForce = (2.25 * %proj.origVelocity); //We have to cap it at some point.
- if(%repelForce <= %proj.getDatablock().muzzleVelocity / 2)
- %repelForce = (%proj.getDatablock().muzzleVelocity / 2); //Also imposing a minimum.
- %repelDir = vectorNormalize(vectorSub(%proj.getTransform(), %eye));
- %anglediff = vectorSub(%repelDir,vectorNormalize(%client.player.getEyeVector()));
- %anglediffavg = (mAbs(getWord(%angleDiff, 0)) + mAbs(getWord(%angleDiff, 1)) + mAbs(getWord(%angleDiff, 2))) / 3;
- 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.
- continue;
- if(vectorDist(%eye, %proj.getTransform()) <= 6 && isObject(%proj.client.player) && %client != %proj.client)
- {
- %ownerDir = vectorNormalize(vectorSub(%proj.client.player.getEyeTransform(), %eye));
- %ownerAngleDiff = vectorSub(%ownerDir, vectorNormalize(%client.player.getEyeVector()));
- %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...
- if(%anglediffavg <= 0.5) //If they're out of our sight, we don't send it at them.
- %repelDir = vectorNormalize(vectorSub(%proj.client.player.getEyeTransform(), %proj.getTransform())); //Step in and tell us where it should go.
- }
- %newVelocity = vectorScale(%repelDir, %repelForce); //Get our final calculations as to where we should shoot this thing.
- serverPlay3d(blocksucessSound, %proj.getPosition());
- %obj.setImageAmmo(0, 1); //Reenable the gun if we actually used it on something
- %p = new Projectile() //Because Projectile::Redirect didn't work, and Projectile::SetVelocity doesn't exist for some reason.
- {
- initialVelocity = %newVelocity;
- origVelocity = %proj.origVelocity;
- initialPosition = %proj.getPosition();
- datablock = %proj.getDatablock();
- sourceObject = %proj.client.player;
- sourceSlot = %proj.sourceSlot;
- client = %client; //Change the owner to us so we can damage the original attacker.
- scale = %proj.getScale();
- };
- missionCleanup.add(%p);
- %proj.delete(); //Do away with the old one so we don't get facerocketed.
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement