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/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; @@ -635,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 @@ -707,6 +724,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 +740,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': @@ -1143,6 +1164,12 @@ 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; + case 'HealRecharge': + Modifiers[20] = 1.f / (1.f+Value*Progress); + break; } return (Value*Progress); } @@ -1150,7 +1177,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]; } @@ -1265,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) { @@ -1362,7 +1397,7 @@ simulated function float GetZedTimeExtensions( byte Level ) defaultproperties { - CurrentConfigVer=13 + CurrentConfigVer=14 bOnlyRelevantToOwner=true bCanBeGrabbed=true NetUpdateFrequency=1 @@ -1410,12 +1445,13 @@ 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")) // TODO: localize 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) @@ -1431,6 +1467,8 @@ 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) + 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) @@ -1451,6 +1489,8 @@ defaultproperties Modifiers.Add(1.f) 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 eb6b6e5..e9bbc36 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 ); @@ -112,6 +115,15 @@ simulated function float GetSnarePower( optional class DamageType, o 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; @@ -203,15 +215,17 @@ 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=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/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc b/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc index 6d6c900..4c9e2b1 100644 --- a/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc +++ b/ServerExt/Classes/Ext_PerkRhythmPerkBase.uc @@ -1,7 +1,8 @@ Class Ext_PerkRhythmPerkBase extends Ext_PerkBase; -var byte HeadShotComboCount,MaxRhythmCombo,MissComboCount; +var byte HeadShotComboCount,MaxRhythmCombo; 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 ) { @@ -19,59 +20,51 @@ final function ResetRhythm() MaxRhythmCombo = 0; HeadShotComboCount = 0; RhythmComboDmg = 0; - MissComboCount = 0; HeadShotMessage(0,true,1); } +function SubstractHeadShotCombo() +{ + if( HeadShotComboCount > 0 ) + UpdateDmgScale(false); + else + ClearTimer( nameOf( SubstractHeadShotCombo ) ); +} + final function UpdateDmgScale( bool bUp ) { if( bUp ) { - MissComboCount = 0; - 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 ) { @@ -110,4 +103,5 @@ reliable client function HeadShotMessage( byte HeadShotNum, bool bMissed, byte M defaultproperties { + HeadShotCountdownIntervall=2.f } \ No newline at end of file diff --git a/ServerExt/Classes/Ext_PerkSharpshooter.uc b/ServerExt/Classes/Ext_PerkSharpshooter.uc index d8f2161..cfca467 100644 --- a/ServerExt/Classes/Ext_PerkSharpshooter.uc +++ b/ServerExt/Classes/Ext_PerkSharpshooter.uc @@ -27,11 +27,12 @@ defaultproperties { 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/Ext_TraitMedicPistol.uc b/ServerExt/Classes/Ext_TraitMedicPistol.uc index 09b602d..85a5b6a 100644 --- a/ServerExt/Classes/Ext_TraitMedicPistol.uc +++ b/ServerExt/Classes/Ext_TraitMedicPistol.uc @@ -2,8 +2,26 @@ 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 ) +{ + 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 diff --git a/ServerExt/Classes/UIR_PerkStat.uc b/ServerExt/Classes/UIR_PerkStat.uc index 8c2f3d1..52db072 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); diff --git a/ServerExt/Classes/UI_MidGameMenu.uc b/ServerExt/Classes/UI_MidGameMenu.uc index 1f112e7..7b52305 100644 --- a/ServerExt/Classes/UI_MidGameMenu.uc +++ b/ServerExt/Classes/UI_MidGameMenu.uc @@ -3,11 +3,11 @@ Class UI_MidGameMenu extends KFGUI_FloatingWindow; var KFGUI_SwitchMenuBar PageSwitcher; var array< class > Pages; -var KFGUI_Button AdminButton,SpectateButton; +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() { @@ -20,10 +20,11 @@ function InitMenu() // TODO: localize AddMenuButton('Mapvote',"Map Vote","Show mapvote menu"); AddMenuButton('Settings',"Settings","Enter the game settings"); - AddMenuButton('Disconnect',"Disconnect","Disconnect from this server"); + SkipTraderButton = AddMenuButton('SkipTrader',"Skip Trader","start voting for skip trader"); SpectateButton = AddMenuButton('Spectate',"",""); AddMenuButton('Close',"Close","Close this menu"); - //AddMenuButton('Exit',"Exit","Exit this game"); + AddMenuButton('Disconnect',"Disconnect","Disconnect from this server"); + AddMenuButton('Exit',"Exit","Exit this game"); for( i=0; i 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,7 +83,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 +259,53 @@ function PostBeginPlay() if( bDumpXMLStats ) FileOutput = Spawn(class'ExtXMLOutput'); - // Disable 9mm and medpistol in all PickupFactories - foreach AllActors(class'KFPickupFactory_Item', ItemFactory) + 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(DynamicLoadObject(CustomZedXP[i].zed,Class'Class')); + if(zedxp.zedclass == none) { - if(ItemFactory.ItemPickups[i].ItemClass == class'KFGameContent.KFWeap_Pistol_9mm' - || ItemFactory.ItemPickups[i].ItemClass == class'KFGameContent.KFWeap_Pistol_Medic') - { - ItemFactory.ItemPickups.Remove(i, 1); - break; - } + `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; + +// // Disable 9mm and medpistol in all PickupFactories +// foreach AllActors(class'KFPickupFactory_Item', ItemFactory) +// { +// for(i=0;i