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

143 lines
3.6 KiB
Ucode
Raw Normal View History

2021-06-02 20:06:18 +00:00
//=============================================================================
// KFWeapAttach_HRG_BlastBrawlers
//=============================================================================
//
//=============================================================================
// Killing Floor 2
// Copyright (C) 2021 Tripwire Interactive LLC
//=============================================================================
class KFWeapAttach_HRG_BlastBrawlers extends KFWeapAttach_DualBase;
var protected transient bool bUsingLeftWeapon;
var protected transient name ReloadAnimName;
var protected transient float ReloadAnimRateMod;
/** Overrides to prevent weapon animation */
simulated function PlayWeaponFireAnim();
/** Caching reload anim name */
simulated event PreBeginPlay()
{
Super.PreBeginPlay();
ReloadAnimName = class'KFWeap_HRG_BlastBrawlers'.default.ReloadAnimation;
ReloadAnimRateMod = class'KFWeap_HRG_BlastBrawlers'.default.ReloadAnimRateModifier;
}
/** Overriding to avoid interrupting meleen anims with fire anims */
simulated function bool ThirdPersonFireEffects( vector HitLocation, KFPawn P, byte ThirdPersonAnimRateByte )
{
SpawnTracer(GetMuzzleLocation(), HitLocation);
// Effects below this point are culled based on visibility and distance
if ( !ActorEffectIsRelevant(P, false, MaxFireEffectDistance) )
{
return false;
}
CauseMuzzleFlash(P.FiringMode);
P.LastWeaponFireTime = -1.f;
return true;
}
simulated function vector GetMuzzleLocation(optional byte MuzzleID)
{
local vector SocketLocation;
if ( bUsingLeftWeapon)
{
if (LeftMuzzleFlash == None && MuzzleFlashTemplate != None)
{
AttachMuzzleFlash();
}
if( LeftMuzzleFlash != none )
{
LeftWeapMesh.GetSocketWorldLocationAndRotation(LeftMuzzleFlash.GetSocketName(), SocketLocation);
return SocketLocation;
}
}
return Super.GetMuzzleLocation(MuzzleID);
}
/** Added second weapon */
simulated function CauseMuzzleFlash(byte FiringMode)
{
if ( bUsingLeftWeapon )
{
if (LeftMuzzleFlash == None && MuzzleFlashTemplate != None)
{
AttachMuzzleFlash();
}
if (LeftMuzzleFlash != None )
{
LeftMuzzleFlash.CauseMuzzleFlash(FiringMode);
if ( LeftMuzzleFlash.bAutoActivateShellEject )
{
LeftMuzzleFlash.CauseShellEject();
}
}
}
else
{
Super.CauseMuzzleFlash(FiringMode);
bUsingLeftWeapon = true;
}
}
simulated function UpdateThirdPersonWeaponAction(EWeaponState NewWeaponState, KFPawn P, byte ThirdPersonAnimRateByte )
{
// Reset
bUsingLeftWeapon=false;
super.UpdateThirdPersonWeaponAction(NewWeaponState, P, ThirdPersonAnimRateByte);
}
simulated function PlayReloadMagazineAnim(EWeaponState NewWeaponState, KFPawn P)
{
PlayCharacterMeshAnim(P, ReloadAnimNAme, true);
}
simulated function PlayWeaponMeshAnim(name AnimName, AnimNodeSlot SyncNode, bool bLoop)
{
local float Duration;
/** Only reload animation could be played */
if ( !IsAnimationValid(AnimName) )
return;
// Weapon shoot anims
if( !bWeapMeshIsPawnMesh )
{
Duration = WeapMesh.GetAnimLength(AnimName);
if (AnimName == ReloadAnimName)
{
Duration *= ReloadAnimRateMod;
}
WeapMesh.PlayAnim(AnimName, Duration / ThirdPersonAnimRate, bLoop);
// syncronize this with the character anim
if ( SyncNode != None )
{
bSynchronizeWeaponAnim = true;
SyncPawnNode = SyncNode;
SyncAnimName = AnimName;
bSyncAnimCheckRelevance = false;
}
}
}
simulated function bool IsAnimationValid(name AnimName)
{
return AnimName == ReloadAnimName;
}
defaultproperties
{
bUsingLeftWeapon=false
}