Class Ext_PerkFieldMedic extends Ext_PerkBase; var float RepairArmorRate,AirborneAgentHealRate; var byte AirborneAgentLevel; var bool bHealingBoost,bHealingDamageBoost,bHealingShield; var byte HealingShield; var const float SelfHealingSurgePct,MaxHealingSpeedBoost,HealingSpeedBoostDuration,MaxHealingDamageBoost,HealingDamageBoostDuration,MaxHealingShield,HealingShieldDuration; var float HealingSpeedBoostPct, HealingDamageBoostPct, HealingShieldPct; var bool bUseToxicDamage,bUseSlug,bUseAirborneAgent; var const class ToxicDmgTypeClass; simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCauser, optional KFPawn_Monster MyKFPM, optional KFPlayerController DamageInstigator, optional class DamageType, optional int HitZoneIdx ) { local float TempDamage; TempDamage = InDamage; if( bUseSlug && WorldInfo.TimeDilation < 1.f && DamageType != none && ClassIsChildOf( DamageType, class'KFDT_Toxic' ) ) TempDamage += InDamage * 100; InDamage = Round(TempDamage); Super.ModifyDamageGiven(InDamage, DamageCauser, MyKFPM, DamageInstigator, DamageType, HitZoneIdx); } simulated function ModifyMagSizeAndNumber( KFWeapon KFW, out int MagazineCapacity, optional array< Class > WeaponPerkClass, optional bool bSecondary=false, optional name WeaponClassname ) { if( MagazineCapacity>2 && (KFW==None ? WeaponPerkClass.Find(BasePerk)>=0 : IsWeaponOnPerk(KFW)) ) // Skip boomstick for this. MagazineCapacity = Min(MagazineCapacity*Modifiers[10], bSecondary ? 150 : 255); } function bool RepairArmor( Pawn HealTarget ) { local KFPawn_Human KFPH; if( RepairArmorRate>0 ) { KFPH = KFPawn_Human(Healtarget); if( KFPH != none && KFPH.Armor < KFPH.MaxArmor ) { KFPH.AddArmor( Round( float(KFPH.MaxArmor) * RepairArmorRate ) ); return true; } } return false; } function bool ModifyHealAmount( out float HealAmount ) { HealAmount*=Modifiers[9]; return (RepairArmorRate>0); } // Di // simulated function ModifyHealerRechargeTime( out float RechargeRate ) // { // super.ModifyHealerRechargeTime(RechargeRate) // RechargeRate /= Clamp(Modifiers[9] * 2, 1.f, 3.f); // } function CheckForAirborneAgent( KFPawn HealTarget, class DamType, int HealAmount ) { if( (AirborneAgentLevel==1 && WorldInfo.TimeDilation<1.f) || AirborneAgentLevel>1 ) GiveMedicAirborneAgentHealth( HealTarget, DamType, HealAmount ); } function GiveMedicAirborneAgentHealth( KFPawn HealTarget, class DamType, int HealAmount ) { local KFPawn KFP; local int RoundedExtraHealAmount; RoundedExtraHealAmount = FCeil( float(HealAmount) * AirborneAgentHealRate ); foreach WorldInfo.Allpawns(class'KFPawn', KFP, HealTarget.Location, 500.f) { if( KFP.IsAliveAndWell() && WorldInfo.GRI.OnSameTeam( HealTarget, KFP ) ) { if ( HealTarget == KFP ) KFP.HealDamage( RoundedExtraHealAmount, PlayerOwner, DamType ); else KFP.HealDamage( RoundedExtraHealAmount + HealAmount, PlayerOwner, DamType ); } } } static function class GetToxicDmgTypeClass() { return default.ToxicDmgTypeClass; } static function int ModifyToxicDmg(int ToxicDamage) { local float TempDamage; TempDamage = float(ToxicDamage) * 1.2; return FCeil( TempDamage ); } function NotifyZedTimeStarted() { local KFPawn_Human HPawn; HPawn = KFPawn_Human(PlayerOwner.Pawn); if( bUseAirborneAgent && HPawn != none && HPawn.IsAliveAndWell() ) HPawn.StartAirBorneAgentEvent(); } simulated function float GetSnarePower( optional class DamageType, optional byte HitZoneIdx ) { if( bUseSlug && WorldInfo.TimeDilation < 1.f && class(DamageType)!=None && class(DamageType).Default.ModifierPerkList.Find(BasePerk)>=0 ) return 100; return 0.f; } function AddDefaultInventory( KFPawn P ) { local int i; i = P.DefaultInventory.Find(class'ExtWeap_Pistol_9mm'); if(i != -1) P.DefaultInventory[i] = class'ExtWeap_Pistol_MedicS'; super.AddDefaultInventory(P); } simulated function bool GetHealingSpeedBoostActive() { return bHealingBoost; } simulated function byte GetHealingSpeedBoost() { return byte(HealingSpeedBoostPct); } simulated function byte GetMaxHealingSpeedBoost() { return MaxHealingSpeedBoost; } simulated function float GetHealingSpeedBoostDuration() { return HealingSpeedBoostDuration; } simulated function bool GetHealingDamageBoostActive() { return bHealingDamageBoost; } simulated function byte GetHealingDamageBoost() { return byte(HealingDamageBoostPct); } simulated function byte GetMaxHealingDamageBoost() { return MaxHealingDamageBoost; } simulated function float GetHealingDamageBoostDuration() { return HealingDamageBoostDuration; } simulated function bool GetHealingShieldActive() { return bHealingShield; } simulated function byte GetHealingShield() { return byte(HealingShieldPct); } simulated function byte GetMaxHealingShield() { return MaxHealingShield; } simulated function float GetHealingShieldDuration() { return HealingShieldDuration; } simulated function float GetSelfHealingSurgePct() { return SelfHealingSurgePct; } defaultproperties { PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Medic' DefTraitList.Remove(class'Ext_TraitMedicPistol') DefTraitList.Add(class'Ext_TraitAirborne') DefTraitList.Add(class'Ext_TraitWPMedic') DefTraitList.Add(class'Ext_TraitAcidicCompound') DefTraitList.Add(class'Ext_TraitMedBoost') DefTraitList.Add(class'Ext_TraitMedDamBoost') DefTraitList.Add(class'Ext_TraitMedShield') DefTraitList.Add(class'Ext_TraitZedative') DefTraitList.Add(class'Ext_TraitAirborneAgent') DefTraitList.Add(class'Ext_TraitArmorRep') BasePerk=class'KFPerk_FieldMedic' HealExpUpNum=3 HealingSpeedBoostPct = 10.0f HealingDamageBoostPct = 5.0f HealingShieldPct = 10.0f ToxicDmgTypeClass=class'KFDT_Toxic_AcidicRounds' SelfHealingSurgePct=0.1f MaxHealingSpeedBoost=30 HealingSpeedBoostDuration=5.f MaxHealingDamageBoost=20 HealingDamageBoostDuration=5.f MaxHealingShield=30 HealingShieldDuration=5.0f DefPerkStats(0)=(MaxValue=70) DefPerkStats(9)=(bHiddenConfig=false) // Heal efficiency DefPerkStats(15)=(bHiddenConfig=false) // Toxic resistance DefPerkStats(16)=(bHiddenConfig=false) // Sonic resistance DefPerkStats(17)=(bHiddenConfig=false) // Fire resistance DefPerkStats(20)=(bHiddenConfig=false) // Heal recharge PrimaryMelee=class'KFWeap_Knife_FieldMedic' PrimaryWeapon=None PerkGrenade=class'KFProj_MedicGrenade' SuperGrenade=class'ExtProj_SUPERMedGrenade' SecondaryWeaponDef=class'ExtWeapDef_MedicPistol' PrimaryWeaponDef=None KnifeWeaponDef=class'KFWeapDef_Knife_Medic' GrenadeWeaponDef=class'KFWeapDef_Grenade_Medic' AutoBuyLoadOutPath=(class'KFWeapDef_MedicSMG', class'KFWeapDef_MedicShotgun', class'KFWeapDef_MedicRifle') }