1
0
This commit is contained in:
GenZmeY 2023-09-21 22:31:11 +03:00
parent ef3db8a926
commit ce182019df
Signed by: GenZmeY
GPG Key ID: 424DA4BC3CB2CF39
167 changed files with 5429 additions and 659 deletions

View File

@ -140,6 +140,7 @@ var databinding string Region;
//@HSL_END
var databinding bool bNoSeasonalSkins;
var databinding int WeeklySelectorIndex;
/** Represents a player in the game */
struct native PlayerResult
@ -186,4 +187,5 @@ defaultproperties
bServerExiled=false
//@SABER_END
bNoSeasonalSkins=false
WeeklySelectorIndex=-1
}

View File

@ -2315,6 +2315,7 @@ static function DumpGameSettings(const OnlineGameSettings GameSettings)
`Log(" bAllowJoinViaPresenceFriendsOnly: "$GameSettings.bAllowJoinViaPresenceFriendsOnly);
`Log(" GameState: "$GameSettings.GameState);
`Log(" bNoSeasonalSkins: "$GameSettings.bNoSeasonalSkins);
`Log(" WeeklySelectorIndex: "$GameSettings.WeeklySelectorIndex);
}
/**

View File

@ -2543,10 +2543,11 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
if ( damagetype == None )
{
if ( InstigatedBy == None )
/*if ( InstigatedBy == None )
`warn("No damagetype for damage with no instigator");
else
`warn("No damagetype for damage by "$instigatedby.pawn$" with weapon "$InstigatedBy.Pawn.Weapon);
*/
//scripttrace();
DamageType = class'DamageType';
}

View File

