Merge branch 'master' into localization

Conflicts (fixed):
ServerExt/Classes/UI_MidGameMenu.uc
This commit is contained in:
GenZmeY 2020-08-11 12:13:02 +03:00
commit 84abe621c2
12 changed files with 274 additions and 66 deletions

View File

@ -1,3 +1,9 @@
class ExtDT_Ballistic_9mm extends KFDT_Ballistic_9mm class ExtDT_Ballistic_9mm extends KFDT_Ballistic_9mm
abstract abstract
hidedropdown; hidedropdown;
DefaultProperties
{
ModifierPerkList(0) = class'KFPerk_Sharpshooter'
ModifierPerkList(1) = class'KFPerk_Gunslinger'
}

View File

@ -1,3 +1,9 @@
class ExtDT_Ballistic_Pistol_Medic extends KFDT_Ballistic_Pistol_Medic class ExtDT_Ballistic_Pistol_Medic extends KFDT_Ballistic_Pistol_Medic
abstract abstract
hidedropdown; hidedropdown;
DefaultProperties
{
ModifierPerkList(0) = class'KFPerk_Sharpshooter'
ModifierPerkList(1) = class'KFPerk_Gunslinger'
}

View File

@ -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 ) simulated static final function SetWeaponInfo( bool bDedicated, int Index, FCustomTraderItem Item, KFGFxObject_TraderItems List )
{ {
local array<STraderItemWeaponStats> S; local array<STraderItemWeaponStats> S;
local int i;
if( List.SaleItems.Length<=Index ) if( List.SaleItems.Length<=Index )
List.SaleItems.Length = Index+1; List.SaleItems.Length = Index+1;
@ -268,16 +269,24 @@ simulated static final function SetWeaponInfo( bool bDedicated, int Index, FCust
else List.SaleItems[Index].SingleClassName = ''; else List.SaleItems[Index].SingleClassName = '';
List.SaleItems[Index].DualClassName = Item.WeaponClass.Default.DualClass!=None ? Item.WeaponClass.Default.DualClass.Name : ''; 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].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].MagazineCapacity = Item.WeaponClass.Default.MagazineCapacity[0];
List.SaleItems[Index].InitialSpareMags = Item.WeaponClass.Default.InitialSpareMags[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].MaxSecondaryAmmo = Item.WeaponClass.Default.MagazineCapacity[1] * Item.WeaponClass.Default.SpareAmmoCapacity[1];
List.SaleItems[Index].BlocksRequired = Item.WeaponClass.Default.InventorySize; List.SaleItems[Index].BlocksRequired = Item.WeaponClass.Default.InventorySize;
List.SaleItems[Index].ItemID = Index; 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<Min(Item.WeaponClass.Default.WeaponUpgrades.Length, 5);i++)
{
List.SaleItems[Index].WeaponUpgradeWeight[i+1] = Item.WeaponClass.Static.GetUpgradeStatAdd(EWUS_Weight, i+1);
List.SaleItems[Index].WeaponUpgradeDmgMultiplier[i+1] = Item.WeaponClass.Static.GetUpgradeStatScale(EWUS_Damage0, i+1);
}
if( !bDedicated ) if( !bDedicated )
{ {
List.SaleItems[Index].SecondaryAmmoImagePath = Item.WeaponClass.Default.SecondaryAmmoTexture!=None ? "img://"$PathName(Item.WeaponClass.Default.SecondaryAmmoTexture) : ""; List.SaleItems[Index].SecondaryAmmoImagePath = Item.WeaponClass.Default.SecondaryAmmoTexture!=None ? PathName(Item.WeaponClass.Default.SecondaryAmmoTexture) : "UI_SecondaryAmmo_TEX.GasTank";
List.SaleItems[Index].TraderFilter = Item.WeaponClass.Static.GetTraderFilter(); List.SaleItems[Index].TraderFilter = Item.WeaponClass.Static.GetTraderFilter();
List.SaleItems[Index].InventoryGroup = Item.WeaponClass.Default.InventoryGroup; List.SaleItems[Index].InventoryGroup = Item.WeaponClass.Default.InventoryGroup;
List.SaleItems[Index].GroupPriority = Item.WeaponClass.Default.GroupPriority; List.SaleItems[Index].GroupPriority = Item.WeaponClass.Default.GroupPriority;
@ -296,8 +305,12 @@ simulated function RecheckGRI()
{ {
KFGameReplicationInfo(WorldInfo.GRI).TraderItems = CustomList; KFGameReplicationInfo(WorldInfo.GRI).TraderItems = CustomList;
foreach LocalPlayerControllers(class'ExtPlayerController',PC) foreach LocalPlayerControllers(class'ExtPlayerController',PC)
{
if( PC.PurchaseHelper!=None ) if( PC.PurchaseHelper!=None )
{
PC.PurchaseHelper.TraderItems = CustomList; PC.PurchaseHelper.TraderItems = CustomList;
}
}
} }
} }

