//============================================================================= // M4AssaultRifle //============================================================================= // An M4 Assault Rifle //============================================================================= // Killing Floor Source // Copyright (C) 2011 Tripwire Interactive LLC // - John "Ramm-Jaeger" Gibson //============================================================================= class M4AssaultRifle extends KFWeapon config(user); #exec OBJ LOAD FILE=KillingFloorWeapons.utx #exec OBJ LOAD FILE=KillingFloorHUD.utx #exec OBJ LOAD FILE=Inf_Weapons_Foley.uax var bool bWasClipEmpty; // 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); } } } exec function ReloadMeNow() { bWasClipEmpty = MagAmmoRemaining <= 0; super.ReloadMeNow(); } simulated function ActuallyFinishReloading() { if ( PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none ) { KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnM4Reloaded(bWasClipEmpty); } super.ActuallyFinishReloading(); } defaultproperties { SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.m4_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SleeveNum=2 WeaponReloadAnim=Reload_M4 IdleAimAnim=Idle_Iron CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" MagCapacity=30 ReloadRate=3.6333 ReloadAnim="Reload" ReloadAnimRate=1.000000 Weight=6.000000 bModeZeroCanDryFire=True FireModeClass(0)=Class'KFMod.M4Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectSoundRef="KF_M4RifleSnd.WEP_M4_Foley_Select" SelectForce="SwitchToAssaultRifle" bShowChargingBar=True Description="A compact assault rifle. Can be fired in semi or full auto with good damage and good accuracy." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) Priority=130 InventoryGroup=3 GroupOffset=10 PickupClass=Class'KFMod.M4Pickup' PlayerViewOffset=(X=25.000000,Y=18.000000,Z=-6.000000) //PlayerViewPivot=(Pitch=400) BobDamping=6.000000 AttachmentClass=Class'KFMod.M4Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M4" MeshRef="KF_Wep_M4.M4_Trip" DrawScale=1.00000 TransientSoundVolume=1.250000 AmbientGlow=0 AIRating=0.55 CurrentRating=0.55 DisplayFOV=60.000000 StandardDisplayFOV=60.0 PlayerIronSightFOV=65 ZoomTime=0.25 FastZoomOutTime=0.2 ZoomInRotation=(Pitch=-910,Yaw=0,Roll=2910) bHasAimingMode=true ZoomedDisplayFOV=45 HudImageRef="KillingFloor2HUD.WeaponSelect.M4_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M4" TraderInfoTexture=texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M4' bIsTier2Weapon=true }