@ -38,6 +38,8 @@ var bool bHaveGoal;
/** A randomized distance outside of the target goal to stop at */
var float GoalOffset;
var bool bUseRandomDirection;
/*********************************************************************************************
* Initialization
********************************************************************************************* */
@ -47,7 +49,8 @@ static function bool FleeFrom(
actor inFleeTarget,
optional float inFleeDuration,
optional float inFleeDistance=5000,
optional bool bShouldStopAtGoal=false )
optional bool bShouldStopAtGoal=false,
optional bool bHasToUseRandomDirection=false )
{
local AICommand_Flee Cmd;
@ -60,6 +63,7 @@ static function bool FleeFrom(
Cmd.FleeDistance = inFleeDistance;
Cmd.FleeDuration = inFleeDuration;
Cmd.bStopAtGoal = bShouldStopAtGoal;
Cmd.bUseRandomDirection = bHasToUseRandomDirection;
AI.PushCommand(Cmd);
return true;
}
@ -113,6 +117,84 @@ function Popped()
EnableMeleeRangeEventProbing();
}
function vector GetRandomFleeVector()
{
local vector VectorReference, VectorReferenceRotated, RandVector, HitLocation, HitNormal, Destination, DestinationRotated, AxxisRotation;
local Actor HitActor;
local int i, NumIterations;
local float Angle, LengthFlee;
local Quat R;
// Start on the bearing of the FleeTarget, check for collision then explore to the sides rotating that vector
VectorReference = Normal(Pawn.Location - FleeTarget.Location);
VectorReference.z = 0.f;
RandVector = VectorReference;
LengthFlee = 300.f;
//LengthFlee = FleeDistance;
Destination = Pawn.Location + VectorReference * LengthFlee;
HitActor = Trace(HitLocation, HitNormal, Destination, Pawn.Location, true,,, TRACEFLAG_Blocking);
if (HitActor != none && KFPawnBlockingVolume(HitActor) != none)
{
//HitActor.DrawDebugLine(Pawn.Location, Destination, 255, 0, 0, true );
Angle = 15.f * DegToRad;
NumIterations = 180.f * DegToRad / Angle;
AxxisRotation.x = 0.f;
AxxisRotation.y = 0.f;
AxxisRotation.z = 1.f;
for (i = 1; i < NumIterations; ++i)
{
// Left
R = QuatFromAxisAndAngle(AxxisRotation, i * Angle);
VectorReferenceRotated = Normal(QuatRotateVector(R, VectorReference));
DestinationRotated = Pawn.Location + VectorReferenceRotated * LengthFlee;
HitActor = Trace(HitLocation, HitNormal, DestinationRotated, Pawn.Location, true,,, TRACEFLAG_Blocking);
if (HitActor != none && KFPawnBlockingVolume(HitActor) != none)
{
//Pawn.DrawDebugLine(Pawn.Location, DestinationRotated, 255, 255, 0, true );
}
else
{
RandVector = DestinationRotated;
break;
}
// Right
R = QuatFromAxisAndAngle(AxxisRotation, - i * Angle);
VectorReferenceRotated = Normal(QuatRotateVector(R, VectorReference));
DestinationRotated = Pawn.Location + VectorReferenceRotated * LengthFlee;
HitActor = Trace(HitLocation, HitNormal, DestinationRotated, Pawn.Location, true,,, TRACEFLAG_Blocking);
if (HitActor != none && KFPawnBlockingVolume(HitActor) != none)
{
//Pawn.DrawDebugLine(Pawn.Location, DestinationRotated, 0, 255, 255, true );
}
else
{
RandVector = DestinationRotated;
break;
}
}
}
//Pawn.DrawDebugLine(Pawn.Location, Pawn.Location + RandVector * LengthFlee, 0, 255, 0, true );
return Normal(RandVector);
}
/*********************************************************************************************
* Hiding state
********************************************************************************************* */
@ -129,6 +211,7 @@ state Fleeing
function bool CheckRetreat()
{
local EPathSearchType OldSearchType;
local vector RandVector;
if( RouteGoal != none && bHaveGoal )
{
@ -154,13 +237,27 @@ state Fleeing
AIActionStatus = "Searching for navigable path from ["$FleeTarget$"]";
Pawn.PathSearchType = PST_Constraint;
class'Path_AlongLine'.static.AlongLine( Pawn, Normal(Pawn.Location - FleeTarget.Location) );
class'Goal_AwayFromPosition'.static.FleeFrom( Pawn, FleeTarget.Location, FleeDistance );
if (bUseRandomDirection)
{
MyKFPawn.SetSprinting( true );
RandVector = GetRandomFleeVector();
class'Path_AlongLine'.static.AlongLine( Pawn, RandVector );
class'Goal_Random'.static.FindRandom( Pawn );
}
else
{
class'Path_AlongLine'.static.AlongLine( Pawn, Normal(Pawn.Location - FleeTarget.Location) );
class'Goal_AwayFromPosition'.static.FleeFrom( Pawn, FleeTarget.Location, FleeDistance );
}
if( FindPathToward( Pawn ) != None )
{
//Pawn.DrawDebugLine( RouteGoal.Location, Pawn.Location, 255, 80, 80, true );
//Pawn.DrawDebugSphere( RouteGoal.Location, 128, 4, 255, 80, 80, true );
bHaveGoal = true;
AIActionStatus = "Attempting to flee from ["$FleeTarget$"] at ["$RouteGoal$"]";
Focus = none;
@ -281,4 +378,5 @@ Begin:
DefaultProperties
{
bAllowedToAttack=false
bUseRandomDirection=false
}

View File

@ -24,6 +24,14 @@ static function bool Taunt( KFAIController AI, optional Pawn inTauntTarget, opti
if( AI != None )
{
if (AI.MyKFPawn != none)
{
if (AI.MyKFPawn.bIsBountyHuntObjective)
{
return false;
}
}
Cmd = new(AI) default.class;
if( Cmd != None )
{

View File

@ -2800,9 +2800,10 @@ function DoFleeFrom( actor FleeFrom,
optional float FleeDuration,
optional float FleeDistance,
optional bool bShouldStopAtGoal=false,
optional bool bFromFear=false )
optional bool bFromFear=false,
optional bool bUseRandomDirection=false )
{
class'AICommand_Flee'.static.FleeFrom( self, FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal );
class'AICommand_Flee'.static.FleeFrom( self, FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bUseRandomDirection );
}
/*
@ -5555,6 +5556,11 @@ function HardCoreCheckStuckTimer()
function bool AmIAllowedToSuicideWhenStuck()
{
if (MyKFPawn.bIsBountyHuntObjective)
{
return false;
}
return true;
}

View File

@ -1609,11 +1609,12 @@ function DoFleeFrom( actor FleeFrom,
optional float FleeDuration,
optional float FleeDistance,
optional bool bShouldStopAtGoal=false,
optional bool bFromFear=false )
optional bool bFromFear=false,
optional bool bUseRandomDirection=false )
{
if( !bFromFear || !MyHansPawn.bInHuntAndHealMode )
{
super.DoFleeFrom( FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bFromFear );
super.DoFleeFrom( FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bFromFear, bUseRandomDirection );
}
}

View File

@ -110,6 +110,7 @@ enum EAIType
AT_EDAR_EMP,
AT_EDAR_Laser,
AT_EDAR_Rocket,
AT_HansClot
};
/** IDs into the BossAIClassList array */
@ -234,6 +235,8 @@ static function string ZedTypeToString(EAIType AiTypeToConvert)
return "Husk";
case AT_BossRandom:
return "Hans";
case AT_HansClot:
return "HansClot";
}
return "CLOT";
`endif
@ -479,7 +482,7 @@ function GetSpawnListFromSquad(byte SquadIdx, out array< KFAISpawnSquad > Squads
else
`endif
//Always have the squad type be a boss if we're spawning one in case of override
if (OutbreakEvent.ActiveEvent.bBossRushMode)
if (OutbreakEvent != none && OutbreakEvent.ActiveEvent.bBossRushMode)
{
RandBossIndex = Rand(BossRushEnemies.length);
TempSpawnList.AddItem( default.AIBossClassList[BossRushEnemies[RandBossIndex]]);

View File

@ -118,7 +118,7 @@ function float GetDamageModifier()
defaultproperties
{
DissipationRate=10
DissipationRate=50
bNeedsTick=true
MaxStack=3
@ -126,7 +126,7 @@ defaultproperties
EffectAppliedByStack=0.3f
ApplyEffectVel= 1.0f // % per second
RemoveEffectVel= 1.0f // % per second
RemoveEffectVel= 0.9f // % per second
CurrentStack=0
CurrentEffectApplied=0.0f

View File

@ -171,7 +171,7 @@ defaultproperties
EffectAppliedByStack=1.0f
ApplyEffectVel=100.0f // % per second
RemoveEffectVel=0.25f // % per second
RemoveEffectVel=0.5f // % per second
CurrentEffect=0.0f
CurrentEffectApplied=0.0f

View File

@ -32,7 +32,7 @@ var int DoshBuffer;
var int ArmorMagSize; // Percentage of armor bought individually
function Initialize(optional bool bInitOwnedItems = true)
function Initialize(optional bool bInitializeOwned = true)
{
if( Pawn != none && PlayerReplicationInfo != none )
{
@ -42,10 +42,11 @@ function Initialize(optional bool bInitOwnedItems = true)
if( MyKFPRI != none && MyKFIM != none )
{
// Grab the weapons in our inventory and add them to a stored array called OwnedItemList
if (bInitOwnedItems)
if (bInitializeOwned)
{
InitializeOwnedItemList();
}
TotalBlocks = MyKFIM.CurrentCarryBlocks;
TotalDosh = MyKFPRI.Score;
MaxBlocks = MyKFIM.MaxCarryBlocks;
@ -989,17 +990,36 @@ function Int GetAutoFillCost()
@Name - General
*******************/
function InitializeOwnedGrenade()
{
local bool AllowGrenades;
local KFPawn_Human KFP;
AllowGrenades = KFGameReplicationInfo( WorldInfo.GRI ).bAllowGrenadePurchase;
KFP = KFPawn_Human( Pawn );
if( KFP != none )
{
// init grenade purchase values
GrenadeItem.SpareAmmoCount = MyKFIM.GrenadeCount;
GrenadeItem.MaxSpareAmmo = AllowGrenades ? KFP.GetPerk().MaxGrenadeCount : 0;
GrenadeItem.AmmoPricePerMagazine = TraderItems.GrenadePrice;
GrenadeItem.DefaultItem.WeaponDef = CurrentPerk.GetGrenadeWeaponDef();
// @temp: fill in stuff that is normally serialized in the archetype
GrenadeItem.DefaultItem.AssociatedPerkClasses[0] = CurrentPerk.Class;
}
}
function InitializeOwnedItemList()
{
local Inventory Inv;
local KFWeapon KFW;
local KFPawn_Human KFP;
local bool AllowGrenades;
OwnedItemList.length = 0;
TraderItems = KFGameReplicationInfo( WorldInfo.GRI ).TraderItems;
AllowGrenades = KFGameReplicationInfo( WorldInfo.GRI ).bAllowGrenadePurchase;
KFP = KFPawn_Human( Pawn );
if( KFP != none )
@ -1010,14 +1030,7 @@ function InitializeOwnedItemList()
ArmorItem.AmmoPricePerMagazine = TraderItems.ArmorPrice * CurrentPerk.GetArmorDiscountMod();
ArmorItem.DefaultItem.WeaponDef = TraderItems.ArmorDef;
// init grenade purchase values
GrenadeItem.SpareAmmoCount = MyKFIM.GrenadeCount;
GrenadeItem.MaxSpareAmmo = AllowGrenades ? KFP.GetPerk().MaxGrenadeCount : 0;
GrenadeItem.AmmoPricePerMagazine = TraderItems.GrenadePrice;
GrenadeItem.DefaultItem.WeaponDef = CurrentPerk.GetGrenadeWeaponDef();
// @temp: fill in stuff that is normally serialized in the archetype
GrenadeItem.DefaultItem.AssociatedPerkClasses[0] = CurrentPerk.Class;
InitializeOwnedGrenade();
for ( Inv = MyKFIM.InventoryChain; Inv != none; Inv = Inv.Inventory )
{
@ -1387,7 +1400,8 @@ function RemoveWeaponFromOwnedItemList( optional int OwnedListIdx = INDEX_NONE,
// add a single to owned items when removing a dual
//if( ItemInfo.DefaultItem.SingleClassName != '' )
if( ItemInfo.DefaultItem.SingleClassName == 'KFWeap_Pistol_9mm' )
if( ItemInfo.DefaultItem.SingleClassName == 'KFWeap_Pistol_9mm'
|| ItemInfo.DefaultItem.SingleClassName == 'KFWeap_HRG_93R' )
{
// When removing a dual, always add a single to the owned list so that it shows up in the player inventory UI.
// If we don't own the single, then also buy it (add it to the transaction list).

View File

@ -5063,6 +5063,10 @@ function class<KFPawn_Monster> LoadMonsterByName(string ZedName, optional bool b
{
SpawnClass = class<KFPawn_Monster>(DynamicLoadObject("KFGameContent.KFPawn_ZedHusk_New"$VersusSuffix, class'Class'));
}
else if (Left(ZedName, 5) ~= "HansC")
{
SpawnClass = class<KFPawn_Monster>(DynamicLoadObject("KFGameContent.KFPawn_ZedHansClot" $ VersusSuffix, class'Class'));
}
else if( Left(ZedName, 2) ~= "Ha" )
{
SpawnClass = class<KFPawn_Monster>(DynamicLoadObject("KFGameContent.KFPawn_ZedHans"$VersusSuffix, class'Class'));

View File

@ -33,6 +33,7 @@ var localized array<string> PermissionStrings;
var localized array<string> ConsolePermissionStrings;
var localized array<string> ModeStrings;
var localized array<string> AllowSeasonalSkinsStrings;
var localized array<string> WeeklySelectorStrings;
var localized string TeamSwappedString;
var localized string NoPreferenceString;
@ -200,11 +201,26 @@ static function string GetAllowSeasonalSkinsString( float Index )
return default.NoPreferenceString;
}
static function string GetWeeklySelectorString( float Index )
{
if( 0 < default.WeeklySelectorStrings.length && Index < default.WeeklySelectorStrings.length )
{
return default.WeeklySelectorStrings[Index];
}
return default.NoPreferenceString;
}
static function array<string> GetAllowSeasonalSkinsStringsArray()
{
return default.AllowSeasonalSkinsStrings;
}
static function array<string> GetWeeklySelectorStringsArray()
{
return default.WeeklySelectorStrings;
}
static function array<string> GetGameModeStringsArray()
{
return default.ModeStrings;

View File

@ -363,6 +363,11 @@ static function int GetDamageeDialogID()
return INDEX_NONE;
}
/** Called when damage is dealt to apply additional instant damage */
static function ModifyInstantDamage( KFPawn Victim, out int DamageTaken, optional Controller InstigatedBy )
{
}
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
{

View File

@ -389,6 +389,11 @@ function GiveTo(Pawn P)
local Inventory NewInventory;
local KFInventoryManager KFIM;
local KFGameReplicationInfo KFGRI;
local class<Inventory> NewInventoryClass;
NewInventoryClass = InventoryClass;
// For HRG93R and 9mm pistols, if one of the other type is picked just give the one owned
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
if (KFGRI != none && KFGRI.bIsEndlessPaused)
@ -399,10 +404,33 @@ function GiveTo(Pawn P)
KFIM = KFInventoryManager(P.InvManager);
if (KFIM != None)
{
KFWInvClass = class<KFWeapon>(InventoryClass);
if (KFIM.Is9mmInInventory())
{
if (InventoryClass.name == 'KFWeap_HRG_93R')
{
NewInventoryClass = class<Weapon>(DynamicLoadObject(class'KfWeapDef_9mm'.default.WeaponClassPath, class'Class'));
}
else if (InventoryClass.name == 'KFWeap_HRG_93R_Dual')
{
NewInventoryClass = class<Weapon>(DynamicLoadObject(class'KfWeapDef_9mmDual'.default.WeaponClassPath, class'Class'));
}
}
else
{
if(InventoryClass.name == 'KFWeap_Pistol_9mm')
{
NewInventoryClass = class<Weapon>(DynamicLoadObject(class'KFWeapDef_HRG_93R'.default.WeaponClassPath, class'Class'));
}
else if (InventoryClass.name == 'KFWeap_Pistol_Dual9mm')
{
NewInventoryClass = class<Weapon>(DynamicLoadObject(class'KFWeapDef_HRG_93R_Dual'.default.WeaponClassPath, class'Class'));
}
}
KFWInvClass = class<KFWeapon>(NewInventoryClass);
foreach KFIM.InventoryActors(class'KFWeapon', KFW)
{
if (KFW.Class == InventoryClass)
if (KFW.Class == NewInventoryClass)
{
// if this isn't a dual-wield class, then we can't carry another
if (KFW.DualClass == none)
@ -426,7 +454,7 @@ function GiveTo(Pawn P)
return;
}
NewInventory = KFIM.CreateInventory(InventoryClass, true);
NewInventory = KFIM.CreateInventory(NewInventoryClass, true);
if (NewInventory != none)
{
// Added extra check in case we want to pick up a non-weapon based pickup

View File

@ -128,6 +128,7 @@ function UpdateWaveCount()
function UpdateZEDCount()
{
local int CurrentZEDCount;
local KFPlayerController_WeeklySurvival KFPC_WS;
if( KFGRI == none )
{
@ -149,6 +150,16 @@ function UpdateZEDCount()
// # of ZEDs left to kill in this wave.
CurrentZEDCount = KFGRI.AIRemaining;
if (KFGRI.IsBountyHunt())
{
KFPC_WS = KFPlayerController_WeeklySurvival(KFPC);
if (KFPC_WS != none)
{
CurrentZEDCount += KFPC_WS.BountyHuntCurrentExtraZeds;
}
}
if(LastZEDCount != CurrentZEDCount)
{
SetInt("remainingZEDs" ,CurrentZEDCount);

View File

@ -23,6 +23,7 @@ var KFPlayerController KFPC;
var const string LockIconPath;
var byte LastPerkIndex;
var byte PreviewPerkIndex;
VAR byte LastPerkLevel;
var class<KFPerk> PreviousPerk;
var localized string TierUnlockedText;
@ -83,7 +84,7 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
{
DetailsContainer = KFGFxPerksContainer_Details(Widget);//some reason this is coming out to none!
DetailsContainer.Initialize( self );
DetailsContainer.UpdateDetails(PerkClass, SelectedSkillsHolder, false, false);
DetailsContainer.UpdateDetails(PerkClass, SelectedSkillsHolder, false, false, true);
DetailsContainer.UpdatePassives(PerkClass);
}
break;
@ -228,6 +229,7 @@ event OnClose()
if (bModifiedWeaponIndexes)
{
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingWeapIdx, KFPC.SurvivalPerkWeapIndex );
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingSecondaryWeapIdx, KFPC.SurvivalPerkSecondaryWeapIndex );
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingGrenIdx, KFPC.SurvivalPerkGrenIndex );
}
@ -294,6 +296,8 @@ function PerkChanged( byte NewPerkIndex, bool bClickedIndex)
}
}
PreviewPerkIndex = NewPerkIndex;
UpdateContainers( KFPC.PerkList[NewPerkIndex].PerkClass, bClickedIndex );
}
}
@ -340,7 +344,7 @@ function UpdateContainers( class<KFPerk> PerkClass, optional bool bClickedIndex=
if( DetailsContainer != none )
{
DetailsContainer.UpdateDetails( PerkClass, SelectedSkillsHolder, false, false );
DetailsContainer.UpdateDetails( PerkClass, SelectedSkillsHolder, false, false, true );
DetailsContainer.UpdatePassives( PerkClass );
}
@ -480,10 +484,7 @@ function Callback_SkillSelected( byte TierIndex, byte SkillIndex )
UpdateSkillsUI(KFPC.PerkList[LastPerkIndex].PerkClass);
SavePerkData();
if ( KFPC.PerkList[LastPerkIndex].PerkClass.Name == 'KFPerk_Survivalist' )
{
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, false );
}
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, false, true );
}
}
@ -496,50 +497,207 @@ function Callback_SkillSelectionOpened()
}
}
function bool CanChooseWeapons()
{
local KFGameReplicationInfo KFGRI;
KFGRI = KFGameReplicationInfo(KFPC.WorldInfo.GRI);
if (KFPC != none)
{
if (KFPC.Pawn.IsAliveAndWell() == false
|| KFPC.PlayerReplicationInfo.bIsSpectator
|| KFPC.PlayerReplicationInfo.bOnlySpectator)
{
return true;
}
}
if (KFGRI != none)
{
if (KFGRI.WaveNum == 0)
{
if (KFGRI.bWaveStarted)
{
return false;
}
}
else
{
return false;
}
}
return true;
}
function OnPrevWeaponPressed()
{
local byte NewIndex;
local bool bUpdateUI;
if (CanChooseWeapons() == false)
{
return;
}
bUpdateUI = true;
if (GetPC().PlayerInput.bUsingGamepad)
{
if (PreviewPerkIndex != LastPerkIndex)
{
bUpdateUI = false;
}
}
NewIndex = KFPC.CurrentPerk.OnPrevWeaponSelected();
KFPC.SurvivalPerkWeapIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false );
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, true, false, bUpdateUI );
bModifiedWeaponIndexes=true;
}
function OnNextWeaponPressed()
{
local byte NewIndex;
local bool bUpdateUI;
if (CanChooseWeapons() == false)
{
return;
}
bUpdateUI = true;
if (GetPC().PlayerInput.bUsingGamepad)
{
if (PreviewPerkIndex != LastPerkIndex)
{
bUpdateUI = false;
}
}
NewIndex = KFPC.CurrentPerk.OnNextWeaponSelected();
KFPC.SurvivalPerkWeapIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, true );
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, false, true, bUpdateUI );
bModifiedWeaponIndexes=true;
}
function OnPrevSecondaryWeaponPressed()
{
local byte NewIndex;
local bool bUpdateUI;
if (CanChooseWeapons() == false)
{
return;
}
bUpdateUI = true;
if (GetPC().PlayerInput.bUsingGamepad)
{
if (PreviewPerkIndex != LastPerkIndex)
{
bUpdateUI = false;
}
}
NewIndex = KFPC.CurrentPerk.OnPrevSecondaryWeaponSelected();
KFPC.SurvivalPerkSecondaryWeapIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, true, false, bUpdateUI );
bModifiedWeaponIndexes=true;
}
function OnNextSecondaryWeaponPressed()
{
local byte NewIndex;
local bool bUpdateUI;
if (CanChooseWeapons() == false)
{
return;
}
bUpdateUI = true;
if (GetPC().PlayerInput.bUsingGamepad)
{
if (PreviewPerkIndex != LastPerkIndex)
{
bUpdateUI = false;
}
}
NewIndex = KFPC.CurrentPerk.OnNextSecondaryWeaponSelected();
KFPC.SurvivalPerkSecondaryWeapIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, false, true, bUpdateUI );
bModifiedWeaponIndexes=true;
}
function OnPrevGrenadePressed()
{
local byte NewIndex;
local bool bUpdateUI;
bUpdateUI = true;
if (GetPC().PlayerInput.bUsingGamepad)
{
if (PreviewPerkIndex != LastPerkIndex)
{
bUpdateUI = false;
}
}
NewIndex = KFPC.CurrentPerk.OnPrevGrenadeSelected();
KFPC.SurvivalPerkGrenIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false );
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, true, false, bUpdateUI );
bModifiedWeaponIndexes=true;
}
function OnNextGrenadePressed()
{
local byte NewIndex;
local bool bUpdateUI;
bUpdateUI = true;
if (GetPC().PlayerInput.bUsingGamepad)
{
if (PreviewPerkIndex != LastPerkIndex)
{
bUpdateUI = false;
}
}
NewIndex = KFPC.CurrentPerk.OnNextGrenadeSelected();
KFPC.SurvivalPerkGrenIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, true );
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, false, true, bUpdateUI );
bModifiedWeaponIndexes=true;
}
function OnDpadPressed(int Right)
{
if (GetPC().PlayerInput.bUsingGamepad)
{
if (Right > 0)
{
OnNextSecondaryWeaponPressed();
}
else
{
OnPrevSecondaryWeaponPressed();
}
}
}
event bool OnAxisModified( int ControllerId, name Key, float Delta, float DeltaTime, bool bGamepad )
{
if (GetPC().PlayerInput.bUsingGamepad )
@ -611,6 +769,7 @@ defaultproperties
SubWidgetBindings.Add((WidgetName="DetailsContainer",WidgetClass= class'KFGFxPerksContainer_Details'))
SubWidgetBindings.Add((WidgetName="SelectedPerkSummaryContainer",WidgetClass=class'KFGFxPerksContainer_SkillsSummary'))
LastPerkIndex=255
PreviewPerkIndex=255
LastPerkLevel=255
bAxisResetLeft=true

View File

@ -79,6 +79,11 @@ function LocalizeText()
{
local GFxObject TextObject;
local WorldInfo WI;
local bool bIsCustomWeekly;
local int IntendedWeeklyIndex, WeeklyIndex;
local KFPlayerController KFPC;
KFPC = KFPlayerController(GetPC());
WI = class'WorldInfo'.static.GetWorldInfo();
@ -90,7 +95,34 @@ function LocalizeText()
TextObject.SetString("xp", XPString);
TextObject.SetString("teamAwards", TeamAwardsString);
TextObject.SetString("dropTitle", ItemDropTitleString);
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
WeeklyIndex = -1;
if (KFPC.WorldInfo.NetMode == NM_Client)
{
if (KFGameReplicationInfo(WI.GRI) != none)
{
WeeklyIndex = KFGameReplicationInfo(WI.GRI).CurrentWeeklyIndex;
}
}
else
{
WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod();
}
if (WeeklyIndex != -1)
{
bIsCustomWeekly = IntendedWeeklyIndex != WeeklyIndex;
}
if (bIsCustomWeekly)
{
TextObject.SetString("dropTitle", "");
}
else
{
TextObject.SetString("dropTitle", ItemDropTitleString);
}
if(WI != none && WI.NetMode != NM_Standalone )
{

View File

@ -31,6 +31,7 @@ var localized string BackString;
var localized string ApplyString;
var localized string ResetString;
var localized string PingString;
var localized string WeeklyIndexString;
var localized string LengthString;
var localized string DifficultyString;
var localized string MapString;
@ -263,6 +264,12 @@ function Callback_PingFilter(int FilterIndex)
FiltersContainer.PingChanged(FilterIndex);
}
function Callback_WeeklySelectorChanged(int FilterIndex)
{
`log("WeeklySelector" @ FilterIndex, bLogServerBrowser);
FiltersContainer.WeeklySelectorChanged(FilterIndex);
}
function CallBack_SearchTabChanged(int TabIndex)
{
`log("SEARCH TAB CHANGED: " @TabIndex, bLogServerBrowser);

View File

@ -74,6 +74,8 @@ var KFGFxWidget_MapCounterText MapCounterTextWidget;
var KFGFxWidget_GunGame GunGameWidget;
// Widget that displays vip mode texts
var KFGFxWidget_VIP VIPWidget;
// Widget that displays bounty hunt mode texts
var KFGFxWidget_BountyHunt BountyHuntWidget;
var KFPlayerController KFPC;
@ -112,6 +114,9 @@ var transient bool bLastGunGameVisibility;
// VIP variables
var transient bool bLastVIPVisibility;
// Bounty Hunt variables
var transient bool bLastBountyHuntVisibility;
/** On creation of the HUD */
function Init(optional LocalPlayer LocPlay)
{
@ -372,6 +377,13 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
SetWidgetPathBinding( Widget, WidgetPath );
}
break;
case 'BountyHuntContainer':
if (BountyHuntWidget == none)
{
BountyHuntWidget = KFGFxWidget_BountyHunt(Widget);
SetWidgetPathBinding( Widget, WidgetPath );
}
break;
}
return true;
@ -400,12 +412,15 @@ function UpdateWeaponSelect()
/** Update all the unique HUD pieces */
function TickHud(float DeltaTime)
{
local bool bGunGameVisibility, bVIPModeVisibility;
local KFGameReplicationInfo KFGRI;
local bool bGunGameVisibility, bVIPModeVisibility, bBountyHuntVisibility;
if(KFPC == none || KFPC.WorldInfo.TimeSeconds - LastUpdateTime < UpdateInterval )
{
return;
}
KFGRI=KFGameReplicationInfo(KFPC.WorldInfo.GRI);
if (WaveInfoWidget != none)
{
@ -498,6 +513,26 @@ function TickHud(float DeltaTime)
bLastVIPVisibility = bVIPModeVisibility;
}
}
if (BountyHuntWidget != none)
{
bBountyHuntVisibility = KFPC.CanUseBountyHunt();
if (KFGRI.bWaveIsActive == false)
{
bBountyHuntVisibility = false;
}
else if (KFGRI.WaveNum == KFGRI.WaveMax)
{
bBountyHuntVisibility = false;
}
if (bBountyHuntVisibility != bLastBountyHuntVisibility)
{
BountyHuntWidget.UpdateBountyHuntVisibility(bBountyHuntVisibility);
bLastBountyHuntVisibility = bBountyHuntVisibility;
}
}
}
function UpdateObjectiveActive()
@ -1001,6 +1036,36 @@ simulated function DisplayObjectiveResults()
}
}
simulated function DisplayBountyHuntObjective(int Bounties)
{
local KFGameReplicationInfo KFGRI;
local GFxObject ObjectiveObject;
local string BountyHuntString;
KFGRI=KFGameReplicationInfo(KFPC.WorldInfo.GRI);
ObjectiveObject=CreateObject("Object");
ObjectiveObject.SetString("titleString", Localize("Objectives", "BountyHuntObjective", "KFGame"));
if (KFGRI.IsBountyHunt())
{
ObjectiveObject.SetString("nameString", Localize("Objectives", "BountyHuntObjective", "KFGame"));
BountyHuntString = Localize("Objectives", "BountyHuntObjectiveDescription", "KFGame")@Bounties@Localize("Objectives", "BountyHuntDescriptionAdd", "KFGame");
ObjectiveObject.SetString("descString", BountyHuntString);
ObjectiveObject.SetString("iconPath", "img://"$PathName(Texture2D'WeeklyObjective_UI.BountyHunt'));
}
ObjectiveObject.SetBool("isBonus", false);
KFGRI.PreviousObjectiveResult=INDEX_NONE;
PriorityMessageContainer.SetObject("objectiveMessage", ObjectiveObject);
LastMessageType=GMT_Null;
}
simulated function DisplayNewObjective()
{
local KFGameReplicationInfo KFGRI;
@ -1022,7 +1087,6 @@ simulated function DisplayNewObjective()
ObjectiveObject.SetString("nameString", Localize("Objectives", "ContaminationModeObjective", "KFGame"));
ObjectiveObject.SetString("descString", Localize("Objectives", "ContaminationModeDescription", "KFGame"));
// TODO :: CHANGE ICON
ObjectiveObject.SetString("iconPath", "img://"$PathName(ObjectiveInterface.GetIcon()));
}
else
@ -1249,6 +1313,14 @@ function HideContaminationMode()
}
}
function DisplayBountyHuntStatus(int Bounties, int Dosh, int DoshNoAssist)
{
if (BountyHuntWidget != none)
{
BountyHuntWidget.SetData(Bounties, Dosh, DoshNoAssist);
}
}
function ResetSyringe(float Ammo, float MaxAmmo)
{
if (PlayerStatusContainer != none)
@ -1613,6 +1685,7 @@ DefaultProperties
bLastGunGameVisibility=true
bLastVIPVisibility=true
bLastBountyHuntVisibility=true
WidgetBindings.Add((WidgetName="ObjectiveContainer",WidgetClass=class'KFGFxHUD_ObjectiveConatiner'))
WidgetBindings.Add((WidgetName="SpectatorInfoWidget",WidgetClass=class'KFGFxHUD_SpectatorInfo'))
@ -1640,6 +1713,7 @@ DefaultProperties
WidgetBindings.Add((WidgetName="counterMapTextWidget", WidgetClass=class'KFGFxWidget_MapCounterText'))
WidgetBindings.ADD((WidgetName="GunGameContainer", WidgetClass=class'KFGFxWidget_GunGame'));
WidgetBindings.ADD((WidgetName="VIPContainer", WidgetClass=class'KFGFxWidget_VIP'));
WidgetBindings.ADD((WidgetName="BountyHuntContainer", WidgetClass=class'KFGFxWidget_BountyHunt'));
SpecialWaveIconPath(AT_Clot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Cyst"
SpecialWaveIconPath(AT_SlasherClot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Slasher"
@ -1653,6 +1727,7 @@ DefaultProperties
SpecialWaveIconPath(AT_Bloat)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Bloat"
SpecialWaveIconPath(AT_Siren)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Siren"
SpecialWaveIconPath(AT_Husk)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Husk"
SpecialWaveIconPath(AT_HansClot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Cyst"
SpecialWaveLocKey(AT_SlasherClot)="KFPawn_ZedClot_Slasher"
SpecialWaveLocKey(AT_Clot)="KFPawn_ZedClot_Cyst"
@ -1665,5 +1740,6 @@ DefaultProperties
SpecialWaveLocKey(AT_GoreFast)="KFPawn_ZedGorefast"
SpecialWaveLocKey(AT_Bloat)="KFPawn_ZedBloat"
SpecialWaveLocKey(AT_FleshPound)="KFPawn_ZedFleshpound"
SpecialWaveLocKey(AT_HansClot)="KFPawn_ZedClot_Cyst"
}

View File

@ -25,12 +25,47 @@ function LocalizeContainer()
GetObject("basicLoadoutTextField").SetString("text", BasicLoadoutString);
}
function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC, byte WeaponIdx, byte GrenadeIdx)
function bool CanChooseWeapons(KFPlayerController KFPC)
{
local KFGameReplicationInfo KFGRI;
KFGRI = KFGameReplicationInfo(KFPC.WorldInfo.GRI);
if (KFPC != none)
{
if (KFPC.Pawn.IsAliveAndWell() == false
|| KFPC.PlayerReplicationInfo.bIsSpectator
|| KFPC.PlayerReplicationInfo.bOnlySpectator)
{
return true;
}
}
if (KFGRI != none)
{
if (KFGRI.WaveNum == 0)
{
if (KFGRI.bWaveStarted)
{
return false;
}
}
else
{
return false;
}
}
return true;
}
function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC, byte WeaponIdx, byte SecondaryWeaponIdx, byte GrenadeIdx)
{
local GFxObject DetailsProvider;
local array<string> WeaponNames;
local array<string> WeaponSources;
local int i;
local bool CanIChooseWeapons;
DetailsProvider = CreateObject( "Object" );
@ -41,9 +76,9 @@ function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC,
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.static.GetPrimaryWeaponName(WeaponIdx), PerkClass.static.GetPrimaryWeaponImagePath(WeaponIdx));
}
if(PerkClass.default.SecondaryWeaponDef != none)
if(PerkClass.default.SecondaryWeaponPaths.Length > 0)
{
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.SecondaryWeaponDef.static.GetItemName(), PerkClass.default.SecondaryWeaponDef.static.GetImagePath());
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.static.GetSecondaryWeaponName(SecondaryWeaponIdx), PerkClass.static.GetSecondaryWeaponImagePath(SecondaryWeaponIdx));
}
if(PerkClass.default.KnifeWeaponDef != none)
{
@ -61,18 +96,22 @@ function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC,
}
DetailsProvider.SetString( "EXPAction1", PerkClass.default.EXPAction1 );
DetailsProvider.SetString( "EXPAction2", PerkClass.default.EXPAction2 );
DetailsProvider.SetString( "EXPAction2", PerkClass.default.EXPAction2 );
CanIChooseWeapons = CanChooseWeapons(KFPC);
DetailsProvider.SetBool("ShowPrimaryWeaponSelectors", CanIChooseWeapons && PerkClass.static.CanChoosePrimaryWeapon());
DetailsProvider.SetBool("ShowSecondaryWeaponSelectors", CanIChooseWeapons && PerkClass.static.CanChooseSecondaryWeapon());
DetailsProvider.SetBool("ShowPrimaryWeaponSelectors", PerkClass.static.CanChoosePrimaryWeapon());
DetailsProvider.SetBool("ShowGrenadeSelectors", PerkClass.static.CanChooseGrenade());
SetObject( "detailsData", DetailsProvider );
}
function UpdateDetails(class<KFPerk> PerkClass, byte SelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
function UpdateDetails(class<KFPerk> PerkClass, byte SelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext, bool UpdateUI)
{
local KFPlayerController KFPC;
local byte WeaponIdx, GrenadeIdx;
local byte WeaponIdx, SecondaryWeaponIdx, GrenadeIdx;
KFPC = KFPlayerController( GetPC() );
@ -82,11 +121,15 @@ function UpdateDetails(class<KFPerk> PerkClass, byte SelectedSkills[`MAX_PERK_SK
}
WeaponIdx = 0;
SecondaryWeaponIdx = 0;
GrenadeIdx = 0;
UpdateAndGetCurrentWeaponIndexes(PerkClass, KFPC, WeaponIdx, GrenadeIdx, SelectedSkills, IsChoosingPrev, IsChoosingNext);
UpdateAndGetCurrentWeaponIndexes(PerkClass, KFPC, WeaponIdx, SecondaryWeaponIdx, GrenadeIdx, SelectedSkills, IsChoosingPrev, IsChoosingNext);
UpdateDetailsInternal(PerkClass, KFPC, WeaponIdx, GrenadeIdx);
if (UpdateUI)
{
UpdateDetailsInternal(PerkClass, KFPC, WeaponIdx, SecondaryWeaponIdx, GrenadeIdx);
}
}
function AddWeaponInfo(out array<string> WeaponNames, out array<string> WeaponSources, string WeaponName, string WeaponSource)
@ -123,12 +166,35 @@ function UpdatePassives(Class<KFPerk> PerkClass)
SetObject( "passivesData", PassivesProvider );
}
function UpdateAndGetCurrentWeaponIndexes(class<KFPerk> PerkClass, KFPlayerController KFPC, out byte WeaponIdx, out byte GrenadeIdx
function UpdateAndGetCurrentWeaponIndexes(class<KFPerk> PerkClass, KFPlayerController KFPC, out byte WeaponIdx, out byte SecondaryWeaponIdx, out byte GrenadeIdx
, byte SelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
{
local KFGameReplicationInfo KFGRI;
KFGRI = KFGameReplicationInfo(KFPC.WorldInfo.GRI);
SecondaryWeaponIdx = PerkClass.static.GetSecondaryWeaponSelectedIndex(KFPC.SurvivalPerkSecondaryWeapIndex);
if (KFPC.CurrentPerk.Class.Name == PerkClass.Name)
{
KFPC.CurrentPerk.StartingSecondaryWeaponClassIndex = SecondaryWeaponIdx;
}
if (PerkClass.Name == 'KFPerk_Survivalist')
{
WeaponIdx = KFPC.CurrentPerk.SetWeaponSelectedIndex(KFPC.SurvivalPerkWeapIndex);
GrenadeIdx = KFPC.CurrentPerk.SetGrenadeSelectedIndexUsingSkills(KFPC.SurvivalPerkGrenIndex, SelectedSkills, IsChoosingPrev, IsChoosingNext);
WeaponIdx = PerkClass.static.GetWeaponSelectedIndex(KFPC.SurvivalPerkWeapIndex);
GrenadeIdx = PerkClass.static.GetGrenadeSelectedIndexUsingSkills(KFPC.SurvivalPerkGrenIndex, SelectedSkills, IsChoosingPrev, IsChoosingNext);
if (KFPC.CurrentPerk.Class.Name == PerkClass.Name)
{
KFPerk_Survivalist(KFPC.CurrentPerk).StartingWeaponClassIndex = WeaponIdx;
KFPerk_Survivalist(KFPC.CurrentPerk).StartingGrenadeClassIndex = GrenadeIdx;
// If we are in no gameplay time insta change
if (!KFGRI.bWaveIsActive)
{
KFPerk_Survivalist(KFPC.CurrentPerk).UpdateCurrentGrenade();
}
}
}
}

View File

@ -55,11 +55,13 @@ function SetMapOptions()
local array<string> ServerMapList;
local KFGameReplicationInfo KFGRI;
local bool IsWeeklyMode;
local bool IsBrokenTrader;
local bool IsBossRush;
local bool IsGunGame;
local bool IsContaminationMode;
local bool bShouldSkipMaps;
local bool bWeeklyNoSanta;
local bool IsBoom, IsCraniumCracker, IsTinyTerror, IsBobbleZed, IsPoundemonium, IsUpUpAndDecay, IsZedTime, IsBeefcake;
local bool IsBloodThirst, IsColiseum, IsArachnophobia, IsScavenger, IsWW, IsAbandon, IsBossRush, IsShrunkenHeads;
local bool IsGunGame, /*IsVIP,*/ IsPerkRoulette, IsContaminationMode, IsBountyHunt;
local name MapName;
KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI);
@ -70,13 +72,62 @@ function SetMapOptions()
if(KFGRI != none && KFGRI.VoteCollector != none)
{
ServerMapList = KFGRI.VoteCollector.MapList;
IsWeeklyMode = KFGRI.bIsWeeklyMode;
IsBrokenTrader = KFGRI.CurrentWeeklyIndex == 11;
IsBossRush = KFGRI.CurrentWeeklyIndex == 14;
IsGunGame = KFGRI.CurrentWeeklyIndex == 16;
IsContaminationMode = KFGRI.CurrentWeeklyIndex == 19;
bShouldSkipMaps = IsWeeklyMode && (IsBrokenTrader || IsBossRush || IsGunGame);
IsWeeklyMode = KFGRI.bIsWeeklyMode;
IsBoom = false;
IsCraniumCracker = false;
IsTinyTerror = false;
IsBobbleZed = false;
IsPoundemonium = false;
IsUpUpAndDecay = false;
IsZedTime = false;
IsBeefcake = false;
IsBloodThirst = false;
IsColiseum = false;
IsArachnophobia = false;
IsScavenger = false;
IsWW = false;
IsAbandon = false;
IsBossRush = false;
IsShrunkenHeads = false;
IsGunGame = false;
//IsVIP = false;
IsPerkRoulette = false;
IsContaminationMode = false;
IsBountyHunt = false;
switch (KFGRI.CurrentWeeklyIndex)
{
case 0: IsBoom = true; break;
case 1: IsCraniumCracker = true; break;
case 2: IsTinyTerror = true; break;
case 3: IsBobbleZed = true; break;
case 4: IsPoundemonium = true; break;
case 5: IsUpUpAndDecay = true; break;
case 6: IsZedTime = true; break;
case 7: IsBeefcake = true; break;
case 8: IsBloodThirst = true; break;
case 9: IsColiseum = true; break;
case 10: IsArachnophobia = true; break;
case 11: IsScavenger = true; break;
case 12: IsWW = true; break;
case 13: IsAbandon = true; break;
case 14: IsBossRush = true; break;
case 15: IsShrunkenHeads = true; break;
case 16: IsGunGame = true; break;
//case 17: IsVIP = true; break;
case 18: IsPerkRoulette = true; break;
case 19: IsContaminationMode = true; break;
case 20: IsBountyHunt = true; break;
}
bShouldSkipMaps = IsWeeklyMode && (IsScavenger || IsBossRush || IsGunGame);
bWeeklyNoSanta = IsWeeklyMode && ( IsBoom || IsCraniumCracker || IsTinyTerror || IsBobbleZed
|| IsPoundemonium || IsUpUpAndDecay || IsZedTime || IsBeefcake
|| IsBloodThirst || IsColiseum || IsArachnophobia || IsScavenger
|| IsWW || IsAbandon || IsShrunkenHeads || IsPerkRoulette);
//gfx
MapList = CreateArray();
@ -85,6 +136,11 @@ function SetMapOptions()
{
MapName = name(ServerMapList[i]);
if (bWeeklyNoSanta && MapName == MapSantas)
{
continue;
}
if ( bShouldSkipMaps && ( MapName == MapBiolapse ||
MapName == MapNightmare ||
MapName == MapPowerCore ||
@ -108,12 +164,24 @@ function SetMapOptions()
}
}
/* Temporary removal of SteamFrotress for BossRush */
if (IsWeeklyMode && IsBountyHunt)
{
if (MapName == MapBiolapse ||
MapName == MapNightmare ||
MapName == MapPowerCore ||
MapName == MapDescent ||
MapName == MapKrampus ||
MapName == MapElysium ||
MapName == MapSteam)
{
continue;
}
}
if (IsWeeklyMode && IsBossRush && MapName == MapSteam)
{
continue;
}
/* */
MapObject = CreateObject("Object");
MapObject.SetString("label", class'KFCommon_LocalizedStrings'.static.GetFriendlyMapName(ServerMapList[i]) );

View File

@ -17,10 +17,10 @@ var localized string NoPasswordString, NoMutatorsString, NotFullString, NotEmpty
var array<string> FilterStrings;
var config Bool bNoPassword, bNoMutators, bNotFull, bNotEmpty, bUsesStats, bCustom, bDedicated, bVAC_Secure, bInLobby, bInProgress, bOnlyStockMaps, bOnlyCustomMaps, bLimitServerResults, bNoLocalAdmin, bNoSeasonalSkins;
var config byte SavedGameModeIndex, SavedMapIndex, SavedDifficultyIndex, SavedLengthIndex, SavedPingIndex;
var config byte SavedGameModeIndex, SavedMapIndex, SavedDifficultyIndex, SavedLengthIndex, SavedPingIndex, SavedWeeklySelectorIndex;
var Bool bNoPasswordPending, bNoMutatorsPending, bNotFullPending, bNotEmptyPending, bUsesStatsPending, bCustomPending, bDedicatedPending, bVAC_SecurePending, bInLobbyPending, bInProgressPending, bOnlyStockMapsPending, bOnlyCustomMapsPending, bLimitServerResultsPending, bNoLocalAdminPending, bNoSeasonalSkinsPending;
var byte SavedGameModeIndexPending, SavedMapIndexPending, SavedDifficultyIndexPending, SavedLengthIndexPending, SavedPingIndexPending;
var byte SavedGameModeIndexPending, SavedMapIndexPending, SavedDifficultyIndexPending, SavedLengthIndexPending, SavedPingIndexPending, SavedWeeklySelectorIndexPending;
var transient string CachedMapName, CachedModeName;
var transient int CachedDifficulty, CachedLength;
@ -93,6 +93,12 @@ function AdjustSavedFiltersToMode()
SavedLengthIndex = 255;
}
SavedLengthIndexPending = SavedLengthIndex;
if (SavedGameModeIndex != 1)
{
SavedWeeklySelectorIndex = 0;
}
SavedWeeklySelectorIndexPending = SavedWeeklySelectorIndex;
}
exec native function string GetSelectedMap() const;
@ -105,6 +111,8 @@ exec native function int GetSelectedGameLength() const;
native function int GetMaxPing() const;
//@SABER_END
exec native function int GetWeeklySelectorIndex() const;
function InitFiltersArray()
{
FilterStrings[NO_PASSWORD] = NoPasswordString;
@ -141,6 +149,7 @@ function LocalizeText()
LocalizedObject.SetString("difficulty", ServerMenu.DifficultyString);
LocalizedObject.SetString("length", ServerMenu.LengthString);
LocalizedObject.SetString("ping", ServerMenu.PingString);
LocalizedObject.SetString("weeklyIndex", ServerMenu.WeeklyIndexString);
SetObject("localizedText", LocalizedObject);
@ -150,6 +159,7 @@ function LocalizeText()
CreateList("difficultyScrollingList", class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), SavedDifficultyIndex);
CreateList("lengthScrollingList", class'KFCommon_LocalizedStrings'.static.GetLengthStringsArray(), SavedLengthIndex);
CreateList("pingScrollingList", ServerMenu.PingOptionStrings, SavedPingIndex);
CreateList("weeklyIndexScrollingList", class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorStringsArray(), SavedWeeklySelectorIndex, -1, true, SavedGameModeIndexPending == 1);
LocalizeCheckBoxes();
}
@ -227,7 +237,10 @@ function SetModeMenus(string DifficultyListString, string LengthListString, int
CreateList(LengthListString, class'KFCommon_LocalizedStrings'.static.GetLengthStringsArray(), NewLengthIndex, class'KFGameInfo'.default.GameModes[UseModeIndex].Lengths);
}
function CreateList( string ListString, array<string> TextArray, int SelectedIndex, optional int MaxListLength)
function CreateList( string ListString, array<string> TextArray, int SelectedIndex
, optional int MaxListLength = -1
, optional bool bAnyIsFirst = false
, optional bool bEnabled = true)
{
local int i;
local GFxObject OptionList;
@ -252,33 +265,73 @@ function CreateList( string ListString, array<string> TextArray, int SelectedInd
{
SelectedIndex = 255;
}
if (bAnyIsFirst)
{
//Add the any choice
ItemSlot = CreateObject( "Object" );
ItemSlot.SetString("label", class'KFCommon_LocalizedStrings'.default.NoPreferenceString);
DataProvider.SetElementObject(0, ItemSlot);
}
for ( i = 0; i < ListLength; i++ )
{
ItemSlot = CreateObject( "Object" );
TempString = TextArray[i];
ItemSlot.SetString("label", TempString );
DataProvider.SetElementObject(i, ItemSlot);
}
DataProvider.SetElementObject(bAnyIsFirst ? i + 1 : i, ItemSlot);
}
if (bAnyIsFirst == false)
{
//Add the any choice
ItemSlot = CreateObject( "Object" );
ItemSlot.SetString("label", class'KFCommon_LocalizedStrings'.default.NoPreferenceString);
DataProvider.SetElementObject(i, ItemSlot);
}
//Add the any choice
ItemSlot = CreateObject( "Object" );
ItemSlot.SetString("label", class'KFCommon_LocalizedStrings'.default.NoPreferenceString);
DataProvider.SetElementObject(i, ItemSlot);
if(SelectedIndex != 255)
{
OptionList.SetInt("selectedIndex", SelectedIndex);
}
OptionList.SetObject("dataProvider", DataProvider);
if(SelectedIndex < ListLength)
if (bEnabled)
{
ButtonLabel = TextArray[SelectedIndex];
if (bAnyIsFirst)
{
ButtonLabel = class'KFCommon_LocalizedStrings'.default.NoPreferenceString;
}
else
{
if(SelectedIndex < ListLength)
{
ButtonLabel = TextArray[SelectedIndex];
}
else
{
ButtonLabel = "-";
}
}
}
else
{
ButtonLabel = "-";
}
OptionList.GetObject("associatedButton").SetString("label", ButtonLabel);
OptionList.ActionScriptVoid("invalidateData");
if (bEnabled )
{
OptionList.GetObject("associatedButton").SetBool("enabled", true);
}
else
{
OptionList.GetObject("associatedButton").SetBool("enabled", false);
}
}
function ModeChanged(int index)
@ -321,6 +374,11 @@ function PingChanged(int index)
SavedPingIndexPending = index;
}
function WeeklySelectorChanged(int index)
{
SavedWeeklySelectorIndexPending = index;
}
function ApplyFilters()
{
bNoPassword = bNoPasswordPending;
@ -344,7 +402,10 @@ function ApplyFilters()
SavedDifficultyIndex = SavedDifficultyIndexPending;
SavedLengthIndex = SavedLengthIndexPending;
SavedPingIndex = SavedPingIndexPending;
//`log("ApplyFilters:"@bCustom);
SavedWeeklySelectorIndex = SavedWeeklySelectorIndexPending;
//`Log("ApplyFilters");
SaveConfig();
}
@ -370,7 +431,9 @@ function ClearPendingValues()
SavedDifficultyIndexPending = SavedDifficultyIndex;
SavedLengthIndexPending = SavedLengthIndex;
SavedPingIndexPending = SavedPingIndex;
//`log("ClearPendingValues:"@bCustom);
SavedWeeklySelectorIndexPending = SavedWeeklySelectorIndex;
//`Log("ClearPendingValues");
}
function ResetFilters()
@ -396,6 +459,7 @@ function ResetFilters()
SavedDifficultyIndex = 255;
SavedLengthIndex = 255;
SavedPingIndex = 255;
SavedWeeklySelectorIndex = 0;
//`log("ResetFilters:"@bCustom);
ClearPendingValues();

View File

@ -66,6 +66,7 @@ function SetDetails(KFOnlineGameSettings ServerResult)
local int Ping, PlayerCount;
local KFOnlineGameSettings TempOnlingGamesSettings;
local bool bShowSeasonalSkins;
local KFWeeklyOutbreakInformation WeeklyInfo;
if(ServerResult != none)
{
@ -103,6 +104,22 @@ function SetDetails(KFOnlineGameSettings ServerResult)
TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) );
TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlingGamesSettings.difficulty));
TempObj.SetString("mode", class'KFCommon_LocalizedStrings'.static.GetGameModeString(TempOnlingGamesSettings.Mode) );
// If weekly we add the weekly type
if (TempOnlingGamesSettings.Mode == 1)
{
if (TempOnlingGamesSettings.WeeklySelectorIndex > 0)
{
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(TempOnlingGamesSettings.WeeklySelectorIndex - 1);
}
else
{
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
}
TempObj.SetString("weeklyForced", WeeklyInfo.FriendlyName);
}
TempObj.SetString("map", TempOnlingGamesSettings.MapName);
TempObj.SetString("mapImagePath", GetMapSource(TempOnlingGamesSettings.MapName));

