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 //@HSL_END
var databinding bool bNoSeasonalSkins; var databinding bool bNoSeasonalSkins;
var databinding int WeeklySelectorIndex;
/** Represents a player in the game */ /** Represents a player in the game */
struct native PlayerResult struct native PlayerResult
@ -186,4 +187,5 @@ defaultproperties
bServerExiled=false bServerExiled=false
//@SABER_END //@SABER_END
bNoSeasonalSkins=false bNoSeasonalSkins=false
WeeklySelectorIndex=-1
} }

View File

@ -2315,6 +2315,7 @@ static function DumpGameSettings(const OnlineGameSettings GameSettings)
`Log(" bAllowJoinViaPresenceFriendsOnly: "$GameSettings.bAllowJoinViaPresenceFriendsOnly); `Log(" bAllowJoinViaPresenceFriendsOnly: "$GameSettings.bAllowJoinViaPresenceFriendsOnly);
`Log(" GameState: "$GameSettings.GameState); `Log(" GameState: "$GameSettings.GameState);
`Log(" bNoSeasonalSkins: "$GameSettings.bNoSeasonalSkins); `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 ( damagetype == None )
{ {
if ( InstigatedBy == None ) /*if ( InstigatedBy == None )
`warn("No damagetype for damage with no instigator"); `warn("No damagetype for damage with no instigator");
else else
`warn("No damagetype for damage by "$instigatedby.pawn$" with weapon "$InstigatedBy.Pawn.Weapon); `warn("No damagetype for damage by "$instigatedby.pawn$" with weapon "$InstigatedBy.Pawn.Weapon);
*/
//scripttrace(); //scripttrace();
DamageType = class'DamageType'; DamageType = class'DamageType';
} }

View File

