314 lines
10 KiB
Ucode
314 lines
10 KiB
Ucode
|
//=============================================================================
|
||
|
// KFWeap_Minigun
|
||
|
//=============================================================================
|
||
|
// Minigun
|
||
|
//=============================================================================
|
||
|
// Killing Floor 2
|
||
|
// Copyright (C) 2015 Tripwire Interactive LLC
|
||
|
//=============================================================================
|
||
|
|
||
|
class KFWeap_Minigun extends KFWeap_MinigunBase;
|
||
|
|
||
|
/** Camera shake when shooting */
|
||
|
var CameraAnim ShootCameraAnim;
|
||
|
|
||
|
/** Current camera shake animation */
|
||
|
var CameraAnimInst ShootCameraAnimInstance;
|
||
|
|
||
|
/** Camera shake play rate */
|
||
|
var float ShootCameraAnimPlayRate;
|
||
|
|
||
|
/** Camera shake strength */
|
||
|
var float ShootCameraAnimScale;
|
||
|
|
||
|
/** Camera shake blend time */
|
||
|
var float ShootCameraAnimBlendTime;
|
||
|
|
||
|
/** Sound info for the barrel rotation in 1st person and 3rd person */
|
||
|
var WeaponFireSndInfo BarrelRotationLoopSound;
|
||
|
|
||
|
/** The system is currently playing the barrel sound */
|
||
|
var bool bPlayingLoopingBarrelSnd;
|
||
|
|
||
|
/** The system is currently playing the barrel stop sound */
|
||
|
var bool bPlayingLoopingBarrelStopSnd;
|
||
|
|
||
|
/** Audio event played when the rotation of the barrel ends */
|
||
|
var WeaponFireSndInfo BarrelStopRotationSound;
|
||
|
|
||
|
/** Stored value for the rotation sound parameter */
|
||
|
var transient float CurrentBarrelRotParam;
|
||
|
|
||
|
var transient KFPawn PreviousOwner;
|
||
|
|
||
|
simulated function StartFire(byte FireModeNum)
|
||
|
{
|
||
|
if (FireModeNum == ALTFIRE_FIREMODE)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
Super.StartFire(FireModeNum);
|
||
|
}
|
||
|
|
||
|
simulated event Tick( float DeltaTime )
|
||
|
{
|
||
|
local float NewCurrentBarrelParam;
|
||
|
local KFPawn KFP;
|
||
|
local bool bPlaySound;
|
||
|
|
||
|
Super.Tick(DeltaTime);
|
||
|
|
||
|
KFP = KFPawn(Instigator);
|
||
|
|
||
|
if( KFP == none && PreviousOwner != none)
|
||
|
{
|
||
|
PreviousOwner.SetSecondaryWeaponComponentRTPCValue("MinigunRotation", 0);
|
||
|
PreviousOwner.SetSecondaryWeaponAmbientSound(none, none);
|
||
|
bPlayingLoopingBarrelSnd = false;
|
||
|
bPlayingLoopingBarrelStopSnd = false;
|
||
|
CurrentBarrelRotParam = 0;
|
||
|
WindUpControlTime = 0;
|
||
|
PreviousOwner = none;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
bPlaySound = KFP != none && (WorldInfo.NetMode != NM_Client || KFP.IsLocallyControlled());
|
||
|
|
||
|
NewCurrentBarrelParam = CurrentBarrelRotParam;
|
||
|
|
||
|
if( KFP != none && KFP.IsFirstPerson() && (IsInState('WeaponPuttingDown') || IsInState('Inactive')) )
|
||
|
{
|
||
|
UpdateBarrelSoundOnForceStop( bPlaySound );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if( WindUpControlTime > 0 && !bPlayingLoopingBarrelSnd)
|
||
|
{
|
||
|
bPlayingLoopingBarrelSnd = true;
|
||
|
if ( bPlaySound ) KFP.SetSecondaryWeaponAmbientSound(BarrelRotationLoopSound.DefaultCue, BarrelRotationLoopSound.FirstPersonCue);
|
||
|
}
|
||
|
else if( WindUpControlTime <= 0 && bPlayingLoopingBarrelSnd )
|
||
|
{
|
||
|
bPlayingLoopingBarrelSnd = false;
|
||
|
bPlayingLoopingBarrelStopSnd = false;
|
||
|
if ( bPlaySound ) KFP.SetSecondaryWeaponAmbientSound(none, none);
|
||
|
}
|
||
|
|
||
|
if(WindUpControlTime > 0)
|
||
|
{
|
||
|
NewCurrentBarrelParam = 100 * WindUpControlTime / WindUpActivationTime;
|
||
|
if ( KFP != none ) KFP.SetSecondaryWeaponComponentRTPCValue("MinigunRotation", NewCurrentBarrelParam);
|
||
|
|
||
|
if( NewCurrentBarrelParam < 20 && NewCurrentBarrelParam < CurrentBarrelRotParam && !bPlayingLoopingBarrelStopSnd )
|
||
|
{
|
||
|
bPlayingLoopingBarrelStopSnd = true;
|
||
|
if ( KFP != none ) KFP.SetWeaponAmbientSound(BarrelStopRotationSound.DefaultCue, BarrelStopRotationSound.FirstPersonCue);
|
||
|
}
|
||
|
|
||
|
CurrentBarrelRotParam = NewCurrentBarrelParam;
|
||
|
}
|
||
|
|
||
|
PreviousOwner = KFP;
|
||
|
}
|
||
|
|
||
|
/*********************************************************************************************
|
||
|
* @name SFX
|
||
|
*********************************************************************************************/
|
||
|
|
||
|
simulated function UpdateBarrelSoundOnForceStop(bool bPlaySound)
|
||
|
{
|
||
|
local KFPawn KFP;
|
||
|
|
||
|
if(bPlayingLoopingBarrelSnd)
|
||
|
{
|
||
|
KFP = KFPawn(Instigator);
|
||
|
|
||
|
CurrentBarrelRotParam -= 2;
|
||
|
if ( KFP != none ) KFP.SetSecondaryWeaponComponentRTPCValue("MinigunRotation", CurrentBarrelRotParam);
|
||
|
|
||
|
if( CurrentBarrelRotParam > 20 && !bPlayingLoopingBarrelStopSnd )
|
||
|
{
|
||
|
bPlayingLoopingBarrelStopSnd = true;
|
||
|
if ( KFP != none ) KFP.SetWeaponAmbientSound(BarrelStopRotationSound.DefaultCue, BarrelStopRotationSound.FirstPersonCue);
|
||
|
}
|
||
|
|
||
|
if(CurrentBarrelRotParam < 0)
|
||
|
{
|
||
|
CurrentBarrelRotParam = 0;
|
||
|
bPlayingLoopingBarrelSnd = false;
|
||
|
bPlayingLoopingBarrelStopSnd = false;
|
||
|
if ( bPlaySound ) KFP.SetSecondaryWeaponAmbientSound(none, none);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*********************************************************************************************
|
||
|
* @name Trader
|
||
|
*********************************************************************************************/
|
||
|
|
||
|
/** Returns trader filter index based on weapon type */
|
||
|
static simulated event EFilterTypeUI GetTraderFilter()
|
||
|
{
|
||
|
return FT_Assault;
|
||
|
}
|
||
|
|
||
|
/*********************************************************************************************
|
||
|
* State WeaponFiring
|
||
|
* The weapon is in this state while holding fire button
|
||
|
*********************************************************************************************/
|
||
|
|
||
|
simulated state WeaponFiring
|
||
|
{
|
||
|
simulated function BeginState(Name PrevStateName)
|
||
|
{
|
||
|
Super.BeginState(PrevStateName);
|
||
|
|
||
|
if ( Instigator.IsLocallyControlled() )
|
||
|
{
|
||
|
ShootCameraAnimInstance = PlayCameraAnim(ShootCameraAnim, ShootCameraAnimScale, ShootCameraAnimPlayRate,
|
||
|
ShootCameraAnimBlendTime, ShootCameraAnimBlendTime, true, false);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
simulated function EndState(Name NextStateName)
|
||
|
{
|
||
|
local PlayerController PC;
|
||
|
|
||
|
Super.EndState(NextStateName);
|
||
|
|
||
|
if ( Instigator.IsLocallyControlled() )
|
||
|
{
|
||
|
PC = PlayerController(Instigator.Controller);
|
||
|
if (PC.PlayerCamera != None && ShootCameraAnimInstance != None)
|
||
|
{
|
||
|
PC.PlayerCamera.StopCameraAnim(ShootCameraAnimInstance);
|
||
|
ShootCameraAnimInstance = None;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
defaultproperties
|
||
|
{
|
||
|
// Wind Up variables
|
||
|
WindUpActivationTime=0.70 //1.5
|
||
|
WindUpRotationSpeed=1200
|
||
|
|
||
|
// FOV
|
||
|
MeshFOV=86
|
||
|
MeshIronSightFOV=82
|
||
|
PlayerIronSightFOV=82
|
||
|
PlayerSprintFOV=95
|
||
|
|
||
|
// Depth of field
|
||
|
DOF_FG_FocalRadius=85
|
||
|
DOF_FG_MaxNearBlurSize=2.5
|
||
|
|
||
|
// Content
|
||
|
PackageKey="Minigun"
|
||
|
FirstPersonMeshName="wep_1p_minigun_mesh.Wep_1stP_Minigun_Rig"
|
||
|
FirstPersonAnimSetNames(0)="wep_1p_minigun_anim.Wep_1stP_Minigun_Anim"
|
||
|
PickupMeshName="WEP_3P_Minigun_MESH.Wep_3rdP_Minigun_LowPoly_Pickup"
|
||
|
AttachmentArchetypeName="WEP_Minigun_ARCH.Wep_Minigun_3P"
|
||
|
MuzzleFlashTemplateName="WEP_Minigun_ARCH.Wep_Minigun_MuzzleFlash"
|
||
|
|
||
|
// Zooming/Position
|
||
|
PlayerViewOffset=(X=3.0,Y=15,Z=15)
|
||
|
IronSightPosition=(X=3.0,Y=15,Z=15)
|
||
|
|
||
|
// Ammo
|
||
|
MagazineCapacity[0]=90 //125 //175 //250
|
||
|
SpareAmmoCapacity[0]=540 //500 //750
|
||
|
InitialSpareMags[0]=1
|
||
|
AmmoPickupScale[0]=1 //0.67
|
||
|
bCanBeReloaded=true
|
||
|
bReloadFromMagazine=true
|
||
|
|
||
|
// Recoil
|
||
|
maxRecoilPitch=200 //187 //240 //225 //150
|
||
|
minRecoilPitch=150 //144 //184 //175 //115
|
||
|
maxRecoilYaw=130 //180 //115
|
||
|
minRecoilYaw=-130 //-180 //-115
|
||
|
RecoilRate=0.085
|
||
|
RecoilMaxYawLimit=500
|
||
|
RecoilMinYawLimit=65035
|
||
|
RecoilMaxPitchLimit=900
|
||
|
RecoilMinPitchLimit=65035
|
||
|
RecoilISMaxYawLimit=75
|
||
|
RecoilISMinYawLimit=65460
|
||
|
RecoilISMaxPitchLimit=375
|
||
|
RecoilISMinPitchLimit=65460
|
||
|
RecoilViewRotationScale=0.25
|
||
|
IronSightMeshFOVCompensationScale=1
|
||
|
HippedRecoilModifier=1.5
|
||
|
|
||
|
// Inventory / Grouping
|
||
|
InventorySize=10
|
||
|
InventoryGroup=IG_Primary
|
||
|
GroupPriority=130 //125
|
||
|
WeaponSelectTexture=Texture2D'WEP_UI_Minigun_TEX.UI_WeaponSelect_Minigun'
|
||
|
AssociatedPerkClasses(0)=class'KFPerk_Commando'
|
||
|
|
||
|
// DEFAULT_FIREMODE
|
||
|
FireModeIconPaths(DEFAULT_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_BulletAuto'
|
||
|
FiringStatesArray(DEFAULT_FIREMODE)=WeaponWindingUp
|
||
|
WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_InstantHit
|
||
|
WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_Minigun'
|
||
|
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_Minigun'
|
||
|
FireInterval(DEFAULT_FIREMODE)=+0.05 // 1200 RPM
|
||
|
Spread(DEFAULT_FIREMODE)=0.0085
|
||
|
PenetrationPower(DEFAULT_FIREMODE)=2.0
|
||
|
InstantHitDamage(DEFAULT_FIREMODE)=35.0 //32.0 //25
|
||
|
FireOffset=(X=30,Y=4.5,Z=-5)
|
||
|
|
||
|
// ALT_FIREMODE
|
||
|
FiringStatesArray(ALTFIRE_FIREMODE)=WeaponWindingUp
|
||
|
WeaponFireTypes(ALTFIRE_FIREMODE)=EWFT_None
|
||
|
|
||
|
Begin Object Name=FirstPersonMesh
|
||
|
// new anim tree with skelcontrol to rotate cylinders
|
||
|
AnimTreeTemplate=AnimTree'WEP_Minigun_ARCH.WEP_Animtree_Minigun_1p'
|
||
|
End Object
|
||
|
|
||
|
// BASH_FIREMODE
|
||
|
InstantHitDamageTypes(BASH_FIREMODE)=class'KFDT_Bludgeon_Minigun'
|
||
|
InstantHitDamage(BASH_FIREMODE)=30
|
||
|
|
||
|
// Fire Effects
|
||
|
WeaponFireSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_Minigun.Play_WEP_Minigun_Shoot_Loop_3P', FirstPersonCue=AkEvent'WW_WEP_Minigun.Play_WEP_Minigun_Shoot_Loop_1P')
|
||
|
WeaponFireSnd(ALTFIRE_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_Minigun.Play_WEP_Mingun_Shoot_3P', FirstPersonCue=AkEvent'WW_WEP_Minigun.Play_WEP_Mingun_Shoot_1P')
|
||
|
WeaponFireLoopEndSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_Minigun.Play_WEP_Minigun_Shoot_Loop_End_3P', FirstPersonCue=AkEvent'WW_WEP_Minigun.Play_WEP_Minigun_Shoot_Loop_End_1P')
|
||
|
WeaponDryFireSnd(DEFAULT_FIREMODE)=AkEvent'WW_WEP_SA_L85A2.Play_WEP_SA_L85A2_Handling_DryFire'
|
||
|
WeaponDryFireSnd(ALTFIRE_FIREMODE)=AkEvent'WW_WEP_SA_L85A2.Play_WEP_SA_L85A2_Handling_DryFire'
|
||
|
|
||
|
BarrelRotationLoopSound=(DefaultCue=AkEvent'WW_WEP_Minigun.Play_WEP_Minigun_Loop_3P', FirstPersonCue=AkEvent'WW_WEP_Minigun.Play_WEP_Minigun_Loop_1P')
|
||
|
BarrelStopRotationSound=(DefaultCue=AkEvent'WW_WEP_Minigun.Play_WEP_Minigun_Decelerate_3P', FirstPersonCue=AkEvent'WW_WEP_Minigun.Play_WEP_Minigun_Decelerate_1P')
|
||
|
|
||
|
// Advanced (High RPM) Fire Effects
|
||
|
bLoopingFireAnim(DEFAULT_FIREMODE)=true
|
||
|
bLoopingFireSnd(DEFAULT_FIREMODE)=true
|
||
|
SingleFireSoundIndex=ALTFIRE_FIREMODE
|
||
|
|
||
|
// Attachments
|
||
|
bHasIronSights=false
|
||
|
bHasFlashlight=false
|
||
|
|
||
|
EjectedShellForegroundDuration=0.8f
|
||
|
|
||
|
// Camera shake animation
|
||
|
ShootCameraAnim=CameraAnim'WEP_1P_Minigun_ANIM.Shoot'
|
||
|
ShootCameraAnimPlayRate=1.0f //0.6f
|
||
|
ShootCameraAnimScale=0.19f //0.25f
|
||
|
ShootCameraAnimBlendTime=0.1f
|
||
|
|
||
|
// movement and rotation speed values when winding up
|
||
|
WindUpViewRotationSpeed=2000 // base rotation speed is 2000
|
||
|
WindUpPawnMovementSpeed=0.8f //0.7f // base modifier is 1
|
||
|
|
||
|
// movement and rotation speed values when firing
|
||
|
FiringViewRotationSpeed=488 //320 //270
|
||
|
FiringPawnMovementSpeed=0.3f //0.2f //0.08f
|
||
|
}
|
||
|
|
||
|
|