View File

@ -271,7 +271,7 @@ function BuildServerFilters(KFGFxServerBrowser_Filters Filters, OnlineGameSearch
{
local string GametagSearch;
local string MapName;
local int Mode, Difficulty, Length;
local int Mode, Difficulty, Length, WeeklySelectorIndex;
local bool DisableSeasonalSkins;
Search.ClearServerFilters();
@ -344,7 +344,14 @@ function BuildServerFilters(KFGFxServerBrowser_Filters Filters, OnlineGameSearch
//`log("adding custom filter");
Search.TestAddBoolGametagFilter(GametagSearch, Filters.bCustom, 'bCustom', 0);
}
WeeklySelectorIndex = Filters.GetWeeklySelectorIndex();
if (Mode == 1 && WeeklySelectorIndex != 0) // // Only when mode is Weekly, 0 means "ANY", 1 is "DEFAULT", then the weeklies
{
WeeklySelectorIndex = WeeklySelectorIndex - 1; // move back to index range
Search.AddGametagFilter(GametagSearch, 'WeeklySelectorIndex', string(WeeklySelectorIndex));
}
if (Len(GametagSearch) > 0)
{
@ -832,7 +839,7 @@ function string BuildJoinURL()
function string BuildJoinFiltersRequestURL()
{
local string FiltersURL;
local int GameDifficulty;
local int GameDifficulty, WeeklySelectorIndex, IntendedWeeklyIndex;
GameDifficulty = ServerMenu.FiltersContainer.GetSelectedDifficulty();
@ -851,10 +858,32 @@ function string BuildJoinFiltersRequestURL()
FiltersURL $= "?GameLength="$ServerMenu.FiltersContainer.SavedLengthIndex;
}
WeeklySelectorIndex = ServerMenu.FiltersContainer.SavedWeeklySelectorIndex;
if (ServerMenu.FiltersContainer.SavedGameModeIndex == 1
&& WeeklySelectorIndex != 0) // 0 means "ANY", 1 is "DEFAULT", then the weeklies
{
WeeklySelectorIndex = WeeklySelectorIndex - 1; // move back to index range
// IF index matches default, set to 0 (default)
if (WeeklySelectorIndex >= 1)
{
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
if (IntendedWeeklyIndex == (WeeklySelectorIndex - 1))
{
WeeklySelectorIndex = 0;
}
}
if (WeeklySelectorIndex >= 0)
{
FiltersURL $= "?WeeklySelectorIndex=" $WeeklySelectorIndex;
}
}
return FiltersURL;
}
function OnRefreshServerDetails()
{
local KFOnlineGameSearch GameSearch;
@ -934,6 +963,7 @@ function UpdateListDataProvider()
local KFOnlineGameSearch LatestGameSearch;
local int Ping, PlayerCount;
local KFOnlineGameSettings TempOnlineGamesSettings;
local KFWeeklyOutbreakInformation WeeklyInfo;
LatestGameSearch = KFOnlineGameSearch(SearchDataStore.GetActiveGameSearch());
@ -989,7 +1019,23 @@ function UpdateListDataProvider()
TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) );
TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlineGamesSettings.difficulty));
TempObj.SetString("mode", class'KFCommon_LocalizedStrings'.static.GetGameModeString(TempOnlineGamesSettings.Mode) );
TempObj.SetString("mode", class'KFCommon_LocalizedStrings'.static.GetGameModeString(TempOnlineGamesSettings.Mode));
// If weekly we show the icon of the weekly type
if (IsWeeklyModeIndex(TempOnlineGamesSettings.Mode))
{
if (TempOnlineGamesSettings.WeeklySelectorIndex > 0)
{
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(TempOnlineGamesSettings.WeeklySelectorIndex - 1);
}
else
{
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
}
TempObj.SetString("weeklyType", "img://"$WeeklyInfo.IconPath);
}
TempObj.SetString("map", TempOnlineGamesSettings.MapName);
TempObj.SetBool("locked", TempOnlineGamesSettings.bRequiresPassword);
TempObj.SetBool("serverExiled", TempOnlineGamesSettings.bServerExiled);
@ -1013,6 +1059,11 @@ function UpdateListDataProvider()
}
}
function bool IsWeeklyModeIndex(int ModeIndex)
{
return ModeIndex == 1;
}
function bool IsEndlessModeIndex(int ModeIndex)
{
return ModeIndex == 3;

View File

@ -0,0 +1,27 @@
class KFGFXSpecialEventObjectivesContainer_Fall2023 extends KFGFxSpecialEventObjectivesContainer;
function Initialize(KFGFxObject_Menu NewParentMenu)
{
super.Initialize(NewParentMenu);
}
DefaultProperties
{
ObjectiveIconURLs[0] = "Halloween2023_UI.UI_Objective_Halloween2023_ICouldDoThisAllDay" // Kill Hans Volter in 10 different maps
ObjectiveIconURLs[1] = "Spring_UI.UI_Objectives_Spring_Weekly" // Complete the Weekly on Castle Volter
ObjectiveIconURLs[2] = "Halloween2023_UI.UI_Objective_Halloween2023_LuckilyTheyreNotClones" // Find all Castle Volters Collectibles
ObjectiveIconURLs[3] = "Halloween2023_UI.UI_Objective_Halloween2023_ThisBelongToAMuseum" // Unlock all exhibits from Castle Volters trophy room ( TODO )
ObjectiveIconURLs[4] = "Halloween2023_UI.UI_Objective_Halloween2023_AFineDayAtTheMountains" // Complete wave 15 on Endless Hard or higher difficulty on Castle Volter
//defaults
AllCompleteRewardIconURL="WEP_SkinSet81_Item_TEX.mkb42_hans.VolterMKB42Precious_Mint"
ChanceDropIconURLs[0]="CHR_CosmeticSet14_Item_TEX.Tickets.CyberPunk_ticket"
ChanceDropIconURLs[1]="CHR_CosmeticSet14_Item_TEX.Tickets.CyberPunk_ticket_golden"
IconURL="Halloween2023_UI.UI_Halloween2023_EventLogo"
UsesProgressList[0] = true
UsesProgressList[1] = false
UsesProgressList[2] = true
UsesProgressList[3] = false
UsesProgressList[4] = false
}

View File

@ -13,7 +13,7 @@ dependson(KFUnlockManager);
var KFGFxMenu_StartGame StartMenu;
var byte LastDifficultyIndex, LastLengthIndex, LastPrivacyIndex, LastAllowSeasonalSkinsIndex;
var byte LastDifficultyIndex, LastLengthIndex, LastPrivacyIndex, LastAllowSeasonalSkinsIndex, LastWeeklySelectorIndex;
var localized string OverviewString;
var localized string ChangeString;
@ -125,6 +125,15 @@ function LocalizeContainer()
LocalizedObject.SetObject("allowSeasonalSkinsOptions", DataProvider);
for (i = 0; i < class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorStringsArray().length; i++)
{
TempObj = CreateObject("Object");
TempObj.SetString("label", class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorString(i));
DataProvider.SetElementObject(i, TempObj);
}
LocalizedObject.SetObject("weeklySelectorOptions", DataProvider);
if( !class'WorldInfo'.static.IsMenuLevel() )
{
LocalizedObject.SetString("authorName", AuthorString$GetPC().WorldInfo.Author);
@ -350,12 +359,17 @@ function UpdateAllowSeasonalSkins(string AllowSeasonalStrings)
SetString("allowSeasonalSkinsText", AllowSeasonalStrings);
}
function UpdateWeeklySelector(string WeeklySelectorStrings)
{
SetString("weeklySelectorText", WeeklySelectorStrings);
}
function UpdateOverviewInGame()
{
local KFGameReplicationInfo KFGRI;
local string GameDifficultyString;
local Float CurrentGameDifficulty;
local int CurrentLengthIndex, CurrentPrivacyIndex, CurrentAllowSeasonalSkinsIndex;
local int CurrentLengthIndex, CurrentPrivacyIndex, CurrentAllowSeasonalSkinsIndex, CurrentWeeklySelectorIndex;
local bool bCustomDifficulty;
local bool bCustomLength;
@ -427,6 +441,13 @@ function UpdateOverviewInGame()
UpdateAllowSeasonalSkins( class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsString(CurrentAllowSeasonalSkinsIndex) );
LastAllowSeasonalSkinsIndex = CurrentAllowSeasonalSkinsIndex;
}
CurrentWeeklySelectorIndex = StartMenu.OptionsComponent.GetWeeklySelectorIndex();
if (LastWeeklySelectorIndex != CurrentWeeklySelectorIndex)
{
UpdateWeeklySelector( class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorString(CurrentWeeklySelectorIndex) );
LastWeeklySelectorIndex = CurrentWeeklySelectorIndex;
}
}
}
}
@ -448,6 +469,7 @@ DefaultProperties
LastLengthIndex=255
LastDifficultyIndex=255
LastAllowSeasonalSkinsIndex=255
LastWeeklySelectorIndex=255
ObjectiveClassName=KFGameInfo_Objective
}

View File

@ -182,7 +182,7 @@ function FillWhatsNew()
local SWhatsNew item;
WhatsNewItems.Remove(0, WhatsNewItems.Length);
// Latest Update
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_Event", "LatestUpdate", "http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_Event", "LatestUpdate", "http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/");
WhatsNewItems.AddItem(item);
// Featured Ultimate Edition
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_UltimateEdition_Upgrade", "FeaturedItemBundle", "https://store.steampowered.com/app/1914560/KF2__Ultimate_Edition_Upgrade_DLC/");
@ -197,25 +197,22 @@ function FillWhatsNew()
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_CosmeticsSeasonPass", "FeaturedItemBundle", "https://store.steampowered.com/app/2363410/Killing_Floor_2__Cosmetics_Season_Pass");
WhatsNewItems.AddItem(item);
// Featured Weapon
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_S12Shockgun", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9655");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_MG3Shredder", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9749");
WhatsNewItems.AddItem(item);
// Featured Outfit Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_HorzineDiver_Uniforms", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9653");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_LastStand_Uniforms", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9747");
WhatsNewItems.AddItem(item);
// Featured Time Limited Item
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_SS_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/4928");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/5246");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_Predator_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9651");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_MedievalMKII_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9718");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_JunkyardMKII_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9646");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_HRGSpectreMKIII_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9720");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_JaegerMKIV_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9645");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_Stingray_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9649");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_ChameleonMKIV_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9716");
WhatsNewItems.AddItem(item);
// Misc Community Links
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityHub", "Jaegorhorn", "https://steamcommunity.com/app/232090");

View File

@ -75,6 +75,7 @@ var GFxObject DifficultyButton;
var GfxObject MapButton;
var GFxObject RegionButton;
var GFxObject AllowSeasonalSkinsButton;
var GFxObject WeeklySelectorButton;
//==============================================================
// Initialization
@ -96,25 +97,40 @@ function GetButtons()
MapButton = GetObject("mapButton");
RegionButton = GetObject("regionButton");
AllowSeasonalSkinsButton = GetObject("allowSeasonalSkinsButton");
WeeklySelectorButton = GetObject("weeklySelectorButton");
}
function UpdateButtonsEnabled()
{
local int AdjustedGameModeIndex;
local bool ModeIsWeekly;
if (bIsSoloGame)
{
AdjustedGameModeIndex = ParentMenu.Manager.GetModeIndex(false);
ModeIsWeekly = AdjustedGameModeIndex == EGameMode_Weekly;
LengthButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[AdjustedGameModeIndex].Lengths > 0);
DifficultyButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[AdjustedGameModeIndex].DifficultyLevels > 0);
}
else
{
ModeIsWeekly = ParentMenu.Manager.GetModeIndex() == EGameMode_Weekly;
LengthButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[ParentMenu.Manager.GetModeIndex()].Lengths > 0);
DifficultyButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[ParentMenu.Manager.GetModeIndex()].DifficultyLevels > 0);
}
if (ModeIsWeekly)
{
WeeklySelectorButton.SetBool("enabled", true);
}
else
{
WeeklySelectorButton.SetBool("enabled", false);
}
}
function SetHelpText(string TextValue)
@ -131,6 +147,7 @@ function SetModeMenus(GFxObject TextObject, int ModeIndex, int LengthIndex)
Lengths = class'KFGameInfo'.default.GameModes[ModeIndex].Lengths;
NewDifficultyIndex = Clamp(NewDifficultyIndex, 0, DifficultyLevels);
NewLengthIndex = Clamp(NewLengthIndex, 0, Lengths);
TextObject.SetObject("difficultyList", CreateList(class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), GetDifficultyIndex(), false, false, byte(DifficultyLevels)));
TextObject.SetObject("lengthList", CreateList(class'KFCommon_LocalizedStrings'.static.GetLengthStringsArray(), LengthIndex, bShowLengthNoPref, false, byte(Lengths)));
}
@ -254,7 +271,8 @@ function InitializeGameOptions()
TextObject.SetBool("bShowAllowSeasonalSkins", true);
}
TextObject.SetString("allowSeasonalSkins", StartMenu.AllowSeasonalSkinsTitle);
TextObject.SetString("allowSeasonalSkins", StartMenu.AllowSeasonalSkinsTitle);
TextObject.SetString("weeklySelector", StartMenu.WeeklySelectorTitle);
// Since the Mode list can include "ANY" we need to just accept that the selected index could be the length of the supported modes. Otherwise when "ANY" is selected we push the index to 1.
// Also don't include the "ANY" option on Console since PlayGo doesn't support searching multiple game types. HSL_BB
@ -264,7 +282,8 @@ function InitializeGameOptions()
TextObject.SetObject("mapList", CreateList(StartMenu.MapStringList, bIsSoloGame ? InitialMapIndex : InitialMapIndex+1, true, true));
TextObject.SetObject("difficultyList", CreateList(class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), GetDifficultyIndex(), false));
TextObject.SetObject("privacyList", CreateList(class'KFCommon_LocalizedStrings'.static.GetPermissionStringsArray(class'WorldInfo'.static.IsConsoleBuild()), Profile.GetProfileInt(KFID_SavedPrivacyIndex), false));
TextObject.SetObject("allowSeasonalSkinsList", CreateList(class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsStringsArray(), Profile.GetProfileInt(KFID_SavedAllowSeasonalSkinsIndex), false));
TextObject.SetObject("allowSeasonalSkinsList", CreateList(class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsStringsArray(), Profile.GetProfileInt(KFID_SavedAllowSeasonalSkinsIndex), false));
TextObject.SetObject("weeklySelectorList", CreateList(class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorStringsArray(), Profile.GetProfileInt(KFID_SavedWeeklySelectorIndex), false, false));
if (class'WorldInfo'.static.IsConsoleBuild())
{
@ -287,39 +306,124 @@ function FilterWeeklyMaps(out array<string> List)
return;
}
`Log("OPTIONS: Skipping Maps");
// Scavenger index = 11
// BossRush index = 14
// GunGame index = 16
WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod();
if (WeeklyIndex == 11 || WeeklyIndex == 14 || WeeklyIndex == 16)
{
`Log("OPTIONS: Inside, removing maps");
List.RemoveItem("KF-Biolapse");
List.RemoveItem("KF-Nightmare");
List.RemoveItem("KF-PowerCore_Holdout");
List.RemoveItem("KF-TheDescent");
List.RemoveItem("KF-KrampusLair");
if (ParentMenu.Manager.GetWeeklySelectorIndex() != 0)
{
WeeklyIndex = ParentMenu.Manager.GetWeeklySelectorIndex() - 1;
}
if (WeeklyIndex == 19)
switch (WeeklyIndex)
{
List.RemoveItem("KF-Biolapse");
List.RemoveItem("KF-Nightmare");
List.RemoveItem("KF-PowerCore_Holdout");
List.RemoveItem("KF-TheDescent");
List.RemoveItem("KF-KrampusLair");
List.RemoveItem("KF-SantasWorkshop");
List.RemoveItem("KF-Elysium");
}
case 0: // Boom
List.RemoveItem("KF-SantasWorkshop");
break;
/* Temporary removal of SteamFrotress for BossRush */
if (WeeklyIndex == 14)
{
List.RemoveItem("KF-SteamFortress");
}
case 1: // Cranium Cracker
List.RemoveItem("KF-SantasWorkshop");
break;
case 2: // Tiny Terror
List.RemoveItem("KF-SantasWorkshop");
break;
case 3: // BobbleZed
List.RemoveItem("KF-SantasWorkshop");
break;
case 4: // Poundemonium
List.RemoveItem("KF-SantasWorkshop");
break;
case 5: // Up Up And Decay
List.RemoveItem("KF-SantasWorkshop");
break;
case 6: // Zed Time
List.RemoveItem("KF-SantasWorkshop");
break;
case 7: // Beefcake
List.RemoveItem("KF-SantasWorkshop");
break;
case 8: // BloodThirst
List.RemoveItem("KF-SantasWorkshop");
break;
case 9: // Coliseum
List.RemoveItem("KF-SantasWorkshop");
break;
case 10: // Arachnophobia
List.RemoveItem("KF-SantasWorkshop");
break;
case 11: // Scavenger
List.RemoveItem("KF-Biolapse");
List.RemoveItem("KF-Nightmare");
List.RemoveItem("KF-PowerCore_Holdout");
List.RemoveItem("KF-TheDescent");
List.RemoveItem("KF-KrampusLair");
List.RemoveItem("KF-SantasWorkshop");
break;
case 12: // WW
List.RemoveItem("KF-SantasWorkshop");
break;
case 13: // Abandon
List.RemoveItem("KF-SantasWorkshop");
break;
case 14: // Boss Rush
List.RemoveItem("KF-Biolapse");
List.RemoveItem("KF-Nightmare");
List.RemoveItem("KF-PowerCore_Holdout");
List.RemoveItem("KF-TheDescent");
List.RemoveItem("KF-KrampusLair");
List.RemoveItem("KF-SteamFortress");
break;
case 15: // Shrunken Heads
List.RemoveItem("KF-SantasWorkshop");
break;
case 16: // GunGame
List.RemoveItem("KF-Biolapse");
List.RemoveItem("KF-Nightmare");
List.RemoveItem("KF-PowerCore_Holdout");
List.RemoveItem("KF-TheDescent");
List.RemoveItem("KF-KrampusLair");
break;
case 17: // VIP
break;
case 18: // Perk Roulette
List.RemoveItem("KF-SantasWorkshop");
break;
case 19: // Contamination Zone
List.RemoveItem("KF-Biolapse");
List.RemoveItem("KF-Nightmare");
List.RemoveItem("KF-PowerCore_Holdout");
List.RemoveItem("KF-TheDescent");
List.RemoveItem("KF-KrampusLair");
List.RemoveItem("KF-SantasWorkshop");
List.RemoveItem("KF-Elysium");
break;
case 20: // Bounty Hunt
List.RemoveItem("KF-Biolapse");
List.RemoveItem("KF-Nightmare");
List.RemoveItem("KF-PowerCore_Holdout");
List.RemoveItem("KF-TheDescent");
List.RemoveItem("KF-KrampusLair");
List.RemoveItem("KF-Elysium");
List.RemoveItem("KF-SteamFortress");
break;
}
}
function GFxObject CreateList( array<string> TextArray, byte SelectedIndex, bool bAddNoPrefString, optional bool bIsMapList, optional byte MaxLength)
@ -504,6 +608,22 @@ function AllowSeasonalSkinsChanged( int Index, optional bool bSetText )
}
}
function WeeklySelectorChanged( int Index, optional bool bSetText )
{
if(Index != GetCachedProfile().GetProfileInt(KFID_SavedWeeklySelectorIndex))
{
SaveConfig();
if(bSetText)
{
WeeklySelectorButton.SetString("infoString", class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorStringsArray()[Index]);
}
GetCachedProfile().SetProfileSettingValueInt(KFID_SavedWeeklySelectorIndex, Index);
InitializeGameOptions();
}
}
function SetRegionIndex(int InRegionIndex, optional bool bSetText)
{
local array<String> PlayfabRegionList;
@ -623,6 +743,11 @@ function int GetAllowSeasonalSkinsIndex()
return GetCachedProfile().GetProfileInt(KFID_SavedAllowSeasonalSkinsIndex);
}
function int GetWeeklySelectorIndex()
{
return GetCachedProfile().GetProfileInt(KFID_SavedWeeklySelectorIndex);
}
function string GetMapName()
{
local string SavedMapString;

View File

@ -447,21 +447,19 @@ DefaultProperties
XboxFilterExceptions[0]="Wasteland Bundle" // Wasteland Outfit Bundle
FeaturedItemIDs[0]=8178 //Whatsnew Gold Ticket
FeaturedItemIDs[1]=9655
FeaturedItemIDs[2]=9646
FeaturedItemIDs[3]=9649
FeaturedItemIDs[4]=9645
FeaturedItemIDs[5]=9653
FeaturedItemIDs[6]=9651
FeaturedItemIDs[0]=7619 //Whatsnew Gold Ticket
FeaturedItemIDs[1]=9749
FeaturedItemIDs[2]=9747
FeaturedItemIDs[3]=9716
FeaturedItemIDs[4]=9718
FeaturedItemIDs[5]=9720
ConsoleFeaturedItemIDs[0]=8181 //Whatsnew Gold Ticket PSN
ConsoleFeaturedItemIDs[1]=9655
ConsoleFeaturedItemIDs[2]=9646
ConsoleFeaturedItemIDs[3]=9649
ConsoleFeaturedItemIDs[4]=9645
ConsoleFeaturedItemIDs[5]=9653
ConsoleFeaturedItemIDs[6]=9651
ConsoleFeaturedItemIDs[0]=7783 //Whatsnew Gold Ticket PSN
ConsoleFeaturedItemIDs[1]=9749
ConsoleFeaturedItemIDs[2]=9747
ConsoleFeaturedItemIDs[3]=9716
ConsoleFeaturedItemIDs[4]=9718
ConsoleFeaturedItemIDs[5]=9720
MaxFeaturedItems=5
}

View File

@ -290,6 +290,8 @@ function SetItemInfo(out GFxObject ItemDataArray, STraderItem TraderItem, int Sl
/** returns true if this item should not be displayed */
function bool IsItemFiltered(STraderItem Item, optional bool bDebug)
{
local bool bUses9mm;
if(!class'GameEngine'.Static.IsGameFullyInstalled() && Item.WeaponDef.default.IsPlayGoHidden)
{
if (bDebug)
@ -340,5 +342,38 @@ function bool IsItemFiltered(STraderItem Item, optional bool bDebug)
return true;
}
bUses9mm = Has9mmGun();
if (bUses9mm && (Item.ClassName == 'KFWeap_HRG_93r' || Item.ClassName == 'KFWeap_HRG_93r_Dual'))
{
if (bDebug)
{
`log("9mm owned, skip HRG_93");
}
return true;
}
if (!bUses9mm && (Item.ClassName == 'KFWeap_Pistol_9mm' || Item.ClassName == 'KFWeap_Pistol_Dual9mm'))
{
if (bDebug)
{
`log("HRG_93R owned, skip 9mm");
}
return true;
}
return false;
}
simulated function bool Has9mmGun()
{
local SItemInformation Item;
foreach KFPC.GetPurchaseHelper().OwnedItemList(Item)
{
if (Item.DefaultItem.ClassName == 'KFWeap_Pistol_9mm' || Item.DefaultItem.ClassName == 'KFWeap_Pistol_Dual9mm')
{
return true;
}
}
return false;
}

View File

@ -11,61 +11,115 @@
class KFGFxWeeklyObjectivesContainer extends KFGFxObject_Container
dependson(KFMission_LocalizedStrings);
var bool bInitialDataPopulated;
var int LastWeeklyPopulated;
var bool bLastWeeklyComplete;
var KFPlayerController KFPC;
var KFGFxMenu_StartGame StartGameMenu;
function Initialize( KFGFxObject_Menu NewParentMenu )
{
super.Initialize( NewParentMenu );
StartGameMenu = KFGFxMenu_StartGame(NewParentMenu);
KFPC = KFPlayerController(GetPC());
if(KFPC != none)
{
LocalizeMenu();
PopulateData();
PopulateData();
}
}
function bool PopulateData()
{
local int IntendedWeeklyIndex, WeeklyIndex, OverrideWeeklyIndex;
local GFxObject DataObject;
local KFWeeklyOutbreakInformation WeeklyInfo;
local bool bWeeklyComplete;
local int WeeklyIndex;
local byte CurrentMenuState;
local bool bWeeklyComplete, bIsCustomWeekly;
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
WeeklyIndex = -1;
OverrideWeeklyIndex = -1;
// If the Start Game Menu is opened and in some of the next states,.. we can read a different weekly selection
if (StartGameMenu != none)
{
CurrentMenuState = StartGameMenu.GetStartMenuState();
Switch (EStartMenuState(CurrentMenuState))
{
case ECreateGame:
case ESoloGame:
if (StartGameMenu.OptionsComponent.GetWeeklySelectorIndex() != 0)
{
OverrideWeeklyIndex = StartGameMenu.OptionsComponent.GetWeeklySelectorIndex() - 1;
}
break;
}
}
if (KFPC.WorldInfo.NetMode == NM_Client)
{
if (KFPC != none && KFGameReplicationInfo(KFPC.WorldInfo.GRI) != none)
{
WeeklyIndex = KFGameReplicationInfo(KFPC.WorldInfo.GRI).CurrentWeeklyIndex;
}
else
{
GetPC().SetTimer(0.5f, false, nameof(PopulateData));
}
}
else
{
if (OverrideWeeklyIndex >= 0)
{
WeeklyIndex = OverrideWeeklyIndex;
}
else
{
WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod();
}
}
if (WeeklyIndex != -1)
{
bIsCustomWeekly = IntendedWeeklyIndex != WeeklyIndex;
}
bWeeklyComplete = KFPC.IsWeeklyEventComplete();
WeeklyIndex = -1;
if(bWeeklyComplete != bLastWeeklyComplete || !bInitialDataPopulated)
if (bWeeklyComplete != bLastWeeklyComplete || LastWeeklyPopulated != WeeklyIndex)
{
if (KFPC.WorldInfo.NetMode == NM_Client)
LastWeeklyPopulated = WeeklyIndex;
bLastWeeklyComplete = bWeeklyComplete;
LocalizeMenu(bIsCustomWeekly);
if (WeeklyIndex >= 0)
{
if (KFPC != none && KFGameReplicationInfo(KFPC.WorldInfo.GRI) != none)
{
WeeklyIndex = KFGameReplicationInfo(KFPC.WorldInfo.GRI).CurrentWeeklyIndex;
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(WeeklyIndex);
}
else
{
GetPC().SetTimer(0.5f, false, nameof(PopulateData));
}
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(WeeklyIndex);
}
else
{
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
}
DataObject = CreateObject("Object");
if(WeeklyInfo == none)
if (WeeklyInfo == none)
{
return false;
}
DataObject = CreateObject("Object");
DataObject.SetString("label", WeeklyInfo.FriendlyName);
if(WeeklyInfo.ModifierDescriptions.length > 0)
{
DataObject.SetString("description", WeeklyInfo.DescriptionStrings[0]);
}
DataObject.SetString("iconPath", "img://"$WeeklyInfo.IconPath);
DataObject.SetBool("complete", bWeeklyComplete);
@ -81,10 +135,8 @@ function bool PopulateData()
}
PopulateModifiers(WeeklyInfo);
PopulateRewards(WeeklyInfo, WeeklyIndex);
PopulateRewards(WeeklyInfo, WeeklyIndex, bIsCustomWeekly);
bLastWeeklyComplete = bWeeklyComplete;
bInitialDataPopulated = true;
return true;
}
@ -119,7 +171,7 @@ function PopulateModifiers(KFWeeklyOutbreakInformation WeeklyInfo)
SetObject("modifiers", DataProvider); //pass to SWF
}
function PopulateRewards(KFWeeklyOutbreakInformation WeeklyInfo, int WeeklyIndex)
function PopulateRewards(KFWeeklyOutbreakInformation WeeklyInfo, int WeeklyIndex, bool bIsCustomWeekly)
{
local int i, ItemCount;
local GFxObject DataProvider; //array containing the data objects
@ -144,13 +196,15 @@ function PopulateRewards(KFWeeklyOutbreakInformation WeeklyInfo, int WeeklyIndex
}
}
SetObject("rewards", DataProvider); //pass to SWF
UpdateDoshVaultRewardValue();
}
function UpdateDoshVaultRewardValue()
{
SetInt("vaultDoshReward", class'KFOnlineStatsWrite'.static.GetWeeklyEventReward());
if (bIsCustomWeekly == false)
{
SetObject("rewards", DataProvider); //pass to SWF
SetInt("vaultDoshReward", class'KFOnlineStatsWrite'.static.GetWeeklyEventReward());
}
else
{
SetInt("setHideRewards", 1);
}
}
function GFxObject CreateRewardItem(KFWeeklyOutbreakInformation WeeklyInfo,int ItemID)
@ -185,25 +239,34 @@ function GFxObject CreateRewardItem(KFWeeklyOutbreakInformation WeeklyInfo,int I
return DataObject;
}
function LocalizeMenu()
function LocalizeMenu(bool bIsCustomWeekly)
{
local GFxObject TextObject;
// local KFWeeklyOutbreakInformation WeeklyInfo;
// WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
TextObject = CreateObject("Object");
// Localize static text
TextObject.SetString("currentModifier", class'KFMission_LocalizedStrings'.default.CurrentWeeklySettingsString);
TextObject.SetString("reward", class'KFMission_LocalizedStrings'.default.RewardsString);
TextObject.SetString("granted", class'KFMission_LocalizedStrings'.default.GrantedWeeklyString);
TextObject.SetString("weekly", class'KFMission_LocalizedStrings'.default.WeeklyString);
TextObject.SetString("granted", class'KFMission_LocalizedStrings'.default.GrantedWeeklyString);
if (bIsCustomWeekly)
{
TextObject.SetString("weekly", class'KFMission_LocalizedStrings'.default.WeeklyString $class'KFMission_LocalizedStrings'.default.WeeklyCustomString);
}
else
{
TextObject.SetString("weekly", class'KFMission_LocalizedStrings'.default.WeeklyString);
}
TextObject.SetString("overview", class'KFMission_LocalizedStrings'.default.WeeklyOverview);
TextObject.SetString("vaultDosh", class'KFMission_LocalizedStrings'.default.VaultDoshString);
/*
if(WeeklyInfo != none && WeeklyInfo.ModifierDescriptions.length > 0)
{
TextObject.SetString("description", WeeklyInfo.ModifierDescriptions[0]);
}
*/
SetObject("localizedText", TextObject);
}
defaultproperties
{
LastWeeklyPopulated = -1
bLastWeeklyComplete = false
}

