class ScrnRPG extends LAW; //Scrn RPG has a more powerful warhead with enhanced ballistic behaviour, a scope is attached by default and altfire toggles attaching and detaching the scope. //altfire plays an anim and changes the bScopeAttached bool value, a notify in the anim performs the changeover when the launcher is offscreen //this bool is also read in BringUp var bool bScopeAttached; var float RaiseAnimRate; //multiplier for Raise anim rate var vector ZoomedViewOffset; //for handling different zoom positions depending on scope attach status var byte ZoomedFOVWithScope; var rotator SightFlipRotation; var() Material ZoomMat; var() Sound ZoomSound; var() int lenseMaterialID; // used since material id's seem to change alot var() float scopePortalFOVHigh; // The FOV to zoom the scope portal by. var() float scopePortalFOV; // The FOV to zoom the scope portal by. // 3d Scope vars var ScriptedTexture ScopeScriptedTexture; // Scripted texture for 3d scopes var Shader ScopeScriptedShader; // The shader that combines the scripted texture with the sight overlay var Material ScriptedTextureFallback;// The texture to render if the users system doesn't support shaders // new scope vars var Combiner ScriptedScopeCombiner; var Combiner ScriptedScopeStatic; //for illuminated reticle var texture TexturedScopeTexture; var bool bInitializedScope; // Set to true when the scope has been initialized var string ZoomMatRef; var string ScriptedTextureFallbackRef; var texture CrosshairTex; var string CrosshairTexRef; //illuminated reticle var texture IllumTex; var string IllumTexRef; var const bool bDebugMode; // flag for whether debug commands can be run replication { reliable if(Role < ROLE_Authority) ServerAttachScope; } static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount) { local ScrnRPG W; super.PreloadAssets(Inv, bSkipRefCount); default.ZoomMat = FinalBlend(DynamicLoadObject(default.ZoomMatRef, class'FinalBlend', true)); default.ScriptedTextureFallback = texture(DynamicLoadObject(default.ScriptedTextureFallbackRef, class'texture', true)); default.CrosshairTex = texture(DynamicLoadObject(default.CrosshairTexRef, class'texture', true)); default.IllumTex = texture(DynamicLoadObject(default.IllumTexRef, class'texture', true)); //illuminated reticle texture W = ScrnRPG(Inv); if ( W != none ) { W.ZoomMat = default.ZoomMat; W.ScriptedTextureFallback = default.ScriptedTextureFallback; W.CrosshairTex = default.CrosshairTex; W.IllumTex = default.IllumTex; } } static function bool UnloadAssets() { if ( super.UnloadAssets() ) { default.ZoomMat = none; default.ScriptedTextureFallback = none; default.CrosshairTex = none; default.IllumTex = none; } return true; } //sets faked fire times so this anim doesn't get interrupted simulated function AltFire(float F) { local PlayerController PC; if( Level.TimeSeconds < FireMode[0].NextFireTime || ClientState != WS_ReadyToFire ) { return; } FireMode[0].NextFireTime = Level.TimeSeconds + 0.70; FireMode[1].NextFireTime = Level.TimeSeconds + 0.70; bScopeAttached = !bScopeAttached; ScrnRPGAttachment(ThirdPersonActor).bScopeAttached = bScopeAttached; ServerAttachScope(bScopeAttached); if (bAimingRifle) { ZoomOut(false); if( Role < ROLE_Authority) { ServerZoomOut(false); } } if ( Level.NetMode != NM_DedicatedServer ) { PlayAnim('ScopeAttach',1.0,0.2); } PC = PlayerController(Instigator.Controller); if ( PC != none ) { if ( !bScopeAttached ) { PC.ReceiveLocalizedMessage(class'ScrnRPGSwitchMessage',0); } else { PC.ReceiveLocalizedMessage(class'ScrnRPGSwitchMessage',1); } } } function ServerAttachScope(bool bAttach) { bScopeAttached = bAttach; ScrnRPGAttachment(ThirdPersonActor).bScopeAttached = bScopeAttached; } //anim notify in 'ScopeAttach' simulated function Notify_UpdateScope() { ApplyScopeStatus(); } simulated function BringUp(optional Weapon PrevWeapon) { super.BringUp(PrevWeapon); ApplyScopeStatus(); if (AmmoAmount(0) <= 0) { HideRocket(); } else { Notify_ShowRocket(); //reload doesn't work } } simulated function ApplyScopeStatus() { if ( Level.NetMode != NM_DedicatedServer ) { if (bScopeAttached) { SetBoneScale(2, 1.0, 'PGO7_optimized'); //show scope ZoomedViewOffset.Y = 0; ZoomedViewOffset.Z = 0.05; PlayerViewOffset.Y = default.PlayerViewOffset.Y - 8.72; PlayerViewOffset.Z = default.PlayerViewOffset.Z - 0.5; PlayerIronSightFOV = default.ZoomedFOVWithScope; ZoomedDisplayFOV = default.ZoomedDisplayFOV; SetBoneRotation( 'frontsight', SightFlipRotation, , 100 ); //flip down sights SetBoneRotation( 'rearsight', -1*SightFlipRotation, , 100 ); //flip down sights } else { bScopeAttached = false; SetBoneScale(2, 0.0, 'PGO7_optimized'); //hide scope //ZoomedViewOffset=(X=0.000000,Y=-8.5500000,Z=-0.50000) //new sight alignment fix ZoomedViewOffset.Y = -8.72; ZoomedViewOffset.Z = -0.5; PlayerViewOffset.Y = default.PlayerViewOffset.Y; PlayerViewOffset.Z = default.PlayerViewOffset.Z; ZoomedDisplayFOV = default.ZoomedDisplayFOV; PlayerIronSightFOV = default.PlayerIronSightFOV; SetBoneRotation( 'frontsight', SightFlipRotation, , 0); //flip up sights SetBoneRotation( 'rearsight', SightFlipRotation, , 0); //flip up sights } } UpdateScopeMode(); } exec function pfov(int thisFOV) { if( !bDebugMode ) return; scopePortalFOV = thisFOV; scopePortalFOVHigh = thisFOV; } exec function zfov(int thisFOV) { if( !bDebugMode ) return; default.ZoomedDisplayFOV = thisFOV; default.ZoomedDisplayFOVHigh = thisFOV; } simulated exec function TexSize(int i, int j) { if( !bDebugMode ) return; ScopeScriptedTexture.SetSize(i, j); } simulated function bool ShouldDrawPortal() { // if(bUsingSights && (IsInState('Idle') || IsInState('PostFiring')) && thisAnim != 'scope_shoot_last') if( bScopeAttached && bAimingRifle ) return true; else return false; } simulated function PostBeginPlay() { super.PostBeginPlay(); // Get new scope detail value from KFWeapon KFScopeDetail = class'KFMod.KFWeapon'.default.KFScopeDetail; bScopeAttached = true; if (bScopeAttached) { UpdateScopeMode(); } } // Handles initializing and swithing between different scope modes simulated function UpdateScopeMode() { if (!bScopeAttached) { ZoomedDisplayFOV = default.ZoomedDisplayFOV; return; } if (Level.NetMode != NM_DedicatedServer && Instigator != none && Instigator.IsLocallyControlled() && Instigator.IsHumanControlled() ) { if( KFScopeDetail == KF_ModelScope) { scopePortalFOV = default.scopePortalFOV; ZoomedDisplayFOV = default.ZoomedFOVWithScope; if( ScopeScriptedTexture == none ) ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; ScopeScriptedTexture.SetSize(512,512); ScopeScriptedTexture.Client = Self; if( ScriptedScopeCombiner == none ) { ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeCombiner.Material1 = CrosshairTex; ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeCombiner.CombineOperation = CO_Multiply; ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; } if( IllumTex != none && ScriptedScopeStatic == none ) { // Construct the Combiner (Self Illumination) ScriptedScopeStatic = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeStatic.Material1 = IllumTex; ScriptedScopeStatic.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeStatic.CombineOperation = CO_Add; ScriptedScopeStatic.AlphaOperation = AO_Use_Mask; ScriptedScopeStatic.Material2 = ScriptedScopeCombiner; } if( ScopeScriptedShader == none ) { ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; if (IllumTex != none) { ScopeScriptedShader.SelfIllumination = ScriptedScopeStatic; } else { ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; } ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; } bInitializedScope = true; } else if( KFScopeDetail == KF_ModelScopeHigh ) { scopePortalFOV = scopePortalFOVHigh; //ZoomedDisplayFOV = default.ZoomedDisplayFOVHigh; ZoomedDisplayFOV = default.ZoomedFOVWithScope; if( ScopeScriptedTexture == none ) ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; ScopeScriptedTexture.SetSize(1024,1024); ScopeScriptedTexture.Client = Self; if( ScriptedScopeCombiner == none ) { ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeCombiner.Material1 = CrosshairTex; ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeCombiner.CombineOperation = CO_Multiply; ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; } if( IllumTex != none && ScriptedScopeStatic == none ) { // Construct the Combiner (Self Illumination) ScriptedScopeStatic = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeStatic.Material1 = IllumTex; ScriptedScopeStatic.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeStatic.CombineOperation = CO_Add; ScriptedScopeStatic.AlphaOperation = AO_Use_Mask; ScriptedScopeStatic.Material2 = ScriptedScopeCombiner; } if( ScopeScriptedShader == none ) { ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; if (IllumTex != none) { ScopeScriptedShader.SelfIllumination = ScriptedScopeStatic; } else { ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; } ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; } bInitializedScope = true; } else if (KFScopeDetail == KF_TextureScope) { ZoomedDisplayFOV = default.ZoomedDisplayFOV; PlayerViewOffset.X = default.PlayerViewOffset.X; bInitializedScope = true; } } } simulated event RenderTexture(ScriptedTexture Tex) { local rotator RollMod; RollMod = Instigator.GetViewRotation(); if(Owner != none && Instigator != none && Tex != none && Tex.Client != none) Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,Owner,(Instigator.Location + Instigator.EyePosition()), RollMod, scopePortalFOV ); } 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; } /** * Handles all the functionality for zooming in including * setting the parameters for the weapon, pawn, and playercontroller * * @param bAnimateTransition whether or not to animate this zoom transition */ simulated function ZoomIn(bool bAnimateTransition) { if( Level.TimeSeconds < FireMode[0].NextFireTime ) { return; } super(BaseKFWeapon).ZoomIn(bAnimateTransition); bAimingRifle = True; if( KFHumanPawn(Instigator)!=None ) KFHumanPawn(Instigator).SetAiming(True); if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { if( AimInSound != none ) { PlayOwnedSound(AimInSound, SLOT_Interact,,,,, false); } } if( bAnimateTransition ) { if( bZoomOutInterrupted ) { PlayAnim('Raise',RaiseAnimRate,0.1); } else { PlayAnim('Raise',RaiseAnimRate,0.1); } } if (!bScopeAttached) { KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV+(KFPlayerController(Instigator.Controller).DefaultFOV-PlayerIronSightFOV)*0.5,ZoomTime); //modified because reasons } } /** * Handles all the functionality for zooming out including * setting the parameters for the weapon, pawn, and playercontroller * * @param bAnimateTransition whether or not to animate this zoom transition */ simulated function ZoomOut(bool bAnimateTransition) { super(BaseKFWeapon).ZoomOut(bAnimateTransition); bAimingRifle = False; if( KFHumanPawn(Instigator)!=None ) KFHumanPawn(Instigator).SetAiming(False); if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { if( AimOutSound != none ) { PlayOwnedSound(AimOutSound, SLOT_Misc,,,,, false); } } //KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); if ( bScopeAttached && KFScopeDetail == KF_TextureScope ) { KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); } else { KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,ZoomTime); } if( Level.TimeSeconds > FireMode[0].NextFireTime ) { TweenAnim(IdleAnim,FastZoomOutTime); } } /** * Called by the native code when the interpolation of the first person weapon from the zoomed position finishes */ simulated event OnZoomOutFinished() { local name anim; local float frame, rate; if ( ClientState == WS_ReadyToFire && !bIsReloading ) { GetAnimParams(0, anim, frame, rate); // Play the regular idle anim when we're finished zooming out if (anim == IdleAimAnim) { PlayIdle(); } } //maybe there should be some fov transition here? } simulated function WeaponTick(float dt) { super(KFWeaponShotgun).WeaponTick(dt); if( !bIsReloading && bAimingRifle && ForceZoomOutTime > 0 && Level.TimeSeconds - ForceZoomOutTime > 0 ) { ForceZoomOutTime = 0; ZoomOut(false); if( Role < ROLE_Authority) ServerZoomOut(false); } } /** * 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(); } } if( bScopeAttached && Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none && KFScopeDetail == KF_TextureScope ) { KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); } } simulated function bool CanZoomNow() { Return (!FireMode[0].bIsFiring && !FireMode[1].bIsFiring && Instigator!=None && Instigator.Physics!=PHYS_Falling); } simulated event RenderOverlays(Canvas Canvas) { local vector DrawOffset; local vector ScopedDrawOffset; local int m; local PlayerController PC; if (Instigator == None) return; PC = PlayerController(Instigator.Controller); if(PC == None) return; if(!bInitializedScope && PC != none ) { UpdateScopeMode(); } Canvas.DrawActor(None, false, true); for (m = 0; m < NUM_FIRE_MODES; m++) { if (FireMode[m] != None) { FireMode[m].DrawMuzzleFlash(Canvas); } } DrawOffset = (90/DisplayFOV * ZoomedViewOffset) >> Instigator.GetViewRotation(); //calculate additional offset SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) + DrawOffset); //add additional offset //SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); SetRotation( Instigator.GetViewRotation() + ZoomRotInterp); PreDrawFPWeapon(); if(bAimingRifle && PC != none && (KFScopeDetail == KF_ModelScope || KFScopeDetail == KF_ModelScopeHigh)) { if (ShouldDrawPortal()) { if ( ScopeScriptedTexture != none ) { Skins[LenseMaterialID] = ScopeScriptedShader; ScopeScriptedTexture.Client = Self; ScopeScriptedTexture.Revision = (ScopeScriptedTexture.Revision +1); } } bDrawingFirstPerson = true; //applies to 3d scope ScopedDrawOffset = (0.9/DisplayFOV * 100 * -ZoomedViewOffset); Canvas.DrawBoundActor(self, false, false,DisplayFOV,PC.Rotation,rot(0,0,0),Instigator.CalcZoomedDrawOffset(self)+ScopedDrawOffset); bDrawingFirstPerson = false; } else if( bScopeAttached && (KFScopeDetail == KF_TextureScope) && PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle) { Skins[LenseMaterialID] = ScriptedTextureFallback; SetZoomBlendColor(Canvas); Canvas.Style = ERenderStyle.STY_Normal; Canvas.SetPos(0, 0); Canvas.DrawTile(ZoomMat, 0.5*(Canvas.SizeX - Canvas.SizeY)+(0.15*Canvas.SizeY), Canvas.SizeY, 0.0, 0.0, 8, 8); //left bar Canvas.SetPos(Canvas.SizeX, 0); Canvas.DrawTile(ZoomMat, -0.5*(Canvas.SizeX - Canvas.SizeY)-(0.15*Canvas.SizeY), Canvas.SizeY, 0.0, 0.0, 8, 8); //right bar Canvas.SetPos(0, 0); Canvas.DrawTile(ZoomMat, Canvas.SizeX, 0.15*Canvas.SizeY, 0.0, 0.0, 8, 8); //top bar Canvas.SetPos(0, Canvas.SizeY); Canvas.DrawTile(ZoomMat, Canvas.SizeX, -0.15*Canvas.SizeY, 0.0, 0.0, 8, 8); //bottom bar Canvas.Style = 255; Canvas.SetPos(0.5*(Canvas.SizeX - Canvas.SizeY)+0.15*(Canvas.SizeY),0.15*(Canvas.SizeY)); //700, 0 Canvas.DrawTile(ZoomMat, Canvas.SizeY * 0.7, Canvas.SizeY * 0.7, 0.0, 0.0, 512, 512); Canvas.Font = Canvas.MedFont; Canvas.SetDrawColor(200,150,0); Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.43); Canvas.DrawText("hello im an rpg scope uguu"); Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.47); } else { Skins[LenseMaterialID] = ScriptedTextureFallback; bDrawingFirstPerson = true; Canvas.DrawActor(self, false, false, DisplayFOV); bDrawingFirstPerson = false; } } simulated function AdjustIngameScope() { local PlayerController PC; if ( Instigator == none || !bHasScope ) return; // Lets avoid having to do multiple casts every tick - Ramm PC = PlayerController(Instigator.Controller); if( PC == none ) return; switch (KFScopeDetail) { case KF_ModelScope: if( bAimingRifle ) DisplayFOV = default.ZoomedDisplayFOV; if ( PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); } } break; case KF_TextureScope: if( bAimingRifle ) DisplayFOV = default.ZoomedDisplayFOV; if ( bAimingRifle && PC.DesiredFOV != PlayerIronSightFOV ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); } } break; case KF_ModelScopeHigh: if( bAimingRifle ) { if( default.ZoomedDisplayFOVHigh > 0 ) DisplayFOV = default.ZoomedDisplayFOVHigh; else DisplayFOV = default.ZoomedDisplayFOV; } if ( bAimingRifle && PC.DesiredFOV == PlayerIronSightFOV ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); } } break; } // Make any chagned to the scope setup UpdateScopeMode(); } simulated event Destroyed() { PreTravelCleanUp(); Super.Destroyed(); } simulated function PreTravelCleanUp() { if (ScopeScriptedTexture != None) { ScopeScriptedTexture.Client = None; Level.ObjectPool.FreeObject(ScopeScriptedTexture); ScopeScriptedTexture=None; } if (ScriptedScopeCombiner != None) { ScriptedScopeCombiner.Material2 = none; Level.ObjectPool.FreeObject(ScriptedScopeCombiner); ScriptedScopeCombiner = none; } if (ScopeScriptedShader != None) { ScopeScriptedShader.Diffuse = none; ScopeScriptedShader.SelfIllumination = none; Level.ObjectPool.FreeObject(ScopeScriptedShader); ScopeScriptedShader = none; } } simulated function ClientWeaponSet(bool bPossiblySwitch) { super.ClientWeaponSet(bPossiblySwitch); UpdateRocket(); } simulated function UpdateRocket() { if ( MagAmmoRemaining >= 1) SetBoneScale (1, 1.0, 'Rocket'); else SetBoneScale (1, 0.0, 'Rocket'); } //copypaste from RPG to set magammoremaining after last round fired or something function ServerStopFire(byte Mode) { super(BaseKFWeapon).ServerStopFire(Mode); if( AmmoAmount(0) <= 0 ) { MagAmmoRemaining = 0; } else { MagAmmoRemaining = 1; } } simulated function AddReloadedAmmo() { super(KFWeapon).AddReloadedAmmo(); } simulated function ClientReload() { super.ClientReload(); ShowRocket(); } //called by fire function, hides rocket so it doesn't tween to outside of screen for reload anim simulated function HideRocket() { if ( Level.NetMode != NM_DedicatedServer ) { SetBoneScale(1, 0.0, 'Rocket'); } } simulated function ShowRocket() { if ( Level.NetMode != NM_DedicatedServer ) { SetBoneScale(1, 1.0, 'Rocket'); } } simulated function Notify_ShowRocket() { ShowRocket(); } defaultproperties { RaiseAnimRate=2.700000 ZoomedFOVWithScope=45 SightFlipRotation=(Pitch=-160) lenseMaterialID=5 scopePortalFOVHigh=15.000000 scopePortalFOV=15.000000 ZoomMatRef="ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_reticle_finalblend" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" CrosshairTexRef="ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_Reticle" IllumTexRef="ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_ReticleIlluminated" bHasScope=True ZoomedDisplayFOVHigh=45.000000 ForceZoomOutOnFireTime=0.300000 ReloadRate=2.750000 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=False Weight=11.000000 StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_trader' MeshRef="ScrnWeaponPack_A.ScrnRPG_1st" SkinRefs(1)="ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_Launcher_cmb" SkinRefs(2)="ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_Rocket_cmb" SkinRefs(3)="ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_PGO7_cmb" SkinRefs(4)="ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_PGO7Eyecup" SkinRefs(5)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" HudImageRef="ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_unselected" SelectedHudImageRef="ScrnWeaponPack_T.ScrnRPG7.ScrnRPG7_selected" PlayerIronSightFOV=65.000000 FireModeClass(0)=Class'ScrnWeaponPack.ScrnRPGFire' Description="RPG-7 Rocket Launcher. Very high damage, but narrow blast radius and rockets drop over distance. Use Altfire to toggle scope." PickupClass=Class'ScrnWeaponPack.ScrnRPGPickup' PlayerViewOffset=(X=10.000000,Y=15.000000,Z=-3.000000) AttachmentClass=Class'ScrnWeaponPack.ScrnRPGAttachment' ItemName="RPG-7 SE" }