rott/kf_sources/KFMod/Classes/HuskGun.uc
2026-07-14 20:27:09 +07:00

291 lines
7.9 KiB
Ucode

//=============================================================================
// HuskGun
//=============================================================================
// Husk Arm fireball launching gun
//=============================================================================
// Killing Floor Source
// Copyright (C) 2011 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class HuskGun extends KFWeapon;
//=============================================================================
// Functions
//=============================================================================
function float GetAIRating()
{
local AIController B;
B = AIController(Instigator.Controller);
if ( (B == None) || (B.Enemy == None) )
return AIRating;
return (AIRating + 0.0003 * FClamp(1500 - VSize(B.Enemy.Location - Instigator.Location),0,1000));
}
function byte BestMode()
{
return 0;
}
function bool RecommendRangedAttack()
{
return true;
}
//TODO: LONG ranged?
function bool RecommendLongRangedAttack()
{
return true;
}
function float SuggestAttackStyle()
{
return -1.0;
}
simulated function AnimEnd(int channel)
{
if (FireMode[0].bIsFiring)
{
if( bAimingRifle )
{
LoopAnim('ChargeLoop_Iron');
}
else
{
LoopAnim('ChargeLoop');
}
}
else
{
Super.AnimEnd(channel);
}
}
simulated event OnZoomOutFinished()
{
local name anim;
local float frame, rate;
GetAnimParams(0, anim, frame, rate);
if (ClientState == WS_ReadyToFire)
{
// Play the regular idle anim when we're finished zooming out
if (anim == IdleAimAnim)
{
PlayIdle();
}
else if(anim == 'ChargeLoop_Iron')
{
LoopAnim('ChargeLoop');
}
}
}
/**
* Called by the native code when the interpolation of the first person weapon to the zoomed position finishes
*/
simulated event OnZoomInFinished()
{
local name anim;
local float frame, rate;
GetAnimParams(0, anim, frame, rate);
if (ClientState == WS_ReadyToFire)
{
// Play the iron idle anim when we're finished zooming in
if (anim == IdleAnim)
{
PlayIdle();
}
else if( anim == 'ChargeLoop' )
{
LoopAnim('ChargeLoop_Iron');
}
}
}
simulated function bool ConsumeAmmo( int Mode, float Load, optional bool bAmountNeededIsMax )
{
local Inventory Inv;
local bool bOutOfAmmo;
local KFWeapon KFWeap;
if ( Super(Weapon).ConsumeAmmo(Mode, Load, bAmountNeededIsMax) )
{
if ( Load > 0 && (Mode == 0 || bReduceMagAmmoOnSecondaryFire) )
MagAmmoRemaining -= Load;
NetUpdateTime = Level.TimeSeconds - 1;
if ( FireMode[Mode].AmmoPerFire > 0 && InventoryGroup > 0 && !bMeleeWeapon && bConsumesPhysicalAmmo &&
(Ammo[0] == none || FireMode[0] == none || FireMode[0].AmmoPerFire <= 0 || Ammo[0].AmmoAmount < FireMode[0].AmmoPerFire) &&
(Ammo[1] == none || FireMode[1] == none || FireMode[1].AmmoPerFire <= 0 || Ammo[1].AmmoAmount < FireMode[1].AmmoPerFire) )
{
bOutOfAmmo = true;
for ( Inv = Instigator.Inventory; Inv != none; Inv = Inv.Inventory )
{
KFWeap = KFWeapon(Inv);
if ( Inv.InventoryGroup > 0 && KFWeap != none && !KFWeap.bMeleeWeapon && KFWeap.bConsumesPhysicalAmmo &&
((KFWeap.Ammo[0] != none && KFWeap.FireMode[0] != none && KFWeap.FireMode[0].AmmoPerFire > 0 &&KFWeap.Ammo[0].AmmoAmount >= KFWeap.FireMode[0].AmmoPerFire) ||
(KFWeap.Ammo[1] != none && KFWeap.FireMode[1] != none && KFWeap.FireMode[1].AmmoPerFire > 0 && KFWeap.Ammo[1].AmmoAmount >= KFWeap.FireMode[1].AmmoPerFire)) )
{
bOutOfAmmo = false;
break;
}
}
if ( bOutOfAmmo )
{
PlayerController(Instigator.Controller).Speech('AUTO', 3, "");
}
}
return true;
}
return false;
}
// complete cut n' paste job needed, so that it can be modified
// overriding to properly handly giving extra ammo to this weapon
// for the firebug perk
function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned)
{
local bool bJustSpawnedAmmo;
local int addAmount, InitialAmount;
local float AddMultiplier;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
if ( FireMode[m] != None && FireMode[m].AmmoClass != None )
{
Ammo[m] = Ammunition(Instigator.FindInventoryType(FireMode[m].AmmoClass));
bJustSpawnedAmmo = false;
if ( bNoAmmoInstances )
{
if ( (FireMode[m].AmmoClass == None) || ((m != 0) && (FireMode[m].AmmoClass == FireMode[0].AmmoClass)) )
return;
InitialAmount = FireMode[m].AmmoClass.Default.InitialAmount;
if(WP!=none && WP.bThrown==true)
InitialAmount = WP.AmmoAmount[m];
else
{
// Other change - if not thrown, give the gun a full clip
MagAmmoRemaining = MagCapacity;
}
if ( Ammo[m] != None )
{
addamount = InitialAmount + Ammo[m].AmmoAmount;
Ammo[m].Destroy();
}
else
addAmount = InitialAmount;
AddAmmo(addAmount,m);
}
else
{
if ( (Ammo[m] == None) && (FireMode[m].AmmoClass != None) )
{
Ammo[m] = Spawn(FireMode[m].AmmoClass, Instigator);
Instigator.AddInventory(Ammo[m]);
bJustSpawnedAmmo = true;
}
else if ( (m == 0) || (FireMode[m].AmmoClass != FireMode[0].AmmoClass) )
bJustSpawnedAmmo = ( bJustSpawned || ((WP != None) && !WP.bWeaponStay) );
// and here is the modification for instanced ammo actors
if(WP!=none && WP.bThrown==true)
{
addAmount = WP.AmmoAmount[m];
}
else if ( bJustSpawnedAmmo )
{
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
{
AddMultiplier = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.static.AddExtraAmmoFor(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), FireMode[m].AmmoClass);
}
else
{
AddMultiplier = 1.0;
}
if (default.MagCapacity == 0)
addAmount = 0; // prevent division by zero.
else
addAmount = Ammo[m].InitialAmount * (float(MagCapacity) / float(default.MagCapacity)) * AddMultiplier;
}
if ( WP != none && WP.Class == class'BoomstickPickup' && m > 0 )
{
return;
}
Ammo[m].AddAmmo(addAmount);
Ammo[m].GotoState('');
}
}
}
defaultproperties
{
IdleAimAnim=Idle_Iron
SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.HUSKGun_shdr"
SleeveNum=1
Weight=8.000000
MagCapacity=1
ReloadRate=0.010000
FireModeClass(0)=Class'KFMod.HuskGunFire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
SelectSoundRef="KF_HuskGunSnd.Husk_Select"
SelectForce="SwitchToAssaultRifle"
AIRating=0.650000
CurrentRating=0.650000
Description="A fireball cannon ripped from the arm of a dead Husk. Does more damage when charged up."
Priority=180
InventoryGroup=4
GroupOffset=7
PickupClass=Class'KFMod.HuskGunPickup'
PlayerViewOffset=(X=18.000000,Y=20.000000,Z=-6.000000)
BobDamping=6.000000
AttachmentClass=Class'KFMod.HuskGunAttachment'
IconCoords=(X1=253,Y1=146,X2=333,Y2=181)
ItemName="Husk Fireball Launcher"
LightType=LT_None
LightBrightness=0.000000
LightRadius=0.000000
MeshRef="KF_Wep_HuskGun.HuskGun_Trip"
DrawScale=1.000000
AmbientGlow=0
ZoomTime=0.25
FastZoomOutTime=0.2
ZoomInRotation=(Pitch=-910,Yaw=0,Roll=2910)
bHasAimingMode=true
DisplayFOV=65.000000
StandardDisplayFOV=65.0
PlayerIronSightFOV=70
ZoomedDisplayFOV=45
HudImageRef="KillingFloor2HUD.WeaponSelect.Huskgun_unselected"
SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Huskgun"
TraderInfoTexture=texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Huskgun'
bIsTier3Weapon=true
}