View File

@ -0,0 +1,36 @@
//=============================================================================
// KFGFxWidget_BountyHunt
//=============================================================================
// HUD Widget that displays bounty hunt messages to the player
//=============================================================================
// Killing Floor 2
// Copyright (C) 2023 Tripwire Interactive LLC
//
//=============================================================================
class KFGFxWidget_BountyHunt extends GFxObject;
function SetData(int Bounties, int Dosh, int DoshNoAssist)
{
local string BountyHuntString, BountyHuntStringDosh;
BountyHuntString = Localize("Objectives", "BountyHuntDescriptionShort", "KFGame")@Bounties;
SetString("BountyHuntDescSetLocalised", BountyHuntString);
BountyHuntStringDosh = ""$Dosh;
SetString("BountyHuntDoshSetLocalised", BountyHuntStringDosh);
}
function UpdateBountyHuntVisibility(bool visible)
{
if (visible)
{
SetBool("BountyHuntSetVisibility", true);
}
else
{
SetBool("BountyHuntSetVisibility", false);
}
}

View File

@ -44,9 +44,15 @@ var bool bReadingPlayfabStoreData;
var private{private} const int SeasonalEventId;
var private const int LoadedSeasonalEventId;
/** Week index of the year - Used as index into weekly event */
/** Week index of the year - Used as index into weekly event, this is the Intended one, the one the system time should apply */
var private int IntendedWeeklyEventIndex;
/** Week index of the year - Used as index into weekly event, this is the one used by the game, it starts as the system time one but can be overriden later */
var private int WeeklyEventIndex;
// If we forced via cmd line
var private bool IsForceWeeklyEvent;
/************************************************************************************
* @name Content
@ -469,8 +475,12 @@ function ClearOnlineDelegates()
/** Static because these are both called on default object */
native static function int GetSeasonalEventID();
native static function int GetIntendedWeeklyEventIndex();
native static function int GetIntendedWeeklyEventIndexMod();
native static function int GetWeeklyEventIndex();
native static function int GetWeeklyEventIndexMod();
native static function SetWeeklyEventIndex(int index);
native static function bool GetIsForceWeeklyEvent();
native static function bool IsSalesEventActive();
native static function bool IsSalesEventChecked();
/***********************************************************************************
@ -649,7 +659,9 @@ DefaultProperties
KFFontScale=0.65f
SeasonalEventId=-1
LoadedSeasonalEventId=-1
IntendedWeeklyEventIndex=-1
WeeklyEventIndex=-1
IsForceWeeklyEvent=false
LocalLoginStatus=LS_LoggedIn
SafeFrameScale=1.0

View File

@ -212,6 +212,7 @@ var protected const array< class<KFPawn_Monster> > AITestBossClassList; //List
var protected int BossIndex; //Index into boss array, only preload content for the boss we want - PC builds can handle DLO cost much better
var int AllowSeasonalSkinsIndex;
var int WeeklySelectorIndex;
/** Class replacements for each zed type */
struct native SpawnReplacement
@ -662,6 +663,29 @@ event InitGame( string Options, out string ErrorMessage )
{
local string OptionRead;
OptionRead = ParseOption(Options, "WeeklySelectorIndex");
if (OptionRead != "")
{
WeeklySelectorIndex = int(OptionRead);
}
else // If doesn't exist on the Options we default it..
{
WeeklySelectorIndex = -1;
}
if (WeeklySelectorIndex > 0)
{
// 0 is default, we move one index to the left so it matches first Weekly Mode
KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(WeeklySelectorIndex - 1);
}
else if (KFGameEngine(class'Engine'.static.GetEngine()).GetIsForceWeeklyEvent() == false)
{
// If we didn't force via cmd line and we ask for default, force the intended to make sure we are updated
KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(KFGameEngine(class'Engine'.static.GetEngine()).GetIntendedWeeklyEventIndex());
}
`Log("TEST - InitGame : " $WeeklySelectorIndex);
Super.InitGame( Options, ErrorMessage );
if (UsesModifiedDifficulty())
@ -760,6 +784,7 @@ function UpdateGameSettings()
if (KFGameSettings != none)
{
KFGameSettings.bNoSeasonalSkins = AllowSeasonalSkinsIndex == 1;
KFGameSettings.WeeklySelectorIndex = WeeklySelectorIndex;
}
}
}
@ -917,7 +942,7 @@ event PreLogin(string Options, string Address, const UniqueNetId UniqueId, bool
{
local bool bSpectator;
local bool bPerfTesting;
local string DesiredDifficulty, DesiredWaveLength, DesiredGameMode;
local string DesiredDifficulty, DesiredWaveLength, DesiredGameMode, DesiredWeeklySelectorIndex;
// Check for an arbitrated match in progress and kick if needed
if (WorldInfo.NetMode != NM_Standalone && bUsingArbitration && bHasArbitratedHandshakeBegun)
@ -965,8 +990,15 @@ event PreLogin(string Options, string Address, const UniqueNetId UniqueId, bool
ErrorMessage = "Server No longer available. Mismatch DesiredGameMode.";
return;
}
}
DesiredWeeklySelectorIndex = ParseOption(Options, "WeeklySelectorIndex");
if( DesiredWeeklySelectorIndex != "" && int(DesiredWeeklySelectorIndex) != WeeklySelectorIndex)
{
`log("Got bad weekly selector index"@DesiredWeeklySelectorIndex@"expected"@WeeklySelectorIndex);
ErrorMessage = "Server No longer available. Mismatch DesiredWeeklySelectorIndex.";
return;
}
}
bPerfTesting = ( ParseOption( Options, "AutomatedPerfTesting" ) ~= "1" );
bSpectator = bPerfTesting || ( ParseOption( Options, "SpectatorOnly" ) ~= "1" ) || ( ParseOption( Options, "CauseEvent" ) ~= "FlyThrough" );
@ -1148,6 +1180,9 @@ function InitGRIVariables()
MyKFGRI.bVersusGame = bIsVersusGame;
MyKFGRI.MaxHumanCount = MaxPlayers;
MyKFGRI.NotifyAllowSeasonalSkins(AllowSeasonalSkinsIndex);
MyKFGRI.NotifyWeeklySelector(WeeklySelectorIndex);
`Log("TEST - InitGRIVariables- NotifyWeeklySelector : " $WeeklySelectorIndex);
SetBossIndex();
}
@ -1654,9 +1689,12 @@ function float GetTotalWaveCountScale()
return 1.0f;
}
if (OutbreakEvent != none && OutbreakEvent.ActiveEvent.WaveAICountScale.Length > 0)
if (OutbreakEvent != none)
{
return GetLivingPlayerCount() > OutbreakEvent.ActiveEvent.WaveAICountScale.Length ? OutbreakEvent.ActiveEvent.WaveAICountScale[OutbreakEvent.ActiveEvent.WaveAICountScale.Length - 1] : OutbreakEvent.ActiveEvent.WaveAICountScale[GetLivingPlayerCount() - 1];
if (OutbreakEvent.ActiveEvent.WaveAICountScale.Length > 0)
{
return GetLivingPlayerCount() > OutbreakEvent.ActiveEvent.WaveAICountScale.Length ? OutbreakEvent.ActiveEvent.WaveAICountScale[OutbreakEvent.ActiveEvent.WaveAICountScale.Length - 1] : OutbreakEvent.ActiveEvent.WaveAICountScale[GetLivingPlayerCount() - 1];
}
}
return 1.0f;
@ -2231,7 +2269,7 @@ function class<DamageType> GetLastHitByDamageType(class<DamageType> DT, KFPawn_M
}
else
{
`warn( "GetLastHitByDamageType() Received non-KFDamageType damagetype:"@DT);
//`warn( "GetLastHitByDamageType() Received non-KFDamageType damagetype:"@DT);
}
return RealDT;
@ -2577,6 +2615,7 @@ protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, cons
&& DamageHistory[i].DamagerPRI != none )
{
EarnedDosh = Round( DamageHistory[i].TotalDamage * ScoreDenominator );
//`log("SCORING: Player" @ DamageHistory[i].DamagerPRI.PlayerName @ "received" @ EarnedDosh @ "dosh for killing a" @ MonsterClass, bLogScoring);
DamagerKFPRI = KFPlayerReplicationInfo(DamageHistory[i].DamagerPRI);
if( DamagerKFPRI != none )
@ -2591,26 +2630,32 @@ protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, cons
DamageHistory[i].DamagePerks[0].static.ModifyAssistDosh( EarnedDosh );
}
}
if (bIsBossKill && !bSplitBossDoshReward)
{
DamagerKFPRI.AddDosh(GetAdjustedAIDoshValue(MonsterClass), true);
}
else
{
DamagerKFPRI.AddDosh(EarnedDosh, true);
}
if (MyKFGRI.IsBountyHunt() == false)
{
if (bIsBossKill && !bSplitBossDoshReward)
{
DamagerKFPRI.AddDosh(GetAdjustedAIDoshValue(MonsterClass), true);
}
else
{
DamagerKFPRI.AddDosh(EarnedDosh, true);
}
}
if( DamagerKFPRI.Team != none )
{
//Dosh
if (bIsBossKill && !bSplitBossDoshReward)
{
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(GetAdjustedAIDoshValue(MonsterClass));
}
else
{
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(EarnedDosh);
if (MyKFGRI.IsBountyHunt() == false)
{
if (bIsBossKill && !bSplitBossDoshReward)
{
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(GetAdjustedAIDoshValue(MonsterClass));
}
else
{
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(EarnedDosh);
}
}
if( DamageHistory[i].DamagePerks.Length <= 0 )
@ -3003,12 +3048,35 @@ function string GetNextMap()
*/
if (IsWeekly())
{
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
if ((class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 0 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[0]) || // Boom
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 1 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[1]) || // Cranium Cracker
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 2 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[2]) || // Tiny Terror
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 3 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[3]) || // Bobble Zed
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 4 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[4]) || // Poundemonium
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 5 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[5]) || // Up Up and Decay
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 6 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[6]) || // Zed Time
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 7 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[7]) || // Beefcake
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 8 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[8]) || // Bloodthirst
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 9 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[9]) || // Coliseum
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 10 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[10]) || // Arachnophobia
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 11 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[11]) || // Scavenger
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[12]) || // WW
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 13 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[13]) || // Abandon
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 15 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[15]) || // Shrunken Heads
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 18 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[18])) // Perk Roulette
{
if (MapName == MapSantas)
{
continue;
}
}
if ((class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 11 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[11]) || // Scavenger
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14]) || // Boss Rush
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 16 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[16])) // Gun Game
{
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
if (MapName == MapBiolapse ||
MapName == MapNightmare ||
MapName == MapPowerCore ||
@ -3021,8 +3089,6 @@ function string GetNextMap()
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 19 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[19]) // Contamination
{
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
if (MapName == MapBiolapse ||
MapName == MapNightmare ||
MapName == MapPowerCore ||
@ -3035,13 +3101,27 @@ function string GetNextMap()
}
}
/* Temporary removal of SteamFrotress for BossRush */
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14] &&
MapName == MapSteam)
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 20 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[20]) // Bounty Hunt
{
continue;
if (MapName == MapBiolapse ||
MapName == MapNightmare ||
MapName == MapPowerCore ||
MapName == MapDescent ||
MapName == MapKrampus ||
MapName == MapElysium ||
MapName == MapSteam)
{
continue;
}
}
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14])
{
if (MapName == MapSteam)
{
continue;
}
}
/* */
}
if ( IsMapAllowedInCycle(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]) )
@ -4001,6 +4081,16 @@ simulated function ModifyDamageGiven(out int InDamage, optional Actor DamageCaus
**********************************************/
simulated function NotifyPlayerStatsInitialized(KFPlayerController_WeeklySurvival KFPC){}
simulated function int WeeklyExtraNumberOfZeds()
{
return 0;
}
simulated function int WeeklyCurrentExtraNumberOfZeds()
{
return 0;
}
defaultproperties
{
/** Scoring */
@ -4047,6 +4137,7 @@ defaultproperties
bWaitingToStartMatch=true
bDelayedStart=true
AllowSeasonalSkinsIndex=0
WeeklySelectorIndex=-1
ActionMusicDelay=5.0
ForcedMusicTracks(0)=KFMusicTrackInfo'WW_MMNU_Login.TrackInfo' // menu

View File

@ -386,6 +386,7 @@ var repnotify int VIPRepMaxHealth;
var repnotify KFPlayerReplicationInfo VIPRepPlayer;
var bool bAllowSeasonalSkins;
var int WeeklySelectorIndex;
/************************************
* Steam heartbeat
@ -421,11 +422,11 @@ replication
TraderVolume, TraderVolumeCheckType, bTraderIsOpen, NextTrader, WaveNum, bWaveIsEndless, GunGameWavesCurrent, bWaveGunGameIsFinal, AIRemaining, WaveTotalAICount, bWaveIsActive, MaxHumanCount, bGlobalDamage,
CurrentObjective, PreviousObjective, PreviousObjectiveResult, PreviousObjectiveXPResult, PreviousObjectiveVoshResult, MusicIntensity, ReplicatedMusicTrackInfo, MusicTrackRepCount,
bIsUnrankedGame, GameSharedUnlocks, bHidePawnIcons, ConsoleGameSessionGuid, GameDifficulty, GameDifficultyModifier, BossIndex, bWaveStarted, NextObjective, bIsBrokenTrader, bIsWeeklyMode,
CurrentWeeklyIndex, bIsEndlessPaused, bForceSkipTraderUI, VIPRepCurrentHealth, VIPRepMaxHealth, VIPRepPlayer; //@HSL - JRO - 3/21/2016 - PS4 Sessions
bIsEndlessPaused, bForceSkipTraderUI, VIPRepCurrentHealth, VIPRepMaxHealth, VIPRepPlayer; //@HSL - JRO - 3/21/2016 - PS4 Sessions
if ( bNetInitial )
GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled, bForceShowSkipTrader, bAllowSeasonalSkins;
if ( bNetInitial || bNetDirty )
PerksAvailableData;
CurrentWeeklyIndex, WeeklySelectorIndex, PerksAvailableData;
if ( bNetInitial && Role == ROLE_Authority )
ServerAdInfo;
@ -1376,7 +1377,7 @@ simulated function DisplayDebug(HUD HUD, out float YL, out float YPos)
TotalClots++;
NumAlphas++;
}
else if( KFPM.IsA('KFPawn_ZedClot_Cyst') )
else if( KFPM.IsA('KFPawn_ZedClot_Cyst') || KFPM.IsA('KFPawn_ZedHansClot') )
{
TotalClots++;
NumUnders++;
@ -2312,10 +2313,16 @@ simulated function NotifyWeeklyEventIndex(int EventIndex)
simulated function NotifyAllowSeasonalSkins(int AllowSeasonalSkinsIndex)
{
bAllowSeasonalSkins = (AllowSeasonalSkinsIndex == 0);
`Log("NotifyAllowSeasonalSkins: AllowSeasonalSkins: "$bAllowSeasonalSkins);
bNetDirty = true;
}
simulated function NotifyWeeklySelector(int WeeklySelectorIndex_)
{
WeeklySelectorIndex = WeeklySelectorIndex_;
bNetDirty = true;
`Log("TEST - NotifyWeeklySelector : " $WeeklySelectorIndex);
}
/** VIP weekly */
@ -2449,6 +2456,27 @@ simulated function int ContaminationModeExtraDosh()
return 0;
}
simulated function bool IsBountyHunt()
{
return bIsWeeklyMode && CurrentWeeklyIndex == 20;
}
simulated function int BountyHuntExtraDosh()
{
local KFGameInfo KFGI;
if (IsBountyHunt())
{
KFGI = KFGameInfo(WorldInfo.Game);
if (KFGI != none && KFGI.OutbreakEvent != none)
{
return KFGI.OutbreakEvent.ActiveEvent.BountyHuntExtraDosh;
}
}
return 0;
}
defaultproperties
{
TraderItemsPath="GP_Trader_ARCH.DefaultTraderItems"
@ -2471,6 +2499,7 @@ defaultproperties
bIsWeeklyMode=false
bForceShowSkipTrader=false
bAllowSeasonalSkins=true
WeeklySelectorIndex=-1
bForceSkipTraderUI=false
GunGameWavesCurrent=1
bWaveGunGameIsFinal=false

View File

@ -33,6 +33,7 @@ var transient int CurrentSearchIndex;
var const string ModeKey, DifficultyKey, MapKey, WhitelistedKey, InProgressKey, PermissionsKey, ServerTypeKey;
var const string GameLengthKey;
var const string AllowSeasonalSkinsKey;
var const string WeeklySelectorKey;
var KFGFxStartGameContainer_FindGame FindGameContainer;
var KFGFxStartGameContainer_Options OptionsComponent;
@ -68,6 +69,7 @@ var localized string MapTitle;
var localized string MutatorTitle;
var localized string PermissionsTitle;
var localized string AllowSeasonalSkinsTitle;
var localized string WeeklySelectorTitle;
var localized string ServerTypeString;
var localized string WhiteListedTitle;
var localized string InfoTitle;
@ -208,7 +210,7 @@ static function class<KFGFxSpecialeventObjectivesContainer> GetSpecialEventClass
case SEI_Summer:
return class'KFGFxSpecialEventObjectivesContainer_Summer2023';
case SEI_Fall:
return class'KFGFxSpecialEventObjectivesContainer_Fall2022';
return class'KFGFxSpecialEventObjectivesContainer_Fall2023';
case SEI_Winter:
return class'KFGFXSpecialEventObjectivesContainer_Xmas2022';
}
@ -608,6 +610,7 @@ function SendLeaderOptions()
SetLobbyData(ModeKey, String(Manager.GetModeIndex()));
SetLobbyData(PermissionsKey, String(OptionsComponent.GetPrivacyIndex()));
SetLobbyData(AllowSeasonalSkinsKey, String(OptionsComponent.GetAllowSeasonalSkinsIndex()));
SetLobbyData(WeeklySelectorKey, String(OptionsComponent.GetWeeklySelectorIndex()));
}
}
@ -640,6 +643,9 @@ function ReceiveLeaderOptions()
OptionIndex = Int(OnlineLobby.GetLobbyData(0, AllowSeasonalSkinsKey));
OverviewContainer.UpdateAllowSeasonalSkins(class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsString(OptionIndex));
OptionIndex = Int(OnlineLobby.GetLobbyData(0, WeeklySelectorKey));
OverviewContainer.UpdateWeeklySelector(class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorString(OptionIndex));
}
function ApproveMatchMakingLeave()
@ -924,6 +930,7 @@ function Callback_CancelSearch()
function Callback_OptionListOpened(string ListName, int OptionIndex)
{
local string MessageString;
local int IntendedWeeklyIndex;
if (OptionsComponent.bIsSoloGame && ListName == "modeList")
{
@ -939,6 +946,12 @@ function Callback_OptionListOpened(string ListName, int OptionIndex)
{
return;
}
if (ListName == "weeklySelectorList" && OptionIndex == 0)
{
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
OptionIndex = IntendedWeeklyIndex + 1;
}
MessageString = Localize("StartMenuHelperText", ListName$OptionIndex, "KFGame");
@ -1092,6 +1105,11 @@ function Callback_AllowSeasonalSkins(int Index)
OptionsComponent.AllowSeasonalSkinsChanged(Index);
}
function Callback_WeeklySelector(int Index)
{
OptionsComponent.WeeklySelectorChanged(Index);
}
function SetLobbyData( string KeyName, string ValueData )
{
OnlineLobby.SetLobbyData( KeyName, ValueData );
@ -1100,14 +1118,25 @@ function SetLobbyData( string KeyName, string ValueData )
function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent)
{
local string MapName;
local int LengthIndex, ModeIndex, AllowSeasonalSkins;
local int LengthIndex, ModeIndex, AllowSeasonalSkins, WeeklySelectorIndex, IntendedWeeklyIndex;
local string MapURL;
local byte CurrentMenuState;
MapName = "";
// this is ugly, but effectively makes sure that the player isn't solo with versus selected
// or other error cases such as when the game isn't fully installed
ModeIndex = InOptionsComponent.GetNormalizedGameModeIndex(Manager.GetModeIndex(true));
LengthIndex = InOptionsComponent.GetLengthIndex();
MapName = InOptionsComponent.GetMapName();
CurrentMenuState = GetStartMenuState();
// In Find a Match we can't choose map, so don't use the options dropwdown
if (CurrentMenuState != EMatchmaking)
{
MapName = InOptionsComponent.GetMapName();
}
if (MapName == "" || MapStringList.Find(MapName) == INDEX_NONE)
{
if (CurrentConnectMap != "" && MapStringList.Find(CurrentConnectMap) != INDEX_NONE)
@ -1148,19 +1177,58 @@ function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent)
else
{
AllowSeasonalSkins = 0;
}
}
if (GetStartMenuState() == EMatchmaking
if (CurrentMenuState == EMatchmaking
|| class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None
|| class'KFGameEngine'.static.GetSeasonalEventID() == SEI_Spring)
{
AllowSeasonalSkins = 1; // Default if we don't have a season or it's find a match menu
}
return MapName$"?Game="$class'KFGameInfo'.static.GetGameModeClassFromNum( ModeIndex )
MapURL = MapName$"?Game="$class'KFGameInfo'.static.GetGameModeClassFromNum( ModeIndex )
$"?Difficulty="$class'KFGameDifficultyInfo'.static.GetDifficultyValue( InOptionsComponent.GetDifficultyIndex() )
$"?GameLength="$LengthIndex
$"?AllowSeasonalSkins="$AllowSeasonalSkins;
if (ModeIndex == 1) // Only when mode is Weekly
{
WeeklySelectorIndex = -1;
// Depending on StartMenu State we takeover with different weekly index selection
Switch (CurrentMenuState)
{
case EMatchmaking:
// always default on "Find Game"
WeeklySelectorIndex = 0;
break;
case ECreateGame:
case ESoloGame:
// use your selection on "Create Game" and "Play Solo"
WeeklySelectorIndex = InOptionsComponent.GetWeeklySelectorIndex();
// IF index matches default, set to 0 (default)
if (WeeklySelectorIndex > 0)
{
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
if (IntendedWeeklyIndex == (WeeklySelectorIndex - 1))
{
WeeklySelectorIndex = 0;
}
}
break;
}
if (WeeklySelectorIndex >= 0)
{
MapURL $= "?WeeklySelectorIndex="$WeeklySelectorIndex;
}
}
return MapURL;
}
native function bool GetSearchComplete(KFOnlineGameSearch GameSearch);
@ -1510,6 +1578,8 @@ function BuildServerFilters(OnlineGameInterface GameInterfaceSteam, KFGFxStartGa
local string GameTagFilters;
local ActiveLobbyInfo LobbyInfo;
//local bool bAllowSeasonal;
local byte CurrentMenuState;
local int WeeklySelectorIndex, IntendedWeeklyIndex;
Search.ClearServerFilters();
@ -1562,6 +1632,44 @@ function BuildServerFilters(OnlineGameInterface GameInterfaceSteam, KFGFxStartGa
Search.AddGametagFilter( GameTagFilters, 'Mode', string(GameMode) );
}
if (GameMode == 1) // Only when mode is Weekly
{
WeeklySelectorIndex = -1;
// Depending on StartMenu State we Search with different weekly index selection
CurrentMenuState = GetStartMenuState();
Switch (EStartMenuState(CurrentMenuState))
{
/*case EMatchmaking:
// We take any weekly, so don't specify
WeeklySelectorIndex = 0;
break;
*/
case ECreateGame:
case ESoloGame:
// use your selection on "Create Game" and "Play Solo"
WeeklySelectorIndex = OptionsComponent.GetWeeklySelectorIndex();
// IF index matches default, set to 0 (default)
if (WeeklySelectorIndex > 0)
{
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
if (IntendedWeeklyIndex == (WeeklySelectorIndex - 1))
{
WeeklySelectorIndex = 0;
}
}
break;
}
if (WeeklySelectorIndex >= 0)
{
Search.AddGametagFilter(GameTagFilters, 'WeeklySelectorIndex', string(WeeklySelectorIndex));
}
}
//For modes that don't use filtered difficulty, don't even attempt to send this (Ex: Weekly)
if (ShouldUseDifficultyFilter(GameMode))
{
@ -1959,6 +2067,7 @@ defaultproperties
InProgressKey="InProgress"
PermissionsKey="PermissionsKey"
AllowSeasonalSkinsKey="AllowSeasonalSkinsKey"
WeeklySelectorKey="WeeklySelectorKey"
SearchDSName=KFGameSearch

View File

@ -780,6 +780,16 @@ function Callback_PerkChanged(int PerkIndex)
{
MyKFPC.SetHaveUpdatePerk(true);
if (KFPerk_Survivalist(MyKFPC.CurrentPerk) != none)
{
KFPerk_Survivalist(MyKFPC.CurrentPerk).StartingWeaponClassIndex = MyKFPC.SurvivalPerkWeapIndex;
KFPerk_Survivalist(MyKFPC.CurrentPerk).StartingGrenadeClassIndex = MyKFPC.SurvivalPerkGrenIndex;
KFPerk_Survivalist(MyKFPC.CurrentPerk).UpdateCurrentGrenade();
MyKFPC.GetPurchaseHelper().InitializeOwnedGrenade();
}
// re-initialize and refresh to reflect current carry weight (can change by perk)
MyKFPC.GetPurchaseHelper().Initialize(false);
RefreshItemComponents();
@ -792,6 +802,7 @@ function Callback_PerkChanged(int PerkIndex)
{
PlayerInventoryContainer.UpdateLock();
}
UpdatePlayerInfo();
// Refresht he UI

View File

@ -1872,6 +1872,20 @@ event bool FilterButtonInput(int ControllerId, name ButtonName, EInputEvent Inpu
CurrentMenu.Callback_ReadyClicked(true);
}
}
else if (ButtonName == 'XboxTypeS_DPad_Left')
{
if(CurrentMenu != none)
{
CurrentMenu.OnDpadPressed(-1);
}
}
else if (ButtonName == 'XboxTypeS_DPad_Right')
{
if(CurrentMenu != none)
{
CurrentMenu.OnDpadPressed(1);
}
}
else if(ButtonName == 'XboxTypeS_RightThumbstick')
{
if(CurrentMenu != none)
@ -2278,6 +2292,11 @@ function int GetModeIndex(optional bool bAdjustedIndex = true)
return SavedModeIndex;
}
function int GetWeeklySelectorIndex()
{
return CachedProfile.GetProfileInt(KFID_SavedWeeklySelectorIndex);
}
function OnLoginOnOtherPlatformDoneAndFriendsReady()
{
local KFGFxPopup_FriendsList FriendsList;

View File

@ -36,6 +36,11 @@ function InitOnlineLobby()
OnlineLobby = GetPC().OnlineSub.GetLobbyInterface();
}
}
function OnDpadPressed(int Right)
{
}
function OnR3Pressed()
{
local KFPlayerController KFPC;
@ -516,6 +521,16 @@ function Callback_OnLoadoutNextWeaponPressed()
Manager.PerksMenu.OnNextWeaponPressed();
}
function Callback_OnLoadoutPrevSecondaryWeaponPressed()
{
Manager.PerksMenu.OnPrevSecondaryWeaponPressed();
}
function Callback_OnLoadoutNextSecondaryWeaponPressed()
{
Manager.PerksMenu.OnNextSecondaryWeaponPressed();
}
function Callback_OnLoadoutPrevGrenadePressed()
{
Manager.PerksMenu.OnPrevGrenadePressed();

View File

@ -673,6 +673,11 @@ function DrawHUD()
// Draw last remaining zeds
CheckAndDrawRemainingZedIcons();
if (KFGRI.IsBountyHunt())
{
CheckAndDrawBountyHudIcons();
}
if (KFGRI.IsContaminationMode())
{
// While on trader time we let previsualize the next objective icon, so players can get ready
@ -698,7 +703,19 @@ function DrawHUD()
Canvas.EnableStencilTest(false);
}
else
{
if( !KFGRI.bHidePawnIcons )
{
// Draw last remaining zeds
CheckAndDrawRemainingZedIcons();
if (KFGRI.IsBountyHunt())
{
CheckAndDrawBountyHudIcons();
}
}
}
}
}
@ -1382,6 +1399,7 @@ function CheckAndDrawRemainingZedIcons()
local Pawn P;
local vector ViewLocation, ViewDir, PawnLocation;
local rotator ViewRotation;
local KFPawn_Monster Monster;
if( KFGRI == none
|| KFPlayerOwner == none
@ -1402,20 +1420,109 @@ function CheckAndDrawRemainingZedIcons()
if( P.Mesh.SkeletalMesh == none
|| !P.Mesh.bAnimTreeInitialised
|| P.GetTeamNum() == PlayerOwner.GetTeamNum()
|| !P.IsAliveAndWell())
|| !P.IsAliveAndWell() )
//|| `TimeSince(P.Mesh.LastRenderTime) < 0.2f )
{
continue;
}
Monster = KFPawn_Monster(P);
if (Monster != none && Monster.bIsBountyHuntObjective)
{
continue;
}
PawnLocation = P.Mesh.GetPosition();
DrawZedIcon( P, PawnLocation, Normal((PawnLocation + (P.CylinderComponent.CollisionHeight * vect(0, 0, 1))) - ViewLocation) dot ViewDir);
DrawZedIcon( P, PawnLocation
, Normal((PawnLocation + (P.CylinderComponent.CollisionHeight * vect(0, 0, 1))) - ViewLocation) dot ViewDir
, ZedIconColor, 1.f);
}
}
function CheckAndDrawBountyHudIcons()
{
local KFPawn_Monster Monster;
local vector ViewLocation, ViewDir, PawnLocation;
local rotator ViewRotation;
local color ZedColor;
local float WaveProgress;
if( KFGRI == none
|| KFPlayerOwner == none
|| KFPlayerOwner.PlayerCamera == none
|| KFGRI.IsBossWave()
|| KFGRI.IsEndlessWave())
{
return;
}
KFPlayerOwner.PlayerCamera.GetCameraViewPoint( ViewLocation, ViewRotation );
ViewDir = vector( ViewRotation );
if (KFGRI.WaveTotalAICount > 0)
{
WaveProgress = float(KFGRI.AIRemaining) / float(KFGRI.WaveTotalAICount);
}
else
{
WaveProgress = 1.f;
}
foreach WorldInfo.AllPawns( class'KFPawn_Monster', Monster )
{
if (Monster.bIsBountyHuntObjective == false)
{
continue;
}
if (Monster.IsAliveAndWell() == false)
{
continue;
}
if (Monster.Mesh.SkeletalMesh != none
&& Monster.Mesh.bAnimTreeInitialised)
{
PawnLocation = Monster.Mesh.GetPosition();
}
else
{
PawnLocation = Monster.Location;
}
ZedColor = ZedIconColor;
if (Monster.bIsBountyHuntOnLastTier)
{
// Red (R = 255, G = 0, B = 0, A = 192)
ZedColor.R = 255;
ZedColor.G = 0;
ZedColor.B = 0;
}
else if (WaveProgress < 0.5f)
{
// Orange (R = 255, G = 128, B = 0, A = 192)
ZedColor.R = 255;
ZedColor.G = 128;
ZedColor.B = 0;
}
else
{
// Yellow (R = 255, G = 255, B = 0, A = 192)
ZedColor.R = 255;
ZedColor.G = 255;
ZedColor.B = 0;
}
DrawZedIcon( Monster, PawnLocation
, Normal((PawnLocation + (Monster.CylinderComponent.CollisionHeight * vect(0, 0, 1))) - ViewLocation) dot ViewDir
, ZedColor, 1.5f);
}
}
/** Draws a zed icon */
function DrawZedIcon( Pawn ZedPawn, vector PawnLocation, float NormalizedAngle )
function DrawZedIcon( Pawn ZedPawn, vector PawnLocation, float NormalizedAngle, color ColorToUse, float SizeMultiplier )
{
local vector ScreenPos, TargetLocation;
local float IconSizeMult;
@ -1425,7 +1532,7 @@ function DrawZedIcon( Pawn ZedPawn, vector PawnLocation, float NormalizedAngle )
TargetLocation = PawnLocation + ( vect(0,0,2.5f) * ZedPawn.CylinderComponent.CollisionHeight );
ScreenPos = Canvas.Project( TargetLocation );
IconSizeMult = PlayerStatusIconSize * ResModifier * 0.5f;
IconSizeMult = PlayerStatusIconSize * ResModifier * 0.5f * SizeMultiplier;
ScreenPos.X -= IconSizeMult;
ScreenPos.Y -= IconSizeMult;
@ -1448,9 +1555,8 @@ function DrawZedIcon( Pawn ZedPawn, vector PawnLocation, float NormalizedAngle )
ScreenPos = GetClampedScreenPosition(ScreenPos);
}
// Draw boss icon
Canvas.SetDrawColorStruct( ZedIconColor );
Canvas.SetDrawColorStruct( ColorToUse );
Canvas.SetPos( ScreenPos.X, ScreenPos.Y );
Canvas.DrawTile( GenericZedIconTexture, IconSizeMult, IconSizeMult, 0, 0, 128, 128 );
}

