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

241 lines
5.5 KiB
Ucode

//=============================================================================
// FNFAL_ACOG_AssaultRifle
//=============================================================================
// FN FAL Assault Rifle with Acog scope Inventory Class
//=============================================================================
// Killing Floor Source
// Copyright (C) 2012 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson and IJC
//=============================================================================
class FNFAL_ACOG_AssaultRifle extends KFWeapon
config(user);
// Use alt fire to switch fire modes
simulated function AltFire(float F)
{
if(ReadyToFire(0))
{
DoToggle();
}
}
function bool RecommendRangedAttack()
{
return true;
}
//TODO: LONG ranged?
function bool RecommendLongRangedAttack()
{
return true;
}
function float SuggestAttackStyle()
{
return -1.0;
}
exec function SwitchModes()
{
DoToggle();
}
function float GetAIRating()
{
local Bot B;
B = Bot(Instigator.Controller);
if ( (B == None) || (B.Enemy == None) )
return AIRating;
return AIRating;
}
function byte BestMode()
{
return 0;
}
simulated function SetZoomBlendColor(Canvas c)
{
local Byte val;
local Color clr;
local Color fog;
clr.R = 255;
clr.G = 255;
clr.B = 255;
clr.A = 255;
if( Instigator.Region.Zone.bDistanceFog )
{
fog = Instigator.Region.Zone.DistanceFogColor;
val = 0;
val = Max( val, fog.R);
val = Max( val, fog.G);
val = Max( val, fog.B);
if( val > 128 )
{
val -= 128;
clr.R -= val;
clr.G -= val;
clr.B -= val;
}
}
c.DrawColor = clr;
}
simulated function bool StartFire(int Mode)
{
if( KFHighROFFire(FireMode[Mode]) == none || FireMode[Mode].bWaitForRelease )
return super.StartFire(Mode);
if( !super.StartFire(Mode) ) // returns false when mag is empty
return false;
if( AmmoAmount(0) <= 0 )
{
return false;
}
AnimStopLooping();
if( !FireMode[Mode].IsInState('FireLoop') && (AmmoAmount(0) > 0) )
{
FireMode[Mode].StartFiring();
return true;
}
else
{
return false;
}
return true;
}
simulated function AnimEnd(int channel)
{
local name anim;
local float frame, rate;
if(!FireMode[0].IsInState('FireLoop'))
{
GetAnimParams(0, anim, frame, rate);
if (ClientState == WS_ReadyToFire)
{
if ((FireMode[0] == None || !FireMode[0].bIsFiring) && (FireMode[1] == None || !FireMode[1].bIsFiring))
{
PlayIdle();
}
}
}
}
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();
}
// Switch looping fire anims if we switched to/from zoomed
else if( FireMode[0].IsInState('FireLoop') && anim == 'Fire_Iron_Loop')
{
LoopAnim('Fire_Loop', FireMode[0].FireLoopAnimRate, FireMode[0].TweenTime);
}
}
}
/**
* 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();
}
// Switch looping fire anims if we switched to/from zoomed
else if( FireMode[0].IsInState('FireLoop') && anim == 'Fire_Loop' )
{
LoopAnim('Fire_Iron_Loop', FireMode[0].FireLoopAnimRate, FireMode[0].TweenTime);
}
}
}
defaultproperties
{
SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.FAL_cmb"
SkinRefs(1)="KF_Weapons5_Scopes_Trip_T.FNFAL.AcogShader"
SleeveNum=2
WeaponReloadAnim=Reload_Fal_Acog
IdleAimAnim=Idle_Iron
CustomCrosshair=11
CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5"
MagCapacity=20
ReloadRate=3.6
ReloadAnim="Reload"
ReloadAnimRate=1.000000
Weight=6.000000
bModeZeroCanDryFire=True
FireModeClass(0)=Class'KFMod.FNFALFire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
SelectSoundRef="KF_FNFALSnd.FNFAL_Select"
SelectForce="SwitchToAssaultRifle"
bShowChargingBar=True
Description="Classic NATO battle rifle. Has a high rate of fire and decent accuracy, with good power."
EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000)
Priority=180
InventoryGroup=4
GroupOffset=12
PickupClass=Class'KFMod.FNFAL_ACOG_Pickup'
PlayerViewOffset=(X=3.000000,Y=15.00000,Z=-6.000000)
BobDamping=6.000000
AttachmentClass=Class'KFMod.FNFAL_ACOG_Attachment'
IconCoords=(X1=245,Y1=39,X2=329,Y2=79)
ItemName="FNFAL ACOG"
MeshRef="KF_Wep_Fal_Acog.FAL_ACOG"
DrawScale=1.0000
TransientSoundVolume=1.250000
AmbientGlow=0
AIRating=0.55
CurrentRating=0.55
DisplayFOV=55.000000
StandardDisplayFOV=55.0//60.0
PlayerIronSightFOV=55.0
ZoomTime=0.25
FastZoomOutTime=0.2
ZoomInRotation=(Pitch=-910,Yaw=0,Roll=2910)
bHasAimingMode=true
ZoomedDisplayFOV=15
HudImageRef="KillingFloor2HUD.WeaponSelect.FNFAL_unselected"
SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.FNFAL"
TraderInfoTexture=texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_FNFAL'
// Achievement Helpers
bIsTier3Weapon=true
}