class ScrnGUIBuyWeaponInfoPanel extends SRGUIBuyWeaponInfoPanel; var automated GUIImage ScrnLogo, TourneyLogo; var localized string strSecondsPerShot, StrReloadsInDPM, strMeters; var automated GUILabel lblDamage, lblDPS, lblDPM, lblRange, lblMag, lblAmmo; var automated ScrnGUIWeaponBar barDamage, barDPS, barDPM, barRange, barMag, barAmmo; var automated moCheckBox ch_FireMode0, ch_FireMode1; //adds headshot damage display toggle checkbox var automated moCheckBox ch_HSDmgCheck; var bool bHSDamage; var int TopDamage, TopDPM, TopMag, TopAmmo; var float TopDPS, TopRange, TopRadius; var GUIBuyable LastBuyable; function InitComponent(GUIController MyController, GUIComponent MyOwner) { super.InitComponent(MyController, MyOwner); ch_FireMode0.Checked(true); } function ResetValues() { TopDamage = 0; TopDPM = 0; TopMag = 0; TopAmmo = 0; TopDPS = 0; TopRange = 0; TopRadius = 0; } function float GetBarPct(float Value, float MaxValue) { if ( Value == 0 || MaxValue == 0 ) return 0.f; if ( Value ~= MaxValue ) return 1.0; return Sqrt(Value) / Sqrt(MaxValue); } function LoadStats(GUIBuyable NewBuyable, byte FireMode, optional bool bSetTopValuesOnly, optional bool bHSDamage) { local KFPlayerReplicationInfo KFPRI; local class Perk; local class ScrnPerk; local class WF; local class IFClass; local class ProjFireClass; local class ProjClass; local class MeeleeFireClass; local class DamType; local class KFDamType; local int BaseDmg, PerkedValue, Mult, PerkedValueHS; local float FireTime, ReloadTime, dmg, range, ammo, MagTime; local float PerkBonus; local float HSMult, OldHSMult; //headshot multiplier local String s; local int MagCapacity, MagCount, TotalAmmo; // reset values if ( !bSetTopValuesOnly ) { barDamage.Value = 0; barDPS.Value = 0; barDPM.Value = 0; barRange.Value = 0; barMag.Value = 0; barAmmo.Value = 0; } if ( NewBuyable == none ) return; if ( NewBuyable.ItemWeaponClass == none ) return; // todo - show armor % WF = NewBuyable.ItemWeaponClass.default.FireModeClass[FireMode]; if ( WF == none || WF == class'KFMod.NoFire' ) return; KFPRI = KFPlayerReplicationInfo(PlayerOwner().PlayerReplicationInfo); if ( KFPRI != none ) { Perk = KFPlayerReplicationInfo(PlayerOwner().PlayerReplicationInfo).ClientVeteranSkill; ScrnPerk = class(Perk); } // magazine if ( FireMode == 0 ) { MagCapacity = NewBuyable.ItemWeaponClass.default.MagCapacity; if ( MagCapacity > 1 ) { // vanilla perks require weapon instance to be passed (not the class), // so bonuses can be shown only for ScrN perks if ( ScrnPerk != none ) PerkedValue = MagCapacity * ScrnPerk.Static.GetMagCapacityModStatic(KFPRI, NewBuyable.ItemWeaponClass); else PerkedValue = MagCapacity; TopMag = max(TopMag, PerkedValue); if ( !bSetTopValuesOnly ) { barMag.High = TopMag; barMag.Value = PerkedValue; S = string(PerkedValue); barMag.SetHighlight(PerkedValue > MagCapacity); if ( PerkedValue != MagCapacity ) { if ( PerkedValue > MagCapacity ) S @= "("$string(MagCapacity)$"+"$string(PerkedValue-MagCapacity)$")"; else S @= "("$string(MagCapacity)$string(PerkedValue-MagCapacity)$")"; } barMag.Caption = S; } MagCapacity = PerkedValue; //reload ReloadTime = NewBuyable.ItemWeaponClass.default.ReloadRate; if ( ScrnPerk != none ) { PerkBonus = ScrnPerk.Static.GetReloadSpeedModifierStatic(KFPRI, NewBuyable.ItemWeaponClass); ReloadTime /= PerkBonus; barDPM.SetHighlight(PerkBonus > 1.0001); } else { barDPM.SetHighlight(false); } if ( NewBuyable.ItemWeaponClass.default.bHoldToReload ) ReloadTime *= MagCapacity; // per-bullet reload } else { ReloadTime = 0.000001; barDPM.SetHighlight(false); } } // total ammo TotalAmmo = 0; if ( WF.default.AmmoClass != none ) { TotalAmmo = WF.default.AmmoClass.default.MaxAmmo; if ( Perk != none ) PerkedValue = TotalAmmo * Perk.Static.AddExtraAmmoFor(KFPRI, WF.default.AmmoClass); else PerkedValue = TotalAmmo; TopAmmo = max(TopAmmo, PerkedValue); if ( !bSetTopValuesOnly ) { barAmmo.Value = barAmmo.High * GetBarPct(PerkedValue, TopAmmo); S = string(PerkedValue); barAmmo.SetHighlight(PerkedValue > TotalAmmo); if ( PerkedValue != TotalAmmo ) { if ( PerkedValue > TotalAmmo ) S @= "("$string(TotalAmmo)$"+"$string(PerkedValue-TotalAmmo)$")"; else S @= "("$string(TotalAmmo)$string(PerkedValue-TotalAmmo)$")"; } barAmmo.Caption = S; } TotalAmmo = PerkedValue; } IFClass = class(WF); ProjFireClass = class(WF); ProjClass = WF.default.ProjectileClass; MeeleeFireClass = class(WF); // damage if ( IFClass != none ) { BaseDmg = IFClass.default.DamageMax; DamType = IFClass.default.DamageType; KFDamType = class(DamType); HSMult = KFDamType.default.HeadShotDamageMult; //this works for all hitscan weapons Mult = WF.default.AmmoPerFire; //set HSMult to 0 if DamType can't do headshots if (KFDamType.default.bCheckForHeadShots == false) HSMult = 0; } //projectile else if ( ProjFireClass != none && ProjClass != none ) { BaseDmg = ProjClass.default.Damage; DamType = ProjClass.default.MyDamageType; KFDamType = class(DamType); DamType = ProjClass.default.MyDamageType; if (bHSDamage) { //current implementation works with projectiles extended from base classes //unknown projectiles may be handled with if(int(ProjClass.GetPropertyText("HeadShotDamageMult"))>0) //first, set HSMult to 0 so if projectile headshot mult isn't detected there won't be a stupid value displayed HSMult = 0; //a ton of things extend shotgunbullet so handle it first and set it again later //handle shotgun projectiles if ( class(ProjClass) != none ) HSMult = KFDamType.default.HeadShotDamageMult;; //usually 1.1x //The Shotguns actually do 1.65x because of two multipliers, handle them seperately like this // prevent other non-shotgun shotgunbullets from getting 1.65x (Mainly Horzine Tech Cryo dart weapons) if ( class(ProjClass) != none ) HSMult = class(ProjClass).default.HeadShotDamageMult * KFDamType.default.HeadShotDamageMult; //1.1 * 1.5 = 1.65 //quick hack to stop flamethrower from displaying 1.1x headshot damage if ( class(ProjClass) != none ) HSMult = 0; //handle Trenchgun projectiles if ( class(ProjClass) != none ) HSMult = class(ProjClass).default.HeadShotDamageMult * KFDamType.default.HeadShotDamageMult; //handle buzzsaw bow and derived projectiles if ( class(ProjClass) != none ) HSMult = class(ProjClass).default.HeadShotDamageMult; //handle m99 and derived projectiles if ( class(ProjClass) != none ) HSMult = class(ProjClass).default.HeadShotDamageMult; //handle CrossbowArrow and derived projectiles if ( class(ProjClass) != none ) HSMult = class(ProjClass).default.HeadShotDamageMult; //handle M79 projectiles (HS multiplier is in impact damage type) if ( class(ProjClass) != none ) { BaseDmg = class(ProjClass).default.ImpactDamage; DamType = class(ProjClass).default.ImpactDamageType; HSMult = Class(DamType).default.HeadShotDamageMult; } //handle SP grenade projectiles (HS multiplier is in impact damage type) if ( class(ProjClass) != none ) { BaseDmg = class(ProjClass).default.ImpactDamage; DamType = class(ProjClass).default.ImpactDamageType; HSMult = Class(DamType).default.HeadShotDamageMult; } //handle LAW projectiles, but ignore classes that don't use it's impact damage (ZED Guns) if ( class(ProjClass) != none && class(ProjClass) == none && class(ProjClass) == none && class(ProjClass) == none ) { BaseDmg = class(ProjClass).default.ImpactDamage; DamType = class(ProjClass).default.ImpactDamageType; HSMult = Class(DamType).default.HeadShotDamageMult; } //handle the ZED gun projectiles (Uses HS Damage in Damtype) else if ( class(ProjClass) != none || class(ProjClass) != none || class(ProjClass) != none ) { BaseDmg = class(ProjClass).default.Damage; DamType = class(ProjClass).default.MyDamageType; HSMult = Class(DamType).default.HeadShotDamageMult; } //now recast DamType as a KFDamType and check if projclass's MyDamageType does not check for headshots (fix cryo thrower) KFDamType = class(DamType); if (KFDamType.default.bCheckForHeadShots == false) HSMult = 0; } Mult = WF.default.AmmoPerFire * ProjFireClass.default.ProjPerFire; range = ProjClass.default.DamageRadius; TopRadius = max(TopRadius, range); if ( !bSetTopValuesOnly ) { barRange.Value = barRange.High * range/TopRadius; barRange.Caption = string(range/50) @ strMeters; } } //melee else if ( MeeleeFireClass != none ) { BaseDmg = MeeleeFireClass.default.MeleeDamage; DamType = MeeleeFireClass.default.hitDamageClass; KFDamType = class(DamType); HSMult = KFDamType.default.HeadShotDamageMult; Mult = 1; range = MeeleeFireClass.default.weaponRange; TopRange = max(TopRange, range); if ( !bSetTopValuesOnly ) { barRange.Value = barRange.High * range/TopRange; barRange.Caption = string(range/50) @ strMeters; } } KFDamType = class(DamType); if ( KFDamType != none && KFDamType.default.bDealBurningDamage && class(KFDamType) == none ) BaseDmg *= 1.5; // stupid fire damage multiplier in KFMonster.TakeDamage() //handles old non headshot calculations if (!bHSDamage) { if ( BaseDmg > 0 && Perk != none ) PerkedValue = Perk.static.AddDamage(KFPRI, none, KFPawn(PlayerOwner().Pawn), BaseDmg, DamType); else PerkedValue = BaseDmg; //calculation for flares and huskguns if ( class(ProjClass) != none || class(ProjClass) != none ) { dmg = class(ProjClass).default.ImpactDamage; //impact damage //base dmg is burn damage (vanilla base 25) //get bonus burn damage BaseDmg = class(ProjClass).default.Damage; if ( Perk != none ) { BaseDmg += Perk.static.AddDamage(KFPRI, none, KFPawn(PlayerOwner().Pawn), BaseDmg, class(ProjClass).default.MyDamageType); //attempt to fix wrong value BaseDmg *= 0.92; //correction for some unknown reason } PerkedValue = BaseDmg+dmg; //damage is burn damage + impact damage BaseDmg = dmg; //change base dmg to impact damage for display purposes } if ( Mult == 1 ) { s = string(PerkedValue); } else { s = Mult $ "x" $ PerkedValue @ "=" @ PerkedValue*Mult; PerkedValue *= Mult; BaseDmg *= Mult; } } //calculate headshot damage if (bHSDamage ) { //handle hitscan weapons //get perk boosted damage value if ( BaseDmg > 0 && Perk != none ) PerkedValue = Perk.static.AddDamage(KFPRI, none, KFPawn(PlayerOwner().Pawn), BaseDmg, DamType); else PerkedValue = BaseDmg; //get headshot damage OldHSMult = HSMult; //store HSMult HSMult *= Perk.static.GetHeadShotDamMulti(KFPRI, KFPawn(PlayerOwner().Pawn), DamType); //get perk boosted HS multiplier //OldPerkedValue = PerkedValue; //store old perked value PerkedValueHS = PerkedValue * HSMult; //hopefully this affects hitscan stuff only if ( Mult == 1 ) { s = string(PerkedValueHS); } else { //s = Mult $ "x" $ PerkedValueHS @ "=" @ PerkedValueHS*Mult; //all ints s = Mult $ "x("$PerkedValue@"*"@HSMult@") ="@PerkedValueHS*Mult; //all ints PerkedValue *= Mult; BaseDmg *= Mult; } } TopDamage = max(TopDamage, PerkedValue); //sets numbers in info box if ( !bSetTopValuesOnly ) { barDamage.Value = barDamage.High * GetBarPct(PerkedValue, TopDamage); //handle setting highlight if (!bHSDamage) { barDamage.SetHighlight(PerkedValue > BaseDmg); } else { barDamage.SetHighlight(HSMult > OldHSMult || (PerkedValue > BaseDmg)); } if (!bHSDamage && BaseDmg > 0 && Mult == 1) { if ( PerkedValue != BaseDmg ) { if ( PerkedValue > BaseDmg ) S @= "("$string(BaseDmg)$"+"$string(PerkedValue-BaseDmg)$")"; else S @= "("$string(BaseDmg)$string(PerkedValue-BaseDmg)$")"; } barDamage.Caption = S; } else if (HSMult > 0 && BaseDmg > 0 && Mult == 1) { //this is the headshots string display, PerkedDamage is the headshot damage if ( PerkedValue > BaseDmg ) S @= "("$string(BaseDmg)$"+"$string(PerkedValue-BaseDmg)$")*"$string(HSMult)$""; else S @= "("$string(BaseDmg)$")*"$string(HSMult)$""; } if (bHSDamage && HSMult == 0 ) { S @= "(No headshot damage)"; } barDamage.Caption = S; } BaseDmg = PerkedValue; if (!bHSDamage) { //do nothing } else { BaseDmg = PerkedValueHS; //use headshot damage } if ( BaseDmg > 0 ) { // DPS FireTime = WF.default.FireRate; if ( ScrnPerk != none ) { PerkBonus = ScrnPerk.Static.GetFireSpeedModStatic(KFPRI, NewBuyable.ItemWeaponClass); FireTime /= PerkBonus; barDPS.SetHighlight(PerkBonus > 1.0001); } else { barDPS.SetHighlight(false); } dmg = BaseDmg / FireTime; if ( MagCapacity > 1 ) dmg = fmin(dmg, BaseDmg * float(MagCapacity) / WF.default.AmmoPerFire); // in cases when magazine can be shot faster than 1s TopDPS = max(TopDPS, dmg); if ( !bSetTopValuesOnly ) { barDPS.Value = barDPS.High * GetBarPct(dmg, TopDPS); barDPS.Caption = int(dmg) $ "," @ FireTime $ strSecondsPerShot; } // DPM MagCount = 0; if ( MagCapacity <= 1 ) { // no reload = no problem ammo = 60.0 / FireTime; } else { // how long does it takes to shot whole magazine? MagTime = MagCapacity * FireTime / WF.default.AmmoPerFire; if ( MagTime >= 60.0 ) ammo = 60.0 / FireTime; // insane magazine that requires > minute to reload else if ( MagTime + ReloadTime >= 60.0 ) ammo = MagCapacity; else { MagCount = 60.0 / (MagTime + ReloadTime); // how many full magazines we can shoot in a minute? if ( TotalAmmo > 0 ) MagCount = min(MagCount, ceil(float(TotalAmmo) / MagCapacity)); ammo = MagCount * MagCapacity; // how meany bullets we can shoot from last reloaded magazine? ammo += (60.0 - MagCount*(MagTime + ReloadTime)) / FireTime; } } if ( TotalAmmo > 0 ) ammo = min(TotalAmmo / WF.default.AmmoPerFire, ammo); dmg = ammo * BaseDmg; TopDPM = max(TopDPM, dmg); if ( !bSetTopValuesOnly ) { if ( MagCount == 0 ) barDPM.SetHighLight(false); barDPM.Value = barDPS.High * GetBarPct(dmg, TopDPM); S = string(dmg/1000.0) $ "K"; if ( MagCount > 0 ) S $= Repl(StrReloadsInDPM, "%r", MagCount); barDPM.Caption = S; } } else if ( !bSetTopValuesOnly ) { barDPS.Value = 0; barDPM.Value = 0; } } function Display(GUIBuyable NewBuyable) { local ScrnCustomPRI ScrnPRI; // just in case b_power.SetVisibility(false); b_speed.SetVisibility(false); b_range.SetVisibility(false); ItemPower.SetVisibility(false); ItemRange.SetVisibility(false); ItemSpeed.SetVisibility(false); LastBuyable = NewBuyable; if ( NewBuyable != none ) { ItemName.Caption = NewBuyable.ItemName; ItemImage.Image = NewBuyable.ItemImage; ItemImage.SetVisibility(true); ScrnLogo.SetVisibility(false); TourneyLogo.SetVisibility(false); WeightLabel.Caption = Repl(Weight, "%i", int(NewBuyable.ItemWeight)); if ( NewBuyable.bSaleList && !KFPawn(PlayerOwner().Pawn).CanCarry(NewBuyable.ItemWeight) ) { WeightLabel.TextColor.R=192; WeightLabel.TextColor.G=32; WeightLabel.TextColor.B=32; } else { WeightLabel.TextColor.R=175; WeightLabel.TextColor.G=176; WeightLabel.TextColor.B=158; } FavoriteButton.SetVisibility(NewBuyable.bSaleList); bFavorited = (NewBuyable.ItemPickupClass!=None && Class'SRClientSettings'.Static.IsFavorite( NewBuyable.ItemPickupClass )); RefreshFavoriteButton(); OldPickupClass = NewBuyable.ItemPickupClass; ch_FireMode0.SetVisibility(true); ch_FireMode1.SetVisibility(true); LoadStats(NewBuyable, byte(ch_FireMode1.IsChecked()), false, bHSDamage); barDamage.SetVisibility(barDamage.Value > 0); lblDamage.SetVisibility(barDamage.bVisible); barDPS.SetVisibility(barDPS.Value > 0); lblDPS.SetVisibility(barDPS.bVisible); barDPM.SetVisibility(barDPM.Value > 0); lblDPM.SetVisibility(barDPM.bVisible); barRange.SetVisibility(barRange.Value > 0); lblRange.SetVisibility(barRange.bVisible); barMag.SetVisibility(barMag.Value > 0); lblMag.SetVisibility(barMag.bVisible); barAmmo.SetVisibility(barAmmo.Value > 0); lblAmmo.SetVisibility(barAmmo.bVisible); } else { ScrnPRI = class'ScrnCustomPRI'.static.FindMe(PlayerOwner().PlayerReplicationInfo); if ( ScrnPRI != none && ScrnPRI.IsTourneyMember() ) { ItemName.Caption = "Trophy Shop"; TourneyLogo.SetVisibility(true); ScrnLogo.SetVisibility(false); } else { ItemName.Caption = "ScrN Shop"; ScrnLogo.SetVisibility(true); TourneyLogo.SetVisibility(false); } ItemImage.SetVisibility(false); FavoriteButton.SetVisibility(false); FavoriteButton.SetVisibility(false); WeightLabel.Caption = ""; ch_FireMode0.SetVisibility(false); ch_FireMode1.SetVisibility(false); ch_HSDmgCheck.SetVisibility(false); lblDamage.SetVisibility(false); barDamage.SetVisibility(false); lblDPS.SetVisibility(false); barDPS.SetVisibility(false); lblDPM.SetVisibility(false); barDPM.SetVisibility(false); lblRange.SetVisibility(false); barRange.SetVisibility(false); lblMag.SetVisibility(false); barMag.SetVisibility(false); lblAmmo.SetVisibility(false); barAmmo.SetVisibility(false); } } function FireModeChange(GUIComponent Sender) { if ( ch_FireMode1.IsChecked() == ch_FireMode0.IsChecked() ) { if ( Sender == ch_FireMode0 ) ch_FireMode1.Checked(!ch_FireMode0.IsChecked()); else if ( Sender == ch_FireMode1 ) ch_FireMode0.Checked(!ch_FireMode1.IsChecked()); if ( ScrnTab_BuyMenu(MenuOwner) != none ) Display(ScrnTab_BuyMenu(MenuOwner).TheBuyable); else Display(LastBuyable); } } function HSDamageToggle(GUIComponent Sender) { bHSDamage = ch_HSDmgCheck.IsChecked(); if ( ScrnTab_BuyMenu(MenuOwner) != none ) Display(ScrnTab_BuyMenu(MenuOwner).TheBuyable); else Display(LastBuyable); } defaultproperties { Begin Object Class=GUIImage Name=iLogo Image=Texture'ScrnTex.HUD.ScrNBalanceLogo256' ImageColor=(A=64) ImageStyle=ISTY_Scaled WinTop=0.150000 WinLeft=0.150000 WinWidth=0.700000 WinHeight=0.850000 RenderWeight=1.000000 bBoundToParent=True bScaleToParent=True End Object ScrnLogo=GUIImage'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.iLogo' Begin Object Class=GUIImage Name=TSCLogo Image=Texture'ScrnTex.Tourney.TourneyMember' ImageStyle=ISTY_Scaled WinTop=0.150000 WinLeft=0.150000 WinWidth=0.700000 WinHeight=0.850000 RenderWeight=2.000000 bBoundToParent=True bScaleToParent=True bVisible=False End Object TourneyLogo=GUIImage'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.TSCLogo' strSecondsPerShot="s/shot" StrReloadsInDPM=", incl. %r reloads" strMeters="meters" Begin Object Class=GUILabel Name=DamageCap Caption="Damage:" TextColor=(B=158,G=176,R=175) TextFont="UT2SmallFont" VertAlign=TXTA_Center Hint="Weapon actual damage, including perk bonus" WinTop=0.580000 WinLeft=0.050000 WinWidth=0.250000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False End Object lblDamage=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DamageCap' Begin Object Class=GUILabel Name=DPSCap Caption="per second:" TextColor=(B=158,G=176,R=175) TextFont="UT2SmallFont" VertAlign=TXTA_Center Hint="Damage per second" WinTop=0.650000 WinLeft=0.070000 WinWidth=0.230000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False End Object lblDPS=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DPSCap' Begin Object Class=GUILabel Name=DPMCap Caption="per minute:" TextColor=(B=158,G=176,R=175) TextFont="UT2SmallFont" VertAlign=TXTA_Center Hint="Damage per minute, including reloads" WinTop=0.720000 WinLeft=0.070000 WinWidth=0.230000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False End Object lblDPM=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DPMCap' Begin Object Class=GUILabel Name=RangeCap Caption="Range:" TextColor=(B=158,G=176,R=175) TextFont="UT2SmallFont" VertAlign=TXTA_Center Hint="Weapon range (for melee weapons) or blast radius (for explosives and fire)" WinTop=0.790000 WinLeft=0.050000 WinWidth=0.250000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False End Object lblRange=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.RangeCap' Begin Object Class=GUILabel Name=MagCap Caption="Magazine:" TextColor=(B=158,G=176,R=175) TextFont="UT2SmallFont" VertAlign=TXTA_Center Hint="Ammo count in magazine" WinTop=0.860000 WinLeft=0.050000 WinWidth=0.250000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False End Object lblMag=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.MagCap' Begin Object Class=GUILabel Name=AmmoCap Caption="Total Ammo:" TextColor=(B=158,G=176,R=175) TextFont="UT2SmallFont" VertAlign=TXTA_Center Hint="Total amount of ammo that can be carried for this weapon" WinTop=0.930000 WinLeft=0.050000 WinWidth=0.250000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False End Object lblAmmo=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.AmmoCap' Begin Object Class=ScrnGUIWeaponBar Name=DamageBar BorderSize=3.000000 Hint="Weapon damage" WinTop=0.580000 WinLeft=0.300000 WinWidth=0.650000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False OnRendered=DamageBar.InternalOnRendered End Object barDamage=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DamageBar' Begin Object Class=ScrnGUIWeaponBar Name=DPSBar BorderSize=3.000000 Hint="Damage per second or magazine (if able to shoot whole magazine" WinTop=0.650000 WinLeft=0.300000 WinWidth=0.650000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False OnRendered=DPSBar.InternalOnRendered End Object barDPS=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DPSBar' Begin Object Class=ScrnGUIWeaponBar Name=DPMBar BorderSize=3.000000 Hint="Damage per minute, including reloads" WinTop=0.720000 WinLeft=0.300000 WinWidth=0.650000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False OnRendered=DPMBar.InternalOnRendered End Object barDPM=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DPMBar' Begin Object Class=ScrnGUIWeaponBar Name=RangeBar BorderSize=3.000000 Hint="Weapon range (for melee weapons) or blast radius (for explosives and fire)" WinTop=0.790000 WinLeft=0.300000 WinWidth=0.650000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False OnRendered=RangeBar.InternalOnRendered End Object barRange=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.RangeBar' Begin Object Class=ScrnGUIWeaponBar Name=MagBar BorderSize=3.000000 Hint="Ammo count in magazine" WinTop=0.860000 WinLeft=0.300000 WinWidth=0.650000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False OnRendered=MagBar.InternalOnRendered End Object barMag=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.MagBar' Begin Object Class=ScrnGUIWeaponBar Name=AmmoBar BorderSize=3.000000 Hint="Total amount of ammo that can be carried for this weapon" WinTop=0.930000 WinLeft=0.300000 WinWidth=0.650000 WinHeight=0.055000 bBoundToParent=True bScaleToParent=True bVisible=False OnRendered=AmmoBar.InternalOnRendered End Object barAmmo=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.AmmoBar' Begin Object Class=moCheckBox Name=Mode0Check CaptionWidth=0.950000 Caption="Primary Fire" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=Mode0Check.InternalOnCreateComponent IniOption="@Internal" Hint="Show primary fire stats" WinTop=0.500000 WinLeft=0.050000 WinWidth=0.400000 RenderWeight=3.000000 TabOrder=0 bBoundToParent=True bScaleToParent=True bVisible=False OnChange=ScrnGUIBuyWeaponInfoPanel.FireModeChange End Object ch_FireMode0=moCheckBox'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.Mode0Check' Begin Object Class=moCheckBox Name=Mode1Check bFlipped=True CaptionWidth=0.950000 Caption="Secondary Fire" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=Mode1Check.InternalOnCreateComponent IniOption="@Internal" Hint="Show secondary (alternate) fire stats" WinTop=0.500000 WinLeft=0.500000 WinWidth=0.400000 RenderWeight=3.000000 TabOrder=1 bBoundToParent=True bScaleToParent=True bVisible=False OnChange=ScrnGUIBuyWeaponInfoPanel.FireModeChange End Object ch_FireMode1=moCheckBox'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.Mode1Check' Begin Object Class=moCheckBox Name=HSDmgCheck bFlipped=True CaptionWidth=0.950000 ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=Mode1Check.InternalOnCreateComponent IniOption="@Internal" Hint="Toggle headshot damage display" WinTop=0.580000 WinLeft=0.250000 WinWidth=0.400000 RenderWeight=3.000000 TabOrder=2 bBoundToParent=True bScaleToParent=True bVisible=False OnChange=ScrnGUIBuyWeaponInfoPanel.HSDamageToggle End Object ch_HSDmgCheck=moCheckBox'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.HSDmgCheck' Begin Object Class=GUILabel Name=LWeight TextAlign=TXTA_Right TextColor=(B=158,G=176,R=175) TextFont="UT2LargeFont" WinTop=0.110000 WinLeft=0.050000 WinWidth=0.900000 WinHeight=0.100000 RenderWeight=3.000000 bBoundToParent=True bScaleToParent=True bNeverFocus=True End Object WeightLabel=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.LWeight' Begin Object Class=GUIImage Name=IImage ImageStyle=ISTY_Justified WinTop=0.090000 WinLeft=0.200000 WinWidth=0.600000 WinHeight=0.574359 RenderWeight=2.000000 bBoundToParent=True bScaleToParent=True End Object ItemImage=GUIImage'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.IImage' Begin Object Class=GUIImage Name=LWeightBG WinWidth=0.000000 bVisible=False End Object WeightLabelBG=GUIImage'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.LWeightBG' Weight="%i blocks" }