View File

@ -543,6 +543,22 @@ simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon, o
{
local KFWeapon W, BestWeapon, BackupGun;
local float Rating, BestRating;
local PlayerController PC;
PC = PlayerController(Instigator.Controller);
if (PC != none && KFPawn(PC.Pawn) != none)
{
BestWeapon = KFPawn(PC.Pawn).FindBestWeapon(true, allow9mm);
if (BestWeapon == none && allow9mm == false)
{
BestWeapon = KFPawn(PC.Pawn).FindBestWeapon(true, true);
}
if (BestWeapon != none)
{
return BestWeapon;
}
}
ForEach InventoryActors( class'KFWeapon', W )
{
@ -1369,7 +1385,7 @@ simulated function AttemptQuickHeal()
/** Equip the welder immediately */
simulated function bool QuickWeld()
{
local KFWeapon KFW;
local KFWeapon KFW, PreviousKFW;
local KFInterface_Usable UsableTrigger;
local KFDoorTrigger DoorTrigger;
local KFRepairableActorTrigger RepairableTrigger;
@ -1382,8 +1398,8 @@ simulated function bool QuickWeld()
}
// make sure player is actually allowed to switch weapons
KFW = KFWeapon( Instigator.Weapon );
if( KFW != none && !KFW.CanSwitchWeapons() )
PreviousKFW = KFWeapon( Instigator.Weapon );
if( PreviousKFW != none && !PreviousKFW.CanSwitchWeapons() )
{
return false;
}
@ -1413,6 +1429,7 @@ simulated function bool QuickWeld()
{
if( KFW.IsA('KFWeap_Welder') )
{
KFPC.MyGFxHUD.WeaponSelectWidget.UpdateWeaponGroupOnHUD(PreviousKFW.InventoryGroup);
SetCurrentWeapon(KFW);
ShowAllHUDGroups();
return true;
@ -2674,7 +2691,8 @@ simulated function int GetAdjustedSellPriceFor(
// if OwnedItem is a dual, set sell price to that of a single (because we sell one single and keep one single)
// Special case for 9mm
if( OwnedItem.SingleClassName == 'KFWeap_Pistol_9mm')
if( OwnedItem.SingleClassName == 'KFWeap_Pistol_9mm'
|| OwnedItem.SingleClassName == 'KFWeap_HRG_93R' )
{
// @todo: revisit
// assume price of single is half the price of dual. might be better to use the actual buy price of the single,
@ -2712,7 +2730,7 @@ simulated function int GetDisplayedBlocksRequiredFor( const out STraderItem Shop
// for now, only adjust blocks required for duals, except for dual 9mm since the single 9mm doesn't require any blocks
// display half weight of dual if player owns single
if( !(ShopItem.SingleClassName == '' || ShopItem.SingleClassName == 'KFWeap_Pistol_9mm') && GetIsOwned(ShopItem.SingleClassName) )
if( !(ShopItem.SingleClassName == '' || ShopItem.SingleClassName == 'KFWeap_Pistol_9mm' || ShopItem.SingleClassName == 'KFWeap_HRG_93R') && GetIsOwned(ShopItem.SingleClassName) )
{
BlocksRequired /= 2;
}
@ -2798,6 +2816,21 @@ simulated event DiscardInventory()
}
}
simulated function bool Is9mmInInventory()
{
local Inventory Inv;
for (Inv = InventoryChain; Inv != None; Inv = Inv.Inventory)
{
if (Inv.Class.name == 'KFWeap_Pistol_9mm' || Inv.Class.name == 'KFWeap_Pistol_Dual9mm')
{
return true;
}
}
return false;
}
defaultproperties
{
PendingFire(0)=0 // DEFAULT_FIREMOD

View File

@ -13,6 +13,7 @@ class KFMission_LocalizedStrings extends Object
var localized string GrantedWeeklyString;
var localized string WeeklyString;
var localized string WeeklyCustomString;
var localized string CurrentWeeklySettingsString;
var localized string SpecialEventString;

View File

@ -74,6 +74,7 @@ defaultproperties
ColumnIds.Add(STATID_ACHIEVE_BarmwichCollectibles)
ColumnIds.Add(STATID_ACHIEVE_CrashCollectibles);
ColumnIds.Add(STATID_ACHIEVE_SubductionCollectibles);
ColumnIds.Add(STATID_ACHIEVE_VolterCastleCollectibles);
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky5, Name="AchievementMrPerky5"))
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky10, Name = "AchievementMrPerky10"))
@ -136,5 +137,6 @@ defaultproperties
ColumnMappings.Add((Id=STATID_ACHIEVE_BarmwichCollectibles,Name="AchievementCollectBarmwichTown"))
ColumnMappings.Add((Id=STATID_ACHIEVE_CrashCollectibles,Name="AchievementCollectCrash"))
ColumnMappings.Add((Id=STATID_ACHIEVE_SubductionCollectibles,Name="AchievementCollectSubduction"))
ColumnMappings.Add((Id=STATID_ACHIEVE_VolterCastleCollectibles,Name="AchievementCollectVolterCastle"))
}

View File

@ -457,6 +457,10 @@ const KFACHID_SubductionHard = 301;
const KFACHID_SubductionHellOnEarth = 302;
const KFACHID_SubductionCollectibles = 303;
const KFACHID_VolterCastleHard = 304;
const KFACHID_VolterCastleHellOnEarth = 305;
const KFACHID_VolterCastleCollectibles = 306;
/* __TW_ANALYTICS_ */
var int PerRoundWeldXP;
var int PerRoundHealXP;
@ -1195,6 +1199,11 @@ private event AddAfflictionCaused(EAfflictionType Type)
SeasonalEventStats_OnAfflictionCaused(Type);
}
private event AddCollectibleFound(int Limit)
{
SeasonalEventStats_OnCollectibleFound(Limit);
}
private native function AddToKillObjectives(class<KFPawn_Monster> ZedClass);
private native function AddToVersusKillObjectives(class<Pawn> KillerClass);
@ -1925,6 +1934,14 @@ final simulated function SeasonalEventStats_OnAfflictionCaused(EAfflictionType T
}
}
final simulated function SeasonalEventStats_OnCollectibleFound(int Limit)
{
if (SeasonalEventIsValid())
{
SeasonalEvent.OnCollectibleFound(Limit);
}
}
/*********************************************************************************************
* @name Dailies and daily-specific tracking
********************************************************************************************* */
@ -2069,6 +2086,7 @@ defaultproperties
//Base Weapons
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,SecondaryType=DOST_KnifeDamage,ObjectiveClasses=(KFWeap_Edged_Knife,KFDT_Slashing_Knife,KFDT_Slashing_Knife_Berserker,KFDT_Slashing_Knife_Medic,KFDT_Slashing_Knife_SWAT,KFDT_Slashing_KnifeHeavy,KFDT_Slashing_KnifeHeavy_Berserker,KFDT_Slashing_KnifeHeavy_Medic,KFDT_Slashing_KnifeHeavy_SWAT,KFDT_Piercing_KnifeStab,KFDT_Piercing_KnifeStab_Berserker,KFDT_Piercing_KnifeStab_FieldMedic,KFDT_Piercing_KnifeStab_SWAT,KFDT_Slashing_Knife_Survivalist,KFDT_Piercing_KnifeStab_Survivalist,KFDT_Slashing_KnifeHeavy_Survivalist),CompletionAmount=2500))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Pistol_9mm, KFDT_Ballistic_9mm,KFDT_Bludgeon_9mm),CompletionAmount=4000)) //2500
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_93R, KFDT_Ballistic_HRG_93R, KFDT_Bludgeon_HRG_93R),CompletionAmount=4000))
//Swat Weapons
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_SMG_MP7, KFDT_Ballistic_MP7,KFDT_Bludgeon_MP7),CompletionAmount=5000)) //3000
@ -2089,6 +2107,7 @@ defaultproperties
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_AssaultRifle_MKB42, KFDT_Ballistic_MKB42,KFDT_Bludgeon_MKB42),CompletionAmount=10000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_LMG_Stoner63A, KFDT_Ballistic_Stoner63A,KFDT_Bludgeon_Stoner63A),CompletionAmount=10000))
//Support Weapons
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_MB500, KFDT_Ballistic_MB500,KFDT_Bludgeon_MB500),CompletionAmount=5000)) //3000
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_DoubleBarrel, KFDT_Ballistic_DBShotgun,KFDT_Bludgeon_DBShotgun),CompletionAmount=7000)) //5000
@ -2333,7 +2352,9 @@ defaultproperties
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-SUBDUCTION),CompletionAmount=1))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-SUBDUCTION),CompletionAmount=2))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-SUBDUCTION),CompletionAmount=3))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CASTLEVOLTER),CompletionAmount=1))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CASTLEVOLTER),CompletionAmount=2))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CASTLEVOLTER),CompletionAmount=3))
//Versus Damage
// Per design doc that I have right now, these are x class damage y players, not damage y amount

View File

