upload
This commit is contained in:
parent
ef3db8a926
commit
ce182019df
@ -140,6 +140,7 @@ var databinding string Region;
|
||||
//@HSL_END
|
||||
|
||||
var databinding bool bNoSeasonalSkins;
|
||||
var databinding int WeeklySelectorIndex;
|
||||
|
||||
/** Represents a player in the game */
|
||||
struct native PlayerResult
|
||||
@ -186,4 +187,5 @@ defaultproperties
|
||||
bServerExiled=false
|
||||
//@SABER_END
|
||||
bNoSeasonalSkins=false
|
||||
WeeklySelectorIndex=-1
|
||||
}
|
||||
|
@ -2315,6 +2315,7 @@ static function DumpGameSettings(const OnlineGameSettings GameSettings)
|
||||
`Log(" bAllowJoinViaPresenceFriendsOnly: "$GameSettings.bAllowJoinViaPresenceFriendsOnly);
|
||||
`Log(" GameState: "$GameSettings.GameState);
|
||||
`Log(" bNoSeasonalSkins: "$GameSettings.bNoSeasonalSkins);
|
||||
`Log(" WeeklySelectorIndex: "$GameSettings.WeeklySelectorIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2543,10 +2543,11 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
|
||||
|
||||
if ( damagetype == None )
|
||||
{
|
||||
if ( InstigatedBy == None )
|
||||
/*if ( InstigatedBy == None )
|
||||
`warn("No damagetype for damage with no instigator");
|
||||
else
|
||||
`warn("No damagetype for damage by "$instigatedby.pawn$" with weapon "$InstigatedBy.Pawn.Weapon);
|
||||
*/
|
||||
//scripttrace();
|
||||
DamageType = class'DamageType';
|
||||
}
|
||||
|
@ -38,6 +38,8 @@ var bool bHaveGoal;
|
||||
/** A randomized distance outside of the target goal to stop at */
|
||||
var float GoalOffset;
|
||||
|
||||
var bool bUseRandomDirection;
|
||||
|
||||
/*********************************************************************************************
|
||||
* Initialization
|
||||
********************************************************************************************* */
|
||||
@ -47,7 +49,8 @@ static function bool FleeFrom(
|
||||
actor inFleeTarget,
|
||||
optional float inFleeDuration,
|
||||
optional float inFleeDistance=5000,
|
||||
optional bool bShouldStopAtGoal=false )
|
||||
optional bool bShouldStopAtGoal=false,
|
||||
optional bool bHasToUseRandomDirection=false )
|
||||
{
|
||||
local AICommand_Flee Cmd;
|
||||
|
||||
@ -60,6 +63,7 @@ static function bool FleeFrom(
|
||||
Cmd.FleeDistance = inFleeDistance;
|
||||
Cmd.FleeDuration = inFleeDuration;
|
||||
Cmd.bStopAtGoal = bShouldStopAtGoal;
|
||||
Cmd.bUseRandomDirection = bHasToUseRandomDirection;
|
||||
AI.PushCommand(Cmd);
|
||||
return true;
|
||||
}
|
||||
@ -113,6 +117,84 @@ function Popped()
|
||||
EnableMeleeRangeEventProbing();
|
||||
}
|
||||
|
||||
function vector GetRandomFleeVector()
|
||||
{
|
||||
local vector VectorReference, VectorReferenceRotated, RandVector, HitLocation, HitNormal, Destination, DestinationRotated, AxxisRotation;
|
||||
local Actor HitActor;
|
||||
local int i, NumIterations;
|
||||
local float Angle, LengthFlee;
|
||||
local Quat R;
|
||||
|
||||
// Start on the bearing of the FleeTarget, check for collision then explore to the sides rotating that vector
|
||||
|
||||
VectorReference = Normal(Pawn.Location - FleeTarget.Location);
|
||||
VectorReference.z = 0.f;
|
||||
|
||||
RandVector = VectorReference;
|
||||
|
||||
LengthFlee = 300.f;
|
||||
//LengthFlee = FleeDistance;
|
||||
|
||||
Destination = Pawn.Location + VectorReference * LengthFlee;
|
||||
|
||||
HitActor = Trace(HitLocation, HitNormal, Destination, Pawn.Location, true,,, TRACEFLAG_Blocking);
|
||||
if (HitActor != none && KFPawnBlockingVolume(HitActor) != none)
|
||||
{
|
||||
//HitActor.DrawDebugLine(Pawn.Location, Destination, 255, 0, 0, true );
|
||||
|
||||
Angle = 15.f * DegToRad;
|
||||
|
||||
NumIterations = 180.f * DegToRad / Angle;
|
||||
|
||||
AxxisRotation.x = 0.f;
|
||||
AxxisRotation.y = 0.f;
|
||||
AxxisRotation.z = 1.f;
|
||||
|
||||
for (i = 1; i < NumIterations; ++i)
|
||||
{
|
||||
// Left
|
||||
|
||||
R = QuatFromAxisAndAngle(AxxisRotation, i * Angle);
|
||||
VectorReferenceRotated = Normal(QuatRotateVector(R, VectorReference));
|
||||
|
||||
DestinationRotated = Pawn.Location + VectorReferenceRotated * LengthFlee;
|
||||
|
||||
HitActor = Trace(HitLocation, HitNormal, DestinationRotated, Pawn.Location, true,,, TRACEFLAG_Blocking);
|
||||
if (HitActor != none && KFPawnBlockingVolume(HitActor) != none)
|
||||
{
|
||||
//Pawn.DrawDebugLine(Pawn.Location, DestinationRotated, 255, 255, 0, true );
|
||||
}
|
||||
else
|
||||
{
|
||||
RandVector = DestinationRotated;
|
||||
break;
|
||||
}
|
||||
|
||||
// Right
|
||||
|
||||
R = QuatFromAxisAndAngle(AxxisRotation, - i * Angle);
|
||||
VectorReferenceRotated = Normal(QuatRotateVector(R, VectorReference));
|
||||
|
||||
DestinationRotated = Pawn.Location + VectorReferenceRotated * LengthFlee;
|
||||
|
||||
HitActor = Trace(HitLocation, HitNormal, DestinationRotated, Pawn.Location, true,,, TRACEFLAG_Blocking);
|
||||
if (HitActor != none && KFPawnBlockingVolume(HitActor) != none)
|
||||
{
|
||||
//Pawn.DrawDebugLine(Pawn.Location, DestinationRotated, 0, 255, 255, true );
|
||||
}
|
||||
else
|
||||
{
|
||||
RandVector = DestinationRotated;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Pawn.DrawDebugLine(Pawn.Location, Pawn.Location + RandVector * LengthFlee, 0, 255, 0, true );
|
||||
|
||||
return Normal(RandVector);
|
||||
}
|
||||
|
||||
/*********************************************************************************************
|
||||
* Hiding state
|
||||
********************************************************************************************* */
|
||||
@ -129,6 +211,7 @@ state Fleeing
|
||||
function bool CheckRetreat()
|
||||
{
|
||||
local EPathSearchType OldSearchType;
|
||||
local vector RandVector;
|
||||
|
||||
if( RouteGoal != none && bHaveGoal )
|
||||
{
|
||||
@ -154,13 +237,27 @@ state Fleeing
|
||||
AIActionStatus = "Searching for navigable path from ["$FleeTarget$"]";
|
||||
|
||||
Pawn.PathSearchType = PST_Constraint;
|
||||
class'Path_AlongLine'.static.AlongLine( Pawn, Normal(Pawn.Location - FleeTarget.Location) );
|
||||
class'Goal_AwayFromPosition'.static.FleeFrom( Pawn, FleeTarget.Location, FleeDistance );
|
||||
|
||||
if (bUseRandomDirection)
|
||||
{
|
||||
MyKFPawn.SetSprinting( true );
|
||||
|
||||
RandVector = GetRandomFleeVector();
|
||||
|
||||
class'Path_AlongLine'.static.AlongLine( Pawn, RandVector );
|
||||
class'Goal_Random'.static.FindRandom( Pawn );
|
||||
}
|
||||
else
|
||||
{
|
||||
class'Path_AlongLine'.static.AlongLine( Pawn, Normal(Pawn.Location - FleeTarget.Location) );
|
||||
class'Goal_AwayFromPosition'.static.FleeFrom( Pawn, FleeTarget.Location, FleeDistance );
|
||||
}
|
||||
|
||||
if( FindPathToward( Pawn ) != None )
|
||||
{
|
||||
//Pawn.DrawDebugLine( RouteGoal.Location, Pawn.Location, 255, 80, 80, true );
|
||||
//Pawn.DrawDebugSphere( RouteGoal.Location, 128, 4, 255, 80, 80, true );
|
||||
|
||||
bHaveGoal = true;
|
||||
AIActionStatus = "Attempting to flee from ["$FleeTarget$"] at ["$RouteGoal$"]";
|
||||
Focus = none;
|
||||
@ -281,4 +378,5 @@ Begin:
|
||||
DefaultProperties
|
||||
{
|
||||
bAllowedToAttack=false
|
||||
bUseRandomDirection=false
|
||||
}
|
@ -24,6 +24,14 @@ static function bool Taunt( KFAIController AI, optional Pawn inTauntTarget, opti
|
||||
|
||||
if( AI != None )
|
||||
{
|
||||
if (AI.MyKFPawn != none)
|
||||
{
|
||||
if (AI.MyKFPawn.bIsBountyHuntObjective)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Cmd = new(AI) default.class;
|
||||
if( Cmd != None )
|
||||
{
|
||||
|
@ -2800,9 +2800,10 @@ function DoFleeFrom( actor FleeFrom,
|
||||
optional float FleeDuration,
|
||||
optional float FleeDistance,
|
||||
optional bool bShouldStopAtGoal=false,
|
||||
optional bool bFromFear=false )
|
||||
optional bool bFromFear=false,
|
||||
optional bool bUseRandomDirection=false )
|
||||
{
|
||||
class'AICommand_Flee'.static.FleeFrom( self, FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal );
|
||||
class'AICommand_Flee'.static.FleeFrom( self, FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bUseRandomDirection );
|
||||
}
|
||||
|
||||
/*
|
||||
@ -5555,6 +5556,11 @@ function HardCoreCheckStuckTimer()
|
||||
|
||||
function bool AmIAllowedToSuicideWhenStuck()
|
||||
{
|
||||
if (MyKFPawn.bIsBountyHuntObjective)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1609,11 +1609,12 @@ function DoFleeFrom( actor FleeFrom,
|
||||
optional float FleeDuration,
|
||||
optional float FleeDistance,
|
||||
optional bool bShouldStopAtGoal=false,
|
||||
optional bool bFromFear=false )
|
||||
optional bool bFromFear=false,
|
||||
optional bool bUseRandomDirection=false )
|
||||
{
|
||||
if( !bFromFear || !MyHansPawn.bInHuntAndHealMode )
|
||||
{
|
||||
super.DoFleeFrom( FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bFromFear );
|
||||
super.DoFleeFrom( FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bFromFear, bUseRandomDirection );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,6 +110,7 @@ enum EAIType
|
||||
AT_EDAR_EMP,
|
||||
AT_EDAR_Laser,
|
||||
AT_EDAR_Rocket,
|
||||
AT_HansClot
|
||||
};
|
||||
|
||||
/** IDs into the BossAIClassList array */
|
||||
@ -234,6 +235,8 @@ static function string ZedTypeToString(EAIType AiTypeToConvert)
|
||||
return "Husk";
|
||||
case AT_BossRandom:
|
||||
return "Hans";
|
||||
case AT_HansClot:
|
||||
return "HansClot";
|
||||
}
|
||||
return "CLOT";
|
||||
`endif
|
||||
@ -479,7 +482,7 @@ function GetSpawnListFromSquad(byte SquadIdx, out array< KFAISpawnSquad > Squads
|
||||
else
|
||||
`endif
|
||||
//Always have the squad type be a boss if we're spawning one in case of override
|
||||
if (OutbreakEvent.ActiveEvent.bBossRushMode)
|
||||
if (OutbreakEvent != none && OutbreakEvent.ActiveEvent.bBossRushMode)
|
||||
{
|
||||
RandBossIndex = Rand(BossRushEnemies.length);
|
||||
TempSpawnList.AddItem( default.AIBossClassList[BossRushEnemies[RandBossIndex]]);
|
||||
|
@ -118,7 +118,7 @@ function float GetDamageModifier()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
DissipationRate=10
|
||||
DissipationRate=50
|
||||
bNeedsTick=true
|
||||
|
||||
MaxStack=3
|
||||
@ -126,7 +126,7 @@ defaultproperties
|
||||
EffectAppliedByStack=0.3f
|
||||
|
||||
ApplyEffectVel= 1.0f // % per second
|
||||
RemoveEffectVel= 1.0f // % per second
|
||||
RemoveEffectVel= 0.9f // % per second
|
||||
|
||||
CurrentStack=0
|
||||
CurrentEffectApplied=0.0f
|
||||
|
@ -171,7 +171,7 @@ defaultproperties
|
||||
EffectAppliedByStack=1.0f
|
||||
|
||||
ApplyEffectVel=100.0f // % per second
|
||||
RemoveEffectVel=0.25f // % per second
|
||||
RemoveEffectVel=0.5f // % per second
|
||||
|
||||
CurrentEffect=0.0f
|
||||
CurrentEffectApplied=0.0f
|
||||
|
@ -32,7 +32,7 @@ var int DoshBuffer;
|
||||
|
||||
var int ArmorMagSize; // Percentage of armor bought individually
|
||||
|
||||
function Initialize(optional bool bInitOwnedItems = true)
|
||||
function Initialize(optional bool bInitializeOwned = true)
|
||||
{
|
||||
if( Pawn != none && PlayerReplicationInfo != none )
|
||||
{
|
||||
@ -42,10 +42,11 @@ function Initialize(optional bool bInitOwnedItems = true)
|
||||
if( MyKFPRI != none && MyKFIM != none )
|
||||
{
|
||||
// Grab the weapons in our inventory and add them to a stored array called OwnedItemList
|
||||
if (bInitOwnedItems)
|
||||
if (bInitializeOwned)
|
||||
{
|
||||
InitializeOwnedItemList();
|
||||
}
|
||||
|
||||
TotalBlocks = MyKFIM.CurrentCarryBlocks;
|
||||
TotalDosh = MyKFPRI.Score;
|
||||
MaxBlocks = MyKFIM.MaxCarryBlocks;
|
||||
@ -989,17 +990,36 @@ function Int GetAutoFillCost()
|
||||
@Name - General
|
||||
*******************/
|
||||
|
||||
function InitializeOwnedGrenade()
|
||||
{
|
||||
local bool AllowGrenades;
|
||||
local KFPawn_Human KFP;
|
||||
|
||||
AllowGrenades = KFGameReplicationInfo( WorldInfo.GRI ).bAllowGrenadePurchase;
|
||||
|
||||
KFP = KFPawn_Human( Pawn );
|
||||
if( KFP != none )
|
||||
{
|
||||
// init grenade purchase values
|
||||
GrenadeItem.SpareAmmoCount = MyKFIM.GrenadeCount;
|
||||
GrenadeItem.MaxSpareAmmo = AllowGrenades ? KFP.GetPerk().MaxGrenadeCount : 0;
|
||||
GrenadeItem.AmmoPricePerMagazine = TraderItems.GrenadePrice;
|
||||
GrenadeItem.DefaultItem.WeaponDef = CurrentPerk.GetGrenadeWeaponDef();
|
||||
|
||||
// @temp: fill in stuff that is normally serialized in the archetype
|
||||
GrenadeItem.DefaultItem.AssociatedPerkClasses[0] = CurrentPerk.Class;
|
||||
}
|
||||
}
|
||||
|
||||
function InitializeOwnedItemList()
|
||||
{
|
||||
local Inventory Inv;
|
||||
local KFWeapon KFW;
|
||||
local KFPawn_Human KFP;
|
||||
local bool AllowGrenades;
|
||||
|
||||
OwnedItemList.length = 0;
|
||||
|
||||
TraderItems = KFGameReplicationInfo( WorldInfo.GRI ).TraderItems;
|
||||
AllowGrenades = KFGameReplicationInfo( WorldInfo.GRI ).bAllowGrenadePurchase;
|
||||
|
||||
KFP = KFPawn_Human( Pawn );
|
||||
if( KFP != none )
|
||||
@ -1010,14 +1030,7 @@ function InitializeOwnedItemList()
|
||||
ArmorItem.AmmoPricePerMagazine = TraderItems.ArmorPrice * CurrentPerk.GetArmorDiscountMod();
|
||||
ArmorItem.DefaultItem.WeaponDef = TraderItems.ArmorDef;
|
||||
|
||||
// init grenade purchase values
|
||||
GrenadeItem.SpareAmmoCount = MyKFIM.GrenadeCount;
|
||||
GrenadeItem.MaxSpareAmmo = AllowGrenades ? KFP.GetPerk().MaxGrenadeCount : 0;
|
||||
GrenadeItem.AmmoPricePerMagazine = TraderItems.GrenadePrice;
|
||||
GrenadeItem.DefaultItem.WeaponDef = CurrentPerk.GetGrenadeWeaponDef();
|
||||
|
||||
// @temp: fill in stuff that is normally serialized in the archetype
|
||||
GrenadeItem.DefaultItem.AssociatedPerkClasses[0] = CurrentPerk.Class;
|
||||
InitializeOwnedGrenade();
|
||||
|
||||
for ( Inv = MyKFIM.InventoryChain; Inv != none; Inv = Inv.Inventory )
|
||||
{
|
||||
@ -1387,7 +1400,8 @@ function RemoveWeaponFromOwnedItemList( optional int OwnedListIdx = INDEX_NONE,
|
||||
|
||||
// add a single to owned items when removing a dual
|
||||
//if( ItemInfo.DefaultItem.SingleClassName != '' )
|
||||
if( ItemInfo.DefaultItem.SingleClassName == 'KFWeap_Pistol_9mm' )
|
||||
if( ItemInfo.DefaultItem.SingleClassName == 'KFWeap_Pistol_9mm'
|
||||
|| ItemInfo.DefaultItem.SingleClassName == 'KFWeap_HRG_93R' )
|
||||
{
|
||||
// When removing a dual, always add a single to the owned list so that it shows up in the player inventory UI.
|
||||
// If we don't own the single, then also buy it (add it to the transaction list).
|
||||
|
@ -5063,6 +5063,10 @@ function class<KFPawn_Monster> LoadMonsterByName(string ZedName, optional bool b
|
||||
{
|
||||
SpawnClass = class<KFPawn_Monster>(DynamicLoadObject("KFGameContent.KFPawn_ZedHusk_New"$VersusSuffix, class'Class'));
|
||||
}
|
||||
else if (Left(ZedName, 5) ~= "HansC")
|
||||
{
|
||||
SpawnClass = class<KFPawn_Monster>(DynamicLoadObject("KFGameContent.KFPawn_ZedHansClot" $ VersusSuffix, class'Class'));
|
||||
}
|
||||
else if( Left(ZedName, 2) ~= "Ha" )
|
||||
{
|
||||
SpawnClass = class<KFPawn_Monster>(DynamicLoadObject("KFGameContent.KFPawn_ZedHans"$VersusSuffix, class'Class'));
|
||||
|
@ -33,6 +33,7 @@ var localized array<string> PermissionStrings;
|
||||
var localized array<string> ConsolePermissionStrings;
|
||||
var localized array<string> ModeStrings;
|
||||
var localized array<string> AllowSeasonalSkinsStrings;
|
||||
var localized array<string> WeeklySelectorStrings;
|
||||
|
||||
var localized string TeamSwappedString;
|
||||
var localized string NoPreferenceString;
|
||||
@ -200,11 +201,26 @@ static function string GetAllowSeasonalSkinsString( float Index )
|
||||
return default.NoPreferenceString;
|
||||
}
|
||||
|
||||
static function string GetWeeklySelectorString( float Index )
|
||||
{
|
||||
if( 0 < default.WeeklySelectorStrings.length && Index < default.WeeklySelectorStrings.length )
|
||||
{
|
||||
return default.WeeklySelectorStrings[Index];
|
||||
}
|
||||
|
||||
return default.NoPreferenceString;
|
||||
}
|
||||
|
||||
static function array<string> GetAllowSeasonalSkinsStringsArray()
|
||||
{
|
||||
return default.AllowSeasonalSkinsStrings;
|
||||
}
|
||||
|
||||
static function array<string> GetWeeklySelectorStringsArray()
|
||||
{
|
||||
return default.WeeklySelectorStrings;
|
||||
}
|
||||
|
||||
static function array<string> GetGameModeStringsArray()
|
||||
{
|
||||
return default.ModeStrings;
|
||||
|
@ -363,6 +363,11 @@ static function int GetDamageeDialogID()
|
||||
return INDEX_NONE;
|
||||
}
|
||||
|
||||
/** Called when damage is dealt to apply additional instant damage */
|
||||
static function ModifyInstantDamage( KFPawn Victim, out int DamageTaken, optional Controller InstigatedBy )
|
||||
{
|
||||
}
|
||||
|
||||
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
|
||||
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
|
||||
{
|
||||
|
@ -389,6 +389,11 @@ function GiveTo(Pawn P)
|
||||
local Inventory NewInventory;
|
||||
local KFInventoryManager KFIM;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
local class<Inventory> NewInventoryClass;
|
||||
|
||||
NewInventoryClass = InventoryClass;
|
||||
|
||||
// For HRG93R and 9mm pistols, if one of the other type is picked just give the one owned
|
||||
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
if (KFGRI != none && KFGRI.bIsEndlessPaused)
|
||||
@ -399,10 +404,33 @@ function GiveTo(Pawn P)
|
||||
KFIM = KFInventoryManager(P.InvManager);
|
||||
if (KFIM != None)
|
||||
{
|
||||
KFWInvClass = class<KFWeapon>(InventoryClass);
|
||||
if (KFIM.Is9mmInInventory())
|
||||
{
|
||||
if (InventoryClass.name == 'KFWeap_HRG_93R')
|
||||
{
|
||||
NewInventoryClass = class<Weapon>(DynamicLoadObject(class'KfWeapDef_9mm'.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
else if (InventoryClass.name == 'KFWeap_HRG_93R_Dual')
|
||||
{
|
||||
NewInventoryClass = class<Weapon>(DynamicLoadObject(class'KfWeapDef_9mmDual'.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(InventoryClass.name == 'KFWeap_Pistol_9mm')
|
||||
{
|
||||
NewInventoryClass = class<Weapon>(DynamicLoadObject(class'KFWeapDef_HRG_93R'.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
else if (InventoryClass.name == 'KFWeap_Pistol_Dual9mm')
|
||||
{
|
||||
NewInventoryClass = class<Weapon>(DynamicLoadObject(class'KFWeapDef_HRG_93R_Dual'.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
}
|
||||
|
||||
KFWInvClass = class<KFWeapon>(NewInventoryClass);
|
||||
foreach KFIM.InventoryActors(class'KFWeapon', KFW)
|
||||
{
|
||||
if (KFW.Class == InventoryClass)
|
||||
if (KFW.Class == NewInventoryClass)
|
||||
{
|
||||
// if this isn't a dual-wield class, then we can't carry another
|
||||
if (KFW.DualClass == none)
|
||||
@ -426,7 +454,7 @@ function GiveTo(Pawn P)
|
||||
return;
|
||||
}
|
||||
|
||||
NewInventory = KFIM.CreateInventory(InventoryClass, true);
|
||||
NewInventory = KFIM.CreateInventory(NewInventoryClass, true);
|
||||
if (NewInventory != none)
|
||||
{
|
||||
// Added extra check in case we want to pick up a non-weapon based pickup
|
||||
|
@ -128,6 +128,7 @@ function UpdateWaveCount()
|
||||
function UpdateZEDCount()
|
||||
{
|
||||
local int CurrentZEDCount;
|
||||
local KFPlayerController_WeeklySurvival KFPC_WS;
|
||||
|
||||
if( KFGRI == none )
|
||||
{
|
||||
@ -149,6 +150,16 @@ function UpdateZEDCount()
|
||||
|
||||
// # of ZEDs left to kill in this wave.
|
||||
CurrentZEDCount = KFGRI.AIRemaining;
|
||||
|
||||
if (KFGRI.IsBountyHunt())
|
||||
{
|
||||
KFPC_WS = KFPlayerController_WeeklySurvival(KFPC);
|
||||
if (KFPC_WS != none)
|
||||
{
|
||||
CurrentZEDCount += KFPC_WS.BountyHuntCurrentExtraZeds;
|
||||
}
|
||||
}
|
||||
|
||||
if(LastZEDCount != CurrentZEDCount)
|
||||
{
|
||||
SetInt("remainingZEDs" ,CurrentZEDCount);
|
||||
|
@ -23,6 +23,7 @@ var KFPlayerController KFPC;
|
||||
|
||||
var const string LockIconPath;
|
||||
var byte LastPerkIndex;
|
||||
var byte PreviewPerkIndex;
|
||||
VAR byte LastPerkLevel;
|
||||
var class<KFPerk> PreviousPerk;
|
||||
var localized string TierUnlockedText;
|
||||
@ -83,7 +84,7 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
|
||||
{
|
||||
DetailsContainer = KFGFxPerksContainer_Details(Widget);//some reason this is coming out to none!
|
||||
DetailsContainer.Initialize( self );
|
||||
DetailsContainer.UpdateDetails(PerkClass, SelectedSkillsHolder, false, false);
|
||||
DetailsContainer.UpdateDetails(PerkClass, SelectedSkillsHolder, false, false, true);
|
||||
DetailsContainer.UpdatePassives(PerkClass);
|
||||
}
|
||||
break;
|
||||
@ -228,6 +229,7 @@ event OnClose()
|
||||
if (bModifiedWeaponIndexes)
|
||||
{
|
||||
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingWeapIdx, KFPC.SurvivalPerkWeapIndex );
|
||||
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingSecondaryWeapIdx, KFPC.SurvivalPerkSecondaryWeapIndex );
|
||||
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingGrenIdx, KFPC.SurvivalPerkGrenIndex );
|
||||
}
|
||||
|
||||
@ -294,6 +296,8 @@ function PerkChanged( byte NewPerkIndex, bool bClickedIndex)
|
||||
}
|
||||
}
|
||||
|
||||
PreviewPerkIndex = NewPerkIndex;
|
||||
|
||||
UpdateContainers( KFPC.PerkList[NewPerkIndex].PerkClass, bClickedIndex );
|
||||
}
|
||||
}
|
||||
@ -340,7 +344,7 @@ function UpdateContainers( class<KFPerk> PerkClass, optional bool bClickedIndex=
|
||||
|
||||
if( DetailsContainer != none )
|
||||
{
|
||||
DetailsContainer.UpdateDetails( PerkClass, SelectedSkillsHolder, false, false );
|
||||
DetailsContainer.UpdateDetails( PerkClass, SelectedSkillsHolder, false, false, true );
|
||||
DetailsContainer.UpdatePassives( PerkClass );
|
||||
}
|
||||
|
||||
@ -480,10 +484,7 @@ function Callback_SkillSelected( byte TierIndex, byte SkillIndex )
|
||||
UpdateSkillsUI(KFPC.PerkList[LastPerkIndex].PerkClass);
|
||||
SavePerkData();
|
||||
|
||||
if ( KFPC.PerkList[LastPerkIndex].PerkClass.Name == 'KFPerk_Survivalist' )
|
||||
{
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, false );
|
||||
}
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, false, true );
|
||||
}
|
||||
}
|
||||
|
||||
@ -496,50 +497,207 @@ function Callback_SkillSelectionOpened()
|
||||
}
|
||||
}
|
||||
|
||||
function bool CanChooseWeapons()
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
KFGRI = KFGameReplicationInfo(KFPC.WorldInfo.GRI);
|
||||
|
||||
if (KFPC != none)
|
||||
{
|
||||
if (KFPC.Pawn.IsAliveAndWell() == false
|
||||
|| KFPC.PlayerReplicationInfo.bIsSpectator
|
||||
|| KFPC.PlayerReplicationInfo.bOnlySpectator)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (KFGRI != none)
|
||||
{
|
||||
if (KFGRI.WaveNum == 0)
|
||||
{
|
||||
if (KFGRI.bWaveStarted)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function OnPrevWeaponPressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
local bool bUpdateUI;
|
||||
|
||||
if (CanChooseWeapons() == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bUpdateUI = true;
|
||||
|
||||
if (GetPC().PlayerInput.bUsingGamepad)
|
||||
{
|
||||
if (PreviewPerkIndex != LastPerkIndex)
|
||||
{
|
||||
bUpdateUI = false;
|
||||
}
|
||||
}
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnPrevWeaponSelected();
|
||||
KFPC.SurvivalPerkWeapIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false );
|
||||
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, true, false, bUpdateUI );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
function OnNextWeaponPressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
local bool bUpdateUI;
|
||||
|
||||
if (CanChooseWeapons() == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bUpdateUI = true;
|
||||
|
||||
if (GetPC().PlayerInput.bUsingGamepad)
|
||||
{
|
||||
if (PreviewPerkIndex != LastPerkIndex)
|
||||
{
|
||||
bUpdateUI = false;
|
||||
}
|
||||
}
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnNextWeaponSelected();
|
||||
KFPC.SurvivalPerkWeapIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, true );
|
||||
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, false, true, bUpdateUI );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
function OnPrevSecondaryWeaponPressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
local bool bUpdateUI;
|
||||
|
||||
if (CanChooseWeapons() == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bUpdateUI = true;
|
||||
|
||||
if (GetPC().PlayerInput.bUsingGamepad)
|
||||
{
|
||||
if (PreviewPerkIndex != LastPerkIndex)
|
||||
{
|
||||
bUpdateUI = false;
|
||||
}
|
||||
}
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnPrevSecondaryWeaponSelected();
|
||||
KFPC.SurvivalPerkSecondaryWeapIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, true, false, bUpdateUI );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
function OnNextSecondaryWeaponPressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
local bool bUpdateUI;
|
||||
|
||||
if (CanChooseWeapons() == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bUpdateUI = true;
|
||||
|
||||
if (GetPC().PlayerInput.bUsingGamepad)
|
||||
{
|
||||
if (PreviewPerkIndex != LastPerkIndex)
|
||||
{
|
||||
bUpdateUI = false;
|
||||
}
|
||||
}
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnNextSecondaryWeaponSelected();
|
||||
KFPC.SurvivalPerkSecondaryWeapIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, false, true, bUpdateUI );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
function OnPrevGrenadePressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
local bool bUpdateUI;
|
||||
|
||||
bUpdateUI = true;
|
||||
|
||||
if (GetPC().PlayerInput.bUsingGamepad)
|
||||
{
|
||||
if (PreviewPerkIndex != LastPerkIndex)
|
||||
{
|
||||
bUpdateUI = false;
|
||||
}
|
||||
}
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnPrevGrenadeSelected();
|
||||
KFPC.SurvivalPerkGrenIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false );
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, true, false, bUpdateUI );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
function OnNextGrenadePressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
local bool bUpdateUI;
|
||||
|
||||
bUpdateUI = true;
|
||||
|
||||
if (GetPC().PlayerInput.bUsingGamepad)
|
||||
{
|
||||
if (PreviewPerkIndex != LastPerkIndex)
|
||||
{
|
||||
bUpdateUI = false;
|
||||
}
|
||||
}
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnNextGrenadeSelected();
|
||||
KFPC.SurvivalPerkGrenIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, true );
|
||||
DetailsContainer.UpdateDetails( KFPC.PerkList[LastPerkIndex].PerkClass, SelectedSkillsHolder, false, true, bUpdateUI );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
function OnDpadPressed(int Right)
|
||||
{
|
||||
if (GetPC().PlayerInput.bUsingGamepad)
|
||||
{
|
||||
if (Right > 0)
|
||||
{
|
||||
OnNextSecondaryWeaponPressed();
|
||||
}
|
||||
else
|
||||
{
|
||||
OnPrevSecondaryWeaponPressed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
event bool OnAxisModified( int ControllerId, name Key, float Delta, float DeltaTime, bool bGamepad )
|
||||
{
|
||||
if (GetPC().PlayerInput.bUsingGamepad )
|
||||
@ -611,6 +769,7 @@ defaultproperties
|
||||
SubWidgetBindings.Add((WidgetName="DetailsContainer",WidgetClass= class'KFGFxPerksContainer_Details'))
|
||||
SubWidgetBindings.Add((WidgetName="SelectedPerkSummaryContainer",WidgetClass=class'KFGFxPerksContainer_SkillsSummary'))
|
||||
LastPerkIndex=255
|
||||
PreviewPerkIndex=255
|
||||
LastPerkLevel=255
|
||||
|
||||
bAxisResetLeft=true
|
||||
|
@ -79,6 +79,11 @@ function LocalizeText()
|
||||
{
|
||||
local GFxObject TextObject;
|
||||
local WorldInfo WI;
|
||||
local bool bIsCustomWeekly;
|
||||
local int IntendedWeeklyIndex, WeeklyIndex;
|
||||
local KFPlayerController KFPC;
|
||||
|
||||
KFPC = KFPlayerController(GetPC());
|
||||
|
||||
WI = class'WorldInfo'.static.GetWorldInfo();
|
||||
|
||||
@ -90,7 +95,34 @@ function LocalizeText()
|
||||
TextObject.SetString("xp", XPString);
|
||||
TextObject.SetString("teamAwards", TeamAwardsString);
|
||||
|
||||
TextObject.SetString("dropTitle", ItemDropTitleString);
|
||||
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
|
||||
WeeklyIndex = -1;
|
||||
|
||||
if (KFPC.WorldInfo.NetMode == NM_Client)
|
||||
{
|
||||
if (KFGameReplicationInfo(WI.GRI) != none)
|
||||
{
|
||||
WeeklyIndex = KFGameReplicationInfo(WI.GRI).CurrentWeeklyIndex;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod();
|
||||
}
|
||||
|
||||
if (WeeklyIndex != -1)
|
||||
{
|
||||
bIsCustomWeekly = IntendedWeeklyIndex != WeeklyIndex;
|
||||
}
|
||||
|
||||
if (bIsCustomWeekly)
|
||||
{
|
||||
TextObject.SetString("dropTitle", "");
|
||||
}
|
||||
else
|
||||
{
|
||||
TextObject.SetString("dropTitle", ItemDropTitleString);
|
||||
}
|
||||
|
||||
if(WI != none && WI.NetMode != NM_Standalone )
|
||||
{
|
||||
|
@ -31,6 +31,7 @@ var localized string BackString;
|
||||
var localized string ApplyString;
|
||||
var localized string ResetString;
|
||||
var localized string PingString;
|
||||
var localized string WeeklyIndexString;
|
||||
var localized string LengthString;
|
||||
var localized string DifficultyString;
|
||||
var localized string MapString;
|
||||
@ -263,6 +264,12 @@ function Callback_PingFilter(int FilterIndex)
|
||||
FiltersContainer.PingChanged(FilterIndex);
|
||||
}
|
||||
|
||||
function Callback_WeeklySelectorChanged(int FilterIndex)
|
||||
{
|
||||
`log("WeeklySelector" @ FilterIndex, bLogServerBrowser);
|
||||
FiltersContainer.WeeklySelectorChanged(FilterIndex);
|
||||
}
|
||||
|
||||
function CallBack_SearchTabChanged(int TabIndex)
|
||||
{
|
||||
`log("SEARCH TAB CHANGED: " @TabIndex, bLogServerBrowser);
|
||||
|
@ -74,6 +74,8 @@ var KFGFxWidget_MapCounterText MapCounterTextWidget;
|
||||
var KFGFxWidget_GunGame GunGameWidget;
|
||||
// Widget that displays vip mode texts
|
||||
var KFGFxWidget_VIP VIPWidget;
|
||||
// Widget that displays bounty hunt mode texts
|
||||
var KFGFxWidget_BountyHunt BountyHuntWidget;
|
||||
|
||||
var KFPlayerController KFPC;
|
||||
|
||||
@ -112,6 +114,9 @@ var transient bool bLastGunGameVisibility;
|
||||
// VIP variables
|
||||
var transient bool bLastVIPVisibility;
|
||||
|
||||
// Bounty Hunt variables
|
||||
var transient bool bLastBountyHuntVisibility;
|
||||
|
||||
/** On creation of the HUD */
|
||||
function Init(optional LocalPlayer LocPlay)
|
||||
{
|
||||
@ -372,6 +377,13 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
|
||||
SetWidgetPathBinding( Widget, WidgetPath );
|
||||
}
|
||||
break;
|
||||
case 'BountyHuntContainer':
|
||||
if (BountyHuntWidget == none)
|
||||
{
|
||||
BountyHuntWidget = KFGFxWidget_BountyHunt(Widget);
|
||||
SetWidgetPathBinding( Widget, WidgetPath );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -400,12 +412,15 @@ function UpdateWeaponSelect()
|
||||
/** Update all the unique HUD pieces */
|
||||
function TickHud(float DeltaTime)
|
||||
{
|
||||
local bool bGunGameVisibility, bVIPModeVisibility;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
local bool bGunGameVisibility, bVIPModeVisibility, bBountyHuntVisibility;
|
||||
|
||||
if(KFPC == none || KFPC.WorldInfo.TimeSeconds - LastUpdateTime < UpdateInterval )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
KFGRI=KFGameReplicationInfo(KFPC.WorldInfo.GRI);
|
||||
|
||||
if (WaveInfoWidget != none)
|
||||
{
|
||||
@ -498,6 +513,26 @@ function TickHud(float DeltaTime)
|
||||
bLastVIPVisibility = bVIPModeVisibility;
|
||||
}
|
||||
}
|
||||
|
||||
if (BountyHuntWidget != none)
|
||||
{
|
||||
bBountyHuntVisibility = KFPC.CanUseBountyHunt();
|
||||
|
||||
if (KFGRI.bWaveIsActive == false)
|
||||
{
|
||||
bBountyHuntVisibility = false;
|
||||
}
|
||||
else if (KFGRI.WaveNum == KFGRI.WaveMax)
|
||||
{
|
||||
bBountyHuntVisibility = false;
|
||||
}
|
||||
|
||||
if (bBountyHuntVisibility != bLastBountyHuntVisibility)
|
||||
{
|
||||
BountyHuntWidget.UpdateBountyHuntVisibility(bBountyHuntVisibility);
|
||||
bLastBountyHuntVisibility = bBountyHuntVisibility;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function UpdateObjectiveActive()
|
||||
@ -1001,6 +1036,36 @@ simulated function DisplayObjectiveResults()
|
||||
}
|
||||
}
|
||||
|
||||
simulated function DisplayBountyHuntObjective(int Bounties)
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
local GFxObject ObjectiveObject;
|
||||
local string BountyHuntString;
|
||||
|
||||
KFGRI=KFGameReplicationInfo(KFPC.WorldInfo.GRI);
|
||||
|
||||
ObjectiveObject=CreateObject("Object");
|
||||
|
||||
ObjectiveObject.SetString("titleString", Localize("Objectives", "BountyHuntObjective", "KFGame"));
|
||||
|
||||
if (KFGRI.IsBountyHunt())
|
||||
{
|
||||
ObjectiveObject.SetString("nameString", Localize("Objectives", "BountyHuntObjective", "KFGame"));
|
||||
|
||||
BountyHuntString = Localize("Objectives", "BountyHuntObjectiveDescription", "KFGame")@Bounties@Localize("Objectives", "BountyHuntDescriptionAdd", "KFGame");
|
||||
|
||||
ObjectiveObject.SetString("descString", BountyHuntString);
|
||||
|
||||
ObjectiveObject.SetString("iconPath", "img://"$PathName(Texture2D'WeeklyObjective_UI.BountyHunt'));
|
||||
}
|
||||
|
||||
ObjectiveObject.SetBool("isBonus", false);
|
||||
|
||||
KFGRI.PreviousObjectiveResult=INDEX_NONE;
|
||||
PriorityMessageContainer.SetObject("objectiveMessage", ObjectiveObject);
|
||||
LastMessageType=GMT_Null;
|
||||
}
|
||||
|
||||
simulated function DisplayNewObjective()
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
@ -1022,7 +1087,6 @@ simulated function DisplayNewObjective()
|
||||
ObjectiveObject.SetString("nameString", Localize("Objectives", "ContaminationModeObjective", "KFGame"));
|
||||
ObjectiveObject.SetString("descString", Localize("Objectives", "ContaminationModeDescription", "KFGame"));
|
||||
|
||||
// TODO :: CHANGE ICON
|
||||
ObjectiveObject.SetString("iconPath", "img://"$PathName(ObjectiveInterface.GetIcon()));
|
||||
}
|
||||
else
|
||||
@ -1249,6 +1313,14 @@ function HideContaminationMode()
|
||||
}
|
||||
}
|
||||
|
||||
function DisplayBountyHuntStatus(int Bounties, int Dosh, int DoshNoAssist)
|
||||
{
|
||||
if (BountyHuntWidget != none)
|
||||
{
|
||||
BountyHuntWidget.SetData(Bounties, Dosh, DoshNoAssist);
|
||||
}
|
||||
}
|
||||
|
||||
function ResetSyringe(float Ammo, float MaxAmmo)
|
||||
{
|
||||
if (PlayerStatusContainer != none)
|
||||
@ -1613,6 +1685,7 @@ DefaultProperties
|
||||
|
||||
bLastGunGameVisibility=true
|
||||
bLastVIPVisibility=true
|
||||
bLastBountyHuntVisibility=true
|
||||
|
||||
WidgetBindings.Add((WidgetName="ObjectiveContainer",WidgetClass=class'KFGFxHUD_ObjectiveConatiner'))
|
||||
WidgetBindings.Add((WidgetName="SpectatorInfoWidget",WidgetClass=class'KFGFxHUD_SpectatorInfo'))
|
||||
@ -1640,6 +1713,7 @@ DefaultProperties
|
||||
WidgetBindings.Add((WidgetName="counterMapTextWidget", WidgetClass=class'KFGFxWidget_MapCounterText'))
|
||||
WidgetBindings.ADD((WidgetName="GunGameContainer", WidgetClass=class'KFGFxWidget_GunGame'));
|
||||
WidgetBindings.ADD((WidgetName="VIPContainer", WidgetClass=class'KFGFxWidget_VIP'));
|
||||
WidgetBindings.ADD((WidgetName="BountyHuntContainer", WidgetClass=class'KFGFxWidget_BountyHunt'));
|
||||
|
||||
SpecialWaveIconPath(AT_Clot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Cyst"
|
||||
SpecialWaveIconPath(AT_SlasherClot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Slasher"
|
||||
@ -1653,6 +1727,7 @@ DefaultProperties
|
||||
SpecialWaveIconPath(AT_Bloat)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Bloat"
|
||||
SpecialWaveIconPath(AT_Siren)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Siren"
|
||||
SpecialWaveIconPath(AT_Husk)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Husk"
|
||||
SpecialWaveIconPath(AT_HansClot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Cyst"
|
||||
|
||||
SpecialWaveLocKey(AT_SlasherClot)="KFPawn_ZedClot_Slasher"
|
||||
SpecialWaveLocKey(AT_Clot)="KFPawn_ZedClot_Cyst"
|
||||
@ -1665,5 +1740,6 @@ DefaultProperties
|
||||
SpecialWaveLocKey(AT_GoreFast)="KFPawn_ZedGorefast"
|
||||
SpecialWaveLocKey(AT_Bloat)="KFPawn_ZedBloat"
|
||||
SpecialWaveLocKey(AT_FleshPound)="KFPawn_ZedFleshpound"
|
||||
SpecialWaveLocKey(AT_HansClot)="KFPawn_ZedClot_Cyst"
|
||||
|
||||
}
|
||||
|
@ -25,12 +25,47 @@ function LocalizeContainer()
|
||||
GetObject("basicLoadoutTextField").SetString("text", BasicLoadoutString);
|
||||
}
|
||||
|
||||
function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC, byte WeaponIdx, byte GrenadeIdx)
|
||||
function bool CanChooseWeapons(KFPlayerController KFPC)
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
KFGRI = KFGameReplicationInfo(KFPC.WorldInfo.GRI);
|
||||
|
||||
if (KFPC != none)
|
||||
{
|
||||
if (KFPC.Pawn.IsAliveAndWell() == false
|
||||
|| KFPC.PlayerReplicationInfo.bIsSpectator
|
||||
|| KFPC.PlayerReplicationInfo.bOnlySpectator)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (KFGRI != none)
|
||||
{
|
||||
if (KFGRI.WaveNum == 0)
|
||||
{
|
||||
if (KFGRI.bWaveStarted)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC, byte WeaponIdx, byte SecondaryWeaponIdx, byte GrenadeIdx)
|
||||
{
|
||||
local GFxObject DetailsProvider;
|
||||
local array<string> WeaponNames;
|
||||
local array<string> WeaponSources;
|
||||
local int i;
|
||||
local bool CanIChooseWeapons;
|
||||
|
||||
DetailsProvider = CreateObject( "Object" );
|
||||
|
||||
@ -41,9 +76,9 @@ function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC,
|
||||
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.static.GetPrimaryWeaponName(WeaponIdx), PerkClass.static.GetPrimaryWeaponImagePath(WeaponIdx));
|
||||
}
|
||||
|
||||
if(PerkClass.default.SecondaryWeaponDef != none)
|
||||
if(PerkClass.default.SecondaryWeaponPaths.Length > 0)
|
||||
{
|
||||
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.SecondaryWeaponDef.static.GetItemName(), PerkClass.default.SecondaryWeaponDef.static.GetImagePath());
|
||||
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.static.GetSecondaryWeaponName(SecondaryWeaponIdx), PerkClass.static.GetSecondaryWeaponImagePath(SecondaryWeaponIdx));
|
||||
}
|
||||
if(PerkClass.default.KnifeWeaponDef != none)
|
||||
{
|
||||
@ -61,18 +96,22 @@ function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC,
|
||||
}
|
||||
|
||||
DetailsProvider.SetString( "EXPAction1", PerkClass.default.EXPAction1 );
|
||||
DetailsProvider.SetString( "EXPAction2", PerkClass.default.EXPAction2 );
|
||||
DetailsProvider.SetString( "EXPAction2", PerkClass.default.EXPAction2 );
|
||||
|
||||
CanIChooseWeapons = CanChooseWeapons(KFPC);
|
||||
|
||||
DetailsProvider.SetBool("ShowPrimaryWeaponSelectors", CanIChooseWeapons && PerkClass.static.CanChoosePrimaryWeapon());
|
||||
DetailsProvider.SetBool("ShowSecondaryWeaponSelectors", CanIChooseWeapons && PerkClass.static.CanChooseSecondaryWeapon());
|
||||
|
||||
DetailsProvider.SetBool("ShowPrimaryWeaponSelectors", PerkClass.static.CanChoosePrimaryWeapon());
|
||||
DetailsProvider.SetBool("ShowGrenadeSelectors", PerkClass.static.CanChooseGrenade());
|
||||
|
||||
SetObject( "detailsData", DetailsProvider );
|
||||
}
|
||||
|
||||
function UpdateDetails(class<KFPerk> PerkClass, byte SelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
|
||||
function UpdateDetails(class<KFPerk> PerkClass, byte SelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext, bool UpdateUI)
|
||||
{
|
||||
local KFPlayerController KFPC;
|
||||
local byte WeaponIdx, GrenadeIdx;
|
||||
local byte WeaponIdx, SecondaryWeaponIdx, GrenadeIdx;
|
||||
|
||||
KFPC = KFPlayerController( GetPC() );
|
||||
|
||||
@ -82,11 +121,15 @@ function UpdateDetails(class<KFPerk> PerkClass, byte SelectedSkills[`MAX_PERK_SK
|
||||
}
|
||||
|
||||
WeaponIdx = 0;
|
||||
SecondaryWeaponIdx = 0;
|
||||
GrenadeIdx = 0;
|
||||
|
||||
UpdateAndGetCurrentWeaponIndexes(PerkClass, KFPC, WeaponIdx, GrenadeIdx, SelectedSkills, IsChoosingPrev, IsChoosingNext);
|
||||
UpdateAndGetCurrentWeaponIndexes(PerkClass, KFPC, WeaponIdx, SecondaryWeaponIdx, GrenadeIdx, SelectedSkills, IsChoosingPrev, IsChoosingNext);
|
||||
|
||||
UpdateDetailsInternal(PerkClass, KFPC, WeaponIdx, GrenadeIdx);
|
||||
if (UpdateUI)
|
||||
{
|
||||
UpdateDetailsInternal(PerkClass, KFPC, WeaponIdx, SecondaryWeaponIdx, GrenadeIdx);
|
||||
}
|
||||
}
|
||||
|
||||
function AddWeaponInfo(out array<string> WeaponNames, out array<string> WeaponSources, string WeaponName, string WeaponSource)
|
||||
@ -123,12 +166,35 @@ function UpdatePassives(Class<KFPerk> PerkClass)
|
||||
SetObject( "passivesData", PassivesProvider );
|
||||
}
|
||||
|
||||
function UpdateAndGetCurrentWeaponIndexes(class<KFPerk> PerkClass, KFPlayerController KFPC, out byte WeaponIdx, out byte GrenadeIdx
|
||||
function UpdateAndGetCurrentWeaponIndexes(class<KFPerk> PerkClass, KFPlayerController KFPC, out byte WeaponIdx, out byte SecondaryWeaponIdx, out byte GrenadeIdx
|
||||
, byte SelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
KFGRI = KFGameReplicationInfo(KFPC.WorldInfo.GRI);
|
||||
|
||||
SecondaryWeaponIdx = PerkClass.static.GetSecondaryWeaponSelectedIndex(KFPC.SurvivalPerkSecondaryWeapIndex);
|
||||
|
||||
if (KFPC.CurrentPerk.Class.Name == PerkClass.Name)
|
||||
{
|
||||
KFPC.CurrentPerk.StartingSecondaryWeaponClassIndex = SecondaryWeaponIdx;
|
||||
}
|
||||
|
||||
if (PerkClass.Name == 'KFPerk_Survivalist')
|
||||
{
|
||||
WeaponIdx = KFPC.CurrentPerk.SetWeaponSelectedIndex(KFPC.SurvivalPerkWeapIndex);
|
||||
GrenadeIdx = KFPC.CurrentPerk.SetGrenadeSelectedIndexUsingSkills(KFPC.SurvivalPerkGrenIndex, SelectedSkills, IsChoosingPrev, IsChoosingNext);
|
||||
WeaponIdx = PerkClass.static.GetWeaponSelectedIndex(KFPC.SurvivalPerkWeapIndex);
|
||||
GrenadeIdx = PerkClass.static.GetGrenadeSelectedIndexUsingSkills(KFPC.SurvivalPerkGrenIndex, SelectedSkills, IsChoosingPrev, IsChoosingNext);
|
||||
|
||||
if (KFPC.CurrentPerk.Class.Name == PerkClass.Name)
|
||||
{
|
||||
KFPerk_Survivalist(KFPC.CurrentPerk).StartingWeaponClassIndex = WeaponIdx;
|
||||
KFPerk_Survivalist(KFPC.CurrentPerk).StartingGrenadeClassIndex = GrenadeIdx;
|
||||
|
||||
// If we are in no gameplay time insta change
|
||||
if (!KFGRI.bWaveIsActive)
|
||||
{
|
||||
KFPerk_Survivalist(KFPC.CurrentPerk).UpdateCurrentGrenade();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -55,11 +55,13 @@ function SetMapOptions()
|
||||
local array<string> ServerMapList;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
local bool IsWeeklyMode;
|
||||
local bool IsBrokenTrader;
|
||||
local bool IsBossRush;
|
||||
local bool IsGunGame;
|
||||
local bool IsContaminationMode;
|
||||
local bool bShouldSkipMaps;
|
||||
local bool bWeeklyNoSanta;
|
||||
|
||||
local bool IsBoom, IsCraniumCracker, IsTinyTerror, IsBobbleZed, IsPoundemonium, IsUpUpAndDecay, IsZedTime, IsBeefcake;
|
||||
local bool IsBloodThirst, IsColiseum, IsArachnophobia, IsScavenger, IsWW, IsAbandon, IsBossRush, IsShrunkenHeads;
|
||||
local bool IsGunGame, /*IsVIP,*/ IsPerkRoulette, IsContaminationMode, IsBountyHunt;
|
||||
|
||||
local name MapName;
|
||||
|
||||
KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI);
|
||||
@ -70,13 +72,62 @@ function SetMapOptions()
|
||||
if(KFGRI != none && KFGRI.VoteCollector != none)
|
||||
{
|
||||
ServerMapList = KFGRI.VoteCollector.MapList;
|
||||
IsWeeklyMode = KFGRI.bIsWeeklyMode;
|
||||
IsBrokenTrader = KFGRI.CurrentWeeklyIndex == 11;
|
||||
IsBossRush = KFGRI.CurrentWeeklyIndex == 14;
|
||||
IsGunGame = KFGRI.CurrentWeeklyIndex == 16;
|
||||
IsContaminationMode = KFGRI.CurrentWeeklyIndex == 19;
|
||||
|
||||
bShouldSkipMaps = IsWeeklyMode && (IsBrokenTrader || IsBossRush || IsGunGame);
|
||||
IsWeeklyMode = KFGRI.bIsWeeklyMode;
|
||||
|
||||
IsBoom = false;
|
||||
IsCraniumCracker = false;
|
||||
IsTinyTerror = false;
|
||||
IsBobbleZed = false;
|
||||
IsPoundemonium = false;
|
||||
IsUpUpAndDecay = false;
|
||||
IsZedTime = false;
|
||||
IsBeefcake = false;
|
||||
IsBloodThirst = false;
|
||||
IsColiseum = false;
|
||||
IsArachnophobia = false;
|
||||
IsScavenger = false;
|
||||
IsWW = false;
|
||||
IsAbandon = false;
|
||||
IsBossRush = false;
|
||||
IsShrunkenHeads = false;
|
||||
IsGunGame = false;
|
||||
//IsVIP = false;
|
||||
IsPerkRoulette = false;
|
||||
IsContaminationMode = false;
|
||||
IsBountyHunt = false;
|
||||
|
||||
switch (KFGRI.CurrentWeeklyIndex)
|
||||
{
|
||||
case 0: IsBoom = true; break;
|
||||
case 1: IsCraniumCracker = true; break;
|
||||
case 2: IsTinyTerror = true; break;
|
||||
case 3: IsBobbleZed = true; break;
|
||||
case 4: IsPoundemonium = true; break;
|
||||
case 5: IsUpUpAndDecay = true; break;
|
||||
case 6: IsZedTime = true; break;
|
||||
case 7: IsBeefcake = true; break;
|
||||
case 8: IsBloodThirst = true; break;
|
||||
case 9: IsColiseum = true; break;
|
||||
case 10: IsArachnophobia = true; break;
|
||||
case 11: IsScavenger = true; break;
|
||||
case 12: IsWW = true; break;
|
||||
case 13: IsAbandon = true; break;
|
||||
case 14: IsBossRush = true; break;
|
||||
case 15: IsShrunkenHeads = true; break;
|
||||
case 16: IsGunGame = true; break;
|
||||
//case 17: IsVIP = true; break;
|
||||
case 18: IsPerkRoulette = true; break;
|
||||
case 19: IsContaminationMode = true; break;
|
||||
case 20: IsBountyHunt = true; break;
|
||||
}
|
||||
|
||||
bShouldSkipMaps = IsWeeklyMode && (IsScavenger || IsBossRush || IsGunGame);
|
||||
|
||||
bWeeklyNoSanta = IsWeeklyMode && ( IsBoom || IsCraniumCracker || IsTinyTerror || IsBobbleZed
|
||||
|| IsPoundemonium || IsUpUpAndDecay || IsZedTime || IsBeefcake
|
||||
|| IsBloodThirst || IsColiseum || IsArachnophobia || IsScavenger
|
||||
|| IsWW || IsAbandon || IsShrunkenHeads || IsPerkRoulette);
|
||||
|
||||
//gfx
|
||||
MapList = CreateArray();
|
||||
@ -85,6 +136,11 @@ function SetMapOptions()
|
||||
{
|
||||
MapName = name(ServerMapList[i]);
|
||||
|
||||
if (bWeeklyNoSanta && MapName == MapSantas)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( bShouldSkipMaps && ( MapName == MapBiolapse ||
|
||||
MapName == MapNightmare ||
|
||||
MapName == MapPowerCore ||
|
||||
@ -108,12 +164,24 @@ function SetMapOptions()
|
||||
}
|
||||
}
|
||||
|
||||
/* Temporary removal of SteamFrotress for BossRush */
|
||||
if (IsWeeklyMode && IsBountyHunt)
|
||||
{
|
||||
if (MapName == MapBiolapse ||
|
||||
MapName == MapNightmare ||
|
||||
MapName == MapPowerCore ||
|
||||
MapName == MapDescent ||
|
||||
MapName == MapKrampus ||
|
||||
MapName == MapElysium ||
|
||||
MapName == MapSteam)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (IsWeeklyMode && IsBossRush && MapName == MapSteam)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
/* */
|
||||
|
||||
MapObject = CreateObject("Object");
|
||||
MapObject.SetString("label", class'KFCommon_LocalizedStrings'.static.GetFriendlyMapName(ServerMapList[i]) );
|
||||
|
@ -17,10 +17,10 @@ var localized string NoPasswordString, NoMutatorsString, NotFullString, NotEmpty
|
||||
var array<string> FilterStrings;
|
||||
|
||||
var config Bool bNoPassword, bNoMutators, bNotFull, bNotEmpty, bUsesStats, bCustom, bDedicated, bVAC_Secure, bInLobby, bInProgress, bOnlyStockMaps, bOnlyCustomMaps, bLimitServerResults, bNoLocalAdmin, bNoSeasonalSkins;
|
||||
var config byte SavedGameModeIndex, SavedMapIndex, SavedDifficultyIndex, SavedLengthIndex, SavedPingIndex;
|
||||
var config byte SavedGameModeIndex, SavedMapIndex, SavedDifficultyIndex, SavedLengthIndex, SavedPingIndex, SavedWeeklySelectorIndex;
|
||||
|
||||
var Bool bNoPasswordPending, bNoMutatorsPending, bNotFullPending, bNotEmptyPending, bUsesStatsPending, bCustomPending, bDedicatedPending, bVAC_SecurePending, bInLobbyPending, bInProgressPending, bOnlyStockMapsPending, bOnlyCustomMapsPending, bLimitServerResultsPending, bNoLocalAdminPending, bNoSeasonalSkinsPending;
|
||||
var byte SavedGameModeIndexPending, SavedMapIndexPending, SavedDifficultyIndexPending, SavedLengthIndexPending, SavedPingIndexPending;
|
||||
var byte SavedGameModeIndexPending, SavedMapIndexPending, SavedDifficultyIndexPending, SavedLengthIndexPending, SavedPingIndexPending, SavedWeeklySelectorIndexPending;
|
||||
|
||||
var transient string CachedMapName, CachedModeName;
|
||||
var transient int CachedDifficulty, CachedLength;
|
||||
@ -93,6 +93,12 @@ function AdjustSavedFiltersToMode()
|
||||
SavedLengthIndex = 255;
|
||||
}
|
||||
SavedLengthIndexPending = SavedLengthIndex;
|
||||
|
||||
if (SavedGameModeIndex != 1)
|
||||
{
|
||||
SavedWeeklySelectorIndex = 0;
|
||||
}
|
||||
SavedWeeklySelectorIndexPending = SavedWeeklySelectorIndex;
|
||||
}
|
||||
|
||||
exec native function string GetSelectedMap() const;
|
||||
@ -105,6 +111,8 @@ exec native function int GetSelectedGameLength() const;
|
||||
native function int GetMaxPing() const;
|
||||
//@SABER_END
|
||||
|
||||
exec native function int GetWeeklySelectorIndex() const;
|
||||
|
||||
function InitFiltersArray()
|
||||
{
|
||||
FilterStrings[NO_PASSWORD] = NoPasswordString;
|
||||
@ -141,6 +149,7 @@ function LocalizeText()
|
||||
LocalizedObject.SetString("difficulty", ServerMenu.DifficultyString);
|
||||
LocalizedObject.SetString("length", ServerMenu.LengthString);
|
||||
LocalizedObject.SetString("ping", ServerMenu.PingString);
|
||||
LocalizedObject.SetString("weeklyIndex", ServerMenu.WeeklyIndexString);
|
||||
|
||||
SetObject("localizedText", LocalizedObject);
|
||||
|
||||
@ -150,6 +159,7 @@ function LocalizeText()
|
||||
CreateList("difficultyScrollingList", class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), SavedDifficultyIndex);
|
||||
CreateList("lengthScrollingList", class'KFCommon_LocalizedStrings'.static.GetLengthStringsArray(), SavedLengthIndex);
|
||||
CreateList("pingScrollingList", ServerMenu.PingOptionStrings, SavedPingIndex);
|
||||
CreateList("weeklyIndexScrollingList", class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorStringsArray(), SavedWeeklySelectorIndex, -1, true, SavedGameModeIndexPending == 1);
|
||||
|
||||
LocalizeCheckBoxes();
|
||||
}
|
||||
@ -227,7 +237,10 @@ function SetModeMenus(string DifficultyListString, string LengthListString, int
|
||||
CreateList(LengthListString, class'KFCommon_LocalizedStrings'.static.GetLengthStringsArray(), NewLengthIndex, class'KFGameInfo'.default.GameModes[UseModeIndex].Lengths);
|
||||
}
|
||||
|
||||
function CreateList( string ListString, array<string> TextArray, int SelectedIndex, optional int MaxListLength)
|
||||
function CreateList( string ListString, array<string> TextArray, int SelectedIndex
|
||||
, optional int MaxListLength = -1
|
||||
, optional bool bAnyIsFirst = false
|
||||
, optional bool bEnabled = true)
|
||||
{
|
||||
local int i;
|
||||
local GFxObject OptionList;
|
||||
@ -252,33 +265,73 @@ function CreateList( string ListString, array<string> TextArray, int SelectedInd
|
||||
{
|
||||
SelectedIndex = 255;
|
||||
}
|
||||
|
||||
if (bAnyIsFirst)
|
||||
{
|
||||
//Add the any choice
|
||||
ItemSlot = CreateObject( "Object" );
|
||||
ItemSlot.SetString("label", class'KFCommon_LocalizedStrings'.default.NoPreferenceString);
|
||||
DataProvider.SetElementObject(0, ItemSlot);
|
||||
}
|
||||
|
||||
for ( i = 0; i < ListLength; i++ )
|
||||
{
|
||||
ItemSlot = CreateObject( "Object" );
|
||||
TempString = TextArray[i];
|
||||
ItemSlot.SetString("label", TempString );
|
||||
DataProvider.SetElementObject(i, ItemSlot);
|
||||
}
|
||||
DataProvider.SetElementObject(bAnyIsFirst ? i + 1 : i, ItemSlot);
|
||||
}
|
||||
|
||||
if (bAnyIsFirst == false)
|
||||
{
|
||||
//Add the any choice
|
||||
ItemSlot = CreateObject( "Object" );
|
||||
ItemSlot.SetString("label", class'KFCommon_LocalizedStrings'.default.NoPreferenceString);
|
||||
DataProvider.SetElementObject(i, ItemSlot);
|
||||
}
|
||||
|
||||
//Add the any choice
|
||||
ItemSlot = CreateObject( "Object" );
|
||||
ItemSlot.SetString("label", class'KFCommon_LocalizedStrings'.default.NoPreferenceString);
|
||||
DataProvider.SetElementObject(i, ItemSlot);
|
||||
if(SelectedIndex != 255)
|
||||
{
|
||||
OptionList.SetInt("selectedIndex", SelectedIndex);
|
||||
}
|
||||
|
||||
OptionList.SetObject("dataProvider", DataProvider);
|
||||
if(SelectedIndex < ListLength)
|
||||
|
||||
if (bEnabled)
|
||||
{
|
||||
ButtonLabel = TextArray[SelectedIndex];
|
||||
if (bAnyIsFirst)
|
||||
{
|
||||
ButtonLabel = class'KFCommon_LocalizedStrings'.default.NoPreferenceString;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(SelectedIndex < ListLength)
|
||||
{
|
||||
ButtonLabel = TextArray[SelectedIndex];
|
||||
}
|
||||
else
|
||||
{
|
||||
ButtonLabel = "-";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ButtonLabel = "-";
|
||||
}
|
||||
|
||||
OptionList.GetObject("associatedButton").SetString("label", ButtonLabel);
|
||||
|
||||
OptionList.ActionScriptVoid("invalidateData");
|
||||
|
||||
if (bEnabled )
|
||||
{
|
||||
OptionList.GetObject("associatedButton").SetBool("enabled", true);
|
||||
}
|
||||
else
|
||||
{
|
||||
OptionList.GetObject("associatedButton").SetBool("enabled", false);
|
||||
}
|
||||
}
|
||||
|
||||
function ModeChanged(int index)
|
||||
@ -321,6 +374,11 @@ function PingChanged(int index)
|
||||
SavedPingIndexPending = index;
|
||||
}
|
||||
|
||||
function WeeklySelectorChanged(int index)
|
||||
{
|
||||
SavedWeeklySelectorIndexPending = index;
|
||||
}
|
||||
|
||||
function ApplyFilters()
|
||||
{
|
||||
bNoPassword = bNoPasswordPending;
|
||||
@ -344,7 +402,10 @@ function ApplyFilters()
|
||||
SavedDifficultyIndex = SavedDifficultyIndexPending;
|
||||
SavedLengthIndex = SavedLengthIndexPending;
|
||||
SavedPingIndex = SavedPingIndexPending;
|
||||
//`log("ApplyFilters:"@bCustom);
|
||||
SavedWeeklySelectorIndex = SavedWeeklySelectorIndexPending;
|
||||
|
||||
//`Log("ApplyFilters");
|
||||
|
||||
SaveConfig();
|
||||
}
|
||||
|
||||
@ -370,7 +431,9 @@ function ClearPendingValues()
|
||||
SavedDifficultyIndexPending = SavedDifficultyIndex;
|
||||
SavedLengthIndexPending = SavedLengthIndex;
|
||||
SavedPingIndexPending = SavedPingIndex;
|
||||
//`log("ClearPendingValues:"@bCustom);
|
||||
SavedWeeklySelectorIndexPending = SavedWeeklySelectorIndex;
|
||||
|
||||
//`Log("ClearPendingValues");
|
||||
}
|
||||
|
||||
function ResetFilters()
|
||||
@ -396,6 +459,7 @@ function ResetFilters()
|
||||
SavedDifficultyIndex = 255;
|
||||
SavedLengthIndex = 255;
|
||||
SavedPingIndex = 255;
|
||||
SavedWeeklySelectorIndex = 0;
|
||||
//`log("ResetFilters:"@bCustom);
|
||||
|
||||
ClearPendingValues();
|
||||
|
@ -66,6 +66,7 @@ function SetDetails(KFOnlineGameSettings ServerResult)
|
||||
local int Ping, PlayerCount;
|
||||
local KFOnlineGameSettings TempOnlingGamesSettings;
|
||||
local bool bShowSeasonalSkins;
|
||||
local KFWeeklyOutbreakInformation WeeklyInfo;
|
||||
|
||||
if(ServerResult != none)
|
||||
{
|
||||
@ -103,6 +104,22 @@ function SetDetails(KFOnlineGameSettings ServerResult)
|
||||
TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) );
|
||||
TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlingGamesSettings.difficulty));
|
||||
TempObj.SetString("mode", class'KFCommon_LocalizedStrings'.static.GetGameModeString(TempOnlingGamesSettings.Mode) );
|
||||
|
||||
// If weekly we add the weekly type
|
||||
if (TempOnlingGamesSettings.Mode == 1)
|
||||
{
|
||||
if (TempOnlingGamesSettings.WeeklySelectorIndex > 0)
|
||||
{
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(TempOnlingGamesSettings.WeeklySelectorIndex - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
|
||||
}
|
||||
|
||||
TempObj.SetString("weeklyForced", WeeklyInfo.FriendlyName);
|
||||
}
|
||||
|
||||
TempObj.SetString("map", TempOnlingGamesSettings.MapName);
|
||||
|
||||
TempObj.SetString("mapImagePath", GetMapSource(TempOnlingGamesSettings.MapName));
|
||||
|
@ -271,7 +271,7 @@ function BuildServerFilters(KFGFxServerBrowser_Filters Filters, OnlineGameSearch
|
||||
{
|
||||
local string GametagSearch;
|
||||
local string MapName;
|
||||
local int Mode, Difficulty, Length;
|
||||
local int Mode, Difficulty, Length, WeeklySelectorIndex;
|
||||
local bool DisableSeasonalSkins;
|
||||
|
||||
Search.ClearServerFilters();
|
||||
@ -344,7 +344,14 @@ function BuildServerFilters(KFGFxServerBrowser_Filters Filters, OnlineGameSearch
|
||||
//`log("adding custom filter");
|
||||
Search.TestAddBoolGametagFilter(GametagSearch, Filters.bCustom, 'bCustom', 0);
|
||||
}
|
||||
|
||||
|
||||
WeeklySelectorIndex = Filters.GetWeeklySelectorIndex();
|
||||
if (Mode == 1 && WeeklySelectorIndex != 0) // // Only when mode is Weekly, 0 means "ANY", 1 is "DEFAULT", then the weeklies
|
||||
{
|
||||
WeeklySelectorIndex = WeeklySelectorIndex - 1; // move back to index range
|
||||
|
||||
Search.AddGametagFilter(GametagSearch, 'WeeklySelectorIndex', string(WeeklySelectorIndex));
|
||||
}
|
||||
|
||||
if (Len(GametagSearch) > 0)
|
||||
{
|
||||
@ -832,7 +839,7 @@ function string BuildJoinURL()
|
||||
function string BuildJoinFiltersRequestURL()
|
||||
{
|
||||
local string FiltersURL;
|
||||
local int GameDifficulty;
|
||||
local int GameDifficulty, WeeklySelectorIndex, IntendedWeeklyIndex;
|
||||
|
||||
GameDifficulty = ServerMenu.FiltersContainer.GetSelectedDifficulty();
|
||||
|
||||
@ -851,10 +858,32 @@ function string BuildJoinFiltersRequestURL()
|
||||
FiltersURL $= "?GameLength="$ServerMenu.FiltersContainer.SavedLengthIndex;
|
||||
}
|
||||
|
||||
WeeklySelectorIndex = ServerMenu.FiltersContainer.SavedWeeklySelectorIndex;
|
||||
|
||||
if (ServerMenu.FiltersContainer.SavedGameModeIndex == 1
|
||||
&& WeeklySelectorIndex != 0) // 0 means "ANY", 1 is "DEFAULT", then the weeklies
|
||||
{
|
||||
WeeklySelectorIndex = WeeklySelectorIndex - 1; // move back to index range
|
||||
|
||||
// IF index matches default, set to 0 (default)
|
||||
if (WeeklySelectorIndex >= 1)
|
||||
{
|
||||
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
|
||||
if (IntendedWeeklyIndex == (WeeklySelectorIndex - 1))
|
||||
{
|
||||
WeeklySelectorIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (WeeklySelectorIndex >= 0)
|
||||
{
|
||||
FiltersURL $= "?WeeklySelectorIndex=" $WeeklySelectorIndex;
|
||||
}
|
||||
}
|
||||
|
||||
return FiltersURL;
|
||||
}
|
||||
|
||||
|
||||
function OnRefreshServerDetails()
|
||||
{
|
||||
local KFOnlineGameSearch GameSearch;
|
||||
@ -934,6 +963,7 @@ function UpdateListDataProvider()
|
||||
local KFOnlineGameSearch LatestGameSearch;
|
||||
local int Ping, PlayerCount;
|
||||
local KFOnlineGameSettings TempOnlineGamesSettings;
|
||||
local KFWeeklyOutbreakInformation WeeklyInfo;
|
||||
|
||||
LatestGameSearch = KFOnlineGameSearch(SearchDataStore.GetActiveGameSearch());
|
||||
|
||||
@ -989,7 +1019,23 @@ function UpdateListDataProvider()
|
||||
TempObj.SetString("ping", (Ping < 0) ? ("-") : (String(Ping)) );
|
||||
TempObj.SetString("difficulty", Class'KFCommon_LocalizedStrings'.static.GetDifficultyString(TempOnlineGamesSettings.difficulty));
|
||||
|
||||
TempObj.SetString("mode", class'KFCommon_LocalizedStrings'.static.GetGameModeString(TempOnlineGamesSettings.Mode) );
|
||||
TempObj.SetString("mode", class'KFCommon_LocalizedStrings'.static.GetGameModeString(TempOnlineGamesSettings.Mode));
|
||||
|
||||
// If weekly we show the icon of the weekly type
|
||||
if (IsWeeklyModeIndex(TempOnlineGamesSettings.Mode))
|
||||
{
|
||||
if (TempOnlineGamesSettings.WeeklySelectorIndex > 0)
|
||||
{
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(TempOnlineGamesSettings.WeeklySelectorIndex - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
|
||||
}
|
||||
|
||||
TempObj.SetString("weeklyType", "img://"$WeeklyInfo.IconPath);
|
||||
}
|
||||
|
||||
TempObj.SetString("map", TempOnlineGamesSettings.MapName);
|
||||
TempObj.SetBool("locked", TempOnlineGamesSettings.bRequiresPassword);
|
||||
TempObj.SetBool("serverExiled", TempOnlineGamesSettings.bServerExiled);
|
||||
@ -1013,6 +1059,11 @@ function UpdateListDataProvider()
|
||||
}
|
||||
}
|
||||
|
||||
function bool IsWeeklyModeIndex(int ModeIndex)
|
||||
{
|
||||
return ModeIndex == 1;
|
||||
}
|
||||
|
||||
function bool IsEndlessModeIndex(int ModeIndex)
|
||||
{
|
||||
return ModeIndex == 3;
|
||||
|
@ -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 Volter’s Collectibles
|
||||
ObjectiveIconURLs[3] = "Halloween2023_UI.UI_Objective_Halloween2023_ThisBelongToAMuseum" // Unlock all exhibits from Castle Volter’s 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
|
||||
}
|
@ -13,7 +13,7 @@ dependson(KFUnlockManager);
|
||||
|
||||
|
||||
var KFGFxMenu_StartGame StartMenu;
|
||||
var byte LastDifficultyIndex, LastLengthIndex, LastPrivacyIndex, LastAllowSeasonalSkinsIndex;
|
||||
var byte LastDifficultyIndex, LastLengthIndex, LastPrivacyIndex, LastAllowSeasonalSkinsIndex, LastWeeklySelectorIndex;
|
||||
|
||||
var localized string OverviewString;
|
||||
var localized string ChangeString;
|
||||
@ -125,6 +125,15 @@ function LocalizeContainer()
|
||||
|
||||
LocalizedObject.SetObject("allowSeasonalSkinsOptions", DataProvider);
|
||||
|
||||
for (i = 0; i < class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorStringsArray().length; i++)
|
||||
{
|
||||
TempObj = CreateObject("Object");
|
||||
TempObj.SetString("label", class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorString(i));
|
||||
DataProvider.SetElementObject(i, TempObj);
|
||||
}
|
||||
|
||||
LocalizedObject.SetObject("weeklySelectorOptions", DataProvider);
|
||||
|
||||
if( !class'WorldInfo'.static.IsMenuLevel() )
|
||||
{
|
||||
LocalizedObject.SetString("authorName", AuthorString$GetPC().WorldInfo.Author);
|
||||
@ -350,12 +359,17 @@ function UpdateAllowSeasonalSkins(string AllowSeasonalStrings)
|
||||
SetString("allowSeasonalSkinsText", AllowSeasonalStrings);
|
||||
}
|
||||
|
||||
function UpdateWeeklySelector(string WeeklySelectorStrings)
|
||||
{
|
||||
SetString("weeklySelectorText", WeeklySelectorStrings);
|
||||
}
|
||||
|
||||
function UpdateOverviewInGame()
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
local string GameDifficultyString;
|
||||
local Float CurrentGameDifficulty;
|
||||
local int CurrentLengthIndex, CurrentPrivacyIndex, CurrentAllowSeasonalSkinsIndex;
|
||||
local int CurrentLengthIndex, CurrentPrivacyIndex, CurrentAllowSeasonalSkinsIndex, CurrentWeeklySelectorIndex;
|
||||
local bool bCustomDifficulty;
|
||||
local bool bCustomLength;
|
||||
|
||||
@ -427,6 +441,13 @@ function UpdateOverviewInGame()
|
||||
UpdateAllowSeasonalSkins( class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsString(CurrentAllowSeasonalSkinsIndex) );
|
||||
LastAllowSeasonalSkinsIndex = CurrentAllowSeasonalSkinsIndex;
|
||||
}
|
||||
|
||||
CurrentWeeklySelectorIndex = StartMenu.OptionsComponent.GetWeeklySelectorIndex();
|
||||
if (LastWeeklySelectorIndex != CurrentWeeklySelectorIndex)
|
||||
{
|
||||
UpdateWeeklySelector( class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorString(CurrentWeeklySelectorIndex) );
|
||||
LastWeeklySelectorIndex = CurrentWeeklySelectorIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -448,6 +469,7 @@ DefaultProperties
|
||||
LastLengthIndex=255
|
||||
LastDifficultyIndex=255
|
||||
LastAllowSeasonalSkinsIndex=255
|
||||
LastWeeklySelectorIndex=255
|
||||
|
||||
ObjectiveClassName=KFGameInfo_Objective
|
||||
}
|
||||
|
@ -182,7 +182,7 @@ function FillWhatsNew()
|
||||
local SWhatsNew item;
|
||||
WhatsNewItems.Remove(0, WhatsNewItems.Length);
|
||||
// Latest Update
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_Event", "LatestUpdate", "http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_Event", "LatestUpdate", "http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Ultimate Edition
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_UltimateEdition_Upgrade", "FeaturedItemBundle", "https://store.steampowered.com/app/1914560/KF2__Ultimate_Edition_Upgrade_DLC/");
|
||||
@ -197,25 +197,22 @@ function FillWhatsNew()
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_CosmeticsSeasonPass", "FeaturedItemBundle", "https://store.steampowered.com/app/2363410/Killing_Floor_2__Cosmetics_Season_Pass");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_S12Shockgun", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9655");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_MG3Shredder", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9749");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Outfit Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_HorzineDiver_Uniforms", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9653");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_LastStand_Uniforms", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9747");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Time Limited Item
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_SS_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/4928");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/5246");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_Predator_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9651");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_MedievalMKII_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9718");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_JunkyardMKII_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9646");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_HRGSpectreMKIII_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9720");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_JaegerMKIV_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9645");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2023_Stingray_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9649");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Halloween2023_ChameleonMKIV_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9716");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Misc Community Links
|
||||
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityHub", "Jaegorhorn", "https://steamcommunity.com/app/232090");
|
||||
|
@ -75,6 +75,7 @@ var GFxObject DifficultyButton;
|
||||
var GfxObject MapButton;
|
||||
var GFxObject RegionButton;
|
||||
var GFxObject AllowSeasonalSkinsButton;
|
||||
var GFxObject WeeklySelectorButton;
|
||||
|
||||
//==============================================================
|
||||
// Initialization
|
||||
@ -96,25 +97,40 @@ function GetButtons()
|
||||
MapButton = GetObject("mapButton");
|
||||
RegionButton = GetObject("regionButton");
|
||||
AllowSeasonalSkinsButton = GetObject("allowSeasonalSkinsButton");
|
||||
WeeklySelectorButton = GetObject("weeklySelectorButton");
|
||||
}
|
||||
|
||||
function UpdateButtonsEnabled()
|
||||
{
|
||||
local int AdjustedGameModeIndex;
|
||||
local bool ModeIsWeekly;
|
||||
|
||||
if (bIsSoloGame)
|
||||
{
|
||||
AdjustedGameModeIndex = ParentMenu.Manager.GetModeIndex(false);
|
||||
|
||||
ModeIsWeekly = AdjustedGameModeIndex == EGameMode_Weekly;
|
||||
|
||||
LengthButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[AdjustedGameModeIndex].Lengths > 0);
|
||||
DifficultyButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[AdjustedGameModeIndex].DifficultyLevels > 0);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
ModeIsWeekly = ParentMenu.Manager.GetModeIndex() == EGameMode_Weekly;
|
||||
|
||||
LengthButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[ParentMenu.Manager.GetModeIndex()].Lengths > 0);
|
||||
DifficultyButton.SetBool("enabled", class'KFGameInfo'.default.GameModes[ParentMenu.Manager.GetModeIndex()].DifficultyLevels > 0);
|
||||
}
|
||||
|
||||
if (ModeIsWeekly)
|
||||
{
|
||||
WeeklySelectorButton.SetBool("enabled", true);
|
||||
}
|
||||
else
|
||||
{
|
||||
WeeklySelectorButton.SetBool("enabled", false);
|
||||
}
|
||||
}
|
||||
|
||||
function SetHelpText(string TextValue)
|
||||
@ -131,6 +147,7 @@ function SetModeMenus(GFxObject TextObject, int ModeIndex, int LengthIndex)
|
||||
Lengths = class'KFGameInfo'.default.GameModes[ModeIndex].Lengths;
|
||||
NewDifficultyIndex = Clamp(NewDifficultyIndex, 0, DifficultyLevels);
|
||||
NewLengthIndex = Clamp(NewLengthIndex, 0, Lengths);
|
||||
|
||||
TextObject.SetObject("difficultyList", CreateList(class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), GetDifficultyIndex(), false, false, byte(DifficultyLevels)));
|
||||
TextObject.SetObject("lengthList", CreateList(class'KFCommon_LocalizedStrings'.static.GetLengthStringsArray(), LengthIndex, bShowLengthNoPref, false, byte(Lengths)));
|
||||
}
|
||||
@ -254,7 +271,8 @@ function InitializeGameOptions()
|
||||
TextObject.SetBool("bShowAllowSeasonalSkins", true);
|
||||
}
|
||||
|
||||
TextObject.SetString("allowSeasonalSkins", StartMenu.AllowSeasonalSkinsTitle);
|
||||
TextObject.SetString("allowSeasonalSkins", StartMenu.AllowSeasonalSkinsTitle);
|
||||
TextObject.SetString("weeklySelector", StartMenu.WeeklySelectorTitle);
|
||||
|
||||
// Since the Mode list can include "ANY" we need to just accept that the selected index could be the length of the supported modes. Otherwise when "ANY" is selected we push the index to 1.
|
||||
// Also don't include the "ANY" option on Console since PlayGo doesn't support searching multiple game types. HSL_BB
|
||||
@ -264,7 +282,8 @@ function InitializeGameOptions()
|
||||
TextObject.SetObject("mapList", CreateList(StartMenu.MapStringList, bIsSoloGame ? InitialMapIndex : InitialMapIndex+1, true, true));
|
||||
TextObject.SetObject("difficultyList", CreateList(class'KFCommon_LocalizedStrings'.static.GetDifficultyStringsArray(), GetDifficultyIndex(), false));
|
||||
TextObject.SetObject("privacyList", CreateList(class'KFCommon_LocalizedStrings'.static.GetPermissionStringsArray(class'WorldInfo'.static.IsConsoleBuild()), Profile.GetProfileInt(KFID_SavedPrivacyIndex), false));
|
||||
TextObject.SetObject("allowSeasonalSkinsList", CreateList(class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsStringsArray(), Profile.GetProfileInt(KFID_SavedAllowSeasonalSkinsIndex), false));
|
||||
TextObject.SetObject("allowSeasonalSkinsList", CreateList(class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsStringsArray(), Profile.GetProfileInt(KFID_SavedAllowSeasonalSkinsIndex), false));
|
||||
TextObject.SetObject("weeklySelectorList", CreateList(class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorStringsArray(), Profile.GetProfileInt(KFID_SavedWeeklySelectorIndex), false, false));
|
||||
|
||||
if (class'WorldInfo'.static.IsConsoleBuild())
|
||||
{
|
||||
@ -287,39 +306,124 @@ function FilterWeeklyMaps(out array<string> List)
|
||||
return;
|
||||
}
|
||||
|
||||
`Log("OPTIONS: Skipping Maps");
|
||||
|
||||
// Scavenger index = 11
|
||||
// BossRush index = 14
|
||||
// GunGame index = 16
|
||||
WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod();
|
||||
if (WeeklyIndex == 11 || WeeklyIndex == 14 || WeeklyIndex == 16)
|
||||
{
|
||||
`Log("OPTIONS: Inside, removing maps");
|
||||
|
||||
List.RemoveItem("KF-Biolapse");
|
||||
List.RemoveItem("KF-Nightmare");
|
||||
List.RemoveItem("KF-PowerCore_Holdout");
|
||||
List.RemoveItem("KF-TheDescent");
|
||||
List.RemoveItem("KF-KrampusLair");
|
||||
if (ParentMenu.Manager.GetWeeklySelectorIndex() != 0)
|
||||
{
|
||||
WeeklyIndex = ParentMenu.Manager.GetWeeklySelectorIndex() - 1;
|
||||
}
|
||||
|
||||
if (WeeklyIndex == 19)
|
||||
switch (WeeklyIndex)
|
||||
{
|
||||
List.RemoveItem("KF-Biolapse");
|
||||
List.RemoveItem("KF-Nightmare");
|
||||
List.RemoveItem("KF-PowerCore_Holdout");
|
||||
List.RemoveItem("KF-TheDescent");
|
||||
List.RemoveItem("KF-KrampusLair");
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
List.RemoveItem("KF-Elysium");
|
||||
}
|
||||
case 0: // Boom
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
/* Temporary removal of SteamFrotress for BossRush */
|
||||
if (WeeklyIndex == 14)
|
||||
{
|
||||
List.RemoveItem("KF-SteamFortress");
|
||||
}
|
||||
case 1: // Cranium Cracker
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 2: // Tiny Terror
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 3: // BobbleZed
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 4: // Poundemonium
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 5: // Up Up And Decay
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 6: // Zed Time
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 7: // Beefcake
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 8: // BloodThirst
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 9: // Coliseum
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 10: // Arachnophobia
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 11: // Scavenger
|
||||
List.RemoveItem("KF-Biolapse");
|
||||
List.RemoveItem("KF-Nightmare");
|
||||
List.RemoveItem("KF-PowerCore_Holdout");
|
||||
List.RemoveItem("KF-TheDescent");
|
||||
List.RemoveItem("KF-KrampusLair");
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 12: // WW
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 13: // Abandon
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 14: // Boss Rush
|
||||
List.RemoveItem("KF-Biolapse");
|
||||
List.RemoveItem("KF-Nightmare");
|
||||
List.RemoveItem("KF-PowerCore_Holdout");
|
||||
List.RemoveItem("KF-TheDescent");
|
||||
List.RemoveItem("KF-KrampusLair");
|
||||
List.RemoveItem("KF-SteamFortress");
|
||||
break;
|
||||
|
||||
case 15: // Shrunken Heads
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 16: // GunGame
|
||||
List.RemoveItem("KF-Biolapse");
|
||||
List.RemoveItem("KF-Nightmare");
|
||||
List.RemoveItem("KF-PowerCore_Holdout");
|
||||
List.RemoveItem("KF-TheDescent");
|
||||
List.RemoveItem("KF-KrampusLair");
|
||||
break;
|
||||
|
||||
case 17: // VIP
|
||||
break;
|
||||
|
||||
case 18: // Perk Roulette
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
break;
|
||||
|
||||
case 19: // Contamination Zone
|
||||
List.RemoveItem("KF-Biolapse");
|
||||
List.RemoveItem("KF-Nightmare");
|
||||
List.RemoveItem("KF-PowerCore_Holdout");
|
||||
List.RemoveItem("KF-TheDescent");
|
||||
List.RemoveItem("KF-KrampusLair");
|
||||
List.RemoveItem("KF-SantasWorkshop");
|
||||
List.RemoveItem("KF-Elysium");
|
||||
break;
|
||||
|
||||
case 20: // Bounty Hunt
|
||||
List.RemoveItem("KF-Biolapse");
|
||||
List.RemoveItem("KF-Nightmare");
|
||||
List.RemoveItem("KF-PowerCore_Holdout");
|
||||
List.RemoveItem("KF-TheDescent");
|
||||
List.RemoveItem("KF-KrampusLair");
|
||||
List.RemoveItem("KF-Elysium");
|
||||
List.RemoveItem("KF-SteamFortress");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function GFxObject CreateList( array<string> TextArray, byte SelectedIndex, bool bAddNoPrefString, optional bool bIsMapList, optional byte MaxLength)
|
||||
@ -504,6 +608,22 @@ function AllowSeasonalSkinsChanged( int Index, optional bool bSetText )
|
||||
}
|
||||
}
|
||||
|
||||
function WeeklySelectorChanged( int Index, optional bool bSetText )
|
||||
{
|
||||
if(Index != GetCachedProfile().GetProfileInt(KFID_SavedWeeklySelectorIndex))
|
||||
{
|
||||
SaveConfig();
|
||||
if(bSetText)
|
||||
{
|
||||
WeeklySelectorButton.SetString("infoString", class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorStringsArray()[Index]);
|
||||
}
|
||||
|
||||
GetCachedProfile().SetProfileSettingValueInt(KFID_SavedWeeklySelectorIndex, Index);
|
||||
|
||||
InitializeGameOptions();
|
||||
}
|
||||
}
|
||||
|
||||
function SetRegionIndex(int InRegionIndex, optional bool bSetText)
|
||||
{
|
||||
local array<String> PlayfabRegionList;
|
||||
@ -623,6 +743,11 @@ function int GetAllowSeasonalSkinsIndex()
|
||||
return GetCachedProfile().GetProfileInt(KFID_SavedAllowSeasonalSkinsIndex);
|
||||
}
|
||||
|
||||
function int GetWeeklySelectorIndex()
|
||||
{
|
||||
return GetCachedProfile().GetProfileInt(KFID_SavedWeeklySelectorIndex);
|
||||
}
|
||||
|
||||
function string GetMapName()
|
||||
{
|
||||
local string SavedMapString;
|
||||
|
@ -447,21 +447,19 @@ DefaultProperties
|
||||
|
||||
XboxFilterExceptions[0]="Wasteland Bundle" // Wasteland Outfit Bundle
|
||||
|
||||
FeaturedItemIDs[0]=8178 //Whatsnew Gold Ticket
|
||||
FeaturedItemIDs[1]=9655
|
||||
FeaturedItemIDs[2]=9646
|
||||
FeaturedItemIDs[3]=9649
|
||||
FeaturedItemIDs[4]=9645
|
||||
FeaturedItemIDs[5]=9653
|
||||
FeaturedItemIDs[6]=9651
|
||||
FeaturedItemIDs[0]=7619 //Whatsnew Gold Ticket
|
||||
FeaturedItemIDs[1]=9749
|
||||
FeaturedItemIDs[2]=9747
|
||||
FeaturedItemIDs[3]=9716
|
||||
FeaturedItemIDs[4]=9718
|
||||
FeaturedItemIDs[5]=9720
|
||||
|
||||
ConsoleFeaturedItemIDs[0]=8181 //Whatsnew Gold Ticket PSN
|
||||
ConsoleFeaturedItemIDs[1]=9655
|
||||
ConsoleFeaturedItemIDs[2]=9646
|
||||
ConsoleFeaturedItemIDs[3]=9649
|
||||
ConsoleFeaturedItemIDs[4]=9645
|
||||
ConsoleFeaturedItemIDs[5]=9653
|
||||
ConsoleFeaturedItemIDs[6]=9651
|
||||
ConsoleFeaturedItemIDs[0]=7783 //Whatsnew Gold Ticket PSN
|
||||
ConsoleFeaturedItemIDs[1]=9749
|
||||
ConsoleFeaturedItemIDs[2]=9747
|
||||
ConsoleFeaturedItemIDs[3]=9716
|
||||
ConsoleFeaturedItemIDs[4]=9718
|
||||
ConsoleFeaturedItemIDs[5]=9720
|
||||
|
||||
MaxFeaturedItems=5
|
||||
}
|
@ -290,6 +290,8 @@ function SetItemInfo(out GFxObject ItemDataArray, STraderItem TraderItem, int Sl
|
||||
/** returns true if this item should not be displayed */
|
||||
function bool IsItemFiltered(STraderItem Item, optional bool bDebug)
|
||||
{
|
||||
local bool bUses9mm;
|
||||
|
||||
if(!class'GameEngine'.Static.IsGameFullyInstalled() && Item.WeaponDef.default.IsPlayGoHidden)
|
||||
{
|
||||
if (bDebug)
|
||||
@ -340,5 +342,38 @@ function bool IsItemFiltered(STraderItem Item, optional bool bDebug)
|
||||
return true;
|
||||
}
|
||||
|
||||
bUses9mm = Has9mmGun();
|
||||
if (bUses9mm && (Item.ClassName == 'KFWeap_HRG_93r' || Item.ClassName == 'KFWeap_HRG_93r_Dual'))
|
||||
{
|
||||
if (bDebug)
|
||||
{
|
||||
`log("9mm owned, skip HRG_93");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!bUses9mm && (Item.ClassName == 'KFWeap_Pistol_9mm' || Item.ClassName == 'KFWeap_Pistol_Dual9mm'))
|
||||
{
|
||||
if (bDebug)
|
||||
{
|
||||
`log("HRG_93R owned, skip 9mm");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
simulated function bool Has9mmGun()
|
||||
{
|
||||
local SItemInformation Item;
|
||||
|
||||
foreach KFPC.GetPurchaseHelper().OwnedItemList(Item)
|
||||
{
|
||||
if (Item.DefaultItem.ClassName == 'KFWeap_Pistol_9mm' || Item.DefaultItem.ClassName == 'KFWeap_Pistol_Dual9mm')
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
@ -11,61 +11,115 @@
|
||||
class KFGFxWeeklyObjectivesContainer extends KFGFxObject_Container
|
||||
dependson(KFMission_LocalizedStrings);
|
||||
|
||||
var bool bInitialDataPopulated;
|
||||
var int LastWeeklyPopulated;
|
||||
var bool bLastWeeklyComplete;
|
||||
var KFPlayerController KFPC;
|
||||
|
||||
var KFGFxMenu_StartGame StartGameMenu;
|
||||
|
||||
function Initialize( KFGFxObject_Menu NewParentMenu )
|
||||
{
|
||||
super.Initialize( NewParentMenu );
|
||||
|
||||
StartGameMenu = KFGFxMenu_StartGame(NewParentMenu);
|
||||
|
||||
KFPC = KFPlayerController(GetPC());
|
||||
if(KFPC != none)
|
||||
{
|
||||
LocalizeMenu();
|
||||
PopulateData();
|
||||
PopulateData();
|
||||
}
|
||||
}
|
||||
|
||||
function bool PopulateData()
|
||||
{
|
||||
local int IntendedWeeklyIndex, WeeklyIndex, OverrideWeeklyIndex;
|
||||
local GFxObject DataObject;
|
||||
local KFWeeklyOutbreakInformation WeeklyInfo;
|
||||
local bool bWeeklyComplete;
|
||||
local int WeeklyIndex;
|
||||
local byte CurrentMenuState;
|
||||
local bool bWeeklyComplete, bIsCustomWeekly;
|
||||
|
||||
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
|
||||
WeeklyIndex = -1;
|
||||
OverrideWeeklyIndex = -1;
|
||||
|
||||
// If the Start Game Menu is opened and in some of the next states,.. we can read a different weekly selection
|
||||
if (StartGameMenu != none)
|
||||
{
|
||||
CurrentMenuState = StartGameMenu.GetStartMenuState();
|
||||
|
||||
Switch (EStartMenuState(CurrentMenuState))
|
||||
{
|
||||
case ECreateGame:
|
||||
case ESoloGame:
|
||||
if (StartGameMenu.OptionsComponent.GetWeeklySelectorIndex() != 0)
|
||||
{
|
||||
OverrideWeeklyIndex = StartGameMenu.OptionsComponent.GetWeeklySelectorIndex() - 1;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (KFPC.WorldInfo.NetMode == NM_Client)
|
||||
{
|
||||
if (KFPC != none && KFGameReplicationInfo(KFPC.WorldInfo.GRI) != none)
|
||||
{
|
||||
WeeklyIndex = KFGameReplicationInfo(KFPC.WorldInfo.GRI).CurrentWeeklyIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
GetPC().SetTimer(0.5f, false, nameof(PopulateData));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (OverrideWeeklyIndex >= 0)
|
||||
{
|
||||
WeeklyIndex = OverrideWeeklyIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod();
|
||||
}
|
||||
}
|
||||
|
||||
if (WeeklyIndex != -1)
|
||||
{
|
||||
bIsCustomWeekly = IntendedWeeklyIndex != WeeklyIndex;
|
||||
}
|
||||
|
||||
bWeeklyComplete = KFPC.IsWeeklyEventComplete();
|
||||
WeeklyIndex = -1;
|
||||
|
||||
if(bWeeklyComplete != bLastWeeklyComplete || !bInitialDataPopulated)
|
||||
if (bWeeklyComplete != bLastWeeklyComplete || LastWeeklyPopulated != WeeklyIndex)
|
||||
{
|
||||
if (KFPC.WorldInfo.NetMode == NM_Client)
|
||||
LastWeeklyPopulated = WeeklyIndex;
|
||||
bLastWeeklyComplete = bWeeklyComplete;
|
||||
|
||||
LocalizeMenu(bIsCustomWeekly);
|
||||
|
||||
if (WeeklyIndex >= 0)
|
||||
{
|
||||
if (KFPC != none && KFGameReplicationInfo(KFPC.WorldInfo.GRI) != none)
|
||||
{
|
||||
WeeklyIndex = KFGameReplicationInfo(KFPC.WorldInfo.GRI).CurrentWeeklyIndex;
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(WeeklyIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetPC().SetTimer(0.5f, false, nameof(PopulateData));
|
||||
}
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(WeeklyIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
|
||||
}
|
||||
|
||||
DataObject = CreateObject("Object");
|
||||
if(WeeklyInfo == none)
|
||||
if (WeeklyInfo == none)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
DataObject = CreateObject("Object");
|
||||
|
||||
DataObject.SetString("label", WeeklyInfo.FriendlyName);
|
||||
|
||||
if(WeeklyInfo.ModifierDescriptions.length > 0)
|
||||
{
|
||||
DataObject.SetString("description", WeeklyInfo.DescriptionStrings[0]);
|
||||
}
|
||||
|
||||
DataObject.SetString("iconPath", "img://"$WeeklyInfo.IconPath);
|
||||
|
||||
DataObject.SetBool("complete", bWeeklyComplete);
|
||||
@ -81,10 +135,8 @@ function bool PopulateData()
|
||||
}
|
||||
|
||||
PopulateModifiers(WeeklyInfo);
|
||||
PopulateRewards(WeeklyInfo, WeeklyIndex);
|
||||
PopulateRewards(WeeklyInfo, WeeklyIndex, bIsCustomWeekly);
|
||||
|
||||
bLastWeeklyComplete = bWeeklyComplete;
|
||||
bInitialDataPopulated = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -119,7 +171,7 @@ function PopulateModifiers(KFWeeklyOutbreakInformation WeeklyInfo)
|
||||
SetObject("modifiers", DataProvider); //pass to SWF
|
||||
}
|
||||
|
||||
function PopulateRewards(KFWeeklyOutbreakInformation WeeklyInfo, int WeeklyIndex)
|
||||
function PopulateRewards(KFWeeklyOutbreakInformation WeeklyInfo, int WeeklyIndex, bool bIsCustomWeekly)
|
||||
{
|
||||
local int i, ItemCount;
|
||||
local GFxObject DataProvider; //array containing the data objects
|
||||
@ -144,13 +196,15 @@ function PopulateRewards(KFWeeklyOutbreakInformation WeeklyInfo, int WeeklyIndex
|
||||
}
|
||||
}
|
||||
|
||||
SetObject("rewards", DataProvider); //pass to SWF
|
||||
UpdateDoshVaultRewardValue();
|
||||
}
|
||||
|
||||
function UpdateDoshVaultRewardValue()
|
||||
{
|
||||
SetInt("vaultDoshReward", class'KFOnlineStatsWrite'.static.GetWeeklyEventReward());
|
||||
if (bIsCustomWeekly == false)
|
||||
{
|
||||
SetObject("rewards", DataProvider); //pass to SWF
|
||||
SetInt("vaultDoshReward", class'KFOnlineStatsWrite'.static.GetWeeklyEventReward());
|
||||
}
|
||||
else
|
||||
{
|
||||
SetInt("setHideRewards", 1);
|
||||
}
|
||||
}
|
||||
|
||||
function GFxObject CreateRewardItem(KFWeeklyOutbreakInformation WeeklyInfo,int ItemID)
|
||||
@ -185,25 +239,34 @@ function GFxObject CreateRewardItem(KFWeeklyOutbreakInformation WeeklyInfo,int I
|
||||
return DataObject;
|
||||
}
|
||||
|
||||
function LocalizeMenu()
|
||||
function LocalizeMenu(bool bIsCustomWeekly)
|
||||
{
|
||||
local GFxObject TextObject;
|
||||
// local KFWeeklyOutbreakInformation WeeklyInfo;
|
||||
|
||||
// WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
|
||||
TextObject = CreateObject("Object");
|
||||
|
||||
// Localize static text
|
||||
TextObject.SetString("currentModifier", class'KFMission_LocalizedStrings'.default.CurrentWeeklySettingsString);
|
||||
TextObject.SetString("reward", class'KFMission_LocalizedStrings'.default.RewardsString);
|
||||
TextObject.SetString("granted", class'KFMission_LocalizedStrings'.default.GrantedWeeklyString);
|
||||
TextObject.SetString("weekly", class'KFMission_LocalizedStrings'.default.WeeklyString);
|
||||
TextObject.SetString("granted", class'KFMission_LocalizedStrings'.default.GrantedWeeklyString);
|
||||
|
||||
if (bIsCustomWeekly)
|
||||
{
|
||||
TextObject.SetString("weekly", class'KFMission_LocalizedStrings'.default.WeeklyString $class'KFMission_LocalizedStrings'.default.WeeklyCustomString);
|
||||
}
|
||||
else
|
||||
{
|
||||
TextObject.SetString("weekly", class'KFMission_LocalizedStrings'.default.WeeklyString);
|
||||
}
|
||||
|
||||
TextObject.SetString("overview", class'KFMission_LocalizedStrings'.default.WeeklyOverview);
|
||||
TextObject.SetString("vaultDosh", class'KFMission_LocalizedStrings'.default.VaultDoshString);
|
||||
/*
|
||||
if(WeeklyInfo != none && WeeklyInfo.ModifierDescriptions.length > 0)
|
||||
{
|
||||
TextObject.SetString("description", WeeklyInfo.ModifierDescriptions[0]);
|
||||
}
|
||||
*/
|
||||
|
||||
SetObject("localizedText", TextObject);
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
LastWeeklyPopulated = -1
|
||||
bLastWeeklyComplete = false
|
||||
}
|
36
KFGame/Classes/KFGFxWidget_BountyHunt.uc
Normal file
36
KFGame/Classes/KFGFxWidget_BountyHunt.uc
Normal 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);
|
||||
}
|
||||
}
|
@ -44,9 +44,15 @@ var bool bReadingPlayfabStoreData;
|
||||
var private{private} const int SeasonalEventId;
|
||||
var private const int LoadedSeasonalEventId;
|
||||
|
||||
/** Week index of the year - Used as index into weekly event */
|
||||
/** Week index of the year - Used as index into weekly event, this is the Intended one, the one the system time should apply */
|
||||
var private int IntendedWeeklyEventIndex;
|
||||
|
||||
/** Week index of the year - Used as index into weekly event, this is the one used by the game, it starts as the system time one but can be overriden later */
|
||||
var private int WeeklyEventIndex;
|
||||
|
||||
// If we forced via cmd line
|
||||
var private bool IsForceWeeklyEvent;
|
||||
|
||||
|
||||
/************************************************************************************
|
||||
* @name Content
|
||||
@ -469,8 +475,12 @@ function ClearOnlineDelegates()
|
||||
|
||||
/** Static because these are both called on default object */
|
||||
native static function int GetSeasonalEventID();
|
||||
native static function int GetIntendedWeeklyEventIndex();
|
||||
native static function int GetIntendedWeeklyEventIndexMod();
|
||||
native static function int GetWeeklyEventIndex();
|
||||
native static function int GetWeeklyEventIndexMod();
|
||||
native static function SetWeeklyEventIndex(int index);
|
||||
native static function bool GetIsForceWeeklyEvent();
|
||||
native static function bool IsSalesEventActive();
|
||||
native static function bool IsSalesEventChecked();
|
||||
/***********************************************************************************
|
||||
@ -649,7 +659,9 @@ DefaultProperties
|
||||
KFFontScale=0.65f
|
||||
SeasonalEventId=-1
|
||||
LoadedSeasonalEventId=-1
|
||||
IntendedWeeklyEventIndex=-1
|
||||
WeeklyEventIndex=-1
|
||||
IsForceWeeklyEvent=false
|
||||
LocalLoginStatus=LS_LoggedIn
|
||||
SafeFrameScale=1.0
|
||||
|
||||
|
@ -212,6 +212,7 @@ var protected const array< class<KFPawn_Monster> > AITestBossClassList; //List
|
||||
var protected int BossIndex; //Index into boss array, only preload content for the boss we want - PC builds can handle DLO cost much better
|
||||
|
||||
var int AllowSeasonalSkinsIndex;
|
||||
var int WeeklySelectorIndex;
|
||||
|
||||
/** Class replacements for each zed type */
|
||||
struct native SpawnReplacement
|
||||
@ -662,6 +663,29 @@ event InitGame( string Options, out string ErrorMessage )
|
||||
{
|
||||
local string OptionRead;
|
||||
|
||||
OptionRead = ParseOption(Options, "WeeklySelectorIndex");
|
||||
if (OptionRead != "")
|
||||
{
|
||||
WeeklySelectorIndex = int(OptionRead);
|
||||
}
|
||||
else // If doesn't exist on the Options we default it..
|
||||
{
|
||||
WeeklySelectorIndex = -1;
|
||||
}
|
||||
|
||||
if (WeeklySelectorIndex > 0)
|
||||
{
|
||||
// 0 is default, we move one index to the left so it matches first Weekly Mode
|
||||
KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(WeeklySelectorIndex - 1);
|
||||
}
|
||||
else if (KFGameEngine(class'Engine'.static.GetEngine()).GetIsForceWeeklyEvent() == false)
|
||||
{
|
||||
// If we didn't force via cmd line and we ask for default, force the intended to make sure we are updated
|
||||
KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(KFGameEngine(class'Engine'.static.GetEngine()).GetIntendedWeeklyEventIndex());
|
||||
}
|
||||
|
||||
`Log("TEST - InitGame : " $WeeklySelectorIndex);
|
||||
|
||||
Super.InitGame( Options, ErrorMessage );
|
||||
|
||||
if (UsesModifiedDifficulty())
|
||||
@ -760,6 +784,7 @@ function UpdateGameSettings()
|
||||
if (KFGameSettings != none)
|
||||
{
|
||||
KFGameSettings.bNoSeasonalSkins = AllowSeasonalSkinsIndex == 1;
|
||||
KFGameSettings.WeeklySelectorIndex = WeeklySelectorIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -917,7 +942,7 @@ event PreLogin(string Options, string Address, const UniqueNetId UniqueId, bool
|
||||
{
|
||||
local bool bSpectator;
|
||||
local bool bPerfTesting;
|
||||
local string DesiredDifficulty, DesiredWaveLength, DesiredGameMode;
|
||||
local string DesiredDifficulty, DesiredWaveLength, DesiredGameMode, DesiredWeeklySelectorIndex;
|
||||
|
||||
// Check for an arbitrated match in progress and kick if needed
|
||||
if (WorldInfo.NetMode != NM_Standalone && bUsingArbitration && bHasArbitratedHandshakeBegun)
|
||||
@ -965,8 +990,15 @@ event PreLogin(string Options, string Address, const UniqueNetId UniqueId, bool
|
||||
ErrorMessage = "Server No longer available. Mismatch DesiredGameMode.";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
DesiredWeeklySelectorIndex = ParseOption(Options, "WeeklySelectorIndex");
|
||||
if( DesiredWeeklySelectorIndex != "" && int(DesiredWeeklySelectorIndex) != WeeklySelectorIndex)
|
||||
{
|
||||
`log("Got bad weekly selector index"@DesiredWeeklySelectorIndex@"expected"@WeeklySelectorIndex);
|
||||
ErrorMessage = "Server No longer available. Mismatch DesiredWeeklySelectorIndex.";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
bPerfTesting = ( ParseOption( Options, "AutomatedPerfTesting" ) ~= "1" );
|
||||
bSpectator = bPerfTesting || ( ParseOption( Options, "SpectatorOnly" ) ~= "1" ) || ( ParseOption( Options, "CauseEvent" ) ~= "FlyThrough" );
|
||||
@ -1148,6 +1180,9 @@ function InitGRIVariables()
|
||||
MyKFGRI.bVersusGame = bIsVersusGame;
|
||||
MyKFGRI.MaxHumanCount = MaxPlayers;
|
||||
MyKFGRI.NotifyAllowSeasonalSkins(AllowSeasonalSkinsIndex);
|
||||
MyKFGRI.NotifyWeeklySelector(WeeklySelectorIndex);
|
||||
|
||||
`Log("TEST - InitGRIVariables- NotifyWeeklySelector : " $WeeklySelectorIndex);
|
||||
|
||||
SetBossIndex();
|
||||
}
|
||||
@ -1654,9 +1689,12 @@ function float GetTotalWaveCountScale()
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
if (OutbreakEvent != none && OutbreakEvent.ActiveEvent.WaveAICountScale.Length > 0)
|
||||
if (OutbreakEvent != none)
|
||||
{
|
||||
return GetLivingPlayerCount() > OutbreakEvent.ActiveEvent.WaveAICountScale.Length ? OutbreakEvent.ActiveEvent.WaveAICountScale[OutbreakEvent.ActiveEvent.WaveAICountScale.Length - 1] : OutbreakEvent.ActiveEvent.WaveAICountScale[GetLivingPlayerCount() - 1];
|
||||
if (OutbreakEvent.ActiveEvent.WaveAICountScale.Length > 0)
|
||||
{
|
||||
return GetLivingPlayerCount() > OutbreakEvent.ActiveEvent.WaveAICountScale.Length ? OutbreakEvent.ActiveEvent.WaveAICountScale[OutbreakEvent.ActiveEvent.WaveAICountScale.Length - 1] : OutbreakEvent.ActiveEvent.WaveAICountScale[GetLivingPlayerCount() - 1];
|
||||
}
|
||||
}
|
||||
|
||||
return 1.0f;
|
||||
@ -2231,7 +2269,7 @@ function class<DamageType> GetLastHitByDamageType(class<DamageType> DT, KFPawn_M
|
||||
}
|
||||
else
|
||||
{
|
||||
`warn( "GetLastHitByDamageType() Received non-KFDamageType damagetype:"@DT);
|
||||
//`warn( "GetLastHitByDamageType() Received non-KFDamageType damagetype:"@DT);
|
||||
}
|
||||
|
||||
return RealDT;
|
||||
@ -2577,6 +2615,7 @@ protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, cons
|
||||
&& DamageHistory[i].DamagerPRI != none )
|
||||
{
|
||||
EarnedDosh = Round( DamageHistory[i].TotalDamage * ScoreDenominator );
|
||||
|
||||
//`log("SCORING: Player" @ DamageHistory[i].DamagerPRI.PlayerName @ "received" @ EarnedDosh @ "dosh for killing a" @ MonsterClass, bLogScoring);
|
||||
DamagerKFPRI = KFPlayerReplicationInfo(DamageHistory[i].DamagerPRI);
|
||||
if( DamagerKFPRI != none )
|
||||
@ -2591,26 +2630,32 @@ protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, cons
|
||||
DamageHistory[i].DamagePerks[0].static.ModifyAssistDosh( EarnedDosh );
|
||||
}
|
||||
}
|
||||
if (bIsBossKill && !bSplitBossDoshReward)
|
||||
{
|
||||
DamagerKFPRI.AddDosh(GetAdjustedAIDoshValue(MonsterClass), true);
|
||||
}
|
||||
else
|
||||
{
|
||||
DamagerKFPRI.AddDosh(EarnedDosh, true);
|
||||
}
|
||||
|
||||
if (MyKFGRI.IsBountyHunt() == false)
|
||||
{
|
||||
if (bIsBossKill && !bSplitBossDoshReward)
|
||||
{
|
||||
DamagerKFPRI.AddDosh(GetAdjustedAIDoshValue(MonsterClass), true);
|
||||
}
|
||||
else
|
||||
{
|
||||
DamagerKFPRI.AddDosh(EarnedDosh, true);
|
||||
}
|
||||
}
|
||||
|
||||
if( DamagerKFPRI.Team != none )
|
||||
{
|
||||
//Dosh
|
||||
if (bIsBossKill && !bSplitBossDoshReward)
|
||||
{
|
||||
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(GetAdjustedAIDoshValue(MonsterClass));
|
||||
}
|
||||
else
|
||||
{
|
||||
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(EarnedDosh);
|
||||
if (MyKFGRI.IsBountyHunt() == false)
|
||||
{
|
||||
if (bIsBossKill && !bSplitBossDoshReward)
|
||||
{
|
||||
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(GetAdjustedAIDoshValue(MonsterClass));
|
||||
}
|
||||
else
|
||||
{
|
||||
KFTeamInfo_Human(DamagerKFPRI.Team).AddScore(EarnedDosh);
|
||||
}
|
||||
}
|
||||
|
||||
if( DamageHistory[i].DamagePerks.Length <= 0 )
|
||||
@ -3003,12 +3048,35 @@ function string GetNextMap()
|
||||
*/
|
||||
if (IsWeekly())
|
||||
{
|
||||
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
|
||||
|
||||
if ((class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 0 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[0]) || // Boom
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 1 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[1]) || // Cranium Cracker
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 2 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[2]) || // Tiny Terror
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 3 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[3]) || // Bobble Zed
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 4 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[4]) || // Poundemonium
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 5 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[5]) || // Up Up and Decay
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 6 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[6]) || // Zed Time
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 7 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[7]) || // Beefcake
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 8 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[8]) || // Bloodthirst
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 9 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[9]) || // Coliseum
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 10 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[10]) || // Arachnophobia
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 11 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[11]) || // Scavenger
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[12]) || // WW
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 13 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[13]) || // Abandon
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 15 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[15]) || // Shrunken Heads
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 18 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[18])) // Perk Roulette
|
||||
{
|
||||
if (MapName == MapSantas)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ((class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 11 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[11]) || // Scavenger
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14]) || // Boss Rush
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 16 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[16])) // Gun Game
|
||||
{
|
||||
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
|
||||
|
||||
if (MapName == MapBiolapse ||
|
||||
MapName == MapNightmare ||
|
||||
MapName == MapPowerCore ||
|
||||
@ -3021,8 +3089,6 @@ function string GetNextMap()
|
||||
|
||||
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 19 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[19]) // Contamination
|
||||
{
|
||||
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
|
||||
|
||||
if (MapName == MapBiolapse ||
|
||||
MapName == MapNightmare ||
|
||||
MapName == MapPowerCore ||
|
||||
@ -3035,13 +3101,27 @@ function string GetNextMap()
|
||||
}
|
||||
}
|
||||
|
||||
/* Temporary removal of SteamFrotress for BossRush */
|
||||
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14] &&
|
||||
MapName == MapSteam)
|
||||
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 20 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[20]) // Bounty Hunt
|
||||
{
|
||||
continue;
|
||||
if (MapName == MapBiolapse ||
|
||||
MapName == MapNightmare ||
|
||||
MapName == MapPowerCore ||
|
||||
MapName == MapDescent ||
|
||||
MapName == MapKrampus ||
|
||||
MapName == MapElysium ||
|
||||
MapName == MapSteam)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14])
|
||||
{
|
||||
if (MapName == MapSteam)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
/* */
|
||||
}
|
||||
|
||||
if ( IsMapAllowedInCycle(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]) )
|
||||
@ -4001,6 +4081,16 @@ simulated function ModifyDamageGiven(out int InDamage, optional Actor DamageCaus
|
||||
**********************************************/
|
||||
simulated function NotifyPlayerStatsInitialized(KFPlayerController_WeeklySurvival KFPC){}
|
||||
|
||||
simulated function int WeeklyExtraNumberOfZeds()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
simulated function int WeeklyCurrentExtraNumberOfZeds()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
/** Scoring */
|
||||
@ -4047,6 +4137,7 @@ defaultproperties
|
||||
bWaitingToStartMatch=true
|
||||
bDelayedStart=true
|
||||
AllowSeasonalSkinsIndex=0
|
||||
WeeklySelectorIndex=-1
|
||||
|
||||
ActionMusicDelay=5.0
|
||||
ForcedMusicTracks(0)=KFMusicTrackInfo'WW_MMNU_Login.TrackInfo' // menu
|
||||
|
@ -386,6 +386,7 @@ var repnotify int VIPRepMaxHealth;
|
||||
var repnotify KFPlayerReplicationInfo VIPRepPlayer;
|
||||
|
||||
var bool bAllowSeasonalSkins;
|
||||
var int WeeklySelectorIndex;
|
||||
|
||||
/************************************
|
||||
* Steam heartbeat
|
||||
@ -421,11 +422,11 @@ replication
|
||||
TraderVolume, TraderVolumeCheckType, bTraderIsOpen, NextTrader, WaveNum, bWaveIsEndless, GunGameWavesCurrent, bWaveGunGameIsFinal, AIRemaining, WaveTotalAICount, bWaveIsActive, MaxHumanCount, bGlobalDamage,
|
||||
CurrentObjective, PreviousObjective, PreviousObjectiveResult, PreviousObjectiveXPResult, PreviousObjectiveVoshResult, MusicIntensity, ReplicatedMusicTrackInfo, MusicTrackRepCount,
|
||||
bIsUnrankedGame, GameSharedUnlocks, bHidePawnIcons, ConsoleGameSessionGuid, GameDifficulty, GameDifficultyModifier, BossIndex, bWaveStarted, NextObjective, bIsBrokenTrader, bIsWeeklyMode,
|
||||
CurrentWeeklyIndex, bIsEndlessPaused, bForceSkipTraderUI, VIPRepCurrentHealth, VIPRepMaxHealth, VIPRepPlayer; //@HSL - JRO - 3/21/2016 - PS4 Sessions
|
||||
bIsEndlessPaused, bForceSkipTraderUI, VIPRepCurrentHealth, VIPRepMaxHealth, VIPRepPlayer; //@HSL - JRO - 3/21/2016 - PS4 Sessions
|
||||
if ( bNetInitial )
|
||||
GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled, bForceShowSkipTrader, bAllowSeasonalSkins;
|
||||
if ( bNetInitial || bNetDirty )
|
||||
PerksAvailableData;
|
||||
CurrentWeeklyIndex, WeeklySelectorIndex, PerksAvailableData;
|
||||
if ( bNetInitial && Role == ROLE_Authority )
|
||||
ServerAdInfo;
|
||||
|
||||
@ -1376,7 +1377,7 @@ simulated function DisplayDebug(HUD HUD, out float YL, out float YPos)
|
||||
TotalClots++;
|
||||
NumAlphas++;
|
||||
}
|
||||
else if( KFPM.IsA('KFPawn_ZedClot_Cyst') )
|
||||
else if( KFPM.IsA('KFPawn_ZedClot_Cyst') || KFPM.IsA('KFPawn_ZedHansClot') )
|
||||
{
|
||||
TotalClots++;
|
||||
NumUnders++;
|
||||
@ -2312,10 +2313,16 @@ simulated function NotifyWeeklyEventIndex(int EventIndex)
|
||||
simulated function NotifyAllowSeasonalSkins(int AllowSeasonalSkinsIndex)
|
||||
{
|
||||
bAllowSeasonalSkins = (AllowSeasonalSkinsIndex == 0);
|
||||
|
||||
`Log("NotifyAllowSeasonalSkins: AllowSeasonalSkins: "$bAllowSeasonalSkins);
|
||||
bNetDirty = true;
|
||||
}
|
||||
|
||||
simulated function NotifyWeeklySelector(int WeeklySelectorIndex_)
|
||||
{
|
||||
WeeklySelectorIndex = WeeklySelectorIndex_;
|
||||
|
||||
bNetDirty = true;
|
||||
|
||||
`Log("TEST - NotifyWeeklySelector : " $WeeklySelectorIndex);
|
||||
}
|
||||
|
||||
/** VIP weekly */
|
||||
@ -2449,6 +2456,27 @@ simulated function int ContaminationModeExtraDosh()
|
||||
return 0;
|
||||
}
|
||||
|
||||
simulated function bool IsBountyHunt()
|
||||
{
|
||||
return bIsWeeklyMode && CurrentWeeklyIndex == 20;
|
||||
}
|
||||
|
||||
simulated function int BountyHuntExtraDosh()
|
||||
{
|
||||
local KFGameInfo KFGI;
|
||||
|
||||
if (IsBountyHunt())
|
||||
{
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
if (KFGI != none && KFGI.OutbreakEvent != none)
|
||||
{
|
||||
return KFGI.OutbreakEvent.ActiveEvent.BountyHuntExtraDosh;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
TraderItemsPath="GP_Trader_ARCH.DefaultTraderItems"
|
||||
@ -2471,6 +2499,7 @@ defaultproperties
|
||||
bIsWeeklyMode=false
|
||||
bForceShowSkipTrader=false
|
||||
bAllowSeasonalSkins=true
|
||||
WeeklySelectorIndex=-1
|
||||
bForceSkipTraderUI=false
|
||||
GunGameWavesCurrent=1
|
||||
bWaveGunGameIsFinal=false
|
||||
|
@ -33,6 +33,7 @@ var transient int CurrentSearchIndex;
|
||||
var const string ModeKey, DifficultyKey, MapKey, WhitelistedKey, InProgressKey, PermissionsKey, ServerTypeKey;
|
||||
var const string GameLengthKey;
|
||||
var const string AllowSeasonalSkinsKey;
|
||||
var const string WeeklySelectorKey;
|
||||
|
||||
var KFGFxStartGameContainer_FindGame FindGameContainer;
|
||||
var KFGFxStartGameContainer_Options OptionsComponent;
|
||||
@ -68,6 +69,7 @@ var localized string MapTitle;
|
||||
var localized string MutatorTitle;
|
||||
var localized string PermissionsTitle;
|
||||
var localized string AllowSeasonalSkinsTitle;
|
||||
var localized string WeeklySelectorTitle;
|
||||
var localized string ServerTypeString;
|
||||
var localized string WhiteListedTitle;
|
||||
var localized string InfoTitle;
|
||||
@ -208,7 +210,7 @@ static function class<KFGFxSpecialeventObjectivesContainer> GetSpecialEventClass
|
||||
case SEI_Summer:
|
||||
return class'KFGFxSpecialEventObjectivesContainer_Summer2023';
|
||||
case SEI_Fall:
|
||||
return class'KFGFxSpecialEventObjectivesContainer_Fall2022';
|
||||
return class'KFGFxSpecialEventObjectivesContainer_Fall2023';
|
||||
case SEI_Winter:
|
||||
return class'KFGFXSpecialEventObjectivesContainer_Xmas2022';
|
||||
}
|
||||
@ -608,6 +610,7 @@ function SendLeaderOptions()
|
||||
SetLobbyData(ModeKey, String(Manager.GetModeIndex()));
|
||||
SetLobbyData(PermissionsKey, String(OptionsComponent.GetPrivacyIndex()));
|
||||
SetLobbyData(AllowSeasonalSkinsKey, String(OptionsComponent.GetAllowSeasonalSkinsIndex()));
|
||||
SetLobbyData(WeeklySelectorKey, String(OptionsComponent.GetWeeklySelectorIndex()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -640,6 +643,9 @@ function ReceiveLeaderOptions()
|
||||
|
||||
OptionIndex = Int(OnlineLobby.GetLobbyData(0, AllowSeasonalSkinsKey));
|
||||
OverviewContainer.UpdateAllowSeasonalSkins(class'KFCommon_LocalizedStrings'.static.GetAllowSeasonalSkinsString(OptionIndex));
|
||||
|
||||
OptionIndex = Int(OnlineLobby.GetLobbyData(0, WeeklySelectorKey));
|
||||
OverviewContainer.UpdateWeeklySelector(class'KFCommon_LocalizedStrings'.static.GetWeeklySelectorString(OptionIndex));
|
||||
}
|
||||
|
||||
function ApproveMatchMakingLeave()
|
||||
@ -924,6 +930,7 @@ function Callback_CancelSearch()
|
||||
function Callback_OptionListOpened(string ListName, int OptionIndex)
|
||||
{
|
||||
local string MessageString;
|
||||
local int IntendedWeeklyIndex;
|
||||
|
||||
if (OptionsComponent.bIsSoloGame && ListName == "modeList")
|
||||
{
|
||||
@ -939,6 +946,12 @@ function Callback_OptionListOpened(string ListName, int OptionIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (ListName == "weeklySelectorList" && OptionIndex == 0)
|
||||
{
|
||||
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
|
||||
OptionIndex = IntendedWeeklyIndex + 1;
|
||||
}
|
||||
|
||||
MessageString = Localize("StartMenuHelperText", ListName$OptionIndex, "KFGame");
|
||||
|
||||
@ -1092,6 +1105,11 @@ function Callback_AllowSeasonalSkins(int Index)
|
||||
OptionsComponent.AllowSeasonalSkinsChanged(Index);
|
||||
}
|
||||
|
||||
function Callback_WeeklySelector(int Index)
|
||||
{
|
||||
OptionsComponent.WeeklySelectorChanged(Index);
|
||||
}
|
||||
|
||||
function SetLobbyData( string KeyName, string ValueData )
|
||||
{
|
||||
OnlineLobby.SetLobbyData( KeyName, ValueData );
|
||||
@ -1100,14 +1118,25 @@ function SetLobbyData( string KeyName, string ValueData )
|
||||
function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent)
|
||||
{
|
||||
local string MapName;
|
||||
local int LengthIndex, ModeIndex, AllowSeasonalSkins;
|
||||
local int LengthIndex, ModeIndex, AllowSeasonalSkins, WeeklySelectorIndex, IntendedWeeklyIndex;
|
||||
local string MapURL;
|
||||
local byte CurrentMenuState;
|
||||
|
||||
MapName = "";
|
||||
|
||||
// this is ugly, but effectively makes sure that the player isn't solo with versus selected
|
||||
// or other error cases such as when the game isn't fully installed
|
||||
ModeIndex = InOptionsComponent.GetNormalizedGameModeIndex(Manager.GetModeIndex(true));
|
||||
LengthIndex = InOptionsComponent.GetLengthIndex();
|
||||
|
||||
MapName = InOptionsComponent.GetMapName();
|
||||
CurrentMenuState = GetStartMenuState();
|
||||
|
||||
// In Find a Match we can't choose map, so don't use the options dropwdown
|
||||
if (CurrentMenuState != EMatchmaking)
|
||||
{
|
||||
MapName = InOptionsComponent.GetMapName();
|
||||
}
|
||||
|
||||
if (MapName == "" || MapStringList.Find(MapName) == INDEX_NONE)
|
||||
{
|
||||
if (CurrentConnectMap != "" && MapStringList.Find(CurrentConnectMap) != INDEX_NONE)
|
||||
@ -1148,19 +1177,58 @@ function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent)
|
||||
else
|
||||
{
|
||||
AllowSeasonalSkins = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (GetStartMenuState() == EMatchmaking
|
||||
if (CurrentMenuState == EMatchmaking
|
||||
|| class'KFGameEngine'.static.GetSeasonalEventID() == SEI_None
|
||||
|| class'KFGameEngine'.static.GetSeasonalEventID() == SEI_Spring)
|
||||
{
|
||||
AllowSeasonalSkins = 1; // Default if we don't have a season or it's find a match menu
|
||||
}
|
||||
|
||||
return MapName$"?Game="$class'KFGameInfo'.static.GetGameModeClassFromNum( ModeIndex )
|
||||
MapURL = MapName$"?Game="$class'KFGameInfo'.static.GetGameModeClassFromNum( ModeIndex )
|
||||
$"?Difficulty="$class'KFGameDifficultyInfo'.static.GetDifficultyValue( InOptionsComponent.GetDifficultyIndex() )
|
||||
$"?GameLength="$LengthIndex
|
||||
$"?AllowSeasonalSkins="$AllowSeasonalSkins;
|
||||
|
||||
if (ModeIndex == 1) // Only when mode is Weekly
|
||||
{
|
||||
WeeklySelectorIndex = -1;
|
||||
|
||||
// Depending on StartMenu State we takeover with different weekly index selection
|
||||
|
||||
Switch (CurrentMenuState)
|
||||
{
|
||||
case EMatchmaking:
|
||||
// always default on "Find Game"
|
||||
WeeklySelectorIndex = 0;
|
||||
break;
|
||||
|
||||
case ECreateGame:
|
||||
case ESoloGame:
|
||||
// use your selection on "Create Game" and "Play Solo"
|
||||
WeeklySelectorIndex = InOptionsComponent.GetWeeklySelectorIndex();
|
||||
|
||||
// IF index matches default, set to 0 (default)
|
||||
if (WeeklySelectorIndex > 0)
|
||||
{
|
||||
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
|
||||
if (IntendedWeeklyIndex == (WeeklySelectorIndex - 1))
|
||||
{
|
||||
WeeklySelectorIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (WeeklySelectorIndex >= 0)
|
||||
{
|
||||
MapURL $= "?WeeklySelectorIndex="$WeeklySelectorIndex;
|
||||
}
|
||||
}
|
||||
|
||||
return MapURL;
|
||||
}
|
||||
|
||||
native function bool GetSearchComplete(KFOnlineGameSearch GameSearch);
|
||||
@ -1510,6 +1578,8 @@ function BuildServerFilters(OnlineGameInterface GameInterfaceSteam, KFGFxStartGa
|
||||
local string GameTagFilters;
|
||||
local ActiveLobbyInfo LobbyInfo;
|
||||
//local bool bAllowSeasonal;
|
||||
local byte CurrentMenuState;
|
||||
local int WeeklySelectorIndex, IntendedWeeklyIndex;
|
||||
|
||||
Search.ClearServerFilters();
|
||||
|
||||
@ -1562,6 +1632,44 @@ function BuildServerFilters(OnlineGameInterface GameInterfaceSteam, KFGFxStartGa
|
||||
Search.AddGametagFilter( GameTagFilters, 'Mode', string(GameMode) );
|
||||
}
|
||||
|
||||
if (GameMode == 1) // Only when mode is Weekly
|
||||
{
|
||||
WeeklySelectorIndex = -1;
|
||||
|
||||
// Depending on StartMenu State we Search with different weekly index selection
|
||||
CurrentMenuState = GetStartMenuState();
|
||||
|
||||
Switch (EStartMenuState(CurrentMenuState))
|
||||
{
|
||||
/*case EMatchmaking:
|
||||
// We take any weekly, so don't specify
|
||||
WeeklySelectorIndex = 0;
|
||||
break;
|
||||
*/
|
||||
case ECreateGame:
|
||||
case ESoloGame:
|
||||
// use your selection on "Create Game" and "Play Solo"
|
||||
WeeklySelectorIndex = OptionsComponent.GetWeeklySelectorIndex();
|
||||
|
||||
// IF index matches default, set to 0 (default)
|
||||
if (WeeklySelectorIndex > 0)
|
||||
{
|
||||
IntendedWeeklyIndex = class'KFGameEngine'.static.GetIntendedWeeklyEventIndexMod();
|
||||
if (IntendedWeeklyIndex == (WeeklySelectorIndex - 1))
|
||||
{
|
||||
WeeklySelectorIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (WeeklySelectorIndex >= 0)
|
||||
{
|
||||
Search.AddGametagFilter(GameTagFilters, 'WeeklySelectorIndex', string(WeeklySelectorIndex));
|
||||
}
|
||||
}
|
||||
|
||||
//For modes that don't use filtered difficulty, don't even attempt to send this (Ex: Weekly)
|
||||
if (ShouldUseDifficultyFilter(GameMode))
|
||||
{
|
||||
@ -1959,6 +2067,7 @@ defaultproperties
|
||||
InProgressKey="InProgress"
|
||||
PermissionsKey="PermissionsKey"
|
||||
AllowSeasonalSkinsKey="AllowSeasonalSkinsKey"
|
||||
WeeklySelectorKey="WeeklySelectorKey"
|
||||
|
||||
SearchDSName=KFGameSearch
|
||||
|
||||
|
@ -780,6 +780,16 @@ function Callback_PerkChanged(int PerkIndex)
|
||||
{
|
||||
MyKFPC.SetHaveUpdatePerk(true);
|
||||
|
||||
if (KFPerk_Survivalist(MyKFPC.CurrentPerk) != none)
|
||||
{
|
||||
KFPerk_Survivalist(MyKFPC.CurrentPerk).StartingWeaponClassIndex = MyKFPC.SurvivalPerkWeapIndex;
|
||||
KFPerk_Survivalist(MyKFPC.CurrentPerk).StartingGrenadeClassIndex = MyKFPC.SurvivalPerkGrenIndex;
|
||||
|
||||
KFPerk_Survivalist(MyKFPC.CurrentPerk).UpdateCurrentGrenade();
|
||||
|
||||
MyKFPC.GetPurchaseHelper().InitializeOwnedGrenade();
|
||||
}
|
||||
|
||||
// re-initialize and refresh to reflect current carry weight (can change by perk)
|
||||
MyKFPC.GetPurchaseHelper().Initialize(false);
|
||||
RefreshItemComponents();
|
||||
@ -792,6 +802,7 @@ function Callback_PerkChanged(int PerkIndex)
|
||||
{
|
||||
PlayerInventoryContainer.UpdateLock();
|
||||
}
|
||||
|
||||
UpdatePlayerInfo();
|
||||
|
||||
// Refresht he UI
|
||||
|
@ -1872,6 +1872,20 @@ event bool FilterButtonInput(int ControllerId, name ButtonName, EInputEvent Inpu
|
||||
CurrentMenu.Callback_ReadyClicked(true);
|
||||
}
|
||||
}
|
||||
else if (ButtonName == 'XboxTypeS_DPad_Left')
|
||||
{
|
||||
if(CurrentMenu != none)
|
||||
{
|
||||
CurrentMenu.OnDpadPressed(-1);
|
||||
}
|
||||
}
|
||||
else if (ButtonName == 'XboxTypeS_DPad_Right')
|
||||
{
|
||||
if(CurrentMenu != none)
|
||||
{
|
||||
CurrentMenu.OnDpadPressed(1);
|
||||
}
|
||||
}
|
||||
else if(ButtonName == 'XboxTypeS_RightThumbstick')
|
||||
{
|
||||
if(CurrentMenu != none)
|
||||
@ -2278,6 +2292,11 @@ function int GetModeIndex(optional bool bAdjustedIndex = true)
|
||||
return SavedModeIndex;
|
||||
}
|
||||
|
||||
function int GetWeeklySelectorIndex()
|
||||
{
|
||||
return CachedProfile.GetProfileInt(KFID_SavedWeeklySelectorIndex);
|
||||
}
|
||||
|
||||
function OnLoginOnOtherPlatformDoneAndFriendsReady()
|
||||
{
|
||||
local KFGFxPopup_FriendsList FriendsList;
|
||||
|
@ -36,6 +36,11 @@ function InitOnlineLobby()
|
||||
OnlineLobby = GetPC().OnlineSub.GetLobbyInterface();
|
||||
}
|
||||
}
|
||||
|
||||
function OnDpadPressed(int Right)
|
||||
{
|
||||
}
|
||||
|
||||
function OnR3Pressed()
|
||||
{
|
||||
local KFPlayerController KFPC;
|
||||
@ -516,6 +521,16 @@ function Callback_OnLoadoutNextWeaponPressed()
|
||||
Manager.PerksMenu.OnNextWeaponPressed();
|
||||
}
|
||||
|
||||
function Callback_OnLoadoutPrevSecondaryWeaponPressed()
|
||||
{
|
||||
Manager.PerksMenu.OnPrevSecondaryWeaponPressed();
|
||||
}
|
||||
|
||||
function Callback_OnLoadoutNextSecondaryWeaponPressed()
|
||||
{
|
||||
Manager.PerksMenu.OnNextSecondaryWeaponPressed();
|
||||
}
|
||||
|
||||
function Callback_OnLoadoutPrevGrenadePressed()
|
||||
{
|
||||
Manager.PerksMenu.OnPrevGrenadePressed();
|
||||
|
@ -673,6 +673,11 @@ function DrawHUD()
|
||||
// Draw last remaining zeds
|
||||
CheckAndDrawRemainingZedIcons();
|
||||
|
||||
if (KFGRI.IsBountyHunt())
|
||||
{
|
||||
CheckAndDrawBountyHudIcons();
|
||||
}
|
||||
|
||||
if (KFGRI.IsContaminationMode())
|
||||
{
|
||||
// While on trader time we let previsualize the next objective icon, so players can get ready
|
||||
@ -698,7 +703,19 @@ function DrawHUD()
|
||||
|
||||
Canvas.EnableStencilTest(false);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if( !KFGRI.bHidePawnIcons )
|
||||
{
|
||||
// Draw last remaining zeds
|
||||
CheckAndDrawRemainingZedIcons();
|
||||
|
||||
if (KFGRI.IsBountyHunt())
|
||||
{
|
||||
CheckAndDrawBountyHudIcons();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1382,6 +1399,7 @@ function CheckAndDrawRemainingZedIcons()
|
||||
local Pawn P;
|
||||
local vector ViewLocation, ViewDir, PawnLocation;
|
||||
local rotator ViewRotation;
|
||||
local KFPawn_Monster Monster;
|
||||
|
||||
if( KFGRI == none
|
||||
|| KFPlayerOwner == none
|
||||
@ -1402,20 +1420,109 @@ function CheckAndDrawRemainingZedIcons()
|
||||
if( P.Mesh.SkeletalMesh == none
|
||||
|| !P.Mesh.bAnimTreeInitialised
|
||||
|| P.GetTeamNum() == PlayerOwner.GetTeamNum()
|
||||
|| !P.IsAliveAndWell())
|
||||
|| !P.IsAliveAndWell() )
|
||||
//|| `TimeSince(P.Mesh.LastRenderTime) < 0.2f )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Monster = KFPawn_Monster(P);
|
||||
if (Monster != none && Monster.bIsBountyHuntObjective)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
PawnLocation = P.Mesh.GetPosition();
|
||||
|
||||
DrawZedIcon( P, PawnLocation, Normal((PawnLocation + (P.CylinderComponent.CollisionHeight * vect(0, 0, 1))) - ViewLocation) dot ViewDir);
|
||||
DrawZedIcon( P, PawnLocation
|
||||
, Normal((PawnLocation + (P.CylinderComponent.CollisionHeight * vect(0, 0, 1))) - ViewLocation) dot ViewDir
|
||||
, ZedIconColor, 1.f);
|
||||
}
|
||||
}
|
||||
|
||||
function CheckAndDrawBountyHudIcons()
|
||||
{
|
||||
local KFPawn_Monster Monster;
|
||||
local vector ViewLocation, ViewDir, PawnLocation;
|
||||
local rotator ViewRotation;
|
||||
local color ZedColor;
|
||||
local float WaveProgress;
|
||||
|
||||
if( KFGRI == none
|
||||
|| KFPlayerOwner == none
|
||||
|| KFPlayerOwner.PlayerCamera == none
|
||||
|| KFGRI.IsBossWave()
|
||||
|| KFGRI.IsEndlessWave())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
KFPlayerOwner.PlayerCamera.GetCameraViewPoint( ViewLocation, ViewRotation );
|
||||
ViewDir = vector( ViewRotation );
|
||||
|
||||
if (KFGRI.WaveTotalAICount > 0)
|
||||
{
|
||||
WaveProgress = float(KFGRI.AIRemaining) / float(KFGRI.WaveTotalAICount);
|
||||
}
|
||||
else
|
||||
{
|
||||
WaveProgress = 1.f;
|
||||
}
|
||||
|
||||
foreach WorldInfo.AllPawns( class'KFPawn_Monster', Monster )
|
||||
{
|
||||
if (Monster.bIsBountyHuntObjective == false)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Monster.IsAliveAndWell() == false)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Monster.Mesh.SkeletalMesh != none
|
||||
&& Monster.Mesh.bAnimTreeInitialised)
|
||||
{
|
||||
PawnLocation = Monster.Mesh.GetPosition();
|
||||
}
|
||||
else
|
||||
{
|
||||
PawnLocation = Monster.Location;
|
||||
}
|
||||
|
||||
ZedColor = ZedIconColor;
|
||||
|
||||
if (Monster.bIsBountyHuntOnLastTier)
|
||||
{
|
||||
// Red (R = 255, G = 0, B = 0, A = 192)
|
||||
ZedColor.R = 255;
|
||||
ZedColor.G = 0;
|
||||
ZedColor.B = 0;
|
||||
}
|
||||
else if (WaveProgress < 0.5f)
|
||||
{
|
||||
// Orange (R = 255, G = 128, B = 0, A = 192)
|
||||
ZedColor.R = 255;
|
||||
ZedColor.G = 128;
|
||||
ZedColor.B = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Yellow (R = 255, G = 255, B = 0, A = 192)
|
||||
ZedColor.R = 255;
|
||||
ZedColor.G = 255;
|
||||
ZedColor.B = 0;
|
||||
}
|
||||
|
||||
DrawZedIcon( Monster, PawnLocation
|
||||
, Normal((PawnLocation + (Monster.CylinderComponent.CollisionHeight * vect(0, 0, 1))) - ViewLocation) dot ViewDir
|
||||
, ZedColor, 1.5f);
|
||||
}
|
||||
}
|
||||
|
||||
/** Draws a zed icon */
|
||||
function DrawZedIcon( Pawn ZedPawn, vector PawnLocation, float NormalizedAngle )
|
||||
function DrawZedIcon( Pawn ZedPawn, vector PawnLocation, float NormalizedAngle, color ColorToUse, float SizeMultiplier )
|
||||
{
|
||||
local vector ScreenPos, TargetLocation;
|
||||
local float IconSizeMult;
|
||||
@ -1425,7 +1532,7 @@ function DrawZedIcon( Pawn ZedPawn, vector PawnLocation, float NormalizedAngle )
|
||||
|
||||
TargetLocation = PawnLocation + ( vect(0,0,2.5f) * ZedPawn.CylinderComponent.CollisionHeight );
|
||||
ScreenPos = Canvas.Project( TargetLocation );
|
||||
IconSizeMult = PlayerStatusIconSize * ResModifier * 0.5f;
|
||||
IconSizeMult = PlayerStatusIconSize * ResModifier * 0.5f * SizeMultiplier;
|
||||
ScreenPos.X -= IconSizeMult;
|
||||
ScreenPos.Y -= IconSizeMult;
|
||||
|
||||
@ -1448,9 +1555,8 @@ function DrawZedIcon( Pawn ZedPawn, vector PawnLocation, float NormalizedAngle )
|
||||
ScreenPos = GetClampedScreenPosition(ScreenPos);
|
||||
}
|
||||
|
||||
|
||||
// Draw boss icon
|
||||
Canvas.SetDrawColorStruct( ZedIconColor );
|
||||
Canvas.SetDrawColorStruct( ColorToUse );
|
||||
Canvas.SetPos( ScreenPos.X, ScreenPos.Y );
|
||||
Canvas.DrawTile( GenericZedIconTexture, IconSizeMult, IconSizeMult, 0, 0, 128, 128 );
|
||||
}
|
||||
|
@ -543,6 +543,22 @@ simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon, o
|
||||
{
|
||||
local KFWeapon W, BestWeapon, BackupGun;
|
||||
local float Rating, BestRating;
|
||||
local PlayerController PC;
|
||||
|
||||
PC = PlayerController(Instigator.Controller);
|
||||
if (PC != none && KFPawn(PC.Pawn) != none)
|
||||
{
|
||||
BestWeapon = KFPawn(PC.Pawn).FindBestWeapon(true, allow9mm);
|
||||
if (BestWeapon == none && allow9mm == false)
|
||||
{
|
||||
BestWeapon = KFPawn(PC.Pawn).FindBestWeapon(true, true);
|
||||
}
|
||||
|
||||
if (BestWeapon != none)
|
||||
{
|
||||
return BestWeapon;
|
||||
}
|
||||
}
|
||||
|
||||
ForEach InventoryActors( class'KFWeapon', W )
|
||||
{
|
||||
@ -1369,7 +1385,7 @@ simulated function AttemptQuickHeal()
|
||||
/** Equip the welder immediately */
|
||||
simulated function bool QuickWeld()
|
||||
{
|
||||
local KFWeapon KFW;
|
||||
local KFWeapon KFW, PreviousKFW;
|
||||
local KFInterface_Usable UsableTrigger;
|
||||
local KFDoorTrigger DoorTrigger;
|
||||
local KFRepairableActorTrigger RepairableTrigger;
|
||||
@ -1382,8 +1398,8 @@ simulated function bool QuickWeld()
|
||||
}
|
||||
|
||||
// make sure player is actually allowed to switch weapons
|
||||
KFW = KFWeapon( Instigator.Weapon );
|
||||
if( KFW != none && !KFW.CanSwitchWeapons() )
|
||||
PreviousKFW = KFWeapon( Instigator.Weapon );
|
||||
if( PreviousKFW != none && !PreviousKFW.CanSwitchWeapons() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -1413,6 +1429,7 @@ simulated function bool QuickWeld()
|
||||
{
|
||||
if( KFW.IsA('KFWeap_Welder') )
|
||||
{
|
||||
KFPC.MyGFxHUD.WeaponSelectWidget.UpdateWeaponGroupOnHUD(PreviousKFW.InventoryGroup);
|
||||
SetCurrentWeapon(KFW);
|
||||
ShowAllHUDGroups();
|
||||
return true;
|
||||
@ -2674,7 +2691,8 @@ simulated function int GetAdjustedSellPriceFor(
|
||||
|
||||
// if OwnedItem is a dual, set sell price to that of a single (because we sell one single and keep one single)
|
||||
// Special case for 9mm
|
||||
if( OwnedItem.SingleClassName == 'KFWeap_Pistol_9mm')
|
||||
if( OwnedItem.SingleClassName == 'KFWeap_Pistol_9mm'
|
||||
|| OwnedItem.SingleClassName == 'KFWeap_HRG_93R' )
|
||||
{
|
||||
// @todo: revisit
|
||||
// assume price of single is half the price of dual. might be better to use the actual buy price of the single,
|
||||
@ -2712,7 +2730,7 @@ simulated function int GetDisplayedBlocksRequiredFor( const out STraderItem Shop
|
||||
|
||||
// for now, only adjust blocks required for duals, except for dual 9mm since the single 9mm doesn't require any blocks
|
||||
// display half weight of dual if player owns single
|
||||
if( !(ShopItem.SingleClassName == '' || ShopItem.SingleClassName == 'KFWeap_Pistol_9mm') && GetIsOwned(ShopItem.SingleClassName) )
|
||||
if( !(ShopItem.SingleClassName == '' || ShopItem.SingleClassName == 'KFWeap_Pistol_9mm' || ShopItem.SingleClassName == 'KFWeap_HRG_93R') && GetIsOwned(ShopItem.SingleClassName) )
|
||||
{
|
||||
BlocksRequired /= 2;
|
||||
}
|
||||
@ -2798,6 +2816,21 @@ simulated event DiscardInventory()
|
||||
}
|
||||
}
|
||||
|
||||
simulated function bool Is9mmInInventory()
|
||||
{
|
||||
local Inventory Inv;
|
||||
|
||||
for (Inv = InventoryChain; Inv != None; Inv = Inv.Inventory)
|
||||
{
|
||||
if (Inv.Class.name == 'KFWeap_Pistol_9mm' || Inv.Class.name == 'KFWeap_Pistol_Dual9mm')
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
PendingFire(0)=0 // DEFAULT_FIREMOD
|
||||
|
@ -13,6 +13,7 @@ class KFMission_LocalizedStrings extends Object
|
||||
|
||||
var localized string GrantedWeeklyString;
|
||||
var localized string WeeklyString;
|
||||
var localized string WeeklyCustomString;
|
||||
var localized string CurrentWeeklySettingsString;
|
||||
|
||||
var localized string SpecialEventString;
|
||||
|
@ -74,6 +74,7 @@ defaultproperties
|
||||
ColumnIds.Add(STATID_ACHIEVE_BarmwichCollectibles)
|
||||
ColumnIds.Add(STATID_ACHIEVE_CrashCollectibles);
|
||||
ColumnIds.Add(STATID_ACHIEVE_SubductionCollectibles);
|
||||
ColumnIds.Add(STATID_ACHIEVE_VolterCastleCollectibles);
|
||||
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky5, Name="AchievementMrPerky5"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky10, Name = "AchievementMrPerky10"))
|
||||
@ -136,5 +137,6 @@ defaultproperties
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_BarmwichCollectibles,Name="AchievementCollectBarmwichTown"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_CrashCollectibles,Name="AchievementCollectCrash"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_SubductionCollectibles,Name="AchievementCollectSubduction"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_VolterCastleCollectibles,Name="AchievementCollectVolterCastle"))
|
||||
|
||||
}
|
||||
|
@ -457,6 +457,10 @@ const KFACHID_SubductionHard = 301;
|
||||
const KFACHID_SubductionHellOnEarth = 302;
|
||||
const KFACHID_SubductionCollectibles = 303;
|
||||
|
||||
const KFACHID_VolterCastleHard = 304;
|
||||
const KFACHID_VolterCastleHellOnEarth = 305;
|
||||
const KFACHID_VolterCastleCollectibles = 306;
|
||||
|
||||
/* __TW_ANALYTICS_ */
|
||||
var int PerRoundWeldXP;
|
||||
var int PerRoundHealXP;
|
||||
@ -1195,6 +1199,11 @@ private event AddAfflictionCaused(EAfflictionType Type)
|
||||
SeasonalEventStats_OnAfflictionCaused(Type);
|
||||
}
|
||||
|
||||
private event AddCollectibleFound(int Limit)
|
||||
{
|
||||
SeasonalEventStats_OnCollectibleFound(Limit);
|
||||
}
|
||||
|
||||
private native function AddToKillObjectives(class<KFPawn_Monster> ZedClass);
|
||||
private native function AddToVersusKillObjectives(class<Pawn> KillerClass);
|
||||
|
||||
@ -1925,6 +1934,14 @@ final simulated function SeasonalEventStats_OnAfflictionCaused(EAfflictionType T
|
||||
}
|
||||
}
|
||||
|
||||
final simulated function SeasonalEventStats_OnCollectibleFound(int Limit)
|
||||
{
|
||||
if (SeasonalEventIsValid())
|
||||
{
|
||||
SeasonalEvent.OnCollectibleFound(Limit);
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Dailies and daily-specific tracking
|
||||
********************************************************************************************* */
|
||||
@ -2069,6 +2086,7 @@ defaultproperties
|
||||
//Base Weapons
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,SecondaryType=DOST_KnifeDamage,ObjectiveClasses=(KFWeap_Edged_Knife,KFDT_Slashing_Knife,KFDT_Slashing_Knife_Berserker,KFDT_Slashing_Knife_Medic,KFDT_Slashing_Knife_SWAT,KFDT_Slashing_KnifeHeavy,KFDT_Slashing_KnifeHeavy_Berserker,KFDT_Slashing_KnifeHeavy_Medic,KFDT_Slashing_KnifeHeavy_SWAT,KFDT_Piercing_KnifeStab,KFDT_Piercing_KnifeStab_Berserker,KFDT_Piercing_KnifeStab_FieldMedic,KFDT_Piercing_KnifeStab_SWAT,KFDT_Slashing_Knife_Survivalist,KFDT_Piercing_KnifeStab_Survivalist,KFDT_Slashing_KnifeHeavy_Survivalist),CompletionAmount=2500))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Pistol_9mm, KFDT_Ballistic_9mm,KFDT_Bludgeon_9mm),CompletionAmount=4000)) //2500
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_93R, KFDT_Ballistic_HRG_93R, KFDT_Bludgeon_HRG_93R),CompletionAmount=4000))
|
||||
|
||||
//Swat Weapons
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_SMG_MP7, KFDT_Ballistic_MP7,KFDT_Bludgeon_MP7),CompletionAmount=5000)) //3000
|
||||
@ -2089,6 +2107,7 @@ defaultproperties
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_AssaultRifle_MKB42, KFDT_Ballistic_MKB42,KFDT_Bludgeon_MKB42),CompletionAmount=10000))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_LMG_Stoner63A, KFDT_Ballistic_Stoner63A,KFDT_Bludgeon_Stoner63A),CompletionAmount=10000))
|
||||
|
||||
|
||||
//Support Weapons
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_MB500, KFDT_Ballistic_MB500,KFDT_Bludgeon_MB500),CompletionAmount=5000)) //3000
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_DoubleBarrel, KFDT_Ballistic_DBShotgun,KFDT_Bludgeon_DBShotgun),CompletionAmount=7000)) //5000
|
||||
@ -2333,7 +2352,9 @@ defaultproperties
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-SUBDUCTION),CompletionAmount=1))
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-SUBDUCTION),CompletionAmount=2))
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-SUBDUCTION),CompletionAmount=3))
|
||||
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CASTLEVOLTER),CompletionAmount=1))
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CASTLEVOLTER),CompletionAmount=2))
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CASTLEVOLTER),CompletionAmount=3))
|
||||
|
||||
//Versus Damage
|
||||
// Per design doc that I have right now, these are x class damage y players, not damage y amount
|
||||
|
@ -76,4 +76,5 @@ defaultproperties
|
||||
Properties.Add((PropertyId = STATID_ACHIEVE_BarmwichCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
|
||||
Properties.Add((PropertyId = STATID_ACHIEVE_CrashCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
|
||||
Properties.Add((PropertyId = STATID_ACHIEVE_SubductionCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
|
||||
Properties.Add((PropertyId = STATID_ACHIEVE_VolterCastleCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
|
||||
}
|
||||
|
@ -164,6 +164,51 @@ struct GunGamePerkData
|
||||
var() array<GunGameRespawnLevel> GunGameRespawnLevels;
|
||||
};
|
||||
|
||||
struct BountyHuntWavePerPlayerZedData
|
||||
{
|
||||
var() int NumberOfPlayers;
|
||||
var() int NumberOfZeds;
|
||||
};
|
||||
|
||||
struct BountyHuntWaveData
|
||||
{
|
||||
var() int Wave;
|
||||
var() array<BountyHuntWavePerPlayerZedData> BountyHuntWavePerPlayerZed;
|
||||
};
|
||||
|
||||
struct BountyHuntSpecialZedPerWaveData
|
||||
{
|
||||
var() int Wave;
|
||||
};
|
||||
|
||||
struct BountyHuntZedProgressionData
|
||||
{
|
||||
var() float RemainingZedRatio;
|
||||
var() float HealthBuffRatio;
|
||||
var() float DamageBuffRatio;
|
||||
};
|
||||
|
||||
struct BountyHuntZedAndProgressionData
|
||||
{
|
||||
var() class<KFPawn_Monster> ZedType;
|
||||
var() array<BountyHuntSpecialZedPerWaveData> BountyHuntSpecialZedPerWave;
|
||||
var() array<BountyHuntZedProgressionData> BountyHuntZedProgression;
|
||||
};
|
||||
|
||||
struct BountyHuntDoshData
|
||||
{
|
||||
var() int NumberOfPlayers;
|
||||
var() int Dosh;
|
||||
var() int DoshNoAssist;
|
||||
};
|
||||
|
||||
struct BountyHuntGameData
|
||||
{
|
||||
var() array<BountyHuntWaveData> BountyHuntDataWaves;
|
||||
var() array<BountyHuntZedAndProgressionData> BountyHuntZedAndProgression;
|
||||
var() array<BountyHuntDoshData> BountyHuntDosh;
|
||||
};
|
||||
|
||||
/** Individual property overrides that drive other behavior to allow for
|
||||
* a large amount of variety in our weekly event mode.
|
||||
*/
|
||||
@ -455,6 +500,8 @@ struct WeeklyOverrides
|
||||
|
||||
var() bool bVIPGameMode;
|
||||
|
||||
var() bool bBountyHunt;
|
||||
|
||||
/** Ignores damage caused by headshots. */
|
||||
var() bool bInvulnerableHeads;
|
||||
|
||||
@ -470,6 +517,26 @@ struct WeeklyOverrides
|
||||
/** Contamination mode Extra Dosh */
|
||||
var() int ContaminationModeExtraDosh;
|
||||
|
||||
// Bounty Hunt
|
||||
/** Information about each level in Gun Game Mode */
|
||||
var() BountyHuntGameData BountyHuntGame;
|
||||
var() int BountyHuntExtraDosh;
|
||||
var() bool BountyHuntNeedsToSeePlayerToTriggerFlee;
|
||||
var() float BountyHuntTimeBetweenFlee;
|
||||
var() float BountyHuntTimeBetweenAttack;
|
||||
var() float BountyHuntTimeCanCancelAttack;
|
||||
var() float BountyHuntDistancePlayerMinFirstFlee;
|
||||
var() float BountyHuntDistancePlayerMinFlee;
|
||||
var() float BountyHuntDistancePlayerMaxFlee;
|
||||
var() float BountyHuntDistancePlayerAttack;
|
||||
var() float BountyHuntSpecialZedBuffHealthRatio;
|
||||
var() float BountyHuntSpecialZedBuffAfflictionResistance;
|
||||
var() float BountyHuntMaxCoexistingZeds;
|
||||
var() bool BountyHuntLastLevelStillUsesCoexistingZeds;
|
||||
var() bool BountyHuntUseGradualSpawn;
|
||||
|
||||
var() float HeadshotDamageMultiplier;
|
||||
|
||||
structdefaultproperties
|
||||
{
|
||||
GameLength = GL_Short
|
||||
@ -531,12 +598,28 @@ struct WeeklyOverrides
|
||||
bDisableThrowWeapon = false;
|
||||
bGunGameMode = false;
|
||||
bVIPGameMode = false;
|
||||
bBountyHunt = false;
|
||||
bInvulnerableHeads = false;
|
||||
TraderTimeModifier = 1.f;
|
||||
TimeBetweenWaves = -1.f;
|
||||
bForceShowSkipTrader = false;
|
||||
ContaminationModeZedsToFinish = 0;
|
||||
ContaminationModeExtraDosh = 0;
|
||||
BountyHuntExtraDosh = 0;
|
||||
BountyHuntNeedsToSeePlayerToTriggerFlee = false;
|
||||
BountyHuntTimeBetweenFlee = 10.f;
|
||||
BountyHuntTimeBetweenAttack = 12.f;
|
||||
BountyHuntTimeCanCancelAttack = 5.f;
|
||||
BountyHuntDistancePlayerMinFirstFlee = 100.f;
|
||||
BountyHuntDistancePlayerMinFlee = 1000.f;
|
||||
BountyHuntDistancePlayerMaxFlee = 2200.f;
|
||||
BountyHuntDistancePlayerAttack = 400.f;
|
||||
BountyHuntSpecialZedBuffHealthRatio=0.25f
|
||||
BountyHuntSpecialZedBuffAfflictionResistance=0.5f
|
||||
BountyHuntMaxCoexistingZeds = 6
|
||||
BountyHuntLastLevelStillUsesCoexistingZeds=false
|
||||
BountyHuntUseGradualSpawn = false
|
||||
HeadshotDamageMultiplier = 1.f
|
||||
}
|
||||
};
|
||||
|
||||
@ -573,7 +656,7 @@ var WeeklyOverrides ActiveEvent;
|
||||
/** Stored values of World Info and GRI items incase we need to reset it. */
|
||||
var CachedOutbreakInfo CachedItems;
|
||||
|
||||
function int SetActiveEvent(int ActiveEventIdx)
|
||||
function int SetActiveEvent(int ActiveEventIdx, KFGameInfo GameInfo)
|
||||
{
|
||||
`if(`notdefined(ShippingPC))
|
||||
local string LocalURL;
|
||||
@ -583,7 +666,19 @@ function int SetActiveEvent(int ActiveEventIdx)
|
||||
//Runtime override by URL options for testing purposes
|
||||
LocalURL = WorldInfo.GetLocalURL();
|
||||
LocalURL = Split(LocalURL, "?"); //remove map name
|
||||
ActiveEventIdx = GetIntOption(LocalURL, "ActiveEventIdx", ActiveEventIdx);
|
||||
|
||||
if (GameInfo.WeeklySelectorIndex == -1) // WeeklySelectorIndex overrides the ActiveEventIdx if any
|
||||
{
|
||||
ActiveEventIdx = GetIntOption(LocalURL, "ActiveEventIdx", ActiveEventIdx);
|
||||
|
||||
// Set WeeklySelectorIndex to the value (ActiveEventIdx is not replicated), so all the flow of the game works the same
|
||||
GameInfo.WeeklySelectorIndex = ActiveEventIdx + 1;
|
||||
}
|
||||
else if (GameInfo.WeeklySelectorIndex > 0)
|
||||
{
|
||||
// 0 is default, we move one index to the left so it matches first Weekly Mode
|
||||
ActiveEventIdx = GameInfo.WeeklySelectorIndex - 1;
|
||||
}
|
||||
|
||||
//If our override is out of bounds, see if it's a valid test event
|
||||
if (ActiveEventIdx >= SetEvents.Length)
|
||||
@ -599,12 +694,22 @@ function int SetActiveEvent(int ActiveEventIdx)
|
||||
ActiveEvent = SetEvents[ActiveEventIdx];
|
||||
}
|
||||
`else
|
||||
if (GameInfo.WeeklySelectorIndex > 0)
|
||||
{
|
||||
// 0 is default, we move one index to the left so it matches first Weekly Mode
|
||||
ActiveEventIdx = GameInfo.WeeklySelectorIndex - 1;
|
||||
}
|
||||
|
||||
if(ActiveEventIdx < SetEvents.length)
|
||||
{
|
||||
ActiveEvent = SetEvents[ActiveEventIdx];
|
||||
}
|
||||
`endif
|
||||
|
||||
`Log("TEST - SetActiveEvent : " $ActiveEventIdx);
|
||||
|
||||
KFGameEngine(class'Engine'.static.GetEngine()).SetWeeklyEventIndex(ActiveEventIdx);
|
||||
|
||||
return ActiveEventIdx;
|
||||
}
|
||||
|
||||
@ -744,7 +849,14 @@ function ModifyGroundSpeed(KFPawn PlayerPawn, out float GroundSpeed)
|
||||
function ReduceDamage(out int Damage, Pawn Injured, Controller InstigatedBy, class<DamageType> DamageType, TraceHitInfo HitInfo)
|
||||
{
|
||||
local int HitZoneIdx, WaveNum;
|
||||
local KFPawn InstigatorPawn;
|
||||
local KFPawn InjuredPawn, InstigatorPawn;
|
||||
|
||||
InjuredPawn = KFPawn(Injured);
|
||||
|
||||
if (InjuredPawn != none)
|
||||
{
|
||||
`log(self @ "ReduceDamage=" $ Damage, InjuredPawn.bLogTakeDamage);
|
||||
}
|
||||
|
||||
//Some events can be headshot only. Do this only if the incoming damage is against a monster-derived class
|
||||
// and it's one of our custom damage types. Keeps things like crush damage from being scaled to 0.
|
||||
@ -765,6 +877,14 @@ function ReduceDamage(out int Damage, Pawn Injured, Controller InstigatedBy, cla
|
||||
Damage = 0;
|
||||
}
|
||||
}
|
||||
else if (ActiveEvent.HeadshotDamageMultiplier != 1.f && KFPawn_Monster(Injured) != none && KFPawn_Monster(Injured).bIsBountyHuntObjective)
|
||||
{
|
||||
HitZoneIdx = KFPawn_Monster(Injured).HitZones.Find('ZoneName', HitInfo.BoneName);
|
||||
if (HitZoneIdx == HZI_Head)
|
||||
{
|
||||
Damage *= ActiveEvent.HeadshotDamageMultiplier;
|
||||
}
|
||||
}
|
||||
|
||||
if (InstigatedBy != none)
|
||||
{
|
||||
@ -792,6 +912,11 @@ function ReduceDamage(out int Damage, Pawn Injured, Controller InstigatedBy, cla
|
||||
AdjustDamageReduction(Damage, Injured, InstigatedBy, InstigatorPawn, ActiveEvent.BossRushOverrideParams.PerWaves[WaveNum].ZedsToAdjust);
|
||||
}
|
||||
}
|
||||
|
||||
if (InjuredPawn != none)
|
||||
{
|
||||
`log(self @ "ReduceDamage (after)=" $ Damage, InjuredPawn.bLogTakeDamage);
|
||||
}
|
||||
}
|
||||
|
||||
function AdjustDamageReduction(out int Damage, Pawn Injured, Controller InstigatedBy, KFPawn InstigatorPawn, array <StatAdjustments> Adjustments)
|
||||
|
@ -2059,7 +2059,7 @@ final simulated function bool CanReloadWeapon()
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
function KFWeapon FindBestWeapon()
|
||||
function KFWeapon FindBestWeapon(optional bool bCheckHasAmmo = false, optional bool allow9mm = true)
|
||||
{
|
||||
local float BestPrimaryRating, BestSecondaryRating, BestMeleeRating;
|
||||
local KFWeapon BestWeapon, BestPrimary, BestSecondary, BestMelee, TempWeapon;
|
||||
@ -2072,6 +2072,22 @@ function KFWeapon FindBestWeapon()
|
||||
continue;
|
||||
}
|
||||
|
||||
if (allow9mm == false)
|
||||
{
|
||||
if (TempWeapon.bIsBackupWeapon && !TempWeapon.IsMeleeWeapon())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (bCheckHasAmmo)
|
||||
{
|
||||
if ( TempWeapon.HasAnyAmmo() == false )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Collect the best weapons from each inventory group
|
||||
if (TempWeapon.InventoryGroup == IG_Primary)
|
||||
{
|
||||
@ -2100,7 +2116,8 @@ function KFWeapon FindBestWeapon()
|
||||
}
|
||||
|
||||
// Get our best possible weapon from all 3 categories and throw it
|
||||
BestWeapon = BestPrimary != none ? BestPrimary : (BestSecondary != none ? BestSecondary : BestMelee);
|
||||
BestWeapon = BestPrimary != none ? BestPrimary : (BestMelee != none ? BestMelee : BestSecondary);
|
||||
|
||||
return BestWeapon;
|
||||
}
|
||||
/**
|
||||
@ -2725,6 +2742,13 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
|
||||
// NVCHANGE_BEGIN - RLS - Debugging Effects
|
||||
bAllowHeadshot = CanCountHeadshots();
|
||||
OldHealth = Health;
|
||||
|
||||
KFDT = class<KFDamageType>(DamageType);
|
||||
if ( KFDT != None )
|
||||
{
|
||||
KFDT.static.ModifyInstantDamage(self, Damage, InstigatedBy);
|
||||
}
|
||||
|
||||
Super.TakeDamage(Damage, InstigatedBy, HitLocation, Momentum, DamageType, HitInfo, DamageCauser);
|
||||
|
||||
// using the passed in damage type instead of the hitfxinfo since that doesn't get updated when zero damage is done
|
||||
@ -2740,7 +2764,6 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
|
||||
// damage. Requires valid DamageCauser, 'None' for DoT, to prevent recursion
|
||||
if ( Health < OldHealth && DamageCauser != None )
|
||||
{
|
||||
KFDT = class<KFDamageType>(DamageType);
|
||||
if ( KFDT != None )
|
||||
{
|
||||
KFDT.static.ApplySecondaryDamage(self, Damage, InstigatedBy);
|
||||
|
@ -42,6 +42,8 @@ var transient bool bArchLoaded;
|
||||
var const array<int> EliteAIType; // can't use EAIType enumerator, use integer instead
|
||||
var const array<class<KFPawn_Monster> > ElitePawnClass;
|
||||
|
||||
var const array<class<KFPawn_Monster> > MapReplacePawnClass;
|
||||
|
||||
/** Custom third person camera offsets */
|
||||
var() ViewOffsetData ThirdPersonViewOffset;
|
||||
|
||||
@ -579,6 +581,11 @@ var ParticleSystem WeakPointParticleTemplate;
|
||||
var bool bCanBeKilledByShrinking;
|
||||
var float ShrinkEffectModifier;
|
||||
|
||||
// Bounty Hunt
|
||||
var bool bIsBountyHuntObjective;
|
||||
var bool bIsBountyHuntOnLastTier;
|
||||
var bool bIsBountyHuntBlockLeaveMap;
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Delegates
|
||||
********************************************************************************************* */
|
||||
@ -593,7 +600,8 @@ replication
|
||||
if (bNetDirty)
|
||||
bIsHeadless, bIsPoisoned, bPlayPanicked, bPlayShambling, MaxHeadChunkGoreWhileAlive,
|
||||
RepInflateMatParams, RepInflateMatParam, RepDamageInflateParam, RepBleedInflateMatParam, bDisableGoreMeshWhileAlive,
|
||||
bDisableHeadless, InflateDeathGravity, InflationExplosionTimer, bUseDamageInflation, bUseExplosiveDeath, WeakPoints_TS;
|
||||
bDisableHeadless, InflateDeathGravity, InflationExplosionTimer, bUseDamageInflation, bUseExplosiveDeath, WeakPoints_TS,
|
||||
bIsBountyHuntObjective, bIsBountyHuntOnLastTier, bIsBountyHuntBlockLeaveMap;
|
||||
if ( bNetDirty && bCanCloak )
|
||||
bIsCloakingSpottedByTeam;
|
||||
if ( bNetDirty && bCanRage )
|
||||
@ -699,7 +707,12 @@ simulated event ReplicatedEvent(name VarName)
|
||||
case nameof(WeakPoints_TS):
|
||||
SpawnWeakpointVFX();
|
||||
break;
|
||||
case nameof(bIsBountyHuntOnLastTier):
|
||||
break;
|
||||
case nameof(bIsBountyHuntBlockLeaveMap):
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
super.ReplicatedEvent( VarName );
|
||||
}
|
||||
@ -768,6 +781,16 @@ static event class<KFPawn_Monster> GetAIPawnClassToSpawn()
|
||||
return default.class;
|
||||
}
|
||||
|
||||
static event class<KFPawn_Monster> GetAIPawnClassToReplaceMapSpawn()
|
||||
{
|
||||
if (default.MapReplacePawnClass.length > 0)
|
||||
{
|
||||
return default.MapReplacePawnClass[Rand(default.MapReplacePawnClass.length)];
|
||||
}
|
||||
|
||||
return default.class;
|
||||
}
|
||||
|
||||
/** Load content archetype when map loads */
|
||||
native static final function PreloadContent();
|
||||
/** Called if preload was not called before 1st spawn */
|
||||
@ -851,6 +874,11 @@ simulated event CheckShouldAlwaysBeRelevant()
|
||||
{
|
||||
bAlwaysRelevant = true;
|
||||
}
|
||||
|
||||
if (bIsBountyHuntObjective)
|
||||
{
|
||||
bAlwaysRelevant = true;
|
||||
}
|
||||
}
|
||||
|
||||
/** Called immediately after gameplay begins */
|
||||
@ -1892,12 +1920,24 @@ simulated function float GetMinBlockFOV()
|
||||
/** Reduce affliction power when blocking */
|
||||
simulated function AdjustAffliction( out float AfflictionPower )
|
||||
{
|
||||
local KFGameInfo KFGI;
|
||||
|
||||
if( Role == ROLE_Authority && bIsBlocking )
|
||||
{
|
||||
AfflictionPower *= DifficultyBlockSettings.AfflictionModifier;
|
||||
}
|
||||
|
||||
super.AdjustAffliction( AfflictionPower );
|
||||
|
||||
if (bIsBountyHuntObjective) // Only on Bounty Hunt Weekly
|
||||
{
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
|
||||
if (KFGI != none && KFGI.OutbreakEvent != none)
|
||||
{
|
||||
AfflictionPower -= AfflictionPower * KFGI.OutbreakEvent.ActiveEvent.BountyHuntSpecialZedBuffAfflictionResistance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Used by subclasses to determine if the boss icon can be rendered */
|
||||
@ -2338,8 +2378,12 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
|
||||
// NVCHANGE_BEGIN - RLS - Debugging Effects
|
||||
|
||||
// Do extra damage on blowing the head off
|
||||
if( !bCheckingExtraHeadDamage && HitZoneIdx == HZI_Head &&
|
||||
HitZones[HZI_Head].GoreHealth > 0 && InDamage > HitZones[HZI_Head].GoreHealth )
|
||||
|
||||
if (bIsBountyHuntObjective == false
|
||||
&& !bCheckingExtraHeadDamage
|
||||
&& HitZoneIdx == HZI_Head
|
||||
&& HitZones[HZI_Head].GoreHealth > 0
|
||||
&& InDamage > HitZones[HZI_Head].GoreHealth)
|
||||
{
|
||||
KFDT = class<KFDamageType>(DamageType);
|
||||
|
||||
@ -2349,7 +2393,7 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
|
||||
InDamage *= KFDT.default.HeadDestructionDamageScale;
|
||||
}
|
||||
|
||||
ExtraHeadDamage = InDamage + HealthMax * 0.25;
|
||||
ExtraHeadDamage = (InDamage + HealthMax * 0.25);
|
||||
|
||||
bCheckingExtraHeadDamage = true;
|
||||
AdjustDamage( ExtraHeadDamage, Momentum, InstigatedBy, HitLocation, DamageType, HitInfo, DamageCauser );
|
||||
@ -2966,7 +3010,7 @@ simulated function UpdateVisualInflation(float InflationAmount)
|
||||
/** Called on server when pawn should has been crippled (e.g. Headless) */
|
||||
function CauseHeadTrauma(float BleedOutTime=5.f)
|
||||
{
|
||||
if ( !bIsHeadless && !bPlayedDeath && !bDisableHeadless )
|
||||
if ( !bIsHeadless && !bPlayedDeath && !bDisableHeadless && !bIsBountyHuntObjective )
|
||||
{
|
||||
if( MyKFAIC != none && KFGameInfo(WorldInfo.Game) != none && MyKFAIC.TimeFirstSawPlayer >= 0 )
|
||||
{
|
||||
@ -4202,7 +4246,7 @@ function TakeHitZoneDamage(float Damage, class<DamageType> DamageType, int HitZo
|
||||
if ( HitZoneIdx == HZI_Head )
|
||||
{
|
||||
// Based on head health, calculate number of head chunks we're allowed to remove
|
||||
if( !bPlayedDeath && !bIsHeadless && !bTearOff )
|
||||
if( !bPlayedDeath && !bIsHeadless && !bTearOff && !bIsBountyHuntObjective )
|
||||
{
|
||||
HeadHealthPercentage = GetHeadHealthPercent();
|
||||
if( HeadHealthPercentage > 0.5 )
|
||||
@ -4958,6 +5002,40 @@ simulated function ServerSpawnWeakPointVFX(array<WeakPoint> WeakPoints)
|
||||
}
|
||||
}
|
||||
|
||||
simulated function SetBountyHuntObjective()
|
||||
{
|
||||
bIsBountyHuntObjective = true;
|
||||
bAlwaysRelevant = true;
|
||||
|
||||
if (WorldInfo.NetMode == NM_DedicatedServer)
|
||||
{
|
||||
bNetDirty = true;
|
||||
bForceNetUpdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
simulated function SetBountyHuntOnLastTier()
|
||||
{
|
||||
bIsBountyHuntOnLastTier = true;
|
||||
|
||||
if (WorldInfo.NetMode == NM_DedicatedServer)
|
||||
{
|
||||
bNetDirty = true;
|
||||
bForceNetUpdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
simulated function SetBountyHuntBlockLeaveMap(bool bCanLeave)
|
||||
{
|
||||
bIsBountyHuntBlockLeaveMap = bCanLeave;
|
||||
|
||||
if (WorldInfo.NetMode == NM_DedicatedServer)
|
||||
{
|
||||
bNetDirty = true;
|
||||
bForceNetUpdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Achievements
|
||||
********************************************************************************************* */
|
||||
@ -5165,4 +5243,8 @@ DefaultProperties
|
||||
|
||||
bCanBeKilledByShrinking=true
|
||||
ShrinkEffectModifier=1.0f
|
||||
|
||||
bIsBountyHuntObjective=false
|
||||
bIsBountyHuntOnLastTier=false
|
||||
bIsBountyHuntBlockLeaveMap=false
|
||||
}
|
||||
|
@ -245,11 +245,12 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
|
||||
/** Reduce affliction/incap strength when healing */
|
||||
simulated function AdjustAffliction( out float AfflictionPower )
|
||||
{
|
||||
super.AdjustAffliction( AfflictionPower );
|
||||
if( bInHuntAndHealMode )
|
||||
{
|
||||
AfflictionPower *= IncapPowerScaleWhenHealing;
|
||||
}
|
||||
|
||||
super.AdjustAffliction( AfflictionPower );
|
||||
}
|
||||
|
||||
/** Updates shield health and shield health percent */
|
||||
|
@ -149,9 +149,10 @@ var const bool bInitialized;
|
||||
* Inventory
|
||||
********************************************************************************************* */
|
||||
|
||||
var byte StartingSecondaryWeaponClassIndex;
|
||||
|
||||
/** The weapon class string used to load the weapon class for this perk */
|
||||
var class<KFWeaponDefinition> PrimaryWeaponDef;
|
||||
var class<KFWeaponDefinition> SecondaryWeaponDef;
|
||||
|
||||
/** default starting knife */
|
||||
var class<KFWeaponDefinition> KnifeWeaponDef;
|
||||
@ -173,6 +174,8 @@ var array<name> BackupWeaponDamageTypeNames;
|
||||
|
||||
var array<class<KFWeaponDefinition> > AutoBuyLoadOutPath;
|
||||
|
||||
var const array<class<KFWeaponDefinition> > SecondaryWeaponPaths;
|
||||
|
||||
/*********************************************************************************************
|
||||
* Player Skill Trakcing
|
||||
********************************************************************************************* */
|
||||
@ -502,7 +505,12 @@ static simulated public function bool IsSyringe( KFWeapon KFW )
|
||||
*/
|
||||
static function bool IsDual9mm( KFWeapon KFW )
|
||||
{
|
||||
return KFW != none && KFW.Class.Name == 'KFWeap_Pistol_Dual9mm';
|
||||
return KFW != none && (KFW.Class.Name == 'KFWeap_Pistol_Dual9mm' || KFW.Class.Name == 'KFWeap_HRG_93R_Dual');
|
||||
}
|
||||
|
||||
static function bool IsHRG93R(KFWeapon KFW)
|
||||
{
|
||||
return KFW != none && (KFW.Class.Name == 'KFWeap_HRG_93R' || KFW.Class.Name == 'KFWeap_HRG_93R_Dual');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1125,12 +1133,6 @@ simulated function string GetPrimaryWeaponClassPath()
|
||||
return PrimaryWeaponDef.default.WeaponClassPath;
|
||||
}
|
||||
|
||||
/* Returns the secondary weapon's class path for this perk */
|
||||
simulated function string GetSecondaryWeaponClassPath()
|
||||
{
|
||||
return SecondaryWeaponDef.default.WeaponClassPath;
|
||||
}
|
||||
|
||||
/* Returns the knife's class path for this perk */
|
||||
simulated function string GetKnifeWeaponClassPath()
|
||||
{
|
||||
@ -1314,6 +1316,7 @@ native function bool CanRepairDoors();
|
||||
function bool RepairArmor( Pawn HealTarget );
|
||||
function bool IsToxicDmgActive() { return false; }
|
||||
static function class<KFDamageType> GetToxicDmgTypeClass(){ return default.ToxicDmgTypeClass; }
|
||||
static function float GetHealRechargeMod();
|
||||
static function ModifyToxicDmg( out int ToxicDamage );
|
||||
simulated function float GetSirenScreamStrength(){ return 1.f; }
|
||||
simulated function bool IsHealingSurgeActive(){ return false; }
|
||||
@ -1633,6 +1636,11 @@ static simulated function bool CanChoosePrimaryWeapon()
|
||||
return false;
|
||||
}
|
||||
|
||||
static simulated function bool CanChooseSecondaryWeapon()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static simulated function bool CanChooseGrenade()
|
||||
{
|
||||
return false;
|
||||
@ -1642,9 +1650,10 @@ simulated function byte OnPrevWeaponSelected() { return 255; }
|
||||
simulated function byte OnNextWeaponSelected() { return 255; }
|
||||
simulated function byte OnPrevGrenadeSelected() { return 255; }
|
||||
simulated function byte OnNextGrenadeSelected() { return 255; }
|
||||
simulated function byte SetWeaponSelectedIndex(byte idx);
|
||||
simulated function byte SetGrenadeSelectedIndex(byte idx);
|
||||
simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext);
|
||||
simulated static function byte GetWeaponSelectedIndex(byte idx);
|
||||
simulated function SetWeaponSelectedIndex(byte idx);
|
||||
simulated function SetGrenadeSelectedIndex(byte idx);
|
||||
simulated static function byte GetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext);
|
||||
simulated function byte GetGrenadeSelectedIndex() { return 255;}
|
||||
simulated function InitializeGrenades();
|
||||
|
||||
@ -1666,7 +1675,69 @@ static simulated function string GetGrenadeWeaponName(byte Idx)
|
||||
static simulated function string GetGrenadeWeaponImagePath(byte Idx)
|
||||
{
|
||||
return default.GrenadeWeaponDef.static.GetImagePath();
|
||||
}
|
||||
}
|
||||
|
||||
simulated function string GetSecondaryWeaponClassPath()
|
||||
{
|
||||
return SecondaryWeaponPaths[StartingSecondaryWeaponClassIndex].default.WeaponClassPath;
|
||||
}
|
||||
|
||||
simulated function byte OnPrevSecondaryWeaponSelected()
|
||||
{
|
||||
if (StartingSecondaryWeaponClassIndex == 0)
|
||||
{
|
||||
StartingSecondaryWeaponClassIndex = SecondaryWeaponPaths.Length - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
--StartingSecondaryWeaponClassIndex;
|
||||
}
|
||||
|
||||
SetSecondaryWeaponSelectedIndex(StartingSecondaryWeaponClassIndex);
|
||||
|
||||
return StartingSecondaryWeaponClassIndex;
|
||||
}
|
||||
|
||||
simulated function byte OnNextSecondaryWeaponSelected()
|
||||
{
|
||||
StartingSecondaryWeaponClassIndex = (StartingSecondaryWeaponClassIndex + 1) % SecondaryWeaponPaths.Length;
|
||||
|
||||
SetSecondaryWeaponSelectedIndex(StartingSecondaryWeaponClassIndex);
|
||||
|
||||
return StartingSecondaryWeaponClassIndex;
|
||||
}
|
||||
|
||||
static simulated function string GetSecondaryWeaponName(byte Idx)
|
||||
{
|
||||
return Idx >= default.SecondaryWeaponPaths.Length ? default.SecondaryWeaponPaths[0].static.GetItemName() : default.SecondaryWeaponPaths[Idx].static.GetItemName();
|
||||
}
|
||||
|
||||
static simulated function string GetSecondaryWeaponImagePath(byte Idx)
|
||||
{
|
||||
return Idx >= default.SecondaryWeaponPaths.Length ? default.SecondaryWeaponPaths[0].static.GetImagePath() : default.SecondaryWeaponPaths[Idx].static.GetImagePath();
|
||||
}
|
||||
|
||||
simulated static function byte GetSecondaryWeaponSelectedIndex(byte idx)
|
||||
{
|
||||
if (idx >= default.SecondaryWeaponPaths.Length)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
simulated function SetSecondaryWeaponSelectedIndex(byte idx)
|
||||
{
|
||||
StartingSecondaryWeaponClassIndex = GetSecondaryWeaponSelectedIndex(idx);
|
||||
|
||||
ServerUpdateCurrentSecondaryWeapon(StartingSecondaryWeaponClassIndex);
|
||||
}
|
||||
|
||||
reliable server function ServerUpdateCurrentSecondaryWeapon(byte Value)
|
||||
{
|
||||
StartingSecondaryWeaponClassIndex = Value;
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
@ -1692,6 +1763,7 @@ DefaultProperties
|
||||
|
||||
BackupWeaponDamageTypeNames(0)="KFDT_Ballistic_9mm";
|
||||
BackupWeaponDamageTypeNames(1)="KFDT_Slashing_Knife";
|
||||
StartingSecondaryWeaponClassIndex=0;
|
||||
|
||||
// network
|
||||
RemoteRole=ROLE_SimulatedProxy
|
||||
@ -1700,10 +1772,12 @@ DefaultProperties
|
||||
bOnlyRelevantToOwner=TRUE
|
||||
|
||||
// weapon content
|
||||
SecondaryWeaponDef=class'KFWeapDef_9mm'
|
||||
KnifeWeaponDef=class'KFWeapDef_Knife_Commando'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Berserker'
|
||||
|
||||
SecondaryWeaponPaths(0)=class'KFWeapDef_9mm'
|
||||
SecondaryWeaponPaths(1)=class'KFWeapDef_HRG_93R'
|
||||
|
||||
InitialGrenadeCount=2
|
||||
MaxGrenadeCount=5
|
||||
|
||||
|
@ -1020,6 +1020,7 @@ DefaultProperties
|
||||
SmallRadiusSizeSQ=40000
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_Crovel'
|
||||
|
||||
KnifeWeaponDef=class'KFweapDef_Knife_Berserker'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Berserker'
|
||||
|
||||
|
@ -97,7 +97,8 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
|
||||
// have the perks so tied into using that, it's easier to just specifically fix commando here.
|
||||
if( KFW != none && !DamageCauser.IsA('KFProj_Grenade'))
|
||||
{
|
||||
if( IsBackupActive() && (IsBackupWeapon( KFW ) || IsDual9mm( KFW )) )
|
||||
if( IsBackupActive()
|
||||
&& (IsBackupWeapon( KFW ) || IsDual9mm( KFW ) || IsHRG93R( KFW ) ) )
|
||||
{
|
||||
`QALog( "Backup Damage" @ KFW @ GetPercentage( InDamage, InDamage * GetSkillValue( PerkSkills[ECommandoBackup] )), bLogPerk );
|
||||
TempDamage += InDamage * GetSkillValue( PerkSkills[ECommandoBackup] );
|
||||
@ -692,6 +693,7 @@ DefaultProperties
|
||||
PerkBuildStatID=STATID_Cmdo_Build
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_AR15'
|
||||
|
||||
KnifeWeaponDef=class'KFweapDef_Knife_Commando'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Commando'
|
||||
|
||||
|
@ -1042,6 +1042,7 @@ DefaultProperties
|
||||
InteractIcon=Texture2D'UI_World_TEX.Demolitionist_Supplier_HUD'
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_HX25'
|
||||
|
||||
KnifeWeaponDef=class'KFWeapDef_Knife_Demo'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Demo'
|
||||
|
||||
|
@ -62,11 +62,6 @@ enum EMedicPerkSkills
|
||||
EMedicZedative
|
||||
};
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Perk init and spawning
|
||||
******************************************************************************************** */
|
||||
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Passive skills functions
|
||||
********************************************************************************************* */
|
||||
@ -329,6 +324,11 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
|
||||
InDamage = Round(TempDamage);
|
||||
}
|
||||
|
||||
static function float GetHealRechargeMod()
|
||||
{
|
||||
return GetSkillValue( default.PerkSkills[EMedicAcidicCompound] );
|
||||
}
|
||||
|
||||
/** Takes the weapons primary damage and calculates the poisoning over time value */
|
||||
/**
|
||||
* @brief Takes the weapons primary damage and calculates the bleeding over time value
|
||||
@ -339,7 +339,7 @@ static function ModifyToxicDmg( out int ToxicDamage )
|
||||
{
|
||||
local float TempDamage;
|
||||
|
||||
TempDamage = float(ToxicDamage) * GetSkillValue( default.PerkSkills[EMedicAcidicCompound] );
|
||||
TempDamage = float(ToxicDamage) * GetHealRechargeMod();
|
||||
ToxicDamage = FCeil( TempDamage );
|
||||
}
|
||||
|
||||
@ -644,13 +644,14 @@ DefaultProperties
|
||||
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Medic'
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_MedicPistol'
|
||||
|
||||
KnifeWeaponDef=class'KFWeapDef_Knife_Medic'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Medic'
|
||||
|
||||
ProgressStatID=STATID_Medic_Progress
|
||||
PerkBuildStatID=STATID_Medic_Build
|
||||
|
||||
SelfHealingSurgePct=0.03f //0.1f
|
||||
SelfHealingSurgePct=0.06f //0.1f
|
||||
MaxSurvivalistResistance=0.30f //0.70f //0.5f //0.8
|
||||
CombatantSpeedModifier=0.1f
|
||||
|
||||
@ -738,7 +739,7 @@ DefaultProperties
|
||||
PerkSkills(EMedicHealingSpeedBoost)=(Name="HealingSpeedBoost",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_AdrenalineShot", Increment=0.f,Rank=0,StartingValue=10.0f,MaxValue=10.0f) //3.0
|
||||
PerkSkills(EMedicCombatant)=(Name="Combatant",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_CombatantDoctor", Increment=0.f,Rank=0,StartingValue=0.5f,MaxValue=0.5f)
|
||||
PerkSkills(EMedicHealingDamageBoost)=(Name="HealingDamageBoost",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_FocusInjection", Increment=0.f,Rank=0,StartingValue=5.0f,MaxValue=5.0f) //3.0
|
||||
PerkSkills(EMedicAcidicCompound)=(Name="AcidicCompound",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_AcidicRounds", Increment=0.f,Rank=0,StartingValue=0.65f,MaxValue=0.65f) //0.75 //0.5
|
||||
PerkSkills(EMedicAcidicCompound)=(Name="AcidicCompound",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_AcidicRounds", Increment=0.f,Rank=0,StartingValue=2f,MaxValue=2f)
|
||||
PerkSkills(EMedicHealingShield)=(Name="HealingShield",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_CoagulantBooster", Increment=0.f,Rank=0,StartingValue=10.f,MaxValue=10.f) //25.0
|
||||
PerkSkills(EMedicEnforcer)=(Name="Enforcer",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_BattleSurgeon", Increment=0.f,Rank=0,StartingValue=0.2f,MaxValue=0.2f)
|
||||
PerkSkills(EMedicAirborneAgent)=(Name="AirborneAgent",IconPath="ui_perktalent_tex.Medic.UI_Talents_Medic_AirborneAgent", Increment=0.f,Rank=0,StartingValue=0.2f,MaxValue=0.2f)
|
||||
|
@ -634,6 +634,7 @@ DefaultProperties
|
||||
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Firebug'
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_CaulkBurn'
|
||||
|
||||
KnifeWeaponDef=class'KFWeapDef_Knife_Firebug'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Firebug'
|
||||
|
||||
|
@ -60,9 +60,6 @@ var private const int MaxHeadShotComboCount;
|
||||
var private const float HeadShotCountdownIntervall;
|
||||
var private const float SteadySkillDamageModifier;
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Perk init and spawning
|
||||
******************************************************************************************** */
|
||||
/**
|
||||
* @brief Weapons and perk skills can affect the jog/sprint speed
|
||||
*
|
||||
@ -825,6 +822,7 @@ DefaultProperties
|
||||
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Gunslinger'
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_Remington1858Dual'
|
||||
|
||||
KnifeWeaponDef=class'KFWeapDef_Knife_Gunslinger'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Gunslinger'
|
||||
|
||||
@ -870,11 +868,14 @@ DefaultProperties
|
||||
AdditionalOnPerkWeaponNames(0)="KFWeap_Pistol_9mm"
|
||||
AdditionalOnPerkWeaponNames(1)="KFWeap_Pistol_Dual9mm"
|
||||
AdditionalOnPerkWeaponNames(2)="KFWeap_GrenadeLauncher_HX25"
|
||||
AdditionalOnPerkWeaponNames(3)="KFWeap_HRG_93R"
|
||||
AdditionalOnPerkWeaponNames(4)="KFWeap_HRG_93R_Dual"
|
||||
AdditionalOnPerkDTNames(0)="KFDT_Ballistic_9mm"
|
||||
AdditionalOnPerkDTNames(1)="KFDT_Ballistic_Pistol_Medic"
|
||||
AdditionalOnPerkDTNames(2)="KFDT_Ballistic_Winchester"
|
||||
AdditionalOnPerkDTNames(3)="KFDT_Ballistic_HX25Impact"
|
||||
AdditionalOnPerkDTNames(4)="KFDT_Ballistic_HX25SubmunitionImpact"
|
||||
AdditionalOnPerkDTNames(5)="KFDT_Ballistic_HRG_93R"
|
||||
|
||||
PerkSkills(EGunslingerShootnMove)=(Name="ShootnMove",IconPath="UI_PerkTalent_TEX.Gunslinger.UI_Talents_Gunslinger_Steady",Increment=0.f,Rank=0,StartingValue=2.f,MaxValue=2.f)
|
||||
PerkSkills(EGunslingerQuickSwitch)=(Name="QuickSwitch",IconPath="UI_PerkTalent_TEX.Gunslinger.UI_Talents_Gunslinger_QuickSwitch",Increment=0.f,Rank=0,StartingValue=0.5f,MaxValue=0.5f)
|
||||
|
@ -721,6 +721,7 @@ DefaultProperties
|
||||
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Sharpshooter'
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_Winchester1894'
|
||||
|
||||
KnifeWeaponDef=class'KFWeapDef_Knife_Sharpshooter'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Sharpshooter'
|
||||
|
||||
@ -741,10 +742,12 @@ DefaultProperties
|
||||
AdditionalOnPerkWeaponNames(1)="KFWeap_Pistol_Dual9mm"
|
||||
AdditionalOnPerkWeaponNames(2)="KFWeap_Revolver_Rem1858"
|
||||
AdditionalOnPerkWeaponNames(3)="KFWeap_Revolver_SW500"
|
||||
AdditionalOnPerkWeaponNames(4)="KFWeap_HRG_93R"
|
||||
AdditionalOnPerkWeaponNames(5)="KFWeap_HRG_93R_Dual"
|
||||
AdditionalOnPerkDTNames(0)="KFDT_Ballistic_9mm"
|
||||
AdditionalOnPerkDTNames(1)="KFDT_Ballistic_SW500"
|
||||
AdditionalOnPerkDTNames(2)="KFDT_Ballistic_Rem1858"
|
||||
|
||||
AdditionalOnPerkDTNames(3)="KFDT_Ballistic_HRG_93R"
|
||||
|
||||
HeadshotDamage=(Name="Headshot Damage",Increment=0.01f,Rank=0,StartingValue=0.0f,MaxValue=0.25f)
|
||||
Recoil=(Name="Recoil",Increment=0.01f,Rank=0,StartingValue=0.0f,MaxValue=0.25f)
|
||||
|
@ -40,6 +40,11 @@ var private const array<Name> AdditionalOnPerkDTNames;
|
||||
|
||||
var private const int DoorRepairXP[4]; // Door repair XP per-difficulty
|
||||
|
||||
|
||||
// Resistance to damage taken when Fortitude skill is active
|
||||
var private const float FortitudeDamageResistance;
|
||||
var private const float APDamageModifier;
|
||||
|
||||
enum ESupportPerkSkills
|
||||
{
|
||||
ESupportHighCapMags,
|
||||
@ -52,6 +57,7 @@ enum ESupportPerkSkills
|
||||
ESupportConcussionRounds,
|
||||
ESupportPerforate,
|
||||
ESupportBarrage,
|
||||
|
||||
};
|
||||
|
||||
/*********************************************************************************************
|
||||
@ -177,12 +183,43 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
|
||||
TempDamage += InDamage * GetSkillValue( PerkSkills[ESupportSalvo] );
|
||||
`QALog( GetFuncName() @ "+ Salvo Damage =" @ TempDamage, bLogPerk );
|
||||
}
|
||||
|
||||
if ( IsAPShotActive() )
|
||||
{
|
||||
TempDamage += InDamage * APDamageModifier;
|
||||
`QALog( GetFuncName() @ "+ Armor Piercing Damage =" @ TempDamage, bLogPerk );
|
||||
}
|
||||
}
|
||||
|
||||
`QALog( "Total Damage Given" @ Damagetype @ KFW @ GetPercentage( InDamage, Round(TempDamage) ), bLogPerk );
|
||||
InDamage = Round( TempDamage );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Modifies the damage taken
|
||||
*
|
||||
* @param InDamage damage
|
||||
* @param DamageType the damage type used (optional)
|
||||
*/
|
||||
function ModifyDamageTaken( out int InDamage, optional class<DamageType> DamageType, optional Controller InstigatedBy )
|
||||
{
|
||||
local float TempDamage;
|
||||
|
||||
if( InDamage <= 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TempDamage = InDamage;
|
||||
|
||||
if( IsFortitudeActive() )
|
||||
{
|
||||
TempDamage -= TempDamage * FortitudeDamageResistance;
|
||||
`QALog( "Fortitude Damage Resistance =" @ FortitudeDamageResistance, bLogPerk );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** Welding Proficiency - faster welding/unwelding */
|
||||
/**
|
||||
* @brief Modifies the welding speed
|
||||
@ -563,14 +600,27 @@ simulated function float GetZedTimeModifier( KFWeapon W )
|
||||
// Blast Brawlers use a different state for shooting (combining melee + firing). Needs a special case for this
|
||||
// FAMAS uses alt fire as common firing. Another special case added
|
||||
// HRG Ballistic Bouncer uses a special state of charging when shooting
|
||||
if( IsWeaponOnPerk( W,, self.class ) && CouldBarrageActive() &&
|
||||
(ZedTimeModifyingStates.Find( StateName ) != INDEX_NONE ||
|
||||
(StateName == 'MeleeChainAttacking' && IsBlastBrawlers(W)) ||
|
||||
(IsFAMAS(W) && StateName == 'FiringSecondaryState')) ||
|
||||
(IsHRGBallisticBouncer(W) && StateName == 'MineReconstructorCharge'))
|
||||
if (IsWeaponOnPerk( W,, self.class ) )
|
||||
{
|
||||
return BarrageFiringRate;
|
||||
}
|
||||
if( CouldBarrageActive() &&
|
||||
(ZedTimeModifyingStates.Find( StateName ) != INDEX_NONE ||
|
||||
(StateName == 'MeleeChainAttacking' && IsBlastBrawlers(W)) ||
|
||||
(IsFAMAS(W) && StateName == 'FiringSecondaryState')) ||
|
||||
(IsHRGBallisticBouncer(W) && StateName == 'MineReconstructorCharge'))
|
||||
{
|
||||
return BarrageFiringRate;
|
||||
}
|
||||
|
||||
if( IsPerforateActive() && ( IsWeaponOnPerk( W,, self.class ) ) )
|
||||
{
|
||||
StateName = W.GetStateName();
|
||||
|
||||
if( StateName == 'Reloading' )
|
||||
{
|
||||
return 1.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0.f;
|
||||
}
|
||||
@ -812,6 +862,7 @@ DefaultProperties
|
||||
InteractIcon=Texture2D'UI_World_TEX.Support_Supplier_HUD'
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_MB500'
|
||||
|
||||
KnifeWeaponDef=class'KFWeapDef_Knife_Support'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Support'
|
||||
|
||||
@ -875,4 +926,7 @@ DefaultProperties
|
||||
AdditionalOnPerkDTNames(0)="KFDT_Ballistic_Shotgun_Medic"
|
||||
AdditionalOnPerkDTNames(1)="KFDT_Ballistic_DragonsBreath"
|
||||
AdditionalOnPerkDTNames(2)="KFDT_Ballistic_NailShotgun"
|
||||
|
||||
FortitudeDamageResistance=0.1f
|
||||
APDamageModifier=0.05f
|
||||
}
|
||||
|
@ -893,27 +893,29 @@ simulated function string GetGrenadeClassPath()
|
||||
|
||||
simulated function byte GetGrenadeSelectedIndex() { return CurrentGrenadeClassIndex; }
|
||||
|
||||
simulated function byte SetWeaponSelectedIndex(byte idx)
|
||||
simulated static function byte GetWeaponSelectedIndex(byte idx)
|
||||
{
|
||||
if (idx >= default.PrimaryWeaponPaths.Length && idx < 255)
|
||||
{
|
||||
StartingWeaponClassIndex = 0;
|
||||
return 0;
|
||||
}
|
||||
else if (idx == 255)
|
||||
|
||||
if (idx == 255)
|
||||
{
|
||||
StartingWeaponClassIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartingWeaponClassIndex = idx;
|
||||
return `WEAP_IDX_NONE;
|
||||
}
|
||||
|
||||
ServerUpdateCurrentWeapon(StartingWeaponClassIndex);
|
||||
|
||||
return StartingWeaponClassIndex;
|
||||
return idx;
|
||||
}
|
||||
|
||||
simulated function byte SetGrenadeSelectedIndex(byte idx)
|
||||
simulated function SetWeaponSelectedIndex(byte idx)
|
||||
{
|
||||
StartingWeaponClassIndex = static.GetWeaponSelectedIndex(idx);
|
||||
|
||||
ServerUpdateCurrentWeapon(StartingWeaponClassIndex);
|
||||
}
|
||||
|
||||
simulated function SetGrenadeSelectedIndex(byte idx)
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
@ -953,70 +955,66 @@ simulated function byte SetGrenadeSelectedIndex(byte idx)
|
||||
{
|
||||
UpdateCurrentGrenade();
|
||||
}
|
||||
|
||||
return StartingGrenadeClassIndex;
|
||||
}
|
||||
|
||||
simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
|
||||
simulated static function byte GetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
local bool AmmoVestActive, BigPocketsActive;
|
||||
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
local byte SelectedGrenadeIndex;
|
||||
|
||||
AmmoVestActive = false;
|
||||
BigPocketsActive = false;
|
||||
|
||||
if (idx >= default.GrenadeWeaponPaths.Length && idx < 255)
|
||||
{
|
||||
StartingGrenadeClassIndex = 0;
|
||||
SelectedGrenadeIndex = 0;
|
||||
}
|
||||
else if (idx == 255)
|
||||
{
|
||||
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
|
||||
SelectedGrenadeIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartingGrenadeClassIndex = idx;
|
||||
SelectedGrenadeIndex = idx;
|
||||
|
||||
if (StartingGrenadeClassIndex == MedicGrenadeIndex || StartingGrenadeClassIndex == FirebugGrenadeIndex)
|
||||
if (SelectedGrenadeIndex == default.MedicGrenadeIndex || SelectedGrenadeIndex == default.FirebugGrenadeIndex)
|
||||
{
|
||||
AmmoVestActive = InSelectedSkills[2] == 1;
|
||||
BigPocketsActive = InSelectedSkills[2] == 2;
|
||||
|
||||
if (IsChoosingPrev)
|
||||
{
|
||||
if (StartingGrenadeClassIndex == FirebugGrenadeIndex)
|
||||
if (SelectedGrenadeIndex == default.FirebugGrenadeIndex)
|
||||
{
|
||||
if (BigPocketsActive == false)
|
||||
{
|
||||
--StartingGrenadeClassIndex;
|
||||
--SelectedGrenadeIndex;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex == MedicGrenadeIndex)
|
||||
if (SelectedGrenadeIndex == default.MedicGrenadeIndex)
|
||||
{
|
||||
if (AmmoVestActive == false)
|
||||
{
|
||||
--StartingGrenadeClassIndex;
|
||||
--SelectedGrenadeIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (IsChoosingNext)
|
||||
{
|
||||
if (StartingGrenadeClassIndex == MedicGrenadeIndex)
|
||||
if (SelectedGrenadeIndex == default.MedicGrenadeIndex)
|
||||
{
|
||||
if (AmmoVestActive == false)
|
||||
{
|
||||
++StartingGrenadeClassIndex;
|
||||
++SelectedGrenadeIndex;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex == FirebugGrenadeIndex)
|
||||
if (SelectedGrenadeIndex == default.FirebugGrenadeIndex)
|
||||
{
|
||||
if (BigPocketsActive == false)
|
||||
{
|
||||
++StartingGrenadeClassIndex;
|
||||
++SelectedGrenadeIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1024,32 +1022,26 @@ simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSele
|
||||
{
|
||||
if (AmmoVestActive)
|
||||
{
|
||||
StartingGrenadeClassIndex = MedicGrenadeIndex;
|
||||
SelectedGrenadeIndex = default.MedicGrenadeIndex;
|
||||
}
|
||||
else if (BigPocketsActive)
|
||||
{
|
||||
StartingGrenadeClassIndex = FirebugGrenadeIndex;
|
||||
SelectedGrenadeIndex = default.FirebugGrenadeIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartingGrenadeClassIndex = 0;
|
||||
SelectedGrenadeIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex > GrenadeWeaponPaths.Length - 1)
|
||||
if (SelectedGrenadeIndex > default.GrenadeWeaponPaths.Length - 1)
|
||||
{
|
||||
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
|
||||
SelectedGrenadeIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we are in no gameplay time insta change
|
||||
if (!KFGRI.bWaveIsActive)
|
||||
{
|
||||
UpdateCurrentGrenade();
|
||||
}
|
||||
|
||||
return StartingGrenadeClassIndex;
|
||||
return SelectedGrenadeIndex;
|
||||
}
|
||||
|
||||
simulated function InitializeGrenades()
|
||||
|
@ -22,7 +22,6 @@ var private const PerkSkill WeaponSwitchSpeed;
|
||||
var private const float RapidAssaultFiringRate; // Faster firing rate in % NOTE:This is needed for combinations with the Skill: RapidAssault (Stumble Power and Rate)
|
||||
var private const float SnarePower;
|
||||
var private const float TacticalMovementBobDamp;
|
||||
var private const class<KFWeaponDefinition> BackupSecondaryWeaponDef;
|
||||
var private const float TacticalMovementModifier; // QoL: Tactical movement - Added modifier to move and sprint speed.
|
||||
|
||||
/** Percentage of how much armor should be damaged when the heavy armor skill is active */
|
||||
@ -60,6 +59,8 @@ enum ESWATPerkSkills
|
||||
ESWAT_RapidAssault
|
||||
};
|
||||
|
||||
var private const array<class<KFWeaponDefinition> > SecondaryDualWeaponPaths;
|
||||
|
||||
replication
|
||||
{
|
||||
if (bNetDirty)
|
||||
@ -109,12 +110,6 @@ simulated event float GetZedTimeSpeedScale()
|
||||
return IsSWATEnforcerActive() ? SWATEnforcerZedTimeSpeedScale : 1.f;
|
||||
}
|
||||
|
||||
/* Returns the secondary weapon's class path for this perk */
|
||||
simulated function string GetSecondaryWeaponClassPath()
|
||||
{
|
||||
return IsBackupActive() ? BackupSecondaryWeaponDef.default.WeaponClassPath : SecondaryWeaponDef.default.WeaponClassPath;
|
||||
}
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Passives
|
||||
********************************************************************************************* */
|
||||
@ -279,7 +274,8 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
|
||||
if( KFW != none )
|
||||
{
|
||||
// KFDT_Bludgeon_Doshinegun_Shot is a special case of Bludgeon damage that doesn't apply this mod.
|
||||
if( IsBackupActive() && (IsBackupWeapon( KFW ) || IsDual9mm( KFW ) || ShouldAffectBackupToDamage(KFW, DamageType)))
|
||||
if( IsBackupActive()
|
||||
&& (IsBackupWeapon( KFW ) || IsDual9mm( KFW ) || IsHRG93R( KFW ) || ShouldAffectBackupToDamage(KFW, DamageType)))
|
||||
{
|
||||
`QALog( "Backup Damage" @ KFW @ GetPercentage( InDamage, InDamage * GetSkillValue(PerkSkills[ESWAT_Backup])), bLogPerk );
|
||||
TempDamage += InDamage * GetSkillValue( PerkSkills[ESWAT_Backup] );
|
||||
@ -700,12 +696,27 @@ simulated static function GetPassiveStrings( out array<string> PassiveValues, ou
|
||||
Increments[4] = "";
|
||||
}
|
||||
|
||||
simulated function string GetSecondaryWeaponClassPath()
|
||||
{
|
||||
if (IsBackupActive())
|
||||
{
|
||||
return SecondaryDualWeaponPaths[StartingSecondaryWeaponClassIndex].default.WeaponClassPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
return SecondaryWeaponPaths[StartingSecondaryWeaponClassIndex].default.WeaponClassPath;
|
||||
}
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_SWAT'
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_MP7'
|
||||
BackupSecondaryWeaponDef=class'KFWeapDef_9mmDual'
|
||||
|
||||
SecondaryDualWeaponPaths(0)=class'KFWeapDef_9mmDual'
|
||||
SecondaryDualWeaponPaths(1)=class'KFWeapDef_HRG_93R_Dual'
|
||||
|
||||
KnifeWeaponDef=class'KFweapDef_Knife_SWAT'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_SWAT'
|
||||
|
||||
|
@ -316,12 +316,40 @@ function GiveWeapon( Pawn P )
|
||||
local KFInventoryManager KFIM;
|
||||
local Inventory Inv;
|
||||
|
||||
// Give us the weapon if we do not have it
|
||||
InventoryClass = ItemPickups[ PickupIndex ].ItemClass;
|
||||
|
||||
// Check if we have the weapon
|
||||
KFIM = KFInventoryManager( P.InvManager );
|
||||
|
||||
// For HRG93R and 9mm pistols, if one of the other type is picked just give the one owned
|
||||
if (KFIM.Is9mmInInventory())
|
||||
{
|
||||
if (InventoryClass.name == 'KFWeap_HRG_93R')
|
||||
{
|
||||
InventoryClass = class<Weapon>(DynamicLoadObject(class'KfWeapDef_9mm'.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
else if (InventoryClass.name == 'KFWeap_HRG_93R_Dual')
|
||||
{
|
||||
InventoryClass = class<Weapon>(DynamicLoadObject(class'KfWeapDef_9mmDual'.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(InventoryClass.name == 'KFWeap_Pistol_9mm')
|
||||
{
|
||||
InventoryClass = class<Weapon>(DynamicLoadObject(class'KFWeapDef_HRG_93R'.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
else if (InventoryClass.name == 'KFWeap_Pistol_Dual9mm')
|
||||
{
|
||||
InventoryClass = class<Weapon>(DynamicLoadObject(class'KFWeapDef_HRG_93R_Dual'.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
}
|
||||
|
||||
foreach KFIM.InventoryActors( class'KFWeapon', KFW )
|
||||
{
|
||||
KFWeaponClass = class<KFWeapon>( ItemPickups[PickupIndex].ItemClass );
|
||||
if ( KFW.class == ItemPickups[ PickupIndex ].ItemClass )
|
||||
KFWeaponClass = class<KFWeapon>( InventoryClass );
|
||||
if ( KFW.class == InventoryClass )
|
||||
{
|
||||
// if this isn't a dual-wield class, then we can't carry another
|
||||
if( KFW.DualClass == none )
|
||||
@ -338,12 +366,11 @@ function GiveWeapon( Pawn P )
|
||||
}
|
||||
}
|
||||
|
||||
// Give us the weapon if we do not have it
|
||||
InventoryClass = ItemPickups[ PickupIndex ].ItemClass;
|
||||
Inv = KFIM.CreateInventory(InventoryClass, true);
|
||||
|
||||
if( Inv != none )
|
||||
{
|
||||
|
||||
KFW = KFWeapon(Inv);
|
||||
if( KFW != none )
|
||||
{
|
||||
|
@ -115,6 +115,8 @@ var private const bool bPerkStatsLoaded;
|
||||
var public byte SavedPerkIndex;
|
||||
/** Index of the weapon chosen for the survival perk */
|
||||
var public byte SurvivalPerkWeapIndex;
|
||||
/** Index of the secondary weapon chosen for the survival perk */
|
||||
var public byte SurvivalPerkSecondaryWeapIndex;
|
||||
/** Index of the grenade chosen for the survival perk */
|
||||
var public byte SurvivalPerkGrenIndex;
|
||||
|
||||
@ -1673,6 +1675,7 @@ function OnReadProfileSettingsComplete(byte LocalUserNum,bool bWasSuccessful)
|
||||
bDisableAutoUpgrade = Profile.GetProfileBool(KFID_DisableAutoUpgrade);
|
||||
bHideRemotePlayerHeadshotEffects = Profile.GetProfileBool(KFID_HideRemoteHeadshotEffects);
|
||||
SurvivalPerkWeapIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingWeapIdx));
|
||||
SurvivalPerkSecondaryWeapIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingSecondaryWeapIdx));
|
||||
SurvivalPerkGrenIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingGrenIdx));
|
||||
|
||||
KFPRI = KFPlayerReplicationInfo(PlayerReplicationInfo);
|
||||
@ -2862,6 +2865,12 @@ public function bool CanUseContaminationMode()
|
||||
&& KFGameReplicationInfo(WorldInfo.GRI).IsContaminationMode();
|
||||
}
|
||||
|
||||
public function bool CanUseBountyHunt()
|
||||
{
|
||||
return KFGameReplicationInfo(WorldInfo.GRI) != none
|
||||
&& KFGameReplicationInfo(WorldInfo.GRI).IsBountyHunt();
|
||||
}
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Skill Tracking
|
||||
********************************************************************************************* */
|
||||
@ -7657,6 +7666,12 @@ function AddAfflictionCaused(EAfflictionType Type)
|
||||
}
|
||||
native reliable client private function ClientAddAfflictionCaused(EAfflictionType Type);
|
||||
|
||||
function AddCollectibleFound(int Limit)
|
||||
{
|
||||
ClientAddCollectibleFound(Limit);
|
||||
}
|
||||
native reliable client private function ClientAddCollectibleFound(int Limit);
|
||||
|
||||
function AddZedAssist(class<KFPawn_Monster> MonsterClass)
|
||||
{
|
||||
ClientAddZedAssist(MonsterClass);
|
||||
@ -12038,6 +12053,8 @@ reliable client function ForceMonsterHeadExplode(KFPawn_Monster Victim)
|
||||
|
||||
simulated function InitPerkLoadout()
|
||||
{
|
||||
CurrentPerk.SetSecondaryWeaponSelectedIndex(SurvivalPerkSecondaryWeapIndex);
|
||||
|
||||
if (CurrentPerk.IsA('KFPerk_Survivalist'))
|
||||
{
|
||||
CurrentPerk.SetWeaponSelectedIndex(SurvivalPerkWeapIndex);
|
||||
|
@ -117,6 +117,9 @@ var bool ContaminationModePlayerIsInside;
|
||||
var int ContaminationModeLastTimePlayerOutPulsate;
|
||||
var bool ContaminationModeLastPulsate;
|
||||
|
||||
// Bounty Hunt weekly
|
||||
var int BountyHuntCurrentExtraZeds;
|
||||
|
||||
cpptext
|
||||
{
|
||||
virtual UBOOL TestZedTimeVisibility(APawn* P, UNetConnection* Connection, UBOOL bLocalPlayerTest) override;
|
||||
@ -272,6 +275,27 @@ reliable client function HideContaminationMode()
|
||||
}
|
||||
}
|
||||
|
||||
reliable client function DisplayBountyHuntObjective(int Bounties)
|
||||
{
|
||||
if (MyGFxHUD != none)
|
||||
{
|
||||
MyGFxHUD.DisplayBountyHuntObjective(Bounties);
|
||||
}
|
||||
}
|
||||
|
||||
reliable client function DisplayBountyHuntStatus(int CurrentAliveBounties, int MaxBounties, int DeadBounties, int Dosh, int DoshNoAssist)
|
||||
{
|
||||
if (MyGFxHUD != none)
|
||||
{
|
||||
//`Log("CurrentAliveBounties :" $CurrentAliveBounties);
|
||||
//`Log("(MaxBounties - DeadBounties) :" $(MaxBounties - DeadBounties));
|
||||
|
||||
BountyHuntCurrentExtraZeds = (MaxBounties - DeadBounties) - CurrentAliveBounties;
|
||||
|
||||
MyGFxHUD.DisplayBountyHuntStatus(MaxBounties - DeadBounties, Dosh, DoshNoAssist);
|
||||
}
|
||||
}
|
||||
|
||||
reliable client function ResetSyringe()
|
||||
{
|
||||
local KFInventoryManager InventoryManager;
|
||||
@ -536,15 +560,21 @@ function AdjustDamage(out int InDamage, Controller InstigatedBy, class<DamageTyp
|
||||
local KFGameInfo KFGI;
|
||||
local float Multiplier, ModifierRange, HealthTop, HealthRange;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
local KFPawn_Monster KFPM;
|
||||
local int BountyHuntZedIt, BountyHuntIt;
|
||||
local float WaveProgress;
|
||||
|
||||
super.AdjustDamage(InDamage, InstigatedBy, DamageType, DamageCauser, DamageReceiver);
|
||||
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
|
||||
if (Pawn != None && KFGI != none && KFGI.OutbreakEvent != none && KFGI.OutbreakEvent.ActiveEvent.bVIPGameMode)
|
||||
if (KFGI != none)
|
||||
{
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
}
|
||||
|
||||
if (Pawn != None && KFGI != none && KFGI.OutbreakEvent != none && KFGI.OutbreakEvent.ActiveEvent.bVIPGameMode)
|
||||
{
|
||||
// If I am the VIP doing the damage, and I am NOT doing damage to myself
|
||||
if (KFGRI != none
|
||||
&& KFGRI.VIPRepPlayer != none
|
||||
@ -598,6 +628,58 @@ function AdjustDamage(out int InDamage, Controller InstigatedBy, class<DamageTyp
|
||||
InDamage = int(float(InDamage) * Multiplier);
|
||||
}
|
||||
}
|
||||
|
||||
if (Pawn != None && KFGRI != none && KFGRI.IsBountyHunt())
|
||||
{
|
||||
KFPM = KFPawn_Monster(DamageCauser);
|
||||
|
||||
if (KFPM != none && KFPM.bIsBountyHuntObjective)
|
||||
{
|
||||
// Depending on wave progress we tweak the Damage
|
||||
|
||||
if (KFGRI.WaveTotalAICount > 0)
|
||||
{
|
||||
// Don't count current alive Bounty Zeds
|
||||
WaveProgress = float(KFGRI.AIRemaining - KFGI.WeeklyCurrentExtraNumberOfZeds()) / float(KFGRI.WaveTotalAICount);
|
||||
}
|
||||
else
|
||||
{
|
||||
WaveProgress = 0.f;
|
||||
}
|
||||
|
||||
// Find first node of data for the Zed type we checking,.
|
||||
for (BountyHuntZedIt = 0 ; BountyHuntZedIt < KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression.Length; ++BountyHuntZedIt)
|
||||
{
|
||||
if (KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].ZedType == KFPM.class)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Update to the current level
|
||||
for (BountyHuntIt = 0 ; BountyHuntIt < KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression.Length; ++BountyHuntIt)
|
||||
{
|
||||
if (WaveProgress >= KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression[BountyHuntIt].RemainingZedRatio)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (BountyHuntIt == KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression.Length)
|
||||
{
|
||||
BountyHuntIt = KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression.Length - 1;
|
||||
}
|
||||
|
||||
//`Log("BOUNTY HUNT : Initial InDamage = " $InDamage);
|
||||
|
||||
//`Log("WaveProgress : " $WaveProgress);
|
||||
|
||||
InDamage += InDamage * KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression[BountyHuntIt].DamageBuffRatio;
|
||||
|
||||
//`Log("BOUNTY HUNT : Output Damage: " $KFGI.OutbreakEvent.ActiveEvent.BountyHuntGame.BountyHuntZedAndProgression[BountyHuntZedIt].BountyHuntZedProgression[BountyHuntIt].DamageBuffRatio);
|
||||
//`Log("BOUNTY HUNT : Final InDamage = " $InDamage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function AdjustVIPDamage(out int InDamage, Controller InstigatedBy)
|
||||
|
@ -20,6 +20,7 @@ struct native WeaponSkinPairs
|
||||
var transient array<CustomizationInfo> Characters;
|
||||
var transient array<string> FavoriteWeapons;
|
||||
var transient array<WeaponSkinPairs> ActiveSkins;
|
||||
var transient array<string> KilledHansVolterInMaps;
|
||||
var transient bool Dirty;
|
||||
|
||||
event FavoriteWeapon(name WeaponName)
|
||||
@ -53,6 +54,29 @@ event UnFavoriteWeapon(name WeaponName)
|
||||
}
|
||||
}
|
||||
|
||||
function bool AddHansVolterKilledInMap(string MapName)
|
||||
{
|
||||
if (KilledHansVolterInMaps.Find(MapName) == INDEX_NONE)
|
||||
{
|
||||
KilledHansVolterInMaps.AddItem(MapName);
|
||||
|
||||
while (KilledHansVolterInMaps.Length > 5)
|
||||
{
|
||||
// There's a crash on the save system because the string this generates is huge
|
||||
// We don't need to store more than 5
|
||||
// We are going to cap it then, we remove from the beginning
|
||||
|
||||
KilledHansVolterInMaps.Remove(0, 1);
|
||||
}
|
||||
|
||||
Dirty = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
event Save( byte ControllerId )
|
||||
{
|
||||
if(Dirty)
|
||||
@ -234,6 +258,7 @@ defaultproperties
|
||||
ProfileMappings.Add((Id=KFID_FriendlyHudScale, Name="Friendly HUD Scale", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_FavoriteWeapons, Name="Favorite Weapons", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_GearLoadouts, Name="Gear Loadouts", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_KilledHansVolterInMaps, Name="Killed Hans Volter In Maps", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_SetGamma, Name="Set Gamma", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_RequiresPushToTalk, Name="RequiresPushToTalk", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_InvertController, Name="controllerInvertedValue", MappingType=PVMT_RawValue))
|
||||
@ -258,6 +283,7 @@ defaultproperties
|
||||
ProfileMappings.Add((Id=KFID_SavedLengthIndex, Name="SavedLengthIndex", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_SavedPrivacyIndex, Name="SavedPrivacyIndex", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_SavedAllowSeasonalSkinsIndex, Name="SavedAllowSeasonalSkinsIndex", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_SavedWeeklySelectorIndex, Name="SavedWeeklySelectorIndex", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_SavedServerTypeIndex, Name="SavedServerTypeIndex", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_SavedInProgressIndex, Name="SavedInProgressIndex", MappingType=PVMT_RawValue))
|
||||
ProfileMappings.Add((Id=KFID_ControllerSoundEnabled, Name="Controller Sound Enabled", MappingType=PVMT_RawValue))
|
||||
@ -320,6 +346,7 @@ defaultproperties
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_FriendlyHudScale,Data=(Type=SDT_Float,Value1=0x3f800000)))) // default of 1.0f
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_FavoriteWeapons,Data=(Type=SDT_String,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_GearLoadouts,Data=(Type=SDT_String,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_KilledHansVolterInMaps,Data=(Type=SDT_String,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SetGamma,Data=(Type=SDT_Int32,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_RequiresPushToTalk,Data=(Type=SDT_Int32,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_InvertController,Data=(Type=SDT_Int32,Value1=0))))
|
||||
@ -344,6 +371,7 @@ defaultproperties
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedLengthIndex,Data=(Type=SDT_Int32,Value1=0)))) //default to any
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedPrivacyIndex,Data=(Type=SDT_Int32,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedAllowSeasonalSkinsIndex,Data=(Type=SDT_Int32,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedWeeklySelectorIndex,Data=(Type=SDT_Int32,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedServerTypeIndex,Data=(Type=SDT_Int32,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SavedInProgressIndex,Data=(Type=SDT_Int32,Value1=0))))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_ControllerSoundEnabled,Data=(Type=SDT_Int32,Value1=0))))
|
||||
@ -411,4 +439,7 @@ defaultproperties
|
||||
|
||||
ProfileMappings.Add((Id=KFID_ViewAccelerationEnabled, Name="View_Acceleration_Enabled", MappingType=PVMT_RawValue))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_ViewAccelerationEnabled,Data=(Type=SDT_Int32,Value1=1))))
|
||||
|
||||
ProfileMappings.Add((Id=KFID_SurvivalStartingSecondaryWeapIdx, Name="Survival Starting Secondary Weapon Index", MappingType=PVMT_RawValue))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SurvivalStartingSecondaryWeapIdx,Data=(Type=SDT_Int32,Value1=0))))
|
||||
}
|
||||
|
@ -392,7 +392,7 @@ function NotifyOwnerTakeHit(class<KFDamageType> DamageType, vector HitLoc, vecto
|
||||
KFPOwner.EndSpecialMove();
|
||||
|
||||
// force stumble when damaged from a grapple
|
||||
if ( KFPOwner.CanDoSpecialMove(SM_Stumble) && DamageType.default.StumblePower > 0 )
|
||||
if ( KFPOwner.CanDoSpecialMove(SM_Stumble) && DamageType != none && DamageType.default.StumblePower > 0 )
|
||||
{
|
||||
KFPOwner.DoSpecialMove(SM_Stumble,,, class'KFSM_Stumble'.static.PackBodyHitSMFlags(KFPOwner, HitDir));
|
||||
}
|
||||
|
@ -80,4 +80,5 @@ simulated event OnTryCompleteObjective(int ObjectiveIndex, int EventIndex);
|
||||
simulated function OnHitTaken();
|
||||
simulated function OnHitGiven(class<DamageType> DT);
|
||||
simulated function OnWeaponPurchased(class<KFWeaponDefinition> WeaponDef, int Price);
|
||||
simulated function OnAfflictionCaused(EAfflictionType Type);
|
||||
simulated function OnAfflictionCaused(EAfflictionType Type);
|
||||
simulated function OnCollectibleFound(int Limit);
|
@ -109,7 +109,7 @@ enum ESquadType
|
||||
EST_Large,
|
||||
EST_Medium,
|
||||
EST_Small,
|
||||
EST_Crawler,
|
||||
EST_Crawler
|
||||
};
|
||||
/** If set, players cannot spawn here, only AI (Versus) */
|
||||
var() bool bNoPlayers;
|
||||
@ -154,6 +154,12 @@ var() float UnTouchCoolDownTime;
|
||||
/** When was the last time a player touched it. */
|
||||
var protected transient float LastUnTouchTime;
|
||||
|
||||
/** If true, will be used to spawn forcing to use the override pawn list -> MapReplacePawnClass */
|
||||
var() bool bForceUseMapReplacePawn;
|
||||
|
||||
/** If true, this volume will be disabled for Bounty Hunt Spawn */
|
||||
var() bool bDisableForBountyHuntSpawn;
|
||||
|
||||
/*********************************************************************************************
|
||||
Debug
|
||||
********************************************************************************************* */
|
||||
@ -503,6 +509,9 @@ DefaultProperties
|
||||
MaxHeightDiffToPlayers=500.f // 5 meters
|
||||
LargestSquadType=EST_Large
|
||||
|
||||
bForceUseMapReplacePawn=false
|
||||
bDisableForBountyHuntSpawn=false
|
||||
|
||||
// Debugging
|
||||
bDebugVisibilityChecks=false
|
||||
bMinimalDebugRatingChecks=true
|
||||
|
@ -39,7 +39,8 @@ enum ESharedContentUnlock
|
||||
SCU_G36C,
|
||||
SCU_HVStormCannon,
|
||||
SCU_ZedMKIII,
|
||||
SCU_Saiga12
|
||||
SCU_Saiga12,
|
||||
SCU_MG3
|
||||
};
|
||||
|
||||
|
||||
@ -398,4 +399,8 @@ defaultproperties
|
||||
Name=KFWeap_Shotgun_S12,
|
||||
IconPath="WEP_UI_Saiga12_TEX.UI_WeaponSelect_Saiga12",
|
||||
ID=9666)}
|
||||
SharedContentList(SCU_MG3)={(
|
||||
Name=KFWeap_LMG_MG3,
|
||||
IconPath="WEP_UI_MG3_TEX.UI_WeaponSelect_MG3",
|
||||
ID=9755)}
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_SMG_G18"
|
||||
|
||||
BuyPrice=1500
|
||||
AmmoPricePerMag=24
|
||||
AmmoPricePerMag=22 // 24
|
||||
ImagePath="WEP_UI_RiotShield_TEX.UI_WeaponSelect_RiotShield"
|
||||
|
||||
IsPlayGoHidden=true;
|
||||
|
@ -15,7 +15,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_AssaultRifle_G36C"
|
||||
|
||||
BuyPrice=1600
|
||||
AmmoPricePerMag=36
|
||||
AmmoPricePerMag=32 // 36
|
||||
ImagePath="wep_ui_g36c_tex.UI_WeaponSelect_G36C"
|
||||
|
||||
IsPlayGoHidden=true;
|
||||
|
@ -12,7 +12,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_SMG_HK_UMP"
|
||||
|
||||
BuyPrice=1200
|
||||
AmmoPricePerMag=36 //45
|
||||
AmmoPricePerMag=32 // 36 //45
|
||||
ImagePath="WEP_UI_HK_UMP_TEX.UI_WeaponSelect_UMP"
|
||||
|
||||
EffectiveRange=70
|
||||
|
35
KFGame/Classes/KFWeapDef_HRG_93R.uc
Normal file
35
KFGame/Classes/KFWeapDef_HRG_93R.uc
Normal 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
|
||||
}
|
35
KFGame/Classes/KFWeapDef_HRG_93R_Dual.uc
Normal file
35
KFGame/Classes/KFWeapDef_HRG_93R_Dual.uc
Normal 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
|
||||
}
|
@ -14,7 +14,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_HRG_BarrierRifle"
|
||||
|
||||
BuyPrice=2000
|
||||
AmmoPricePerMag=55
|
||||
AmmoPricePerMag=50 // 55
|
||||
ImagePath="wep_ui_hrg_barrierrifle_tex.UI_WeaponSelect_HRG_BarrierRifle"
|
||||
|
||||
IsPlayGoHidden=true;
|
||||
|
@ -14,7 +14,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_HRG_Stunner"
|
||||
|
||||
BuyPrice=1500
|
||||
AmmoPricePerMag=36
|
||||
AmmoPricePerMag=32 // 36
|
||||
ImagePath="ui_weaponselect_tex.UI_WeaponSelect_AA12"
|
||||
|
||||
IsPlayGoHidden=true;
|
||||
|
@ -15,7 +15,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_SMG_Kriss"
|
||||
|
||||
BuyPrice=1500
|
||||
AmmoPricePerMag=35 //35
|
||||
AmmoPricePerMag=31 //35
|
||||
ImagePath="WEP_UI_KRISS_TEX.UI_WeaponSelect_KRISS"
|
||||
|
||||
EffectiveRange=70
|
||||
|
25
KFGame/Classes/KFWeapDef_MG3.uc
Normal file
25
KFGame/Classes/KFWeapDef_MG3.uc
Normal 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
|
||||
}
|
@ -15,7 +15,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_SMG_MP5RAS"
|
||||
|
||||
BuyPrice=650
|
||||
AmmoPricePerMag=28 //22 //33
|
||||
AmmoPricePerMag=25 // 28 //22 //33
|
||||
ImagePath="WEP_UI_MP5RAS_TEX.UI_WeaponSelect_MP5RAS"
|
||||
|
||||
EffectiveRange=70
|
||||
|
@ -15,7 +15,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_SMG_MP7"
|
||||
|
||||
BuyPrice=200
|
||||
AmmoPricePerMag=16 //26
|
||||
AmmoPricePerMag=14 // 16 //26
|
||||
ImagePath="WEP_UI_MP7_TEX.UI_WeaponSelect_MP7"
|
||||
|
||||
EffectiveRange=70
|
||||
|
@ -14,7 +14,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_SMG_Mac10"
|
||||
|
||||
BuyPrice=900//1100
|
||||
AmmoPricePerMag=32
|
||||
AmmoPricePerMag=29 // 32
|
||||
ImagePath="WEP_UI_MAC10_TEX.UI_WeaponSelect_Mac10"
|
||||
|
||||
EffectiveRange=70
|
||||
|
@ -15,7 +15,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_SMG_Medic"
|
||||
|
||||
BuyPrice=650
|
||||
AmmoPricePerMag=21
|
||||
AmmoPricePerMag=19 // 21
|
||||
ImagePath="ui_weaponselect_tex.UI_WeaponSelect_MedicSMG"
|
||||
|
||||
EffectiveRange=70
|
||||
|
@ -15,7 +15,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_SMG_P90"
|
||||
|
||||
BuyPrice=1100
|
||||
AmmoPricePerMag=40 //50
|
||||
AmmoPricePerMag=36 // 40 //50
|
||||
ImagePath="WEP_UI_P90_TEX.UI_WeaponSelect_FNP90"
|
||||
|
||||
EffectiveRange=70
|
||||
|
@ -14,7 +14,7 @@ DefaultProperties
|
||||
WeaponClassPath="KFGameContent.KFWeap_AssaultRifle_Thompson"
|
||||
|
||||
BuyPrice=650 //650
|
||||
AmmoPricePerMag=50
|
||||
AmmoPricePerMag=45 // 50
|
||||
ImagePath="WEP_UI_TommyGun_TEX.UI_WeaponSelect_TommyGun"
|
||||
|
||||
|
||||
|
@ -408,7 +408,10 @@ function StartHealRecharge()
|
||||
if( Role == ROLE_Authority )
|
||||
{
|
||||
InstigatorPerk = GetPerk();
|
||||
UsedHealRechargeTime = HealFullRechargeSeconds * static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex);
|
||||
|
||||
UsedHealRechargeTime = HealFullRechargeSeconds;
|
||||
UsedHealRechargeTime *= static.GetUpgradeHealRechargeMod(CurrentWeaponUpgradeIndex);
|
||||
UsedHealRechargeTime *= InstigatorPerk.GetHealRechargeMod();
|
||||
|
||||
InstigatorPerk.ModifyHealerRechargeTime( UsedHealRechargeTime );
|
||||
// Set the healing recharge rate whenever we start charging
|
||||
|
@ -988,6 +988,8 @@ var repnotify Actor TargetingCompRepActor;
|
||||
// To force the crosshair for showing up even if there's no spread
|
||||
var bool bForceCrosshair;
|
||||
|
||||
const MinFireIntervalToTriggerSync = 0.23f;
|
||||
|
||||
cpptext
|
||||
{
|
||||
// Actor
|
||||
@ -6563,6 +6565,11 @@ simulated state WeaponFiring
|
||||
{
|
||||
StopLoopingFireEffects(CurrentFireMode);
|
||||
}
|
||||
|
||||
if (WorldInfo.NetMode == NM_Client && bAllowClientAmmoTracking && FireInterval[CurrentFireMode] <= MinFireIntervalToTriggerSync)
|
||||
{
|
||||
SyncCurrentAmmoCount(CurrentFireMode, AmmoCount[CurrentFireMode]);
|
||||
}
|
||||
}
|
||||
|
||||
/** Override to continue any looping fire anims */
|
||||
@ -6607,6 +6614,14 @@ simulated state WeaponFiring
|
||||
}
|
||||
}
|
||||
|
||||
unreliable server function SyncCurrentAmmoCount(byte FireMode, byte CurrentAmmoCount)
|
||||
{
|
||||
if(AmmoCount[FireMode] != CurrentAmmoCount)
|
||||
{
|
||||
AmmoCount[FireMode] = CurrentAmmoCount;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the timing for the firing state on server and local client.
|
||||
* By default, a constant looping Rate Of Fire (ROF) is set up.
|
||||
|
@ -4736,4 +4736,154 @@ defaultproperties
|
||||
|
||||
//S12 Shockgun Tiger
|
||||
Skins.Add((Id=9671, Weapondef=class'KFWeapDef_Shotgun_S12', MIC_1P=("WEP_SkinSet76_MAT.Wep_1stP_Saiga12_Tiger_MIC"), MIC_3P="WEP_SkinSet76_MAT.WEP_3P_Saiga12_Tiger_MIC", MIC_Pickup="WEP_SkinSet76_MAT.Wep_3P_Pickup_Saiga12_Tiger_MIC"))
|
||||
|
||||
//MG3 Shredder Standard
|
||||
Skins.Add((Id=9755, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_1p_mg3_mat.Wep_1stP_MG3_MIC"), MIC_3P="wep_3p_mg3_mat.Wep_3rdP_MG3_MIC", MIC_Pickup="wep_3p_mg3_mat.3P_Pickup_MG3_MIC"))
|
||||
|
||||
//MG3 Shredder Antique
|
||||
Skins.Add((Id=9756, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Antique_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Antique_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Antique_Pickup_MIC"))
|
||||
|
||||
//MG3 Shredder Arctic
|
||||
Skins.Add((Id=9757, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Arctic_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Arctic_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Arctic_Pickup_MIC"))
|
||||
|
||||
//MG3 Shredder Desert
|
||||
Skins.Add((Id=9758, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Desert_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Desert_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Desert_Pickup_MIC"))
|
||||
|
||||
//MG3 Shredder Filigree
|
||||
Skins.Add((Id=9759, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Filigree_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Filigree_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Filigree_Pickup_MIC"))
|
||||
|
||||
//MG3 Shredder Forest
|
||||
Skins.Add((Id=9760, Weapondef=class'KFWeapDef_MG3', MIC_1P=("wep_skinset82_mat.MG3_Forest_1P_MIC"), MIC_3P="WEP_SkinSet82_MAT.WEP_3P_MG3_Forest_MIC", MIC_Pickup="WEP_SkinSet82_MAT.WEP_3P_MG3_Forest_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic 500 Magnum Revolver
|
||||
Skins.Add((Id=9674, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_SW500', MIC_1P=("WEP_SkinSet79_MAT.chameleon_sw500.Chameleon_SW500_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleon_sw500.Chameleon_SW500_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleon_sw500.Chameleon_SW500_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic Doomstick
|
||||
Skins.Add((Id=9675, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_ElephantGun', MIC_1P=("WEP_SkinSet79_MAT.chameleon_quadbarrel.Chameleon_QuadBarrel_Main_1P_Mint_MIC", "WEP_SkinSet79_MAT.chameleon_quadbarrel.Chameleon_QuadBarrel_Barrel_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleon_quadbarrel.Chameleon_QuadBarrel_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleon_quadbarrel.Chameleon_QuadBarrel_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic Hemoclobber
|
||||
Skins.Add((Id=9676, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MedicBat', MIC_1P=("WEP_SkinSet79_MAT.chameleon_medicbat.Chameleon_MedicBat_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleon_medicbat.Chameleon_MedicBat_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleon_medicbat.Chameleon_MedicBat_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic P90
|
||||
Skins.Add((Id=9677, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet79_MAT.chameleon_p90.Chameleon_P90_1P_Mint_MIC", "WEP_SkinSet79_MAT.chameleon_p90.Chameleon_P90_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleon_p90.Chameleon_P90_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleon_p90.Chameleon_P90_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic RGB 500 Magnum Revolver
|
||||
Skins.Add((Id=9678, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_SW500', MIC_1P=("WEP_SkinSet79_MAT.chameleonrgb_sw500.ChameleonRGB_SW500_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleonrgb_sw500.ChameleonRGB_SW500_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleonrgb_sw500.ChameleonRGB_SW500_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic RGB Doomstick
|
||||
Skins.Add((Id=9679, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_ElephantGun', MIC_1P=("WEP_SkinSet79_MAT.chameleonrgb_quadbarrel.ChameleonRGB_QuadBarrel_Main_1P_Mint_MIC", "WEP_SkinSet79_MAT.chameleonrgb_quadbarrel.ChameleonRGB_QuadBarrel_Barrel_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleonrgb_quadbarrel.ChameleonRGB_QuadBarrel_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleonrgb_quadbarrel.ChameleonRGB_QuadBarrel_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic RGB Hemoclobber
|
||||
Skins.Add((Id=9680, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MedicBat', MIC_1P=("WEP_SkinSet79_MAT.chameleonrgb_medicbat.ChameleonRGB_MedicBat_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleonrgb_medicbat.ChameleonRGB_MedicBat_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleonrgb_medicbat.ChameleonRGB_MedicBat_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic RGB P90
|
||||
Skins.Add((Id=9681, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet79_MAT.chameleonrgb_p90.ChameleonRGB_P90_1P_Mint_MIC", "WEP_SkinSet79_MAT.chameleonrgb_p90.ChameleonRGB_P90_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet79_MAT.chameleonrgb_p90.ChameleonRGB_P90_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet79_MAT.chameleonrgb_p90.ChameleonRGB_P90_3P_Pickup_MIC"))
|
||||
|
||||
//Medieval Dynamic 500 Magnum Revolver
|
||||
Skins.Add((Id=9711, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_SW500', MIC_1P=("WEP_SkinSet80_MAT.medieval_sw500.Medieval_SW500_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medieval_sw500.Medieval_SW500_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medieval_sw500.Medieval_SW500_3P_Pickup_MIC"))
|
||||
|
||||
//Medieval Dynamic Dragonsbreath
|
||||
Skins.Add((Id=9708, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Dragonsbreath', MIC_1P=("WEP_SkinSet80_MAT.medieval_dragonsbreath.Medieval_Dragonsbreath_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medieval_dragonsbreath.Medieval_Dragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medieval_dragonsbreath.Medieval_Dragonsbreath_3P_Pickup_MIC"))
|
||||
|
||||
//Medieval Dynamic M79
|
||||
Skins.Add((Id=9709, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M79', MIC_1P=("WEP_SkinSet80_MAT.medieval_m79.Medieval_M79_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medieval_m79.Medieval_M79_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medieval_m79.Medieval_M79_3P_Pickup_MIC"))
|
||||
|
||||
//Medieval Dynamic Tommy Gun
|
||||
Skins.Add((Id=9710, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Thompson', MIC_1P=("WEP_SkinSet80_MAT.medieval_tommygun.Medieval_TommyGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medieval_tommygun.Medieval_TommyGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medieval_tommygun.Medieval_TommyGun_3P_Pickup_MIC"))
|
||||
|
||||
//Medieval Dynamic Precious 500 Magnum Revolver
|
||||
Skins.Add((Id=9712, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_SW500', MIC_1P=("WEP_SkinSet80_MAT.medievalgold_sw500.MedievalGold_SW500_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medievalgold_sw500.MedievalGold_SW500_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medievalgold_sw500.MedievalGold_SW500_3P_Pickup_MIC"))
|
||||
|
||||
//Medieval Dynamic Precious Dragonsbreath
|
||||
Skins.Add((Id=9713, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Dragonsbreath', MIC_1P=("WEP_SkinSet80_MAT.medievalgold_dragonsbreath.MedievalGold_Dragonsbreath_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medievalgold_dragonsbreath.MedievalGold_Dragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medievalgold_dragonsbreath.MedievalGold_Dragonsbreath_3P_Pickup_MIC"))
|
||||
|
||||
//Medieval Dynamic Precious M79
|
||||
Skins.Add((Id=9714, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M79', MIC_1P=("WEP_SkinSet80_MAT.medievalgold_m79.MedievalGold_M79_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medievalgold_m79.MedievalGold_M79_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medievalgold_dragonsbreath.MedievalGold_M79_3P_Pickup_MIC"))
|
||||
|
||||
//Medieval Dynamic Precious Tommy Gun
|
||||
Skins.Add((Id=9715, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Thompson', MIC_1P=("WEP_SkinSet80_MAT.medievalgold_tommygun.MedievalGold_TommyGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet80_MAT.medievalgold_tommygun.MedievalGold_TommyGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet80_MAT.medievalgold_tommygun.MedievalGold_TommyGun_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG 93R
|
||||
Skins.Add((Id=9682, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_93R', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrg93r.Spectre_HRG93R_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrg93r.Spectre_HRG93R_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrg93r.Spectre_HRG93R_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Ballistic Bouncer
|
||||
Skins.Add((Id=9683, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BallisticBouncer', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgballisticbouncer.Spectre_HRGBallisticBouncer_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgballisticbouncer.Spectre_HRGBallisticBouncer_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgballisticbouncer.Spectre_HRGBallisticBouncer_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Bastion
|
||||
Skins.Add((Id=9684, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BarrierRifle', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_Receiver_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgbarrierrifle.Spectre_HRGBarrierRifle_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Beluga Beat
|
||||
Skins.Add((Id=9685, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_SonicGun', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgsonicgun.Spectre_HRGSonicGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgsonicgun.Spectre_HRGSonicGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgsonicgun.Spectre_HRGSonicGun_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Blast Brawlers
|
||||
Skins.Add((Id=9686, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BlastBrawlers', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgblastbrawlers.Spectre_HRGBlastBrawlers_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgblastbrawlers.Spectre_HRGBlastBrawlers_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgblastbrawlers.Spectre_HRGBlastBrawlers_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgblastbrawlers.Spectre_HRGBlastBrawlers_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Crossboom
|
||||
Skins.Add((Id=9687, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Crossboom', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgcrossboom.Spectre_HRGCrossboom_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgcrossboom.Spectre_HRGCrossboom_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgcrossboom.Spectre_HRGCrossboom_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Disrupter
|
||||
Skins.Add((Id=9688, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Energy', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgenergy.Spectre_HRGEnergy_1P_Mint_MIC", "WEP_1P_HRG_Energy_MAT.Wep_Energy_Pistol_Optic_PM_MIC", "WEP_SkinSet78_MAT.spectre_hrgenergy.Spectre_HRGEnergy_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgenergy.Spectre_HRGEnergy_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgenergy.Spectre_HRGEnergy_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Dragonsblaze
|
||||
Skins.Add((Id=9689, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Dragonbreath', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_Barrel_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_Loader_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgmegadragonsbreath.Spectre_HRGMegaDragonsbreath_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Head Hunter
|
||||
Skins.Add((Id=9690, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_CranialPopper', MIC_1P=("WEP_1P_HRG_CranialPopper_MAT.Wep_Cranial_Optic_PM_MIC", "WEP_SkinSet78_MAT.spectre_hrgcranialpopper.Spectre_HRGCranialPopper_Optic_1P_Mint_MIC", "WEP_1P_RailGun_MAT.WEP_RailGunScopeLense_PM", "WEP_SkinSet78_MAT.spectre_hrgcranialpopper.Spectre_HRGCranialPopper_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgcranialpopper.Spectre_HRGCranialPopper_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgcranialpopper.Spectre_HRGCranialPopper_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Locust
|
||||
Skins.Add((Id=9691, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Locust', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrglocust.Spectre_HRGLocust_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectre_hrglocust.Spectre_HRGLocust_Optic_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrglocust.Spectre_HRGLocust_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrglocust.Spectre_HRGLocust_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Medic Missile
|
||||
Skins.Add((Id=9692, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_MedicMissile', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgmedicmissile.Spectre_HRGMedicMissile_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgmedicmissile.Spectre_HRGMedicMissile_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgmedicmissile.Spectre_HRGMedicMissile_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Stunner
|
||||
Skins.Add((Id=9693, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Stunner', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgstunner.Spectre_HRGStunner_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgstunner.Spectre_HRGStunner_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgstunner.Spectre_HRGStunner_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre HRG Tommy Boom
|
||||
Skins.Add((Id=9694, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Boomy', MIC_1P=("WEP_SkinSet78_MAT.spectre_hrgboomy.Spectre_HRGBoomy_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectre_hrgboomy.Spectre_HRGBoomy_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectre_hrgboomy.Spectre_HRGBoomy_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG 93R
|
||||
Skins.Add((Id=9695, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_93R', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrg93r.SpectreChroma_HRG93R_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrg93r.SpectreChroma_HRG93R_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrg93r.SpectreChroma_HRG93R_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Ballistic Bouncer
|
||||
Skins.Add((Id=9696, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BallisticBouncer', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgballisticbouncer.SpectreChroma_HRGBallisticBouncer_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgballisticbouncer.SpectreChroma_HRGBallisticBouncer_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgballisticbouncer.SpectreChroma_HRGBallisticBouncer_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Bastion
|
||||
Skins.Add((Id=9697, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BarrierRifle', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_Receiver_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgbarrierrifle.SpectreChroma_HRGBarrierRifle_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Beluga Beat
|
||||
Skins.Add((Id=9698, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_SonicGun', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgsonicgun.SpectreChroma_HRGSonicGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgsonicgun.SpectreChroma_HRGSonicGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgsonicgun.SpectreChroma_HRGSonicGun_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Blast Brawlers
|
||||
Skins.Add((Id=9699, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_BlastBrawlers', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgblastbrawlers.SpectreChroma_HRGBlastBrawlers_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgblastbrawlers.SpectreChroma_HRGBlastBrawlers_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgblastbrawlers.SpectreChroma_HRGBlastBrawlers_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgblastbrawlers.SpectreChroma_HRGBlastBrawlers_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Crossboom
|
||||
Skins.Add((Id=9700, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Crossboom', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgcrossboom.SpectreChroma_HRGCrossboom_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgcrossboom.SpectreChroma_HRGCrossboom_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgcrossboom.SpectreChroma_HRGCrossboom_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Disrupter
|
||||
Skins.Add((Id=9701, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Energy', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgenergy.SpectreChroma_HRGEnergy_1P_Mint_MIC", "WEP_1P_HRG_Energy_MAT.Wep_Energy_Pistol_Optic_PM_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgenergy.SpectreChroma_HRGEnergy_Extra_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgenergy.SpectreChroma_HRGEnergy_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgenergy.SpectreChroma_HRGEnergy_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Dragonsblaze
|
||||
Skins.Add((Id=9702, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Dragonbreath', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_Barrel_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_Loader_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgmegadragonsbreath.SpectreChroma_HRGMegaDragonsbreath_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Head Hunter
|
||||
Skins.Add((Id=9703, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_CranialPopper', MIC_1P=("WEP_1P_HRG_CranialPopper_MAT.Wep_Cranial_Optic_PM_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrgcranialpopper.SpectreChroma_HRGCranialPopper_Optic_1P_Mint_MIC", "WEP_1P_RailGun_MAT.WEP_RailGunScopeLense_PM", "WEP_SkinSet78_MAT.spectrechroma_hrgcranialpopper.SpectreChroma_HRGCranialPopper_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgcranialpopper.SpectreChroma_HRGCranialPopper_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgcranialpopper.SpectreChroma_HRGCranialPopper_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Locust
|
||||
Skins.Add((Id=9704, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Locust', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrglocust.SpectreChroma_HRGLocust_1P_Mint_MIC", "WEP_SkinSet78_MAT.spectrechroma_hrglocust.SpectreChroma_HRGLocust_Optic_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrglocust.SpectreChroma_HRGLocust_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrglocust.SpectreChroma_HRGLocust_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Medic Missile
|
||||
Skins.Add((Id=9705, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_MedicMissile', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgmedicmissile.SpectreChroma_HRGMedicMissile_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgmedicmissile.SpectreChroma_HRGMedicMissile_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgmedicmissile.SpectreChroma_HRGMedicMissile_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Stunner
|
||||
Skins.Add((Id=9706, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Stunner', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgstunner.SpectreChroma_HRGStunner_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgstunner.SpectreChroma_HRGStunner_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgstunner.SpectreChroma_HRGStunner_3P_Pickup_MIC"))
|
||||
|
||||
//Spectre Chroma HRG Tommy Boom
|
||||
Skins.Add((Id=9707, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Boomy', MIC_1P=("WEP_SkinSet78_MAT.spectrechroma_hrgboomy.SpectreChroma_HRGBoomy_1P_Mint_MIC"), MIC_3P="WEP_SkinSet78_MAT.spectrechroma_hrgboomy.SpectreChroma_HRGBoomy_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet78_MAT.spectrechroma_hrgboomy.SpectreChroma_HRGBoomy_3P_Pickup_MIC"))
|
||||
|
||||
//Bounty Hunt Deagle
|
||||
Skins.Add((Id=9753, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet81_MAT.BountyHunt.BountyHunt_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet81_MAT.BountyHunt.BountyHunt_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet81_MAT.BountyHunt.BountyHunt_Deagle_3P_Pickup_MIC"))
|
||||
|
||||
//Voltar MKB42
|
||||
Skins.Add((Id=9754, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MKB42', MIC_1P=("WEP_SkinSet81_MAT.hans_mkb42.Hans_MKB42_1P_Mint_MIC"), MIC_3P="WEP_SkinSet81_MAT.hans_mkb42.Hans_MKB42_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet81_MAT.hans_mkb42.Hans_MKB42_3P_Pickup_MIC"))
|
||||
}
|
@ -27,7 +27,7 @@ var localized array<string> ModifierDescriptions;
|
||||
cpptext
|
||||
{
|
||||
/** Num of Weekly events available */
|
||||
static const int NumWeeklyEvents = 20;
|
||||
static const int NumWeeklyEvents = 21;
|
||||
}
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -160,4 +160,5 @@ const STATID_ACHIEVE_RigCollectibles = 4062;
|
||||
const STATID_ACHIEVE_BarmwichCollectibles = 4063;
|
||||
const STATID_ACHIEVE_CrashCollectibles = 4064;
|
||||
const STATID_ACHIEVE_SubductionCollectibles = 4065;
|
||||
const STATID_ACHIEVE_VolterCastleCollectibles = 4066;
|
||||
/** `endif */
|
||||
|
@ -80,4 +80,7 @@ const KFID_MouseLookUpScale=181; // Halloweeen 2022 QoL: added mouse options to
|
||||
const KFID_MouseLookRightScale=182; // Halloweeen 2022 QoL: added mouse options to menu
|
||||
const KFID_ViewSmoothingEnabled=183; // Halloweeen 2022 QoL: added mouse options to menu
|
||||
const KFID_ViewAccelerationEnabled=184; // Halloweeen 2022 QoL: added mouse options to menu
|
||||
const KFID_SavedAllowSeasonalSkinsIndex=185;
|
||||
const KFID_SavedAllowSeasonalSkinsIndex=185;
|
||||
const KFID_SurvivalStartingSecondaryWeapIdx=186; // Halloween 2023 : added HRG 93R Pistol to Survivalist secondary weapons
|
||||
const KFID_KilledHansVolterInMaps=187; // Halloween 2023 : Seasonal Kill Hans on Different Maps
|
||||
const KFID_SavedWeeklySelectorIndex=188; // Halloween 2023 QoL: Weekly selector
|
@ -1698,11 +1698,12 @@ function DoFleeFrom( actor FleeFrom,
|
||||
optional float FleeDuration,
|
||||
optional float FleeDistance,
|
||||
optional bool bShouldStopAtGoal=false,
|
||||
optional bool bFromFear=false )
|
||||
optional bool bFromFear=false,
|
||||
optional bool bUseRandomDirection=false )
|
||||
{
|
||||
if( !bFromFear || !MyPatPawn.bInFleeAndHealMode )
|
||||
{
|
||||
super.DoFleeFrom( FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bFromFear );
|
||||
super.DoFleeFrom( FleeFrom, FleeDuration, FleeDistance, bShouldStopAtGoal, bFromFear, bUseRandomDirection );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -19,6 +19,7 @@ var private bool bFound;
|
||||
protected event TriggerDestroyedEvent( Controller EventInstigator )
|
||||
{
|
||||
local KFMapInfo KFMI;
|
||||
local KFPlayerController KFPC;
|
||||
|
||||
super.TriggerDestroyedEvent( EventInstigator );
|
||||
|
||||
@ -27,6 +28,12 @@ protected event TriggerDestroyedEvent( Controller EventInstigator )
|
||||
{
|
||||
bFound = true;
|
||||
KFMI.OnCollectibleFound( self, EventInstigator );
|
||||
|
||||
KFPC = KFPlayerController(EventInstigator);
|
||||
If (KFPC != none)
|
||||
{
|
||||
KFPC.AddCollectibleFound(KFMI.CollectiblesToFind);
|
||||
}
|
||||
}
|
||||
|
||||
// Used on network to tell clients who join late that this collectible is destroyed
|
||||
|
@ -30,36 +30,6 @@ static simulated function bool CanDismemberHitZone( name InHitZoneName )
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
|
||||
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
|
||||
{
|
||||
local class<KFDamageType> ToxicDT;
|
||||
|
||||
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
|
||||
if ( ToxicDT != None )
|
||||
{
|
||||
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows medic perk to add poison damage
|
||||
* @return: None if toxic skill is not available
|
||||
*/
|
||||
static function class<KFDamageType> GetMedicToxicDmgType( out int out_Damage, optional Controller InstigatedBy )
|
||||
{
|
||||
local KFPerk InstigatorPerk;
|
||||
|
||||
InstigatorPerk = KFPlayerController(InstigatedBy).GetPerk();
|
||||
if( InstigatorPerk == none || (!InstigatorPerk.IsToxicDmgActive() && !InstigatorPerk.IsZedativeActive()) )
|
||||
{
|
||||
return None;
|
||||
}
|
||||
|
||||
InstigatorPerk.ModifyToxicDmg( out_Damage );
|
||||
return InstigatorPerk.GetToxicDmgTypeClass();
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
KDamageImpulse=1000
|
||||
|
@ -40,18 +40,6 @@ static simulated function bool CanDismemberHitZone( name InHitZoneName )
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
|
||||
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
|
||||
{
|
||||
local class<KFDamageType> ToxicDT;
|
||||
|
||||
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
|
||||
if ( ToxicDT != None )
|
||||
{
|
||||
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
GoreDamageGroup=DGT_Shotgun
|
||||
|
25
KFGameContent/Classes/KFDT_Ballistic_HRG_93R.uc
Normal file
25
KFGameContent/Classes/KFDT_Ballistic_HRG_93R.uc
Normal 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'
|
||||
}
|
@ -89,17 +89,6 @@ static function PlayImpactHitEffects(KFPawn P, vector HitLocation, vector HitDir
|
||||
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
|
||||
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
|
||||
{
|
||||
local class<KFDamageType> ToxicDT;
|
||||
local int ToxicDamageTaken;
|
||||
|
||||
ToxicDamageTaken = DamageTaken;
|
||||
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( ToxicDamageTaken, InstigatedBy );
|
||||
if ( ToxicDT != None )
|
||||
{
|
||||
Victim.ApplyDamageOverTime(ToxicDamageTaken, InstigatedBy, ToxicDT);
|
||||
}
|
||||
|
||||
// potential for two DoTs if DoT_Type is set
|
||||
if (default.BleedDamageType.default.DoT_Type != DOT_None)
|
||||
{
|
||||
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, default.BleedDamageType);
|
||||
|
26
KFGameContent/Classes/KFDT_Ballistic_MG3.uc
Normal file
26
KFGameContent/Classes/KFDT_Ballistic_MG3.uc
Normal 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'
|
||||
}
|
26
KFGameContent/Classes/KFDT_Ballistic_MG3_Alt.uc
Normal file
26
KFGameContent/Classes/KFDT_Ballistic_MG3_Alt.uc
Normal 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'
|
||||
}
|
@ -11,18 +11,6 @@ class KFDT_Ballistic_MedicRifleGrenadeLauncher extends KFDT_Ballistic_AssaultRif
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
|
||||
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
|
||||
{
|
||||
local class<KFDamageType> ToxicDT;
|
||||
|
||||
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
|
||||
if ( ToxicDT != None )
|
||||
{
|
||||
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
KDamageImpulse=900
|
||||
@ -32,7 +20,6 @@ defaultproperties
|
||||
StumblePower=10
|
||||
GunHitPower=45
|
||||
|
||||
|
||||
WeaponDef=class'KFWeapDef_MedicRifleGrenadeLauncher'
|
||||
|
||||
//Perk
|
||||
|
@ -28,18 +28,6 @@ static simulated function bool CanDismemberHitZone( name InHitZoneName )
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
|
||||
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
|
||||
{
|
||||
local class<KFDamageType> ToxicDT;
|
||||
|
||||
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
|
||||
if ( ToxicDT != None )
|
||||
{
|
||||
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
KDamageImpulse=2000
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user