View File

@ -12,6 +12,11 @@ defaultproperties
InventorySize=0 InventorySize=0
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'ExtDT_Ballistic_Pistol_Medic' InstantHitDamageTypes(DEFAULT_FIREMODE)=class'ExtDT_Ballistic_Pistol_Medic'
WeaponUpgrades[1]=(Stats=((Stat=EWUS_Damage0, Scale=1.7f), (Stat=EWUS_HealFullRecharge, Scale=0.9f)))
WeaponUpgrades[2]=(Stats=((Stat=EWUS_Damage0, Scale=2.0f), (Stat=EWUS_HealFullRecharge, Scale=0.8f)))
WeaponUpgrades[3]=(Stats=((Stat=EWUS_Damage0, Scale=2.55f), (Stat=EWUS_HealFullRecharge, Scale=0.7f)))
WeaponUpgrades[4]=(Stats=((Stat=EWUS_Damage0, Scale=3.0f), (Stat=EWUS_HealFullRecharge, Scale=0.6f)))
} }
simulated static function bool AllowedForAllPerks() simulated static function bool AllowedForAllPerks()

View File

@ -34,7 +34,8 @@ var config int FirstLevelExp, // How much EXP needed for first level.
StarPointsPerLevel, StarPointsPerLevel,
MinLevelForPrestige, // Minimum level required for perk prestige. MinLevelForPrestige, // Minimum level required for perk prestige.
PrestigeSPIncrease, // Starpoint increase per prestige levelup. PrestigeSPIncrease, // Starpoint increase per prestige levelup.
MaxPrestige; // Maximum prestige level. MaxPrestige,
MinimalDataLevel; // Maximum prestige level.
var config float PrestigeXPReduce; // Amount of XP cost is reduced for each prestige. var config float PrestigeXPReduce; // Amount of XP cost is reduced for each prestige.
var config array<string> TraitClasses; var config array<string> TraitClasses;
@ -405,6 +406,12 @@ function LoadData( ExtSaveDataBase Data )
local string S; local string S;
CurrentEXP = Data.ReadInt(3); CurrentEXP = Data.ReadInt(3);
// if(MinimalDataLevel > 0)
// {
// i = GetNeededExp(MinimalDataLevel-1)
// if(i > CurrentEXP)
// CurrentEXP = i
// }
if( Data.GetArVer()>=1 ) if( Data.GetArVer()>=1 )
CurrentPrestige = Data.ReadInt(3); CurrentPrestige = Data.ReadInt(3);
@ -465,6 +472,13 @@ function SetInitialLevel()
local int i,a,b; local int i,a,b;
local byte MT,j; 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. // Set to initial level player is on after configures has loaded.
CurrentLevel = CalcLevelForExp(CurrentEXP); CurrentLevel = CalcLevelForExp(CurrentEXP);
CurrentSP = CurrentLevel*(StarPointsPerLevel+CurrentPrestige*PrestigeSPIncrease); CurrentSP = CurrentLevel*(StarPointsPerLevel+CurrentPrestige*PrestigeSPIncrease);
@ -605,6 +619,7 @@ static function UpdateConfigs( int OldVer )
Default.MinLevelForPrestige = 140; Default.MinLevelForPrestige = 140;
Default.PrestigeSPIncrease = 1; Default.PrestigeSPIncrease = 1;
Default.MaxPrestige = 20; Default.MaxPrestige = 20;
Default.MinimalDataLevel = 0;
Default.PrestigeXPReduce = 0.05; Default.PrestigeXPReduce = 0.05;
Default.PerkStats.Length = 0; Default.PerkStats.Length = 0;
@ -635,6 +650,8 @@ static function UpdateConfigs( int OldVer )
AddStatsCfg(16); // Add sonic/fire damage. AddStatsCfg(16); // Add sonic/fire damage.
else if( OldVer<=12 ) else if( OldVer<=12 )
AddStatsCfg(18); // Add all damage. AddStatsCfg(18); // Add all damage.
else if( OldVer<=13 )
AddStatsCfg(19); // Add HeadDamage and HealRecharge
if( OldVer<=5 ) if( OldVer<=5 )
{ {
// Add prestige // Add prestige
@ -707,6 +724,8 @@ static function string GetValue( name PropName, int ElementIndex )
return string(Default.MinLevelForPrestige); return string(Default.MinLevelForPrestige);
case 'PrestigeSPIncrease': case 'PrestigeSPIncrease':
return string(Default.PrestigeSPIncrease); return string(Default.PrestigeSPIncrease);
case 'MinimalDataLevel':
return string(Default.MinimalDataLevel);
case 'MaxPrestige': case 'MaxPrestige':
return string(Default.MaxPrestige); return string(Default.MaxPrestige);
case 'PrestigeXPReduce': case 'PrestigeXPReduce':
@ -721,6 +740,8 @@ static function ApplyValue( name PropName, int ElementIndex, string Value )
Default.FirstLevelExp = int(Value); break; Default.FirstLevelExp = int(Value); break;
case 'LevelUpExpCost': case 'LevelUpExpCost':
Default.LevelUpExpCost = int(Value); break; Default.LevelUpExpCost = int(Value); break;
case 'MinimalDataLevel':
Default.MinimalDataLevel = int(Value); break;
case 'LevelUpIncCost': case 'LevelUpIncCost':
Default.LevelUpIncCost = int(Value); break; Default.LevelUpIncCost = int(Value); break;
case 'MinimumLevel': case 'MinimumLevel':
@ -1143,6 +1164,12 @@ simulated function float ApplyEffect( name Type, float Value, float Progress )
case 'AllDmg': case 'AllDmg':
Modifiers[18] = 1.f / (1.f+Value*Progress); Modifiers[18] = 1.f / (1.f+Value*Progress);
break; break;
case 'HeadDamage':
Modifiers[19] = Value*Progress;
break;
case 'HealRecharge':
Modifiers[20] = 1.f / (1.f+Value*Progress);
break;
} }
return (Value*Progress); 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<KFDamageType> DamageType, optional int HitZoneIdx ) simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCauser, optional KFPawn_Monster MyKFPM, optional KFPlayerController DamageInstigator, optional class<KFDamageType> DamageType, optional int HitZoneIdx )
{ {
if( BasePerk==None || (DamageType!=None && DamageType.Default.ModifierPerkList.Find(BasePerk)>=0) || (KFWeapon(DamageCauser)!=None && IsWeaponOnPerk(KFWeapon(DamageCauser))) ) 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' ) else if( DamageType==None || DamageType.Name!='KFDT_SuicideExplosive' )
InDamage *= Modifiers[12]; 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) simulated function DrawSpecialPerkHUD(Canvas C)
{ {
@ -1362,7 +1397,7 @@ simulated function float GetZedTimeExtensions( byte Level )
defaultproperties defaultproperties
{ {
CurrentConfigVer=13 CurrentConfigVer=14
bOnlyRelevantToOwner=true bOnlyRelevantToOwner=true
bCanBeGrabbed=true bCanBeGrabbed=true
NetUpdateFrequency=1 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="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="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="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 // TODO: localize
DefPerkStats(0)=(MaxValue=50,CostPerValue=1,StatType="Speed",UIName="Movement Speed (+&%)",Progress=0.4) 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(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(2)=(MaxValue=90,CostPerValue=1,StatType="Recoil",UIName="Fire Recoil Reduce (+&%)",Progress=1)
DefPerkStats(3)=(MaxValue=80,CostPerValue=1,StatType="Spread",UIName="Fire Spread (-&%)",Progress=0.75) 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(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(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) 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(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(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(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)
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(1.f)
Modifiers.Add(1.f) Modifiers.Add(1.f)
Modifiers.Add(0.f)
Modifiers.Add(1.f)
EnemyDistDraw.Add(500) EnemyDistDraw.Add(500)
EnemyDistDraw.Add(700) EnemyDistDraw.Add(700)

View File

@ -52,10 +52,13 @@ function bool ModifyHealAmount( out float HealAmount )
HealAmount*=Modifiers[9]; HealAmount*=Modifiers[9];
return (RepairArmorRate>0); return (RepairArmorRate>0);
} }
simulated function ModifyHealerRechargeTime( out float RechargeRate )
{ // Di
RechargeRate /= Clamp(Modifiers[9] * 2, 1.f, 3.f); // simulated function ModifyHealerRechargeTime( out float RechargeRate )
} // {
// super.ModifyHealerRechargeTime(RechargeRate)
// RechargeRate /= Clamp(Modifiers[9] * 2, 1.f, 3.f);
// }
function CheckForAirborneAgent( KFPawn HealTarget, class<DamageType> DamType, int HealAmount ) function CheckForAirborneAgent( KFPawn HealTarget, class<DamageType> DamType, int HealAmount )
{ {
@ -73,7 +76,7 @@ function GiveMedicAirborneAgentHealth( KFPawn HealTarget, class<DamageType> DamT
foreach WorldInfo.Allpawns(class'KFPawn', KFP, HealTarget.Location, 500.f) foreach WorldInfo.Allpawns(class'KFPawn', KFP, HealTarget.Location, 500.f)
{ {
if( KFP.IsAliveAndWell() && WorldInfo.GRI.OnSameTeam( HealTarget, KFP ) ) if( KFP.IsAliveAndWell() && WorldInfo.GRI.OnSameTeam( HealTarget, KFP ) )
{ {
if ( HealTarget == KFP ) if ( HealTarget == KFP )
KFP.HealDamage( RoundedExtraHealAmount, PlayerOwner, DamType ); KFP.HealDamage( RoundedExtraHealAmount, PlayerOwner, DamType );
else KFP.HealDamage( RoundedExtraHealAmount + HealAmount, PlayerOwner, DamType ); else KFP.HealDamage( RoundedExtraHealAmount + HealAmount, PlayerOwner, DamType );
@ -112,6 +115,15 @@ simulated function float GetSnarePower( optional class<DamageType> DamageType, o
return 0.f; 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() simulated function bool GetHealingSpeedBoostActive()
{ {
return bHealingBoost; return bHealingBoost;
@ -203,15 +215,17 @@ defaultproperties
DefPerkStats(15)=(bHiddenConfig=false) // Toxic resistance DefPerkStats(15)=(bHiddenConfig=false) // Toxic resistance
DefPerkStats(16)=(bHiddenConfig=false) // Sonic resistance DefPerkStats(16)=(bHiddenConfig=false) // Sonic resistance
DefPerkStats(17)=(bHiddenConfig=false) // Fire resistance DefPerkStats(17)=(bHiddenConfig=false) // Fire resistance
DefPerkStats(20)=(bHiddenConfig=false) // Heal recharge
PrimaryMelee=class'KFWeap_Knife_FieldMedic' PrimaryMelee=class'KFWeap_Knife_FieldMedic'
PrimaryWeapon=class'KFWeap_Pistol_Medic' PrimaryWeapon=None
PerkGrenade=class'KFProj_MedicGrenade' PerkGrenade=class'KFProj_MedicGrenade'
SuperGrenade=class'ExtProj_SUPERMedGrenade' SuperGrenade=class'ExtProj_SUPERMedGrenade'
SecondaryWeaponDef=class'ExtWeapDef_MedicPistol'
PrimaryWeaponDef=class'KFWeapDef_MedicPistol' PrimaryWeaponDef=None
KnifeWeaponDef=class'KFWeapDef_Knife_Medic' KnifeWeaponDef=class'KFWeapDef_Knife_Medic'
GrenadeWeaponDef=class'KFWeapDef_Grenade_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')
} }

View File

@ -1,7 +1,8 @@
Class Ext_PerkRhythmPerkBase extends Ext_PerkBase; Class Ext_PerkRhythmPerkBase extends Ext_PerkBase;
var byte HeadShotComboCount,MaxRhythmCombo,MissComboCount; var byte HeadShotComboCount,MaxRhythmCombo;
var float RhythmComboDmg; 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<KFDamageType> DamageType, optional int HitZoneIdx ) simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCauser, optional KFPawn_Monster MyKFPM, optional KFPlayerController DamageInstigator, optional class<KFDamageType> DamageType, optional int HitZoneIdx )
{ {
@ -19,59 +20,51 @@ final function ResetRhythm()
MaxRhythmCombo = 0; MaxRhythmCombo = 0;
HeadShotComboCount = 0; HeadShotComboCount = 0;
RhythmComboDmg = 0; RhythmComboDmg = 0;
MissComboCount = 0;
HeadShotMessage(0,true,1); HeadShotMessage(0,true,1);
} }
function SubstractHeadShotCombo()
{
if( HeadShotComboCount > 0 )
UpdateDmgScale(false);
else
ClearTimer( nameOf( SubstractHeadShotCombo ) );
}
final function UpdateDmgScale( bool bUp ) final function UpdateDmgScale( bool bUp )
{ {
if( bUp ) if( bUp )
{ {
MissComboCount = 0; HeadShotComboCount = Min(HeadShotComboCount+1,MaxRhythmCombo);
HeadShotComboCount = Min(HeadShotComboCount+1,255);
HeadShotMessage(HeadShotComboCount,false,MaxRhythmCombo); HeadShotMessage(HeadShotComboCount,false,MaxRhythmCombo);
SetTimer( HeadShotCountdownIntervall, true, nameOf( SubstractHeadShotCombo ) );
} }
else if( HeadShotComboCount>0 && ++MissComboCount==3 ) else if( HeadShotComboCount>0)
{ {
--HeadShotComboCount; --HeadShotComboCount;
HeadShotMessage(HeadShotComboCount,true,MaxRhythmCombo); HeadShotMessage(HeadShotComboCount,true,MaxRhythmCombo);
MissComboCount = 0;
} }
else return; else return;
RhythmComboDmg = FMin(HeadShotComboCount,MaxRhythmCombo)*0.075; RhythmComboDmg = HeadShotComboCount*0.075;
} }
function UpdatePerkHeadShots( ImpactInfo Impact, class<DamageType> DamageType, int NumHit ) function UpdatePerkHeadShots( ImpactInfo Impact, class<DamageType> DamageType, int NumHit )
{ {
local int HitZoneIdx; local int HitZoneIdx;
local KFPawn_Monster KFPM; local KFPawn_Monster KFPM;
// `log("RACKEMUP" @ GetScriptTrace());
if( MaxRhythmCombo<=0 ) if( MaxRhythmCombo<=0 )
return; return;
KFPM = KFPawn_Monster(Impact.HitActor); KFPM = KFPawn_Monster(Impact.HitActor);
if( KFPM==none || KFPM.GetTeamNum()==0 ) if( KFPM==none || KFPM.GetTeamNum()==0 )
{
if( NumHit < 1 && HeadShotComboCount>0 )
UpdateDmgScale(false);
return; return;
}
HitZoneIdx = KFPM.HitZones.Find('ZoneName', Impact.HitInfo.BoneName); HitZoneIdx = KFPM.HitZones.Find('ZoneName', Impact.HitInfo.BoneName);
if( HitZoneIdx == HZI_Head && KFPM.IsAliveAndWell() ) if( HitZoneIdx == HZI_Head && KFPM.IsAliveAndWell() )
{ {
if( class<KFDamageType>(DamageType)!=None if( class<KFDamageType>(DamageType)!=None && (class<KFDamageType>(DamageType).Default.ModifierPerkList.Find(BasePerk)>=0))
&& (class<KFDamageType>(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'))
UpdateDmgScale(true); 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 ) 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 defaultproperties
{ {
HeadShotCountdownIntervall=2.f
} }

View File

@ -27,11 +27,12 @@ defaultproperties
{ {
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Sharpshooter' PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Sharpshooter'
DefTraitList.Add(class'Ext_TraitWPSharp') DefTraitList.Add(class'Ext_TraitWPSharp')
DefTraitList.Add(class'Ext_TraitRackEmUp')
DefTraitList.Add(class'Ext_TraitRanger') DefTraitList.Add(class'Ext_TraitRanger')
DefTraitList.Add(class'Ext_TraitDireReload') DefTraitList.Add(class'Ext_TraitDireReload')
DefTraitList.Add(class'Ext_TraitEliteReload') DefTraitList.Add(class'Ext_TraitEliteReload')
BasePerk=class'KFPerk_Sharpshooter' BasePerk=class'KFPerk_Sharpshooter'
DefPerkStats(1)=(Progress=0.25)
DefPerkStats(19)=(bHiddenConfig=false)
PrimaryMelee=class'KFWeap_Knife_Sharpshooter' PrimaryMelee=class'KFWeap_Knife_Sharpshooter'
PrimaryWeapon=class'KFWeap_Rifle_Winchester1894' PrimaryWeapon=class'KFWeap_Rifle_Winchester1894'

View File

@ -2,8 +2,26 @@ Class Ext_TraitMedicPistol extends Ext_TraitBase;
static function AddDefaultInventory( KFPawn Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data ) static function AddDefaultInventory( KFPawn Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data )
{ {
Player.DefaultInventory.RemoveItem(class'ExtWeap_Pistol_9mm'); local int i;
Player.DefaultInventory.AddItem(class'ExtWeap_Pistol_MedicS'); 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 defaultproperties

View File

@ -5,7 +5,7 @@ var KFGUI_NumericBox StatCountBox;
var KFGUI_Button AddButton; var KFGUI_Button AddButton;
var Ext_PerkBase MyPerk; var Ext_PerkBase MyPerk;
var int StatIndex,OldValue,CurrentCost; var int StatIndex,OldValue,CurrentCost,MaxStatValue;
var string ProgressStr; var string ProgressStr;
var bool bCostDirty; var bool bCostDirty;
@ -42,7 +42,10 @@ function Timer()
{ {
bCostDirty = false; bCostDirty = false;
OldValue = MyPerk.PerkStats[StatIndex].CurrentValue; 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 ) function BuyStatPoint( KFGUI_Button Sender )
@ -51,8 +54,13 @@ function BuyStatPoint( KFGUI_Button Sender )
} }
function EditBoxChange( KFGUI_EditBox 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()); ProgressStr = ChopExtraDigits(MyPerk.PerkStats[StatIndex].Progress * StatCountBox.GetValueInt());
MaxStatValue = MyPerk.PerkStats[StatIndex].MaxValue;
bCostDirty = true; bCostDirty = true;
Timer(); Timer();
} }
@ -68,8 +76,12 @@ final function CheckBuyLimit()
// Make the value clamped. // Make the value clamped.
StatCountBox.ChangeValue(StatCountBox.Value); 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()); ProgressStr = ChopExtraDigits(MyPerk.PerkStats[StatIndex].Progress * StatCountBox.GetValueInt());
MaxStatValue = MyPerk.PerkStats[StatIndex].MaxValue;
// Disable button if can not buy anymore. // Disable button if can not buy anymore.
AddButton.SetDisabled(i==0); AddButton.SetDisabled(i==0);

View File

@ -3,11 +3,11 @@ Class UI_MidGameMenu extends KFGUI_FloatingWindow;
var KFGUI_SwitchMenuBar PageSwitcher; var KFGUI_SwitchMenuBar PageSwitcher;
var array< class<KFGUI_Base> > Pages; var array< class<KFGUI_Base> > Pages;
var KFGUI_Button AdminButton,SpectateButton; var KFGUI_Button AdminButton,SpectateButton,SkipTraderButton;
var transient KFGUI_Button PrevButton; var transient KFGUI_Button PrevButton;
var transient int NumButtons,NumButtonRows; var transient int NumButtons,NumButtonRows;
var transient bool bInitSpectate,bOldSpectate; var transient bool bInitSpectate,bOldSpectate,bInitSkipTrader;
function InitMenu() function InitMenu()
{ {
@ -20,10 +20,11 @@ function InitMenu()
// TODO: localize // TODO: localize
AddMenuButton('Mapvote',"Map Vote","Show mapvote menu"); AddMenuButton('Mapvote',"Map Vote","Show mapvote menu");
AddMenuButton('Settings',"Settings","Enter the game settings"); 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',"",""); SpectateButton = AddMenuButton('Spectate',"","");
AddMenuButton('Close',"Close","Close this menu"); 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<Pages.Length; ++i ) for( i=0; i<Pages.Length; ++i )
{ {
@ -41,6 +42,7 @@ function Timer()
if( PRI==None ) if( PRI==None )
return; return;
AdminButton.SetDisabled(!PRI.bAdmin && PRI.WorldInfo.NetMode==NM_Client); AdminButton.SetDisabled(!PRI.bAdmin && PRI.WorldInfo.NetMode==NM_Client);
SkipTraderButton.SetDisabled(!SkipTraderIsAviable(PRI));
if( !bInitSpectate || bOldSpectate!=PRI.bOnlySpectator ) if( !bInitSpectate || bOldSpectate!=PRI.bOnlySpectator )
{ {
bInitSpectate = true; bInitSpectate = true;
@ -50,10 +52,32 @@ 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);
if (KFGRI.bMatchHasBegun && KFGRI.bTraderIsOpen && KFPRI.bHasSpawnedIn)
{
return !bInitSkipTrader;
}
else
{
bInitSkipTrader=false;
return false;
}
}
function ShowMenu() function ShowMenu()
{ {
Super.ShowMenu(); Super.ShowMenu();
AdminButton.SetDisabled(true); AdminButton.SetDisabled(true);
SkipTraderButton.SetDisabled(false);
if( GetPlayer().WorldInfo.GRI!=None ) if( GetPlayer().WorldInfo.GRI!=None )
WindowTitle = GetPlayer().WorldInfo.GRI.ServerName; WindowTitle = GetPlayer().WorldInfo.GRI.ServerName;
//KFGFxHudWrapper(GetPlayer().MyHUD).SetVisible(false); //KFGFxHudWrapper(GetPlayer().MyHUD).SetVisible(false);
@ -91,6 +115,11 @@ function ButtonClicked( KFGUI_Button Sender )
ExtPlayerController(GetPlayer()).ChangeSpectateMode(!bOldSpectate); ExtPlayerController(GetPlayer()).ChangeSpectateMode(!bOldSpectate);
DoClose(); DoClose();
break; break;
case 'SkipTrader':
KFPlayerController(GetPlayer()).RequestSkipTrader();
bInitSkipTrader=true;
SkipTraderButton.SetDisabled(true);
break;
} }
} }
final function OpenUpMapvote() final function OpenUpMapvote()
@ -143,6 +172,7 @@ defaultproperties
Pages.Add(Class'UIP_AdminMenu') Pages.Add(Class'UIP_AdminMenu')
Pages.Add(Class'UIP_About') Pages.Add(Class'UIP_About')
Pages.Add(Class'UIP_MiniGame') Pages.Add(Class'UIP_MiniGame')
bInitSkipTrader=false
Begin Object Class=KFGUI_SwitchMenuBar Name=MultiPager Begin Object Class=KFGUI_SwitchMenuBar Name=MultiPager
ID="Pager" ID="Pager"

View File

@ -10,6 +10,14 @@ struct FInventory
var class<Inventory> ItemClass; var class<Inventory> ItemClass;
var int Values[4]; 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 struct FSavedInvEntry
{ {
var Controller OwnerPlayer; var Controller OwnerPlayer;
@ -19,6 +27,7 @@ struct FSavedInvEntry
var array<FSavedInvEntry> PlayerInv; var array<FSavedInvEntry> PlayerInv;
var config array<string> PerkClasses,CustomChars,AdminCommands,CustomItems,BonusGameSongs,BonusGameFX; var config array<string> PerkClasses,CustomChars,AdminCommands,CustomItems,BonusGameSongs,BonusGameFX;
var config array<CFGCustomZedXP> CustomZedXP;
var array< class<Ext_PerkBase> > LoadedPerks; var array< class<Ext_PerkBase> > LoadedPerks;
var array<FCustomCharEntry> CustomCharList; var array<FCustomCharEntry> CustomCharList;
var ExtPlayerStat ServerStatLoader; var ExtPlayerStat ServerStatLoader;
@ -55,6 +64,14 @@ var config bool bDontUseOriginalWeaponry;
var config bool bAllowStandartPistolUpgrade; var config bool bAllowStandartPistolUpgrade;
var config bool bDisableCustomTrader; var config bool bDisableCustomTrader;
//Custom XP lightly array
struct CustomZedXPStruct
{
var class<KFPawn_Monster> zedclass;
var float XPValues[4];
};
var array<CustomZedXPStruct> CustomZedXPArray;
function PostBeginPlay() function PostBeginPlay()
{ {
local xVotingHandler MV; local xVotingHandler MV;
@ -66,7 +83,6 @@ function PostBeginPlay()
local Object O; local Object O;
local string S; local string S;
local bool bLock; local bool bLock;
local KFPickupFactory_Item ItemFactory;
Super.PostBeginPlay(); Super.PostBeginPlay();
if( WorldInfo.Game.BaseMutator==None ) if( WorldInfo.Game.BaseMutator==None )
@ -243,21 +259,53 @@ function PostBeginPlay()
if( bDumpXMLStats ) if( bDumpXMLStats )
FileOutput = Spawn(class'ExtXMLOutput'); FileOutput = Spawn(class'ExtXMLOutput');
// Disable 9mm and medpistol in all PickupFactories UpdateCustomZedXPArray();
foreach AllActors(class'KFPickupFactory_Item', ItemFactory) // 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<CustomZedXP.Length;i++)
{ {
for(i=0;i<ItemFactory.ItemPickups.Length;i++) zedxp.zedclass = class<KFPawn_Monster>(DynamicLoadObject(CustomZedXP[i].zed,Class'Class'));
if(zedxp.zedclass == none)
{ {
if(ItemFactory.ItemPickups[i].ItemClass == class'KFGameContent.KFWeap_Pistol_9mm' `log("Error loading"@CustomZedXP[i].zed);
|| ItemFactory.ItemPickups[i].ItemClass == class'KFGameContent.KFWeap_Pistol_Medic') continue;
{
ItemFactory.ItemPickups.Remove(i, 1);
break;
}
} }
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<ItemFactory.ItemPickups.Length;i++)
// {
// 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;
// }
// }
// }
// }
function EditTraiderItems() function EditTraiderItems()
{ {
local int i; local int i;
@ -266,7 +314,6 @@ function EditTraiderItems()
// local STraderItem SI; // local STraderItem SI;
// var config bool bDLCWeaponsForFree; // var config bool bDLCWeaponsForFree;
// var config bool bDontUseOriginalWeaponry; // var config bool bDontUseOriginalWeaponry;
if(!bDontUseOriginalWeaponry) if(!bDontUseOriginalWeaponry)
{ {
Trad = KFGameReplicationInfo(WorldInfo.GRI).TraderItems; Trad = KFGameReplicationInfo(WorldInfo.GRI).TraderItems;
@ -418,6 +465,7 @@ function CheckWave()
function NotifyWaveChange() function NotifyWaveChange()
{ {
local ExtPlayerController ExtPC; local ExtPlayerController ExtPC;
local KFProj_RicochetStickBullet KFBolt;
if( bRespawnCheck ) if( bRespawnCheck )
{ {
@ -437,6 +485,13 @@ function NotifyWaveChange()
foreach WorldInfo.AllControllers(class'ExtPlayerController',ExtPC) foreach WorldInfo.AllControllers(class'ExtPlayerController',ExtPC)
ExtPC.bSetPerk = false; 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() function SetupWebAdmin()
{ {
@ -551,14 +606,28 @@ function ScoreKill(Controller Killer, Controller Killed)
KFPC = KFPlayerController(DamagerKFPRI.Owner); KFPC = KFPlayerController(DamagerKFPRI.Owner);
if( KFPC != none ) if( KFPC != none )
{ {
`log("ScoreKill:"@PathName(KFM));
XP = 0;
for(j=0;j<CustomZedXPArray.Length;j++)
{
if(KFM.Class == CustomZedXPArray[j].zedclass)
{
XP = CustomZedXPArray[j].XPValues[MyKFGI.GameDifficulty];
break;
}
}
if(XP == 0)
XP = KFM.static.GetXPValue(MyKFGI.GameDifficulty);
InstigatorPerk = KFPC.GetPerk(); InstigatorPerk = KFPC.GetPerk();
if( InstigatorPerk.ShouldGetAllTheXP() ) if( InstigatorPerk.ShouldGetAllTheXP() )
{ {
KFPC.OnPlayerXPAdded(KFM.static.GetXPValue(MyKFGI.GameDifficulty), InstigatorPerk.Class); KFPC.OnPlayerXPAdded(XP, InstigatorPerk.Class);
continue; continue;
} }
XP = KFM.static.GetXPValue(MyKFGI.GameDifficulty) / KFM.DamageHistory[i].DamagePerks.Length; XP /= KFM.DamageHistory[i].DamagePerks.Length;
for( j = 0; j < KFM.DamageHistory[i].DamagePerks.Length; j++ ) for( j = 0; j < KFM.DamageHistory[i].DamagePerks.Length; j++ )
{ {