@ -76,4 +76,5 @@ defaultproperties
Properties.Add((PropertyId = STATID_ACHIEVE_BarmwichCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_CrashCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_SubductionCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_VolterCastleCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
}

View File

@ -164,6 +164,51 @@ struct GunGamePerkData
var() array<GunGameRespawnLevel> GunGameRespawnLevels;
};
struct BountyHuntWavePerPlayerZedData
{
var() int NumberOfPlayers;
var() int NumberOfZeds;
};
struct BountyHuntWaveData
{
var() int Wave;
var() array<BountyHuntWavePerPlayerZedData> BountyHuntWavePerPlayerZed;
};
struct BountyHuntSpecialZedPerWaveData
{
var() int Wave;
};
struct BountyHuntZedProgressionData
{
var() float RemainingZedRatio;
var() float HealthBuffRatio;
var() float DamageBuffRatio;
};
struct BountyHuntZedAndProgressionData
{
var() class<KFPawn_Monster> ZedType;
var() array<BountyHuntSpecialZedPerWaveData> BountyHuntSpecialZedPerWave;
var() array<BountyHuntZedProgressionData> BountyHuntZedProgression;
};
struct BountyHuntDoshData
{
var() int NumberOfPlayers;
var() int Dosh;
var() int DoshNoAssist;
};
struct BountyHuntGameData
{
var() array<BountyHuntWaveData> BountyHuntDataWaves;
var() array<BountyHuntZedAndProgressionData> BountyHuntZedAndProgression;
var() array<BountyHuntDoshData> BountyHuntDosh;
};
/** Individual property overrides that drive other behavior to allow for
* a large amount of variety in our weekly event mode.
*/
@ -455,6 +500,8 @@ struct WeeklyOverrides
var() bool bVIPGameMode;
var() bool bBountyHunt;
/** Ignores damage caused by headshots. */
var() bool bInvulnerableHeads;
@ -470,6 +517,26 @@ struct WeeklyOverrides
/** Contamination mode Extra Dosh */
var() int ContaminationModeExtraDosh;
// Bounty Hunt
/** Information about each level in Gun Game Mode */
var() BountyHuntGameData BountyHuntGame;
var() int BountyHuntExtraDosh;
var() bool BountyHuntNeedsToSeePlayerToTriggerFlee;
var() float BountyHuntTimeBetweenFlee;
var() float BountyHuntTimeBetweenAttack;
var() float BountyHuntTimeCanCancelAttack;
var() float BountyHuntDistancePlayerMinFirstFlee;
var() float BountyHuntDistancePlayerMinFlee;
var() float BountyHuntDistancePlayerMaxFlee;
var() float BountyHuntDistancePlayerAttack;
var() float BountyHuntSpecialZedBuffHealthRatio;
var() float BountyHuntSpecialZedBuffAfflictionResistance;
var() float BountyHuntMaxCoexistingZeds;
var() bool BountyHuntLastLevelStillUsesCoexistingZeds;
var() bool BountyHuntUseGradualSpawn;
var() float HeadshotDamageMultiplier;
structdefaultproperties
{
GameLength = GL_Short
@ -531,12 +598,28 @@ struct WeeklyOverrides
bDisableThrowWeapon = false;
bGunGameMode = false;
bVIPGameMode = false;
bBountyHunt = false;
bInvulnerableHeads = false;
TraderTimeModifier = 1.f;
TimeBetweenWaves = -1.f;
bForceShowSkipTrader = false;
ContaminationModeZedsToFinish = 0;
ContaminationModeExtraDosh = 0;
BountyHuntExtraDosh = 0;
BountyHuntNeedsToSeePlayerToTriggerFlee = false;
BountyHuntTimeBetweenFlee = 10.f;
BountyHuntTimeBetweenAttack = 12.f;
BountyHuntTimeCanCancelAttack = 5.f;
BountyHuntDistancePlayerMinFirstFlee = 100.f;
BountyHuntDistancePlayerMinFlee = 1000.f;
BountyHuntDistancePlayerMaxFlee = 2200.f;
BountyHuntDistancePlayerAttack = 400.f;
BountyHuntSpecialZedBuffHealthRatio=0.25f
BountyHuntSpecialZedBuffAfflictionResistance=0.5f
BountyHuntMaxCoexistingZeds = 6
BountyHuntLastLevelStillUsesCoexistingZeds=false
BountyHuntUseGradualSpawn = false
HeadshotDamageMultiplier = 1.f
}
};
@ -573,7 +656,7 @@ var WeeklyOverrides ActiveEvent;
/** Stored values of World Info and GRI items incase we need to reset it. */
var CachedOutbreakInfo CachedItems;
function int SetActiveEvent(int ActiveEventIdx)
function int SetActiveEvent(int ActiveEventIdx, KFGameInfo GameInfo)
{
`if(`notdefined(ShippingPC))
local string LocalURL;
@ -583,7 +666,19 @@ function int SetActiveEvent(int ActiveEventIdx)
//Runtime override by URL options for testing purposes
LocalURL = WorldInfo.GetLocalURL();
LocalURL = Split(LocalURL, "?"); //remove map name
ActiveEventIdx = GetIntOption(LocalURL, "ActiveEventIdx", ActiveEventIdx);
if (GameInfo.WeeklySelectorIndex == -1) // WeeklySelectorIndex overrides the ActiveEventIdx if any
{
ActiveEventIdx = GetIntOption(LocalURL, "ActiveEventIdx", ActiveEventIdx);
// Set WeeklySelectorIndex to the value (ActiveEventIdx is not replicated), so all the flow of the game works the same
GameInfo.WeeklySelectorIndex = ActiveEventIdx + 1;
}
else if (GameInfo.WeeklySelectorIndex > 0)
{
// 0 is default, we move one index to the left so it matches first Weekly Mode
ActiveEventIdx = GameInfo.WeeklySelectorIndex - 1;
}
//If our override is out of bounds, see if it's a valid test event
if (ActiveEventIdx >= SetEvents.Length)
@ -599,12 +694,22 @@ function int SetActiveEvent(int ActiveEventIdx)
ActiveEvent = SetEvents[ActiveEventIdx];
}
`else
if (GameInfo.WeeklySelectorIndex > 0)
{
// 0 is default, we move one index to the left so it matches first Weekly Mode
ActiveEventIdx = GameInfo.WeeklySelectorIndex - 1;
}
if(ActiveEventIdx < SetEvents.length)
{
ActiveEvent = SetEvents[ActiveEventIdx];
}
`endif
`Log("TEST - SetActiveEvent : " $ActiveEventIdx);
KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(ActiveEventIdx);
return ActiveEventIdx;
}
@ -744,7 +849,14 @@ function ModifyGroundSpeed(KFPawn PlayerPawn, out float GroundSpeed)
function ReduceDamage(out int Damage, Pawn Injured, Controller InstigatedBy, class<DamageType> DamageType, TraceHitInfo HitInfo)
{
local int HitZoneIdx, WaveNum;
local KFPawn InstigatorPawn;
local KFPawn InjuredPawn, InstigatorPawn;
InjuredPawn = KFPawn(Injured);
if (InjuredPawn != none)
{
`log(self @ "ReduceDamage=" $ Damage, InjuredPawn.bLogTakeDamage);
}
//Some events can be headshot only. Do this only if the incoming damage is against a monster-derived class
// and it's one of our custom damage types. Keeps things like crush damage from being scaled to 0.
@ -765,6 +877,14 @@ function ReduceDamage(out int Damage, Pawn Injured, Controller InstigatedBy, cla
Damage = 0;
}
}
else if (ActiveEvent.HeadshotDamageMultiplier != 1.f && KFPawn_Monster(Injured) != none && KFPawn_Monster(Injured).bIsBountyHuntObjective)
{
HitZoneIdx = KFPawn_Monster(Injured).HitZones.Find('ZoneName', HitInfo.BoneName);
if (HitZoneIdx == HZI_Head)
{
Damage *= ActiveEvent.HeadshotDamageMultiplier;
}
}
if (InstigatedBy != none)
{
@ -792,6 +912,11 @@ function ReduceDamage(out int Damage, Pawn Injured, Controller InstigatedBy, cla
AdjustDamageReduction(Damage, Injured, InstigatedBy, InstigatorPawn, ActiveEvent.BossRushOverrideParams.PerWaves[WaveNum].ZedsToAdjust);
}
}
if (InjuredPawn != none)
{
`log(self @ "ReduceDamage (after)=" $ Damage, InjuredPawn.bLogTakeDamage);
}
}
function AdjustDamageReduction(out int Damage, Pawn Injured, Controller InstigatedBy, KFPawn InstigatorPawn, array <StatAdjustments> Adjustments)

View File

@ -2059,7 +2059,7 @@ final simulated function bool CanReloadWeapon()
return TRUE;
}
function KFWeapon FindBestWeapon()
function KFWeapon FindBestWeapon(optional bool bCheckHasAmmo = false, optional bool allow9mm = true)
{
local float BestPrimaryRating, BestSecondaryRating, BestMeleeRating;
local KFWeapon BestWeapon, BestPrimary, BestSecondary, BestMelee, TempWeapon;
@ -2072,6 +2072,22 @@ function KFWeapon FindBestWeapon()
continue;
}
if (allow9mm == false)
{
if (TempWeapon.bIsBackupWeapon && !TempWeapon.IsMeleeWeapon())
{
continue;
}
}
if (bCheckHasAmmo)
{
if ( TempWeapon.HasAnyAmmo() == false )
{
continue;
}
}
// Collect the best weapons from each inventory group
if (TempWeapon.InventoryGroup == IG_Primary)
{
@ -2100,7 +2116,8 @@ function KFWeapon FindBestWeapon()
}
// Get our best possible weapon from all 3 categories and throw it
BestWeapon = BestPrimary != none ? BestPrimary : (BestSecondary != none ? BestSecondary : BestMelee);
BestWeapon = BestPrimary != none ? BestPrimary : (BestMelee != none ? BestMelee : BestSecondary);
return BestWeapon;
}
/**
@ -2725,6 +2742,13 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
// NVCHANGE_BEGIN - RLS - Debugging Effects
bAllowHeadshot = CanCountHeadshots();
OldHealth = Health;
KFDT = class<KFDamageType>(DamageType);
if ( KFDT != None )
{
KFDT.static.ModifyInstantDamage(self, Damage, InstigatedBy);
}
Super.TakeDamage(Damage, InstigatedBy, HitLocation, Momentum, DamageType, HitInfo, DamageCauser);
// using the passed in damage type instead of the hitfxinfo since that doesn't get updated when zero damage is done
@ -2740,7 +2764,6 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
// damage. Requires valid DamageCauser, 'None' for DoT, to prevent recursion
if ( Health < OldHealth && DamageCauser != None )
{
KFDT = class<KFDamageType>(DamageType);
if ( KFDT != None )
{
KFDT.static.ApplySecondaryDamage(self, Damage, InstigatedBy);

View File

@ -42,6 +42,8 @@ var transient bool bArchLoaded;
var const array<int> EliteAIType; // can't use EAIType enumerator, use integer instead
var const array<class<KFPawn_Monster> > ElitePawnClass;
var const array<class<KFPawn_Monster> > MapReplacePawnClass;
/** Custom third person camera offsets */
var() ViewOffsetData ThirdPersonViewOffset;
@ -579,6 +581,11 @@ var ParticleSystem WeakPointParticleTemplate;
var bool bCanBeKilledByShrinking;
var float ShrinkEffectModifier;
// Bounty Hunt
var bool bIsBountyHuntObjective;
var bool bIsBountyHuntOnLastTier;
var bool bIsBountyHuntBlockLeaveMap;
/*********************************************************************************************
* @name Delegates
********************************************************************************************* */
@ -593,7 +600,8 @@ replication
if (bNetDirty)
bIsHeadless, bIsPoisoned, bPlayPanicked, bPlayShambling, MaxHeadChunkGoreWhileAlive,
RepInflateMatParams, RepInflateMatParam, RepDamageInflateParam, RepBleedInflateMatParam, bDisableGoreMeshWhileAlive,
bDisableHeadless, InflateDeathGravity, InflationExplosionTimer, bUseDamageInflation, bUseExplosiveDeath, WeakPoints_TS;
bDisableHeadless, InflateDeathGravity, InflationExplosionTimer, bUseDamageInflation, bUseExplosiveDeath, WeakPoints_TS,
bIsBountyHuntObjective, bIsBountyHuntOnLastTier, bIsBountyHuntBlockLeaveMap;
if ( bNetDirty && bCanCloak )
bIsCloakingSpottedByTeam;
if ( bNetDirty && bCanRage )
@ -699,7 +707,12 @@ simulated event ReplicatedEvent(name VarName)
case nameof(WeakPoints_TS):
SpawnWeakpointVFX();
break;
case nameof(bIsBountyHuntOnLastTier):
break;
case nameof(bIsBountyHuntBlockLeaveMap):
break;
}
super.ReplicatedEvent( VarName );
}
@ -768,6 +781,16 @@ static event class<KFPawn_Monster> GetAIPawnClassToSpawn()
return default.class;
}
static event class<KFPawn_Monster> GetAIPawnClassToReplaceMapSpawn()
{
if (default.MapReplacePawnClass.length > 0)
{
return default.MapReplacePawnClass[Rand(default.MapReplacePawnClass.length)];
}
return default.class;
}
/** Load content archetype when map loads */
native static final function PreloadContent();
/** Called if preload was not called before 1st spawn */
@ -851,6 +874,11 @@ simulated event CheckShouldAlwaysBeRelevant()
{
bAlwaysRelevant = true;
}
if (bIsBountyHuntObjective)
{
bAlwaysRelevant = true;
}
}
/** Called immediately after gameplay begins */
@ -1892,12 +1920,24 @@ simulated function float GetMinBlockFOV()
/** Reduce affliction power when blocking */
simulated function AdjustAffliction( out float AfflictionPower )
{
local KFGameInfo KFGI;
if( Role == ROLE_Authority && bIsBlocking )
{
AfflictionPower *= DifficultyBlockSettings.AfflictionModifier;
}
super.AdjustAffliction( AfflictionPower );
if (bIsBountyHuntObjective) // Only on Bounty Hunt Weekly
{
KFGI = KFGameInfo(WorldInfo.Game);
if (KFGI != none && KFGI.OutbreakEvent != none)
{
AfflictionPower -= AfflictionPower * KFGI.OutbreakEvent.ActiveEvent.BountyHuntSpecialZedBuffAfflictionResistance;
}
}
}
/** Used by subclasses to determine if the boss icon can be rendered */
@ -2338,8 +2378,12 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
// NVCHANGE_BEGIN - RLS - Debugging Effects
// Do extra damage on blowing the head off
if( !bCheckingExtraHeadDamage && HitZoneIdx == HZI_Head &&
HitZones[HZI_Head].GoreHealth > 0 && InDamage > HitZones[HZI_Head].GoreHealth )
if (bIsBountyHuntObjective == false
&& !bCheckingExtraHeadDamage
&& HitZoneIdx == HZI_Head
&& HitZones[HZI_Head].GoreHealth > 0
&& InDamage > HitZones[HZI_Head].GoreHealth)
{
KFDT = class<KFDamageType>(DamageType);
@ -2349,7 +2393,7 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
InDamage *= KFDT.default.HeadDestructionDamageScale;
}
ExtraHeadDamage = InDamage + HealthMax * 0.25;
ExtraHeadDamage = (InDamage + HealthMax * 0.25);
bCheckingExtraHeadDamage = true;
AdjustDamage( ExtraHeadDamage, Momentum, InstigatedBy, HitLocation, DamageType, HitInfo, DamageCauser );
@ -2966,7 +3010,7 @@ simulated function UpdateVisualInflation(float InflationAmount)
/** Called on server when pawn should has been crippled (e.g. Headless) */
function CauseHeadTrauma(float BleedOutTime=5.f)
{
if ( !bIsHeadless && !bPlayedDeath && !bDisableHeadless )
if ( !bIsHeadless && !bPlayedDeath && !bDisableHeadless && !bIsBountyHuntObjective )
{
if( MyKFAIC != none && KFGameInfo(WorldInfo.Game) != none && MyKFAIC.TimeFirstSawPlayer >= 0 )
{
@ -4202,7 +4246,7 @@ function TakeHitZoneDamage(float Damage, class<DamageType> DamageType, int HitZo
if ( HitZoneIdx == HZI_Head )
{
// Based on head health, calculate number of head chunks we're allowed to remove
if( !bPlayedDeath && !bIsHeadless && !bTearOff )
if( !bPlayedDeath && !bIsHeadless && !bTearOff && !bIsBountyHuntObjective )
{
HeadHealthPercentage = GetHeadHealthPercent();
if( HeadHealthPercentage > 0.5 )
@ -4958,6 +5002,40 @@ simulated function ServerSpawnWeakPointVFX(array<WeakPoint> WeakPoints)
}
}
simulated function SetBountyHuntObjective()
{
bIsBountyHuntObjective = true;
bAlwaysRelevant = true;
if (WorldInfo.NetMode == NM_DedicatedServer)
{
bNetDirty = true;
bForceNetUpdate = true;
}
}
simulated function SetBountyHuntOnLastTier()
{
bIsBountyHuntOnLastTier = true;
if (WorldInfo.NetMode == NM_DedicatedServer)
{
bNetDirty = true;
bForceNetUpdate = true;
}
}
simulated function SetBountyHuntBlockLeaveMap(bool bCanLeave)
{
bIsBountyHuntBlockLeaveMap = bCanLeave;
if (WorldInfo.NetMode == NM_DedicatedServer)
{
bNetDirty = true;
bForceNetUpdate = true;
}
}
/*********************************************************************************************
* @name Achievements
********************************************************************************************* */
@ -5165,4 +5243,8 @@ DefaultProperties
bCanBeKilledByShrinking=true
ShrinkEffectModifier=1.0f
bIsBountyHuntObjective=false
bIsBountyHuntOnLastTier=false
bIsBountyHuntBlockLeaveMap=false
}

View File

@ -245,11 +245,12 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
/** Reduce affliction/incap strength when healing */
simulated function AdjustAffliction( out float AfflictionPower )
{
super.AdjustAffliction( AfflictionPower );
if( bInHuntAndHealMode )
{
AfflictionPower *= IncapPowerScaleWhenHealing;
}
super.AdjustAffliction( AfflictionPower );
}
/** Updates shield health and shield health percent */

View File

@ -149,9 +149,10 @@ var const bool bInitialized;
* Inventory
********************************************************************************************* */
var byte StartingSecondaryWeaponClassIndex;
/** The weapon class string used to load the weapon class for this perk */
var class<KFWeaponDefinition> PrimaryWeaponDef;
var class<KFWeaponDefinition> SecondaryWeaponDef;
/** default starting knife */
var class<KFWeaponDefinition> KnifeWeaponDef;
@ -173,6 +174,8 @@ var array<name> BackupWeaponDamageTypeNames;
var array<class<KFWeaponDefinition> > AutoBuyLoadOutPath;
var const array<class<KFWeaponDefinition> > SecondaryWeaponPaths;
/*********************************************************************************************
* Player Skill Trakcing
********************************************************************************************* */
@ -502,7 +505,12 @@ static simulated public function bool IsSyringe( KFWeapon KFW )
*/
static function bool IsDual9mm( KFWeapon KFW )
{
return KFW != none && KFW.Class.Name == 'KFWeap_Pistol_Dual9mm';
return KFW != none && (KFW.Class.Name == 'KFWeap_Pistol_Dual9mm' || KFW.Class.Name == 'KFWeap_HRG_93R_Dual');
}
static function bool IsHRG93R(KFWeapon KFW)
{
return KFW != none && (KFW.Class.Name == 'KFWeap_HRG_93R' || KFW.Class.Name == 'KFWeap_HRG_93R_Dual');
}
/**
@ -1125,12 +1133,6 @@ simulated function string GetPrimaryWeaponClassPath()
return PrimaryWeaponDef.default.WeaponClassPath;
}
/* Returns the secondary weapon's class path for this perk */
simulated function string GetSecondaryWeaponClassPath()
{
return SecondaryWeaponDef.default.WeaponClassPath;
}
/* Returns the knife's class path for this perk */
simulated function string GetKnifeWeaponClassPath()
{
@ -1314,6 +1316,7 @@ native function bool CanRepairDoors();
function bool RepairArmor( Pawn HealTarget );
function bool IsToxicDmgActive() { return false; }
static function class<KFDamageType> GetToxicDmgTypeClass(){ return default.ToxicDmgTypeClass; }
static function float GetHealRechargeMod();
static function ModifyToxicDmg( out int ToxicDamage );
simulated function float GetSirenScreamStrength(){ return 1.f; }
simulated function bool IsHealingSurgeActive(){ return false; }
@ -1633,6 +1636,11 @@ static simulated function bool CanChoosePrimaryWeapon()
return false;
}
static simulated function bool CanChooseSecondaryWeapon()
{
return true;
}
static simulated function bool CanChooseGrenade()
{
return false;
@ -1642,9 +1650,10 @@ simulated function byte OnPrevWeaponSelected() { return 255; }
simulated function byte OnNextWeaponSelected() { return 255; }
simulated function byte OnPrevGrenadeSelected() { return 255; }
simulated function byte OnNextGrenadeSelected() { return 255; }
simulated function byte SetWeaponSelectedIndex(byte idx);
simulated function byte SetGrenadeSelectedIndex(byte idx);
simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext);
simulated static function byte GetWeaponSelectedIndex(byte idx);
simulated function SetWeaponSelectedIndex(byte idx);
simulated function SetGrenadeSelectedIndex(byte idx);
simulated static function byte GetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext);
simulated function byte GetGrenadeSelectedIndex() { return 255;}
simulated function InitializeGrenades();
@ -1666,7 +1675,69 @@ static simulated function string GetGrenadeWeaponName(byte Idx)
static simulated function string GetGrenadeWeaponImagePath(byte Idx)
{
return default.GrenadeWeaponDef.static.GetImagePath();
}
}
simulated function string GetSecondaryWeaponClassPath()
{
return SecondaryWeaponPaths[StartingSecondaryWeaponClassIndex].default.WeaponClassPath;
}
simulated function byte OnPrevSecondaryWeaponSelected()
{
if (StartingSecondaryWeaponClassIndex == 0)
{
StartingSecondaryWeaponClassIndex = SecondaryWeaponPaths.Length - 1;
}
else
{
--StartingSecondaryWeaponClassIndex;
}
SetSecondaryWeaponSelectedIndex(StartingSecondaryWeaponClassIndex);
return StartingSecondaryWeaponClassIndex;
}
simulated function byte OnNextSecondaryWeaponSelected()
{
StartingSecondaryWeaponClassIndex = (StartingSecondaryWeaponClassIndex + 1) % SecondaryWeaponPaths.Length;
SetSecondaryWeaponSelectedIndex(StartingSecondaryWeaponClassIndex);
return StartingSecondaryWeaponClassIndex;
}
static simulated function string GetSecondaryWeaponName(byte Idx)
{
return Idx >= default.SecondaryWeaponPaths.Length ? default.SecondaryWeaponPaths[0].static.GetItemName() : default.SecondaryWeaponPaths[Idx].static.GetItemName();
}
static simulated function string GetSecondaryWeaponImagePath(byte Idx)
{
return Idx >= default.SecondaryWeaponPaths.Length ? default.SecondaryWeaponPaths[0].static.GetImagePath() : default.SecondaryWeaponPaths[Idx].static.GetImagePath();
}
simulated static function byte GetSecondaryWeaponSelectedIndex(byte idx)
{
if (idx >= default.SecondaryWeaponPaths.Length)
{
return 0;
}
return idx;
}
simulated function SetSecondaryWeaponSelectedIndex(byte idx)
{
StartingSecondaryWeaponClassIndex = GetSecondaryWeaponSelectedIndex(idx);
ServerUpdateCurrentSecondaryWeapon(StartingSecondaryWeaponClassIndex);
}
reliable server function ServerUpdateCurrentSecondaryWeapon(byte Value)
{
StartingSecondaryWeaponClassIndex = Value;
}
DefaultProperties
{
@ -1692,6 +1763,7 @@ DefaultProperties
BackupWeaponDamageTypeNames(0)="KFDT_Ballistic_9mm";
BackupWeaponDamageTypeNames(1)="KFDT_Slashing_Knife";
StartingSecondaryWeaponClassIndex=0;
// network
RemoteRole=ROLE_SimulatedProxy
@ -1700,10 +1772,12 @@ DefaultProperties
bOnlyRelevantToOwner=TRUE
// weapon content
SecondaryWeaponDef=class'KFWeapDef_9mm'
KnifeWeaponDef=class'KFWeapDef_Knife_Commando'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Berserker'
SecondaryWeaponPaths(0)=class'KFWeapDef_9mm'
SecondaryWeaponPaths(1)=class'KFWeapDef_HRG_93R'
InitialGrenadeCount=2
MaxGrenadeCount=5

View File

@ -1020,6 +1020,7 @@ DefaultProperties
SmallRadiusSizeSQ=40000
PrimaryWeaponDef=class'KFWeapDef_Crovel'
KnifeWeaponDef=class'KFweapDef_Knife_Berserker'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Berserker'

View File

@ -97,7 +97,8 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
// have the perks so tied into using that, it's easier to just specifically fix commando here.
if( KFW != none && !DamageCauser.IsA('KFProj_Grenade'))
{
if( IsBackupActive() && (IsBackupWeapon( KFW ) || IsDual9mm( KFW )) )
if( IsBackupActive()
&& (IsBackupWeapon( KFW ) || IsDual9mm( KFW ) || IsHRG93R( KFW ) ) )
{
`QALog( "Backup Damage" @ KFW @ GetPercentage( InDamage, InDamage * GetSkillValue( PerkSkills[ECommandoBackup] )), bLogPerk );
TempDamage += InDamage * GetSkillValue( PerkSkills[ECommandoBackup] );
@ -692,6 +693,7 @@ DefaultProperties
PerkBuildStatID=STATID_Cmdo_Build
PrimaryWeaponDef=class'KFWeapDef_AR15'
KnifeWeaponDef=class'KFweapDef_Knife_Commando'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Commando'

View File

@ -1042,6 +1042,7 @@ DefaultProperties
InteractIcon=Texture2D'UI_World_TEX.Demolitionist_Supplier_HUD'
PrimaryWeaponDef=class'KFWeapDef_HX25'
KnifeWeaponDef=class'KFWeapDef_Knife_Demo'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Demo'

View File

@ -62,11 +62,6 @@ enum EMedicPerkSkills
EMedicZedative
};
/*********************************************************************************************
* @name Perk init and spawning
******************************************************************************************** */
/*********************************************************************************************
* @name Passive skills functions
********************************************************************************************* */
@ -329,6 +324,11 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
InDamage = Round(TempDamage);
}
static function float GetHealRechargeMod()
{
return GetSkillValue( default.PerkSkills[EMedicAcidicCompound] );
}
/** Takes the weapons primary damage and calculates the poisoning over time value */
/**
* @brief Takes the weapons primary damage and calculates the bleeding over time value
@ -339,7 +339,7 @@ static function ModifyToxicDmg( out int ToxicDamage )
{
local float TempDamage;
TempDamage = float(ToxicDamage) * GetSkillValue( default.PerkSkills[EMedicAcidicCompound] );
TempDamage = float(ToxicDamage) * GetHealRechargeMod();
ToxicDamage = FCeil( TempDamage );
}
@ -644,13 +644,14 @@ DefaultProperties
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Medic'
PrimaryWeaponDef=class'KFWeapDef_MedicPistol'
KnifeWeaponDef=class'KFWeapDef_Knife_Medic'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Medic'
ProgressStatID=STATID_Medic_Progress
PerkBuildStatID=STATID_Medic_Build
SelfHealingSurgePct=0.03f //0.1f
SelfHealingSurgePct=0.06f //0.1f
MaxSurvivalistResistance=0.30f //0.70f //0.5f //0.8
CombatantSpeedModifier=0.1f
@ -738,7 +739,7 @@ DefaultProperties
PerkSkills(EMedicHealingSpeedBoost)=(Name="HealingSpeedBoost",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_AdrenalineShot", Increment=0.f,Rank=0,StartingValue=10.0f,MaxValue=10.0f) //3.0
PerkSkills(EMedicCombatant)=(Name="Combatant",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_CombatantDoctor", Increment=0.f,Rank=0,StartingValue=0.5f,MaxValue=0.5f)
PerkSkills(EMedicHealingDamageBoost)=(Name="HealingDamageBoost",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_FocusInjection", Increment=0.f,Rank=0,StartingValue=5.0f,MaxValue=5.0f) //3.0
PerkSkills(EMedicAcidicCompound)=(Name="AcidicCompound",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_AcidicRounds", Increment=0.f,Rank=0,StartingValue=0.65f,MaxValue=0.65f) //0.75 //0.5
PerkSkills(EMedicAcidicCompound)=(Name="AcidicCompound",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_AcidicRounds", Increment=0.f,Rank=0,StartingValue=2f,MaxValue=2f)
PerkSkills(EMedicHealingShield)=(Name="HealingShield",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_CoagulantBooster", Increment=0.f,Rank=0,StartingValue=10.f,MaxValue=10.f) //25.0
PerkSkills(EMedicEnforcer)=(Name="Enforcer",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_BattleSurgeon", Increment=0.f,Rank=0,StartingValue=0.2f,MaxValue=0.2f)
PerkSkills(EMedicAirborneAgent)=(Name="AirborneAgent",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_AirborneAgent", Increment=0.f,Rank=0,StartingValue=0.2f,MaxValue=0.2f)

View File

@ -634,6 +634,7 @@ DefaultProperties
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Firebug'
PrimaryWeaponDef=class'KFWeapDef_CaulkBurn'
KnifeWeaponDef=class'KFWeapDef_Knife_Firebug'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Firebug'

View File

@ -60,9 +60,6 @@ var private const int MaxHeadShotComboCount;
var private const float HeadShotCountdownIntervall;
var private const float SteadySkillDamageModifier;
/*********************************************************************************************
* @name Perk init and spawning
******************************************************************************************** */
/**
* @brief Weapons and perk skills can affect the jog/sprint speed
*
@ -825,6 +822,7 @@ DefaultProperties
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Gunslinger'
PrimaryWeaponDef=class'KFWeapDef_Remington1858Dual'
KnifeWeaponDef=class'KFWeapDef_Knife_Gunslinger'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Gunslinger'
@ -870,11 +868,14 @@ DefaultProperties
AdditionalOnPerkWeaponNames(0)="KFWeap_Pistol_9mm"
AdditionalOnPerkWeaponNames(1)="KFWeap_Pistol_Dual9mm"
AdditionalOnPerkWeaponNames(2)="KFWeap_GrenadeLauncher_HX25"
AdditionalOnPerkWeaponNames(3)="KFWeap_HRG_93R"
AdditionalOnPerkWeaponNames(4)="KFWeap_HRG_93R_Dual"
AdditionalOnPerkDTNames(0)="KFDT_Ballistic_9mm"
AdditionalOnPerkDTNames(1)="KFDT_Ballistic_Pistol_Medic"
AdditionalOnPerkDTNames(2)="KFDT_Ballistic_Winchester"
AdditionalOnPerkDTNames(3)="KFDT_Ballistic_HX25Impact"
AdditionalOnPerkDTNames(4)="KFDT_Ballistic_HX25SubmunitionImpact"
AdditionalOnPerkDTNames(5)="KFDT_Ballistic_HRG_93R"
PerkSkills(EGunslingerShootnMove)=(Name="ShootnMove",IconPath="UI_PerkTalent_TEX.Gunslinger.UI_Talents_Gunslinger_Steady",Increment=0.f,Rank=0,StartingValue=2.f,MaxValue=2.f)
PerkSkills(EGunslingerQuickSwitch)=(Name="QuickSwitch",IconPath="UI_PerkTalent_TEX.Gunslinger.UI_Talents_Gunslinger_QuickSwitch",Increment=0.f,Rank=0,StartingValue=0.5f,MaxValue=0.5f)

View File

@ -721,6 +721,7 @@ DefaultProperties
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Sharpshooter'
PrimaryWeaponDef=class'KFWeapDef_Winchester1894'
KnifeWeaponDef=class'KFWeapDef_Knife_Sharpshooter'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Sharpshooter'
@ -741,10 +742,12 @@ DefaultProperties
AdditionalOnPerkWeaponNames(1)="KFWeap_Pistol_Dual9mm"
AdditionalOnPerkWeaponNames(2)="KFWeap_Revolver_Rem1858"
AdditionalOnPerkWeaponNames(3)="KFWeap_Revolver_SW500"
AdditionalOnPerkWeaponNames(4)="KFWeap_HRG_93R"
AdditionalOnPerkWeaponNames(5)="KFWeap_HRG_93R_Dual"
AdditionalOnPerkDTNames(0)="KFDT_Ballistic_9mm"
AdditionalOnPerkDTNames(1)="KFDT_Ballistic_SW500"
AdditionalOnPerkDTNames(2)="KFDT_Ballistic_Rem1858"
AdditionalOnPerkDTNames(3)="KFDT_Ballistic_HRG_93R"
HeadshotDamage=(Name="Headshot Damage",Increment=0.01f,Rank=0,StartingValue=0.0f,MaxValue=0.25f)
Recoil=(Name="Recoil",Increment=0.01f,Rank=0,StartingValue=0.0f,MaxValue=0.25f)

View File

@ -40,6 +40,11 @@ var private const array<Name> AdditionalOnPerkDTNames;
var private const int DoorRepairXP[4]; // Door repair XP per-difficulty
// Resistance to damage taken when Fortitude skill is active
var private const float FortitudeDamageResistance;
var private const float APDamageModifier;
enum ESupportPerkSkills
{
ESupportHighCapMags,
@ -52,6 +57,7 @@ enum ESupportPerkSkills
ESupportConcussionRounds,
ESupportPerforate,
ESupportBarrage,
};
/*********************************************************************************************
@ -177,12 +183,43 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
TempDamage += InDamage * GetSkillValue( PerkSkills[ESupportSalvo] );
`QALog( GetFuncName() @ "+ Salvo Damage =" @ TempDamage, bLogPerk );
}
if ( IsAPShotActive() )
{
TempDamage += InDamage * APDamageModifier;
`QALog( GetFuncName() @ "+ Armor Piercing Damage =" @ TempDamage, bLogPerk );
}
}
`QALog( "Total Damage Given" @ Damagetype @ KFW @ GetPercentage( InDamage, Round(TempDamage) ), bLogPerk );
InDamage = Round( TempDamage );
}
/**
* @brief Modifies the damage taken
*
* @param InDamage damage
* @param DamageType the damage type used (optional)
*/
function ModifyDamageTaken( out int InDamage, optional class<DamageType> DamageType, optional Controller InstigatedBy )
{
local float TempDamage;
if( InDamage <= 0 )
{
return;
}
TempDamage = InDamage;
if( IsFortitudeActive() )
{
TempDamage -= TempDamage * FortitudeDamageResistance;
`QALog( "Fortitude Damage Resistance =" @ FortitudeDamageResistance, bLogPerk );
}
}
/** Welding Proficiency - faster welding/unwelding */
/**
* @brief Modifies the welding speed
@ -563,14 +600,27 @@ simulated function float GetZedTimeModifier( KFWeapon W )
// Blast Brawlers use a different state for shooting (combining melee + firing). Needs a special case for this
// FAMAS uses alt fire as common firing. Another special case added
// HRG Ballistic Bouncer uses a special state of charging when shooting
if( IsWeaponOnPerk( W,, self.class ) && CouldBarrageActive() &&
(ZedTimeModifyingStates.Find( StateName ) != INDEX_NONE ||
(StateName == 'MeleeChainAttacking' && IsBlastBrawlers(W)) ||
(IsFAMAS(W) && StateName == 'FiringSecondaryState')) ||
(IsHRGBallisticBouncer(W) && StateName == 'MineReconstructorCharge'))
if (IsWeaponOnPerk( W,, self.class ) )
{
return BarrageFiringRate;
}
if( CouldBarrageActive() &&
(ZedTimeModifyingStates.Find( StateName ) != INDEX_NONE ||
(StateName == 'MeleeChainAttacking' && IsBlastBrawlers(W)) ||
(IsFAMAS(W) && StateName == 'FiringSecondaryState')) ||
(IsHRGBallisticBouncer(W) && StateName == 'MineReconstructorCharge'))
{
return BarrageFiringRate;
}
if( IsPerforateActive() && ( IsWeaponOnPerk( W,, self.class ) ) )
{
StateName = W.GetStateName();
if( StateName == 'Reloading' )
{
return 1.f;
}
}
}
return 0.f;
}
@ -812,6 +862,7 @@ DefaultProperties
InteractIcon=Texture2D'UI_World_TEX.Support_Supplier_HUD'
PrimaryWeaponDef=class'KFWeapDef_MB500'
KnifeWeaponDef=class'KFWeapDef_Knife_Support'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Support'
@ -875,4 +926,7 @@ DefaultProperties
AdditionalOnPerkDTNames(0)="KFDT_Ballistic_Shotgun_Medic"
AdditionalOnPerkDTNames(1)="KFDT_Ballistic_DragonsBreath"
AdditionalOnPerkDTNames(2)="KFDT_Ballistic_NailShotgun"
FortitudeDamageResistance=0.1f
APDamageModifier=0.05f
}

View File

@ -893,27 +893,29 @@ simulated function string GetGrenadeClassPath()
simulated function byte GetGrenadeSelectedIndex() { return CurrentGrenadeClassIndex; }
simulated function byte SetWeaponSelectedIndex(byte idx)
simulated static function byte GetWeaponSelectedIndex(byte idx)
{
if (idx >= default.PrimaryWeaponPaths.Length && idx < 255)
{
StartingWeaponClassIndex = 0;
return 0;
}
else if (idx == 255)
if (idx == 255)
{
StartingWeaponClassIndex = `WEAP_IDX_NONE;
}
else
{
StartingWeaponClassIndex = idx;
return `WEAP_IDX_NONE;
}
ServerUpdateCurrentWeapon(StartingWeaponClassIndex);
return StartingWeaponClassIndex;
return idx;
}
simulated function byte SetGrenadeSelectedIndex(byte idx)
simulated function SetWeaponSelectedIndex(byte idx)
{
StartingWeaponClassIndex = static.GetWeaponSelectedIndex(idx);
ServerUpdateCurrentWeapon(StartingWeaponClassIndex);
}
simulated function SetGrenadeSelectedIndex(byte idx)
{
local KFGameReplicationInfo KFGRI;
@ -953,70 +955,66 @@ simulated function byte SetGrenadeSelectedIndex(byte idx)
{
UpdateCurrentGrenade();
}
return StartingGrenadeClassIndex;
}
simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
simulated static function byte GetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
{
local KFGameReplicationInfo KFGRI;
local bool AmmoVestActive, BigPocketsActive;
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
local byte SelectedGrenadeIndex;
AmmoVestActive = false;
BigPocketsActive = false;
if (idx >= default.GrenadeWeaponPaths.Length && idx < 255)
{
StartingGrenadeClassIndex = 0;
SelectedGrenadeIndex = 0;
}
else if (idx == 255)
{
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
SelectedGrenadeIndex = `WEAP_IDX_NONE;
}
else
{
StartingGrenadeClassIndex = idx;
SelectedGrenadeIndex = idx;
if (StartingGrenadeClassIndex == MedicGrenadeIndex || StartingGrenadeClassIndex == FirebugGrenadeIndex)
if (SelectedGrenadeIndex == default.MedicGrenadeIndex || SelectedGrenadeIndex == default.FirebugGrenadeIndex)
{
AmmoVestActive = InSelectedSkills[2] == 1;
BigPocketsActive = InSelectedSkills[2] == 2;
if (IsChoosingPrev)
{
if (StartingGrenadeClassIndex == FirebugGrenadeIndex)
if (SelectedGrenadeIndex == default.FirebugGrenadeIndex)
{
if (BigPocketsActive == false)
{
--StartingGrenadeClassIndex;
--SelectedGrenadeIndex;
}
}
if (StartingGrenadeClassIndex == MedicGrenadeIndex)
if (SelectedGrenadeIndex == default.MedicGrenadeIndex)
{
if (AmmoVestActive == false)
{
--StartingGrenadeClassIndex;
--SelectedGrenadeIndex;
}
}
}
else if (IsChoosingNext)
{
if (StartingGrenadeClassIndex == MedicGrenadeIndex)
if (SelectedGrenadeIndex == default.MedicGrenadeIndex)
{
if (AmmoVestActive == false)
{
++StartingGrenadeClassIndex;
++SelectedGrenadeIndex;
}
}
if (StartingGrenadeClassIndex == FirebugGrenadeIndex)
if (SelectedGrenadeIndex == default.FirebugGrenadeIndex)
{
if (BigPocketsActive == false)
{
++StartingGrenadeClassIndex;
++SelectedGrenadeIndex;
}
}
}
@ -1024,32 +1022,26 @@ simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSele
{
if (AmmoVestActive)
{
StartingGrenadeClassIndex = MedicGrenadeIndex;
SelectedGrenadeIndex = default.MedicGrenadeIndex;
}
else if (BigPocketsActive)
{
StartingGrenadeClassIndex = FirebugGrenadeIndex;
SelectedGrenadeIndex = default.FirebugGrenadeIndex;
}
else
{
StartingGrenadeClassIndex = 0;
SelectedGrenadeIndex = 0;
}
}
if (StartingGrenadeClassIndex > GrenadeWeaponPaths.Length - 1)
if (SelectedGrenadeIndex > default.GrenadeWeaponPaths.Length - 1)
{
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
SelectedGrenadeIndex = `WEAP_IDX_NONE;
}
}
}
// If we are in no gameplay time insta change
if (!KFGRI.bWaveIsActive)
{
UpdateCurrentGrenade();
}
return StartingGrenadeClassIndex;
return SelectedGrenadeIndex;
}
simulated function InitializeGrenades()

View File

@ -22,7 +22,6 @@ var private const PerkSkill WeaponSwitchSpeed;
var private const float RapidAssaultFiringRate; // Faster firing rate in % NOTE:This is needed for combinations with the Skill: RapidAssault (Stumble Power and Rate)
var private const float SnarePower;
var private const float TacticalMovementBobDamp;
var private const class<KFWeaponDefinition> BackupSecondaryWeaponDef;
var private const float TacticalMovementModifier; // QoL: Tactical movement - Added modifier to move and sprint speed.
/** Percentage of how much armor should be damaged when the heavy armor skill is active */
@ -60,6 +59,8 @@ enum ESWATPerkSkills
ESWAT_RapidAssault
};
var private const array<class<KFWeaponDefinition> > SecondaryDualWeaponPaths;
replication
{
if (bNetDirty)
@ -109,12 +110,6 @@ simulated event float GetZedTimeSpeedScale()
return IsSWATEnforcerActive() ? SWATEnforcerZedTimeSpeedScale : 1.f;
}
/* Returns the secondary weapon's class path for this perk */
simulated function string GetSecondaryWeaponClassPath()
{
return IsBackupActive() ? BackupSecondaryWeaponDef.default.WeaponClassPath : SecondaryWeaponDef.default.WeaponClassPath;
}
/*********************************************************************************************
* @name Passives
********************************************************************************************* */
@ -279,7 +274,8 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
if( KFW != none )
{
// KFDT_Bludgeon_Doshinegun_Shot is a special case of Bludgeon damage that doesn't apply this mod.
if( IsBackupActive() && (IsBackupWeapon( KFW ) || IsDual9mm( KFW ) || ShouldAffectBackupToDamage(KFW, DamageType)))
if( IsBackupActive()
&& (IsBackupWeapon( KFW ) || IsDual9mm( KFW ) || IsHRG93R( KFW ) || ShouldAffectBackupToDamage(KFW, DamageType)))
{
`QALog( "Backup Damage" @ KFW @ GetPercentage( InDamage, InDamage * GetSkillValue(PerkSkills[ESWAT_Backup])), bLogPerk );
TempDamage += InDamage * GetSkillValue( PerkSkills[ESWAT_Backup] );
@ -700,12 +696,27 @@ simulated static function GetPassiveStrings( out array<string> PassiveValues, ou
Increments[4] = "";
}
simulated function string GetSecondaryWeaponClassPath()
{
if (IsBackupActive())
{
return SecondaryDualWeaponPaths[StartingSecondaryWeaponClassIndex].default.WeaponClassPath;
}
else
{
return SecondaryWeaponPaths[StartingSecondaryWeaponClassIndex].default.WeaponClassPath;
}
}
DefaultProperties
{
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_SWAT'
PrimaryWeaponDef=class'KFWeapDef_MP7'
BackupSecondaryWeaponDef=class'KFWeapDef_9mmDual'
SecondaryDualWeaponPaths(0)=class'KFWeapDef_9mmDual'
SecondaryDualWeaponPaths(1)=class'KFWeapDef_HRG_93R_Dual'
KnifeWeaponDef=class'KFweapDef_Knife_SWAT'
GrenadeWeaponDef=class'KFWeapDef_Grenade_SWAT'

View File

@ -316,12 +316,40 @@ function GiveWeapon( Pawn P )
local KFInventoryManager KFIM;
local Inventory Inv;
// Give us the weapon if we do not have it
InventoryClass = ItemPickups[ PickupIndex ].ItemClass;
// Check if we have the weapon
KFIM = KFInventoryManager( P.InvManager );
// For HRG93R and 9mm pistols, if one of the other type is picked just give the one owned
if (KFIM.Is9mmInInventory())
{
if (InventoryClass.name == 'KFWeap_HRG_93R')
{
InventoryClass = class<Weapon>(DynamicLoadObject(class'KfWeapDef_9mm'.default.WeaponClassPath, class'Class'));
}
else if (InventoryClass.name == 'KFWeap_HRG_93R_Dual')
{
InventoryClass = class<Weapon>(DynamicLoadObject(class'KfWeapDef_9mmDual'.default.WeaponClassPath, class'Class'));
}
}
else
{
if(InventoryClass.name == 'KFWeap_Pistol_9mm')
{
InventoryClass = class<Weapon>(DynamicLoadObject(class'KFWeapDef_HRG_93R'.default.WeaponClassPath, class'Class'));
}
else if (InventoryClass.name == 'KFWeap_Pistol_Dual9mm')
{
InventoryClass = class<Weapon>(DynamicLoadObject(class'KFWeapDef_HRG_93R_Dual'.default.WeaponClassPath, class'Class'));
}
}
foreach KFIM.InventoryActors( class'KFWeapon', KFW )
{
KFWeaponClass = class<KFWeapon>( ItemPickups[PickupIndex].ItemClass );
if ( KFW.class == ItemPickups[ PickupIndex ].ItemClass )
KFWeaponClass = class<KFWeapon>( InventoryClass );
if ( KFW.class == InventoryClass )
{
// if this isn't a dual-wield class, then we can't carry another
if( KFW.DualClass == none )
@ -338,12 +366,11 @@ function GiveWeapon( Pawn P )
}
}
// Give us the weapon if we do not have it
InventoryClass = ItemPickups[ PickupIndex ].ItemClass;
Inv = KFIM.CreateInventory(InventoryClass, true);
if( Inv != none )
{
KFW = KFWeapon(Inv);
if( KFW != none )
{

View File

@ -115,6 +115,8 @@ var private const bool bPerkStatsLoaded;
var public byte SavedPerkIndex;
/** Index of the weapon chosen for the survival perk */
var public byte SurvivalPerkWeapIndex;
/** Index of the secondary weapon chosen for the survival perk */
var public byte SurvivalPerkSecondaryWeapIndex;
/** Index of the grenade chosen for the survival perk */
var public byte SurvivalPerkGrenIndex;
@ -1673,6 +1675,7 @@ function OnReadProfileSettingsComplete(byte LocalUserNum,bool bWasSuccessful)
bDisableAutoUpgrade = Profile.GetProfileBool(KFID_DisableAutoUpgrade);
bHideRemotePlayerHeadshotEffects = Profile.GetProfileBool(KFID_HideRemoteHeadshotEffects);
SurvivalPerkWeapIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingWeapIdx));
SurvivalPerkSecondaryWeapIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingSecondaryWeapIdx));
SurvivalPerkGrenIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingGrenIdx));
KFPRI = KFPlayerReplicationInfo(PlayerReplicationInfo);
@ -2862,6 +2865,12 @@ public function bool CanUseContaminationMode()
&& KFGameReplicationInfo(WorldInfo.GRI).IsContaminationMode();
}
public function bool CanUseBountyHunt()
{
return KFGameReplicationInfo(WorldInfo.GRI) != none
&& KFGameReplicationInfo(WorldInfo.GRI).IsBountyHunt();
}
/*********************************************************************************************
* @name Skill Tracking
********************************************************************************************* */
@ -7657,6 +7666,12 @@ function AddAfflictionCaused(EAfflictionType Type)
}
native reliable client private function ClientAddAfflictionCaused(EAfflictionType Type);
function AddCollectibleFound(int Limit)
{
ClientAddCollectibleFound(Limit);
}
native reliable client private function ClientAddCollectibleFound(int Limit);
function AddZedAssist(class<KFPawn_Monster> MonsterClass)
{
ClientAddZedAssist(MonsterClass);
@ -12038,6 +12053,8 @@ reliable client function ForceMonsterHeadExplode(KFPawn_Monster Victim)
simulated function InitPerkLoadout()
{
CurrentPerk.SetSecondaryWeaponSelectedIndex(SurvivalPerkSecondaryWeapIndex);
if (CurrentPerk.IsA('KFPerk_Survivalist'))
{
CurrentPerk.SetWeaponSelectedIndex(SurvivalPerkWeapIndex);

View File

@ -117,6 +117,9 @@ var bool ContaminationModePlayerIsInside;
var int ContaminationModeLastTimePlayerOutPulsate;
var bool ContaminationModeLastPulsate;
// Bounty Hunt weekly
var int BountyHuntCurrentExtraZeds;
cpptext
{
virtual UBOOL TestZedTimeVisibility(APawn* P, UNetConnection* Connection, UBOOL bLocalPlayerTest) override;
@ -272,6 +275,27 @@ reliable client function HideContaminationMode()
}
}
reliable client function DisplayBountyHuntObjective(int Bounties)
{
if (MyGFxHUD != none)
{
MyGFxHUD.DisplayBountyHuntObjective(Bounties);
}
}
reliable client function DisplayBountyHuntStatus(int CurrentAliveBounties, int MaxBounties, int DeadBounties, int Dosh, int DoshNoAssist)
{
if (MyGFxHUD != none)
{
//`Log("CurrentAliveBounties :" $CurrentAliveBounties);
//`Log("(MaxBounties - DeadBounties) :" $(MaxBounties - DeadBounties));
BountyHuntCurrentExtraZeds = (MaxBounties - DeadBounties) - CurrentAliveBounties;
MyGFxHUD.DisplayBountyHuntStatus(MaxBounties - DeadBounties, Dosh, DoshNoAssist);
}
}
reliable client function ResetSyringe()
{
local KFInventoryManager InventoryManager;
@ -536,15 +560,21 @@ function AdjustDamage(out int InDamage, Controller InstigatedBy, class<DamageTyp
local KFGameInfo KFGI;
local float Multiplier, ModifierRange, HealthTop, HealthRange;
local KFGameReplicationInfo KFGRI;
local KFPawn_Monster KFPM;
local int BountyHuntZedIt, BountyHuntIt;
local float WaveProgress;
super.AdjustDamage(InDamage, InstigatedBy, DamageType, DamageCauser, DamageReceiver);
KFGI = KFGameInfo(WorldInfo.Game);
if (Pawn != None && KFGI != none && KFGI.OutbreakEvent != none && KFGI.OutbreakEvent.ActiveEvent.bVIPGameMode)
if (KFGI != none)
{
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
}
if (Pawn != None && KFGI != none && KFGI.OutbreakEvent != none && KFGI.OutbreakEvent.ActiveEvent.bVIPGameMode)
{
// If I am the VIP doing the damage, and I am NOT doing damage to myself
if (KFGRI != none
&& KFGRI.VIPRepPlayer != none
@ -598,6 +628,58 @@ function AdjustDamage(out int InDamage, Controller InstigatedBy, class<DamageTyp
InDamage = int(float(InDamage) * Multiplier);
}
}
if (Pawn != None && KFGRI != none && KFGRI.IsBountyHunt())
{
KFPM = KFPawn_Monster(DamageCauser);
if (KFPM != none && KFPM.bIsBountyHuntObjective)
{
// Depending on wave progress we tweak the Damage
if (KFGRI.WaveTotalAICount > 0)
{
// Don't count current alive Bounty Zeds
WaveProgress = float(KFGRI.AIRemaining - KFGI.WeeklyCurrentExtraNumberOfZeds()) / float(KFGRI.WaveTotalAICount);
}
else
{
WaveProgress = 0.f;
}
// Find first node of data for the Zed type we checking,.
for (BountyHuntZedIt = 0 ; BountyHuntZedIt < KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression.Length; ++BountyHuntZedIt)
{
if (KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].ZedType == KFPM.class)
{
break;
}
}
// Update to the current level
for (BountyHuntIt = 0 ; BountyHuntIt < KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression.Length; ++BountyHuntIt)
{
if (WaveProgress >= KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression[BountyHuntIt].RemainingZedRatio)
{
break;
}
}
if (BountyHuntIt == KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression.Length)
{
BountyHuntIt = KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression.Length - 1;
}
//`Log("BOUNTY HUNT : Initial InDamage = " $InDamage);
//`Log("WaveProgress : " $WaveProgress);
InDamage += InDamage * KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression[BountyHuntIt].DamageBuffRatio;
//`Log("BOUNTY HUNT : Output Damage: " $KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression[BountyHuntIt].DamageBuffRatio);
//`Log("BOUNTY HUNT : Final InDamage = " $InDamage);
}
}
}
function AdjustVIPDamage(out int InDamage, Controller InstigatedBy)

View File

@ -20,6 +20,7 @@ struct native WeaponSkinPairs
var transient array<CustomizationInfo> Characters;
var transient array<string> FavoriteWeapons;
var transient array<WeaponSkinPairs> ActiveSkins;
var transient array<string> KilledHansVolterInMaps;
var transient bool Dirty;
event FavoriteWeapon(name WeaponName)
@ -53,6 +54,29 @@ event UnFavoriteWeapon(name WeaponName)
}
}
function bool AddHansVolterKilledInMap(string MapName)
{
if (KilledHansVolterInMaps.Find(MapName) == INDEX_NONE)
{
KilledHansVolterInMaps.AddItem(MapName);
while (KilledHansVolterInMaps.Length > 5)
{
// There's a crash on the save system because the string this generates is huge
// We don't need to store more than 5
// We are going to cap it then, we remove from the beginning
KilledHansVolterInMaps.Remove(0, 1);
}
Dirty = true;
return true;
}
return false;
}
event Save( byte ControllerId )
{
if(Dirty)
@ -234,6 +258,7 @@ defaultproperties
ProfileMappings.Add((Id=KFID_FriendlyHudScale, Name="Friendly HUD Scale", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_FavoriteWeapons, Name="Favorite Weapons", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_GearLoadouts, Name="Gear Loadouts", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_KilledHansVolterInMaps, Name="Killed Hans Volter In Maps", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_SetGamma, Name="Set Gamma", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_RequiresPushToTalk, Name="RequiresPushToTalk", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_InvertController, Name="controllerInvertedValue", MappingType=PVMT_RawValue))
@ -258,6 +283,7 @@ defaultproperties
ProfileMappings.Add((Id=KFID_SavedLengthIndex, Name="SavedLengthIndex", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_SavedPrivacyIndex, Name="SavedPrivacyIndex", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_SavedAllowSeasonalSkinsIndex, Name="SavedAllowSeasonalSkinsIndex", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_SavedWeeklySelectorIndex, Name="SavedWeeklySelectorIndex", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_SavedServerTypeIndex, Name="SavedServerTypeIndex", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_SavedInProgressIndex, Name="SavedInProgressIndex", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_ControllerSoundEnabled, Name="Controller Sound Enabled", MappingType=PVMT_RawValue))
@ -320,6 +346,7 @@ defaultproperties
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_FriendlyHudScale,Data=(Type=SDT_Float,Value1=0x3f800000)))) // default of 1.0f
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_FavoriteWeapons,Data=(Type=SDT_String,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_GearLoadouts,Data=(Type=SDT_String,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_KilledHansVolterInMaps,Data=(Type=SDT_String,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SetGamma,Data=(Type=SDT_Int32,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_RequiresPushToTalk,Data=(Type=SDT_Int32,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_InvertController,Data=(Type=SDT_Int32,Value1=0))))
@ -344,6 +371,7 @@ defaultproperties
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedLengthIndex,Data=(Type=SDT_Int32,Value1=0)))) //default to any
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedPrivacyIndex,Data=(Type=SDT_Int32,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedAllowSeasonalSkinsIndex,Data=(Type=SDT_Int32,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedWeeklySelectorIndex,Data=(Type=SDT_Int32,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedServerTypeIndex,Data=(Type=SDT_Int32,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedInProgressIndex,Data=(Type=SDT_Int32,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_ControllerSoundEnabled,Data=(Type=SDT_Int32,Value1=0))))
@ -411,4 +439,7 @@ defaultproperties
ProfileMappings.Add((Id=KFID_ViewAccelerationEnabled, Name="View_Acceleration_Enabled", MappingType=PVMT_RawValue))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_ViewAccelerationEnabled,Data=(Type=SDT_Int32,Value1=1))))
ProfileMappings.Add((Id=KFID_SurvivalStartingSecondaryWeapIdx, Name="Survival Starting Secondary Weapon Index", MappingType=PVMT_RawValue))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SurvivalStartingSecondaryWeapIdx,Data=(Type=SDT_Int32,Value1=0))))
}

