//============================================================================= // M14 EBR Battle Rifle Inventory class //============================================================================= class M14EBRBattleRifle extends KFWeapon config(user); var LaserDot Spot; // The first person laser site dot var() float SpotProjectorPullback; // Amount to pull back the laser dot projector from the hit location var bool bLaserActive; // The laser site is active var LaserBeamEffect Beam; // Third person laser beam effect var() class LaserAttachmentClass; // First person laser attachment class var Actor LaserAttachment; // First person laser attachment replication { reliable if(Role < ROLE_Authority) ServerSetLaserActive; } simulated function PostBeginPlay() { super.PostBeginPlay(); if (Role == ROLE_Authority) { if (Beam == None) { Beam = Spawn(class'LaserBeamEffect'); } } } simulated function Destroyed() { if (Spot != None) Spot.Destroy(); if (Beam != None) Beam.Destroy(); if (LaserAttachment != None) LaserAttachment.Destroy(); super.Destroyed(); } simulated function WeaponTick(float dt) { local Vector StartTrace, EndTrace, X,Y,Z; local Vector HitLocation, HitNormal; local Actor Other; local vector MyEndBeamEffect; local coords C; super.WeaponTick(dt); if( Role == ROLE_Authority && Beam != none ) { if( bIsReloading && WeaponAttachment(ThirdPersonActor) != none ) { C = WeaponAttachment(ThirdPersonActor).GetBoneCoords('tip'); X = C.XAxis; Y = C.YAxis; Z = C.ZAxis; } else { GetViewAxes(X,Y,Z); } // the to-hit trace always starts right in front of the eye StartTrace = Instigator.Location + Instigator.EyePosition() + X*Instigator.CollisionRadius; EndTrace = StartTrace + 65535 * X; Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if (Other != None && Other != Instigator && Other.Base != Instigator ) { MyEndBeamEffect = HitLocation; } else { MyEndBeamEffect = EndTrace; } Beam.EndBeamEffect = MyEndBeamEffect; Beam.EffectHitNormal = HitNormal; } } simulated function BringUp(optional Weapon PrevWeapon) { Super.BringUp(PrevWeapon); if (Role == ROLE_Authority) { if (Beam == None) { Beam = Spawn(class'LaserBeamEffect'); } } } simulated function DetachFromPawn(Pawn P) { TurnOffLaser(); Super.DetachFromPawn(P); if (Beam != None) { Beam.Destroy(); } } simulated function bool PutDown() { if (Beam != None) { Beam.Destroy(); } TurnOffLaser(); return super.PutDown(); } // Use alt fire to switch fire modes simulated function AltFire(float F) { if(ReadyToFire(0)) { ToggleLaser(); } } // Toggle the laser on and off simulated function ToggleLaser() { if( Instigator.IsLocallyControlled() ) { if( Role < ROLE_Authority ) { ServerSetLaserActive(!bLaserActive); } bLaserActive = !bLaserActive; if( Beam != none ) { Beam.SetActive(bLaserActive); } if( bLaserActive ) { if ( LaserAttachment == none ) { LaserAttachment = Spawn(LaserAttachmentClass,,,,); AttachToBone(LaserAttachment,'LightBone'); } LaserAttachment.bHidden = false; if (Spot == None) { Spot = Spawn(class'LaserDot', self); } } else { LaserAttachment.bHidden = true; if (Spot != None) { Spot.Destroy(); } } } } simulated function TurnOffLaser() { if( Instigator.IsLocallyControlled() ) { if( Role < ROLE_Authority ) { ServerSetLaserActive(false); } bLaserActive = false; LaserAttachment.bHidden = true; if( Beam != none ) { Beam.SetActive(false); } if (Spot != None) { Spot.Destroy(); } } } // Set the new fire mode on the server function ServerSetLaserActive(bool bNewWaitForRelease) { if( Beam != none ) { Beam.SetActive(bNewWaitForRelease); } if( bNewWaitForRelease ) { bLaserActive = true; if (Spot == None) { Spot = Spawn(class'LaserDot', self); } } else { bLaserActive = false; if (Spot != None) { Spot.Destroy(); } } } simulated event RenderOverlays( Canvas Canvas ) { local int m; local Vector StartTrace, EndTrace; local Vector HitLocation, HitNormal; local Actor Other; local vector X,Y,Z; local coords C; if (Instigator == None) return; if ( Instigator.Controller != None ) Hand = Instigator.Controller.Handedness; if ((Hand < -1.0) || (Hand > 1.0)) return; // draw muzzleflashes/smoke for all fire modes so idle state won't // cause emitters to just disappear for (m = 0; m < NUM_FIRE_MODES; m++) { if (FireMode[m] != None) { FireMode[m].DrawMuzzleFlash(Canvas); } } SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); SetRotation( Instigator.GetViewRotation() + ZoomRotInterp); // Handle drawing the laser beam dot if (Spot != None) { StartTrace = Instigator.Location + Instigator.EyePosition(); GetViewAxes(X, Y, Z); if( bIsReloading && Instigator.IsLocallyControlled() ) { C = GetBoneCoords('LightBone'); X = C.XAxis; Y = C.YAxis; Z = C.ZAxis; } EndTrace = StartTrace + 65535 * X; Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if (Other != None && Other != Instigator && Other.Base != Instigator ) { EndBeamEffect = HitLocation; } else { EndBeamEffect = EndTrace; } Spot.SetLocation(EndBeamEffect - X*SpotProjectorPullback); if( Pawn(Other) != none ) { Spot.SetRotation(Rotator(X)); Spot.SetDrawScale(Spot.default.DrawScale * 0.5); } else if( HitNormal == vect(0,0,0) ) { Spot.SetRotation(Rotator(-X)); Spot.SetDrawScale(Spot.default.DrawScale); } else { Spot.SetRotation(Rotator(-HitNormal)); Spot.SetDrawScale(Spot.default.DrawScale); } } //PreDrawFPWeapon(); // Laurent -- Hook to override things before render (like rotation if using a staticmesh) bDrawingFirstPerson = true; Canvas.DrawActor(self, false, false, DisplayFOV); bDrawingFirstPerson = false; } 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 AddReloadedAmmo() { super.AddReloadedAmmo(); ResetReloadAchievement(); } function ResetReloadAchievement() { local PlayerController PC; local KFSteamStatsAndAchievements KFSteamStats; PC = PlayerController( Instigator.Controller ); if ( PC != none ) { KFSteamStats = KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements); if ( KFSteamStats != none ) { KFSteamStats.OnReloadSPSorM14(); } } } defaultproperties { SkinRefs(0)="KF_Weapons2_Trip_T.Rifle.M14_cmb" SleeveNum=1 WeaponReloadAnim=Reload_M14 IdleAimAnim=Idle_Iron CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" MagCapacity=20 ReloadRate=3.366 ReloadAnim="Reload" ReloadAnimRate=1.000000 Weight=8.000000 bModeZeroCanDryFire=True FireModeClass(0)=Class'KFMod.M14EBRFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectSoundRef="KF_M14EBRSnd.M14EBR_Select" SelectForce="SwitchToAssaultRifle" bShowChargingBar=True Description="An M14 Enhanced Battle Rifle - Semi Auto variant. Equipped with a laser sight." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) Priority=165 InventoryGroup=4 GroupOffset=5 PickupClass=Class'KFMod.M14EBRPickup' PlayerViewOffset=(X=25.000000,Y=17.000000,Z=-8.000000)//(X=18.000000,Y=22.000000,Z=-6.000000) //PlayerViewPivot=(Pitch=400) BobDamping=6.000000 AttachmentClass=Class'KFMod.M14EBRAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M14EBR" MeshRef="KF_Weapons2_Trip.M14_EBR_Trip" DrawScale=1.00000 TransientSoundVolume=1.250000 AmbientGlow=0 AIRating=0.55 CurrentRating=0.55 DisplayFOV=55.000000 StandardDisplayFOV=55.0 PlayerIronSightFOV=60 ZoomTime=0.25 FastZoomOutTime=0.2 ZoomInRotation=(Pitch=-910,Yaw=0,Roll=2910) bHasAimingMode=true ZoomedDisplayFOV=45 HudImageRef="KillingFloor2HUD.WeaponSelect.M14_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M14" TraderInfoTexture=texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M14' SpotProjectorPullback=1.0 LaserAttachmentClass=class'LaserAttachmentFirstPerson' // Achievement Helpers bIsTier3Weapon=true }