1
0
KF2-Dev-Scripts/KFGameContent/Classes/KFProj_Nail_Nailgun.uc

143 lines
3.9 KiB
Ucode
Raw Normal View History

2020-12-13 15:01:13 +00:00
//=============================================================================
// KFProj_Nail_Nailgun
//=============================================================================
// Nail class for the the Nailgun
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
// John "Ramm-Jaeger" Gibson
//=============================================================================
class KFProj_Nail_Nailgun extends KFProj_PinningBullet
hidedropdown;
simulated event HitWall(vector HitNormal, Actor Wall, PrimitiveComponent WallComp)
{
local TraceHitInfo HitInfo;
// Don't bounce any more if being used to pin a zed
if( bSpawnedForPin )
{
BouncesLeft=0;
}
SetRotation(rotator(Normal(Velocity)));
SetPhysics(PHYS_Falling);
// Should hit destructibles without bouncing
if (!Wall.bStatic && bDamageDestructiblesOnTouch && Wall.bProjTarget)
{
Wall.TakeDamage(Damage, InstigatorController, Location, MomentumTransfer * Normal(Velocity), MyDamageType, HitInfo, self);
Explode(Location, HitNormal);
}
// check if we should do a bounce, otherwise stick
else if( !Bounce(HitNormal, Wall) )
{
// Turn off the corona when it stops
if ( WorldInfo.NetMode != NM_DedicatedServer && ProjEffects!=None )
{
ProjEffects.DeactivateSystem();
}
// if our last hit is a destructible, don't stick
if ( !Wall.bStatic && !Wall.bWorldGeometry && Wall.bProjTarget )
{
Explode(Location, HitNormal);
ImpactedActor = None;
}
else
{
// Play the bullet impact sound and effects
if ( WorldInfo.NetMode != NM_DedicatedServer )
{
`ImpactEffectManager.PlayImpactEffects(Location, Instigator, HitNormal);
}
SetPhysics(PHYS_None);
// Stop ambient sounds when this projectile ShutsDown
if( bStopAmbientSoundOnExplode )
{
StopAmbientSound();
}
//@todo: check for pinned victim
}
bBounce = false;
}
}
//==============
// Touching
// Overriden to get nails bouncing off of destructible meshes
simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
{
// @todo: Implement functionality properly choosing which actors to
// ProcessTouch for when this projectile is being used to pin ragdolls
if ( Other != Instigator && !Other.bWorldGeometry && Other.bCanBeDamaged )
{
if ( Pawn(other) != None )
{
Super.ProcessTouch(Other, HitLocation, HitNormal);
}
else
{
ProcessDestructibleTouchOnBounce( Other, HitLocation, HitNormal );
}
}
else
{
Super.ProcessTouch(Other, HitLocation, HitNormal);;
}
}
simulated function Tick( float DeltaTime )
{
super.Tick(DeltaTime);
if ( WorldInfo.NetMode != NM_DedicatedServer && Physics != PHYS_None )
{
SetRotation(Rotator(Normal(Velocity)));
}
}
simulated function Landed( Vector HitNormal, actor FloorActor )
{
// Turn off the corona when it stops
if ( WorldInfo.NetMode != NM_DedicatedServer && ProjEffects!=None )
{
ProjEffects.DeactivateSystem();
}
SetPhysics(PHYS_None);
// Stop ambient sounds when this projectile ShutsDown
if( bStopAmbientSoundOnExplode )
{
StopAmbientSound();
}
}
defaultproperties
{
MaxSpeed=14000.0
Speed=14000.0
bWarnAIWhenFired=true
DamageRadius=0
LifeSpan = 5.0f
BouncesLeft=2
DampingFactor=0.65
RicochetEffects=KFImpactEffectInfo'WEP_Nail_Shotgun_ARCH.NailBulletImpacts'
ProjFlightTemplate=ParticleSystem'WEP_1P_Nail_Shotgun_EMIT.FX_Nail_Shotgun_Tracer'
ProjFlightTemplateZedTime=ParticleSystem'WEP_1P_Nail_Shotgun_EMIT.FX_Nail_Shotgun_Tracer_ZEDTime'
}