View File

@ -392,7 +392,7 @@ function NotifyOwnerTakeHit(class<KFDamageType> DamageType, vector HitLoc, vecto
KFPOwner.EndSpecialMove();
// force stumble when damaged from a grapple
if ( KFPOwner.CanDoSpecialMove(SM_Stumble) && DamageType.default.StumblePower > 0 )
if ( KFPOwner.CanDoSpecialMove(SM_Stumble) && DamageType != none && DamageType.default.StumblePower > 0 )
{
KFPOwner.DoSpecialMove(SM_Stumble,,, class'KFSM_Stumble'.static.PackBodyHitSMFlags(KFPOwner, HitDir));
}

View File

@ -80,4 +80,5 @@ simulated event OnTryCompleteObjective(int ObjectiveIndex, int EventIndex);
simulated function OnHitTaken();
simulated function OnHitGiven(class<DamageType> DT);
simulated function OnWeaponPurchased(class<KFWeaponDefinition> WeaponDef, int Price);
simulated function OnAfflictionCaused(EAfflictionType Type);
simulated function OnAfflictionCaused(EAfflictionType Type);
simulated function OnCollectibleFound(int Limit);

View File

@ -109,7 +109,7 @@ enum ESquadType
EST_Large,
EST_Medium,
EST_Small,
EST_Crawler,
EST_Crawler
};
/** If set, players cannot spawn here, only AI (Versus) */
var() bool bNoPlayers;
@ -154,6 +154,12 @@ var() float UnTouchCoolDownTime;
/** When was the last time a player touched it. */
var protected transient float LastUnTouchTime;
/** If true, will be used to spawn forcing to use the override pawn list -> MapReplacePawnClass */
var() bool bForceUseMapReplacePawn;
/** If true, this volume will be disabled for Bounty Hunt Spawn */
var() bool bDisableForBountyHuntSpawn;
/*********************************************************************************************
Debug
********************************************************************************************* */
@ -503,6 +509,9 @@ DefaultProperties
MaxHeightDiffToPlayers=500.f // 5 meters
LargestSquadType=EST_Large
bForceUseMapReplacePawn=false
bDisableForBountyHuntSpawn=false
// Debugging
bDebugVisibilityChecks=false
bMinimalDebugRatingChecks=true

View File

@ -39,7 +39,8 @@ enum ESharedContentUnlock
SCU_G36C,
SCU_HVStormCannon,
SCU_ZedMKIII,
SCU_Saiga12
SCU_Saiga12,
SCU_MG3
};
@ -398,4 +399,8 @@ defaultproperties
Name=KFWeap_Shotgun_S12,
IconPath="WEP_UI_Saiga12_TEX.UI_WeaponSelect_Saiga12",
ID=9666)}
SharedContentList(SCU_MG3)={(
Name=KFWeap_LMG_MG3,
IconPath="WEP_UI_MG3_TEX.UI_WeaponSelect_MG3",
ID=9755)}
}

View File

@ -14,7 +14,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_G18"
BuyPrice=1500
AmmoPricePerMag=24
AmmoPricePerMag=22 // 24
ImagePath="WEP_UI_RiotShield_TEX.UI_WeaponSelect_RiotShield"
IsPlayGoHidden=true;

View File

@ -15,7 +15,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_AssaultRifle_G36C"
BuyPrice=1600
AmmoPricePerMag=36
AmmoPricePerMag=32 // 36
ImagePath="wep_ui_g36c_tex.UI_WeaponSelect_G36C"
IsPlayGoHidden=true;

View File

@ -12,7 +12,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_HK_UMP"
BuyPrice=1200
AmmoPricePerMag=36 //45
AmmoPricePerMag=32 // 36 //45
ImagePath="WEP_UI_HK_UMP_TEX.UI_WeaponSelect_UMP"
EffectiveRange=70

View File

@ -0,0 +1,35 @@
//=============================================================================
// KFWeaponDefintion
//=============================================================================
// A lightweight container for basic weapon properties that can be safely
// accessed without a weapon actor (UI, remote clients).
//=============================================================================
// Killing Floor 2
// Copyright (C) 2023 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_HRG_93R extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_HRG_93R"
BuyPrice=0
AmmoPricePerMag=10 //8
ImagePath="wep_ui_hrg_93r_pistol_tex.UI_WeaponSelect_HRG_93R"
EffectiveRange=50
UpgradePrice[0]=200
UpgradePrice[1]=500
UpgradePrice[2]=600
UpgradePrice[3]=700
UpgradePrice[4]=1500
// Cannot be sold
//UpgradeSellPrice[0]=150
//UpgradeSellPrice[1]=337
//UpgradeSellPrice[2]=412
//UpgradeSellPrice[3]=450
//UpgradeSellPrice[4]=750
}

View File

@ -0,0 +1,35 @@
//=============================================================================
// KFWeaponDefintion
//=============================================================================
// A lightweight container for basic weapon properties that can be safely
// accessed without a weapon actor (UI, remote clients).
//=============================================================================
// Killing Floor 2
// Copyright (C) 2023 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_HRG_93R_Dual extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_HRG_93R_Dual"
BuyPrice=300
AmmoPricePerMag=20 //16
ImagePath="wep_ui_dual_hrg_93r_pistol_tex.UI_WeaponSelect_Dual_HRG_93R"
EffectiveRange=50
UpgradePrice[0]=200
UpgradePrice[1]=500
UpgradePrice[2]=600
UpgradePrice[3]=700
UpgradePrice[4]=1500
// Code has this value set to 0 to avoid exploit selling. I'm setting the values to 0 here as well just in case.
UpgradeSellPrice[0]=0
UpgradeSellPrice[1]=0
UpgradeSellPrice[2]=0
UpgradeSellPrice[3]=0
UpgradeSellPrice[4]=0
}

View File

@ -14,7 +14,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_HRG_BarrierRifle"
BuyPrice=2000
AmmoPricePerMag=55
AmmoPricePerMag=50 // 55
ImagePath="wep_ui_hrg_barrierrifle_tex.UI_WeaponSelect_HRG_BarrierRifle"
IsPlayGoHidden=true;

View File

@ -14,7 +14,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_HRG_Stunner"
BuyPrice=1500
AmmoPricePerMag=36
AmmoPricePerMag=32 // 36
ImagePath="ui_weaponselect_tex.UI_WeaponSelect_AA12"
IsPlayGoHidden=true;

View File

@ -15,7 +15,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_Kriss"
BuyPrice=1500
AmmoPricePerMag=35 //35
AmmoPricePerMag=31 //35
ImagePath="WEP_UI_KRISS_TEX.UI_WeaponSelect_KRISS"
EffectiveRange=70

View File

@ -0,0 +1,25 @@
//=============================================================================
// KFWeapDef_MG3
//=============================================================================
//
//=============================================================================
// Killing Floor 2
// Copyright (C) 2023 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_MG3 extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_LMG_MG3"
BuyPrice=2000
AmmoPricePerMag=70
ImagePath="WEP_UI_MG3_TEX.UI_WeaponSelect_MG3"
IsPlayGoHidden=true;
EffectiveRange=68
SharedUnlockId=SCU_MG3
}

