NicePack/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAltFire.uc

113 lines
4.6 KiB
Ucode

class NiceSPShotgunAltFire extends NiceShotgunFire;
var InterpCurve AppliedMomentumCurve; // How much momentum to apply to a zed based on how much mass it has
var float WideDamageMinHitAngle; // The angle to do sweeping strikes in front of the player. If zero do no strikes
var float PushRange; // The range to push zeds away when firing
simulated function bool AllowFire(){
if(currentContext.sourceWeapon == none || KFPawn(Instigator) == none)
return false;
if(currentContext.sourceWeapon.bIsReloading)
return false;
if(KFPawn(Instigator).SecondaryItem!=none)
return false;
if(KFPawn(Instigator).bThrowingNade)
return false;
// No ammo so just always fire
return true;
}
// No need to client-side this one
function bool IsClientSide(){
return false;
}
// And there's nothing to force
function bool shouldFireProjectile(){
return false;
}
function DoFireEffect(){
local Vector StartProj, StartTrace, X,Y,Z;
local Rotator Aim;
local Vector HitLocation, HitNormal;
local Actor Other;
local Pawn Victims;
local vector dir, lookdir;
local float DiffAngle, VictimDist;
local float AppliedMomentum;
local vector vMomentum;
Instigator.MakeNoise(1.0);
Weapon.GetViewAxes(X,Y,Z);
StartTrace = Instigator.Location + Instigator.EyePosition();
StartProj = StartTrace + X*ProjSpawnOffset.X;
if (!Weapon.WeaponCentered() && !KFWeap.bAimingRifle)
StartProj = StartProj + Weapon.Hand * Y*ProjSpawnOffset.Y + Z*ProjSpawnOffset.Z;
// check if projectile would spawn through a wall and adjust start location accordingly
Other = Weapon.Trace(HitLocation, HitNormal, StartProj, StartTrace, false);
if(Other != none)
StartProj = HitLocation;
Aim = AdjustAim(StartProj, AimError);
if(WideDamageMinHitAngle > 0){
foreach Weapon.VisibleCollidingActors(class'Pawn', Victims, (PushRange * 2), StartTrace){
if(Victims.Health <= 0)
continue;
if(Victims != Instigator){
// Don't push team mates
if(Victims.GetTeamNum() == Instigator.GetTeamNum())
continue;
VictimDist = VSizeSquared(Instigator.Location - Victims.Location);
if(VictimDist > (((PushRange * 1.1) * (PushRange * 1.1)) + (Victims.CollisionRadius * Victims.CollisionRadius)))
continue;
lookdir = Normal(Vector(Instigator.GetViewRotation()));
dir = Normal(Victims.Location - Instigator.Location);
DiffAngle = lookdir dot dir;
dir = Normal((Victims.Location + Victims.EyePosition()) - Instigator.Location);
if(DiffAngle > WideDamageMinHitAngle){
AppliedMomentum = InterpCurveEval(AppliedMomentumCurve,Victims.Mass);
HandleAchievement( Victims );
vMomentum = (dir * AppliedMomentum)/Victims.Mass;
Victims.AddVelocity(vMomentum);
if(KFMonster(Victims) != none)
KFMonster(Victims).BreakGrapple();
}
}
}
}
if(Instigator != none && Instigator.Physics == PHYS_Falling && Instigator.PhysicsVolume.Gravity.Z > class'PhysicsVolume'.default.Gravity.Z)
Instigator.AddVelocity((KickMomentum * 10.0) >> Instigator.GetViewRotation());
}
function HandleAchievement(Pawn Victim){
local KFSteamStatsAndAchievements KFSteamStats;
if(Victim.IsA('NiceZombieScrake')){
if(PlayerController(Instigator.Controller) != none){
KFSteamStats = KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements);
if(KFSteamStats != none)
KFSteamStats.CheckAndSetAchievementComplete(KFSteamStats.KFACHIEVEMENT_PushScrakeSPJ);
}
}
}
defaultproperties
{
AppliedMomentumCurve=(Points=((OutVal=10000.000000),(InVal=350.000000,OutVal=175000.000000),(InVal=600.000000,OutVal=250000.000000)))
WideDamageMinHitAngle=0.600000
PushRange=150.000000
ProjPerFire=0
KickMomentum=(X=-35.000000,Z=5.000000)
maxVerticalRecoilAngle=3200
FireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Secondary_Fire_M"
StereoFireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Secondary_Fire_S"
NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire"
bWaitForRelease=False
bModeExclusive=False
FireAnimRate=1.000000
FireRate=1.200000
AmmoClass=None
AmmoPerFire=0
ShakeRotMag=(Z=250.000000)
ShakeRotTime=3.000000
ShakeOffsetMag=(Z=6.000000)
ShakeOffsetTime=1.250000
BotRefireRate=1.750000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPShotgunAlt'
Spread=0.000000
}