From d5aa118c32ed3514a3580f320cdd48d9941c012a Mon Sep 17 00:00:00 2001 From: GenZmeY Date: Fri, 26 Jun 2020 07:52:58 +0300 Subject: [PATCH 01/13] feat: skip trader button --- ServerExt/Classes/UI_MidGameMenu.uc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ServerExt/Classes/UI_MidGameMenu.uc b/ServerExt/Classes/UI_MidGameMenu.uc index 5fdbb45..584e853 100644 --- a/ServerExt/Classes/UI_MidGameMenu.uc +++ b/ServerExt/Classes/UI_MidGameMenu.uc @@ -23,10 +23,11 @@ function InitMenu() Super(KFGUI_Page).InitMenu(); AddMenuButton('Mapvote',"Map Vote","Show mapvote menu"); AddMenuButton('Settings',"Settings","Enter the game settings"); + AddMenuButton('SkipTrader',"Skip Trader","start voting for skip trader"); AddMenuButton('Disconnect',"Disconnect","Disconnect from this server"); SpectateButton = AddMenuButton('Spectate',"",""); AddMenuButton('Close',"Close","Close this menu"); - //AddMenuButton('Exit',"Exit","Exit this game"); + AddMenuButton('Exit',"Exit","Exit this game"); for( i=0; i Date: Tue, 30 Jun 2020 10:43:48 +0300 Subject: [PATCH 02/13] fix: Rack 'em up combo add upper limit for combos and decrease combo points over time --- ServerExt/Classes/Ext_PerkRhythmPerkBase.uc | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc b/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc index 6d6c900..3b6f55b 100644 --- a/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc +++ b/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc @@ -2,6 +2,7 @@ Class Ext_PerkRhythmPerkBase extends Ext_PerkBase; var byte HeadShotComboCount,MaxRhythmCombo,MissComboCount; var float RhythmComboDmg; +var private const float HeadShotCountdownIntervall; simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCauser, optional KFPawn_Monster MyKFPM, optional KFPlayerController DamageInstigator, optional class DamageType, optional int HitZoneIdx ) { @@ -23,13 +24,28 @@ final function ResetRhythm() HeadShotMessage(0,true,1); } +function SubstractHeadShotCombo() +{ + if( HeadShotComboCount > 0 ) + { + --HeadShotComboCount; + HeadShotMessage( HeadShotComboCount, true, MaxRhythmCombo ); + } + else if( HeadShotComboCount <= 0 ) + { + ClearTimer( nameOf( SubstractHeadShotCombo ) ); + } +} + final function UpdateDmgScale( bool bUp ) { if( bUp ) { MissComboCount = 0; - HeadShotComboCount = Min(HeadShotComboCount+1,255); + if (HeadShotComboCount < MaxRhythmCombo) + HeadShotComboCount = Min(HeadShotComboCount+1,255); HeadShotMessage(HeadShotComboCount,false,MaxRhythmCombo); + SetTimer( HeadShotCountdownIntervall, true, nameOf( SubstractHeadShotCombo ) ); } else if( HeadShotComboCount>0 && ++MissComboCount==3 ) { @@ -40,6 +56,7 @@ final function UpdateDmgScale( bool bUp ) else return; RhythmComboDmg = FMin(HeadShotComboCount,MaxRhythmCombo)*0.075; } + function UpdatePerkHeadShots( ImpactInfo Impact, class DamageType, int NumHit ) { local int HitZoneIdx; @@ -110,4 +127,5 @@ reliable client function HeadShotMessage( byte HeadShotNum, bool bMissed, byte M defaultproperties { + HeadShotCountdownIntervall=2.f } \ No newline at end of file From bc1c59448d998fcd45448b1f4708685481629f29 Mon Sep 17 00:00:00 2001 From: GenZmeY Date: Tue, 30 Jun 2020 14:22:26 +0300 Subject: [PATCH 03/13] skip trader button is active only on trader time --- ServerExt/Classes/UI_MidGameMenu.uc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/ServerExt/Classes/UI_MidGameMenu.uc b/ServerExt/Classes/UI_MidGameMenu.uc index 584e853..2523a29 100644 --- a/ServerExt/Classes/UI_MidGameMenu.uc +++ b/ServerExt/Classes/UI_MidGameMenu.uc @@ -8,7 +8,7 @@ struct FPageInfo var KFGUI_SwitchMenuBar PageSwitcher; var() array Pages; -var KFGUI_Button AdminButton,SpectateButton; +var KFGUI_Button AdminButton,SpectateButton,SkipTraderButton; var transient KFGUI_Button PrevButton; var transient int NumButtons,NumButtonRows; @@ -23,7 +23,7 @@ function InitMenu() Super(KFGUI_Page).InitMenu(); AddMenuButton('Mapvote',"Map Vote","Show mapvote menu"); AddMenuButton('Settings',"Settings","Enter the game settings"); - AddMenuButton('SkipTrader',"Skip Trader","start voting for skip trader"); + SkipTraderButton = AddMenuButton('SkipTrader',"Skip Trader","start voting for skip trader"); AddMenuButton('Disconnect',"Disconnect","Disconnect from this server"); SpectateButton = AddMenuButton('Spectate',"",""); AddMenuButton('Close',"Close","Close this menu"); @@ -45,6 +45,7 @@ function Timer() if( PRI==None ) return; AdminButton.SetDisabled(!PRI.bAdmin && PRI.WorldInfo.NetMode==NM_Client); + SkipTraderButton.SetDisabled(!SkipTraderIsAviable(PRI)); if( !bInitSpectate || bOldSpectate!=PRI.bOnlySpectator ) { bInitSpectate = true; @@ -54,10 +55,24 @@ function Timer() } } +function bool SkipTraderIsAviable(PlayerReplicationInfo PRI) +{ + local KFGameReplicationInfo KFGRI; + local KFPlayerReplicationInfo KFPRI; + + KFPRI = KFPlayerReplicationInfo(PRI); + if (KFPRI == none) + return false; + + KFGRI = KFGameReplicationInfo(KFPRI.WorldInfo.GRI); + return (KFGRI.bMatchHasBegun && KFGRI.bTraderIsOpen && KFPRI.bHasSpawnedIn); +} + function ShowMenu() { Super.ShowMenu(); AdminButton.SetDisabled(true); + SkipTraderButton.SetDisabled(false); if( GetPlayer().WorldInfo.GRI!=None ) WindowTitle = GetPlayer().WorldInfo.GRI.ServerName; //KFGFxHudWrapper(GetPlayer().MyHUD).SetVisible(false); From 906e321320fe22eb731922686af7d46c5bd0bf9c Mon Sep 17 00:00:00 2001 From: GenZmeY Date: Tue, 30 Jun 2020 15:53:29 +0300 Subject: [PATCH 04/13] disable button after use --- ServerExt/Classes/UI_MidGameMenu.uc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ServerExt/Classes/UI_MidGameMenu.uc b/ServerExt/Classes/UI_MidGameMenu.uc index 2523a29..6c0266a 100644 --- a/ServerExt/Classes/UI_MidGameMenu.uc +++ b/ServerExt/Classes/UI_MidGameMenu.uc @@ -12,7 +12,7 @@ var KFGUI_Button AdminButton,SpectateButton,SkipTraderButton; var transient KFGUI_Button PrevButton; var transient int NumButtons,NumButtonRows; -var transient bool bInitSpectate,bOldSpectate; +var transient bool bInitSpectate,bOldSpectate,bInitSkipTrader; function InitMenu() { @@ -65,7 +65,15 @@ function bool SkipTraderIsAviable(PlayerReplicationInfo PRI) return false; KFGRI = KFGameReplicationInfo(KFPRI.WorldInfo.GRI); - return (KFGRI.bMatchHasBegun && KFGRI.bTraderIsOpen && KFPRI.bHasSpawnedIn); + if (KFGRI.bMatchHasBegun && KFGRI.bTraderIsOpen && KFPRI.bHasSpawnedIn) + { + return !bInitSkipTrader; + } + else + { + bInitSkipTrader=false; + return false; + } } function ShowMenu() @@ -112,6 +120,8 @@ function ButtonClicked( KFGUI_Button Sender ) break; case 'SkipTrader': KFPlayerController(GetPlayer()).RequestSkipTrader(); + bInitSkipTrader=true; + SkipTraderButton.SetDisabled(true); break; } } @@ -158,6 +168,8 @@ defaultproperties XSize=0.8 YSize=0.8 + bInitSkipTrader=false + Pages.Add((PageClass=Class'UIP_News',Caption="News",Hint="Server news page")) Pages.Add((PageClass=Class'UIP_PerkSelection',Caption="Perk",Hint="Select and upgrade your perks")) Pages.Add((PageClass=Class'UIP_Settings',Caption="Settings",Hint="Show additional ServerExt settings")) From 7458785d7a6ab6047da2731a3ac3d18eb7010f49 Mon Sep 17 00:00:00 2001 From: GenZmeY Date: Tue, 30 Jun 2020 16:04:55 +0300 Subject: [PATCH 05/13] button reorder --- ServerExt/Classes/UI_MidGameMenu.uc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ServerExt/Classes/UI_MidGameMenu.uc b/ServerExt/Classes/UI_MidGameMenu.uc index 6c0266a..9801d95 100644 --- a/ServerExt/Classes/UI_MidGameMenu.uc +++ b/ServerExt/Classes/UI_MidGameMenu.uc @@ -24,9 +24,9 @@ function InitMenu() AddMenuButton('Mapvote',"Map Vote","Show mapvote menu"); AddMenuButton('Settings',"Settings","Enter the game settings"); SkipTraderButton = AddMenuButton('SkipTrader',"Skip Trader","start voting for skip trader"); - AddMenuButton('Disconnect',"Disconnect","Disconnect from this server"); SpectateButton = AddMenuButton('Spectate',"",""); AddMenuButton('Close',"Close","Close this menu"); + AddMenuButton('Disconnect',"Disconnect","Disconnect from this server"); AddMenuButton('Exit',"Exit","Exit this game"); for( i=0; i Date: Mon, 6 Jul 2020 19:28:35 +0300 Subject: [PATCH 06/13] Added medic pistol as default weapon of Medic Perk + disabled bugged code from ServerExtMut --- ServerExt/Classes/Ext_PerkFieldMedic.uc | 14 +++++++--- ServerExtMut/Classes/ServerExtMut.uc | 35 +++++++++++++++---------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/ServerExt/Classes/Ext_PerkFieldMedic.uc b/ServerExt/Classes/Ext_PerkFieldMedic.uc index 177711e..582d0dc 100644 --- a/ServerExt/Classes/Ext_PerkFieldMedic.uc +++ b/ServerExt/Classes/Ext_PerkFieldMedic.uc @@ -112,6 +112,13 @@ simulated function float GetSnarePower( optional class DamageType, o return 0.f; } +function AddDefaultInventory( KFPawn P ) +{ + P.DefaultInventory.RemoveItem(class'ExtWeap_Pistol_9mm'); + P.DefaultInventory.AddItem(class'ExtWeap_Pistol_MedicS'); + super.AddDefaultInventory(P); +} + simulated function bool GetHealingSpeedBoostActive() { return bHealingBoost; @@ -206,13 +213,14 @@ defaultproperties DefPerkStats(17)=(bHiddenConfig=false) // Fire resistance PrimaryMelee=class'KFWeap_Knife_FieldMedic' - PrimaryWeapon=class'KFWeap_Pistol_Medic' + PrimaryWeapon=None PerkGrenade=class'KFProj_MedicGrenade' SuperGrenade=class'ExtProj_SUPERMedGrenade' + SecondaryWeaponDef=class'ExtWeapDef_MedicPistol' - PrimaryWeaponDef=class'KFWeapDef_MedicPistol' + PrimaryWeaponDef=None KnifeWeaponDef=class'KFWeapDef_Knife_Medic' GrenadeWeaponDef=class'KFWeapDef_Grenade_Medic' - AutoBuyLoadOutPath=(class'KFWeapDef_MedicPistol', class'KFWeapDef_MedicSMG', class'KFWeapDef_MedicShotgun', class'KFWeapDef_MedicRifle') + AutoBuyLoadOutPath=(class'KFWeapDef_MedicSMG', class'KFWeapDef_MedicShotgun', class'KFWeapDef_MedicRifle') } \ No newline at end of file diff --git a/ServerExtMut/Classes/ServerExtMut.uc b/ServerExtMut/Classes/ServerExtMut.uc index 727ae1c..fb34fe7 100644 --- a/ServerExtMut/Classes/ServerExtMut.uc +++ b/ServerExtMut/Classes/ServerExtMut.uc @@ -66,7 +66,6 @@ function PostBeginPlay() local Object O; local string S; local bool bLock; - local KFPickupFactory_Item ItemFactory; Super.PostBeginPlay(); if( WorldInfo.Game.BaseMutator==None ) @@ -243,21 +242,29 @@ function PostBeginPlay() if( bDumpXMLStats ) FileOutput = Spawn(class'ExtXMLOutput'); - // Disable 9mm and medpistol in all PickupFactories - foreach AllActors(class'KFPickupFactory_Item', ItemFactory) - { - for(i=0;i Date: Mon, 6 Jul 2020 20:45:02 +0300 Subject: [PATCH 07/13] Sharpshooter and perkstat changes + small fix Medic Pistol is default weapon in hands for MedicPerk now Added Head Damage for Sharpshooter by default Removed Rack'em Up for Sharpshooter by default Now perk-stat menu shows maxvalue of stats --- ServerExt/Classes/Ext_PerkBase.uc | 11 ++++++++++- ServerExt/Classes/Ext_PerkFieldMedic.uc | 6 ++++-- ServerExt/Classes/Ext_PerkSharpshooter.uc | 3 ++- ServerExt/Classes/UIR_PerkStat.uc | 20 ++++++++++++++++---- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/ServerExt/Classes/Ext_PerkBase.uc b/ServerExt/Classes/Ext_PerkBase.uc index ebdfdfd..d979b8a 100644 --- a/ServerExt/Classes/Ext_PerkBase.uc +++ b/ServerExt/Classes/Ext_PerkBase.uc @@ -1143,6 +1143,9 @@ simulated function float ApplyEffect( name Type, float Value, float Progress ) case 'AllDmg': Modifiers[18] = 1.f / (1.f+Value*Progress); break; + case 'HeadDamage': + Modifiers[19] = Value*Progress; + break; } return (Value*Progress); } @@ -1150,7 +1153,12 @@ simulated function float ApplyEffect( name Type, float Value, float Progress ) simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCauser, optional KFPawn_Monster MyKFPM, optional KFPlayerController DamageInstigator, optional class DamageType, optional int HitZoneIdx ) { if( BasePerk==None || (DamageType!=None && DamageType.Default.ModifierPerkList.Find(BasePerk)>=0) || (KFWeapon(DamageCauser)!=None && IsWeaponOnPerk(KFWeapon(DamageCauser))) ) - InDamage *= Modifiers[1]; + { + if(HitZoneIdx == 0) + InDamage *= (Modifiers[1] + Modifiers[19]); + else + InDamage *= Modifiers[1]; + } else if( DamageType==None || DamageType.Name!='KFDT_SuicideExplosive' ) InDamage *= Modifiers[12]; } @@ -1430,6 +1438,7 @@ defaultproperties DefPerkStats(16)=(MaxValue=1000,CostPerValue=1,StatType="SonicDmg",UIName="Sonic Resistance (+&%)",Progress=1.5,bHiddenConfig=true) DefPerkStats(17)=(MaxValue=1000,CostPerValue=1,StatType="FireDmg",UIName="Fire Resistance (+&%)",Progress=1.5,bHiddenConfig=true) DefPerkStats(18)=(MaxValue=500,CostPerValue=1,StatType="AllDmg",UIName="Zed Damage Reduction (+&%)",Progress=0.25) + DefPerkStats(19)=(MaxValue=500,CostPerValue=1,StatType="HeadDamage",UIName="Perk Head Damage (+&%)",Progress=1,bHiddenConfig=true) Modifiers.Add(1.f) Modifiers.Add(1.f) diff --git a/ServerExt/Classes/Ext_PerkFieldMedic.uc b/ServerExt/Classes/Ext_PerkFieldMedic.uc index 582d0dc..c3c448a 100644 --- a/ServerExt/Classes/Ext_PerkFieldMedic.uc +++ b/ServerExt/Classes/Ext_PerkFieldMedic.uc @@ -114,8 +114,10 @@ simulated function float GetSnarePower( optional class DamageType, o function AddDefaultInventory( KFPawn P ) { - P.DefaultInventory.RemoveItem(class'ExtWeap_Pistol_9mm'); - P.DefaultInventory.AddItem(class'ExtWeap_Pistol_MedicS'); + local int i; + i = P.DefaultInventory.Find(class'ExtWeap_Pistol_9mm'); + if(i != -1) + P.DefaultInventory[i] = class'ExtWeap_Pistol_MedicS'; super.AddDefaultInventory(P); } diff --git a/ServerExt/Classes/Ext_PerkSharpshooter.uc b/ServerExt/Classes/Ext_PerkSharpshooter.uc index 21f91ff..bd8eca0 100644 --- a/ServerExt/Classes/Ext_PerkSharpshooter.uc +++ b/ServerExt/Classes/Ext_PerkSharpshooter.uc @@ -28,11 +28,12 @@ defaultproperties PerkName="Sharpshooter" PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Sharpshooter' DefTraitList.Add(class'Ext_TraitWPSharp') - DefTraitList.Add(class'Ext_TraitRackEmUp') DefTraitList.Add(class'Ext_TraitRanger') DefTraitList.Add(class'Ext_TraitDireReload') DefTraitList.Add(class'Ext_TraitEliteReload') BasePerk=class'KFPerk_Sharpshooter' + DefPerkStats(1)=(Progress=0.25) + DefPerkStats(19)=(bHiddenConfig=false) PrimaryMelee=class'KFWeap_Knife_Sharpshooter' PrimaryWeapon=class'KFWeap_Rifle_Winchester1894' diff --git a/ServerExt/Classes/UIR_PerkStat.uc b/ServerExt/Classes/UIR_PerkStat.uc index 6cd12e7..6ae594e 100644 --- a/ServerExt/Classes/UIR_PerkStat.uc +++ b/ServerExt/Classes/UIR_PerkStat.uc @@ -5,7 +5,7 @@ var KFGUI_NumericBox StatCountBox; var KFGUI_Button AddButton; var Ext_PerkBase MyPerk; -var int StatIndex,OldValue,CurrentCost; +var int StatIndex,OldValue,CurrentCost,MaxStatValue; var string ProgressStr; var bool bCostDirty; @@ -42,7 +42,10 @@ function Timer() { bCostDirty = false; OldValue = MyPerk.PerkStats[StatIndex].CurrentValue; - InfoText.SetText(MyPerk.GetStatUIStr(StatIndex)$" ["$OldValue$", Cost "$CurrentCost$", "$ProgressStr$"%]:"); + if(CurrentCost != 0) + InfoText.SetText(MyPerk.GetStatUIStr(StatIndex)$" ["$OldValue$"/"$MaxStatValue$", Cost "$CurrentCost$", "$ProgressStr$"%]:"); + else + InfoText.SetText(MyPerk.GetStatUIStr(StatIndex)$" ["$OldValue$"/"$MaxStatValue$", "$ProgressStr$"%]:"); } } function BuyStatPoint( KFGUI_Button Sender ) @@ -51,8 +54,13 @@ function BuyStatPoint( KFGUI_Button Sender ) } function EditBoxChange( KFGUI_EditBox Sender ) { - CurrentCost = StatCountBox.GetValueInt()*MyPerk.PerkStats[StatIndex].CostPerValue; + if(MyPerk.PerkStats[StatIndex].CostPerValue > 1) + CurrentCost = StatCountBox.GetValueInt()*MyPerk.PerkStats[StatIndex].CostPerValue; + else + CurrentCost = 0; + MaxStatValue = MyPerk.PerkStats[StatIndex].MaxValue; ProgressStr = ChopExtraDigits(MyPerk.PerkStats[StatIndex].Progress * StatCountBox.GetValueInt()); + MaxStatValue = MyPerk.PerkStats[StatIndex].MaxValue; bCostDirty = true; Timer(); } @@ -68,8 +76,12 @@ final function CheckBuyLimit() // Make the value clamped. StatCountBox.ChangeValue(StatCountBox.Value); - CurrentCost = StatCountBox.GetValueInt()*MyPerk.PerkStats[StatIndex].CostPerValue; + if(MyPerk.PerkStats[StatIndex].CostPerValue > 1) + CurrentCost = StatCountBox.GetValueInt()*MyPerk.PerkStats[StatIndex].CostPerValue; + else + CurrentCost = 0; ProgressStr = ChopExtraDigits(MyPerk.PerkStats[StatIndex].Progress * StatCountBox.GetValueInt()); + MaxStatValue = MyPerk.PerkStats[StatIndex].MaxValue; // Disable button if can not buy anymore. AddButton.SetDisabled(i==0); From 23bda717187619b6829cae34833a766d19891992 Mon Sep 17 00:00:00 2001 From: inklesspen1scripter Date: Tue, 7 Jul 2020 00:12:25 +0300 Subject: [PATCH 08/13] Trader, MedicPistol and Perk fixes MedicPistol has no weight in upgrades now Fixed weight and damage for upgrades in trader Fixed initial secondary ammo for weapons in trader Fixed secondary ammo icon in trader Fixed error when perk hasn't HeadDamage stat --- ServerExt/Classes/ExtPlayerReplicationInfo.uc | 19 ++++++++++++--- ServerExt/Classes/ExtWeap_Pistol_MedicS.uc | 5 ++++ ServerExt/Classes/Ext_PerkBase.uc | 23 ++++++++++++++++++- ServerExtMut/Classes/ServerExtMut.uc | 1 - 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/ServerExt/Classes/ExtPlayerReplicationInfo.uc b/ServerExt/Classes/ExtPlayerReplicationInfo.uc index 8a7c6a4..b457582 100644 --- a/ServerExt/Classes/ExtPlayerReplicationInfo.uc +++ b/ServerExt/Classes/ExtPlayerReplicationInfo.uc @@ -257,6 +257,7 @@ simulated static final function KFGFxObject_TraderItems CreateNewList() simulated static final function SetWeaponInfo( bool bDedicated, int Index, FCustomTraderItem Item, KFGFxObject_TraderItems List ) { local array S; + local int i; if( List.SaleItems.Length<=Index ) List.SaleItems.Length = Index+1; @@ -268,16 +269,24 @@ simulated static final function SetWeaponInfo( bool bDedicated, int Index, FCust else List.SaleItems[Index].SingleClassName = ''; List.SaleItems[Index].DualClassName = Item.WeaponClass.Default.DualClass!=None ? Item.WeaponClass.Default.DualClass.Name : ''; List.SaleItems[Index].AssociatedPerkClasses = Item.WeaponClass.Static.GetAssociatedPerkClasses(); + List.SaleItems[Index].MaxSpareAmmo = Item.WeaponClass.Default.SpareAmmoCapacity[0]; List.SaleItems[Index].MagazineCapacity = Item.WeaponClass.Default.MagazineCapacity[0]; List.SaleItems[Index].InitialSpareMags = Item.WeaponClass.Default.InitialSpareMags[0]; - List.SaleItems[Index].MaxSpareAmmo = Item.WeaponClass.Default.SpareAmmoCapacity[0]; List.SaleItems[Index].MaxSecondaryAmmo = Item.WeaponClass.Default.MagazineCapacity[1] * Item.WeaponClass.Default.SpareAmmoCapacity[1]; List.SaleItems[Index].BlocksRequired = Item.WeaponClass.Default.InventorySize; List.SaleItems[Index].ItemID = Index; - + + List.SaleItems[Index].InitialSecondaryAmmo = Item.WeaponClass.Default.InitialSpareMags[1]; + List.SaleItems[Index].WeaponUpgradeDmgMultiplier[0] = 1.0; + for(i = 0;i TraitClasses; @@ -405,6 +406,12 @@ function LoadData( ExtSaveDataBase Data ) local string S; CurrentEXP = Data.ReadInt(3); + // if(MinimalDataLevel > 0) + // { + // i = GetNeededExp(MinimalDataLevel-1) + // if(i > CurrentEXP) + // CurrentEXP = i + // } if( Data.GetArVer()>=1 ) CurrentPrestige = Data.ReadInt(3); @@ -465,6 +472,13 @@ function SetInitialLevel() local int i,a,b; local byte MT,j; + if(MinimalDataLevel > 0) + { + i = GetNeededExp(MinimalDataLevel-1); + if(i > CurrentEXP) + CurrentEXP = i; + } + // Set to initial level player is on after configures has loaded. CurrentLevel = CalcLevelForExp(CurrentEXP); CurrentSP = CurrentLevel*(StarPointsPerLevel+CurrentPrestige*PrestigeSPIncrease); @@ -605,6 +619,7 @@ static function UpdateConfigs( int OldVer ) Default.MinLevelForPrestige = 140; Default.PrestigeSPIncrease = 1; Default.MaxPrestige = 20; + Default.MinimalDataLevel = 0; Default.PrestigeXPReduce = 0.05; Default.PerkStats.Length = 0; @@ -707,6 +722,8 @@ static function string GetValue( name PropName, int ElementIndex ) return string(Default.MinLevelForPrestige); case 'PrestigeSPIncrease': return string(Default.PrestigeSPIncrease); + case 'MinimalDataLevel': + return string(Default.MinimalDataLevel); case 'MaxPrestige': return string(Default.MaxPrestige); case 'PrestigeXPReduce': @@ -721,6 +738,8 @@ static function ApplyValue( name PropName, int ElementIndex, string Value ) Default.FirstLevelExp = int(Value); break; case 'LevelUpExpCost': Default.LevelUpExpCost = int(Value); break; + case 'MinimalDataLevel': + Default.MinimalDataLevel = int(Value); break; case 'LevelUpIncCost': Default.LevelUpIncCost = int(Value); break; case 'MinimumLevel': @@ -1418,6 +1437,7 @@ defaultproperties WebConfigs.Add((PropType=0,PropName="PrestigeSPIncrease",UIName="Prestige SP Increase",UIDesc="Star points increase per level for every prestige")) WebConfigs.Add((PropType=0,PropName="MaxPrestige",UIName="Max Prestige",UIDesc="Maximum prestige level")) WebConfigs.Add((PropType=0,PropName="PrestigeXPReduce",UIName="Prestige XP Reduce",UIDesc="Percent amount of XP cost is reduced for each prestige (1.0 = 1/2, or 50 % of XP)")) + // WebConfigs.Add((PropType=0,PropName="MinimalDataLevel",UIName="Minimal Real Level",UIDesc="Minimal level for new players or who loads from saves")) DefPerkStats(0)=(MaxValue=50,CostPerValue=1,StatType="Speed",UIName="Movement Speed (+&%)",Progress=0.4) DefPerkStats(1)=(MaxValue=1000,CostPerValue=1,StatType="Damage",UIName="Perk Damage (+&%)",Progress=0.5) @@ -1459,6 +1479,7 @@ defaultproperties Modifiers.Add(1.f) Modifiers.Add(1.f) Modifiers.Add(1.f) + Modifiers.Add(0.f) EnemyDistDraw.Add(500) EnemyDistDraw.Add(700) diff --git a/ServerExtMut/Classes/ServerExtMut.uc b/ServerExtMut/Classes/ServerExtMut.uc index fb34fe7..696be4f 100644 --- a/ServerExtMut/Classes/ServerExtMut.uc +++ b/ServerExtMut/Classes/ServerExtMut.uc @@ -273,7 +273,6 @@ function EditTraiderItems() // local STraderItem SI; // var config bool bDLCWeaponsForFree; // var config bool bDontUseOriginalWeaponry; - if(!bDontUseOriginalWeaponry) { Trad = KFGameReplicationInfo(WorldInfo.GRI).TraderItems; From ad5fe1f54c8f6da1535e593a935c57cc2b66120c Mon Sep 17 00:00:00 2001 From: inklesspen1scripter Date: Tue, 7 Jul 2020 17:04:37 +0300 Subject: [PATCH 09/13] Added "Syringe Recharge Rate" for medic "Syringe Recharge Rate" can be added to other perks also Syringe Recharge Time has not affected by "Heal Efficiency" anymore --- ServerExt/Classes/Ext_PerkBase.uc | 18 ++++++++++++++---- ServerExt/Classes/Ext_PerkFieldMedic.uc | 14 +++++++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/ServerExt/Classes/Ext_PerkBase.uc b/ServerExt/Classes/Ext_PerkBase.uc index 117c637..5bd679f 100644 --- a/ServerExt/Classes/Ext_PerkBase.uc +++ b/ServerExt/Classes/Ext_PerkBase.uc @@ -650,6 +650,8 @@ static function UpdateConfigs( int OldVer ) AddStatsCfg(16); // Add sonic/fire damage. else if( OldVer<=12 ) AddStatsCfg(18); // Add all damage. + else if( OldVer<=13 ) + AddStatsCfg(19); // Add HeadDamage and HealRecharge if( OldVer<=5 ) { // Add prestige @@ -1165,6 +1167,9 @@ simulated function float ApplyEffect( name Type, float Value, float Progress ) case 'HeadDamage': Modifiers[19] = Value*Progress; break; + case 'HealRecharge': + Modifiers[20] = 1.f / (1.f+Value*Progress); + break; } return (Value*Progress); } @@ -1292,7 +1297,10 @@ final function UpdateAmmoStatus( InventoryManager Inv ) } } -simulated function ModifyHealerRechargeTime( out float RechargeRate ); +simulated function ModifyHealerRechargeTime( out float RechargeRate ) +{ + RechargeRate *= Modifiers[20]; +} simulated function DrawSpecialPerkHUD(Canvas C) { @@ -1389,7 +1397,7 @@ simulated function float GetZedTimeExtensions( byte Level ) defaultproperties { - CurrentConfigVer=13 + CurrentConfigVer=14 bOnlyRelevantToOwner=true bCanBeGrabbed=true NetUpdateFrequency=1 @@ -1441,8 +1449,8 @@ defaultproperties DefPerkStats(0)=(MaxValue=50,CostPerValue=1,StatType="Speed",UIName="Movement Speed (+&%)",Progress=0.4) DefPerkStats(1)=(MaxValue=1000,CostPerValue=1,StatType="Damage",UIName="Perk Damage (+&%)",Progress=0.5) - DefPerkStats(2)=(MaxValue=90,CostPerValue=1,StatType="Recoil",UIName="Fire Recoil (-&%)",Progress=1) - DefPerkStats(3)=(MaxValue=80,CostPerValue=1,StatType="Spread",UIName="Fire Spread (-&%)",Progress=0.75) + DefPerkStats(2)=(MaxValue=90,CostPerValue=1,StatType="Recoil",UIName="Fire Recoil Reduce (+&%)",Progress=1) + DefPerkStats(3)=(MaxValue=80,CostPerValue=1,StatType="Spread",UIName="Fire Spread Reduce (+&%)",Progress=0.75) DefPerkStats(4)=(MaxValue=1000,CostPerValue=1,StatType="Rate",UIName="Perk Rate of Fire (+&%)",Progress=0.5) DefPerkStats(5)=(MaxValue=1000,CostPerValue=1,StatType="Reload",UIName="Perk Reload Time (-&%)",Progress=0.5) DefPerkStats(6)=(MaxValue=150,CostPerValue=1,StatType="Health",UIName="Health (+&HP)",Progress=1) @@ -1459,6 +1467,7 @@ defaultproperties DefPerkStats(17)=(MaxValue=1000,CostPerValue=1,StatType="FireDmg",UIName="Fire Resistance (+&%)",Progress=1.5,bHiddenConfig=true) DefPerkStats(18)=(MaxValue=500,CostPerValue=1,StatType="AllDmg",UIName="Zed Damage Reduction (+&%)",Progress=0.25) DefPerkStats(19)=(MaxValue=500,CostPerValue=1,StatType="HeadDamage",UIName="Perk Head Damage (+&%)",Progress=1,bHiddenConfig=true) + DefPerkStats(20)=(MaxValue=200,CostPerValue=1,StatType="HealRecharge",UIName="Syringe Recharge Rate (+&%)",Progress=0.5,bHiddenConfig=true) Modifiers.Add(1.f) Modifiers.Add(1.f) @@ -1480,6 +1489,7 @@ defaultproperties Modifiers.Add(1.f) Modifiers.Add(1.f) Modifiers.Add(0.f) + Modifiers.Add(1.f) EnemyDistDraw.Add(500) EnemyDistDraw.Add(700) diff --git a/ServerExt/Classes/Ext_PerkFieldMedic.uc b/ServerExt/Classes/Ext_PerkFieldMedic.uc index c3c448a..048caf8 100644 --- a/ServerExt/Classes/Ext_PerkFieldMedic.uc +++ b/ServerExt/Classes/Ext_PerkFieldMedic.uc @@ -52,10 +52,13 @@ function bool ModifyHealAmount( out float HealAmount ) HealAmount*=Modifiers[9]; return (RepairArmorRate>0); } -simulated function ModifyHealerRechargeTime( out float RechargeRate ) -{ - RechargeRate /= Clamp(Modifiers[9] * 2, 1.f, 3.f); -} + +// 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 ) { @@ -73,7 +76,7 @@ function GiveMedicAirborneAgentHealth( KFPawn HealTarget, class DamT 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 ); @@ -213,6 +216,7 @@ defaultproperties 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 From 58bb384a49de7395fd7665ff8e2ddd13eda40aed Mon Sep 17 00:00:00 2001 From: inklesspen1scripter Date: Tue, 7 Jul 2020 17:29:42 +0300 Subject: [PATCH 10/13] Trait "Medic Pistol" applying on purchasing now --- ServerExt/Classes/Ext_TraitMedicPistol.uc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ServerExt/Classes/Ext_TraitMedicPistol.uc b/ServerExt/Classes/Ext_TraitMedicPistol.uc index 2437dd0..9ec9ab6 100644 --- a/ServerExt/Classes/Ext_TraitMedicPistol.uc +++ b/ServerExt/Classes/Ext_TraitMedicPistol.uc @@ -6,6 +6,22 @@ static function AddDefaultInventory( KFPawn Player, Ext_PerkBase Perk, byte Leve Player.DefaultInventory.AddItem(class'ExtWeap_Pistol_MedicS'); } +static function ApplyEffectOn( KFPawn_Human Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data ) +{ + local Inventory Inv; + + Inv = Player.FindInventoryType(class'ExtWeap_Pistol_9mm'); + if( Inv!=None ) + Inv.Destroy(); + + if( Player.FindInventoryType(class'ExtWeap_Pistol_MedicS')==None ) + { + Inv = Player.CreateInventory(class'ExtWeap_Pistol_MedicS',Player.Weapon!=None); + if ( KFWeapon(Inv)!=None ) + KFWeapon(Inv).bGivenAtStart = true; + } +} + defaultproperties { TraitName="Medic Pistol" From 8d6223ada3e92771c0c46e34fef997120c5efecc Mon Sep 17 00:00:00 2001 From: inklesspen1scripter Date: Tue, 7 Jul 2020 20:01:17 +0300 Subject: [PATCH 11/13] Added custom zed xp configuration example in ServerExtMut.ini: CustomZedXP=(zed="zedcustom.greenbloat",XP1=20,XP2=24,XP3=30,XP4=36) --- ServerExtMut/Classes/ServerExtMut.uc | 58 +++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/ServerExtMut/Classes/ServerExtMut.uc b/ServerExtMut/Classes/ServerExtMut.uc index 696be4f..ce8f21f 100644 --- a/ServerExtMut/Classes/ServerExtMut.uc +++ b/ServerExtMut/Classes/ServerExtMut.uc @@ -10,6 +10,14 @@ struct FInventory var class ItemClass; var int Values[4]; }; +struct CFGCustomZedXP +{ + var string zed; // zed name + var float XP1; // normal + var float XP2; // hard + var float XP3; // suicidal + var float XP4; // hoe +}; struct FSavedInvEntry { var Controller OwnerPlayer; @@ -19,6 +27,7 @@ struct FSavedInvEntry var array PlayerInv; var config array PerkClasses,CustomChars,AdminCommands,CustomItems,BonusGameSongs,BonusGameFX; +var config array CustomZedXP; var array< class > LoadedPerks; var array CustomCharList; var ExtPlayerStat ServerStatLoader; @@ -55,6 +64,14 @@ var config bool bDontUseOriginalWeaponry; var config bool bAllowStandartPistolUpgrade; var config bool bDisableCustomTrader; +//Custom XP lightly array +struct CustomZedXPStruct +{ + var class zedclass; + var float XPValues[4]; +}; +var array CustomZedXPArray; + function PostBeginPlay() { local xVotingHandler MV; @@ -66,6 +83,7 @@ function PostBeginPlay() local Object O; local string S; local bool bLock; + local CustomZedXPStruct zedxp; Super.PostBeginPlay(); if( WorldInfo.Game.BaseMutator==None ) @@ -242,10 +260,32 @@ function PostBeginPlay() if( bDumpXMLStats ) FileOutput = Spawn(class'ExtXMLOutput'); + UpdateCustomZedXPArray() // Causes bugs // SetTimer(0.1,'CheckPickupFactories') } +function UpdateCustomZedXPArray() +{ + CustomZedXPArray.Length = 0; + // Custom XP for custom zeds + for(i=0;i(DynamicLoadObject(CustomZedXP[i].zed,Class'Class')); + if(zedxp.zedclass == none) + { + `log("Error loading"@CustomZedXP[i].zed); + continue; + } + zedxp.XPValues[0] = CustomZedXP[i].XP1; + zedxp.XPValues[1] = CustomZedXP[i].XP2; + zedxp.XPValues[2] = CustomZedXP[i].XP3; + zedxp.XPValues[3] = CustomZedXP[i].XP4; + CustomZedXPArray.AddItem(zedxp); + `log("CustomXP: Loaded"@PathName(zedxp.zedclass)); + } +} + // function CheckPickupFactories() // { // local KFPickupFactory_Item ItemFactory; @@ -557,14 +597,28 @@ function ScoreKill(Controller Killer, Controller Killed) KFPC = KFPlayerController(DamagerKFPRI.Owner); if( KFPC != none ) { + `log("ScoreKill:"@PathName(KFM)); + + XP = 0; + for(j=0;j Date: Tue, 7 Jul 2020 20:49:25 +0300 Subject: [PATCH 12/13] Traits changes Rack'em Up doesn't reducing when miss anymore Trait "MedicPistol" replacing (don't removing) 9mm from default inventory so players with this trait will spawn with medic pistol in hands Optimized code of Rack'em Up trait --- ServerExt/Classes/ExtDT_Ballistic_9mm.uc | 8 +++- .../Classes/ExtDT_Ballistic_Pistol_Medic.uc | 8 +++- ServerExt/Classes/Ext_PerkRhythmPerkBase.uc | 38 ++++--------------- ServerExt/Classes/Ext_TraitMedicPistol.uc | 6 ++- ServerExtMut/Classes/ServerExtMut.uc | 5 ++- 5 files changed, 28 insertions(+), 37 deletions(-) diff --git a/ServerExt/Classes/ExtDT_Ballistic_9mm.uc b/ServerExt/Classes/ExtDT_Ballistic_9mm.uc index 671ffa4..4224876 100644 --- a/ServerExt/Classes/ExtDT_Ballistic_9mm.uc +++ b/ServerExt/Classes/ExtDT_Ballistic_9mm.uc @@ -1,3 +1,9 @@ class ExtDT_Ballistic_9mm extends KFDT_Ballistic_9mm abstract - hidedropdown; \ No newline at end of file + hidedropdown; + +DefaultProperties +{ + ModifierPerkList(0) = class'KFPerk_Sharpshooter' + ModifierPerkList(1) = class'KFPerk_Gunslinger' +} \ No newline at end of file diff --git a/ServerExt/Classes/ExtDT_Ballistic_Pistol_Medic.uc b/ServerExt/Classes/ExtDT_Ballistic_Pistol_Medic.uc index 6bac424..39f1d4c 100644 --- a/ServerExt/Classes/ExtDT_Ballistic_Pistol_Medic.uc +++ b/ServerExt/Classes/ExtDT_Ballistic_Pistol_Medic.uc @@ -1,3 +1,9 @@ class ExtDT_Ballistic_Pistol_Medic extends KFDT_Ballistic_Pistol_Medic abstract - hidedropdown; \ No newline at end of file + hidedropdown; + +DefaultProperties +{ + ModifierPerkList(0) = class'KFPerk_Sharpshooter' + ModifierPerkList(1) = class'KFPerk_Gunslinger' +} \ No newline at end of file diff --git a/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc b/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc index 3b6f55b..4c9e2b1 100644 --- a/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc +++ b/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc @@ -1,6 +1,6 @@ Class Ext_PerkRhythmPerkBase extends Ext_PerkBase; -var byte HeadShotComboCount,MaxRhythmCombo,MissComboCount; +var byte HeadShotComboCount,MaxRhythmCombo; var float RhythmComboDmg; var private const float HeadShotCountdownIntervall; @@ -20,75 +20,51 @@ final function ResetRhythm() MaxRhythmCombo = 0; HeadShotComboCount = 0; RhythmComboDmg = 0; - MissComboCount = 0; HeadShotMessage(0,true,1); } function SubstractHeadShotCombo() { if( HeadShotComboCount > 0 ) - { - --HeadShotComboCount; - HeadShotMessage( HeadShotComboCount, true, MaxRhythmCombo ); - } - else if( HeadShotComboCount <= 0 ) - { + UpdateDmgScale(false); + else ClearTimer( nameOf( SubstractHeadShotCombo ) ); - } } final function UpdateDmgScale( bool bUp ) { if( bUp ) { - MissComboCount = 0; - if (HeadShotComboCount < MaxRhythmCombo) - HeadShotComboCount = Min(HeadShotComboCount+1,255); + HeadShotComboCount = Min(HeadShotComboCount+1,MaxRhythmCombo); HeadShotMessage(HeadShotComboCount,false,MaxRhythmCombo); SetTimer( HeadShotCountdownIntervall, true, nameOf( SubstractHeadShotCombo ) ); } - else if( HeadShotComboCount>0 && ++MissComboCount==3 ) + else if( HeadShotComboCount>0) { --HeadShotComboCount; HeadShotMessage(HeadShotComboCount,true,MaxRhythmCombo); - MissComboCount = 0; } else return; - RhythmComboDmg = FMin(HeadShotComboCount,MaxRhythmCombo)*0.075; + RhythmComboDmg = HeadShotComboCount*0.075; } function UpdatePerkHeadShots( ImpactInfo Impact, class DamageType, int NumHit ) { local int HitZoneIdx; local KFPawn_Monster KFPM; - - // `log("RACKEMUP" @ GetScriptTrace()); if( MaxRhythmCombo<=0 ) return; KFPM = KFPawn_Monster(Impact.HitActor); if( KFPM==none || KFPM.GetTeamNum()==0 ) - { - if( NumHit < 1 && HeadShotComboCount>0 ) - UpdateDmgScale(false); return; - } HitZoneIdx = KFPM.HitZones.Find('ZoneName', Impact.HitInfo.BoneName); if( HitZoneIdx == HZI_Head && KFPM.IsAliveAndWell() ) { - if( class(DamageType)!=None - && (class(DamageType).Default.ModifierPerkList.Find(BasePerk)>=0 - || DamageType == class'ExtDT_Ballistic_9mm' - || DamageType == class'ExtDT_Ballistic_Pistol_Medic' - || DamageType == class'KFDT_Ballistic_9mm' - || DamageType == class'KFDT_Ballistic_Pistol_Medic')) + if( class(DamageType)!=None && (class(DamageType).Default.ModifierPerkList.Find(BasePerk)>=0)) UpdateDmgScale(true); - else if( HeadShotComboCount>0 ) - UpdateDmgScale(false); } - else if( NumHit < 1 && HeadShotComboCount>0 ) - UpdateDmgScale(false); } reliable client function HeadShotMessage( byte HeadShotNum, bool bMissed, byte MaxHits ) { diff --git a/ServerExt/Classes/Ext_TraitMedicPistol.uc b/ServerExt/Classes/Ext_TraitMedicPistol.uc index 9ec9ab6..9aafb6f 100644 --- a/ServerExt/Classes/Ext_TraitMedicPistol.uc +++ b/ServerExt/Classes/Ext_TraitMedicPistol.uc @@ -2,8 +2,10 @@ Class Ext_TraitMedicPistol extends Ext_TraitBase; static function AddDefaultInventory( KFPawn Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data ) { - Player.DefaultInventory.RemoveItem(class'ExtWeap_Pistol_9mm'); - Player.DefaultInventory.AddItem(class'ExtWeap_Pistol_MedicS'); + local int i; + i = Player.DefaultInventory.Find(class'ExtWeap_Pistol_9mm'); + if(i != -1) + Player.DefaultInventory[i] = class'ExtWeap_Pistol_MedicS'; } static function ApplyEffectOn( KFPawn_Human Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data ) diff --git a/ServerExtMut/Classes/ServerExtMut.uc b/ServerExtMut/Classes/ServerExtMut.uc index ce8f21f..5d17f96 100644 --- a/ServerExtMut/Classes/ServerExtMut.uc +++ b/ServerExtMut/Classes/ServerExtMut.uc @@ -83,7 +83,6 @@ function PostBeginPlay() local Object O; local string S; local bool bLock; - local CustomZedXPStruct zedxp; Super.PostBeginPlay(); if( WorldInfo.Game.BaseMutator==None ) @@ -260,13 +259,15 @@ function PostBeginPlay() if( bDumpXMLStats ) FileOutput = Spawn(class'ExtXMLOutput'); - UpdateCustomZedXPArray() + UpdateCustomZedXPArray(); // Causes bugs // SetTimer(0.1,'CheckPickupFactories') } function UpdateCustomZedXPArray() { + local int i; + local CustomZedXPStruct zedxp; CustomZedXPArray.Length = 0; // Custom XP for custom zeds for(i=0;i Date: Tue, 7 Jul 2020 22:59:38 +0300 Subject: [PATCH 13/13] Bolts&Arrows cleanup on wave start --- ServerExtMut/Classes/ServerExtMut.uc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ServerExtMut/Classes/ServerExtMut.uc b/ServerExtMut/Classes/ServerExtMut.uc index 5d17f96..51d1fcc 100644 --- a/ServerExtMut/Classes/ServerExtMut.uc +++ b/ServerExtMut/Classes/ServerExtMut.uc @@ -465,6 +465,7 @@ function CheckWave() function NotifyWaveChange() { local ExtPlayerController ExtPC; + local KFProj_RicochetStickBullet KFBolt; if( bRespawnCheck ) { @@ -484,6 +485,13 @@ function NotifyWaveChange() foreach WorldInfo.AllControllers(class'ExtPlayerController',ExtPC) ExtPC.bSetPerk = false; } + + foreach WorldInfo.AllActors(class'KFProj_RicochetStickBullet', KFBolt) + { + if(KFProj_Bolt_CompoundBowSharp(KFBolt) != none || + KFProj_Bolt_Crossbow(KFBolt) != none) + KFBolt.Destroy(); + } } function SetupWebAdmin() {