View File

@ -15,7 +15,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_MP5RAS"
BuyPrice=650
AmmoPricePerMag=28 //22 //33
AmmoPricePerMag=25 // 28 //22 //33
ImagePath="WEP_UI_MP5RAS_TEX.UI_WeaponSelect_MP5RAS"
EffectiveRange=70

View File

@ -15,7 +15,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_MP7"
BuyPrice=200
AmmoPricePerMag=16 //26
AmmoPricePerMag=14 // 16 //26
ImagePath="WEP_UI_MP7_TEX.UI_WeaponSelect_MP7"
EffectiveRange=70

View File

@ -14,7 +14,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_Mac10"
BuyPrice=900//1100
AmmoPricePerMag=32
AmmoPricePerMag=29 // 32
ImagePath="WEP_UI_MAC10_TEX.UI_WeaponSelect_Mac10"
EffectiveRange=70

View File

@ -15,7 +15,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_Medic"
BuyPrice=650
AmmoPricePerMag=21
AmmoPricePerMag=19 // 21
ImagePath="ui_weaponselect_tex.UI_WeaponSelect_MedicSMG"
EffectiveRange=70

View File

@ -15,7 +15,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_P90"
BuyPrice=1100
AmmoPricePerMag=40 //50
AmmoPricePerMag=36 // 40 //50
ImagePath="WEP_UI_P90_TEX.UI_WeaponSelect_FNP90"
EffectiveRange=70

View File

@ -14,7 +14,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_AssaultRifle_Thompson"
BuyPrice=650 //650
AmmoPricePerMag=50
AmmoPricePerMag=45 // 50
ImagePath="WEP_UI_TommyGun_TEX.UI_WeaponSelect_TommyGun"

View File

@ -408,7 +408,10 @@ function StartHealRecharge()
if( Role == ROLE_Authority )
{
InstigatorPerk = GetPerk();
UsedHealRechargeTime = HealFullRechargeSeconds * static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex);
UsedHealRechargeTime = HealFullRechargeSeconds;
UsedHealRechargeTime *= static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex);
UsedHealRechargeTime *= InstigatorPerk.GetHealRechargeMod();
InstigatorPerk.ModifyHealerRechargeTime( UsedHealRechargeTime );
// Set the healing recharge rate whenever we start charging

View File

@ -988,6 +988,8 @@ var repnotify Actor TargetingCompRepActor;
// To force the crosshair for showing up even if there's no spread
var bool bForceCrosshair;
const MinFireIntervalToTriggerSync = 0.23f;
cpptext
{
// Actor
@ -6563,6 +6565,11 @@ simulated state WeaponFiring
{
StopLoopingFireEffects(CurrentFireMode);
}
if (WorldInfo.NetMode == NM_Client && bAllowClientAmmoTracking && FireInterval[CurrentFireMode] <= MinFireIntervalToTriggerSync)
{
SyncCurrentAmmoCount(CurrentFireMode, AmmoCount[CurrentFireMode]);
}
}
/** Override to continue any looping fire anims */
@ -6607,6 +6614,14 @@ simulated state WeaponFiring
}
}
unreliable server function SyncCurrentAmmoCount(byte FireMode, byte CurrentAmmoCount)
{
if(AmmoCount[FireMode] != CurrentAmmoCount)
{
AmmoCount[FireMode] = CurrentAmmoCount;
}
}
/**
* Sets the timing for the firing state on server and local client.
* By default, a constant looping Rate Of Fire (ROF) is set up.

View File

@ -4736,4 +4736,154 @@ defaultproperties
//S12 Shockgun Tiger
Skins.Add((Id=9671, Weapondef=class'KFWeapDef_Shotgun_S12', MIC_1P=("WEP_SkinSet76_MAT.Wep_1stP_Saiga12_Tiger_MIC"), MIC_3P="WEP_SkinSet76_MAT.WEP_3P_Saiga12_Tiger_MIC", MIC_Pickup="WEP_SkinSet76_MAT.Wep_3P_Pickup_Saiga12_Tiger_MIC"))
//MG3 Shredder Standard
Skins.Add((Id=9755, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_1p_mg3_mat.Wep_1stP_MG3_MIC"), MIC_3P="wep_3p_mg3_mat.Wep_3rdP_MG3_MIC", MIC_Pickup="wep_3p_mg3_mat.3P_Pickup_MG3_MIC"))
//MG3 Shredder Antique
Skins.Add((Id=9756, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Antique_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Antique_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Antique_Pickup_MIC"))
//MG3 Shredder Arctic
Skins.Add((Id=9757, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Arctic_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Arctic_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Arctic_Pickup_MIC"))
//MG3 Shredder Desert
Skins.Add((Id=9758, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Desert_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Desert_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Desert_Pickup_MIC"))
//MG3 Shredder Filigree
Skins.Add((Id=9759, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Filigree_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Filigree_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Filigree_Pickup_MIC"))
//MG3 Shredder Forest
Skins.Add((Id=9760, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Forest_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Forest_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Forest_Pickup_MIC"))
//Chameleon Dynamic 500 Magnum Revolver
Skins.Add((Id=9674, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_SW500', MIC_1P=("WEP_SkinSet79_MAT.chameleon_sw500.Chameleon_SW500_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleon_sw500.Chameleon_SW500_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleon_sw500.Chameleon_SW500_3P_Pickup_MIC"))
//Chameleon Dynamic Doomstick
Skins.Add((Id=9675, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_ElephantGun', MIC_1P=("WEP_SkinSet79_MAT.chameleon_quadbarrel.Chameleon_QuadBarrel_Main_1P_Mint_MIC", "WEP_SkinSet79_MAT.chameleon_quadbarrel.Chameleon_QuadBarrel_Barrel_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleon_quadbarrel.Chameleon_QuadBarrel_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleon_quadbarrel.Chameleon_QuadBarrel_3P_Pickup_MIC"))
//Chameleon Dynamic Hemoclobber
Skins.Add((Id=9676, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MedicBat', MIC_1P=("WEP_SkinSet79_MAT.chameleon_medicbat.Chameleon_MedicBat_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleon_medicbat.Chameleon_MedicBat_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleon_medicbat.Chameleon_MedicBat_3P_Pickup_MIC"))
//Chameleon Dynamic P90
Skins.Add((Id=9677, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet79_MAT.chameleon_p90.Chameleon_P90_1P_Mint_MIC", "WEP_SkinSet79_MAT.chameleon_p90.Chameleon_P90_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleon_p90.Chameleon_P90_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleon_p90.Chameleon_P90_3P_Pickup_MIC"))
//Chameleon Dynamic RGB 500 Magnum Revolver
Skins.Add((Id=9678, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_SW500', MIC_1P=("WEP_SkinSet79_MAT.chameleonrgb_sw500.ChameleonRGB_SW500_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleonrgb_sw500.ChameleonRGB_SW500_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleonrgb_sw500.ChameleonRGB_SW500_3P_Pickup_MIC"))
//Chameleon Dynamic RGB Doomstick
Skins.Add((Id=9679, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_ElephantGun', MIC_1P=("WEP_SkinSet79_MAT.chameleonrgb_quadbarrel.ChameleonRGB_QuadBarrel_Main_1P_Mint_MIC", "WEP_SkinSet79_MAT.chameleonrgb_quadbarrel.ChameleonRGB_QuadBarrel_Barrel_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleonrgb_quadbarrel.ChameleonRGB_QuadBarrel_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleonrgb_quadbarrel.ChameleonRGB_QuadBarrel_3P_Pickup_MIC"))
//Chameleon Dynamic RGB Hemoclobber
Skins.Add((Id=9680, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MedicBat', MIC_1P=("WEP_SkinSet79_MAT.chameleonrgb_medicbat.ChameleonRGB_MedicBat_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleonrgb_medicbat.ChameleonRGB_MedicBat_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleonrgb_medicbat.ChameleonRGB_MedicBat_3P_Pickup_MIC"))
//Chameleon Dynamic RGB P90
Skins.Add((Id=9681, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet79_MAT.chameleonrgb_p90.ChameleonRGB_P90_1P_Mint_MIC", "WEP_SkinSet79_MAT.chameleonrgb_p90.ChameleonRGB_P90_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleonrgb_p90.ChameleonRGB_P90_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleonrgb_p90.ChameleonRGB_P90_3P_Pickup_MIC"))
//Medieval Dynamic 500 Magnum Revolver
Skins.Add((Id=9711, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_SW500', MIC_1P=("WEP_SkinSet80_MAT.medieval_sw500.Medieval_SW500_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medieval_sw500.Medieval_SW500_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medieval_sw500.Medieval_SW500_3P_Pickup_MIC"))
//Medieval Dynamic Dragonsbreath
Skins.Add((Id=9708, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Dragonsbreath', MIC_1P=("WEP_SkinSet80_MAT.medieval_dragonsbreath.Medieval_Dragonsbreath_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medieval_dragonsbreath.Medieval_Dragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medieval_dragonsbreath.Medieval_Dragonsbreath_3P_Pickup_MIC"))
//Medieval Dynamic M79
Skins.Add((Id=9709, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M79', MIC_1P=("WEP_SkinSet80_MAT.medieval_m79.Medieval_M79_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medieval_m79.Medieval_M79_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medieval_m79.Medieval_M79_3P_Pickup_MIC"))
//Medieval Dynamic Tommy Gun
Skins.Add((Id=9710, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Thompson', MIC_1P=("WEP_SkinSet80_MAT.medieval_tommygun.Medieval_TommyGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medieval_tommygun.Medieval_TommyGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medieval_tommygun.Medieval_TommyGun_3P_Pickup_MIC"))
//Medieval Dynamic Precious 500 Magnum Revolver
Skins.Add((Id=9712, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_SW500', MIC_1P=("WEP_SkinSet80_MAT.medievalgold_sw500.MedievalGold_SW500_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medievalgold_sw500.MedievalGold_SW500_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medievalgold_sw500.MedievalGold_SW500_3P_Pickup_MIC"))
//Medieval Dynamic Precious Dragonsbreath
Skins.Add((Id=9713, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Dragonsbreath', MIC_1P=("WEP_SkinSet80_MAT.medievalgold_dragonsbreath.MedievalGold_Dragonsbreath_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medievalgold_dragonsbreath.MedievalGold_Dragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medievalgold_dragonsbreath.MedievalGold_Dragonsbreath_3P_Pickup_MIC"))
//Medieval Dynamic Precious M79
Skins.Add((Id=9714, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M79', MIC_1P=("WEP_SkinSet80_MAT.medievalgold_m79.MedievalGold_M79_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medievalgold_m79.MedievalGold_M79_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medievalgold_dragonsbreath.MedievalGold_M79_3P_Pickup_MIC"))
//Medieval Dynamic Precious Tommy Gun
Skins.Add((Id=9715, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Thompson', MIC_1P=("WEP_SkinSet80_MAT.medievalgold_tommygun.MedievalGold_TommyGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medievalgold_tommygun.MedievalGold_TommyGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medievalgold_tommygun.MedievalGold_TommyGun_3P_Pickup_MIC"))
//Spectre HRG 93R
Skins.Add((Id=9682, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_93R', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrg93r.Spectre_HRG93R_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrg93r.Spectre_HRG93R_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrg93r.Spectre_HRG93R_3P_Pickup_MIC"))
//Spectre HRG Ballistic Bouncer
Skins.Add((Id=9683, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BallisticBouncer', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgballisticbouncer.Spectre_HRGBallisticBouncer_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgballisticbouncer.Spectre_HRGBallisticBouncer_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgballisticbouncer.Spectre_HRGBallisticBouncer_3P_Pickup_MIC"))
//Spectre HRG Bastion
Skins.Add((Id=9684, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BarrierRifle', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_Receiver_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_3P_Pickup_MIC"))
//Spectre HRG Beluga Beat
Skins.Add((Id=9685, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_SonicGun', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgsonicgun.Spectre_HRGSonicGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgsonicgun.Spectre_HRGSonicGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgsonicgun.Spectre_HRGSonicGun_3P_Pickup_MIC"))
//Spectre HRG Blast Brawlers
Skins.Add((Id=9686, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BlastBrawlers', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgblastbrawlers.Spectre_HRGBlastBrawlers_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgblastbrawlers.Spectre_HRGBlastBrawlers_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgblastbrawlers.Spectre_HRGBlastBrawlers_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgblastbrawlers.Spectre_HRGBlastBrawlers_3P_Pickup_MIC"))
//Spectre HRG Crossboom
Skins.Add((Id=9687, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Crossboom', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgcrossboom.Spectre_HRGCrossboom_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgcrossboom.Spectre_HRGCrossboom_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgcrossboom.Spectre_HRGCrossboom_3P_Pickup_MIC"))
//Spectre HRG Disrupter
Skins.Add((Id=9688, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Energy', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgenergy.Spectre_HRGEnergy_1P_Mint_MIC", "WEP_1P_HRG_Energy_MAT.Wep_Energy_Pistol_Optic_PM_MIC", "WEP_SkinSet78_MAT.spectre_hrgenergy.Spectre_HRGEnergy_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgenergy.Spectre_HRGEnergy_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgenergy.Spectre_HRGEnergy_3P_Pickup_MIC"))
//Spectre HRG Dragonsblaze
Skins.Add((Id=9689, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Dragonbreath', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_Barrel_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_Loader_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_3P_Pickup_MIC"))
//Spectre HRG Head Hunter
Skins.Add((Id=9690, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_CranialPopper', MIC_1P=("WEP_1P_HRG_CranialPopper_MAT.Wep_Cranial_Optic_PM_MIC", "WEP_SkinSet78_MAT.spectre_hrgcranialpopper.Spectre_HRGCranialPopper_Optic_1P_Mint_MIC", "WEP_1P_RailGun_MAT.WEP_RailGunScopeLense_PM", "WEP_SkinSet78_MAT.spectre_hrgcranialpopper.Spectre_HRGCranialPopper_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgcranialpopper.Spectre_HRGCranialPopper_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgcranialpopper.Spectre_HRGCranialPopper_3P_Pickup_MIC"))
//Spectre HRG Locust
Skins.Add((Id=9691, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Locust', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrglocust.Spectre_HRGLocust_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrglocust.Spectre_HRGLocust_Optic_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrglocust.Spectre_HRGLocust_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrglocust.Spectre_HRGLocust_3P_Pickup_MIC"))
//Spectre HRG Medic Missile
Skins.Add((Id=9692, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_MedicMissile', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgmedicmissile.Spectre_HRGMedicMissile_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgmedicmissile.Spectre_HRGMedicMissile_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgmedicmissile.Spectre_HRGMedicMissile_3P_Pickup_MIC"))
//Spectre HRG Stunner
Skins.Add((Id=9693, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Stunner', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgstunner.Spectre_HRGStunner_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgstunner.Spectre_HRGStunner_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgstunner.Spectre_HRGStunner_3P_Pickup_MIC"))
//Spectre HRG Tommy Boom
Skins.Add((Id=9694, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Boomy', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgboomy.Spectre_HRGBoomy_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgboomy.Spectre_HRGBoomy_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgboomy.Spectre_HRGBoomy_3P_Pickup_MIC"))
//Spectre Chroma HRG 93R
Skins.Add((Id=9695, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_93R', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrg93r.SpectreChroma_HRG93R_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrg93r.SpectreChroma_HRG93R_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrg93r.SpectreChroma_HRG93R_3P_Pickup_MIC"))
//Spectre Chroma HRG Ballistic Bouncer
Skins.Add((Id=9696, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BallisticBouncer', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgballisticbouncer.SpectreChroma_HRGBallisticBouncer_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgballisticbouncer.SpectreChroma_HRGBallisticBouncer_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgballisticbouncer.SpectreChroma_HRGBallisticBouncer_3P_Pickup_MIC"))
//Spectre Chroma HRG Bastion
Skins.Add((Id=9697, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BarrierRifle', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_Receiver_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_3P_Pickup_MIC"))
//Spectre Chroma HRG Beluga Beat
Skins.Add((Id=9698, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_SonicGun', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgsonicgun.SpectreChroma_HRGSonicGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgsonicgun.SpectreChroma_HRGSonicGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgsonicgun.SpectreChroma_HRGSonicGun_3P_Pickup_MIC"))
//Spectre Chroma HRG Blast Brawlers
Skins.Add((Id=9699, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BlastBrawlers', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgblastbrawlers.SpectreChroma_HRGBlastBrawlers_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgblastbrawlers.SpectreChroma_HRGBlastBrawlers_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgblastbrawlers.SpectreChroma_HRGBlastBrawlers_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgblastbrawlers.SpectreChroma_HRGBlastBrawlers_3P_Pickup_MIC"))
//Spectre Chroma HRG Crossboom
Skins.Add((Id=9700, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Crossboom', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgcrossboom.SpectreChroma_HRGCrossboom_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgcrossboom.SpectreChroma_HRGCrossboom_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgcrossboom.SpectreChroma_HRGCrossboom_3P_Pickup_MIC"))
//Spectre Chroma HRG Disrupter
Skins.Add((Id=9701, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Energy', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgenergy.SpectreChroma_HRGEnergy_1P_Mint_MIC", "WEP_1P_HRG_Energy_MAT.Wep_Energy_Pistol_Optic_PM_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgenergy.SpectreChroma_HRGEnergy_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgenergy.SpectreChroma_HRGEnergy_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgenergy.SpectreChroma_HRGEnergy_3P_Pickup_MIC"))
//Spectre Chroma HRG Dragonsblaze
Skins.Add((Id=9702, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Dragonbreath', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_Barrel_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_Loader_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_3P_Pickup_MIC"))
//Spectre Chroma HRG Head Hunter
Skins.Add((Id=9703, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_CranialPopper', MIC_1P=("WEP_1P_HRG_CranialPopper_MAT.Wep_Cranial_Optic_PM_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgcranialpopper.SpectreChroma_HRGCranialPopper_Optic_1P_Mint_MIC", "WEP_1P_RailGun_MAT.WEP_RailGunScopeLense_PM", "WEP_SkinSet78_MAT.spectrechroma_hrgcranialpopper.SpectreChroma_HRGCranialPopper_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgcranialpopper.SpectreChroma_HRGCranialPopper_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgcranialpopper.SpectreChroma_HRGCranialPopper_3P_Pickup_MIC"))
//Spectre Chroma HRG Locust
Skins.Add((Id=9704, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Locust', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrglocust.SpectreChroma_HRGLocust_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrglocust.SpectreChroma_HRGLocust_Optic_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrglocust.SpectreChroma_HRGLocust_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrglocust.SpectreChroma_HRGLocust_3P_Pickup_MIC"))
//Spectre Chroma HRG Medic Missile
Skins.Add((Id=9705, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_MedicMissile', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgmedicmissile.SpectreChroma_HRGMedicMissile_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgmedicmissile.SpectreChroma_HRGMedicMissile_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgmedicmissile.SpectreChroma_HRGMedicMissile_3P_Pickup_MIC"))
//Spectre Chroma HRG Stunner
Skins.Add((Id=9706, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Stunner', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgstunner.SpectreChroma_HRGStunner_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgstunner.SpectreChroma_HRGStunner_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgstunner.SpectreChroma_HRGStunner_3P_Pickup_MIC"))
//Spectre Chroma HRG Tommy Boom
Skins.Add((Id=9707, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Boomy', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgboomy.SpectreChroma_HRGBoomy_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgboomy.SpectreChroma_HRGBoomy_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgboomy.SpectreChroma_HRGBoomy_3P_Pickup_MIC"))
//Bounty Hunt Deagle
Skins.Add((Id=9753, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet81_MAT.BountyHunt.BountyHunt_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet81_MAT.BountyHunt.BountyHunt_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet81_MAT.BountyHunt.BountyHunt_Deagle_3P_Pickup_MIC"))
//Voltar MKB42
Skins.Add((Id=9754, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MKB42', MIC_1P=("WEP_SkinSet81_MAT.hans_mkb42.Hans_MKB42_1P_Mint_MIC"), MIC_3P="WEP_SkinSet81_MAT.hans_mkb42.Hans_MKB42_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet81_MAT.hans_mkb42.Hans_MKB42_3P_Pickup_MIC"))
}

View File

@ -27,7 +27,7 @@ var localized array<string> ModifierDescriptions;
cpptext
{
/** Num of Weekly events available */
static const int NumWeeklyEvents = 20;
static const int NumWeeklyEvents = 21;
}
DefaultProperties
{

View File

@ -160,4 +160,5 @@ const STATID_ACHIEVE_RigCollectibles = 4062;
const STATID_ACHIEVE_BarmwichCollectibles = 4063;
const STATID_ACHIEVE_CrashCollectibles = 4064;
const STATID_ACHIEVE_SubductionCollectibles = 4065;
const STATID_ACHIEVE_VolterCastleCollectibles = 4066;
/** `endif */

View File

@ -80,4 +80,7 @@ const KFID_MouseLookUpScale=181; // Halloweeen 2022 QoL: added mouse options to
const KFID_MouseLookRightScale=182; // Halloweeen 2022 QoL: added mouse options to menu
const KFID_ViewSmoothingEnabled=183; // Halloweeen 2022 QoL: added mouse options to menu
const KFID_ViewAccelerationEnabled=184; // Halloweeen 2022 QoL: added mouse options to menu
const KFID_SavedAllowSeasonalSkinsIndex=185;
const KFID_SavedAllowSeasonalSkinsIndex=185;
const KFID_SurvivalStartingSecondaryWeapIdx=186; // Halloween 2023 : added HRG 93R Pistol to Survivalist secondary weapons
const KFID_KilledHansVolterInMaps=187; // Halloween 2023 : Seasonal Kill Hans on Different Maps
const KFID_SavedWeeklySelectorIndex=188; // Halloween 2023 QoL: Weekly selector

View File

@ -1698,11 +1698,12 @@ function DoFleeFrom( actor FleeFrom,
optional float FleeDuration,
optional float FleeDistance,
optional bool bShouldStopAtGoal=false,
optional bool bFromFear=false )
optional bool bFromFear=false,
optional bool bUseRandomDirection=false )
{
if( !bFromFear || !MyPatPawn.bInFleeAndHealMode )
{
super.DoFleeFrom( FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bFromFear );
super.DoFleeFrom( FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bFromFear, bUseRandomDirection );
}
}

View File

@ -19,6 +19,7 @@ var private bool bFound;
protected event TriggerDestroyedEvent( Controller EventInstigator )
{
local KFMapInfo KFMI;
local KFPlayerController KFPC;
super.TriggerDestroyedEvent( EventInstigator );
@ -27,6 +28,12 @@ protected event TriggerDestroyedEvent( Controller EventInstigator )
{
bFound = true;
KFMI.OnCollectibleFound( self, EventInstigator );
KFPC = KFPlayerController(EventInstigator);
If (KFPC != none)
{
KFPC.AddCollectibleFound(KFMI.CollectiblesToFind);
}
}
// Used on network to tell clients who join late that this collectible is destroyed

View File

@ -30,36 +30,6 @@ static simulated function bool CanDismemberHitZone( name InHitZoneName )
return false;
}
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
{
local class<KFDamageType> ToxicDT;
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
if ( ToxicDT != None )
{
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
}
}
/**
* Allows medic perk to add poison damage
* @return: None if toxic skill is not available
*/
static function class<KFDamageType> GetMedicToxicDmgType( out int out_Damage, optional Controller InstigatedBy )
{
local KFPerk InstigatorPerk;
InstigatorPerk = KFPlayerController(InstigatedBy).GetPerk();
if( InstigatorPerk == none || (!InstigatorPerk.IsToxicDmgActive() && !InstigatorPerk.IsZedativeActive()) )
{
return None;
}
InstigatorPerk.ModifyToxicDmg( out_Damage );
return InstigatorPerk.GetToxicDmgTypeClass();
}
defaultproperties
{
KDamageImpulse=1000

View File

@ -40,18 +40,6 @@ static simulated function bool CanDismemberHitZone( name InHitZoneName )
return false;
}
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
{
local class<KFDamageType> ToxicDT;
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
if ( ToxicDT != None )
{
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
}
}
defaultproperties
{
GoreDamageGroup=DGT_Shotgun

View File

@ -0,0 +1,25 @@
//=============================================================================
// KFDT_Ballistic_HRG_93R
//=============================================================================
// Base pistol damage type
//=============================================================================
// Killing Floor 2
// Copyright (C) 2023 Tripwire Interactive LLC
//=============================================================================
class KFDT_Ballistic_HRG_93R extends KFDT_Ballistic_Handgun
abstract
hidedropdown;
defaultproperties
{
KDamageImpulse=900
KDeathUpKick=-300
KDeathVel=100
KnockdownPower=12
StumblePower=0
GunHitPower=10
WeaponDef=class'KFWeapDef_HRG_93R'
}

View File

@ -89,17 +89,6 @@ static function PlayImpactHitEffects(KFPawn P, vector HitLocation, vector HitDir
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
{
local class<KFDamageType> ToxicDT;
local int ToxicDamageTaken;
ToxicDamageTaken = DamageTaken;
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( ToxicDamageTaken, InstigatedBy );
if ( ToxicDT != None )
{
Victim.ApplyDamageOverTime(ToxicDamageTaken, InstigatedBy, ToxicDT);
}
// potential for two DoTs if DoT_Type is set
if (default.BleedDamageType.default.DoT_Type != DOT_None)
{
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, default.BleedDamageType);

View File

@ -0,0 +1,26 @@
//=============================================================================
// KFDT_Ballistic_MG3
//=============================================================================
// Class Description
//=============================================================================
// Killing Floor 2
// Copyright (C) 2023 Tripwire Interactive LLC
//=============================================================================
class KFDT_Ballistic_MG3 extends KFDT_Ballistic_AssaultRifle
abstract
hidedropdown;
defaultproperties
{
KDamageImpulse=900
KDeathUpKick=-300
KDeathVel=100
StumblePower=10
GunHitPower=50
WeaponDef=class'KFWeapDef_MG3'
//Perk
ModifierPerkList(0)=class'KFPerk_Commando'
}

View File

@ -0,0 +1,26 @@
//=============================================================================
// KFDT_Ballistic_MG3_Alt
//=============================================================================
// Class Description
//=============================================================================
// Killing Floor 2
// Copyright (C) 2023 Tripwire Interactive LLC
//=============================================================================
class KFDT_Ballistic_MG3_Alt extends KFDT_Ballistic_AssaultRifle
abstract
hidedropdown;
defaultproperties
{
KDamageImpulse=900
KDeathUpKick=-300
KDeathVel=100
StumblePower=10
GunHitPower=50
WeaponDef=class'KFWeapDef_MG3'
//Perk
ModifierPerkList(0)=class'KFPerk_Commando'
}

View File

@ -11,18 +11,6 @@ class KFDT_Ballistic_MedicRifleGrenadeLauncher extends KFDT_Ballistic_AssaultRif
abstract
hidedropdown;
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
{
local class<KFDamageType> ToxicDT;
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
if ( ToxicDT != None )
{
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
}
}
defaultproperties
{
KDamageImpulse=900
@ -32,7 +20,6 @@ defaultproperties
StumblePower=10
GunHitPower=45
WeaponDef=class'KFWeapDef_MedicRifleGrenadeLauncher'
//Perk

View File

@ -28,18 +28,6 @@ static simulated function bool CanDismemberHitZone( name InHitZoneName )
return false;
}
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
{
local class<KFDamageType> ToxicDT;
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
if ( ToxicDT != None )
{
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
}
}
defaultproperties
{
KDamageImpulse=2000

Some files were not shown because too many files have changed in this diff Show More