287 lines
8.8 KiB
Ucode
287 lines
8.8 KiB
Ucode
|
//=============================================================================
|
||
|
// KFWeap_HRG_Dragonbreath
|
||
|
//=============================================================================
|
||
|
// Killing Floor 2
|
||
|
// Copyright (C) 2022 Tripwire Interactive LLC
|
||
|
//=============================================================================
|
||
|
class KFWeap_HRG_Dragonbreath extends KFWeap_ShotgunBase;
|
||
|
|
||
|
/** How much to scale recoil when firing in double barrel fire. */
|
||
|
var(Recoil) float QuadFireRecoilModifier;
|
||
|
|
||
|
/** Shoot animation to play when shooting both barrels from the hip */
|
||
|
var(Animations) const editconst name FireQuadAnim;
|
||
|
|
||
|
/** How much momentum to apply when fired in double barrel */
|
||
|
var(Recoil) float DoubleBarrelKickMomentum;
|
||
|
|
||
|
/** How much to reduce shoot momentum when falling */
|
||
|
var(Recoil) float FallingMomentumReduction;
|
||
|
|
||
|
var(Spread) const float SpreadWidthDegrees;
|
||
|
var(Spread) const float SpreadWidthDegreesAlt;
|
||
|
|
||
|
var transient float StartingPelletPosition;
|
||
|
var transient float StartingPelletPositionAlt;
|
||
|
|
||
|
var const float BarrelHeatPerProjectile;
|
||
|
var const float MaxBarrelHeat;
|
||
|
var const float BarrelCooldownRate;
|
||
|
var transient float CurrentBarrelHeat;
|
||
|
var transient float LastBarrelHeat;
|
||
|
|
||
|
simulated event PreBeginPlay()
|
||
|
{
|
||
|
Super.PreBeginPlay();
|
||
|
|
||
|
Spread[DEFAULT_FIREMODE] = SpreadWidthDegrees * DegToRad / NumPellets[DEFAULT_FIREMODE];
|
||
|
Spread[ALTFIRE_FIREMODE] = SpreadWidthDegreesAlt * DegToRad / NumPellets[ALTFIRE_FIREMODE];
|
||
|
|
||
|
StartingPelletPosition = -SpreadWidthDegrees * DegToRad / 2.0f;
|
||
|
StartingPelletPositionAlt = -SpreadWidthDegreesAlt * DegToRad / 2.0f;
|
||
|
}
|
||
|
|
||
|
simulated event PostBeginPlay()
|
||
|
{
|
||
|
Super.PostBeginPlay();
|
||
|
|
||
|
// Force start with "Glow_Intensity" of 0.0f
|
||
|
LastBarrelHeat = MaxBarrelHeat;
|
||
|
ChangeBarrelMaterial();
|
||
|
}
|
||
|
|
||
|
simulated function AltFireMode()
|
||
|
{
|
||
|
if ( !Instigator.IsLocallyControlled() )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
StartFire(ALTFIRE_FIREMODE);
|
||
|
}
|
||
|
|
||
|
/** Returns number of projectiles to fire from SpawnProjectile */
|
||
|
simulated function byte GetNumProjectilesToFire(byte FireModeNum)
|
||
|
{
|
||
|
return NumPellets[CurrentFireMode];
|
||
|
}
|
||
|
|
||
|
/** Handle one-hand fire anims */
|
||
|
simulated function name GetWeaponFireAnim(byte FireModeNum)
|
||
|
{
|
||
|
if (bUsingSights)
|
||
|
{
|
||
|
return FireSightedAnims[FireModeNum];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (FireModeNum == ALTFIRE_FIREMODE)
|
||
|
{
|
||
|
return FireQuadAnim;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return FireAnim;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
simulated function KFProjectile SpawnAllProjectiles(class<KFProjectile> KFProjClass, vector RealStartLoc, vector AimDir)
|
||
|
{
|
||
|
local int ProjectilesToFire, i;
|
||
|
local float InitialOffset;
|
||
|
|
||
|
ProjectilesToFire = GetNumProjectilesToFire(CurrentFireMode);
|
||
|
if (CurrentFireMode == GRENADE_FIREMODE || ProjectilesToFire <= 1)
|
||
|
{
|
||
|
return SpawnProjectile(KFProjClass, RealStartLoc, AimDir);
|
||
|
}
|
||
|
|
||
|
InitialOffset = CurrentFireMode == DEFAULT_FIREMODE ? StartingPelletPosition : StartingPelletPositionAlt;
|
||
|
|
||
|
for (i = 0; i < ProjectilesToFire; i++)
|
||
|
{
|
||
|
SpawnProjectile(KFProjClass, RealStartLoc, CalculateSpread(InitialOffset, Spread[CurrentFireMode], i, CurrentFireMode == ALTFIRE_FIREMODE));
|
||
|
CurrentBarrelHeat = fmin(CurrentBarrelHeat + BarrelHeatPerProjectile, MaxBarrelHeat);
|
||
|
}
|
||
|
|
||
|
ChangeBarrelMaterial();
|
||
|
return None;
|
||
|
}
|
||
|
|
||
|
simulated function vector CalculateSpread(float InitialOffset, float CurrentSpread, byte PelletNum, bool bHorizontal)
|
||
|
{
|
||
|
local Vector X, Y, Z, POVLoc;
|
||
|
local Quat R;
|
||
|
local rotator POVRot;
|
||
|
|
||
|
if (Instigator != None && Instigator.Controller != none)
|
||
|
{
|
||
|
Instigator.Controller.GetPlayerViewPoint(POVLoc, POVRot);
|
||
|
}
|
||
|
|
||
|
GetAxes(POVRot, X, Y, Z);
|
||
|
|
||
|
R = QuatFromAxisAndAngle(bHorizontal ? Z : Y, InitialOffset + CurrentSpread * PelletNum);
|
||
|
return QuatRotateVector(R, vector(POVRot));
|
||
|
}
|
||
|
|
||
|
simulated function ChangeBarrelMaterial()
|
||
|
{
|
||
|
local int i;
|
||
|
|
||
|
if( CurrentBarrelHeat != LastBarrelHeat )
|
||
|
{
|
||
|
for( i = 0; i < WeaponMICs.Length; ++i )
|
||
|
{
|
||
|
if( WeaponMICs[i] != none )
|
||
|
{
|
||
|
WeaponMICs[i].SetScalarParameterValue('Barrel_intensity', CurrentBarrelHeat);
|
||
|
LastBarrelHeat = CurrentBarrelHeat;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
simulated function Tick(float Delta)
|
||
|
{
|
||
|
Super.Tick(Delta);
|
||
|
|
||
|
CurrentBarrelHeat = fmax(CurrentBarrelHeat - BarrelCooldownRate * Delta, 0.0f);
|
||
|
ChangeBarrelMaterial();
|
||
|
}
|
||
|
|
||
|
defaultproperties
|
||
|
{
|
||
|
// Inventory
|
||
|
InventorySize=7
|
||
|
GroupPriority=110
|
||
|
WeaponSelectTexture=Texture2D'WEP_UI_Quad_Barrel_TEX.UI_WeaponSelect_QuadBarrel'
|
||
|
|
||
|
// FOV
|
||
|
MeshFOV=60
|
||
|
MeshIronSightFOV=52
|
||
|
PlayerIronSightFOV=70
|
||
|
|
||
|
// Depth of field
|
||
|
DOF_FG_FocalRadius=65
|
||
|
DOF_FG_MaxNearBlurSize=3
|
||
|
|
||
|
// Zooming/Position
|
||
|
PlayerViewOffset=(X=15.0,Y=8.0,Z=-4.5)
|
||
|
IronSightPosition=(X=3,Y=0,Z=0)
|
||
|
|
||
|
// Content
|
||
|
PackageKey="HRG_MegaDragonsbreath"
|
||
|
FirstPersonMeshName="wep_1p_hrg_megadragonsbreath_mesh.Wep_1stP_HRG_MegaDragonsbreath_Rig"
|
||
|
FirstPersonAnimSetNames(0)="wep_1p_hrg_megadragonsbreath_anim.Wep_1stP_HRG_MegaDragonsbreath_Anim"
|
||
|
PickupMeshName="wep_3p_hrg_megadragonsbreath_mesh.Wep_3rdP_HRG_MegaDragonsbreath_Pickup"
|
||
|
AttachmentArchetypeName="wep_hrg_megadragonsbreath_arch.Wep_HRG_MegaDragonsbreath_3P"
|
||
|
MuzzleFlashTemplateName="wep_hrg_megadragonsbreath_arch.Wep_HRG_MegaDragonsbreath_MuzzleFlash"
|
||
|
|
||
|
// Animations
|
||
|
FireAnim=Shoot_Single
|
||
|
FireQuadAnim=Shoot_Double
|
||
|
FireSightedAnims[0]=Shoot_Iron_Single
|
||
|
FireSightedAnims[1]=Shoot_Iron_Double
|
||
|
bHasFireLastAnims=false
|
||
|
|
||
|
// DEFAULT_FIREMODE
|
||
|
FireModeIconPaths(DEFAULT_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_ShotgunSingle'
|
||
|
FiringStatesArray(DEFAULT_FIREMODE)=WeaponSingleFiring
|
||
|
WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_Projectile
|
||
|
WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Pellet_HRG_Dragonbreath'
|
||
|
InstantHitDamage(DEFAULT_FIREMODE)=28.0 //36
|
||
|
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HRG_Dragonbreath'
|
||
|
PenetrationPower(DEFAULT_FIREMODE)=4.0
|
||
|
FireInterval(DEFAULT_FIREMODE)=0.25 // 240 RPM
|
||
|
FireOffset=(X=25,Y=3.5,Z=-4)
|
||
|
NumPellets(DEFAULT_FIREMODE)=8
|
||
|
Spread(DEFAULT_FIREMODE)=0
|
||
|
ForceReloadTimeOnEmpty=0.3
|
||
|
|
||
|
// ALT_FIREMODE
|
||
|
FireModeIconPaths(ALTFIRE_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_ShotgunAuto'
|
||
|
FiringStatesArray(ALTFIRE_FIREMODE)= WeaponSingleFiring
|
||
|
WeaponFireTypes(ALTFIRE_FIREMODE)=EWFT_Projectile
|
||
|
WeaponProjectiles(ALTFIRE_FIREMODE)=class'KFProj_Pellet_HRG_Dragonbreath'
|
||
|
InstantHitDamage(ALTFIRE_FIREMODE)=28.0
|
||
|
InstantHitDamageTypes(ALTFIRE_FIREMODE)=class'KFDT_Ballistic_HRG_Dragonbreath'
|
||
|
PenetrationPower(ALTFIRE_FIREMODE)=4.0
|
||
|
FireInterval(ALTFIRE_FIREMODE)=0.25 // 240 RPM
|
||
|
NumPellets(ALTFIRE_FIREMODE)=8
|
||
|
Spread(ALTFIRE_FIREMODE)=0
|
||
|
AmmoCost(ALTFIRE_FIREMODE)=1
|
||
|
DoubleBarrelKickMomentum=1000
|
||
|
FallingMomentumReduction=0.5
|
||
|
|
||
|
// BASH_FIREMODE
|
||
|
InstantHitDamageTypes(BASH_FIREMODE)=class'KFDT_Bludgeon_HRG_Dragonbreath'
|
||
|
InstantHitDamage(BASH_FIREMODE)=27
|
||
|
|
||
|
// Fire Effects
|
||
|
WeaponFireSnd(DEFAULT_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_Quad_Shotgun.Play_Quad_Shotgun_Fire_3P_Single', FirstPersonCue=AkEvent'WW_WEP_Quad_Shotgun.Play_Quad_Shotgun_Fire_1P_Single') //@TODO: Replace
|
||
|
WeaponFireSnd(ALTFIRE_FIREMODE)=(DefaultCue=AkEvent'WW_WEP_Quad_Shotgun.Play_Quad_Shotgun_Fire_3P_AltFire', FirstPersonCue=AkEvent'WW_WEP_Quad_Shotgun.Play_Quad_Shotgun_Fire_1P_AltFire') //@TODO: Replace
|
||
|
|
||
|
WeaponDryFireSnd(DEFAULT_FIREMODE)=AkEvent'WW_WEP_Quad_Shotgun.Play_Quad_Shotgun_DryFire' //@TODO: Replace
|
||
|
WeaponDryFireSnd(ALTFIRE_FIREMODE)=AkEvent'WW_WEP_Quad_Shotgun.Play_Quad_Shotgun_DryFire' //@TODO: Replace
|
||
|
|
||
|
// Attachments
|
||
|
bHasIronSights=true
|
||
|
bHasFlashlight=false
|
||
|
|
||
|
// Ammo
|
||
|
MagazineCapacity[0]=4
|
||
|
SpareAmmoCapacity[0]=48 //72
|
||
|
InitialSpareMags[0]=3 //8
|
||
|
AmmoPickupScale[0]=2.0 //3.0
|
||
|
bCanBeReloaded=true
|
||
|
bReloadFromMagazine=true
|
||
|
bNoMagazine=true
|
||
|
|
||
|
// Recoil
|
||
|
maxRecoilPitch=1200 //900
|
||
|
minRecoilPitch=775
|
||
|
maxRecoilYaw=800 //500
|
||
|
minRecoilYaw=-500
|
||
|
RecoilRate=0.085
|
||
|
RecoilBlendOutRatio=1.1
|
||
|
RecoilMaxYawLimit=500
|
||
|
RecoilMinYawLimit=65035
|
||
|
RecoilMaxPitchLimit=1500
|
||
|
RecoilMinPitchLimit=64785
|
||
|
RecoilISMaxYawLimit=50
|
||
|
RecoilISMinYawLimit=65485
|
||
|
RecoilISMaxPitchLimit=500
|
||
|
RecoilISMinPitchLimit=65485
|
||
|
RecoilViewRotationScale=0.8
|
||
|
FallingRecoilModifier=1.5
|
||
|
HippedRecoilModifier=1.1 //1.25
|
||
|
QuadFireRecoilModifier=2.0
|
||
|
|
||
|
AssociatedPerkClasses(0)=class'KFPerk_Firebug'
|
||
|
|
||
|
WeaponFireWaveForm=ForceFeedbackWaveform'FX_ForceFeedback_ARCH.Gunfire.Heavy_Recoil_SingleShot'
|
||
|
|
||
|
|
||
|
// Weapon Upgrade stat boosts
|
||
|
//WeaponUpgrades[1]=(IncrementDamage=1.15f,IncrementWeight=1)
|
||
|
|
||
|
WeaponUpgrades[1]=(Stats=((Stat=EWUS_Damage0, Scale=1.15f), (Stat=EWUS_Damage1, Scale=1.15f), (Stat=EWUS_Weight, Add=1)))
|
||
|
|
||
|
SpreadWidthDegrees=7.0f
|
||
|
SpreadWidthDegreesAlt=15.0f
|
||
|
|
||
|
StartingPelletPosition=0.0f
|
||
|
StartingPelletPositionAlt=0.0f
|
||
|
|
||
|
MaxBarrelHeat=5.0f
|
||
|
BarrelHeatPerProjectile=0.089f
|
||
|
BarrelCooldownRate=0.45f
|
||
|
|
||
|
CurrentBarrelHeat=0.0f
|
||
|
LastBarrelHeat=0.0f
|
||
|
|
||
|
NumBloodMapMaterials=3
|
||
|
}
|