@ -38,6 +38,8 @@ var bool bHaveGoal;
/** A randomized distance outside of the target goal to stop at */ /** A randomized distance outside of the target goal to stop at */
var float GoalOffset; var float GoalOffset;
var bool bUseRandomDirection;
/********************************************************************************************* /*********************************************************************************************
* Initialization * Initialization
********************************************************************************************* */ ********************************************************************************************* */
@ -47,7 +49,8 @@ static function bool FleeFrom(
actor inFleeTarget, actor inFleeTarget,
optional float inFleeDuration, optional float inFleeDuration,
optional float inFleeDistance=5000, optional float inFleeDistance=5000,
optional bool bShouldStopAtGoal=false ) optional bool bShouldStopAtGoal=false,
optional bool bHasToUseRandomDirection=false )
{ {
local AICommand_Flee Cmd; local AICommand_Flee Cmd;
@ -60,6 +63,7 @@ static function bool FleeFrom(
Cmd.FleeDistance = inFleeDistance; Cmd.FleeDistance = inFleeDistance;
Cmd.FleeDuration = inFleeDuration; Cmd.FleeDuration = inFleeDuration;
Cmd.bStopAtGoal = bShouldStopAtGoal; Cmd.bStopAtGoal = bShouldStopAtGoal;
Cmd.bUseRandomDirection = bHasToUseRandomDirection;
AI.PushCommand(Cmd); AI.PushCommand(Cmd);
return true; return true;
} }
@ -113,6 +117,84 @@ function Popped()
EnableMeleeRangeEventProbing(); 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 * Hiding state
********************************************************************************************* */ ********************************************************************************************* */
@ -129,6 +211,7 @@ state Fleeing
function bool CheckRetreat() function bool CheckRetreat()
{ {
local EPathSearchType OldSearchType; local EPathSearchType OldSearchType;
local vector RandVector;
if( RouteGoal != none && bHaveGoal ) if( RouteGoal != none && bHaveGoal )
{ {
@ -154,13 +237,27 @@ state Fleeing
AIActionStatus = "Searching for navigable path from ["$FleeTarget$"]"; AIActionStatus = "Searching for navigable path from ["$FleeTarget$"]";
Pawn.PathSearchType = PST_Constraint; 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 ) if( FindPathToward( Pawn ) != None )
{ {
//Pawn.DrawDebugLine( RouteGoal.Location, Pawn.Location, 255, 80, 80, true ); //Pawn.DrawDebugLine( RouteGoal.Location, Pawn.Location, 255, 80, 80, true );
//Pawn.DrawDebugSphere( RouteGoal.Location, 128, 4, 255, 80, 80, true ); //Pawn.DrawDebugSphere( RouteGoal.Location, 128, 4, 255, 80, 80, true );
bHaveGoal = true; bHaveGoal = true;
AIActionStatus = "Attempting to flee from ["$FleeTarget$"] at ["$RouteGoal$"]"; AIActionStatus = "Attempting to flee from ["$FleeTarget$"] at ["$RouteGoal$"]";
Focus = none; Focus = none;
@ -281,4 +378,5 @@ Begin:
DefaultProperties DefaultProperties
{ {
bAllowedToAttack=false 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 != None )
{ {
if (AI.MyKFPawn != none)
{
if (AI.MyKFPawn.bIsBountyHuntObjective)
{
return false;
}
}
Cmd = new(AI) default.class; Cmd = new(AI) default.class;
if( Cmd != None ) if( Cmd != None )
{ {

View File

@ -2800,9 +2800,10 @@ function DoFleeFrom( actor FleeFrom,
optional float FleeDuration, optional float FleeDuration,
optional float FleeDistance, optional float FleeDistance,
optional bool bShouldStopAtGoal=false, 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() function bool AmIAllowedToSuicideWhenStuck()
{ {
if (MyKFPawn.bIsBountyHuntObjective)
{
return false;
}
return true; return true;
} }

View File

@ -1609,11 +1609,12 @@ function DoFleeFrom( actor FleeFrom,
optional float FleeDuration, optional float FleeDuration,
optional float FleeDistance, optional float FleeDistance,
optional bool bShouldStopAtGoal=false, optional bool bShouldStopAtGoal=false,
optional bool bFromFear=false ) optional bool bFromFear=false,
optional bool bUseRandomDirection=false )
{ {
if( !bFromFear || !MyHansPawn.bInHuntAndHealMode ) 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_EMP,
AT_EDAR_Laser, AT_EDAR_Laser,
AT_EDAR_Rocket, AT_EDAR_Rocket,
AT_HansClot
}; };
/** IDs into the BossAIClassList array */ /** IDs into the BossAIClassList array */
@ -234,6 +235,8 @@ static function string ZedTypeToString(EAIType AiTypeToConvert)
return "Husk"; return "Husk";
case AT_BossRandom: case AT_BossRandom:
return "Hans"; return "Hans";
case AT_HansClot:
return "HansClot";
} }
return "CLOT"; return "CLOT";
`endif `endif
@ -479,7 +482,7 @@ function GetSpawnListFromSquad(byte SquadIdx, out array< KFAISpawnSquad > Squads
else else
`endif `endif
//Always have the squad type be a boss if we're spawning one in case of override //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); RandBossIndex = Rand(BossRushEnemies.length);
TempSpawnList.AddItem( default.AIBossClassList[BossRushEnemies[RandBossIndex]]); TempSpawnList.AddItem( default.AIBossClassList[BossRushEnemies[RandBossIndex]]);

View File

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

View File

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

View File

@ -32,7 +32,7 @@ var int DoshBuffer;
var int ArmorMagSize; // Percentage of armor bought individually 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 ) if( Pawn != none && PlayerReplicationInfo != none )
{ {
@ -42,10 +42,11 @@ function Initialize(optional bool bInitOwnedItems = true)
if( MyKFPRI != none && MyKFIM != none ) if( MyKFPRI != none && MyKFIM != none )
{ {
// Grab the weapons in our inventory and add them to a stored array called OwnedItemList // Grab the weapons in our inventory and add them to a stored array called OwnedItemList
if (bInitOwnedItems) if (bInitializeOwned)
{ {
InitializeOwnedItemList(); InitializeOwnedItemList();
} }
TotalBlocks = MyKFIM.CurrentCarryBlocks; TotalBlocks = MyKFIM.CurrentCarryBlocks;
TotalDosh = MyKFPRI.Score; TotalDosh = MyKFPRI.Score;
MaxBlocks = MyKFIM.MaxCarryBlocks; MaxBlocks = MyKFIM.MaxCarryBlocks;
@ -989,17 +990,36 @@ function Int GetAutoFillCost()
@Name - General @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() function InitializeOwnedItemList()
{ {
local Inventory Inv; local Inventory Inv;
local KFWeapon KFW; local KFWeapon KFW;
local KFPawn_Human KFP; local KFPawn_Human KFP;
local bool AllowGrenades;
OwnedItemList.length = 0; OwnedItemList.length = 0;
TraderItems = KFGameReplicationInfo( WorldInfo.GRI ).TraderItems; TraderItems = KFGameReplicationInfo( WorldInfo.GRI ).TraderItems;
AllowGrenades = KFGameReplicationInfo( WorldInfo.GRI ).bAllowGrenadePurchase;
KFP = KFPawn_Human( Pawn ); KFP = KFPawn_Human( Pawn );
if( KFP != none ) if( KFP != none )
@ -1010,14 +1030,7 @@ function InitializeOwnedItemList()
ArmorItem.AmmoPricePerMagazine = TraderItems.ArmorPrice * CurrentPerk.GetArmorDiscountMod(); ArmorItem.AmmoPricePerMagazine = TraderItems.ArmorPrice * CurrentPerk.GetArmorDiscountMod();
ArmorItem.DefaultItem.WeaponDef = TraderItems.ArmorDef; ArmorItem.DefaultItem.WeaponDef = TraderItems.ArmorDef;
// init grenade purchase values InitializeOwnedGrenade();
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;
for ( Inv = MyKFIM.InventoryChain; Inv != none; Inv = Inv.Inventory ) 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 // add a single to owned items when removing a dual
//if( ItemInfo.DefaultItem.SingleClassName != '' ) //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. // 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). // 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')); 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" ) else if( Left(ZedName, 2) ~= "Ha" )
{ {
SpawnClass = class<KFPawn_Monster>(DynamicLoadObject("KFGameContent.KFPawn_ZedHans"$VersusSuffix, class'Class')); 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> ConsolePermissionStrings;
var localized array<string> ModeStrings; var localized array<string> ModeStrings;
var localized array<string> AllowSeasonalSkinsStrings; var localized array<string> AllowSeasonalSkinsStrings;
var localized array<string> WeeklySelectorStrings;
var localized string TeamSwappedString; var localized string TeamSwappedString;
var localized string NoPreferenceString; var localized string NoPreferenceString;
@ -200,11 +201,26 @@ static function string GetAllowSeasonalSkinsString( float Index )
return default.NoPreferenceString; 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() static function array<string> GetAllowSeasonalSkinsStringsArray()
{ {
return default.AllowSeasonalSkinsStrings; return default.AllowSeasonalSkinsStrings;
} }
static function array<string> GetWeeklySelectorStringsArray()
{
return default.WeeklySelectorStrings;
}
static function array<string> GetGameModeStringsArray() static function array<string> GetGameModeStringsArray()
{ {
return default.ModeStrings; return default.ModeStrings;

View File

@ -363,6 +363,11 @@ static function int GetDamageeDialogID()
return INDEX_NONE; 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) */ /** 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 ) static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
{ {

View File

@ -389,6 +389,11 @@ function GiveTo(Pawn P)
local Inventory NewInventory; local Inventory NewInventory;
local KFInventoryManager KFIM; local KFInventoryManager KFIM;
local KFGameReplicationInfo KFGRI; 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); KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
if (KFGRI != none && KFGRI.bIsEndlessPaused) if (KFGRI != none && KFGRI.bIsEndlessPaused)
@ -399,10 +404,33 @@ function GiveTo(Pawn P)
KFIM = KFInventoryManager(P.InvManager); KFIM = KFInventoryManager(P.InvManager);
if (KFIM != None) 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) 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 this isn't a dual-wield class, then we can't carry another
if (KFW.DualClass == none) if (KFW.DualClass == none)
@ -426,7 +454,7 @@ function GiveTo(Pawn P)
return; return;
} }
NewInventory = KFIM.CreateInventory(InventoryClass, true); NewInventory = KFIM.CreateInventory(NewInventoryClass, true);
if (NewInventory != none) if (NewInventory != none)
{ {
// Added extra check in case we want to pick up a non-weapon based pickup // 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() function UpdateZEDCount()
{ {
local int CurrentZEDCount; local int CurrentZEDCount;
local KFPlayerController_WeeklySurvival KFPC_WS;
if( KFGRI == none ) if( KFGRI == none )
{ {
@ -149,6 +150,16 @@ function UpdateZEDCount()
// # of ZEDs left to kill in this wave. // # of ZEDs left to kill in this wave.
CurrentZEDCount = KFGRI.AIRemaining; CurrentZEDCount = KFGRI.AIRemaining;
if (KFGRI.IsBountyHunt())
{
KFPC_WS = KFPlayerController_WeeklySurvival(KFPC);
if (KFPC_WS != none)
{
CurrentZEDCount += KFPC_WS.BountyHuntCurrentExtraZeds;
}
}
if(LastZEDCount != CurrentZEDCount) if(LastZEDCount != CurrentZEDCount)
{ {
SetInt("remainingZEDs" ,CurrentZEDCount); SetInt("remainingZEDs" ,CurrentZEDCount);

View File

@ -23,6 +23,7 @@ var KFPlayerController KFPC;
var const string LockIconPath; var const string LockIconPath;
var byte LastPerkIndex; var byte LastPerkIndex;
var byte PreviewPerkIndex;
VAR byte LastPerkLevel; VAR byte LastPerkLevel;
var class<KFPerk> PreviousPerk; var class<KFPerk> PreviousPerk;
var localized string TierUnlockedText; 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 = KFGFxPerksContainer_Details(Widget);//some reason this is coming out to none!
DetailsContainer.Initialize( self ); DetailsContainer.Initialize( self );
DetailsContainer.UpdateDetails(PerkClass, SelectedSkillsHolder, false, false); DetailsContainer.UpdateDetails(PerkClass, SelectedSkillsHolder, false, false, true);
DetailsContainer.UpdatePassives(PerkClass); DetailsContainer.UpdatePassives(PerkClass);
} }
break; break;
@ -228,6 +229,7 @@ event OnClose()
if (bModifiedWeaponIndexes) if (bModifiedWeaponIndexes)
{ {
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingWeapIdx, KFPC.SurvivalPerkWeapIndex ); Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingWeapIdx, KFPC.SurvivalPerkWeapIndex );
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingSecondaryWeapIdx, KFPC.SurvivalPerkSecondaryWeapIndex );
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingGrenIdx, KFPC.SurvivalPerkGrenIndex ); 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 ); UpdateContainers( KFPC.PerkList[NewPerkIndex].PerkClass, bClickedIndex );
} }
} }
@ -340,7 +344,7 @@ function UpdateContainers( class<KFPerk> PerkClass, optional bool bClickedIndex=
if( DetailsContainer != none ) if( DetailsContainer != none )
{ {
DetailsContainer.UpdateDetails( PerkClass, SelectedSkillsHolder, false, false ); DetailsContainer.UpdateDetails( PerkClass, SelectedSkillsHolder, false, false, true );
DetailsContainer.UpdatePassives( PerkClass ); DetailsContainer.UpdatePassives( PerkClass );
} }
@ -480,10 +484,7 @@ function Callback_SkillSelected( byte TierIndex, byte SkillIndex )
UpdateSkillsUI(KFPC.PerkList[LastPerkIndex].PerkClass); UpdateSkillsUI(KFPC.PerkList[LastPerkIndex].PerkClass);
SavePerkData(); SavePerkData();
if ( KFPC.PerkList[LastPerkIndex].PerkClass.Name == 'KFPerk_Survivalist' ) DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, false, true );
{
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, false );
}
} }
} }
@ -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() function OnPrevWeaponPressed()
{ {
local byte NewIndex; 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(); NewIndex = KFPC.CurrentPerk.OnPrevWeaponSelected();
KFPC.SurvivalPerkWeapIndex = NewIndex; KFPC.SurvivalPerkWeapIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false ); DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, true, false, bUpdateUI );
bModifiedWeaponIndexes=true; bModifiedWeaponIndexes=true;
} }
function OnNextWeaponPressed() function OnNextWeaponPressed()
{ {
local byte NewIndex; 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(); NewIndex = KFPC.CurrentPerk.OnNextWeaponSelected();
KFPC.SurvivalPerkWeapIndex = NewIndex; 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; bModifiedWeaponIndexes=true;
} }
function OnPrevGrenadePressed() function OnPrevGrenadePressed()
{ {
local byte NewIndex; local byte NewIndex;
local bool bUpdateUI;
bUpdateUI = true;
if (GetPC().PlayerInput.bUsingGamepad)
{
if (PreviewPerkIndex != LastPerkIndex)
{
bUpdateUI = false;
}
}
NewIndex = KFPC.CurrentPerk.OnPrevGrenadeSelected(); NewIndex = KFPC.CurrentPerk.OnPrevGrenadeSelected();
KFPC.SurvivalPerkGrenIndex = NewIndex; KFPC.SurvivalPerkGrenIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false ); DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, true, false, bUpdateUI );
bModifiedWeaponIndexes=true; bModifiedWeaponIndexes=true;
} }
function OnNextGrenadePressed() function OnNextGrenadePressed()
{ {
local byte NewIndex; local byte NewIndex;
local bool bUpdateUI;
bUpdateUI = true;
if (GetPC().PlayerInput.bUsingGamepad)
{
if (PreviewPerkIndex != LastPerkIndex)
{
bUpdateUI = false;
}
}
NewIndex = KFPC.CurrentPerk.OnNextGrenadeSelected(); NewIndex = KFPC.CurrentPerk.OnNextGrenadeSelected();
KFPC.SurvivalPerkGrenIndex = NewIndex; KFPC.SurvivalPerkGrenIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, true ); DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, false, true, bUpdateUI );
bModifiedWeaponIndexes=true; 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 ) event bool OnAxisModified( int ControllerId, name Key, float Delta, float DeltaTime, bool bGamepad )
{ {
if (GetPC().PlayerInput.bUsingGamepad ) if (GetPC().PlayerInput.bUsingGamepad )
@ -611,6 +769,7 @@ defaultproperties
SubWidgetBindings.Add((WidgetName="DetailsContainer",WidgetClass= class'KFGFxPerksContainer_Details')) SubWidgetBindings.Add((WidgetName="DetailsContainer",WidgetClass= class'KFGFxPerksContainer_Details'))
SubWidgetBindings.Add((WidgetName="SelectedPerkSummaryContainer",WidgetClass=class'KFGFxPerksContainer_SkillsSummary')) SubWidgetBindings.Add((WidgetName="SelectedPerkSummaryContainer",WidgetClass=class'KFGFxPerksContainer_SkillsSummary'))
LastPerkIndex=255 LastPerkIndex=255
PreviewPerkIndex=255
LastPerkLevel=255 LastPerkLevel=255
bAxisResetLeft=true bAxisResetLeft=true

View File

@ -79,6 +79,11 @@ function LocalizeText()
{ {
local GFxObject TextObject; local GFxObject TextObject;
local WorldInfo WI; local WorldInfo WI;
local bool bIsCustomWeekly;
local int IntendedWeeklyIndex, WeeklyIndex;
local KFPlayerController KFPC;
KFPC = KFPlayerController(GetPC());
WI = class'WorldInfo'.static.GetWorldInfo(); WI = class'WorldInfo'.static.GetWorldInfo();
@ -90,7 +95,34 @@ function LocalizeText()
TextObject.SetString("xp", XPString); TextObject.SetString("xp", XPString);
TextObject.SetString("teamAwards", TeamAwardsString); 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 ) if(WI != none && WI.NetMode != NM_Standalone )
{ {

View File

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

View File

@ -74,6 +74,8 @@ var KFGFxWidget_MapCounterText MapCounterTextWidget;
var KFGFxWidget_GunGame GunGameWidget; var KFGFxWidget_GunGame GunGameWidget;
// Widget that displays vip mode texts // Widget that displays vip mode texts
var KFGFxWidget_VIP VIPWidget; var KFGFxWidget_VIP VIPWidget;
// Widget that displays bounty hunt mode texts
var KFGFxWidget_BountyHunt BountyHuntWidget;
var KFPlayerController KFPC; var KFPlayerController KFPC;
@ -112,6 +114,9 @@ var transient bool bLastGunGameVisibility;
// VIP variables // VIP variables
var transient bool bLastVIPVisibility; var transient bool bLastVIPVisibility;
// Bounty Hunt variables
var transient bool bLastBountyHuntVisibility;
/** On creation of the HUD */ /** On creation of the HUD */
function Init(optional LocalPlayer LocPlay) function Init(optional LocalPlayer LocPlay)
{ {
@ -372,6 +377,13 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
SetWidgetPathBinding( Widget, WidgetPath ); SetWidgetPathBinding( Widget, WidgetPath );
} }
break; break;
case 'BountyHuntContainer':
if (BountyHuntWidget == none)
{
BountyHuntWidget = KFGFxWidget_BountyHunt(Widget);
SetWidgetPathBinding( Widget, WidgetPath );
}
break;
} }
return true; return true;
@ -400,13 +412,16 @@ function UpdateWeaponSelect()
/** Update all the unique HUD pieces */ /** Update all the unique HUD pieces */
function TickHud(float DeltaTime) function TickHud(float DeltaTime)
{ {
local bool bGunGameVisibility, bVIPModeVisibility; local KFGameReplicationInfo KFGRI;
local bool bGunGameVisibility, bVIPModeVisibility, bBountyHuntVisibility;
if(KFPC == none || KFPC.WorldInfo.TimeSeconds - LastUpdateTime < UpdateInterval ) if(KFPC == none || KFPC.WorldInfo.TimeSeconds - LastUpdateTime < UpdateInterval )
{ {
return; return;
} }
KFGRI=KFGameReplicationInfo(KFPC.WorldInfo.GRI);
if (WaveInfoWidget != none) if (WaveInfoWidget != none)
{ {
WaveInfoWidget.TickHUD(DeltaTime); WaveInfoWidget.TickHUD(DeltaTime);
@ -498,6 +513,26 @@ function TickHud(float DeltaTime)
bLastVIPVisibility = bVIPModeVisibility; 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() 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() simulated function DisplayNewObjective()
{ {
local KFGameReplicationInfo KFGRI; local KFGameReplicationInfo KFGRI;
@ -1022,7 +1087,6 @@ simulated function DisplayNewObjective()
ObjectiveObject.SetString("nameString", Localize("Objectives", "ContaminationModeObjective", "KFGame")); ObjectiveObject.SetString("nameString", Localize("Objectives", "ContaminationModeObjective", "KFGame"));
ObjectiveObject.SetString("descString", Localize("Objectives", "ContaminationModeDescription", "KFGame")); ObjectiveObject.SetString("descString", Localize("Objectives", "ContaminationModeDescription", "KFGame"));
// TODO :: CHANGE ICON
ObjectiveObject.SetString("iconPath", "img://"$PathName(ObjectiveInterface.GetIcon())); ObjectiveObject.SetString("iconPath", "img://"$PathName(ObjectiveInterface.GetIcon()));
} }
else 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) function ResetSyringe(float Ammo, float MaxAmmo)
{ {
if (PlayerStatusContainer != none) if (PlayerStatusContainer != none)
@ -1613,6 +1685,7 @@ DefaultProperties
bLastGunGameVisibility=true bLastGunGameVisibility=true
bLastVIPVisibility=true bLastVIPVisibility=true
bLastBountyHuntVisibility=true
WidgetBindings.Add((WidgetName="ObjectiveContainer",WidgetClass=class'KFGFxHUD_ObjectiveConatiner')) WidgetBindings.Add((WidgetName="ObjectiveContainer",WidgetClass=class'KFGFxHUD_ObjectiveConatiner'))
WidgetBindings.Add((WidgetName="SpectatorInfoWidget",WidgetClass=class'KFGFxHUD_SpectatorInfo')) WidgetBindings.Add((WidgetName="SpectatorInfoWidget",WidgetClass=class'KFGFxHUD_SpectatorInfo'))
@ -1640,6 +1713,7 @@ DefaultProperties
WidgetBindings.Add((WidgetName="counterMapTextWidget", WidgetClass=class'KFGFxWidget_MapCounterText')) WidgetBindings.Add((WidgetName="counterMapTextWidget", WidgetClass=class'KFGFxWidget_MapCounterText'))
WidgetBindings.ADD((WidgetName="GunGameContainer", WidgetClass=class'KFGFxWidget_GunGame')); WidgetBindings.ADD((WidgetName="GunGameContainer", WidgetClass=class'KFGFxWidget_GunGame'));
WidgetBindings.ADD((WidgetName="VIPContainer", WidgetClass=class'KFGFxWidget_VIP')); 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_Clot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Cyst"
SpecialWaveIconPath(AT_SlasherClot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Slasher" 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_Bloat)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Bloat"
SpecialWaveIconPath(AT_Siren)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Siren" SpecialWaveIconPath(AT_Siren)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Siren"
SpecialWaveIconPath(AT_Husk)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Husk" 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_SlasherClot)="KFPawn_ZedClot_Slasher"
SpecialWaveLocKey(AT_Clot)="KFPawn_ZedClot_Cyst" SpecialWaveLocKey(AT_Clot)="KFPawn_ZedClot_Cyst"
@ -1665,5 +1740,6 @@ DefaultProperties
SpecialWaveLocKey(AT_GoreFast)="KFPawn_ZedGorefast" SpecialWaveLocKey(AT_GoreFast)="KFPawn_ZedGorefast"
SpecialWaveLocKey(AT_Bloat)="KFPawn_ZedBloat" SpecialWaveLocKey(AT_Bloat)="KFPawn_ZedBloat"
SpecialWaveLocKey(AT_FleshPound)="KFPawn_ZedFleshpound" SpecialWaveLocKey(AT_FleshPound)="KFPawn_ZedFleshpound"
SpecialWaveLocKey(AT_HansClot)="KFPawn_ZedClot_Cyst"
} }

View File

@ -25,12 +25,47 @@ function LocalizeContainer()
GetObject("basicLoadoutTextField").SetString("text", BasicLoadoutString); 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 GFxObject DetailsProvider;
local array<string> WeaponNames; local array<string> WeaponNames;
local array<string> WeaponSources; local array<string> WeaponSources;
local int i; local int i;
local bool CanIChooseWeapons;
DetailsProvider = CreateObject( "Object" ); 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)); 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) if(PerkClass.default.KnifeWeaponDef != none)
{ {
@ -63,16 +98,20 @@ function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC,
DetailsProvider.SetString( "EXPAction1", PerkClass.default.EXPAction1 ); DetailsProvider.SetString( "EXPAction1", PerkClass.default.EXPAction1 );
DetailsProvider.SetString( "EXPAction2", PerkClass.default.EXPAction2 ); DetailsProvider.SetString( "EXPAction2", PerkClass.default.EXPAction2 );
DetailsProvider.SetBool("ShowPrimaryWeaponSelectors", PerkClass.static.CanChoosePrimaryWeapon()); CanIChooseWeapons = CanChooseWeapons(KFPC);
DetailsProvider.SetBool("ShowPrimaryWeaponSelectors", CanIChooseWeapons && PerkClass.static.CanChoosePrimaryWeapon());
DetailsProvider.SetBool("ShowSecondaryWeaponSelectors", CanIChooseWeapons && PerkClass.static.CanChooseSecondaryWeapon());
DetailsProvider.SetBool("ShowGrenadeSelectors", PerkClass.static.CanChooseGrenade()); DetailsProvider.SetBool("ShowGrenadeSelectors", PerkClass.static.CanChooseGrenade());
SetObject( "detailsData", DetailsProvider ); 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 KFPlayerController KFPC;
local byte WeaponIdx, GrenadeIdx; local byte WeaponIdx, SecondaryWeaponIdx, GrenadeIdx;
KFPC = KFPlayerController( GetPC() ); KFPC = KFPlayerController( GetPC() );
@ -82,11 +121,15 @@ function UpdateDetails(class<KFPerk> PerkClass, byte SelectedSkills[`MAX_PERK_SK
} }
WeaponIdx = 0; WeaponIdx = 0;
SecondaryWeaponIdx = 0;
GrenadeIdx = 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) 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 ); 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) , 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') if (PerkClass.Name == 'KFPerk_Survivalist')
{ {
WeaponIdx = KFPC.CurrentPerk.SetWeaponSelectedIndex(KFPC.SurvivalPerkWeapIndex); WeaponIdx = PerkClass.static.GetWeaponSelectedIndex(KFPC.SurvivalPerkWeapIndex);
GrenadeIdx = KFPC.CurrentPerk.SetGrenadeSelectedIndexUsingSkills(KFPC.SurvivalPerkGrenIndex, SelectedSkills, IsChoosingPrev, IsChoosingNext); 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 array<string> ServerMapList;
local KFGameReplicationInfo KFGRI; local KFGameReplicationInfo KFGRI;
local bool IsWeeklyMode; local bool IsWeeklyMode;
local bool IsBrokenTrader;
local bool IsBossRush;
local bool IsGunGame;
local bool IsContaminationMode;
local bool bShouldSkipMaps; 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; local name MapName;
KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI); KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI);
@ -70,13 +72,62 @@ function SetMapOptions()
if(KFGRI != none && KFGRI.VoteCollector != none) if(KFGRI != none && KFGRI.VoteCollector != none)
{ {
ServerMapList = KFGRI.VoteCollector.MapList; 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 //gfx
MapList = CreateArray(); MapList = CreateArray();
@ -85,6 +136,11 @@ function SetMapOptions()
{ {
MapName = name(ServerMapList[i]); MapName = name(ServerMapList[i]);
if (bWeeklyNoSanta && MapName == MapSantas)
{
continue;
}
if ( bShouldSkipMaps && ( MapName == MapBiolapse || if ( bShouldSkipMaps && ( MapName == MapBiolapse ||
MapName == MapNightmare || MapName == MapNightmare ||
MapName == MapPowerCore || 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) if (IsWeeklyMode && IsBossRush && MapName == MapSteam)
{ {
continue; continue;
} }
/* */
MapObject = CreateObject("Object"); MapObject = CreateObject("Object");
MapObject.SetString("label", class'KFCommon_LocalizedStrings'.static.GetFriendlyMapName(ServerMapList[i]) ); 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 array<string> FilterStrings;
var config Bool bNoPassword, bNoMutators, bNotFull, bNotEmpty, bUsesStats, bCustom, bDedicated, bVAC_Secure, bInLobby, bInProgress, bOnlyStockMaps, bOnlyCustomMaps, bLimitServerResults, bNoLocalAdmin, bNoSeasonalSkins; 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 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 string CachedMapName, CachedModeName;
var transient int CachedDifficulty, CachedLength; var transient int CachedDifficulty, CachedLength;
@ -93,6 +93,12 @@ function AdjustSavedFiltersToMode()
SavedLengthIndex = 255; SavedLengthIndex = 255;
} }
SavedLengthIndexPending = SavedLengthIndex; SavedLengthIndexPending = SavedLengthIndex;
if (SavedGameModeIndex != 1)
{
SavedWeeklySelectorIndex = 0;
}
SavedWeeklySelectorIndexPending = SavedWeeklySelectorIndex;
} }
exec native function string GetSelectedMap() const; exec native function string GetSelectedMap() const;
@ -105,6 +111,8 @@ exec native function int GetSelectedGameLength() const;
native function int GetMaxPing() const; native function int GetMaxPing() const;
//@SABER_END //@SABER_END
exec native function int GetWeeklySelectorIndex() const;
function InitFiltersArray() function InitFiltersArray()
{ {
FilterStrings[NO_PASSWORD] = NoPasswordString; FilterStrings[NO_PASSWORD] = NoPasswordString;
@ -141,6 +149,7 @@ function LocalizeText()
LocalizedObject.SetString("difficulty", ServerMenu.DifficultyString); LocalizedObject.SetString("difficulty", ServerMenu.DifficultyString);
LocalizedObject.SetString("length", ServerMenu.LengthString); LocalizedObject.SetString("length", ServerMenu.LengthString);
LocalizedObject.SetString("ping", ServerMenu.PingString); LocalizedObject.SetString("ping", ServerMenu.PingString);
LocalizedObject.SetString("weeklyIndex", ServerMenu.WeeklyIndexString);
SetObject("localizedText", LocalizedObject); SetObject("localizedText", LocalizedObject);
@ -150,6 +159,7 @@ function LocalizeText()
CreateList("difficultyScrollingList", class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), SavedDifficultyIndex); CreateList("difficultyScrollingList", class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), SavedDifficultyIndex);
CreateList("lengthScrollingList", class'KFCommon_LocalizedStrings'.static.GetLengthStringsArray(), SavedLengthIndex); CreateList("lengthScrollingList", class'KFCommon_LocalizedStrings'.static.GetLengthStringsArray(), SavedLengthIndex);
CreateList("pingScrollingList", ServerMenu.PingOptionStrings, SavedPingIndex); CreateList("pingScrollingList", ServerMenu.PingOptionStrings, SavedPingIndex);
CreateList("weeklyIndexScrollingList", class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorStringsArray(), SavedWeeklySelectorIndex, -1, true, SavedGameModeIndexPending == 1);
LocalizeCheckBoxes(); 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); 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 int i;
local GFxObject OptionList; local GFxObject OptionList;
@ -252,33 +265,73 @@ function CreateList( string ListString, array<string> TextArray, int SelectedInd
{ {
SelectedIndex = 255; 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++ ) for ( i = 0; i < ListLength; i++ )
{ {
ItemSlot = CreateObject( "Object" ); ItemSlot = CreateObject( "Object" );
TempString = TextArray[i]; TempString = TextArray[i];
ItemSlot.SetString("label", TempString ); 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) if(SelectedIndex != 255)
{ {
OptionList.SetInt("selectedIndex", SelectedIndex); OptionList.SetInt("selectedIndex", SelectedIndex);
} }
OptionList.SetObject("dataProvider", DataProvider); 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 else
{ {
ButtonLabel = "-"; ButtonLabel = "-";
} }
OptionList.GetObject("associatedButton").SetString("label", ButtonLabel); OptionList.GetObject("associatedButton").SetString("label", ButtonLabel);
OptionList.ActionScriptVoid("invalidateData"); OptionList.ActionScriptVoid("invalidateData");
if (bEnabled )
{
OptionList.GetObject("associatedButton").SetBool("enabled", true);
}
else
{
OptionList.GetObject("associatedButton").SetBool("enabled", false);
}
} }
function ModeChanged(int index) function ModeChanged(int index)
@ -321,6 +374,11 @@ function PingChanged(int index)
SavedPingIndexPending = index; SavedPingIndexPending = index;
} }
function WeeklySelectorChanged(int index)
{
SavedWeeklySelectorIndexPending = index;
}
function ApplyFilters() function ApplyFilters()
{ {
bNoPassword = bNoPasswordPending; bNoPassword = bNoPasswordPending;
@ -344,7 +402,10 @@ function ApplyFilters()
SavedDifficultyIndex = SavedDifficultyIndexPending; SavedDifficultyIndex = SavedDifficultyIndexPending;
SavedLengthIndex = SavedLengthIndexPending; SavedLengthIndex = SavedLengthIndexPending;
SavedPingIndex = SavedPingIndexPending; SavedPingIndex = SavedPingIndexPending;
//`log("ApplyFilters:"@bCustom); SavedWeeklySelectorIndex = SavedWeeklySelectorIndexPending;
//`Log("ApplyFilters");
SaveConfig(); SaveConfig();
} }
@ -370,7 +431,9 @@ function ClearPendingValues()
SavedDifficultyIndexPending = SavedDifficultyIndex; SavedDifficultyIndexPending = SavedDifficultyIndex;
SavedLengthIndexPending = SavedLengthIndex; SavedLengthIndexPending = SavedLengthIndex;
SavedPingIndexPending = SavedPingIndex; SavedPingIndexPending = SavedPingIndex;
//`log("ClearPendingValues:"@bCustom); SavedWeeklySelectorIndexPending = SavedWeeklySelectorIndex;
//`Log("ClearPendingValues");
} }
function ResetFilters() function ResetFilters()
@ -396,6 +459,7 @@ function ResetFilters()
SavedDifficultyIndex = 255; SavedDifficultyIndex = 255;
SavedLengthIndex = 255; SavedLengthIndex = 255;
SavedPingIndex = 255; SavedPingIndex = 255;
SavedWeeklySelectorIndex = 0;
//`log("ResetFilters:"@bCustom); //`log("ResetFilters:"@bCustom);
ClearPendingValues(); ClearPendingValues();

View File

@ -66,6 +66,7 @@ function SetDetails(KFOnlineGameSettings ServerResult)
local int Ping, PlayerCount; local int Ping, PlayerCount;
local KFOnlineGameSettings TempOnlingGamesSettings; local KFOnlineGameSettings TempOnlingGamesSettings;
local bool bShowSeasonalSkins; local bool bShowSeasonalSkins;
local KFWeeklyOutbreakInformation WeeklyInfo;
if(ServerResult != none) if(ServerResult != none)
{ {
@ -103,6 +104,22 @@ function SetDetails(KFOnlineGameSettings ServerResult)
TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) ); TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) );
TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlingGamesSettings.difficulty)); TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlingGamesSettings.difficulty));
TempObj.SetString("mode", class'KFCommon_LocalizedStrings'.static.GetGameModeString(TempOnlingGamesSettings.Mode) ); 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("map", TempOnlingGamesSettings.MapName);
TempObj.SetString("mapImagePath", GetMapSource(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 GametagSearch;
local string MapName; local string MapName;
local int Mode, Difficulty, Length; local int Mode, Difficulty, Length, WeeklySelectorIndex;
local bool DisableSeasonalSkins; local bool DisableSeasonalSkins;
Search.ClearServerFilters(); Search.ClearServerFilters();
@ -345,6 +345,13 @@ function BuildServerFilters(KFGFxServerBrowser_Filters Filters, OnlineGameSearch
Search.TestAddBoolGametagFilter(GametagSearch, Filters.bCustom, 'bCustom', 0); 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) if (Len(GametagSearch) > 0)
{ {
@ -832,7 +839,7 @@ function string BuildJoinURL()
function string BuildJoinFiltersRequestURL() function string BuildJoinFiltersRequestURL()
{ {
local string FiltersURL; local string FiltersURL;
local int GameDifficulty; local int GameDifficulty, WeeklySelectorIndex, IntendedWeeklyIndex;
GameDifficulty = ServerMenu.FiltersContainer.GetSelectedDifficulty(); GameDifficulty = ServerMenu.FiltersContainer.GetSelectedDifficulty();
@ -851,10 +858,32 @@ function string BuildJoinFiltersRequestURL()
FiltersURL $= "?GameLength="$ServerMenu.FiltersContainer.SavedLengthIndex; 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; return FiltersURL;
} }
function OnRefreshServerDetails() function OnRefreshServerDetails()
{ {
local KFOnlineGameSearch GameSearch; local KFOnlineGameSearch GameSearch;
@ -934,6 +963,7 @@ function UpdateListDataProvider()
local KFOnlineGameSearch LatestGameSearch; local KFOnlineGameSearch LatestGameSearch;
local int Ping, PlayerCount; local int Ping, PlayerCount;
local KFOnlineGameSettings TempOnlineGamesSettings; local KFOnlineGameSettings TempOnlineGamesSettings;
local KFWeeklyOutbreakInformation WeeklyInfo;
LatestGameSearch = KFOnlineGameSearch(SearchDataStore.GetActiveGameSearch()); LatestGameSearch = KFOnlineGameSearch(SearchDataStore.GetActiveGameSearch());
@ -989,7 +1019,23 @@ function UpdateListDataProvider()
TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) ); TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) );
TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlineGamesSettings.difficulty)); 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.SetString("map", TempOnlineGamesSettings.MapName);
TempObj.SetBool("locked", TempOnlineGamesSettings.bRequiresPassword); TempObj.SetBool("locked", TempOnlineGamesSettings.bRequiresPassword);
TempObj.SetBool("serverExiled", TempOnlineGamesSettings.bServerExiled); TempObj.SetBool("serverExiled", TempOnlineGamesSettings.bServerExiled);
@ -1013,6 +1059,11 @@ function UpdateListDataProvider()
} }
} }
function bool IsWeeklyModeIndex(int ModeIndex)
{
return ModeIndex == 1;
}
function bool IsEndlessModeIndex(int ModeIndex) function bool IsEndlessModeIndex(int ModeIndex)
{ {
return ModeIndex == 3; 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 KFGFxMenu_StartGame StartMenu;
var byte LastDifficultyIndex, LastLengthIndex, LastPrivacyIndex, LastAllowSeasonalSkinsIndex; var byte LastDifficultyIndex, LastLengthIndex, LastPrivacyIndex, LastAllowSeasonalSkinsIndex, LastWeeklySelectorIndex;
var localized string OverviewString; var localized string OverviewString;
var localized string ChangeString; var localized string ChangeString;
@ -125,6 +125,15 @@ function LocalizeContainer()
LocalizedObject.SetObject("allowSeasonalSkinsOptions", DataProvider); 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() ) if( !class'WorldInfo'.static.IsMenuLevel() )
{ {
LocalizedObject.SetString("authorName", AuthorString$GetPC().WorldInfo.Author); LocalizedObject.SetString("authorName", AuthorString$GetPC().WorldInfo.Author);
@ -350,12 +359,17 @@ function UpdateAllowSeasonalSkins(string AllowSeasonalStrings)
SetString("allowSeasonalSkinsText", AllowSeasonalStrings); SetString("allowSeasonalSkinsText", AllowSeasonalStrings);
} }
function UpdateWeeklySelector(string WeeklySelectorStrings)
{
SetString("weeklySelectorText", WeeklySelectorStrings);
}
function UpdateOverviewInGame() function UpdateOverviewInGame()
{ {
local KFGameReplicationInfo KFGRI; local KFGameReplicationInfo KFGRI;
local string GameDifficultyString; local string GameDifficultyString;
local Float CurrentGameDifficulty; local Float CurrentGameDifficulty;
local int CurrentLengthIndex, CurrentPrivacyIndex, CurrentAllowSeasonalSkinsIndex; local int CurrentLengthIndex, CurrentPrivacyIndex, CurrentAllowSeasonalSkinsIndex, CurrentWeeklySelectorIndex;
local bool bCustomDifficulty; local bool bCustomDifficulty;
local bool bCustomLength; local bool bCustomLength;
@ -427,6 +441,13 @@ function UpdateOverviewInGame()
UpdateAllowSeasonalSkins( class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsString(CurrentAllowSeasonalSkinsIndex) ); UpdateAllowSeasonalSkins( class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsString(CurrentAllowSeasonalSkinsIndex) );
LastAllowSeasonalSkinsIndex = 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 LastLengthIndex=255
LastDifficultyIndex=255 LastDifficultyIndex=255
LastAllowSeasonalSkinsIndex=255 LastAllowSeasonalSkinsIndex=255
LastWeeklySelectorIndex=255
ObjectiveClassName=KFGameInfo_Objective ObjectiveClassName=KFGameInfo_Objective
} }

View File

@ -182,7 +182,7 @@ function FillWhatsNew()
local SWhatsNew item; local SWhatsNew item;
WhatsNewItems.Remove(0, WhatsNewItems.Length); WhatsNewItems.Remove(0, WhatsNewItems.Length);
// Latest Update // 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); WhatsNewItems.AddItem(item);
// Featured Ultimate Edition // 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/"); 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"); 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); WhatsNewItems.AddItem(item);
// Featured Weapon // 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); WhatsNewItems.AddItem(item);
// Featured Outfit Bundle // 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); WhatsNewItems.AddItem(item);
// Featured Time Limited 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); WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle // 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); WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle // 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); WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle // Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_JaegerMKIV_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9645"); item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_ChameleonMKIV_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9716");
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");
WhatsNewItems.AddItem(item); WhatsNewItems.AddItem(item);
// Misc Community Links // Misc Community Links
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityHub", "Jaegorhorn", "https://steamcommunity.com/app/232090"); 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 MapButton;
var GFxObject RegionButton; var GFxObject RegionButton;
var GFxObject AllowSeasonalSkinsButton; var GFxObject AllowSeasonalSkinsButton;
var GFxObject WeeklySelectorButton;
//============================================================== //==============================================================
// Initialization // Initialization
@ -96,25 +97,40 @@ function GetButtons()
MapButton = GetObject("mapButton"); MapButton = GetObject("mapButton");
RegionButton = GetObject("regionButton"); RegionButton = GetObject("regionButton");
AllowSeasonalSkinsButton = GetObject("allowSeasonalSkinsButton"); AllowSeasonalSkinsButton = GetObject("allowSeasonalSkinsButton");
WeeklySelectorButton = GetObject("weeklySelectorButton");
} }
function UpdateButtonsEnabled() function UpdateButtonsEnabled()
{ {
local int AdjustedGameModeIndex; local int AdjustedGameModeIndex;
local bool ModeIsWeekly;
if (bIsSoloGame) if (bIsSoloGame)
{ {
AdjustedGameModeIndex = ParentMenu.Manager.GetModeIndex(false); AdjustedGameModeIndex = ParentMenu.Manager.GetModeIndex(false);
ModeIsWeekly = AdjustedGameModeIndex == EGameMode_Weekly;
LengthButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[AdjustedGameModeIndex].Lengths > 0); LengthButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[AdjustedGameModeIndex].Lengths > 0);
DifficultyButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[AdjustedGameModeIndex].DifficultyLevels > 0); DifficultyButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[AdjustedGameModeIndex].DifficultyLevels > 0);
} }
else else
{ {
ModeIsWeekly = ParentMenu.Manager.GetModeIndex() == EGameMode_Weekly;
LengthButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[ParentMenu.Manager.GetModeIndex()].Lengths > 0); LengthButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[ParentMenu.Manager.GetModeIndex()].Lengths > 0);
DifficultyButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[ParentMenu.Manager.GetModeIndex()].DifficultyLevels > 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) function SetHelpText(string TextValue)
@ -131,6 +147,7 @@ function SetModeMenus(GFxObject TextObject, int ModeIndex, int LengthIndex)
Lengths = class'KFGameInfo'.default.GameModes[ModeIndex].Lengths; Lengths = class'KFGameInfo'.default.GameModes[ModeIndex].Lengths;
NewDifficultyIndex = Clamp(NewDifficultyIndex, 0, DifficultyLevels); NewDifficultyIndex = Clamp(NewDifficultyIndex, 0, DifficultyLevels);
NewLengthIndex = Clamp(NewLengthIndex, 0, Lengths); NewLengthIndex = Clamp(NewLengthIndex, 0, Lengths);
TextObject.SetObject("difficultyList", CreateList(class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), GetDifficultyIndex(), false, false, byte(DifficultyLevels))); 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))); TextObject.SetObject("lengthList", CreateList(class'KFCommon_LocalizedStrings'.static.GetLengthStringsArray(), LengthIndex, bShowLengthNoPref, false, byte(Lengths)));
} }
@ -255,6 +272,7 @@ function InitializeGameOptions()
} }
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. // 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 // Also don't include the "ANY" option on Console since PlayGo doesn't support searching multiple game types. HSL_BB
@ -265,6 +283,7 @@ function InitializeGameOptions()
TextObject.SetObject("difficultyList", CreateList(class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), GetDifficultyIndex(), false)); 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("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()) if (class'WorldInfo'.static.IsConsoleBuild())
{ {
@ -287,38 +306,123 @@ function FilterWeeklyMaps(out array<string> List)
return; return;
} }
`Log("OPTIONS: Skipping Maps");
// Scavenger index = 11
// BossRush index = 14
// GunGame index = 16
WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod(); WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod();
if (WeeklyIndex == 11 || WeeklyIndex == 14 || WeeklyIndex == 16)
{
`Log("OPTIONS: Inside, removing maps");
List.RemoveItem("KF-Biolapse"); if (ParentMenu.Manager.GetWeeklySelectorIndex() != 0)
List.RemoveItem("KF-Nightmare"); {
List.RemoveItem("KF-PowerCore_Holdout"); WeeklyIndex = ParentMenu.Manager.GetWeeklySelectorIndex() - 1;
List.RemoveItem("KF-TheDescent");
List.RemoveItem("KF-KrampusLair");
} }
if (WeeklyIndex == 19) switch (WeeklyIndex)
{ {
List.RemoveItem("KF-Biolapse"); case 0: // Boom
List.RemoveItem("KF-Nightmare"); List.RemoveItem("KF-SantasWorkshop");
List.RemoveItem("KF-PowerCore_Holdout"); break;
List.RemoveItem("KF-TheDescent");
List.RemoveItem("KF-KrampusLair");
List.RemoveItem("KF-SantasWorkshop");
List.RemoveItem("KF-Elysium");
}
/* Temporary removal of SteamFrotress for BossRush */ case 1: // Cranium Cracker
if (WeeklyIndex == 14) List.RemoveItem("KF-SantasWorkshop");
{ break;
List.RemoveItem("KF-SteamFortress");
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;
} }
} }
@ -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) function SetRegionIndex(int InRegionIndex, optional bool bSetText)
{ {
local array<String> PlayfabRegionList; local array<String> PlayfabRegionList;
@ -623,6 +743,11 @@ function int GetAllowSeasonalSkinsIndex()
return GetCachedProfile().GetProfileInt(KFID_SavedAllowSeasonalSkinsIndex); return GetCachedProfile().GetProfileInt(KFID_SavedAllowSeasonalSkinsIndex);
} }
function int GetWeeklySelectorIndex()
{
return GetCachedProfile().GetProfileInt(KFID_SavedWeeklySelectorIndex);
}
function string GetMapName() function string GetMapName()
{ {
local string SavedMapString; local string SavedMapString;

View File

@ -447,21 +447,19 @@ DefaultProperties
XboxFilterExceptions[0]="Wasteland Bundle" // Wasteland Outfit Bundle XboxFilterExceptions[0]="Wasteland Bundle" // Wasteland Outfit Bundle
FeaturedItemIDs[0]=8178 //Whatsnew Gold Ticket FeaturedItemIDs[0]=7619 //Whatsnew Gold Ticket
FeaturedItemIDs[1]=9655 FeaturedItemIDs[1]=9749
FeaturedItemIDs[2]=9646 FeaturedItemIDs[2]=9747
FeaturedItemIDs[3]=9649 FeaturedItemIDs[3]=9716
FeaturedItemIDs[4]=9645 FeaturedItemIDs[4]=9718
FeaturedItemIDs[5]=9653 FeaturedItemIDs[5]=9720
FeaturedItemIDs[6]=9651
ConsoleFeaturedItemIDs[0]=8181 //Whatsnew Gold Ticket PSN ConsoleFeaturedItemIDs[0]=7783 //Whatsnew Gold Ticket PSN
ConsoleFeaturedItemIDs[1]=9655 ConsoleFeaturedItemIDs[1]=9749
ConsoleFeaturedItemIDs[2]=9646 ConsoleFeaturedItemIDs[2]=9747
ConsoleFeaturedItemIDs[3]=9649 ConsoleFeaturedItemIDs[3]=9716
ConsoleFeaturedItemIDs[4]=9645 ConsoleFeaturedItemIDs[4]=9718
ConsoleFeaturedItemIDs[5]=9653 ConsoleFeaturedItemIDs[5]=9720
ConsoleFeaturedItemIDs[6]=9651
MaxFeaturedItems=5 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 */ /** returns true if this item should not be displayed */
function bool IsItemFiltered(STraderItem Item, optional bool bDebug) function bool IsItemFiltered(STraderItem Item, optional bool bDebug)
{ {
local bool bUses9mm;
if(!class'GameEngine'.Static.IsGameFullyInstalled() && Item.WeaponDef.default.IsPlayGoHidden) if(!class'GameEngine'.Static.IsGameFullyInstalled() && Item.WeaponDef.default.IsPlayGoHidden)
{ {
if (bDebug) if (bDebug)
@ -340,5 +342,38 @@ function bool IsItemFiltered(STraderItem Item, optional bool bDebug)
return true; 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; 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 class KFGFxWeeklyObjectivesContainer extends KFGFxObject_Container
dependson(KFMission_LocalizedStrings); dependson(KFMission_LocalizedStrings);
var bool bInitialDataPopulated; var int LastWeeklyPopulated;
var bool bLastWeeklyComplete; var bool bLastWeeklyComplete;
var KFPlayerController KFPC; var KFPlayerController KFPC;
var KFGFxMenu_StartGame StartGameMenu;
function Initialize( KFGFxObject_Menu NewParentMenu ) function Initialize( KFGFxObject_Menu NewParentMenu )
{ {
super.Initialize( NewParentMenu ); super.Initialize( NewParentMenu );
StartGameMenu = KFGFxMenu_StartGame(NewParentMenu);
KFPC = KFPlayerController(GetPC()); KFPC = KFPlayerController(GetPC());
if(KFPC != none) if(KFPC != none)
{ {
LocalizeMenu(); PopulateData();
PopulateData();
} }
} }
function bool PopulateData() function bool PopulateData()
{ {
local int IntendedWeeklyIndex, WeeklyIndex, OverrideWeeklyIndex;
local GFxObject DataObject; local GFxObject DataObject;
local KFWeeklyOutbreakInformation WeeklyInfo; local KFWeeklyOutbreakInformation WeeklyInfo;
local bool bWeeklyComplete; local byte CurrentMenuState;
local int WeeklyIndex; 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(); 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) WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(WeeklyIndex);
{
WeeklyIndex = KFGameReplicationInfo(KFPC.WorldInfo.GRI).CurrentWeeklyIndex;
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(WeeklyIndex);
}
else
{
GetPC().SetTimer(0.5f, false, nameof(PopulateData));
}
} }
else else
{ {
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo(); WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
} }
DataObject = CreateObject("Object"); if (WeeklyInfo == none)
if(WeeklyInfo == none)
{ {
return false; return false;
} }
DataObject = CreateObject("Object");
DataObject.SetString("label", WeeklyInfo.FriendlyName); DataObject.SetString("label", WeeklyInfo.FriendlyName);
if(WeeklyInfo.ModifierDescriptions.length > 0) if(WeeklyInfo.ModifierDescriptions.length > 0)
{ {
DataObject.SetString("description", WeeklyInfo.DescriptionStrings[0]); DataObject.SetString("description", WeeklyInfo.DescriptionStrings[0]);
} }
DataObject.SetString("iconPath", "img://"$WeeklyInfo.IconPath); DataObject.SetString("iconPath", "img://"$WeeklyInfo.IconPath);
DataObject.SetBool("complete", bWeeklyComplete); DataObject.SetBool("complete", bWeeklyComplete);
@ -81,10 +135,8 @@ function bool PopulateData()
} }
PopulateModifiers(WeeklyInfo); PopulateModifiers(WeeklyInfo);
PopulateRewards(WeeklyInfo, WeeklyIndex); PopulateRewards(WeeklyInfo, WeeklyIndex, bIsCustomWeekly);
bLastWeeklyComplete = bWeeklyComplete;
bInitialDataPopulated = true;
return true; return true;
} }
@ -119,7 +171,7 @@ function PopulateModifiers(KFWeeklyOutbreakInformation WeeklyInfo)
SetObject("modifiers", DataProvider); //pass to SWF 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 int i, ItemCount;
local GFxObject DataProvider; //array containing the data objects local GFxObject DataProvider; //array containing the data objects
@ -144,13 +196,15 @@ function PopulateRewards(KFWeeklyOutbreakInformation WeeklyInfo, int WeeklyIndex
} }
} }
SetObject("rewards", DataProvider); //pass to SWF if (bIsCustomWeekly == false)
UpdateDoshVaultRewardValue(); {
} SetObject("rewards", DataProvider); //pass to SWF
SetInt("vaultDoshReward", class'KFOnlineStatsWrite'.static.GetWeeklyEventReward());
function UpdateDoshVaultRewardValue() }
{ else
SetInt("vaultDoshReward", class'KFOnlineStatsWrite'.static.GetWeeklyEventReward()); {
SetInt("setHideRewards", 1);
}
} }
function GFxObject CreateRewardItem(KFWeeklyOutbreakInformation WeeklyInfo,int ItemID) function GFxObject CreateRewardItem(KFWeeklyOutbreakInformation WeeklyInfo,int ItemID)
@ -185,25 +239,34 @@ function GFxObject CreateRewardItem(KFWeeklyOutbreakInformation WeeklyInfo,int I
return DataObject; return DataObject;
} }
function LocalizeMenu() function LocalizeMenu(bool bIsCustomWeekly)
{ {
local GFxObject TextObject; local GFxObject TextObject;
// local KFWeeklyOutbreakInformation WeeklyInfo;
// WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
TextObject = CreateObject("Object"); TextObject = CreateObject("Object");
// Localize static text // Localize static text
TextObject.SetString("currentModifier", class'KFMission_LocalizedStrings'.default.CurrentWeeklySettingsString); TextObject.SetString("currentModifier", class'KFMission_LocalizedStrings'.default.CurrentWeeklySettingsString);
TextObject.SetString("reward", class'KFMission_LocalizedStrings'.default.RewardsString); TextObject.SetString("reward", class'KFMission_LocalizedStrings'.default.RewardsString);
TextObject.SetString("granted", class'KFMission_LocalizedStrings'.default.GrantedWeeklyString); TextObject.SetString("granted", class'KFMission_LocalizedStrings'.default.GrantedWeeklyString);
TextObject.SetString("weekly", class'KFMission_LocalizedStrings'.default.WeeklyString);
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("overview", class'KFMission_LocalizedStrings'.default.WeeklyOverview);
TextObject.SetString("vaultDosh", class'KFMission_LocalizedStrings'.default.VaultDoshString); TextObject.SetString("vaultDosh", class'KFMission_LocalizedStrings'.default.VaultDoshString);
/*
if(WeeklyInfo != none && WeeklyInfo.ModifierDescriptions.length > 0)
{
TextObject.SetString("description", WeeklyInfo.ModifierDescriptions[0]);
}
*/
SetObject("localizedText", TextObject); 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{private} const int SeasonalEventId;
var private const int LoadedSeasonalEventId; 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; var private int WeeklyEventIndex;
// If we forced via cmd line
var private bool IsForceWeeklyEvent;
/************************************************************************************ /************************************************************************************
* @name Content * @name Content
@ -469,8 +475,12 @@ function ClearOnlineDelegates()
/** Static because these are both called on default object */ /** Static because these are both called on default object */
native static function int GetSeasonalEventID(); native static function int GetSeasonalEventID();
native static function int GetIntendedWeeklyEventIndex();
native static function int GetIntendedWeeklyEventIndexMod();
native static function int GetWeeklyEventIndex(); native static function int GetWeeklyEventIndex();
native static function int GetWeeklyEventIndexMod(); 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 IsSalesEventActive();
native static function bool IsSalesEventChecked(); native static function bool IsSalesEventChecked();
/*********************************************************************************** /***********************************************************************************
@ -649,7 +659,9 @@ DefaultProperties
KFFontScale=0.65f KFFontScale=0.65f
SeasonalEventId=-1 SeasonalEventId=-1
LoadedSeasonalEventId=-1 LoadedSeasonalEventId=-1
IntendedWeeklyEventIndex=-1
WeeklyEventIndex=-1 WeeklyEventIndex=-1
IsForceWeeklyEvent=false
LocalLoginStatus=LS_LoggedIn LocalLoginStatus=LS_LoggedIn
SafeFrameScale=1.0 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 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 AllowSeasonalSkinsIndex;
var int WeeklySelectorIndex;
/** Class replacements for each zed type */ /** Class replacements for each zed type */
struct native SpawnReplacement struct native SpawnReplacement
@ -662,6 +663,29 @@ event InitGame( string Options, out string ErrorMessage )
{ {
local string OptionRead; 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 ); Super.InitGame( Options, ErrorMessage );
if (UsesModifiedDifficulty()) if (UsesModifiedDifficulty())
@ -760,6 +784,7 @@ function UpdateGameSettings()
if (KFGameSettings != none) if (KFGameSettings != none)
{ {
KFGameSettings.bNoSeasonalSkins = AllowSeasonalSkinsIndex == 1; 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 bSpectator;
local bool bPerfTesting; 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 // Check for an arbitrated match in progress and kick if needed
if (WorldInfo.NetMode != NM_Standalone && bUsingArbitration && bHasArbitratedHandshakeBegun) 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."; ErrorMessage = "Server No longer available. Mismatch DesiredGameMode.";
return; 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" ); bPerfTesting = ( ParseOption( Options, "AutomatedPerfTesting" ) ~= "1" );
bSpectator = bPerfTesting || ( ParseOption( Options, "SpectatorOnly" ) ~= "1" ) || ( ParseOption( Options, "CauseEvent" ) ~= "FlyThrough" ); bSpectator = bPerfTesting || ( ParseOption( Options, "SpectatorOnly" ) ~= "1" ) || ( ParseOption( Options, "CauseEvent" ) ~= "FlyThrough" );
@ -1148,6 +1180,9 @@ function InitGRIVariables()
MyKFGRI.bVersusGame = bIsVersusGame; MyKFGRI.bVersusGame = bIsVersusGame;
MyKFGRI.MaxHumanCount = MaxPlayers; MyKFGRI.MaxHumanCount = MaxPlayers;
MyKFGRI.NotifyAllowSeasonalSkins(AllowSeasonalSkinsIndex); MyKFGRI.NotifyAllowSeasonalSkins(AllowSeasonalSkinsIndex);
MyKFGRI.NotifyWeeklySelector(WeeklySelectorIndex);
`Log("TEST - InitGRIVariables- NotifyWeeklySelector : " $WeeklySelectorIndex);
SetBossIndex(); SetBossIndex();
} }
@ -1654,9 +1689,12 @@ function float GetTotalWaveCountScale()
return 1.0f; 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; return 1.0f;
@ -2231,7 +2269,7 @@ function class<DamageType> GetLastHitByDamageType(class<DamageType> DT, KFPawn_M
} }
else else
{ {
`warn( "GetLastHitByDamageType() Received non-KFDamageType damagetype:"@DT); //`warn( "GetLastHitByDamageType() Received non-KFDamageType damagetype:"@DT);
} }
return RealDT; return RealDT;
@ -2577,6 +2615,7 @@ protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, cons
&& DamageHistory[i].DamagerPRI != none ) && DamageHistory[i].DamagerPRI != none )
{ {
EarnedDosh = Round( DamageHistory[i].TotalDamage * ScoreDenominator ); EarnedDosh = Round( DamageHistory[i].TotalDamage * ScoreDenominator );
//`log("SCORING: Player" @ DamageHistory[i].DamagerPRI.PlayerName @ "received" @ EarnedDosh @ "dosh for killing a" @ MonsterClass, bLogScoring); //`log("SCORING: Player" @ DamageHistory[i].DamagerPRI.PlayerName @ "received" @ EarnedDosh @ "dosh for killing a" @ MonsterClass, bLogScoring);
DamagerKFPRI = KFPlayerReplicationInfo(DamageHistory[i].DamagerPRI); DamagerKFPRI = KFPlayerReplicationInfo(DamageHistory[i].DamagerPRI);
if( DamagerKFPRI != none ) if( DamagerKFPRI != none )
@ -2591,26 +2630,32 @@ protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, cons
DamageHistory[i].DamagePerks[0].static.ModifyAssistDosh( EarnedDosh ); 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 ) if( DamagerKFPRI.Team != none )
{ {
//Dosh //Dosh
if (bIsBossKill && !bSplitBossDoshReward) if (MyKFGRI.IsBountyHunt() == false)
{ {
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(GetAdjustedAIDoshValue(MonsterClass)); if (bIsBossKill && !bSplitBossDoshReward)
} {
else KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(GetAdjustedAIDoshValue(MonsterClass));
{ }
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(EarnedDosh); else
{
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(EarnedDosh);
}
} }
if( DamageHistory[i].DamagePerks.Length <= 0 ) if( DamageHistory[i].DamagePerks.Length <= 0 )
@ -3003,12 +3048,35 @@ function string GetNextMap()
*/ */
if (IsWeekly()) 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 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() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14]) || // Boss Rush
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 16 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[16])) // Gun Game (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 16 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[16])) // Gun Game
{ {
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
if (MapName == MapBiolapse || if (MapName == MapBiolapse ||
MapName == MapNightmare || MapName == MapNightmare ||
MapName == MapPowerCore || MapName == MapPowerCore ||
@ -3021,8 +3089,6 @@ function string GetNextMap()
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 19 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[19]) // Contamination if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 19 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[19]) // Contamination
{ {
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
if (MapName == MapBiolapse || if (MapName == MapBiolapse ||
MapName == MapNightmare || MapName == MapNightmare ||
MapName == MapPowerCore || MapName == MapPowerCore ||
@ -3035,13 +3101,27 @@ function string GetNextMap()
} }
} }
/* Temporary removal of SteamFrotress for BossRush */ if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 20 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[20]) // Bounty Hunt
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14] &&
MapName == MapSteam)
{ {
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]) ) 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 NotifyPlayerStatsInitialized(KFPlayerController_WeeklySurvival KFPC){}
simulated function int WeeklyExtraNumberOfZeds()
{
return 0;
}
simulated function int WeeklyCurrentExtraNumberOfZeds()
{
return 0;
}
defaultproperties defaultproperties
{ {
/** Scoring */ /** Scoring */
@ -4047,6 +4137,7 @@ defaultproperties
bWaitingToStartMatch=true bWaitingToStartMatch=true
bDelayedStart=true bDelayedStart=true
AllowSeasonalSkinsIndex=0 AllowSeasonalSkinsIndex=0
WeeklySelectorIndex=-1
ActionMusicDelay=5.0 ActionMusicDelay=5.0
ForcedMusicTracks(0)=KFMusicTrackInfo'WW_MMNU_Login.TrackInfo' // menu ForcedMusicTracks(0)=KFMusicTrackInfo'WW_MMNU_Login.TrackInfo' // menu

View File

@ -386,6 +386,7 @@ var repnotify int VIPRepMaxHealth;
var repnotify KFPlayerReplicationInfo VIPRepPlayer; var repnotify KFPlayerReplicationInfo VIPRepPlayer;
var bool bAllowSeasonalSkins; var bool bAllowSeasonalSkins;
var int WeeklySelectorIndex;
/************************************ /************************************
* Steam heartbeat * Steam heartbeat
@ -421,11 +422,11 @@ replication
TraderVolume, TraderVolumeCheckType, bTraderIsOpen, NextTrader, WaveNum, bWaveIsEndless, GunGameWavesCurrent, bWaveGunGameIsFinal, AIRemaining, WaveTotalAICount, bWaveIsActive, MaxHumanCount, bGlobalDamage, TraderVolume, TraderVolumeCheckType, bTraderIsOpen, NextTrader, WaveNum, bWaveIsEndless, GunGameWavesCurrent, bWaveGunGameIsFinal, AIRemaining, WaveTotalAICount, bWaveIsActive, MaxHumanCount, bGlobalDamage,
CurrentObjective, PreviousObjective, PreviousObjectiveResult, PreviousObjectiveXPResult, PreviousObjectiveVoshResult, MusicIntensity, ReplicatedMusicTrackInfo, MusicTrackRepCount, CurrentObjective, PreviousObjective, PreviousObjectiveResult, PreviousObjectiveXPResult, PreviousObjectiveVoshResult, MusicIntensity, ReplicatedMusicTrackInfo, MusicTrackRepCount,
bIsUnrankedGame, GameSharedUnlocks, bHidePawnIcons, ConsoleGameSessionGuid, GameDifficulty, GameDifficultyModifier, BossIndex, bWaveStarted, NextObjective, bIsBrokenTrader, bIsWeeklyMode, 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 ) if ( bNetInitial )
GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled, bForceShowSkipTrader, bAllowSeasonalSkins; GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled, bForceShowSkipTrader, bAllowSeasonalSkins;
if ( bNetInitial || bNetDirty ) if ( bNetInitial || bNetDirty )
PerksAvailableData; CurrentWeeklyIndex, WeeklySelectorIndex, PerksAvailableData;
if ( bNetInitial && Role == ROLE_Authority ) if ( bNetInitial && Role == ROLE_Authority )
ServerAdInfo; ServerAdInfo;
@ -1376,7 +1377,7 @@ simulated function DisplayDebug(HUD HUD, out float YL, out float YPos)
TotalClots++; TotalClots++;
NumAlphas++; NumAlphas++;
} }
else if( KFPM.IsA('KFPawn_ZedClot_Cyst') ) else if( KFPM.IsA('KFPawn_ZedClot_Cyst') || KFPM.IsA('KFPawn_ZedHansClot') )
{ {
TotalClots++; TotalClots++;
NumUnders++; NumUnders++;
@ -2312,10 +2313,16 @@ simulated function NotifyWeeklyEventIndex(int EventIndex)
simulated function NotifyAllowSeasonalSkins(int AllowSeasonalSkinsIndex) simulated function NotifyAllowSeasonalSkins(int AllowSeasonalSkinsIndex)
{ {
bAllowSeasonalSkins = (AllowSeasonalSkinsIndex == 0); bAllowSeasonalSkins = (AllowSeasonalSkinsIndex == 0);
bNetDirty = true;
}
`Log("NotifyAllowSeasonalSkins: AllowSeasonalSkins: "$bAllowSeasonalSkins); simulated function NotifyWeeklySelector(int WeeklySelectorIndex_)
{
WeeklySelectorIndex = WeeklySelectorIndex_;
bNetDirty = true; bNetDirty = true;
`Log("TEST - NotifyWeeklySelector : " $WeeklySelectorIndex);
} }
/** VIP weekly */ /** VIP weekly */
@ -2449,6 +2456,27 @@ simulated function int ContaminationModeExtraDosh()
return 0; 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 defaultproperties
{ {
TraderItemsPath="GP_Trader_ARCH.DefaultTraderItems" TraderItemsPath="GP_Trader_ARCH.DefaultTraderItems"
@ -2471,6 +2499,7 @@ defaultproperties
bIsWeeklyMode=false bIsWeeklyMode=false
bForceShowSkipTrader=false bForceShowSkipTrader=false
bAllowSeasonalSkins=true bAllowSeasonalSkins=true
WeeklySelectorIndex=-1
bForceSkipTraderUI=false bForceSkipTraderUI=false
GunGameWavesCurrent=1 GunGameWavesCurrent=1
bWaveGunGameIsFinal=false 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 ModeKey, DifficultyKey, MapKey, WhitelistedKey, InProgressKey, PermissionsKey, ServerTypeKey;
var const string GameLengthKey; var const string GameLengthKey;
var const string AllowSeasonalSkinsKey; var const string AllowSeasonalSkinsKey;
var const string WeeklySelectorKey;
var KFGFxStartGameContainer_FindGame FindGameContainer; var KFGFxStartGameContainer_FindGame FindGameContainer;
var KFGFxStartGameContainer_Options OptionsComponent; var KFGFxStartGameContainer_Options OptionsComponent;
@ -68,6 +69,7 @@ var localized string MapTitle;
var localized string MutatorTitle; var localized string MutatorTitle;
var localized string PermissionsTitle; var localized string PermissionsTitle;
var localized string AllowSeasonalSkinsTitle; var localized string AllowSeasonalSkinsTitle;
var localized string WeeklySelectorTitle;
var localized string ServerTypeString; var localized string ServerTypeString;
var localized string WhiteListedTitle; var localized string WhiteListedTitle;
var localized string InfoTitle; var localized string InfoTitle;
@ -208,7 +210,7 @@ static function class<KFGFxSpecialeventObjectivesContainer> GetSpecialEventClass
case SEI_Summer: case SEI_Summer:
return class'KFGFxSpecialEventObjectivesContainer_Summer2023'; return class'KFGFxSpecialEventObjectivesContainer_Summer2023';
case SEI_Fall: case SEI_Fall:
return class'KFGFxSpecialEventObjectivesContainer_Fall2022'; return class'KFGFxSpecialEventObjectivesContainer_Fall2023';
case SEI_Winter: case SEI_Winter:
return class'KFGFXSpecialEventObjectivesContainer_Xmas2022'; return class'KFGFXSpecialEventObjectivesContainer_Xmas2022';
} }
@ -608,6 +610,7 @@ function SendLeaderOptions()
SetLobbyData(ModeKey, String(Manager.GetModeIndex())); SetLobbyData(ModeKey, String(Manager.GetModeIndex()));
SetLobbyData(PermissionsKey, String(OptionsComponent.GetPrivacyIndex())); SetLobbyData(PermissionsKey, String(OptionsComponent.GetPrivacyIndex()));
SetLobbyData(AllowSeasonalSkinsKey, String(OptionsComponent.GetAllowSeasonalSkinsIndex())); SetLobbyData(AllowSeasonalSkinsKey, String(OptionsComponent.GetAllowSeasonalSkinsIndex()));
SetLobbyData(WeeklySelectorKey, String(OptionsComponent.GetWeeklySelectorIndex()));
} }
} }
@ -640,6 +643,9 @@ function ReceiveLeaderOptions()
OptionIndex = Int(OnlineLobby.GetLobbyData(0, AllowSeasonalSkinsKey)); OptionIndex = Int(OnlineLobby.GetLobbyData(0, AllowSeasonalSkinsKey));
OverviewContainer.UpdateAllowSeasonalSkins(class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsString(OptionIndex)); OverviewContainer.UpdateAllowSeasonalSkins(class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsString(OptionIndex));
OptionIndex = Int(OnlineLobby.GetLobbyData(0, WeeklySelectorKey));
OverviewContainer.UpdateWeeklySelector(class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorString(OptionIndex));
} }
function ApproveMatchMakingLeave() function ApproveMatchMakingLeave()
@ -924,6 +930,7 @@ function Callback_CancelSearch()
function Callback_OptionListOpened(string ListName, int OptionIndex) function Callback_OptionListOpened(string ListName, int OptionIndex)
{ {
local string MessageString; local string MessageString;
local int IntendedWeeklyIndex;
if (OptionsComponent.bIsSoloGame && ListName == "modeList") if (OptionsComponent.bIsSoloGame && ListName == "modeList")
{ {
@ -940,6 +947,12 @@ function Callback_OptionListOpened(string ListName, int OptionIndex)
return; return;
} }
if (ListName == "weeklySelectorList" && OptionIndex == 0)
{
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
OptionIndex = IntendedWeeklyIndex + 1;
}
MessageString = Localize("StartMenuHelperText", ListName$OptionIndex, "KFGame"); MessageString = Localize("StartMenuHelperText", ListName$OptionIndex, "KFGame");
if(OptionsComponent != none) if(OptionsComponent != none)
@ -1092,6 +1105,11 @@ function Callback_AllowSeasonalSkins(int Index)
OptionsComponent.AllowSeasonalSkinsChanged(Index); OptionsComponent.AllowSeasonalSkinsChanged(Index);
} }
function Callback_WeeklySelector(int Index)
{
OptionsComponent.WeeklySelectorChanged(Index);
}
function SetLobbyData( string KeyName, string ValueData ) function SetLobbyData( string KeyName, string ValueData )
{ {
OnlineLobby.SetLobbyData( KeyName, ValueData ); OnlineLobby.SetLobbyData( KeyName, ValueData );
@ -1100,14 +1118,25 @@ function SetLobbyData( string KeyName, string ValueData )
function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent) function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent)
{ {
local string MapName; 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 // 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 // or other error cases such as when the game isn't fully installed
ModeIndex = InOptionsComponent.GetNormalizedGameModeIndex(Manager.GetModeIndex(true)); ModeIndex = InOptionsComponent.GetNormalizedGameModeIndex(Manager.GetModeIndex(true));
LengthIndex = InOptionsComponent.GetLengthIndex(); 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 (MapName == "" || MapStringList.Find(MapName) == INDEX_NONE)
{ {
if (CurrentConnectMap != "" && MapStringList.Find(CurrentConnectMap) != INDEX_NONE) if (CurrentConnectMap != "" && MapStringList.Find(CurrentConnectMap) != INDEX_NONE)
@ -1150,17 +1179,56 @@ function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent)
AllowSeasonalSkins = 0; AllowSeasonalSkins = 0;
} }
if (GetStartMenuState() == EMatchmaking if (CurrentMenuState == EMatchmaking
|| class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None
|| class'KFGameEngine'.static.GetSeasonalEventID() == SEI_Spring) || class'KFGameEngine'.static.GetSeasonalEventID() == SEI_Spring)
{ {
AllowSeasonalSkins = 1; // Default if we don't have a season or it's find a match menu 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() ) $"?Difficulty="$class'KFGameDifficultyInfo'.static.GetDifficultyValue( InOptionsComponent.GetDifficultyIndex() )
$"?GameLength="$LengthIndex $"?GameLength="$LengthIndex
$"?AllowSeasonalSkins="$AllowSeasonalSkins; $"?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); native function bool GetSearchComplete(KFOnlineGameSearch GameSearch);
@ -1510,6 +1578,8 @@ function BuildServerFilters(OnlineGameInterface GameInterfaceSteam, KFGFxStartGa
local string GameTagFilters; local string GameTagFilters;
local ActiveLobbyInfo LobbyInfo; local ActiveLobbyInfo LobbyInfo;
//local bool bAllowSeasonal; //local bool bAllowSeasonal;
local byte CurrentMenuState;
local int WeeklySelectorIndex, IntendedWeeklyIndex;
Search.ClearServerFilters(); Search.ClearServerFilters();
@ -1562,6 +1632,44 @@ function BuildServerFilters(OnlineGameInterface GameInterfaceSteam, KFGFxStartGa
Search.AddGametagFilter( GameTagFilters, 'Mode', string(GameMode) ); 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) //For modes that don't use filtered difficulty, don't even attempt to send this (Ex: Weekly)
if (ShouldUseDifficultyFilter(GameMode)) if (ShouldUseDifficultyFilter(GameMode))
{ {
@ -1959,6 +2067,7 @@ defaultproperties
InProgressKey="InProgress" InProgressKey="InProgress"
PermissionsKey="PermissionsKey" PermissionsKey="PermissionsKey"
AllowSeasonalSkinsKey="AllowSeasonalSkinsKey" AllowSeasonalSkinsKey="AllowSeasonalSkinsKey"
WeeklySelectorKey="WeeklySelectorKey"
SearchDSName=KFGameSearch SearchDSName=KFGameSearch

View File

@ -780,6 +780,16 @@ function Callback_PerkChanged(int PerkIndex)
{ {
MyKFPC.SetHaveUpdatePerk(true); 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) // re-initialize and refresh to reflect current carry weight (can change by perk)
MyKFPC.GetPurchaseHelper().Initialize(false); MyKFPC.GetPurchaseHelper().Initialize(false);
RefreshItemComponents(); RefreshItemComponents();
@ -792,6 +802,7 @@ function Callback_PerkChanged(int PerkIndex)
{ {
PlayerInventoryContainer.UpdateLock(); PlayerInventoryContainer.UpdateLock();
} }
UpdatePlayerInfo(); UpdatePlayerInfo();
// Refresht he UI // Refresht he UI

View File

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

View File

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

View File

@ -673,6 +673,11 @@ function DrawHUD()
// Draw last remaining zeds // Draw last remaining zeds
CheckAndDrawRemainingZedIcons(); CheckAndDrawRemainingZedIcons();
if (KFGRI.IsBountyHunt())
{
CheckAndDrawBountyHudIcons();
}
if (KFGRI.IsContaminationMode()) if (KFGRI.IsContaminationMode())
{ {
// While on trader time we let previsualize the next objective icon, so players can get ready // 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); 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 Pawn P;
local vector ViewLocation, ViewDir, PawnLocation; local vector ViewLocation, ViewDir, PawnLocation;
local rotator ViewRotation; local rotator ViewRotation;
local KFPawn_Monster Monster;
if( KFGRI == none if( KFGRI == none
|| KFPlayerOwner == none || KFPlayerOwner == none
@ -1402,20 +1420,109 @@ function CheckAndDrawRemainingZedIcons()
if( P.Mesh.SkeletalMesh == none if( P.Mesh.SkeletalMesh == none
|| !P.Mesh.bAnimTreeInitialised || !P.Mesh.bAnimTreeInitialised
|| P.GetTeamNum() == PlayerOwner.GetTeamNum() || P.GetTeamNum() == PlayerOwner.GetTeamNum()
|| !P.IsAliveAndWell()) || !P.IsAliveAndWell() )
//|| `TimeSince(P.Mesh.LastRenderTime) < 0.2f ) //|| `TimeSince(P.Mesh.LastRenderTime) < 0.2f )
{ {
continue; continue;
} }
Monster = KFPawn_Monster(P);
if (Monster != none && Monster.bIsBountyHuntObjective)
{
continue;
}
PawnLocation = P.Mesh.GetPosition(); 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 */ /** 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 vector ScreenPos, TargetLocation;
local float IconSizeMult; 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 ); TargetLocation = PawnLocation + ( vect(0,0,2.5f) * ZedPawn.CylinderComponent.CollisionHeight );
ScreenPos = Canvas.Project( TargetLocation ); ScreenPos = Canvas.Project( TargetLocation );
IconSizeMult = PlayerStatusIconSize * ResModifier * 0.5f; IconSizeMult = PlayerStatusIconSize * ResModifier * 0.5f * SizeMultiplier;
ScreenPos.X -= IconSizeMult; ScreenPos.X -= IconSizeMult;
ScreenPos.Y -= IconSizeMult; ScreenPos.Y -= IconSizeMult;
@ -1448,9 +1555,8 @@ function DrawZedIcon( Pawn ZedPawn, vector PawnLocation, float NormalizedAngle )
ScreenPos = GetClampedScreenPosition(ScreenPos); ScreenPos = GetClampedScreenPosition(ScreenPos);
} }
// Draw boss icon // Draw boss icon
Canvas.SetDrawColorStruct( ZedIconColor ); Canvas.SetDrawColorStruct( ColorToUse );
Canvas.SetPos( ScreenPos.X, ScreenPos.Y ); Canvas.SetPos( ScreenPos.X, ScreenPos.Y );
Canvas.DrawTile( GenericZedIconTexture, IconSizeMult, IconSizeMult, 0, 0, 128, 128 ); 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 KFWeapon W, BestWeapon, BackupGun;
local float Rating, BestRating; 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 ) ForEach InventoryActors( class'KFWeapon', W )
{ {
@ -1369,7 +1385,7 @@ simulated function AttemptQuickHeal()
/** Equip the welder immediately */ /** Equip the welder immediately */
simulated function bool QuickWeld() simulated function bool QuickWeld()
{ {
local KFWeapon KFW; local KFWeapon KFW, PreviousKFW;
local KFInterface_Usable UsableTrigger; local KFInterface_Usable UsableTrigger;
local KFDoorTrigger DoorTrigger; local KFDoorTrigger DoorTrigger;
local KFRepairableActorTrigger RepairableTrigger; local KFRepairableActorTrigger RepairableTrigger;
@ -1382,8 +1398,8 @@ simulated function bool QuickWeld()
} }
// make sure player is actually allowed to switch weapons // make sure player is actually allowed to switch weapons
KFW = KFWeapon( Instigator.Weapon ); PreviousKFW = KFWeapon( Instigator.Weapon );
if( KFW != none && !KFW.CanSwitchWeapons() ) if( PreviousKFW != none && !PreviousKFW.CanSwitchWeapons() )
{ {
return false; return false;
} }
@ -1413,6 +1429,7 @@ simulated function bool QuickWeld()
{ {
if( KFW.IsA('KFWeap_Welder') ) if( KFW.IsA('KFWeap_Welder') )
{ {
KFPC.MyGFxHUD.WeaponSelectWidget.UpdateWeaponGroupOnHUD(PreviousKFW.InventoryGroup);
SetCurrentWeapon(KFW); SetCurrentWeapon(KFW);
ShowAllHUDGroups(); ShowAllHUDGroups();
return true; 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) // 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 // Special case for 9mm
if( OwnedItem.SingleClassName == 'KFWeap_Pistol_9mm') if( OwnedItem.SingleClassName == 'KFWeap_Pistol_9mm'
|| OwnedItem.SingleClassName == 'KFWeap_HRG_93R' )
{ {
// @todo: revisit // @todo: revisit
// assume price of single is half the price of dual. might be better to use the actual buy price of the single, // 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 // 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 // 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; 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 defaultproperties
{ {
PendingFire(0)=0 // DEFAULT_FIREMOD PendingFire(0)=0 // DEFAULT_FIREMOD

View File

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

View File

@ -74,6 +74,7 @@ defaultproperties
ColumnIds.Add(STATID_ACHIEVE_BarmwichCollectibles) ColumnIds.Add(STATID_ACHIEVE_BarmwichCollectibles)
ColumnIds.Add(STATID_ACHIEVE_CrashCollectibles); ColumnIds.Add(STATID_ACHIEVE_CrashCollectibles);
ColumnIds.Add(STATID_ACHIEVE_SubductionCollectibles); ColumnIds.Add(STATID_ACHIEVE_SubductionCollectibles);
ColumnIds.Add(STATID_ACHIEVE_VolterCastleCollectibles);
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky5, Name="AchievementMrPerky5")) ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky5, Name="AchievementMrPerky5"))
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky10, Name = "AchievementMrPerky10")) 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_BarmwichCollectibles,Name="AchievementCollectBarmwichTown"))
ColumnMappings.Add((Id=STATID_ACHIEVE_CrashCollectibles,Name="AchievementCollectCrash")) ColumnMappings.Add((Id=STATID_ACHIEVE_CrashCollectibles,Name="AchievementCollectCrash"))
ColumnMappings.Add((Id=STATID_ACHIEVE_SubductionCollectibles,Name="AchievementCollectSubduction")) 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_SubductionHellOnEarth = 302;
const KFACHID_SubductionCollectibles = 303; const KFACHID_SubductionCollectibles = 303;
const KFACHID_VolterCastleHard = 304;
const KFACHID_VolterCastleHellOnEarth = 305;
const KFACHID_VolterCastleCollectibles = 306;
/* __TW_ANALYTICS_ */ /* __TW_ANALYTICS_ */
var int PerRoundWeldXP; var int PerRoundWeldXP;
var int PerRoundHealXP; var int PerRoundHealXP;
@ -1195,6 +1199,11 @@ private event AddAfflictionCaused(EAfflictionType Type)
SeasonalEventStats_OnAfflictionCaused(Type); SeasonalEventStats_OnAfflictionCaused(Type);
} }
private event AddCollectibleFound(int Limit)
{
SeasonalEventStats_OnCollectibleFound(Limit);
}
private native function AddToKillObjectives(class<KFPawn_Monster> ZedClass); private native function AddToKillObjectives(class<KFPawn_Monster> ZedClass);
private native function AddToVersusKillObjectives(class<Pawn> KillerClass); 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 * @name Dailies and daily-specific tracking
********************************************************************************************* */ ********************************************************************************************* */
@ -2069,6 +2086,7 @@ defaultproperties
//Base Weapons //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,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_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 //Swat Weapons
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_SMG_MP7, KFDT_Ballistic_MP7,KFDT_Bludgeon_MP7),CompletionAmount=5000)) //3000 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_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)) DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_LMG_Stoner63A, KFDT_Ballistic_Stoner63A,KFDT_Bludgeon_Stoner63A),CompletionAmount=10000))
//Support Weapons //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_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 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=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=2))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-SUBDUCTION),CompletionAmount=3)) 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 //Versus Damage
// Per design doc that I have right now, these are x class damage y players, not damage y amount // 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_BarmwichCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_CrashCollectibles, 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_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; 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 /** Individual property overrides that drive other behavior to allow for
* a large amount of variety in our weekly event mode. * a large amount of variety in our weekly event mode.
*/ */
@ -455,6 +500,8 @@ struct WeeklyOverrides
var() bool bVIPGameMode; var() bool bVIPGameMode;
var() bool bBountyHunt;
/** Ignores damage caused by headshots. */ /** Ignores damage caused by headshots. */
var() bool bInvulnerableHeads; var() bool bInvulnerableHeads;
@ -470,6 +517,26 @@ struct WeeklyOverrides
/** Contamination mode Extra Dosh */ /** Contamination mode Extra Dosh */
var() int ContaminationModeExtraDosh; 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 structdefaultproperties
{ {
GameLength = GL_Short GameLength = GL_Short
@ -531,12 +598,28 @@ struct WeeklyOverrides
bDisableThrowWeapon = false; bDisableThrowWeapon = false;
bGunGameMode = false; bGunGameMode = false;
bVIPGameMode = false; bVIPGameMode = false;
bBountyHunt = false;
bInvulnerableHeads = false; bInvulnerableHeads = false;
TraderTimeModifier = 1.f; TraderTimeModifier = 1.f;
TimeBetweenWaves = -1.f; TimeBetweenWaves = -1.f;
bForceShowSkipTrader = false; bForceShowSkipTrader = false;
ContaminationModeZedsToFinish = 0; ContaminationModeZedsToFinish = 0;
ContaminationModeExtraDosh = 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. */ /** Stored values of World Info and GRI items incase we need to reset it. */
var CachedOutbreakInfo CachedItems; var CachedOutbreakInfo CachedItems;
function int SetActiveEvent(int ActiveEventIdx) function int SetActiveEvent(int ActiveEventIdx, KFGameInfo GameInfo)
{ {
`if(`notdefined(ShippingPC)) `if(`notdefined(ShippingPC))
local string LocalURL; local string LocalURL;
@ -583,7 +666,19 @@ function int SetActiveEvent(int ActiveEventIdx)
//Runtime override by URL options for testing purposes //Runtime override by URL options for testing purposes
LocalURL = WorldInfo.GetLocalURL(); LocalURL = WorldInfo.GetLocalURL();
LocalURL = Split(LocalURL, "?"); //remove map name 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 our override is out of bounds, see if it's a valid test event
if (ActiveEventIdx >= SetEvents.Length) if (ActiveEventIdx >= SetEvents.Length)
@ -599,12 +694,22 @@ function int SetActiveEvent(int ActiveEventIdx)
ActiveEvent = SetEvents[ActiveEventIdx]; ActiveEvent = SetEvents[ActiveEventIdx];
} }
`else `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) if(ActiveEventIdx < SetEvents.length)
{ {
ActiveEvent = SetEvents[ActiveEventIdx]; ActiveEvent = SetEvents[ActiveEventIdx];
} }
`endif `endif
`Log("TEST - SetActiveEvent : " $ActiveEventIdx);
KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(ActiveEventIdx);
return 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) function ReduceDamage(out int Damage, Pawn Injured, Controller InstigatedBy, class<DamageType> DamageType, TraceHitInfo HitInfo)
{ {
local int HitZoneIdx, WaveNum; 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 //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. // 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; 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) 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); 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) 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; return TRUE;
} }
function KFWeapon FindBestWeapon() function KFWeapon FindBestWeapon(optional bool bCheckHasAmmo = false, optional bool allow9mm = true)
{ {
local float BestPrimaryRating, BestSecondaryRating, BestMeleeRating; local float BestPrimaryRating, BestSecondaryRating, BestMeleeRating;
local KFWeapon BestWeapon, BestPrimary, BestSecondary, BestMelee, TempWeapon; local KFWeapon BestWeapon, BestPrimary, BestSecondary, BestMelee, TempWeapon;
@ -2072,6 +2072,22 @@ function KFWeapon FindBestWeapon()
continue; 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 // Collect the best weapons from each inventory group
if (TempWeapon.InventoryGroup == IG_Primary) if (TempWeapon.InventoryGroup == IG_Primary)
{ {
@ -2100,7 +2116,8 @@ function KFWeapon FindBestWeapon()
} }
// Get our best possible weapon from all 3 categories and throw it // 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; return BestWeapon;
} }
/** /**
@ -2725,6 +2742,13 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
// NVCHANGE_BEGIN - RLS - Debugging Effects // NVCHANGE_BEGIN - RLS - Debugging Effects
bAllowHeadshot = CanCountHeadshots(); bAllowHeadshot = CanCountHeadshots();
OldHealth = Health; OldHealth = Health;
KFDT = class<KFDamageType>(DamageType);
if ( KFDT != None )
{
KFDT.static.ModifyInstantDamage(self, Damage, InstigatedBy);
}
Super.TakeDamage(Damage, InstigatedBy, HitLocation, Momentum, DamageType, HitInfo, DamageCauser); 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 // 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 // damage. Requires valid DamageCauser, 'None' for DoT, to prevent recursion
if ( Health < OldHealth && DamageCauser != None ) if ( Health < OldHealth && DamageCauser != None )
{ {
KFDT = class<KFDamageType>(DamageType);
if ( KFDT != None ) if ( KFDT != None )
{ {
KFDT.static.ApplySecondaryDamage(self, Damage, InstigatedBy); 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<int> EliteAIType; // can't use EAIType enumerator, use integer instead
var const array<class<KFPawn_Monster> > ElitePawnClass; var const array<class<KFPawn_Monster> > ElitePawnClass;
var const array<class<KFPawn_Monster> > MapReplacePawnClass;
/** Custom third person camera offsets */ /** Custom third person camera offsets */
var() ViewOffsetData ThirdPersonViewOffset; var() ViewOffsetData ThirdPersonViewOffset;
@ -579,6 +581,11 @@ var ParticleSystem WeakPointParticleTemplate;
var bool bCanBeKilledByShrinking; var bool bCanBeKilledByShrinking;
var float ShrinkEffectModifier; var float ShrinkEffectModifier;
// Bounty Hunt
var bool bIsBountyHuntObjective;
var bool bIsBountyHuntOnLastTier;
var bool bIsBountyHuntBlockLeaveMap;
/********************************************************************************************* /*********************************************************************************************
* @name Delegates * @name Delegates
********************************************************************************************* */ ********************************************************************************************* */
@ -593,7 +600,8 @@ replication
if (bNetDirty) if (bNetDirty)
bIsHeadless, bIsPoisoned, bPlayPanicked, bPlayShambling, MaxHeadChunkGoreWhileAlive, bIsHeadless, bIsPoisoned, bPlayPanicked, bPlayShambling, MaxHeadChunkGoreWhileAlive,
RepInflateMatParams, RepInflateMatParam, RepDamageInflateParam, RepBleedInflateMatParam, bDisableGoreMeshWhileAlive, 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 ) if ( bNetDirty && bCanCloak )
bIsCloakingSpottedByTeam; bIsCloakingSpottedByTeam;
if ( bNetDirty && bCanRage ) if ( bNetDirty && bCanRage )
@ -699,8 +707,13 @@ simulated event ReplicatedEvent(name VarName)
case nameof(WeakPoints_TS): case nameof(WeakPoints_TS):
SpawnWeakpointVFX(); SpawnWeakpointVFX();
break; break;
case nameof(bIsBountyHuntOnLastTier):
break;
case nameof(bIsBountyHuntBlockLeaveMap):
break;
} }
super.ReplicatedEvent( VarName ); super.ReplicatedEvent( VarName );
} }
@ -768,6 +781,16 @@ static event class<KFPawn_Monster> GetAIPawnClassToSpawn()
return default.class; 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 */ /** Load content archetype when map loads */
native static final function PreloadContent(); native static final function PreloadContent();
/** Called if preload was not called before 1st spawn */ /** Called if preload was not called before 1st spawn */
@ -851,6 +874,11 @@ simulated event CheckShouldAlwaysBeRelevant()
{ {
bAlwaysRelevant = true; bAlwaysRelevant = true;
} }
if (bIsBountyHuntObjective)
{
bAlwaysRelevant = true;
}
} }
/** Called immediately after gameplay begins */ /** Called immediately after gameplay begins */
@ -1892,12 +1920,24 @@ simulated function float GetMinBlockFOV()
/** Reduce affliction power when blocking */ /** Reduce affliction power when blocking */
simulated function AdjustAffliction( out float AfflictionPower ) simulated function AdjustAffliction( out float AfflictionPower )
{ {
local KFGameInfo KFGI;
if( Role == ROLE_Authority && bIsBlocking ) if( Role == ROLE_Authority && bIsBlocking )
{ {
AfflictionPower *= DifficultyBlockSettings.AfflictionModifier; AfflictionPower *= DifficultyBlockSettings.AfflictionModifier;
} }
super.AdjustAffliction( AfflictionPower ); 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 */ /** 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 // NVCHANGE_BEGIN - RLS - Debugging Effects
// Do extra damage on blowing the head off // 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); KFDT = class<KFDamageType>(DamageType);
@ -2349,7 +2393,7 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
InDamage *= KFDT.default.HeadDestructionDamageScale; InDamage *= KFDT.default.HeadDestructionDamageScale;
} }
ExtraHeadDamage = InDamage + HealthMax * 0.25; ExtraHeadDamage = (InDamage + HealthMax * 0.25);
bCheckingExtraHeadDamage = true; bCheckingExtraHeadDamage = true;
AdjustDamage( ExtraHeadDamage, Momentum, InstigatedBy, HitLocation, DamageType, HitInfo, DamageCauser ); 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) */ /** Called on server when pawn should has been crippled (e.g. Headless) */
function CauseHeadTrauma(float BleedOutTime=5.f) 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 ) 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 ) if ( HitZoneIdx == HZI_Head )
{ {
// Based on head health, calculate number of head chunks we're allowed to remove // 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(); HeadHealthPercentage = GetHeadHealthPercent();
if( HeadHealthPercentage > 0.5 ) 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 * @name Achievements
********************************************************************************************* */ ********************************************************************************************* */
@ -5165,4 +5243,8 @@ DefaultProperties
bCanBeKilledByShrinking=true bCanBeKilledByShrinking=true
ShrinkEffectModifier=1.0f 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 */ /** Reduce affliction/incap strength when healing */
simulated function AdjustAffliction( out float AfflictionPower ) simulated function AdjustAffliction( out float AfflictionPower )
{ {
super.AdjustAffliction( AfflictionPower );
if( bInHuntAndHealMode ) if( bInHuntAndHealMode )
{ {
AfflictionPower *= IncapPowerScaleWhenHealing; AfflictionPower *= IncapPowerScaleWhenHealing;
} }
super.AdjustAffliction( AfflictionPower );
} }
/** Updates shield health and shield health percent */ /** Updates shield health and shield health percent */

View File

@ -149,9 +149,10 @@ var const bool bInitialized;
* Inventory * Inventory
********************************************************************************************* */ ********************************************************************************************* */
var byte StartingSecondaryWeaponClassIndex;
/** The weapon class string used to load the weapon class for this perk */ /** The weapon class string used to load the weapon class for this perk */
var class<KFWeaponDefinition> PrimaryWeaponDef; var class<KFWeaponDefinition> PrimaryWeaponDef;
var class<KFWeaponDefinition> SecondaryWeaponDef;
/** default starting knife */ /** default starting knife */
var class<KFWeaponDefinition> KnifeWeaponDef; var class<KFWeaponDefinition> KnifeWeaponDef;
@ -173,6 +174,8 @@ var array<name> BackupWeaponDamageTypeNames;
var array<class<KFWeaponDefinition> > AutoBuyLoadOutPath; var array<class<KFWeaponDefinition> > AutoBuyLoadOutPath;
var const array<class<KFWeaponDefinition> > SecondaryWeaponPaths;
/********************************************************************************************* /*********************************************************************************************
* Player Skill Trakcing * Player Skill Trakcing
********************************************************************************************* */ ********************************************************************************************* */
@ -502,7 +505,12 @@ static simulated public function bool IsSyringe( KFWeapon KFW )
*/ */
static function bool IsDual9mm( 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; 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 */ /* Returns the knife's class path for this perk */
simulated function string GetKnifeWeaponClassPath() simulated function string GetKnifeWeaponClassPath()
{ {
@ -1314,6 +1316,7 @@ native function bool CanRepairDoors();
function bool RepairArmor( Pawn HealTarget ); function bool RepairArmor( Pawn HealTarget );
function bool IsToxicDmgActive() { return false; } function bool IsToxicDmgActive() { return false; }
static function class<KFDamageType> GetToxicDmgTypeClass(){ return default.ToxicDmgTypeClass; } static function class<KFDamageType> GetToxicDmgTypeClass(){ return default.ToxicDmgTypeClass; }
static function float GetHealRechargeMod();
static function ModifyToxicDmg( out int ToxicDamage ); static function ModifyToxicDmg( out int ToxicDamage );
simulated function float GetSirenScreamStrength(){ return 1.f; } simulated function float GetSirenScreamStrength(){ return 1.f; }
simulated function bool IsHealingSurgeActive(){ return false; } simulated function bool IsHealingSurgeActive(){ return false; }
@ -1633,6 +1636,11 @@ static simulated function bool CanChoosePrimaryWeapon()
return false; return false;
} }
static simulated function bool CanChooseSecondaryWeapon()
{
return true;
}
static simulated function bool CanChooseGrenade() static simulated function bool CanChooseGrenade()
{ {
return false; return false;
@ -1642,9 +1650,10 @@ simulated function byte OnPrevWeaponSelected() { return 255; }
simulated function byte OnNextWeaponSelected() { return 255; } simulated function byte OnNextWeaponSelected() { return 255; }
simulated function byte OnPrevGrenadeSelected() { return 255; } simulated function byte OnPrevGrenadeSelected() { return 255; }
simulated function byte OnNextGrenadeSelected() { return 255; } simulated function byte OnNextGrenadeSelected() { return 255; }
simulated function byte SetWeaponSelectedIndex(byte idx); simulated static function byte GetWeaponSelectedIndex(byte idx);
simulated function byte SetGrenadeSelectedIndex(byte idx); simulated function SetWeaponSelectedIndex(byte idx);
simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext); 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 byte GetGrenadeSelectedIndex() { return 255;}
simulated function InitializeGrenades(); simulated function InitializeGrenades();
@ -1668,6 +1677,68 @@ static simulated function string GetGrenadeWeaponImagePath(byte Idx)
return default.GrenadeWeaponDef.static.GetImagePath(); 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 DefaultProperties
{ {
bTickIsDisabled=TRUE bTickIsDisabled=TRUE
@ -1692,6 +1763,7 @@ DefaultProperties
BackupWeaponDamageTypeNames(0)="KFDT_Ballistic_9mm"; BackupWeaponDamageTypeNames(0)="KFDT_Ballistic_9mm";
BackupWeaponDamageTypeNames(1)="KFDT_Slashing_Knife"; BackupWeaponDamageTypeNames(1)="KFDT_Slashing_Knife";
StartingSecondaryWeaponClassIndex=0;
// network // network
RemoteRole=ROLE_SimulatedProxy RemoteRole=ROLE_SimulatedProxy
@ -1700,10 +1772,12 @@ DefaultProperties
bOnlyRelevantToOwner=TRUE bOnlyRelevantToOwner=TRUE
// weapon content // weapon content
SecondaryWeaponDef=class'KFWeapDef_9mm'
KnifeWeaponDef=class'KFWeapDef_Knife_Commando' KnifeWeaponDef=class'KFWeapDef_Knife_Commando'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Berserker' GrenadeWeaponDef=class'KFWeapDef_Grenade_Berserker'
SecondaryWeaponPaths(0)=class'KFWeapDef_9mm'
SecondaryWeaponPaths(1)=class'KFWeapDef_HRG_93R'
InitialGrenadeCount=2 InitialGrenadeCount=2
MaxGrenadeCount=5 MaxGrenadeCount=5

View File

@ -1020,6 +1020,7 @@ DefaultProperties
SmallRadiusSizeSQ=40000 SmallRadiusSizeSQ=40000
PrimaryWeaponDef=class'KFWeapDef_Crovel' PrimaryWeaponDef=class'KFWeapDef_Crovel'
KnifeWeaponDef=class'KFweapDef_Knife_Berserker' KnifeWeaponDef=class'KFweapDef_Knife_Berserker'
GrenadeWeaponDef=class'KFWeapDef_Grenade_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. // 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( 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 ); `QALog( "Backup Damage" @ KFW @ GetPercentage( InDamage, InDamage * GetSkillValue( PerkSkills[ECommandoBackup] )), bLogPerk );
TempDamage += InDamage * GetSkillValue( PerkSkills[ECommandoBackup] ); TempDamage += InDamage * GetSkillValue( PerkSkills[ECommandoBackup] );
@ -692,6 +693,7 @@ DefaultProperties
PerkBuildStatID=STATID_Cmdo_Build PerkBuildStatID=STATID_Cmdo_Build
PrimaryWeaponDef=class'KFWeapDef_AR15' PrimaryWeaponDef=class'KFWeapDef_AR15'
KnifeWeaponDef=class'KFweapDef_Knife_Commando' KnifeWeaponDef=class'KFweapDef_Knife_Commando'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Commando' GrenadeWeaponDef=class'KFWeapDef_Grenade_Commando'

View File

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

View File

@ -62,11 +62,6 @@ enum EMedicPerkSkills
EMedicZedative EMedicZedative
}; };
/*********************************************************************************************
* @name Perk init and spawning
******************************************************************************************** */
/********************************************************************************************* /*********************************************************************************************
* @name Passive skills functions * @name Passive skills functions
********************************************************************************************* */ ********************************************************************************************* */
@ -329,6 +324,11 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
InDamage = Round(TempDamage); InDamage = Round(TempDamage);
} }
static function float GetHealRechargeMod()
{
return GetSkillValue( default.PerkSkills[EMedicAcidicCompound] );
}
/** Takes the weapons primary damage and calculates the poisoning over time value */ /** 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 * @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; local float TempDamage;
TempDamage = float(ToxicDamage) * GetSkillValue( default.PerkSkills[EMedicAcidicCompound] ); TempDamage = float(ToxicDamage) * GetHealRechargeMod();
ToxicDamage = FCeil( TempDamage ); ToxicDamage = FCeil( TempDamage );
} }
@ -644,13 +644,14 @@ DefaultProperties
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Medic' PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Medic'
PrimaryWeaponDef=class'KFWeapDef_MedicPistol' PrimaryWeaponDef=class'KFWeapDef_MedicPistol'
KnifeWeaponDef=class'KFWeapDef_Knife_Medic' KnifeWeaponDef=class'KFWeapDef_Knife_Medic'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Medic' GrenadeWeaponDef=class'KFWeapDef_Grenade_Medic'
ProgressStatID=STATID_Medic_Progress ProgressStatID=STATID_Medic_Progress
PerkBuildStatID=STATID_Medic_Build PerkBuildStatID=STATID_Medic_Build
SelfHealingSurgePct=0.03f //0.1f SelfHealingSurgePct=0.06f //0.1f
MaxSurvivalistResistance=0.30f //0.70f //0.5f //0.8 MaxSurvivalistResistance=0.30f //0.70f //0.5f //0.8
CombatantSpeedModifier=0.1f 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(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(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(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(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(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) 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' PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Firebug'
PrimaryWeaponDef=class'KFWeapDef_CaulkBurn' PrimaryWeaponDef=class'KFWeapDef_CaulkBurn'
KnifeWeaponDef=class'KFWeapDef_Knife_Firebug' KnifeWeaponDef=class'KFWeapDef_Knife_Firebug'
GrenadeWeaponDef=class'KFWeapDef_Grenade_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 HeadShotCountdownIntervall;
var private const float SteadySkillDamageModifier; var private const float SteadySkillDamageModifier;
/*********************************************************************************************
* @name Perk init and spawning
******************************************************************************************** */
/** /**
* @brief Weapons and perk skills can affect the jog/sprint speed * @brief Weapons and perk skills can affect the jog/sprint speed
* *
@ -825,6 +822,7 @@ DefaultProperties
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Gunslinger' PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Gunslinger'
PrimaryWeaponDef=class'KFWeapDef_Remington1858Dual' PrimaryWeaponDef=class'KFWeapDef_Remington1858Dual'
KnifeWeaponDef=class'KFWeapDef_Knife_Gunslinger' KnifeWeaponDef=class'KFWeapDef_Knife_Gunslinger'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Gunslinger' GrenadeWeaponDef=class'KFWeapDef_Grenade_Gunslinger'
@ -870,11 +868,14 @@ DefaultProperties
AdditionalOnPerkWeaponNames(0)="KFWeap_Pistol_9mm" AdditionalOnPerkWeaponNames(0)="KFWeap_Pistol_9mm"
AdditionalOnPerkWeaponNames(1)="KFWeap_Pistol_Dual9mm" AdditionalOnPerkWeaponNames(1)="KFWeap_Pistol_Dual9mm"
AdditionalOnPerkWeaponNames(2)="KFWeap_GrenadeLauncher_HX25" AdditionalOnPerkWeaponNames(2)="KFWeap_GrenadeLauncher_HX25"
AdditionalOnPerkWeaponNames(3)="KFWeap_HRG_93R"
AdditionalOnPerkWeaponNames(4)="KFWeap_HRG_93R_Dual"
AdditionalOnPerkDTNames(0)="KFDT_Ballistic_9mm" AdditionalOnPerkDTNames(0)="KFDT_Ballistic_9mm"
AdditionalOnPerkDTNames(1)="KFDT_Ballistic_Pistol_Medic" AdditionalOnPerkDTNames(1)="KFDT_Ballistic_Pistol_Medic"
AdditionalOnPerkDTNames(2)="KFDT_Ballistic_Winchester" AdditionalOnPerkDTNames(2)="KFDT_Ballistic_Winchester"
AdditionalOnPerkDTNames(3)="KFDT_Ballistic_HX25Impact" AdditionalOnPerkDTNames(3)="KFDT_Ballistic_HX25Impact"
AdditionalOnPerkDTNames(4)="KFDT_Ballistic_HX25SubmunitionImpact" 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(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) 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' PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Sharpshooter'
PrimaryWeaponDef=class'KFWeapDef_Winchester1894' PrimaryWeaponDef=class'KFWeapDef_Winchester1894'
KnifeWeaponDef=class'KFWeapDef_Knife_Sharpshooter' KnifeWeaponDef=class'KFWeapDef_Knife_Sharpshooter'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Sharpshooter' GrenadeWeaponDef=class'KFWeapDef_Grenade_Sharpshooter'
@ -741,10 +742,12 @@ DefaultProperties
AdditionalOnPerkWeaponNames(1)="KFWeap_Pistol_Dual9mm" AdditionalOnPerkWeaponNames(1)="KFWeap_Pistol_Dual9mm"
AdditionalOnPerkWeaponNames(2)="KFWeap_Revolver_Rem1858" AdditionalOnPerkWeaponNames(2)="KFWeap_Revolver_Rem1858"
AdditionalOnPerkWeaponNames(3)="KFWeap_Revolver_SW500" AdditionalOnPerkWeaponNames(3)="KFWeap_Revolver_SW500"
AdditionalOnPerkWeaponNames(4)="KFWeap_HRG_93R"
AdditionalOnPerkWeaponNames(5)="KFWeap_HRG_93R_Dual"
AdditionalOnPerkDTNames(0)="KFDT_Ballistic_9mm" AdditionalOnPerkDTNames(0)="KFDT_Ballistic_9mm"
AdditionalOnPerkDTNames(1)="KFDT_Ballistic_SW500" AdditionalOnPerkDTNames(1)="KFDT_Ballistic_SW500"
AdditionalOnPerkDTNames(2)="KFDT_Ballistic_Rem1858" 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) 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) 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 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 enum ESupportPerkSkills
{ {
ESupportHighCapMags, ESupportHighCapMags,
@ -52,6 +57,7 @@ enum ESupportPerkSkills
ESupportConcussionRounds, ESupportConcussionRounds,
ESupportPerforate, ESupportPerforate,
ESupportBarrage, ESupportBarrage,
}; };
/********************************************************************************************* /*********************************************************************************************
@ -177,12 +183,43 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
TempDamage += InDamage * GetSkillValue( PerkSkills[ESupportSalvo] ); TempDamage += InDamage * GetSkillValue( PerkSkills[ESupportSalvo] );
`QALog( GetFuncName() @ "+ Salvo Damage =" @ TempDamage, bLogPerk ); `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 ); `QALog( "Total Damage Given" @ Damagetype @ KFW @ GetPercentage( InDamage, Round(TempDamage) ), bLogPerk );
InDamage = Round( TempDamage ); 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 */ /** Welding Proficiency - faster welding/unwelding */
/** /**
* @brief Modifies the welding speed * @brief Modifies the welding speed
@ -563,13 +600,26 @@ simulated function float GetZedTimeModifier( KFWeapon W )
// Blast Brawlers use a different state for shooting (combining melee + firing). Needs a special case for this // 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 // FAMAS uses alt fire as common firing. Another special case added
// HRG Ballistic Bouncer uses a special state of charging when shooting // HRG Ballistic Bouncer uses a special state of charging when shooting
if( IsWeaponOnPerk( W,, self.class ) && CouldBarrageActive() && if (IsWeaponOnPerk( W,, self.class ) )
(ZedTimeModifyingStates.Find( StateName ) != INDEX_NONE ||
(StateName == 'MeleeChainAttacking' && IsBlastBrawlers(W)) ||
(IsFAMAS(W) && StateName == 'FiringSecondaryState')) ||
(IsHRGBallisticBouncer(W) && StateName == 'MineReconstructorCharge'))
{ {
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; return 0.f;
@ -812,6 +862,7 @@ DefaultProperties
InteractIcon=Texture2D'UI_World_TEX.Support_Supplier_HUD' InteractIcon=Texture2D'UI_World_TEX.Support_Supplier_HUD'
PrimaryWeaponDef=class'KFWeapDef_MB500' PrimaryWeaponDef=class'KFWeapDef_MB500'
KnifeWeaponDef=class'KFWeapDef_Knife_Support' KnifeWeaponDef=class'KFWeapDef_Knife_Support'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Support' GrenadeWeaponDef=class'KFWeapDef_Grenade_Support'
@ -875,4 +926,7 @@ DefaultProperties
AdditionalOnPerkDTNames(0)="KFDT_Ballistic_Shotgun_Medic" AdditionalOnPerkDTNames(0)="KFDT_Ballistic_Shotgun_Medic"
AdditionalOnPerkDTNames(1)="KFDT_Ballistic_DragonsBreath" AdditionalOnPerkDTNames(1)="KFDT_Ballistic_DragonsBreath"
AdditionalOnPerkDTNames(2)="KFDT_Ballistic_NailShotgun" 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 GetGrenadeSelectedIndex() { return CurrentGrenadeClassIndex; }
simulated function byte SetWeaponSelectedIndex(byte idx) simulated static function byte GetWeaponSelectedIndex(byte idx)
{ {
if (idx >= default.PrimaryWeaponPaths.Length && idx < 255) if (idx >= default.PrimaryWeaponPaths.Length && idx < 255)
{ {
StartingWeaponClassIndex = 0; return 0;
}
else if (idx == 255)
{
StartingWeaponClassIndex = `WEAP_IDX_NONE;
}
else
{
StartingWeaponClassIndex = idx;
} }
ServerUpdateCurrentWeapon(StartingWeaponClassIndex); if (idx == 255)
{
return `WEAP_IDX_NONE;
}
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; local KFGameReplicationInfo KFGRI;
@ -953,70 +955,66 @@ simulated function byte SetGrenadeSelectedIndex(byte idx)
{ {
UpdateCurrentGrenade(); 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; local bool AmmoVestActive, BigPocketsActive;
local byte SelectedGrenadeIndex;
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
AmmoVestActive = false; AmmoVestActive = false;
BigPocketsActive = false; BigPocketsActive = false;
if (idx >= default.GrenadeWeaponPaths.Length && idx < 255) if (idx >= default.GrenadeWeaponPaths.Length && idx < 255)
{ {
StartingGrenadeClassIndex = 0; SelectedGrenadeIndex = 0;
} }
else if (idx == 255) else if (idx == 255)
{ {
StartingGrenadeClassIndex = `WEAP_IDX_NONE; SelectedGrenadeIndex = `WEAP_IDX_NONE;
} }
else else
{ {
StartingGrenadeClassIndex = idx; SelectedGrenadeIndex = idx;
if (StartingGrenadeClassIndex == MedicGrenadeIndex || StartingGrenadeClassIndex == FirebugGrenadeIndex) if (SelectedGrenadeIndex == default.MedicGrenadeIndex || SelectedGrenadeIndex == default.FirebugGrenadeIndex)
{ {
AmmoVestActive = InSelectedSkills[2] == 1; AmmoVestActive = InSelectedSkills[2] == 1;
BigPocketsActive = InSelectedSkills[2] == 2; BigPocketsActive = InSelectedSkills[2] == 2;
if (IsChoosingPrev) if (IsChoosingPrev)
{ {
if (StartingGrenadeClassIndex == FirebugGrenadeIndex) if (SelectedGrenadeIndex == default.FirebugGrenadeIndex)
{ {
if (BigPocketsActive == false) if (BigPocketsActive == false)
{ {
--StartingGrenadeClassIndex; --SelectedGrenadeIndex;
} }
} }
if (StartingGrenadeClassIndex == MedicGrenadeIndex) if (SelectedGrenadeIndex == default.MedicGrenadeIndex)
{ {
if (AmmoVestActive == false) if (AmmoVestActive == false)
{ {
--StartingGrenadeClassIndex; --SelectedGrenadeIndex;
} }
} }
} }
else if (IsChoosingNext) else if (IsChoosingNext)
{ {
if (StartingGrenadeClassIndex == MedicGrenadeIndex) if (SelectedGrenadeIndex == default.MedicGrenadeIndex)
{ {
if (AmmoVestActive == false) if (AmmoVestActive == false)
{ {
++StartingGrenadeClassIndex; ++SelectedGrenadeIndex;
} }
} }
if (StartingGrenadeClassIndex == FirebugGrenadeIndex) if (SelectedGrenadeIndex == default.FirebugGrenadeIndex)
{ {
if (BigPocketsActive == false) if (BigPocketsActive == false)
{ {
++StartingGrenadeClassIndex; ++SelectedGrenadeIndex;
} }
} }
} }
@ -1024,32 +1022,26 @@ simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSele
{ {
if (AmmoVestActive) if (AmmoVestActive)
{ {
StartingGrenadeClassIndex = MedicGrenadeIndex; SelectedGrenadeIndex = default.MedicGrenadeIndex;
} }
else if (BigPocketsActive) else if (BigPocketsActive)
{ {
StartingGrenadeClassIndex = FirebugGrenadeIndex; SelectedGrenadeIndex = default.FirebugGrenadeIndex;
} }
else 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 return SelectedGrenadeIndex;
if (!KFGRI.bWaveIsActive)
{
UpdateCurrentGrenade();
}
return StartingGrenadeClassIndex;
} }
simulated function InitializeGrenades() 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 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 SnarePower;
var private const float TacticalMovementBobDamp; 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. 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 */ /** Percentage of how much armor should be damaged when the heavy armor skill is active */
@ -60,6 +59,8 @@ enum ESWATPerkSkills
ESWAT_RapidAssault ESWAT_RapidAssault
}; };
var private const array<class<KFWeaponDefinition> > SecondaryDualWeaponPaths;
replication replication
{ {
if (bNetDirty) if (bNetDirty)
@ -109,12 +110,6 @@ simulated event float GetZedTimeSpeedScale()
return IsSWATEnforcerActive() ? SWATEnforcerZedTimeSpeedScale : 1.f; 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 * @name Passives
********************************************************************************************* */ ********************************************************************************************* */
@ -279,7 +274,8 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
if( KFW != none ) if( KFW != none )
{ {
// KFDT_Bludgeon_Doshinegun_Shot is a special case of Bludgeon damage that doesn't apply this mod. // 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 ); `QALog( "Backup Damage" @ KFW @ GetPercentage( InDamage, InDamage * GetSkillValue(PerkSkills[ESWAT_Backup])), bLogPerk );
TempDamage += InDamage * GetSkillValue( PerkSkills[ESWAT_Backup] ); TempDamage += InDamage * GetSkillValue( PerkSkills[ESWAT_Backup] );
@ -700,12 +696,27 @@ simulated static function GetPassiveStrings( out array<string> PassiveValues, ou
Increments[4] = ""; Increments[4] = "";
} }
simulated function string GetSecondaryWeaponClassPath()
{
if (IsBackupActive())
{
return SecondaryDualWeaponPaths[StartingSecondaryWeaponClassIndex].default.WeaponClassPath;
}
else
{
return SecondaryWeaponPaths[StartingSecondaryWeaponClassIndex].default.WeaponClassPath;
}
}
DefaultProperties DefaultProperties
{ {
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_SWAT' PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_SWAT'
PrimaryWeaponDef=class'KFWeapDef_MP7' 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' KnifeWeaponDef=class'KFweapDef_Knife_SWAT'
GrenadeWeaponDef=class'KFWeapDef_Grenade_SWAT' GrenadeWeaponDef=class'KFWeapDef_Grenade_SWAT'

View File

@ -316,12 +316,40 @@ function GiveWeapon( Pawn P )
local KFInventoryManager KFIM; local KFInventoryManager KFIM;
local Inventory Inv; local Inventory Inv;
// Give us the weapon if we do not have it
InventoryClass = ItemPickups[ PickupIndex ].ItemClass;
// Check if we have the weapon // Check if we have the weapon
KFIM = KFInventoryManager( P.InvManager ); 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 ) foreach KFIM.InventoryActors( class'KFWeapon', KFW )
{ {
KFWeaponClass = class<KFWeapon>( ItemPickups[PickupIndex].ItemClass ); KFWeaponClass = class<KFWeapon>( InventoryClass );
if ( KFW.class == ItemPickups[ PickupIndex ].ItemClass ) if ( KFW.class == InventoryClass )
{ {
// if this isn't a dual-wield class, then we can't carry another // if this isn't a dual-wield class, then we can't carry another
if( KFW.DualClass == none ) 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); Inv = KFIM.CreateInventory(InventoryClass, true);
if( Inv != none ) if( Inv != none )
{ {
KFW = KFWeapon(Inv); KFW = KFWeapon(Inv);
if( KFW != none ) if( KFW != none )
{ {

View File

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

View File

@ -117,6 +117,9 @@ var bool ContaminationModePlayerIsInside;
var int ContaminationModeLastTimePlayerOutPulsate; var int ContaminationModeLastTimePlayerOutPulsate;
var bool ContaminationModeLastPulsate; var bool ContaminationModeLastPulsate;
// Bounty Hunt weekly
var int BountyHuntCurrentExtraZeds;
cpptext cpptext
{ {
virtual UBOOL TestZedTimeVisibility(APawn* P, UNetConnection* Connection, UBOOL bLocalPlayerTest) override; 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() reliable client function ResetSyringe()
{ {
local KFInventoryManager InventoryManager; local KFInventoryManager InventoryManager;
@ -536,15 +560,21 @@ function AdjustDamage(out int InDamage, Controller InstigatedBy, class<DamageTyp
local KFGameInfo KFGI; local KFGameInfo KFGI;
local float Multiplier, ModifierRange, HealthTop, HealthRange; local float Multiplier, ModifierRange, HealthTop, HealthRange;
local KFGameReplicationInfo KFGRI; local KFGameReplicationInfo KFGRI;
local KFPawn_Monster KFPM;
local int BountyHuntZedIt, BountyHuntIt;
local float WaveProgress;
super.AdjustDamage(InDamage, InstigatedBy, DamageType, DamageCauser, DamageReceiver); super.AdjustDamage(InDamage, InstigatedBy, DamageType, DamageCauser, DamageReceiver);
KFGI = KFGameInfo(WorldInfo.Game); KFGI = KFGameInfo(WorldInfo.Game);
if (Pawn != None && KFGI != none && KFGI.OutbreakEvent != none && KFGI.OutbreakEvent.ActiveEvent.bVIPGameMode) if (KFGI != none)
{ {
KFGRI = KFGameReplicationInfo(WorldInfo.GRI); 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 I am the VIP doing the damage, and I am NOT doing damage to myself
if (KFGRI != none if (KFGRI != none
&& KFGRI.VIPRepPlayer != none && KFGRI.VIPRepPlayer != none
@ -598,6 +628,58 @@ function AdjustDamage(out int InDamage, Controller InstigatedBy, class<DamageTyp
InDamage = int(float(InDamage) * Multiplier); 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) function AdjustVIPDamage(out int InDamage, Controller InstigatedBy)

View File

@ -20,6 +20,7 @@ struct native WeaponSkinPairs
var transient array<CustomizationInfo> Characters; var transient array<CustomizationInfo> Characters;
var transient array<string> FavoriteWeapons; var transient array<string> FavoriteWeapons;
var transient array<WeaponSkinPairs> ActiveSkins; var transient array<WeaponSkinPairs> ActiveSkins;
var transient array<string> KilledHansVolterInMaps;
var transient bool Dirty; var transient bool Dirty;
event FavoriteWeapon(name WeaponName) 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 ) event Save( byte ControllerId )
{ {
if(Dirty) if(Dirty)
@ -234,6 +258,7 @@ defaultproperties
ProfileMappings.Add((Id=KFID_FriendlyHudScale, Name="Friendly HUD Scale", MappingType=PVMT_RawValue)) 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_FavoriteWeapons, Name="Favorite Weapons", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_GearLoadouts, Name="Gear Loadouts", 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_SetGamma, Name="Set Gamma", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_RequiresPushToTalk, Name="RequiresPushToTalk", MappingType=PVMT_RawValue)) ProfileMappings.Add((Id=KFID_RequiresPushToTalk, Name="RequiresPushToTalk", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_InvertController, Name="controllerInvertedValue", 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_SavedLengthIndex, Name="SavedLengthIndex", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_SavedPrivacyIndex, Name="SavedPrivacyIndex", 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_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_SavedServerTypeIndex, Name="SavedServerTypeIndex", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_SavedInProgressIndex, Name="SavedInProgressIndex", 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)) 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_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_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_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_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_RequiresPushToTalk,Data=(Type=SDT_Int32,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_InvertController,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_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_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_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_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_SavedInProgressIndex,Data=(Type=SDT_Int32,Value1=0))))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_ControllerSoundEnabled,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)) 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)))) 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(); KFPOwner.EndSpecialMove();
// force stumble when damaged from a grapple // 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)); KFPOwner.DoSpecialMove(SM_Stumble,,, class'KFSM_Stumble'.static.PackBodyHitSMFlags(KFPOwner, HitDir));
} }

View File

@ -81,3 +81,4 @@ simulated function OnHitTaken();
simulated function OnHitGiven(class<DamageType> DT); simulated function OnHitGiven(class<DamageType> DT);
simulated function OnWeaponPurchased(class<KFWeaponDefinition> WeaponDef, int Price); 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_Large,
EST_Medium, EST_Medium,
EST_Small, EST_Small,
EST_Crawler, EST_Crawler
}; };
/** If set, players cannot spawn here, only AI (Versus) */ /** If set, players cannot spawn here, only AI (Versus) */
var() bool bNoPlayers; var() bool bNoPlayers;
@ -154,6 +154,12 @@ var() float UnTouchCoolDownTime;
/** When was the last time a player touched it. */ /** When was the last time a player touched it. */
var protected transient float LastUnTouchTime; 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 Debug
********************************************************************************************* */ ********************************************************************************************* */
@ -503,6 +509,9 @@ DefaultProperties
MaxHeightDiffToPlayers=500.f // 5 meters MaxHeightDiffToPlayers=500.f // 5 meters
LargestSquadType=EST_Large LargestSquadType=EST_Large
bForceUseMapReplacePawn=false
bDisableForBountyHuntSpawn=false
// Debugging // Debugging
bDebugVisibilityChecks=false bDebugVisibilityChecks=false
bMinimalDebugRatingChecks=true bMinimalDebugRatingChecks=true

View File

@ -39,7 +39,8 @@ enum ESharedContentUnlock
SCU_G36C, SCU_G36C,
SCU_HVStormCannon, SCU_HVStormCannon,
SCU_ZedMKIII, SCU_ZedMKIII,
SCU_Saiga12 SCU_Saiga12,
SCU_MG3
}; };
@ -398,4 +399,8 @@ defaultproperties
Name=KFWeap_Shotgun_S12, Name=KFWeap_Shotgun_S12,
IconPath="WEP_UI_Saiga12_TEX.UI_WeaponSelect_Saiga12", IconPath="WEP_UI_Saiga12_TEX.UI_WeaponSelect_Saiga12",
ID=9666)} 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" WeaponClassPath="KFGameContent.KFWeap_SMG_G18"
BuyPrice=1500 BuyPrice=1500
AmmoPricePerMag=24 AmmoPricePerMag=22 // 24
ImagePath="WEP_UI_RiotShield_TEX.UI_WeaponSelect_RiotShield" ImagePath="WEP_UI_RiotShield_TEX.UI_WeaponSelect_RiotShield"
IsPlayGoHidden=true; IsPlayGoHidden=true;

View File

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

View File

@ -12,7 +12,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_HK_UMP" WeaponClassPath="KFGameContent.KFWeap_SMG_HK_UMP"
BuyPrice=1200 BuyPrice=1200
AmmoPricePerMag=36 //45 AmmoPricePerMag=32 // 36 //45
ImagePath="WEP_UI_HK_UMP_TEX.UI_WeaponSelect_UMP" ImagePath="WEP_UI_HK_UMP_TEX.UI_WeaponSelect_UMP"
EffectiveRange=70 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" WeaponClassPath="KFGameContent.KFWeap_HRG_BarrierRifle"
BuyPrice=2000 BuyPrice=2000
AmmoPricePerMag=55 AmmoPricePerMag=50 // 55
ImagePath="wep_ui_hrg_barrierrifle_tex.UI_WeaponSelect_HRG_BarrierRifle" ImagePath="wep_ui_hrg_barrierrifle_tex.UI_WeaponSelect_HRG_BarrierRifle"
IsPlayGoHidden=true; IsPlayGoHidden=true;

View File

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

View File

@ -15,7 +15,7 @@ DefaultProperties
WeaponClassPath="KFGameContent.KFWeap_SMG_Kriss" WeaponClassPath="KFGameContent.KFWeap_SMG_Kriss"
BuyPrice=1500 BuyPrice=1500
AmmoPricePerMag=35 //35 AmmoPricePerMag=31 //35
ImagePath="WEP_UI_KRISS_TEX.UI_WeaponSelect_KRISS" ImagePath="WEP_UI_KRISS_TEX.UI_WeaponSelect_KRISS"
EffectiveRange=70 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" WeaponClassPath="KFGameContent.KFWeap_SMG_MP5RAS"
BuyPrice=650 BuyPrice=650
AmmoPricePerMag=28 //22 //33 AmmoPricePerMag=25 // 28 //22 //33
ImagePath="WEP_UI_MP5RAS_TEX.UI_WeaponSelect_MP5RAS" ImagePath="WEP_UI_MP5RAS_TEX.UI_WeaponSelect_MP5RAS"
EffectiveRange=70 EffectiveRange=70

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -408,7 +408,10 @@ function StartHealRecharge()
if( Role == ROLE_Authority ) if( Role == ROLE_Authority )
{ {
InstigatorPerk = GetPerk(); InstigatorPerk = GetPerk();
UsedHealRechargeTime = HealFullRechargeSeconds * static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex);
UsedHealRechargeTime = HealFullRechargeSeconds;
UsedHealRechargeTime *= static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex);
UsedHealRechargeTime *= InstigatorPerk.GetHealRechargeMod();
InstigatorPerk.ModifyHealerRechargeTime( UsedHealRechargeTime ); InstigatorPerk.ModifyHealerRechargeTime( UsedHealRechargeTime );
// Set the healing recharge rate whenever we start charging // 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 // To force the crosshair for showing up even if there's no spread
var bool bForceCrosshair; var bool bForceCrosshair;
const MinFireIntervalToTriggerSync = 0.23f;
cpptext cpptext
{ {
// Actor // Actor
@ -6563,6 +6565,11 @@ simulated state WeaponFiring
{ {
StopLoopingFireEffects(CurrentFireMode); StopLoopingFireEffects(CurrentFireMode);
} }
if (WorldInfo.NetMode == NM_Client && bAllowClientAmmoTracking && FireInterval[CurrentFireMode] <= MinFireIntervalToTriggerSync)
{
SyncCurrentAmmoCount(CurrentFireMode, AmmoCount[CurrentFireMode]);
}
} }
/** Override to continue any looping fire anims */ /** 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. * Sets the timing for the firing state on server and local client.
* By default, a constant looping Rate Of Fire (ROF) is set up. * By default, a constant looping Rate Of Fire (ROF) is set up.

View File

@ -4736,4 +4736,154 @@ defaultproperties
//S12 Shockgun Tiger //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")) 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 cpptext
{ {
/** Num of Weekly events available */ /** Num of Weekly events available */
static const int NumWeeklyEvents = 20; static const int NumWeeklyEvents = 21;
} }
DefaultProperties DefaultProperties
{ {

View File

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

View File

@ -81,3 +81,6 @@ const KFID_MouseLookRightScale=182; // Halloweeen 2022 QoL: added mouse options
const KFID_ViewSmoothingEnabled=183; // 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_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 FleeDuration,
optional float FleeDistance, optional float FleeDistance,
optional bool bShouldStopAtGoal=false, optional bool bShouldStopAtGoal=false,
optional bool bFromFear=false ) optional bool bFromFear=false,
optional bool bUseRandomDirection=false )
{ {
if( !bFromFear || !MyPatPawn.bInFleeAndHealMode ) 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 ) protected event TriggerDestroyedEvent( Controller EventInstigator )
{ {
local KFMapInfo KFMI; local KFMapInfo KFMI;
local KFPlayerController KFPC;
super.TriggerDestroyedEvent( EventInstigator ); super.TriggerDestroyedEvent( EventInstigator );
@ -27,6 +28,12 @@ protected event TriggerDestroyedEvent( Controller EventInstigator )
{ {
bFound = true; bFound = true;
KFMI.OnCollectibleFound( self, EventInstigator ); 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 // 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; 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 defaultproperties
{ {
KDamageImpulse=1000 KDamageImpulse=1000

View File

@ -40,18 +40,6 @@ static simulated function bool CanDismemberHitZone( name InHitZoneName )
return false; 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 defaultproperties
{ {
GoreDamageGroup=DGT_Shotgun 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) */ /** 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 ) 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) if (default.BleedDamageType.default.DoT_Type != DOT_None)
{ {
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, default.BleedDamageType); 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 abstract
hidedropdown; 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 defaultproperties
{ {
KDamageImpulse=900 KDamageImpulse=900
@ -32,7 +20,6 @@ defaultproperties
StumblePower=10 StumblePower=10
GunHitPower=45 GunHitPower=45
WeaponDef=class'KFWeapDef_MedicRifleGrenadeLauncher' WeaponDef=class'KFWeapDef_MedicRifleGrenadeLauncher'
//Perk //Perk

View File

@ -28,18 +28,6 @@ static simulated function bool CanDismemberHitZone( name InHitZoneName )
return false; 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 defaultproperties
{ {
KDamageImpulse=2000 KDamageImpulse=2000

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