class ScrnVetSharpshooter extends ScrnVeterancyTypes abstract; static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum) { return StatOther.RHeadshotKillsStat; } //add SC and FP same resistance to M99 as Crossbow static function int AddDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn Instigator, int InDamage, class DmgType) { // v7.57: M99 resistance moved to ScrnM99Bullet if ( class'ScrnBalance'.default.Mut.bHardcore ) return InDamage / 2; return InDamage; } static function float GetHeadShotDamMulti(KFPlayerReplicationInfo KFPRI, KFPawn P, class DmgType) { local float ret; local bool bNoExtraBonus; if ( DmgType == default.DefaultDamageTypeNoBonus ) { ret = 1.0; } else if ( ClassIsChildOf(DmgType, class'DamTypeDualies') && KFPRI.Level.Game.GameDifficulty >= 7.0 ) { ret = 1.40; // limit to 40% max HS damage bonus bNoExtraBonus = true; } else if ( DmgType == default.DefaultDamageType || class(DmgType).default.bSniperWeapon || ClassIsInArray(default.PerkedDamTypes, DmgType) //v3 - custom weapon support ) { ret = 1.0 + 0.10 * GetClientVeteranSkillLevel(KFPRI); } else { ret = 1.0; // Fix for oversight in Balance Round 6(which is the reason for the Round 6 second attempt patch) } if ( !bNoExtraBonus ) { ret *= 1.50; } if ( class'ScrnBalance'.default.Mut.bHardcore ) ret *= 2.0; // to compensate 50% damage reduction in ReduceDamage(); //Log("Headshot multiplier for " $ String(DmgType) $ " is " $ ret); return ret; } static function float ModifyRecoilSpread(KFPlayerReplicationInfo KFPRI, WeaponFire Other, out float Recoil) { // If Gunslinger perk persists, remove bonus from dual pistols. if ( Crossbow(Other.Weapon) != none || Winchester(Other.Weapon) != none || Single(Other.Weapon) != none || Deagle(Other.Weapon) != none || Magnum44Pistol(Other.Weapon) != none || M14EBRBattleRifle(Other.Weapon) != none || M99SniperRifle(Other.Weapon) != none || SPSniperRifle(Other.Weapon) != none || ClassIsInArray(default.PerkedWeapons, Other.Weapon.Class) //v3 - custom weapon support ) { Recoil = 0.25; } else Recoil = 1.0; Return Recoil; } // Modify fire speed static function float GetFireSpeedModStatic(KFPlayerReplicationInfo KFPRI, class Other) { if ( ClassIsChildOf(Other, class'Winchester') || ClassIsChildOf(Other, class'SPSniperRifle') || ClassIsInArray(default.SpecialWeapons, Other) ) { return 1.6; // 60% faster fire rate with LAR and Special Weapons } return 1.0; } static function float GetReloadSpeedModifierStatic(KFPlayerReplicationInfo KFPRI, class Other) { // If Gunslinger perk persists, remove bonus from dual pistols. if ( ClassIsChildOf(Other, class'Winchester') || ClassIsChildOf(Other, class'M14EBRBattleRifle') || ClassIsChildOf(Other, class'Single') || ClassIsChildOf(Other, class'Deagle') || ClassIsChildOf(Other, class'Magnum44Pistol') || ClassIsChildOf(Other, class'MK23Pistol') || ClassIsChildOf(Other, class'SPSniperRifle') || ClassIsInArray(default.PerkedWeapons, Other) //v3 - custom weapon support ) { return 1.6; // 60% faster reload with Pistols and Sniper Weapons } return 1.0; } // Change the cost of particular items static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class Item) { //reduced base price, so no discount on magnums if ( Item == class'ScrnBalanceSrv.ScrnMagnum44Pickup' || Item == class'ScrnBalanceSrv.ScrnDual44MagnumPickup' ) return 1.0; //leave discount for Dual Pistols even if Gunslinger perk persists to reject possible //buy-sell exploits if ( ClassIsChildOf(Item, class'DeaglePickup') || ClassIsChildOf(Item, class'DualDeaglePickup') || ClassIsChildOf(Item, class'MK23Pickup') || ClassIsChildOf(Item, class'DualMK23Pickup') || Item == class'Magnum44Pickup' || Item == class'Dual44MagnumPickup' || ClassIsChildOf(Item, class'M14EBRPickup') || ClassIsChildOf(Item, class'M99Pickup') || ClassIsChildOf(Item, class'SPSniperPickup') || ClassIsChildOf(Item, class'CrossbowPickup') // Add discount on Crossbow (c) PooSH, 2012 || ClassIsInArray(default.PerkedPickups, Item) //v3 - custom weapon support ) { // 30% base discount + 5% extra per level return fmax(0.10, 0.70 - 0.05 * GetClientVeteranSkillLevel(KFPRI)); } return 1.0; } static function float AddExtraAmmoFor(KFPlayerReplicationInfo KFPRI, Class AmmoType) { if ( GetClientVeteranSkillLevel(KFPRI) > 6 ) { if ( ClassIsChildOf(AmmoType, class'CrossbowAmmo') || ClassIsChildOf(AmmoType, class'M99Ammo') || ClassIsChildOf(AmmoType, class'SPSniperAmmo') || ClassIsChildOf(AmmoType, class'WinchesterAmmo') || ClassIsChildOf(AmmoType, class'M14EBRAmmo') || ClassIsChildOf(AmmoType, class'SingleAmmo') || ClassIsChildOf(AmmoType, class'Magnum44Ammo') || ClassIsChildOf(AmmoType, class'MK23Ammo') || ClassIsChildOf(AmmoType, class'DeagleAmmo') || ClassIsInArray(default.PerkedAmmo, AmmoType) ) return 1.0 + 0.10 * float(GetClientVeteranSkillLevel(KFPRI)-6); // +10% per level above 6 } return 1.0; } static function float GetAmmoCostScaling(KFPlayerReplicationInfo KFPRI, class Item) { if ( ClassIsChildOf(Item, class'CrossbowPickup') || ClassIsChildOf(Item, class'M99Pickup') ) { return 1.0 - fmin(0.7, (0.07 * GetClientVeteranSkillLevel(KFPRI))); // Up to 42% discount on Crossbow Bolts(Added in Balance Round 4 at 30%, increased to 42% in Balance Round 7) } return 1.0; } static function string GetCustomLevelInfo( byte Level ) { local string S; S = Default.CustomLevelInfo; ReplaceText(S,"%L",string(Level)); ReplaceText(S,"%x",GetPercentStr(0.15*Level)); ReplaceText(S,"%$",GetPercentStr(fmin(0.90, 0.30 + 0.05*Level))); ReplaceText(S,"%d",GetPercentStr(fmin(0.70, 0.07*Level))); return S; } defaultproperties { progressArray0(0)=10 progressArray0(1)=30 progressArray0(2)=100 progressArray0(3)=775 progressArray0(4)=2500 progressArray0(5)=5500 progressArray0(6)=8500 DefaultDamageType=Class'ScrnBalanceSrv.ScrnDamTypeSniper' DefaultDamageTypeNoBonus=Class'ScrnBalanceSrv.ScrnDamTypeSniperBase' OnHUDIcons(0)=(PerkIcon=Texture'ScrnTex.Perks.Perk_SharpShooter_Gray',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Gray',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(1)=(PerkIcon=Texture'ScrnTex.Perks.Perk_SharpShooter_Gold',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_SharpShooter_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_SharpShooter_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_SharpShooter_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_SharpShooter_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(6)=(PerkIcon=Texture'ScrnTex.Perks.Perk_SharpShooter_Blood',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blood',DrawColor=(B=255,G=255,R=255,A=255)) SamePerkAch="OP_Sharpshooter" SkillInfo="PERK SKILLS:|50% headshot damage with any weapon|75% less recoil with Single Pistols/Sniper Rifles|60% faster reload with Single Pistols/Sniper Rifles" CustomLevelInfo="PERK BONUSES (LEVEL %L):|+%x extra headshot damage with Pistols/Sniper Rifles|%$ discount on Pistols/Sniper Rifles|%d discount on Crossbow/M99 ammo" PerkIndex=2 OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_SharpShooter' OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_SharpShooter_Gold' VeterancyName="Sharpshooter" Requirements(0)="Get %x headshot kills with Pistols/LAR/M14/Crossbow/M99" }