216 lines
6.6 KiB
Ucode
216 lines
6.6 KiB
Ucode
|
//=============================================================================
|
||
|
// KFWeap_Shotgun_HZ12
|
||
|
//=============================================================================
|
||
|
// Class Description
|
||
|
//=============================================================================
|
||
|
// Killing Floor 2
|
||
|
// Copyright (C) 2016 Tripwire Interactive LLC
|
||
|
//=============================================================================
|
||
|
class KFWeap_Shotgun_HZ12 extends KFWeap_ShotgunBase;
|
||
|
|
||
|
/** Keeps track of number of shots fired for the alternate fire animation */
|
||
|
var transient protected int NumShotsFired;
|
||
|
|
||
|
/** Fire interval used for pump shots */
|
||
|
var const protected float PumpFireInterval;
|
||
|
|
||
|
simulated protected function bool IsPumpFire()
|
||
|
{
|
||
|
return NumShotsFired % 2 == 0;
|
||
|
}
|
||
|
|
||
|
/** Overridden to use a custom fire interval for pump shots */
|
||
|
simulated function float GetFireInterval( byte FireModeNum )
|
||
|
{
|
||
|
if( IsPumpFire() )
|
||
|
{
|
||
|
return PumpFireInterval;
|
||
|
}
|
||
|
|
||
|
return super.GetFireInterval( FireModeNum );
|
||
|
}
|
||
|
|
||
|
/** Overridden to add to the number of shots fired */
|
||
|
simulated function ConsumeAmmo( byte FireModeNum )
|
||
|
{
|
||
|
++NumShotsFired;
|
||
|
|
||
|
super.ConsumeAmmo( FireModeNum );
|
||
|
}
|
||
|
|
||
|
/** Overridden to reset shot count */
|
||
|
simulated function PerformReload(optional byte FireModeNum)
|
||
|
{
|
||
|
NumShotsFired = 0;
|
||
|
|
||
|
super.PerformReload( FireModeNum );
|
||
|
}
|
||
|
|
||
|
/** We need to play a pump every 2 shots, as well as for the last shot to eject any shells remaining before reloading */
|
||
|
simulated function bool ShouldPlayFireLast( byte FireModeNum )
|
||
|
{
|
||
|
if( IsPumpFire() )
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/*********************************************************************************************
|
||
|
* State WeaponSingleFiring
|
||
|
* Fire must be released between every shot.
|
||
|
*********************************************************************************************/
|
||
|
|
||
|
simulated state WeaponSingleFiring
|
||
|
{
|
||
|
/**
|
||
|
* Timer event, call is set up in Weapon::TimeWeaponFiring().
|
||
|
* The weapon is given a chance to evaluate if another shot should be fired.
|
||
|
* This event defines the weapon's rate of fire.
|
||
|
*/
|
||
|
simulated function RefireCheckTimer()
|
||
|
{
|
||
|
super.RefireCheckTimer();
|
||
|
|
||
|
//@TODO: Try to make timer time dilation work instead of restarting the timer, so we can
|
||
|
// keep our timer overlaps. It's unlikely it could desynched with a magazine less than
|
||
|
// 100, but it's still safer this way. -MattF
|
||
|
/*if( IsTimerActive(nameOf(RefireCheckTimer)) )
|
||
|
{
|
||
|
if( IsPumpFire() )
|
||
|
{
|
||
|
//`log("numshotsfired:"@numshotsfired@FireInterval[0] / PumpFireInterval);
|
||
|
ModifyTimerTimeDilation( nameOf(RefireCheckTimer), FireInterval[0] / PumpFireInterval );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
`log("numshotsfired:"@numshotsfired@FireInterval[0]);
|
||
|
ResetTimerTimeDilation( nameOf(RefireCheckTimer) );
|
||
|
}
|
||
|
}*/
|
||
|
}
|
||
|
|
||
|
/** Handle fire interval changes */
|
||
|
simulated function FireAmmunition()
|
||
|
{
|
||
|
super.FireAmmunition();
|
||
|
|
||
|
// Gotta restart the timer every shot :(
|
||
|
if( IsTimerActive(nameOf(RefireCheckTimer)) )
|
||
|
{
|
||
|
ClearTimer( nameOf(RefireCheckTimer) );
|
||
|
TimeWeaponFiring( CurrentFireMode );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
defaultproperties
|
||
|
{
|
||
|
// Inventory
|
||
|
InventorySize=5
|
||
|
GroupPriority=55
|
||
|
WeaponSelectTexture=Texture2D'WEP_UI_HZ12_TEX.UI_WeaponSelect_HZ12'
|
||
|
|
||
|
// FOV
|
||
|
MeshFOV=75
|
||
|
MeshIronSightFOV=52
|
||
|
PlayerIronSightFOV=70
|
||
|
|
||
|
// Depth of field
|
||
|
DOF_FG_FocalRadius=95
|
||
|
DOF_FG_MaxNearBlurSize=3.5
|
||
|
|
||
|
// Zooming/Position
|
||
|
PlayerViewOffset=(X=20,Y=7.6,Z=-3.0)
|
||
|
IronSightPosition=(X=6.0,Y=0,Z=0)
|
||
|
|
||
|
// Content
|
||
|
PackageKey="HZ12"
|
||
|
FirstPersonMeshName="WEP_1P_HZ12_MESH.Wep_1stP_HZ12_Rig"
|
||
|
FirstPersonAnimSetNames(0)="WEP_1P_HZ12_ANIM.Wep_1stP_HZ12_Anim"
|
||
|
PickupMeshName="WEP_3P_HZ12_MESH.Wep_3rdP_HZ12_Pickup"
|
||
|
AttachmentArchetypeName="WEP_HZ12_ARCH.Wep_HZ12_3P"
|
||
|
MuzzleFlashTemplateName="WEP_HZ12_ARCH.Wep_HZ12_MuzzleFlash"
|
||
|
|
||
|
// DEFAULT_FIREMODE
|
||
|
FireModeIconPaths(DEFAULT_FIREMODE)="ui_firemodes_tex.UI_FireModeSelect_ShotgunSingle"
|
||
|
FiringStatesArray(DEFAULT_FIREMODE)=WeaponSingleFiring
|
||
|
WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_Projectile
|
||
|
WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_Pellet'
|
||
|
InstantHitDamage(DEFAULT_FIREMODE)=20.0
|
||
|
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HZ12'
|
||
|
PenetrationPower(DEFAULT_FIREMODE)=2.0
|
||
|
FireInterval(DEFAULT_FIREMODE)=0.1
|
||
|
Spread(DEFAULT_FIREMODE)=0.15
|
||
|
FireOffset=(X=30,Y=3,Z=-3)
|
||
|
// Shotgun
|
||
|
NumPellets(DEFAULT_FIREMODE)=10
|
||
|
|
||
|
// HZ12
|
||
|
PumpFireInterval=0.66 //0.77
|
||
|
|
||
|
// ALT_FIREMODE
|
||
|
FireModeIconPaths(ALTFIRE_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_ShotgunSingle'
|
||
|
FiringStatesArray(ALTFIRE_FIREMODE)=WeaponSingleFiring
|
||
|
WeaponFireTypes(ALTFIRE_FIREMODE)=EWFT_None
|
||
|
|
||
|
// BASH_FIREMODE
|
||
|
InstantHitDamageTypes(BASH_FIREMODE)=class'KFDT_Bludgeon_HZ12'
|
||
|
InstantHitDamage(BASH_FIREMODE)=25
|
||
|
|
||
|
// Fire Effects
|
||
|
WeaponFireSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_HZ12.Play_WEP_HZ12_Fire_3P', FirstPersonCue=AkEvent'WW_WEP_HZ12.Play_WEP_HZ12_Fire_1P')
|
||
|
WeaponFireSnd(ALTFIRE_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_HZ12.Play_WEP_HZ12_Fire_3P', FirstPersonCue=AkEvent'WW_WEP_HZ12.Play_WEP_HZ12_Fire_1P')
|
||
|
|
||
|
// using M4 dry fire sound. this is intentional.
|
||
|
WeaponDryFireSnd(DEFAULT_FIREMODE)=AkEvent'WW_WEP_SA_M4.Play_WEP_SA_M4_Handling_DryFire'
|
||
|
WeaponDryFireSnd(ALTFIRE_FIREMODE)=AkEvent'WW_WEP_SA_M4.Play_WEP_SA_M4_Handling_DryFire'
|
||
|
|
||
|
// Attachments
|
||
|
bHasIronSights=true
|
||
|
bHasFlashlight=true
|
||
|
|
||
|
// Ammo
|
||
|
MagazineCapacity[0]=16
|
||
|
SpareAmmoCapacity[0]=80
|
||
|
InitialSpareMags[0]=1
|
||
|
bCanBeReloaded=true
|
||
|
bReloadFromMagazine=true
|
||
|
|
||
|
// Recoil
|
||
|
maxRecoilPitch=900
|
||
|
minRecoilPitch=775
|
||
|
maxRecoilYaw=500
|
||
|
minRecoilYaw=-500
|
||
|
RecoilRate=0.085
|
||
|
RecoilBlendOutRatio=1.1 //0.35
|
||
|
RecoilMaxYawLimit=500
|
||
|
RecoilMinYawLimit=65035
|
||
|
RecoilMaxPitchLimit=1500
|
||
|
RecoilMinPitchLimit=64785
|
||
|
RecoilISMaxYawLimit=50
|
||
|
RecoilISMinYawLimit=65485
|
||
|
RecoilISMaxPitchLimit=500
|
||
|
RecoilISMinPitchLimit=65485
|
||
|
RecoilViewRotationScale=0.8
|
||
|
FallingRecoilModifier=1.5
|
||
|
HippedRecoilModifier=1.25
|
||
|
|
||
|
// Animation
|
||
|
bHasFireLastAnims=false
|
||
|
|
||
|
AssociatedPerkClasses(0)=class'KFPerk_Support'
|
||
|
|
||
|
WeaponFireWaveForm=ForceFeedbackWaveform'FX_ForceFeedback_ARCH.Gunfire.Heavy_Recoil_SingleShot'
|
||
|
|
||
|
// Weapon Upgrade stat boosts
|
||
|
//WeaponUpgrades[1]=(IncrementDamage=1.1f,IncrementWeight=1)
|
||
|
//WeaponUpgrades[2]=(IncrementDamage=1.2f,IncrementWeight=2)
|
||
|
//WeaponUpgrades[3]=(IncrementDamage=1.3f,IncrementWeight=3)
|
||
|
|
||
|
WeaponUpgrades[1]=(Stats=((Stat=EWUS_Damage0, Scale=1.1f), (Stat=EWUS_Weight, Add=1)))
|
||
|
WeaponUpgrades[2]=(Stats=((Stat=EWUS_Damage0, Scale=1.2f), (Stat=EWUS_Weight, Add=2)))
|
||
|
WeaponUpgrades[3]=(Stats=((Stat=EWUS_Damage0, Scale=1.3f), (Stat=EWUS_Weight, Add=3)))
|
||
|
}
|