rott/kf_sources/KFMod/Classes/DwarfAxeFire.uc
2026-07-14 20:27:09 +07:00

208 lines
7.1 KiB
Ucode

//=============================================================================
// DwarfAxeFire
//=============================================================================
// Dwarf Axe primary fire class
//=============================================================================
// Killing Floor Source
// Copyright (C) 2011 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class DwarfAxeFire extends KFMeleeFire;
var() array<name> FireAnims;
var float MomentumTransfer; // Momentum magnitude imparted by impacting weapon.
var() InterpCurve AppliedMomentumCurve; // How much momentum to apply to a zed based on how much mass it has
simulated event ModeDoFire()
{
local int AnimToPlay;
if(FireAnims.length > 0)
{
AnimToPlay = rand(FireAnims.length);
FireAnim = FireAnims[AnimToPlay];
}
Super.ModeDoFire();
}
simulated function Timer()
{
local Actor HitActor;
local vector StartTrace, EndTrace, HitLocation, HitNormal;
local rotator PointRot;
local int MyDamage;
local bool bBackStabbed;
local Pawn Victims;
local vector dir, lookdir;
local float DiffAngle, VictimDist;
local float AppliedMomentum;
MyDamage = MeleeDamage;
If( !KFWeapon(Weapon).bNoHit )
{
MyDamage = MeleeDamage;
StartTrace = Instigator.Location + Instigator.EyePosition();
if( Instigator.Controller!=None && PlayerController(Instigator.Controller)==None && Instigator.Controller.Enemy!=None )
{
PointRot = rotator(Instigator.Controller.Enemy.Location-StartTrace); // Give aimbot for bots.
}
else
{
PointRot = Instigator.GetViewRotation();
}
EndTrace = StartTrace + vector(PointRot)*weaponRange;
HitActor = Instigator.Trace( HitLocation, HitNormal, EndTrace, StartTrace, true);
//Instigator.ClearStayingDebugLines();
//Instigator.DrawStayingDebugLine( StartTrace, EndTrace,0, 255, 0);
if (HitActor!=None)
{
ImpactShakeView();
if( HitActor.IsA('ExtendedZCollision') && HitActor.Base != none &&
HitActor.Base.IsA('KFMonster') )
{
HitActor = HitActor.Base;
}
if ( (HitActor.IsA('KFMonster') || HitActor.IsA('KFHumanPawn')) && KFMeleeGun(Weapon).BloodyMaterial!=none )
{
Weapon.Skins[KFMeleeGun(Weapon).BloodSkinSwitchArray] = KFMeleeGun(Weapon).BloodyMaterial;
Weapon.texture = Weapon.default.Texture;
}
if( Level.NetMode==NM_Client )
{
Return;
}
if( HitActor.IsA('Pawn') && !HitActor.IsA('Vehicle')
&& (Normal(HitActor.Location-Instigator.Location) dot vector(HitActor.Rotation))>0 ) // Fixed in Balance Round 2
{
bBackStabbed = true;
MyDamage*=2; // Backstab >:P
}
if( (KFMonster(HitActor)!=none) )
{
// log(VSize(Instigator.Velocity));
KFMonster(HitActor).bBackstabbed = bBackStabbed;
dir = Normal((HitActor.Location + KFMonster(HitActor).EyePosition()) - Instigator.Location);
AppliedMomentum = InterpCurveEval(AppliedMomentumCurve,HitActor.Mass);
HitActor.TakeDamage(MyDamage, Instigator, HitLocation, dir * AppliedMomentum, hitDamageClass) ;
// Break thier grapple if you are knocking them back!
if( KFMonster(HitActor) != none )
{
KFMonster(HitActor).BreakGrapple();
}
if(MeleeHitSounds.Length > 0)
{
Weapon.PlaySound(MeleeHitSounds[Rand(MeleeHitSounds.length)],SLOT_None,MeleeHitVolume,,,,false);
}
if(VSize(Instigator.Velocity) > 300 && KFMonster(HitActor).Mass <= Instigator.Mass)
{
KFMonster(HitActor).FlipOver();
}
}
else
{
HitActor.TakeDamage(MyDamage, Instigator, HitLocation, Normal(vector(PointRot)) * MomentumTransfer, hitDamageClass) ;
Spawn(HitEffectClass,,, HitLocation, rotator(HitLocation - StartTrace));
//if( KFWeaponAttachment(Weapon.ThirdPersonActor)!=None )
// KFWeaponAttachment(Weapon.ThirdPersonActor).UpdateHit(HitActor,HitLocation,HitNormal);
//Weapon.IncrementFlashCount(ThisModeNum);
}
}
if( WideDamageMinHitAngle > 0 )
{
foreach Weapon.VisibleCollidingActors( class 'Pawn', Victims, (weaponRange * 2), StartTrace ) //, RadiusHitLocation
{
if( (HitActor != none && Victims == HitActor) || Victims.Health <= 0 )
{
continue;
}
if( Victims != Instigator )
{
VictimDist = VSizeSquared(Instigator.Location - Victims.Location);
//log("VictimDist = "$VictimDist$" Weaponrange = "$(weaponRange*Weaponrange));
if( VictimDist > (((weaponRange * 1.1) * (weaponRange * 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);
//log("Shot would hit "$Victims$" DiffAngle = "$DiffAngle$" for damage of: "$(MyDamage*DiffAngle));
Victims.TakeDamage(MyDamage*DiffAngle, Instigator, (Victims.Location + Victims.CollisionHeight * vect(0,0,0.7)), dir * AppliedMomentum, hitDamageClass) ;
// Break thier grapple if you are knocking them back!
if( KFMonster(Victims) != none )
{
KFMonster(Victims).BreakGrapple();
}
if(MeleeHitSounds.Length > 0)
{
Victims.PlaySound(MeleeHitSounds[Rand(MeleeHitSounds.length)],SLOT_None,MeleeHitVolume,,,,false);
}
}
// else
// {
// log("Shot would miss "$Victims$" DiffAngle = "$DiffAngle);
// }
}
}
}
}
}
defaultproperties
{
FireAnims(0)="fire"
FireAnims(1)="fire2"
FireAnims(2)="fire3"
FireAnims(3)="fire4"
MeleeDamage=235
ProxySize=0.150000
weaponRange=90.000000
DamagedelayMin=0.79
DamagedelayMax=0.79
hitDamageClass=Class'KFMod.DamTypeDwarfAxe'
FireRate=1.4
BotRefireRate=1.00000
MeleeHitSounds(0)=Sound'KF_AxeSnd.Axe_HitFlesh'
HitEffectClass=class'AxeHitEffect'
WideDamageMinHitAngle=0.6
MomentumTransfer=250000
AppliedMomentumCurve=(Points=((InVal=0.0,OutVal=10000.0),(InVal=350.0,OutVal=175000.0),(InVal=600.0,OutVal=250000.0)))
}