Class Ext_TraitWeapons extends Ext_TraitBase abstract; struct FLevelFX { var array< class > LoadoutClasses; }; var array LevelEffects; static function bool MeetsRequirements( byte Lvl, Ext_PerkBase Perk ) { if( Lvl>=3 && (Perk.CurrentLevel<50 || !HasMaxCarry(Perk)) ) return false; return Super.MeetsRequirements(Lvl,Perk); } static final function bool HasMaxCarry( Ext_PerkBase Perk ) { local int i; i = Perk.PerkTraits.Find('TraitType',Class'Ext_TraitCarryCap'); return (i==-1 || Perk.PerkTraits[i].CurrentLevel>=3); } static function string GetPerkDescription() { return Super.GetPerkDescription()$"|- Level 4 requires perk level 50 and level 3 carry capacity trait!"; } static function TraitActivate( Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data ) { Perk.PrimaryWeapon = None; // Give a new primary weapon. } static function TraitDeActivate( Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data ) { Perk.PrimaryWeapon = Perk.Default.PrimaryWeapon; } static function ApplyEffectOn( KFPawn_Human Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data ) { local class IC; local KFInventoryManager M; local Inventory Inv; Level = Min(Level-1,Default.LevelEffects.Length-1); M = KFInventoryManager(Player.InvManager); if( M!=None ) M.bInfiniteWeight = true; foreach Default.LevelEffects[Level].LoadoutClasses(IC) { if( Player.FindInventoryType(IC)==None ) { Inv = Player.CreateInventory(IC,Player.Weapon!=None); if ( KFWeapon(Inv)!=None ) KFWeapon(Inv).bGivenAtStart = true; } } if( M!=None ) M.bInfiniteWeight = false; } static function CancelEffectOn( KFPawn_Human Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data ) { local class IC; local Inventory Inv; if( Level==0 ) return; Level = Min(Level-1,Default.LevelEffects.Length-1); foreach Default.LevelEffects[Level].LoadoutClasses(IC) { Inv = Player.FindInventoryType(IC); if( Inv!=None ) Inv.Destroy(); } } defaultproperties { NumLevels=4 DefLevelCosts(0)=10 DefLevelCosts(1)=15 DefLevelCosts(2)=20 DefLevelCosts(3)=40 LoadPriority=1 // Make sure Carry Cap trait gets loaded first. }