193 lines
7.1 KiB
Ucode
193 lines
7.1 KiB
Ucode
//=============================================================================
|
|
// KFWeap_HRG_Boomy
|
|
//=============================================================================
|
|
//
|
|
//=============================================================================
|
|
// Killing Floor 2
|
|
// Copyright (C) 2021 Tripwire Interactive LLC
|
|
//=============================================================================
|
|
|
|
class KFWeap_HRG_Boomy extends KFWeap_SMGBase;
|
|
|
|
/**
|
|
* Overriden to use instant hit vfx.
|
|
* Basically, calculate the hit location so vfx can play
|
|
*/
|
|
simulated function Projectile ProjectileFire()
|
|
{
|
|
local vector StartTrace, EndTrace, RealStartLoc, AimDir;
|
|
local ImpactInfo TestImpact;
|
|
local vector DirA, DirB;
|
|
local Quat Q;
|
|
local class<KFProjectile> MyProjectileClass;
|
|
|
|
MyProjectileClass = GetKFProjectileClass();
|
|
|
|
// This is where we would start an instant trace. (what CalcWeaponFire uses)
|
|
StartTrace = GetSafeStartTraceLocation();
|
|
AimDir = Vector(GetAdjustedAim( StartTrace ));
|
|
|
|
// this is the location where the projectile is spawned.
|
|
RealStartLoc = GetPhysicalFireStartLoc(AimDir);
|
|
|
|
// if projectile is spawned at different location of crosshair,
|
|
// then simulate an instant trace where crosshair is aiming at, Get hit info.
|
|
EndTrace = StartTrace + AimDir * GetTraceRange();
|
|
TestImpact = CalcWeaponFire( StartTrace, EndTrace );
|
|
|
|
// Set flash location to trigger client side effects. Bypass Weapon.SetFlashLocation since
|
|
// that function is not marked as simulated and we want instant client feedback.
|
|
// ProjectileFire/IncrementFlashCount has the right idea:
|
|
// 1) Call IncrementFlashCount on Server & Local
|
|
// 2) Replicate FlashCount if ( !bNetOwner )
|
|
// 3) Call WeaponFired() once on local player
|
|
if( Instigator != None )
|
|
{
|
|
Instigator.SetFlashLocation( Self, CurrentFireMode, TestImpact.HitLocation );
|
|
}
|
|
|
|
if( Role == ROLE_Authority || (MyProjectileClass.default.bUseClientSideHitDetection
|
|
&& MyProjectileClass.default.bNoReplicationToInstigator && Instigator != none
|
|
&& Instigator.IsLocallyControlled()) )
|
|
{
|
|
|
|
if( StartTrace != RealStartLoc )
|
|
{
|
|
// Store the original aim direction without correction
|
|
DirB = AimDir;
|
|
|
|
// Then we realign projectile aim direction to match where the crosshair did hit.
|
|
AimDir = Normal(TestImpact.HitLocation - RealStartLoc);
|
|
|
|
// Store the desired corrected aim direction
|
|
DirA = AimDir;
|
|
|
|
// Clamp the maximum aim adjustment for the AimDir so you don't get wierd
|
|
// cases where the projectiles velocity is going WAY off of where you
|
|
// are aiming. This can happen if you are really close to what you are
|
|
// shooting - Ramm
|
|
if ( (DirA dot DirB) < MaxAimAdjust_Cos )
|
|
{
|
|
Q = QuatFromAxisAndAngle(Normal(DirB cross DirA), MaxAimAdjust_Angle);
|
|
AimDir = QuatRotateVector(Q,DirB);
|
|
}
|
|
}
|
|
|
|
return SpawnAllProjectiles(MyProjectileClass, RealStartLoc, AimDir);
|
|
}
|
|
|
|
return None;
|
|
}
|
|
|
|
|
|
defaultproperties
|
|
{
|
|
bHasFireLastAnims=true
|
|
BonesToLockOnEmpty=(RW_Charging_Handle)
|
|
|
|
// Shooting Animations
|
|
FireSightedAnims[0]=Shoot_Iron
|
|
FireSightedAnims[1]=Shoot_Iron2
|
|
FireSightedAnims[2]=Shoot_Iron3
|
|
|
|
// FOV
|
|
MeshFOV=75
|
|
MeshIronSightFOV=52
|
|
PlayerIronSightFOV=70
|
|
|
|
// Depth of field
|
|
DOF_FG_FocalRadius=85
|
|
DOF_FG_MaxNearBlurSize=2.5
|
|
|
|
// Content
|
|
PackageKey="HRG_Boomy"
|
|
FirstPersonMeshName="WEP_1P_HRG_Boomy_MESH.Wep_1stP_HRG_Boomy_Rig"
|
|
FirstPersonAnimSetNames(0)="WEP_1P_HRG_Boomy_ANIM.WEP_1stP_HRG_Boomy_Anim"
|
|
PickupMeshName="WEP_3P_HRG_Boomy_MESH.Wep_3rdP_HRG_Boomy_Pickup"
|
|
AttachmentArchetypeName="WEP_HRG_Boomy_ARCH.Wep_HRG_Boomy_3P"
|
|
MuzzleFlashTemplateName="WEP_HRG_Boomy_ARCH.Wep_HRG_Boomy_MuzzleFlash"
|
|
|
|
|
|
// Zooming/Position
|
|
PlayerViewOffset=(X=5.0,Y=9,Z=-5)
|
|
IronSightPosition=(X=5,Y=0,Z=0)
|
|
|
|
// Ammo
|
|
MagazineCapacity[0]=24
|
|
SpareAmmoCapacity[0]=192
|
|
InitialSpareMags[0]=2 //1
|
|
bCanBeReloaded=true
|
|
bReloadFromMagazine=true
|
|
|
|
// Recoil
|
|
maxRecoilPitch=325 //325 //130 //165
|
|
minRecoilPitch=300 //275 //115 //130
|
|
maxRecoilYaw=140 //150 //115 //130
|
|
minRecoilYaw=-140 //-150 //-115 //130
|
|
RecoilRate=0.085
|
|
RecoilMaxYawLimit=500
|
|
RecoilMinYawLimit=65035
|
|
RecoilMaxPitchLimit=900
|
|
RecoilMinPitchLimit=65035
|
|
RecoilISMaxYawLimit=75
|
|
RecoilISMinYawLimit=65460
|
|
RecoilISMaxPitchLimit=375
|
|
RecoilISMinPitchLimit=65460
|
|
RecoilViewRotationScale=0.25
|
|
IronSightMeshFOVCompensationScale=1.5
|
|
HippedRecoilModifier=1.5
|
|
|
|
// Inventory / Grouping
|
|
InventorySize=7
|
|
GroupPriority=50
|
|
WeaponSelectTexture=Texture2D'WEP_UI_HRG_Boomy_TEX.UI_WeaponSelect_HRG_Boomy'
|
|
|
|
AssociatedPerkClasses(0)=class'KFPerk_Demolitionist'
|
|
|
|
// DEFAULT_FIREMODE
|
|
FireModeIconPaths(DEFAULT_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_BulletAuto'
|
|
FiringStatesArray(DEFAULT_FIREMODE)=WeaponFiring
|
|
WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_Projectile
|
|
WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_HRG_Boomy'
|
|
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HRG_Boomy'
|
|
FireInterval(DEFAULT_FIREMODE)=+0.1667 // 360 RPM
|
|
Spread(DEFAULT_FIREMODE)=0.01 //0.025
|
|
InstantHitDamage(DEFAULT_FIREMODE)=30.0 //25.0
|
|
FireOffset=(X=30,Y=4.5,Z=-5)
|
|
|
|
// ALT_FIREMODE
|
|
FireModeIconPaths(ALTFIRE_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_BulletSingle'
|
|
FiringStatesArray(ALTFIRE_FIREMODE)=WeaponSingleFiring
|
|
WeaponFireTypes(ALTFIRE_FIREMODE)=EWFT_Projectile
|
|
WeaponProjectiles(ALTFIRE_FIREMODE)=class'KFProj_Bullet_HRG_Boomy'
|
|
InstantHitDamageTypes(ALTFIRE_FIREMODE)=class'KFDT_Ballistic_HRG_Boomy'
|
|
FireInterval(ALTFIRE_FIREMODE)=+0.1667 // 360 RPM
|
|
InstantHitDamage(ALTFIRE_FIREMODE)=30.0 //25.0
|
|
Spread(ALTFIRE_FIREMODE)=0.01 //0.025
|
|
|
|
// BASH_FIREMODE
|
|
InstantHitDamageTypes(BASH_FIREMODE)=class'KFDT_Bludgeon_HRG_Boomy'
|
|
InstantHitDamage(BASH_FIREMODE)=26
|
|
|
|
// Fire Effects
|
|
WeaponFireSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'ww_wep_hrg_boomy.Play_WEP_HRG_Boomy_3P_ShootLoop', FirstPersonCue=AkEvent'ww_wep_hrg_boomy.Play_WEP_HRG_Boomy_1P_ShootLoop')
|
|
WeaponFireSnd(ALTFIRE_FIREMODE)=(DefaultCue=AkEvent'ww_wep_hrg_boomy.Play_WEP_HRG_Boomy_3P_Shoot', FirstPersonCue=AkEvent'ww_wep_hrg_boomy.Play_WEP_HRG_Boomy_1P_Shoot')
|
|
WeaponFireLoopEndSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'ww_wep_hrg_boomy.Play_WEP_HRG_Boomy_3P_ShootLoopEnd', FirstPersonCue=AkEvent'ww_wep_hrg_boomy.Play_WEP_HRG_Boomy_1P_ShootLoopEnd')
|
|
|
|
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'
|
|
|
|
// Advanced (High RPM) Fire Effects
|
|
bLoopingFireAnim(DEFAULT_FIREMODE)=true
|
|
bLoopingFireSnd(DEFAULT_FIREMODE)=true
|
|
SingleFireSoundIndex=ALTFIRE_FIREMODE
|
|
|
|
// Attachments
|
|
bHasIronSights=true
|
|
bHasFlashlight=false
|
|
|
|
WeaponUpgrades[1]=(Stats=((Stat=EWUS_Damage0, Scale=1.2f), (Stat=EWUS_Damage1, Scale=1.15f), (Stat=EWUS_Weight, Add=1)))
|
|
WeaponUpgrades[2]=(Stats=((Stat=EWUS_Damage0, Scale=1.4f), (Stat=EWUS_Damage1, Scale=1.3f), (Stat=EWUS_Weight, Add=2)))
|
|
WeaponUpgrades[3]=(Stats=((Stat=EWUS_Damage0, Scale=1.6f), (Stat=EWUS_Damage1, Scale=1.45f), (Stat=EWUS_Weight, Add=3)))
|
|
}
|