1
0
This commit is contained in:
GenZmeY 2022-05-11 18:13:25 +03:00
parent 47731ae0b8
commit df19937a54
166 changed files with 9244 additions and 390 deletions

View File

@ -1052,12 +1052,12 @@ function ReceiveProjectileWarning(Projectile Proj);
* =====================================================
*/
exec function SwitchToBestWeapon(optional bool bForceNewWeapon)
exec function SwitchToBestWeapon(optional bool bForceNewWeapon, optional bool check_9mm_logic = false)
{
if ( Pawn == None || Pawn.InvManager == None )
return;
Pawn.InvManager.SwitchToBestWeapon(bForceNewWeapon);
Pawn.InvManager.SwitchToBestWeapon(bForceNewWeapon, check_9mm_logic);
}
/* epic ===============================================
@ -1070,7 +1070,11 @@ exec function SwitchToBestWeapon(optional bool bForceNewWeapon)
*/
reliable client function ClientSwitchToBestWeapon(optional bool bForceNewWeapon)
{
SwitchToBestWeapon(bForceNewWeapon);
local bool check_9mm_logic;
check_9mm_logic = true;
SwitchToBestWeapon(bForceNewWeapon, check_9mm_logic);
}
/* epic ===============================================

View File

@ -386,7 +386,7 @@ simulated function float GetWeaponRatingFor( Weapon W )
/**
* returns the best weapon for this Pawn in loadout
*/
simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon )
simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon, optional bool allow9mm )
{
local Weapon W, BestWeapon;
local float Rating, BestRating;
@ -419,7 +419,7 @@ simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon )
* Switch to best weapon available in loadout
* Network: LocalPlayer
*/
simulated function SwitchToBestWeapon( optional bool bForceADifferentWeapon )
simulated function SwitchToBestWeapon( optional bool bForceADifferentWeapon, optional bool check_9mm_logic = false )
{
local Weapon BestWeapon;

View File

@ -1385,11 +1385,13 @@ simulated final native function ShowMaterialSection(int MaterialID, bool bShow,
* @param StartTime (optional) What time to start the animation at
* @param bPlayBackwards (optional) Play this animation backwards
*/
function PlayAnim(name AnimName, optional float Duration, optional bool bLoop, optional bool bRestartIfAlreadyPlaying = true, optional float StartTime=0.0f, optional bool bPlayBackwards=false)
function bool PlayAnim(name AnimName, optional float Duration, optional bool bLoop, optional bool bRestartIfAlreadyPlaying = true, optional float StartTime=0.0f, optional bool bPlayBackwards=false)
{
local AnimNodeSequence AnimNode;
local float DesiredRate;
local bool bIsAnimPlayed;
bIsAnimPlayed = false;
AnimNode = AnimNodeSequence(Animations);
if (AnimNode == None && Animations.IsA('AnimTree'))
{
@ -1408,6 +1410,8 @@ function PlayAnim(name AnimName, optional float Duration, optional bool bLoop, o
if (bRestartIfAlreadyPlaying || !AnimNode.bPlaying)
{
AnimNode.PlayAnim(bLoop, DesiredRate, StartTime);
bIsAnimPlayed = true;
}
else
{
@ -1423,9 +1427,13 @@ function PlayAnim(name AnimName, optional float Duration, optional bool bLoop, o
DesiredRate = (Duration > 0.0) ? (AnimNode.AnimSeq.SequenceLength / (Duration * AnimNode.AnimSeq.RateScale)) : 1.0;
DesiredRate = (bPlayBackwards) ? -DesiredRate : DesiredRate;
AnimNode.PlayAnim(bLoop, DesiredRate, StartTime);
bIsAnimPlayed = true;
}
}
}
return bIsAnimPlayed;
}
/** simple generic case animation stopper

View File

@ -42,7 +42,8 @@ struct AARAward
var array<AARAward> TeamAwardList;
enum ETeamAwards
{
{
ETA_WeaponMaster,
ETA_ZedStomper,
ETA_MedicineMaster,
ETA_ZedSlayer,
@ -1103,6 +1104,9 @@ static function GetTeamAward(ETeamAwards AwardIndex, out AARAward TempAwardObjec
case ETA_ZedStomper:
Give_ZedStomper(TempAwardObject, KFPCArray);
break;
case ETA_WeaponMaster:
GiveWeaponMaster(TempAwardObject, KFPCArray);
break;
}
}
@ -1416,6 +1420,27 @@ static function Give_ZedStomper(out AARAward outAward, const out Array<KFPlayerC
}
}
static function GiveWeaponMaster(out AARAward outAward, const out Array<KFPlayerController> KFPCArray)
{
local int i;
local KFPlayerController_WeeklySurvival KFPC_WS;
for(i = 0; i < KFPCArray.Length; i++)
{
KFPC_WS = KFPlayerController_WeeklySurvival(KFPCArray[i]);
if (KFPC_WS != none)
{
if (KFPC_WS.GunGameData.GiveWeaponMaster)
{
outAward.PRI = KFPCArray[i].PlayerReplicationInfo;
outAward.DisplayValue = 1;
`log(KFPCArray[i].PlayerReplicationInfo.PlayerName @"Weapon Master", class'EphemeralMatchStats'.default.bShowMatchStatsLogging);
return;
}
}
}
}
function ReceiveAwardInfo(byte AwardID, PlayerReplicationInfo PRI, int Value)
{
TeamAwardList[AwardID].PRI = PRI;
@ -1435,6 +1460,7 @@ DefaultProperties
TeamAwardList(ETA_HeadPopper)=(TitleIdentifier="HeadPopper",ValueIdentifier="HeadPopperValue",IconPath="UI_Award_Team.UI_Award_Team-Headshots")
TeamAwardList(ETA_Dominator)=(TitleIdentifier="Dominator",ValueIdentifier="DominatorValue",IconPath="UI_Award_Team.UI_Award_Team-BossKO")
TeamAwardList(ETA_ZedStomper)=(TitleIdentifier="ZedStomper",ValueIdentifier="ZedStomperValue",IconPath="UI_Award_Team.UI_Award_Team-ZedStomper")
TeamAwardList(ETA_WeaponMaster)=(TitleIdentifier="WeaponMaster",ValueIdentifier="WeaponMasterValue",IconPath="UI_Award_Team.UI_Award_Team_GunMode")
//zed awards
TeamAwardList(ETA_Carnage)=(TitleIdentifier="Carnage",ValueIdentifier="CarnageValue",IconPath="ui_award_zeds.UI_Award_ZED_RawDmg")
TeamAwardList(ETA_Closer)=(TitleIdentifier="Closer",ValueIdentifier="CloserValue",IconPath="ui_award_zeds.UI_Award_ZED_Kills")

View File

@ -25,7 +25,7 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
}
/** */
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
if ( !bIsActive )
{

View File

@ -57,7 +57,7 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
}
/** */
function Accrue(float InPower)
function Accrue(float InPower, optional class<KFDamageType> DamageType = none)
{
// total immunity during cooldown
if ( LastActivationTime > 0 && `TimeSinceEx(PawnOwner, LastActivationTime) < Cooldown )
@ -80,14 +80,14 @@ function Accrue(float InPower)
CurrentStrength = fClamp(CurrentStrength + InPower, InPower, INCAP_THRESHOLD);
if ( CurrentStrength >= INCAP_THRESHOLD )
{
Activate();
Activate(DamageType);
}
`log(Class.Name@"Added="$InPower@"NewStrength="$CurrentStrength, bDebug);
}
/** */
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
if ( SpecialMove != SM_None )
{
@ -159,6 +159,11 @@ function float GetAttackSpeedModifier()
return 1.f;
}
function float GetDamageTakenModifier()
{
return 0.f;
}
defaultproperties
{
//bDebug=true

View File

@ -83,6 +83,8 @@ enum EAfflictionType
AF_Freeze,
AF_Microwave,
AF_Bleed,
AF_BigHead,
AF_Shrink,
AF_Custom1,
AF_Custom2,
@ -258,7 +260,7 @@ protected function ProcessSpecialMoveAfflictions(KFPerk InstigatorPerk, vector H
// increment affliction power
if (KnockdownPower > 0 && CanDoSpecialmove(SM_Knockdown))
{
AccrueAffliction(AF_Knockdown, KnockdownPower, BodyPart, InstigatorPerk);
AccrueAffliction(AF_Knockdown, KnockdownPower, BodyPart, InstigatorPerk, DamageType);
}
if (StunPower > 0 && CanDoSpecialmove(SM_Stunned))
{
@ -342,26 +344,32 @@ protected function ProcessHitReactionAfflictions(KFPerk InstigatorPerk, class<KF
protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KFDamageType> DamageType, Actor DamageCauser)
{
local KFWeapon DamageWeapon;
local float BurnPower, EMPPower, PoisonPower, MicrowavePower, BleedPower;
local float BurnPower, EMPPower, PoisonPower, MicrowavePower, BleedPower, BigHeadPower, ShrinkPower;
local KFInterface_DamageCauser KFDmgCauser;
// Get upgraded affliction power
DamageWeapon = class'KFPerk'.static.GetWeaponFromDamageCauser(DamageCauser);
if (DamageWeapon != none)
{
BurnPower = DamageWeapon.GetUpgradedAfflictionPower(AF_FirePanic, DamageType.default.BurnPower);
EMPPower = DamageWeapon.GetUpgradedAfflictionPower(AF_EMP, DamageType.default.EMPPower);
PoisonPower = DamageWeapon.GetUpgradedAfflictionPower(AF_Poison, DamageType.default.PoisonPower);
BurnPower = DamageWeapon.GetUpgradedAfflictionPower(AF_FirePanic, DamageType.default.BurnPower);
EMPPower = DamageWeapon.GetUpgradedAfflictionPower(AF_EMP, DamageType.default.EMPPower);
PoisonPower = DamageWeapon.GetUpgradedAfflictionPower(AF_Poison, DamageType.default.PoisonPower);
MicrowavePower = DamageWeapon.GetUpgradedAfflictionPower(AF_Microwave, DamageType.default.MicrowavePower);
BleedPower = DamageWeapon.GetUpgradedAfflictionPower(AF_Bleed, DamageType.default.BleedPower);
BleedPower = DamageWeapon.GetUpgradedAfflictionPower(AF_Bleed, DamageType.default.BleedPower);
ShrinkPower = DamageWeapon.GetUpgradedAfflictionPower(AF_Shrink, DamageType.default.ShrinkPower);
// No modifiers applied to Big Heads
BigHeadPower = DamageType.default.BigHeadPower;
}
else
{
BurnPower = DamageType.default.BurnPower;
EMPPower = DamageType.default.EMPPower;
PoisonPower = DamageType.default.PoisonPower;
BurnPower = DamageType.default.BurnPower;
EMPPower = DamageType.default.EMPPower;
PoisonPower = DamageType.default.PoisonPower;
MicrowavePower = DamageType.default.MicrowavePower;
BleedPower = DamageType.default.BleedPower;
BleedPower = DamageType.default.BleedPower;
BigHeadPower = DamageType.default.BigHeadPower;
ShrinkPower = DamageType.default.ShrinkPower;
}
KFDmgCauser = KFInterface_DamageCauser(DamageCauser);
@ -397,7 +405,7 @@ protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KF
if (BurnPower > 0)
{
AccrueAffliction(AF_FirePanic, BurnPower);
AccrueAffliction(AF_FirePanic, BurnPower, , InstigatorPerk, DamageType);
}
if (PoisonPower > 0 || DamageType.static.AlwaysPoisons())
{
@ -411,6 +419,14 @@ protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KF
{
AccrueAffliction(AF_Bleed, BleedPower);
}
if (BigHeadPower > 0)
{
AccrueAffliction(AF_BigHead, BigHeadPower);
}
if (ShrinkPower > 0)
{
AccrueAffliction(AF_Shrink, ShrinkPower,,InstigatorPerk);
}
}
}
@ -422,7 +438,7 @@ protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KF
* Adds StackedPower
* @return true if the affliction effect should be applied
*/
function AccrueAffliction(EAfflictionType Type, float InPower, optional EHitZoneBodyPart BodyPart, optional KFPerk InstigatorPerk)
function AccrueAffliction(EAfflictionType Type, float InPower, optional EHitZoneBodyPart BodyPart, optional KFPerk InstigatorPerk, optional class<KFDamageType> DamageType = none)
{
if ( InPower <= 0 || Type >= IncapSettings.Length )
{
@ -453,7 +469,7 @@ function AccrueAffliction(EAfflictionType Type, float InPower, optional EHitZone
if ( InPower > 0 )
{
Afflictions[Type].Accrue(InPower);
Afflictions[Type].Accrue(InPower, DamageType);
}
}
@ -626,6 +642,11 @@ function float GetAfflictionDamageModifier()
{
if (Afflictions[i] != none)
{
if (i == AF_BigHead)
{
continue;
}
DamageModifier += Afflictions[i].GetDamageModifier();
}
}
@ -633,6 +654,23 @@ function float GetAfflictionDamageModifier()
return DamageModifier;
}
function float GetAfflictionDamageTakenModifier()
{
local float DamageModifier;
local int i;
DamageModifier = 1.f;
for (i = 0; i < Afflictions.Length; ++i)
{
if (Afflictions[i] != none)
{
DamageModifier += Afflictions[i].GetDamageTakenModifier();
}
}
return DamageModifier;
}
/** Accessor to get known affliction speed modifier - Multiplicative from all mods */
function float GetAfflictionSpeedModifier()
{
@ -668,6 +706,25 @@ function float GetAfflictionAttackSpeedModifier()
return SpeedModifier;
}
function float GetBigHeadAfflictionDamageModifier()
{
local float DamageModifier;
DamageModifier = 0.f;
if (Afflictions.Length > AF_BigHead)
{
if (Afflictions[AF_BigHead] != none)
{
DamageModifier = Afflictions[AF_BigHead].GetDamageModifier();
}
}
return DamageModifier;
}
/** Turns off all affliction sounds / effects */
simulated function Shutdown()
{
@ -745,4 +802,6 @@ defaultproperties
AfflictionClasses(AF_Knockdown)=class'KFAffliction_Knockdown'
AfflictionClasses(AF_Snare)=class'KFAffliction_Snare'
AfflictionClasses(AF_Bleed)=class'KFAffliction_Bleed'
AfflictionClasses(AF_BigHead)=class'KFAffliction_BigHead'
AfflictionClasses(AF_Shrink)=class'KFAffliction_Shrink'
}

View File

@ -0,0 +1,136 @@
//=============================================================================
// KFAffliction_BigHead
//=============================================================================
// Affliction for cranial popper
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFAffliction_BigHead extends KFAfflictionAdvanced;
var() float EffectAppliedByStack;
var() float ApplyEffectVel;
var() float RemoveEffectVel;
var() array<float> StackDamageExplosion;
var() byte MaxStack;
var() byte MaxStackBobbleHead;
var transient byte CurrentStack;
var transient float CurrentEffectApplied;
var transient bool bIsBobbleHeadMode;
var transient bool bIsShrunkenHeads;
var transient byte CurrentMaxStack;
function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
{
local KFGameReplicationInfo KFGRI;
local int EndlessWeeklyWaveIdx;
Super.Init(P, Type, InstigatorPerk);
KFGRI = KFGameReplicationInfo(P.WorldInfo.GRI);
if (KFGRI != none)
{
bIsBobbleHeadMode = (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 3) || (KFGRI.IsWeeklyWave(EndlessWeeklyWaveIdx) && EndlessWeeklyWaveIdx == 3);
bIsShrunkenHeads = KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 15;
if (bIsBobbleHeadMode)
{
MaxStack = MaxStackBobbleHead;
}
}
CurrentMaxStack = bIsBobbleHeadMode ? MaxStackBobbleHead : MaxStack;
}
function Activate(optional class<KFDamageType> DamageType = none)
{
if (CurrentStack < CurrentMaxStack)
{
Super.Activate();
if (!bIsBobbleHeadMode && !bIsShrunkenHeads)
{
++CurrentStack;
}
}
}
event Tick(float DeltaTime)
{
local float Target;
if ( PawnOwner.bPlayedDeath )
{
CurrentStrength= 0.0f;
super.Deactivate();
return;
}
if (bIsBobbleHeadMode || bIsShrunkenHeads)
{
return;
}
Target = CurrentStack * EffectAppliedByStack;
if (CurrentEffectApplied != Target)
{
if (CurrentEffectApplied < Target)
{
CurrentEffectApplied = FMin(CurrentEffectApplied + DeltaTime * ApplyEffectVel, Target);
}
else
{
CurrentEffectApplied = FMax(CurrentEffectApplied - DeltaTime * ApplyEffectVel, 0.0f);
}
PawnOwner.IntendedHeadScale = 1 + CurrentEffectApplied;
PawnOwner.SetHeadScale(1 + CurrentEffectApplied, PawnOwner.CurrentHeadScale);
PawnOwner.bNetDirty = true;
}
if (CurrentStrength <= 0.0f)
{
CurrentStack = 0;
CurrentStrength = 0.1f;
if (CurrentEffectApplied <= 0.0f)
{
CurrentStrength = 0.0f;
super.Deactivate();
}
}
}
/** Accessor to get known affliction Damage modifier */
function float GetDamageModifier()
{
local float damage;
damage = bIsBobbleHeadMode ? StackDamageExplosion[MaxStackBobbleHead] : StackDamageExplosion[CurrentStack];
CurrentStack = 0;
return damage;
}
defaultproperties
{
DissipationRate=10
bNeedsTick=true
MaxStack=3
MaxStackBobbleHead=1
EffectAppliedByStack=0.3f
ApplyEffectVel= 1.0f // % per second
RemoveEffectVel= 1.0f // % per second
CurrentStack=0
CurrentEffectApplied=0.0f
StackDamageExplosion={(0.0f, 150.0f, 300.0f, 500.0f, 0, 0)};
}

View File

@ -115,7 +115,7 @@ function float GetAttackSpeedModifier()
return 1.f;
}
function Accrue(float InPower)
function Accrue(float InPower, optional class<KFDamageType> DamageType = none)
{
super.Accrue(InPower);
if (PawnOwner != none)

View File

@ -25,7 +25,7 @@ var protected AkEvent OnEMPSound;
/** Sound to play when this pawn stops being EMP'd */
var protected AkEvent OnEMPEndSound;
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
Super.Activate();
SetEMPPanicked(true);

View File

@ -20,7 +20,7 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
DisruptCooldown = P.IncapSettings[Type].ChildAfflictionCooldown;
}
function Accrue(float InPower)
function Accrue(float InPower, optional class<KFDamageType> DamageType = none)
{
Super.Accrue(InPower);

View File

@ -28,6 +28,8 @@ var protected AkEvent OnFireSound;
/** Sound to play when this pawn stops being on fire */
var protected AkEvent OnFireEndSound;
var transient KFPlayerController Instigator;
function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
{
Super.Init(P, Type, InstigatorPerk);
@ -35,9 +37,14 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
// copy over some settings from the affliction handler that we'll need
FireFullyCharredDuration = P.AfflictionHandler.FireFullyCharredDuration;
FireCharPercentThreshhold = P.AfflictionHandler.FireCharPercentThreshhold;
if (InstigatorPerk != none)
{
Instigator = InstigatorPerk.OwnerPC;
}
}
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
// fire can accrue after death, but cannot trigger panic
if ( !PawnOwner.bPlayedDeath )

View File

@ -9,7 +9,7 @@
class KFAffliction_HeavyRecovery extends KFAfflictionBase;
/** */
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
// Attempt to interrupt the special move
if( PawnOwner.SpecialMove != SM_None )

View File

@ -9,9 +9,9 @@
class KFAffliction_Knockdown extends KFAfflictionBase;
/** */
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
ActivateKnockdown(PawnOwner.HitFxInfo.DamageType,
ActivateKnockdown(DamageType,
PawnOwner.HitFxInfo.HitLocation,
PawnOwner.DecodeUnitVector( PawnOwner.HitFxInfo.EncodedHitDirection ),
PawnOwner.HitFxInfo.HitBoneIndex);

View File

@ -9,7 +9,7 @@
class KFAffliction_MediumRecovery extends KFAfflictionBase;
/** */
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
// Attempt to interrupt the special move
if( PawnOwner.SpecialMove != SM_None )

View File

@ -30,7 +30,7 @@ var protected AkEvent OnSteamSound;
/** Sound to play when this pawn stops being on fire */
var protected AkEvent OnSteamEndSound;
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
Super.Activate();
SetMicrowavePanicked(true);

View File

@ -8,7 +8,7 @@
//=============================================================================
class KFAffliction_Poison extends KFAfflictionAdvanced;
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
Super.Activate();
SetPoisoned(true);

View File

@ -0,0 +1,182 @@
//=============================================================================
// KFAffliction_Shrink
//=============================================================================
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFAffliction_Shrink extends KFAfflictionAdvanced;
var() float ScaleOnMaxEffect;
var() float EffectAppliedByStack;
var() float MaxEffectDamageValue;
var() float ApplyEffectVel;
var() float RemoveEffectVel;
var() float StackDamageModifier;
var() byte MaxEffect;
var transient float CurrentEffect;
var transient float CurrentEffectApplied;
var transient KFPlayerController Instigator;
var transient bool bIsTinyTerrorMode;
var transient bool AlreadyCached;
var transient float CachedBodyScaleChangePerSecond;
var transient float CachedBodyScale;
function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
{
local KFGameReplicationInfo KFGRI;
Super.Init(P, Type, InstigatorPerk);
if (InstigatorPerk != none)
{
Instigator = InstigatorPerk.OwnerPC;
}
if (AlreadyCached == false)
{
// (see KFPawn_ZedMatriarch.uc)
// There are some systems directly calling Init again without letting the Affliction Manager know
// That is a hack, but we can't improve it at this stage, so catch that here only once
AlreadyCached = true;
CachedBodyScaleChangePerSecond = P.BodyScaleChangePerSecond;
CachedBodyScale = P.Mesh.Scale;
}
KFGRI = KFGameReplicationInfo(P.WorldInfo.GRI);
if (KFGRI != none && KFGRI.bIsWeeklyMode)
{
bIsTinyTerrorMode = KFGRI.CurrentWeeklyIndex == 2;
}
}
function Activate(optional class<KFDamageType> DamageType = none)
{
local float StackModifier;
if (bIsTinyTerrorMode)
{
return;
}
if (CurrentEffect < MaxEffect)
{
Super.Activate();
StackModifier = 1.0f;
if (KFPawn_Monster(PawnOwner) != none)
{
StackModifier = KFPawn_Monster(PawnOwner).ShrinkEffectModifier;
}
// Allow body to shrink visually faster
if (StackModifier >= 1.0f)
{
PawnOwner.BodyScaleChangePerSecond = CachedBodyScaleChangePerSecond * StackModifier;
PawnOwner.bNetDirty = true;
}
CurrentEffect += EffectAppliedByStack * StackModifier;
}
if (CurrentEffectApplied >= MaxEffect)
{
CurrentEffectApplied = MaxEffect;
KillOwner();
}
}
event Tick(float DeltaTime)
{
if ( PawnOwner.bPlayedDeath )
{
CurrentStrength= 0.0f;
super.Deactivate();
return;
}
if (CurrentEffectApplied != CurrentEffect)
{
if (CurrentEffectApplied < CurrentEffect)
{
CurrentEffectApplied = FMin(CurrentEffectApplied + DeltaTime * ApplyEffectVel * KFPawn_Monster(PawnOwner).ShrinkEffectModifier, CurrentEffect);
}
else
{
CurrentEffectApplied = CurrentEffectApplied - DeltaTime * RemoveEffectVel;
}
CurrentEffectApplied = FMax(CurrentEffectApplied, 0.f);
CurrentEffectApplied = FMin(CurrentEffectApplied, MaxEffect);
// It goes from the Cached Body Scale to CachedBodyScale - 0.5 at 100% affliction
PawnOwner.IntendedBodyScale = CachedBodyScale - ((CurrentEffectApplied/MaxEffect) * (1.0f - ScaleOnMaxEffect));
}
if (CurrentStrength <= 0.0f)
{
CurrentEffect = 0;
CurrentStrength = 0.1f;
if (CurrentEffectApplied <= 0.0f)
{
CurrentStrength = 0.0f;
PawnOwner.BodyScaleChangePerSecond = CachedBodyScaleChangePerSecond;
PawnOwner.bNetDirty = true;
super.Deactivate();
}
}
}
function float GetDamageTakenModifier()
{
return MaxEffectDamageValue * (CurrentEffect/MaxEffect);
}
function KillOwner()
{
local KFPawn_Monster KFPM;
KFPM = KFPawn_Monster(PawnOwner);
if (KFPM == none)
{
return;
}
KFPM.BodyScaleChangePerSecond = CachedBodyScaleChangePerSecond;
KFPM.bNetDirty = true;
if (!KFPM.bCanBeKilledByShrinking)
{
return;
}
KFPM.bUseExplosiveDeath = true;
KFPM.TakeDamage(9999, Instigator, KFPM.Location, vect(0,0,0), class'KFDT_ShrinkDeath',, Instigator.Pawn.Weapon);
}
defaultproperties
{
DissipationRate=10 //20
bNeedsTick=true
MaxEffect=10.f;
ScaleOnMaxEffect=0.5f
EffectAppliedByStack=1.0f
ApplyEffectVel=100.0f // % per second
RemoveEffectVel=0.25f // % per second
CurrentEffect=0.0f
CurrentEffectApplied=0.0f
MaxEffectDamageValue=1.0f
AlreadyCached = false
}

View File

@ -24,7 +24,7 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
}
/** */
function Activate()
function Activate(optional class<KFDamageType> DamageType = none)
{
if( !bIsActive )
{

View File

@ -386,7 +386,6 @@ function PurchaseWeapon(STraderItem ShopItem)
Price = GetAdjustedBuyPriceFor(ShopItem);
// XMAS 2021 Seasonal Objective
KFPC = Outer;
`Log("ADDING WEAPON PURCHASED");
KFPC.AddWeaponPurchased(ShopItem.WeaponDef, Price);
//

View File

@ -871,7 +871,7 @@ private function SetAttachmentMeshAndSkin(
CharAttachmentSocketName, KFP.ArmsMesh, KFP, true);
KFGRI = KFGameReplicationInfo(KFP.WorldInfo.GRI);
if (AttachmentSlotIndex == 2 && KFP != none && KFGRI.bIsWeeklyMode && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
if (AttachmentSlotIndex == 2 && KFP != none && KFGRI.bIsWeeklyMode && (KFGRI.CurrentWeeklyIndex == 12))
{
SetWeeklyCowboyAttachmentSkinMaterial(
AttachmentSlotIndex,
@ -917,7 +917,7 @@ private function SetAttachmentMeshAndSkin(
CharAttachmentSocketName, KFP.Mesh, KFP, false);
KFGRI = KFGameReplicationInfo(KFP.WorldInfo.GRI);
if (AttachmentSlotIndex == 2 && KFP != none && KFGRI.bIsWeeklyMode && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
if (AttachmentSlotIndex == 2 && KFP != none && KFGRI.bIsWeeklyMode && (KFGRI.CurrentWeeklyIndex == 12))
{
SetWeeklyCowboyAttachmentSkinMaterial(
AttachmentSlotIndex,

View File

@ -273,7 +273,7 @@ simulated function SetCharacterMeshFromArch( KFPawn KFP, optional KFPlayerReplic
}
}
if (KFP != none && KFGRI.bIsWeeklyMode && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
if (KFP != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12)
{
NewAttachment.StaticAttachment = StaticMesh(DynamicLoadObject(ZEDCowboyHatMeshPath, class'StaticMesh'));
NewAttachment.AttachSocketName = KFPawn_Monster(KFP).ZEDCowboyHatAttachName;

View File

@ -18,6 +18,9 @@ var localized string FailedToReachInventoryServerString;
var localized array<string> DifficultyStrings;
var localized array<string> LengthStrings;
var localized string SpecialLengthString;
var localized string WeaponLevelString;
var localized string GunPointsString;
var localized array<string> ServerTypeStrings;
var localized array<string> PermissionStrings;
var localized array<string> ConsolePermissionStrings;

View File

@ -0,0 +1,27 @@
//=============================================================================
// KFDT_ShrinkDeath
//=============================================================================
// damage applied for killind zeds by shrinking them
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFDT_ShrinkDeath extends KFDamageType;
defaultproperties
{
RadialDamageImpulse = 1000.f // This controls how much impulse is applied to gibs when exploding
bUseHitLocationForGibImpulses = true // This will make the impulse origin where the victim was hit for directional gibs
bPointImpulseTowardsOrigin = true // This creates an impulse direction aligned along hitlocation and pawn location -- this will push all gibs in the same direction
ImpulseOriginScale = 100.f // Higher means more directional gibbing, lower means more outward (and upward) gibbing
ImpulseOriginLift = 150.f
MaxObliterationGibs = 12 // Maximum number of gibs that can be spawned by obliteration, 0=MAX
bCanGib = true
bCanObliterate = true
ObliterationHealthThreshold = 0
ObliterationDamageThreshold = 1
bIgnoreAggroOnDamage=true
WeaponDef = class'KFWeapDef_ShrinkRayGun'
}

View File

@ -91,7 +91,8 @@ var float MicrowavePower;
var float FreezePower;
var float SnarePower;
var float BleedPower;
var float BigHeadPower;
var float ShrinkPower;
/*********************************************************************************************
Impact Effects
********************************************************************************************* */

View File

@ -36,6 +36,8 @@ var bool bUsesSecondaryAmmo;
var bool bUsesGrenadesAsSecondaryAmmo;
var bool bUsesSecondaryAmmoAltHUD;
var transient bool bLastDoshVisibility;
var class<KFPerk> LastPerkClass;
var KFWeapon LastWeapon;
@ -45,6 +47,8 @@ var ASColorTransform DefaultColor;
var ASColorTransform RedColor;
var name OldState;
var transient byte LastGrenadeIndex;
function InitializeHUD()
{
MyKFPC = KFPlayerController(GetPC());
@ -87,6 +91,20 @@ function UpdateDosh()
{
local int CurrentDosh;
local int DeltaDosh;
local bool bCanUseDosh;
bCanUseDosh = MyKFPC.CanUseDosh();
if (bCanUseDosh != bLastDoshVisibility)
{
UpdateDoshVisibility(bCanUseDosh);
bLastDoshVisibility = bCanUseDosh;
}
if (!bCanUseDosh)
{
return;
}
if (MyKFPC.PlayerReplicationInfo != none)
{
@ -99,6 +117,18 @@ function UpdateDosh()
SetInt("backpackDosh" ,DeltaDosh);
LastDosh = CurrentDosh;
}
}
}
function UpdateDoshVisibility(bool visible)
{
if (visible)
{
SetBool("DoshSetVisibility", true);
}
else
{
SetBool("DoshSetVisibility", false);
}
}
@ -125,7 +155,13 @@ function UpdateGrenades()
SetString("backpackGrenadeType", "img://" $ MyKFPC.CurrentPerk.GetGrenadeImagePath());
LastPerkClass = MyKFPC.CurrentPerk.Class;
LastSavedBuild = MyKFPC.CurrentPerk.GetSavedBuild();
}
LastGrenadeIndex = MyKFPC.CurrentPerk.GetGrenadeSelectedIndex();
}
else if (MyKFPC.CurrentPerk.GetGrenadeSelectedIndex() != LastGrenadeIndex)
{
SetString("backpackGrenadeType", "img://" $ MyKFPC.CurrentPerk.GetGrenadeImagePath());
LastGrenadeIndex = MyKFPC.CurrentPerk.GetGrenadeSelectedIndex();
}
}
// Update the grenades count value
if(CurrentGrenades != LastGrenades)
@ -328,4 +364,6 @@ DefaultProperties
{
LastMaxWeight=-1
LastWeight=-1
bLastDoshVisibility=true
LastGrenadeIndex=0
}

View File

@ -89,7 +89,19 @@ function UpdateWaveCount()
}
CurrentWaveNum = KFGRI.WaveNum;
if(KFGRI.IsBossWave())
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
{
if (KFGRI.bWaveGunGameIsFinal)
{
SetString("waveNumber", FinalString);
}
else
{
SetString("waveNumber", "" $ KFGRI.GunGameWavesCurrent);
}
}
else if(KFGRI.IsBossWave())
{
SetString("waveNumber", class'KFGFxHUD_WaveInfo'.default.BossWaveString);
}

View File

@ -71,7 +71,7 @@ function TickHud(float DeltaTime)
function UpdateWaveCount()
{
local int CurrentWaveMax,CurrentWave;
local int CurrentWaveMax, CurrentWave;
if( KFGRI == none )
{
@ -83,21 +83,46 @@ function UpdateWaveCount()
return;
}
// Max # of waves.
CurrentWaveMax = KFGRI.GetFinalWaveNum();
if(LastWaveMax != CurrentWaveMax)
{
SetInt("maxWaves" , KFGRI.default.bEndlessMode ? INDEX_NONE : CurrentWaveMax);
LastWaveMax = CurrentWaveMax;
}
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
{
CurrentWave = KFGRI.GunGameWavesCurrent;
CurrentWaveMax = KFGRI.GetFinalWaveNum();
// Current wave we're on.
CurrentWave = KFGRI.WaveNum;
if(CurrentWave != LastWave)
{
SetInt("currentWave" , CurrentWave);
if (KFGRI.bWaveGunGameIsFinal)
{
CurrentWave = CurrentWaveMax + 1;
}
else
{
CurrentWaveMax = -1;
}
Setint("maxGunGameWave" , CurrentWaveMax);
Setint("currentGunGameWave" , CurrentWave);
LastWaveMax = CurrentWaveMax;
LastWave = CurrentWave;
}
else
{
CurrentWave = KFGRI.WaveNum;
CurrentWaveMax = KFGRI.GetFinalWaveNum();
// Max # of waves.
if (LastWaveMax != CurrentWaveMax)
{
SetInt("maxWaves" , KFGRI.default.bEndlessMode ? INDEX_NONE : CurrentWaveMax);
LastWaveMax = CurrentWaveMax;
}
// Current wave we're on.
if (CurrentWave != LastWave)
{
SetInt("currentWave" , CurrentWave);
LastWave = CurrentWave;
}
}
}
function UpdateZEDCount()

View File

@ -306,6 +306,7 @@ function UpdateAttachmentsList(array<AttachmentVariants> Attachments)
local string AttachmentName;
local PlayerController PC;
local bool bIsWildWest;
local KFGameReplicationInfo KFGRI;
bIsWildWest = false;
ItemIndex = 0;
@ -322,7 +323,8 @@ function UpdateAttachmentsList(array<AttachmentVariants> Attachments)
ItemIndex++;
PC = GetPC();
bIsWildWest = (PC != none && Pc.WorldInfo.GRI.IsA('KFGameReplicationInfo_WeeklySurvival') && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12));
KFGRI = PC != none ? KFGameReplicationInfo(Pc.WorldInfo.GRI) : none;
bIsWildWest = (KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12);
for (i = 0; i < Attachments.length; i++)
{
@ -773,9 +775,14 @@ function ForceWeeklyCowboyHat()
{
local PlayerController PC;
local int CowboyHatIndex;
PC = GetPC();
local bool bIsWildWest;
local KFGameReplicationInfo KFGRI;
if (PC != none && Pc.WorldInfo.GRI.IsA('KFGameReplicationInfo_WeeklySurvival') && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
PC = GetPC();
KFGRI = PC != none ? KFGameReplicationInfo(Pc.WorldInfo.GRI) : none;
bIsWildWest = (KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12);
if (bIsWildWest)
{
CowboyHatIndex = FindCowboyHatAttachmentIndex(CurrentCharInfo);
if (CowboyHatIndex >= 0)

View File

@ -131,9 +131,22 @@ struct InventoryHelper
var int ItemDefinition;
var int ItemIndex;
var int ItemCount;
var ItemType Type;
var GFxObject GfxItemObject;
// For ordering in weapon skins
var int WeaponDef;
var int Price;
//var string FullName;
var int SkinType;
var ItemRarity Rarity;
var int Quality;
};
var array<InventoryHelper> SkinListWeaponsSearchCache;
var array<InventoryHelper> SkinListOrderedCache;
var bool NeedToRegenerateSkinList;
var EInventoryWeaponType_Filter CurrentWeaponTypeFilter;
var int CurrentPerkIndexFilter;
var ItemRarity CurrentRarityFilter;
@ -142,9 +155,14 @@ var EINventory_Filter CurrentInventoryFilter;
var ExchangeRuleSets RuleToExchange;
var private int CrcTable[256];
function InitializeMenu( KFGFxMoviePlayer_Manager InManager )
{
super.InitializeMenu( InManager );
CrcInit();
KFPC = KFPlayerController(GetPC());
CurrentPerkIndexFilter = KFPC.PerkList.length; //default value
@ -229,15 +247,95 @@ function OnClose()
}
}
final function CrcInit() {
const CrcPolynomial = 0xedb88320;
local int CrcValue;
local int IndexBit;
local int IndexEntry;
for (IndexEntry = 0; IndexEntry < 256; IndexEntry++) {
CrcValue = IndexEntry;
for (IndexBit = 8; IndexBit > 0; IndexBit--)
if ((CrcValue & 1) != 0)
CrcValue = (CrcValue >>> 1) ^ CrcPolynomial;
else
CrcValue = CrcValue >>> 1;
CrcTable[IndexEntry] = CrcValue;
}
}
final function int Crc(coerce string Text)
{
local int CrcValue;
local int IndexChar;
local int StrLen;
CrcValue = 0xffffffff;
StrLen = Len(Text);
for (IndexChar = 0; IndexChar < StrLen; IndexChar++)
CrcValue = (CrcValue >>> 8) ^ CrcTable[(Asc(Mid(Text, IndexChar, 1)) ^ CrcValue) & 0xff];
return CrcValue;
}
delegate int SortByWeaponTypeDefinition(InventoryHelper A, InventoryHelper B)
{
return A.WeaponDef < B.WeaponDef ? -1 : +1;
}
delegate int SortByPrice(InventoryHelper A, InventoryHelper B)
{
return A.Price > B.Price ? -1 : +1;
}
delegate int SortByRarity(InventoryHelper A, InventoryHelper B)
{
return A.Rarity > B.Rarity ? -1 : +1;
}
delegate int SortBySkinType(InventoryHelper A, InventoryHelper B)
{
return A.SkinType > B.SkinType ? -1 : +1;
}
delegate int SortByQuality(InventoryHelper A, InventoryHelper B)
{
return A.Quality < B.Quality ? -1 : +1;
}
delegate int SortByAll(InventoryHelper A, InventoryHelper B)
{
//local int WeapDefValue, SkinTypeValue;
/** Format: Compare lower ? -1 : (Compare upper) : 1 : (Equal case, repeat formula with the next sort condition) */
return A.Price > B.Price ? -1 : (A.Price < B.Price ? 1 : (
//STRCompare(A.WeaponDef, B.WeaponDef, WeapDefValue) < 0 ? -1 : ( WeapDefValue != 0 ? 1 : (
A.WeaponDef < B.WeaponDef ? -1 : (A.WeaponDef > B.WeaponDef ? 1 : (
A.Rarity > B.Rarity ? -1 : (A.Rarity < B.Rarity ? 1 : (
//STRCompare(A.SkinType, B.SkinType, SkinTypeValue) > 0 ? -1 : ( SkinTypeValue != 0 ? 1 : (
A.SkinType > B.SkinType ? -1 : (A.SkinType < B.SkinType ? 1 : (
A.Quality < B.Quality ? -1 : 1
))
))
))
));
}
function InitInventory()
{
local int i, ItemIndex, HelperIndex;
local int i, ItemIndex, HelperIndex, WeaponItemID, SearchWeaponSkinIndex;
local ItemProperties TempItemDetailsHolder;
local GFxObject ItemArray, ItemObject;
local bool bActiveItem;
local array<InventoryHelper> ActiveItems;
local array<InventoryHelper> ActiveItems, ValidSkinItems, FailedSkinItems;
local InventoryHelper HelperItem;
local array<ExchangeRuleSets> ExchangeRules;
local class<KFWeaponDefinition> WeaponDef;
local string SkinType;
local GFxObject PendingItem;
@ -249,6 +347,7 @@ function InitInventory()
SetObject("inventoryList", ItemArray);
return;
}
for (i = 0; i < OnlineSub.CurrentInventory.length; i++)
{
//look item up to get info on it.
@ -264,10 +363,62 @@ function InitInventory()
ItemObject = CreateObject("Object");
HelperIndex = ActiveItems.Find('ItemDefinition', onlineSub.CurrentInventory[i].Definition);
if(HelperIndex == INDEX_NONE)
if (HelperIndex == INDEX_NONE)
{
HelperItem.ItemDefinition = onlineSub.CurrentInventory[i].Definition;
HelperItem.ItemCount = onlineSub.CurrentInventory[i].Quantity;
HelperItem.ItemDefinition = onlineSub.CurrentInventory[i].Definition;
HelperItem.ItemCount = onlineSub.CurrentInventory[i].Quantity;
if (TempItemDetailsHolder.Type == ITP_WeaponSkin)
{
// Copy required stuff
//HelperItem.FullName = TempItemDetailsHolder.Name;
HelperItem.Rarity = TempItemDetailsHolder.Rarity;
HelperItem.Quality = TempItemDetailsHolder.Quality;
if (bool(OnlineSub.CurrentInventory[i].NewlyAdded))
{
NeedToRegenerateSkinList = true;
}
// Search on the cache, to speed up
WeaponItemID = SkinListWeaponsSearchCache.Find('ItemDefinition', HelperItem.ItemDefinition);
if (WeaponItemID != INDEX_NONE)
{
HelperItem.WeaponDef = SkinListWeaponsSearchCache[WeaponItemID].WeaponDef;
HelperItem.Price = SkinListWeaponsSearchCache[WeaponItemID].Price;
HelperItem.SkinType = SkinListWeaponsSearchCache[WeaponItemID].SkinType;
}
else
{
// Get right part of the string without from the first "| "
SearchWeaponSkinIndex = InStr(TempItemDetailsHolder.Name, "|");
SkinType = Right(TempItemDetailsHolder.Name, Len(TempItemDetailsHolder.Name) - SearchWeaponSkinIndex - 2);
// Get the left part of the string without the next "| "
SearchWeaponSkinIndex = InStr(SkinType, "|");
HelperItem.SkinType = CrC(Left(SkinType, SearchWeaponSkinIndex));
WeaponItemID = class'KFWeaponSkinList'.default.Skins.Find('Id', HelperItem.ItemDefinition);
if (WeaponItemID != INDEX_NONE)
{
WeaponDef = class'KFWeaponSkinList'.default.Skins[WeaponItemID].WeaponDef;
// All Weapons start by KFGameContent.KFWeap_ Skip that prefix.
HelperItem.WeaponDef = CrC(Mid(WeaponDef.default.WeaponClassPath, 21));
HelperItem.Price = WeaponDef.default.BuyPrice;
}
else
{
HelperItem.WeaponDef = -1;
HelperItem.Price = 0;
}
SkinListWeaponsSearchCache.AddItem(HelperItem);
}
}
ActiveItems.AddItem(HelperItem);
HelperIndex = ActiveItems.length - 1;
}
@ -314,9 +465,87 @@ function InitInventory()
OnlineSub.ClearNewlyAdded();
for (i = 0; i < ActiveItems.length; i++)
if (CurrentInventoryFilter == EInv_WeaponSkins)
{
ItemArray.SetElementObject(i, ActiveItems[i].GfxItemObject);
// If need to refresh... we regenerate the list, if not reuse our Cache
NeedToRegenerateSkinList = NeedToRegenerateSkinList || ActiveItems.Length != SkinListOrderedCache.Length;
if (NeedToRegenerateSkinList)
{
NeedToRegenerateSkinList = false;
/*`Log("START ORDERING!!!");
`Log("----------");*/
for (i = 0 ; i < ActiveItems.Length; i++)
{
// If doesn't have weapon definition, don't consider, only add as FailedItem to be added at the end
if (ActiveItems[i].WeaponDef != -1)
{
ValidSkinItems.AddItem(ActiveItems[i]);
}
else
{
FailedSkinItems.AddItem(ActiveItems[i]);
}
}
// Now we have all valid weapons
// We want to order by Price - Weapon Def - Rarity - Quality
// So we order inverse that way we keep the final list with the design intention
ValidSkinItems.Sort(SortByAll);
SkinListOrderedCache = ValidSkinItems;
/*for (i = 0 ; i < SkinListOrderedCache.Length; i++)
{
`Log("ID : " $SkinListOrderedCache[i].ItemDefinition);
`Log("Weapon Def : " $SkinListOrderedCache[i].WeaponDef);
`Log("Price : " $SkinListOrderedCache[i].Price);
//`Log("Full Name : " $SkinListOrderedCache[i].FullName);
`Log("Skin : " $SkinListOrderedCache[i].SkinType);
`Log("Rarity : " $SkinListOrderedCache[i].Rarity);
`Log("Quality : " $SkinListOrderedCache[i].Quality);
`Log("----------");
}*/
// FailedItems are weapons that don't have a Weapon Definition, this might be a case with old unsupported content?
for (i = 0; i < FailedSkinItems.Length; i++)
{
/*if (FailedSkinItems[i].FullName != "")
{
`Log("FailedSkinItems ID : " $FailedSkinItems[i].ItemDefinition);
`Log("FailedSkinItems Price : " $FailedSkinItems[i].Price);
`Log("FailedSkinItems Full Name : " $FailedSkinItems[i].FullName);
`Log("FailedSkinItems Skin : " $FailedSkinItems[i].SkinType);
`Log("FailedSkinItems Rarity : " $FailedSkinItems[i].Rarity);
`Log("FailedFailedSkinItemsItems Quality : " $FailedSkinItems[i].Quality);
`Log("----------");
}*/
SkinListOrderedCache.AddItem(FailedSkinItems[i]);
}
/*`Log("FINISH ORDERING!!!");
`Log("----------");*/
}
else
{
//`Log("USING SKIN LIST CACHE!!!");
}
for (i = 0; i < SkinListOrderedCache.length; i++)
{
ItemArray.SetElementObject(i, SkinListOrderedCache[i].GfxItemObject);
}
}
else
{
for (i = 0; i < ActiveItems.length; i++)
{
ItemArray.SetElementObject(i, ActiveItems[i].GfxItemObject);
}
}
SetObject("inventoryList", ItemArray);
@ -376,6 +605,9 @@ function OnItemExhangeTimeOut()
function FinishCraft()
{
SetVisible(true);
`Log("FinishCraft");
NeedToRegenerateSkinList = true;
}
function SetMatineeColor(int ItemRarity)
@ -494,10 +726,12 @@ function bool IsItemActive(int ItemDefinition)
if(WeaponDef != none)
{
return class'KFWeaponSkinList'.Static.IsSkinEquip(WeaponDef, ItemDefinition);
if (class'KFWeaponSkinList'.Static.IsSkinEquip(WeaponDef, ItemDefinition))
{
return true;
}
}
return false;
}
@ -953,6 +1187,7 @@ function Callback_Equip( int ItemDefinition )
}
//refresh inventory
NeedToRegenerateSkinList = true; // need to regenerate as the equipped state changed
InitInventory();
}
@ -1249,6 +1484,8 @@ function Callback_PreviewItem( int ItemDefinition )
defaultproperties
{
NeedToRegenerateSkinList=false
CurrentWeaponTypeFilter = EInvWT_None;
CurrentRarityFilter = ITR_NONE;

View File

@ -39,11 +39,17 @@ var KFPlayerReplicationInfo MyKFPRI;
var bool bModifiedSkills;
var bool bModifiedPerk;
var bool bChangesMadeDuringLobby;
var bool bModifiedWeaponIndexes;
var name PerkLevelupSound;
var byte SelectedSkillsHolder[`MAX_PERK_SKILLS];
var const private float StickInputThreshold;
var const private float StickResetThreshold;
var transient bool bAxisResetLeft, bAxisResetRight;
function InitializeMenu(KFGFxMoviePlayer_Manager InManager)
{
super.InitializeMenu(InManager);
@ -77,7 +83,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);
DetailsContainer.UpdateDetails(PerkClass, SelectedSkillsHolder, false, false);
DetailsContainer.UpdatePassives(PerkClass);
}
break;
@ -114,6 +120,8 @@ function OnOpen()
{
local KFGameReplicationInfo KFGRI;
GetGameViewportClient().HandleInputAxis = OnAxisModified;
LastPerkIndex = KFPC.SavedPerkIndex;
MyKFPRI = KFPlayerReplicationInfo( GetPC().PlayerReplicationInfo );
@ -196,9 +204,11 @@ event OnClose()
{
local bool bShouldUpdatePerk;
GetGameViewportClient().HandleInputAxis = none;
if( KFPC != none )
{
if( bModifiedPerk || bModifiedSkills )
if( bModifiedPerk || bModifiedSkills || bModifiedWeaponIndexes)
{
bShouldUpdatePerk = bModifiedPerk && LastPerkIndex != KFPC.SavedPerkIndex;
@ -215,8 +225,15 @@ event OnClose()
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SavedPerkIndex, LastPerkIndex );
}
if (bModifiedWeaponIndexes)
{
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingWeapIdx, KFPC.SurvivalPerkWeapIndex );
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingGrenIdx, KFPC.SurvivalPerkGrenIndex );
}
bModifiedPerk = false;
bModifiedSkills = false;
bModifiedWeaponIndexes = false;
}
}
@ -323,7 +340,7 @@ function UpdateContainers( class<KFPerk> PerkClass, optional bool bClickedIndex=
if( DetailsContainer != none )
{
DetailsContainer.UpdateDetails( PerkClass );
DetailsContainer.UpdateDetails( PerkClass, SelectedSkillsHolder, false, false );
DetailsContainer.UpdatePassives( PerkClass );
}
@ -457,6 +474,11 @@ function Callback_SkillSelected( byte TierIndex, byte SkillIndex )
SelectedSkillsHolder[TierIndex] = SkillIndex;
UpdateSkillsUI(KFPC.PerkList[LastPerkIndex].PerkClass);
SavePerkData();
if ( KFPC.PerkList[LastPerkIndex].PerkClass.Name == 'KFPerk_Survivalist' )
{
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, false );
}
}
}
@ -469,6 +491,110 @@ function Callback_SkillSelectionOpened()
}
}
function OnPrevWeaponPressed()
{
local byte NewIndex;
NewIndex = KFPC.CurrentPerk.OnPrevWeaponSelected();
KFPC.SurvivalPerkWeapIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false );
bModifiedWeaponIndexes=true;
}
function OnNextWeaponPressed()
{
local byte NewIndex;
NewIndex = KFPC.CurrentPerk.OnNextWeaponSelected();
KFPC.SurvivalPerkWeapIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, true );
bModifiedWeaponIndexes=true;
}
function OnPrevGrenadePressed()
{
local byte NewIndex;
NewIndex = KFPC.CurrentPerk.OnPrevGrenadeSelected();
KFPC.SurvivalPerkGrenIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false );
bModifiedWeaponIndexes=true;
}
function OnNextGrenadePressed()
{
local byte NewIndex;
NewIndex = KFPC.CurrentPerk.OnNextGrenadeSelected();
KFPC.SurvivalPerkGrenIndex = NewIndex;
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, true );
bModifiedWeaponIndexes=true;
}
event bool OnAxisModified( int ControllerId, name Key, float Delta, float DeltaTime, bool bGamepad )
{
if (GetPC().PlayerInput.bUsingGamepad )
{
if (DetailsContainer != none && bGamepad)
{
OnGamepadAxisModified(ControllerId, Key, Delta, DeltaTime, bGamepad);
}
}
return false;
}
function OnGamepadAxisModified( int ControllerId, name Key, float Delta, float DeltaTime, bool bGamepad )
{
local float AbsDelta;
AbsDelta = Abs(Delta);
if ( KFPC.CurrentPerk.static.CanChoosePrimaryWeapon() && Key == 'XboxTypeS_LeftX' )
{
if (bAxisResetLeft && AbsDelta > StickInputThreshold)
{
if (Delta < 0)
{
OnPrevWeaponPressed();
}
else
{
OnNextWeaponPressed();
}
bAxisResetLeft = false;
}
else if (!bAxisResetLeft && AbsDelta < StickResetThreshold)
{
bAxisResetLeft = true;
}
}
else if (KFPC.CurrentPerk.static.CanChooseGrenade() && Key == 'XboxTypeS_RightX')
{
if (bAxisResetRight && AbsDelta > StickInputThreshold)
{
if (Delta < 0)
{
OnPrevGrenadePressed();
}
else
{
OnNextGrenadePressed();
}
bAxisResetRight = false;
}
else if (!bAxisResetRight && AbsDelta < StickResetThreshold)
{
bAxisResetRight = true;
}
}
}
defaultproperties
{
PerkLevelupSound=LevelUp_Popup
@ -481,4 +607,9 @@ defaultproperties
SubWidgetBindings.Add((WidgetName="SelectedPerkSummaryContainer",WidgetClass=class'KFGFxPerksContainer_SkillsSummary'))
LastPerkIndex=255
LastPerkLevel=255
bAxisResetLeft=true
bAxisResetRight=false
StickInputThreshold=0.5
StickResetThreshold=0.5
}

View File

@ -216,7 +216,11 @@ function SetSumarryInfo()
}
else
{
if (KFGRI.default.bEndlessMode)
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
{
TextObject.SetString("waveTime", WaveString @ KFGRI.GunGameWavesCurrent @"-" @FormatTime(KFGRI.ElapsedTime));
}
else if (KFGRI.default.bEndlessMode)
{
TextObject.SetString("waveTime", WaveString @ KFGRI.WaveNum @"-" @FormatTime(KFGRI.ElapsedTime));
}

View File

@ -70,6 +70,9 @@ var KFGFxWidget_BossHealthBar bossHealthBar;
var KFGFxWidget_MapText MapTextWidget;
// Widget that displays map texts
var KFGFxWidget_MapCounterText MapCounterTextWidget;
// Widget that displays gun mode texts
var KFGFxWidget_GunGame GunGameWidget;
var KFPlayerController KFPC;
@ -102,6 +105,9 @@ var Protected float LastUpdateTime;
// The name of the player currently being voted on to kick
var string PendingKickPlayerName;
// Gun game variables
var transient bool bLastGunGameVisibility;
/** On creation of the HUD */
function Init(optional LocalPlayer LocPlay)
{
@ -348,6 +354,13 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
GoompaCounterWidget=KFGFxWidget_GoompaCounter(Widget);
}
break;
case 'GunGameContainer':
if (GunGameWidget == none)
{
GunGameWidget=KFGFxWidget_GunGame(Widget);
SetWidgetPathBinding( Widget, WidgetPath );
}
break;
}
return true;
@ -376,6 +389,8 @@ function UpdateWeaponSelect()
/** Update all the unique HUD pieces */
function TickHud(float DeltaTime)
{
local bool bGunGameVisibility;
if(KFPC == none || KFPC.WorldInfo.TimeSeconds - LastUpdateTime < UpdateInterval )
{
return;
@ -447,6 +462,22 @@ function TickHud(float DeltaTime)
{
GfxScoreBoardPlayer.TickHud(DeltaTime);
}
if (GunGameWidget != none)
{
bGunGameVisibility = KFPC.CanUseGunGame();
if (bGunGameVisibility)
{
bGunGameVisibility = KFPC.Pawn.Health > 0;
}
if (bGunGameVisibility != bLastGunGameVisibility)
{
GunGameWidget.UpdateGunGameVisibility(bGunGameVisibility);
bLastGunGameVisibility = bGunGameVisibility;
}
}
}
function UpdateObjectiveActive()
@ -781,7 +812,18 @@ function DisplayExpandedWaveInfo()
}
else
{
if (KFGRI.IsBossWave())
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
{
if (KFGRI.bWaveGunGameIsFinal)
{
PriorityMessageObject.SetString("waveNum", class'KFGFxHUD_WaveInfo'.default.FinalWaveString);
}
else
{
PriorityMessageObject.SetString("waveNum", KFGRI.GunGameWavesCurrent $"/?");
}
}
else if (KFGRI.IsBossWave())
{
PriorityMessageObject.SetString("waveNum", class'KFGFxHUD_WaveInfo'.default.BossWaveString);
}
@ -1091,6 +1133,14 @@ function UpdateGoompaCounterWidget(int value, int max)
}
}
function UpdateGunGameWidget(int score, int max_score, int level, int max_level)
{
if (GunGameWidget != none)
{
GunGameWidget.SetData(score, max_score, level, max_level);
}
}
//==============================================================
// Input
//==============================================================
@ -1441,6 +1491,8 @@ DefaultProperties
bAutoPlay=true
bIsSpectating=false
bLastGunGameVisibility=true
WidgetBindings.Add((WidgetName="ObjectiveContainer",WidgetClass=class'KFGFxHUD_ObjectiveConatiner'))
WidgetBindings.Add((WidgetName="SpectatorInfoWidget",WidgetClass=class'KFGFxHUD_SpectatorInfo'))
WidgetBindings.Add((WidgetName="PlayerStatWidgetMC",WidgetClass=class'KFGFxHUD_PlayerStatus'))
@ -1465,6 +1517,7 @@ DefaultProperties
WidgetBindings.Add((WidgetName="bossHealthBar", WidgetClass=class'KFGFxWidget_BossHealthBar'))
WidgetBindings.Add((WidgetName="mapTextWidget", WidgetClass=class'KFGFxWidget_MapText'))
WidgetBindings.Add((WidgetName="counterMapTextWidget", WidgetClass=class'KFGFxWidget_MapCounterText'))
WidgetBindings.ADD((WidgetName="GunGameContainer", WidgetClass=class'KFGFxWidget_GunGame'));
SpecialWaveIconPath(AT_Clot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Cyst"

View File

@ -25,53 +25,68 @@ function LocalizeContainer()
GetObject("basicLoadoutTextField").SetString("text", BasicLoadoutString);
}
function UpdateDetails( class<KFPerk> PerkClass)
function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC, byte WeaponIdx, byte GrenadeIdx)
{
local GFxObject DetailsProvider;
local KFPlayerController KFPC;
local array<string> WeaponNames;
local array<string> WeaponSources;
local int i;
DetailsProvider = CreateObject( "Object" );
DetailsProvider.SetString( "ExperienceMessage", ExperienceString @ KFPC.GetPerkXP(PerkClass) );
if(PerkClass.default.PrimaryWeaponDef != none)
{
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.static.GetPrimaryWeaponName(WeaponIdx), PerkClass.static.GetPrimaryWeaponImagePath(WeaponIdx));
}
if(PerkClass.default.SecondaryWeaponDef != none)
{
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.SecondaryWeaponDef.static.GetItemName(), PerkClass.default.SecondaryWeaponDef.static.GetImagePath());
}
if(PerkClass.default.KnifeWeaponDef != none)
{
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.KnifeWeaponDef.static.GetItemName(), PerkClass.default.KnifeWeaponDef.static.GetImagePath());
}
if(PerkClass.default.GrenadeWeaponDef != none)
{
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.static.GetGrenadeWeaponName(GrenadeIdx), PerkClass.static.GetGrenadeWeaponImagePath(GrenadeIdx));
}
for (i = 0; i < WeaponNames.length; i++)
{
DetailsProvider.SetString( "WeaponName" $ i, WeaponNames[i] );
DetailsProvider.SetString( "WeaponImage" $ i, "img://"$WeaponSources[i] );
}
DetailsProvider.SetString( "EXPAction1", PerkClass.default.EXPAction1 );
DetailsProvider.SetString( "EXPAction2", PerkClass.default.EXPAction2 );
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)
{
local KFPlayerController KFPC;
local byte WeaponIdx, GrenadeIdx;
KFPC = KFPlayerController( GetPC() );
if ( KFPC != none)
if ( KFPC == none)
{
if(KFPC != none)
{
DetailsProvider.SetString( "ExperienceMessage", ExperienceString @ KFPC.GetPerkXP(PerkClass) );
}
if(PerkClass.default.PrimaryWeaponDef != none)
{
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.PrimaryWeaponDef.static.GetItemName(), PerkClass.default.PrimaryWeaponDef.static.GetImagePath());
}
if(PerkClass.default.SecondaryWeaponDef != none)
{
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.SecondaryWeaponDef.static.GetItemName(), PerkClass.default.SecondaryWeaponDef.static.GetImagePath());
}
if(PerkClass.default.KnifeWeaponDef != none)
{
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.KnifeWeaponDef.static.GetItemName(), PerkClass.default.KnifeWeaponDef.static.GetImagePath());
}
if(PerkClass.default.GrenadeWeaponDef != none)
{
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.GrenadeWeaponDef.static.GetItemName(), PerkClass.default.GrenadeWeaponDef.static.GetImagePath());
}
for (i = 0; i < WeaponNames.length; i++)
{
DetailsProvider.SetString( "WeaponName" $ i, WeaponNames[i] );
DetailsProvider.SetString( "WeaponImage" $ i, "img://"$WeaponSources[i] );
}
DetailsProvider.SetString( "EXPAction1", PerkClass.default.EXPAction1 );
DetailsProvider.SetString( "EXPAction2", PerkClass.default.EXPAction2 );
SetObject( "detailsData", DetailsProvider );
return;
}
WeaponIdx = 0;
GrenadeIdx = 0;
UpdateAndGetCurrentWeaponIndexes(PerkClass, KFPC, WeaponIdx, GrenadeIdx, SelectedSkills, IsChoosingPrev, IsChoosingNext);
UpdateDetailsInternal(PerkClass, KFPC, WeaponIdx, GrenadeIdx);
}
function AddWeaponInfo(out array<string> WeaponNames, out array<string> WeaponSources, string WeaponName, string WeaponSource)
@ -108,4 +123,12 @@ function UpdatePassives(Class<KFPerk> PerkClass)
SetObject( "passivesData", PassivesProvider );
}
function UpdateAndGetCurrentWeaponIndexes(class<KFPerk> PerkClass, KFPlayerController KFPC, out byte WeaponIdx, out byte GrenadeIdx
, byte SelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
{
if (PerkClass.Name == 'KFPerk_Survivalist')
{
WeaponIdx = KFPC.CurrentPerk.SetWeaponSelectedIndex(KFPC.SurvivalPerkWeapIndex);
GrenadeIdx = KFPC.CurrentPerk.SetGrenadeSelectedIndexUsingSkills(KFPC.SurvivalPerkGrenIndex, SelectedSkills, IsChoosingPrev, IsChoosingNext);
}
}

View File

@ -14,6 +14,14 @@ var localized string YourVoteString;
var localized string TopVotesString;
var string MapVoteString; //localized in parent and parent passes it to this class
// Maps to skip
const MapBiolapse = 'KF-Biolapse';
const MapNightmare = 'KF-Nightmare';
const MapPowerCore = 'KF-PowerCore_Holdout';
const MapDescent = 'KF-TheDescent';
const MapKrampus = 'KF-KrampusLair';
const MapSteam = 'KF-SteamFortress';
//==============================================================
// Initialization
//==============================================================
@ -47,36 +55,46 @@ function SetMapOptions()
local bool IsWeeklyMode;
local bool IsBrokenTrader;
local bool IsBossRush;
local bool IsGunGame;
local bool bShouldSkipMaps;
local name MapName;
KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI);
bShouldSkipMaps = false;
Counter = 0;
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;
bShouldSkipMaps = IsWeeklyMode && (IsBrokenTrader || IsBossRush || IsGunGame);
//gfx
MapList = CreateArray();
for (i = 0; i < ServerMapList.length; i++)
{
if ( IsWeeklyMode && (IsBrokenTrader || IsBossRush) && ( ServerMapList[i] == "KF-Biolapse" ||
ServerMapList[i] == "KF-Nightmare" ||
ServerMapList[i] == "KF-PowerCore_Holdout" ||
ServerMapList[i] == "KF-TheDescent" ||
ServerMapList[i] == "KF-KrampusLair"))
MapName = name(ServerMapList[i]);
if ( bShouldSkipMaps && ( MapName == MapBiolapse ||
MapName == MapNightmare ||
MapName == MapPowerCore ||
MapName == MapDescent ||
MapName == MapKrampus))
{
continue;
}
/* Temporary removal of SteamFrotress for BossRush */
if (IsWeeklyMode && IsBossRush && ServerMapList[i] == "KF-SteamFortress")
if (IsWeeklyMode && IsBossRush && MapName == MapSteam)
{
continue;
}
/**/
/* */
MapObject = CreateObject("Object");
MapObject.SetString("label", class'KFCommon_LocalizedStrings'.static.GetFriendlyMapName(ServerMapList[i]) );

View File

@ -0,0 +1,27 @@
class KFGFxSpecialEventObjectivesContainer_Summer2022 extends KFGFxSpecialEventObjectivesContainer;
function Initialize(KFGFxObject_Menu NewParentMenu)
{
super.Initialize(NewParentMenu);
}
DefaultProperties
{
ObjectiveIconURLs[0] = "Summer2022_UI.UI_Objectives_Summer2022_Not_the_best_tourists" // Kill 1500 Zeds on any map or mode
ObjectiveIconURLs[1] = "Summer2022_UI.UI_Objectives_Summer2022_Splashdown" // Complete the Weekly on Rig
ObjectiveIconURLs[2] = "Summer2022_UI.UI_Objectives_Summer2022_Top_Surfer" // Complete 100 waves on Rig
ObjectiveIconURLs[3] = "Summer2022_UI.UI_Objectives_Summer2022_Overboard" // Throw 50 Zeds to the sea on Rig
ObjectiveIconURLs[4] = "Summer2022_UI.UI_Objectives_Summer2022_Wide_wide_sea" // Complete wave 15 on Endless Hard or higher difficulty on Rig
//defaults
AllCompleteRewardIconURL="CHR_DeepSeaUniform_Item_TEX.trident.deepseatrident_precious"
ChanceDropIconURLs[0]="CHR_CosmeticSet_SS_01_ItemTex.Sideshow_Prize_Ticket"
ChanceDropIconURLs[1]="CHR_CosmeticSet_SS_01_ItemTex.SideshowGoldenTicket_Small"
IconURL="Summer2022_UI.KF2_Summer_2022_Tidal_Terror"
UsesProgressList[0] = true
UsesProgressList[1] = false
UsesProgressList[2] = true
UsesProgressList[3] = true
UsesProgressList[4] = false
}

View File

@ -348,11 +348,9 @@ function UpdateOverviewInGame()
bCustomLength = false; //not using these now
bCustomDifficulty = false;
KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI);
if(KFGRI != none)
{
if (KFGRI != none && KFGRI.GameClass != none && !KFGRI.GameClass.Static.GetShouldShowLength())
{
HideLengthInfo();
@ -372,19 +370,30 @@ function UpdateOverviewInGame()
}
CurrentLengthIndex = KFGRI.GameLength;
if(LastLengthIndex != CurrentLengthIndex)
{
// don't show the length category in objective mode
if (KFGRI.GameClass.Name == ObjectiveClassName)
{
UpdateLength("");
}
else
{
UpdateLength(bCustomLength ? Class'KFCommon_LocalizedStrings'.default.CustomString : class'KFCommon_LocalizedStrings'.static.GetLengthString(CurrentLengthIndex));
}
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
{
UpdateLength(Class'KFCommon_LocalizedStrings'.default.SpecialLengthString);
LastLengthIndex = CurrentLengthIndex;
}
}
else
{
if (LastLengthIndex != CurrentLengthIndex)
{
// don't show the length category in objective mode
if (KFGRI.GameClass.Name == ObjectiveClassName)
{
UpdateLength("");
}
else
{
UpdateLength(bCustomLength ? Class'KFCommon_LocalizedStrings'.default.CustomString : class'KFCommon_LocalizedStrings'.static.GetLengthString(CurrentLengthIndex));
}
LastLengthIndex = CurrentLengthIndex;
}
}
UpdateServerType( class'KFCommon_LocalizedStrings'.static.GetServerTypeString(int(KFGRI.bCustom)) );

View File

@ -182,31 +182,40 @@ function FillWhatsNew()
local SWhatsNew item;
WhatsNewItems.Remove(0, WhatsNewItems.Length);
// Latest Update
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_ChopTilYouDrop", "LatestUpdate", "http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_TidalTerror", "LatestUpdate", "http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/");
WhatsNewItems.AddItem(item);
// KF2 Armory Season Pass 2021
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Spring_Armory_Season_Pass", "ArmorySeasonPass", "https://store.steampowered.com/app/1524820/Killing_Floor_2__Armory_Season_Pass");
// KF2 Armory Season Pass 2022
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_ArmorySeasonPassII", "ArmorySeasonPass", "https://store.steampowered.com/app/1914490/KF2__Season_Pass_2022");
WhatsNewItems.AddItem(item);
// Featured Time Limited Item
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/5588");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_SS_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/4928");
WhatsNewItems.AddItem(item);
// Featured Full Gear
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Holiday_Shopper", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9262");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_UltimateEdition", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9283");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_NeonMKVIII_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9362");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_Classic_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9363");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_DeepSea_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9364");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_Chameleon_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9365");
WhatsNewItems.AddItem(item);
// Featured Outfit Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_Shopping_Uniforms", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9263");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_DeepSea_Explorer_Uniforms", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9366");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Christmas", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9264");
// Featured Weapon
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_ReductoRay", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9367");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Alchemist_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9265");
WhatsNewItems.AddItem(item);
// Featured Cosmetic Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Alchemist","FeaturedItemBundle","https://store.steampowered.com/buyitem/232090/9266");
// Featured Weapon
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_Sentinel","FeaturedItemBundle","https://store.steampowered.com/buyitem/232090/9368");
WhatsNewItems.AddItem(item);
// Featured Weapon Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_XMAS_Doshinegun", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9267");
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_Weaponsbundle", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9369");
WhatsNewItems.AddItem(item);
// Misc Community Links
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityHub", "Jaegorhorn", "https://steamcommunity.com/app/232090");

View File

@ -271,11 +271,16 @@ function FilterWeeklyMaps(out array<string> List)
return;
}
`Log("OPTIONS: Skipping Maps");
// Scavenger index = 11
// BossRush index = 14
// BossRush index = 14
// GunGame index = 16
WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod();
if (WeeklyIndex == 11 || WeeklyIndex == 14)
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");

View File

@ -447,21 +447,25 @@ DefaultProperties
XboxFilterExceptions[0]="Wasteland Bundle" // Wasteland Outfit Bundle
FeaturedItemIDs[0]=7944 //Whatsnew Gold Ticket
FeaturedItemIDs[1]=9262
FeaturedItemIDs[2]=9263
FeaturedItemIDs[3]=9264
FeaturedItemIDs[4]=9265
FeaturedItemIDs[5]=9266
FeaturedItemIDs[6]=9267
FeaturedItemIDs[0]=8178 //Whatsnew Gold Ticket
FeaturedItemIDs[1]=9369
FeaturedItemIDs[2]=9367
FeaturedItemIDs[3]=9368
FeaturedItemIDs[4]=9366
FeaturedItemIDs[5]=9364
FeaturedItemIDs[6]=9362
FeaturedItemIDs[7]=9363
FeaturedItemIDs[8]=9365
ConsoleFeaturedItemIDs[0]=7947 //Whatsnew Gold Ticket PSN
ConsoleFeaturedItemIDs[1]=9262
ConsoleFeaturedItemIDs[2]=9263
ConsoleFeaturedItemIDs[3]=9264
ConsoleFeaturedItemIDs[4]=9265
ConsoleFeaturedItemIDs[5]=9266
ConsoleFeaturedItemIDs[6]=9267
ConsoleFeaturedItemIDs[0]=8181 //Whatsnew Gold Ticket PSN
ConsoleFeaturedItemIDs[1]=9369
ConsoleFeaturedItemIDs[2]=9367
ConsoleFeaturedItemIDs[3]=9368
ConsoleFeaturedItemIDs[4]=9366
ConsoleFeaturedItemIDs[5]=9364
ConsoleFeaturedItemIDs[6]=9362
ConsoleFeaturedItemIDs[7]=9363
ConsoleFeaturedItemIDs[8]=9365
MaxFeaturedItems=5
}

View File

@ -34,8 +34,11 @@ function UpdateGameInfo()
}
else
{
// Show the upcoming wave number for every wave except the boss wave
if (KFGRI.default.bEndlessMode)
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
{
FinalWaveString = WaveString @ (KFGRI.GunGameWavesCurrent) $"/?";
}
else if (KFGRI.default.bEndlessMode) // Show the upcoming wave number for every wave except the boss wave
{
// Show wave number, since there is no max
FinalWaveString = WaveString @ (KFGRI.WaveNum);

View File

@ -31,14 +31,30 @@ function bool PopulateData()
{
local GFxObject DataObject;
local KFWeeklyOutbreakInformation WeeklyInfo;
local bool bWeeklyComplete;
local int WeeklyIndex;
bWeeklyComplete = KFPC.IsWeeklyEventComplete();
WeeklyIndex = -1;
if(bWeeklyComplete != bLastWeeklyComplete || !bInitialDataPopulated)
{
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
if (KFPC.WorldInfo.NetMode == NM_Client)
{
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));
}
}
else
{
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
}
DataObject = CreateObject("Object");
if(WeeklyInfo == none)
@ -46,8 +62,9 @@ function bool PopulateData()
return false;
}
DataObject.SetString("label", WeeklyInfo.FriendlyName);
if(WeeklyInfo != none && WeeklyInfo.ModifierDescriptions.length > 0)
if(WeeklyInfo.ModifierDescriptions.length > 0)
{
`Log("SETTING DESCRIPTION: " $WeeklyInfo.DescriptionStrings[0]);
DataObject.SetString("description", WeeklyInfo.DescriptionStrings[0]);
}
DataObject.SetString("iconPath", "img://"$WeeklyInfo.IconPath);
@ -58,8 +75,14 @@ function bool PopulateData()
DataObject.SetString("textValue", "");
SetObject("weeklyObjectiveData", DataObject);
PopulateModifiers();
PopulateRewards();
if (WeeklyInfo.ModifierDescriptions.Length > 0)
{
SetString("weeklyDescription", WeeklyInfo.ModifierDescriptions[0]);
}
PopulateModifiers(WeeklyInfo);
PopulateRewards(WeeklyInfo, WeeklyIndex);
bLastWeeklyComplete = bWeeklyComplete;
bInitialDataPopulated = true;
@ -69,24 +92,26 @@ function bool PopulateData()
return false;
}
function PopulateModifiers()
function PopulateModifiers(KFWeeklyOutbreakInformation WeeklyInfo)
{
local int i;
local GFxObject DataObject;
local GFxObject DataProvider; //array containing the data objects
local KFWeeklyOutbreakInformation WeeklyInfo;
if (WeeklyInfo == none || (GetPC().WorldInfo.NetMode == NM_Client && KFPC.WorldInfo.GRI == none))
{
return;
}
DataProvider = CreateArray();
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
for (i = 0; i < WeeklyInfo.ModifierDescriptions.length; i++)
{
DataObject = CreateObject("Object");
DataObject.SetString("label", ""); //no lable at the moment
if(WeeklyInfo != none && WeeklyInfo.ModifierDescriptions.length > 0)
{
DataObject.SetString("description", WeeklyInfo.ModifierDescriptions[i]);
}
DataObject.SetString("description", WeeklyInfo.ModifierDescriptions[i]);
//DataObject.SetString("iconPath", "img://"$WeeklyInfo.ModifierIconPaths[i]);
DataProvider.SetElementObject(i, DataObject); //add it to the array
@ -95,18 +120,21 @@ function PopulateModifiers()
SetObject("modifiers", DataProvider); //pass to SWF
}
function PopulateRewards()
function PopulateRewards(KFWeeklyOutbreakInformation WeeklyInfo, int WeeklyIndex)
{
local int i, ItemCount;
local GFxObject DataProvider; //array containing the data objects
local KFWeeklyOutbreakInformation WeeklyInfo;
local GFxObject GfxRewardItem;
if (WeeklyInfo == none)
{
return;
}
ItemCount = 0;
DataProvider = CreateArray();
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
WeeklyInfo.RewardIDs = class'KFOnlineStatsWrite'.static.GetWeeklyOutbreakRewards();
WeeklyInfo.RewardIDs = class'KFOnlineStatsWrite'.static.GetWeeklyOutbreakRewards(WeeklyIndex);
for (i = 0; i < WeeklyInfo.RewardIDs.length; i++)
{
GfxRewardItem = CreateRewardItem(WeeklyInfo, WeeklyInfo.RewardIDs[i]);
@ -161,9 +189,9 @@ function GFxObject CreateRewardItem(KFWeeklyOutbreakInformation WeeklyInfo,int I
function LocalizeMenu()
{
local GFxObject TextObject;
local KFWeeklyOutbreakInformation WeeklyInfo;
// local KFWeeklyOutbreakInformation WeeklyInfo;
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
// WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
TextObject = CreateObject("Object");
// Localize static text
TextObject.SetString("currentModifier", class'KFMission_LocalizedStrings'.default.CurrentWeeklySettingsString);
@ -172,11 +200,11 @@ function LocalizeMenu()
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);
}
}

View File

@ -0,0 +1,36 @@
//=============================================================================
// KFGFxWidget_GunGame
//=============================================================================
// HUD Widget that displays gun game messages to the player
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//
//=============================================================================
class KFGFxWidget_GunGame extends GFxObject;
function SetData( int score, int max_score, int level, int max_level )
{
SetString("WeaponLevelSetLocalised", Class'KFCommon_LocalizedStrings'.default.WeaponLevelString);
SetString("GunPointsSetLocalised", Class'KFCommon_LocalizedStrings'.default.GunPointsString);
SetInt("GunGameSetLevel", level);
SetInt("GunGameSetMaxLevel", max_level);
SetInt("GunGameSetScore", score);
SetInt("GunGameSetMaxScore", max_score);
}
function UpdateGunGameVisibility(bool visible)
{
if (visible)
{
SetBool("GunGameSetVisibility", true);
}
else
{
SetBool("GunGameSetVisibility", false);
}
}

View File

@ -84,12 +84,15 @@ function UpdateReadyButtonVisibility()
//sanity check because this is happening
MyKFPRI = KFPlayerReplicationInfo(GetPC().PlayerReplicationInfo);
}
if(bReadyButtonVisible)
{
KFGRI = KFGameReplicationInfo( GetPC().WorldInfo.GRI );
if ( KFGRI != none )
{
if (KFGRI.bMatchHasBegun && (MyKFPRI != none && MyKFPRI.bHasSpawnedIn && KFGRI.bTraderIsOpen) && !KFGRI.bMatchIsOver && MyKFPRI.GetTeamNum() != 255 )
if (KFGRI.bMatchHasBegun
&& (MyKFPRI != none && MyKFPRI.bHasSpawnedIn && (KFGRI.bTraderIsOpen || KFGRI.bForceSkipTraderUI))
&& !KFGRI.bMatchIsOver && MyKFPRI.GetTeamNum() != 255)
{
bShowingSkipTrader = !MyKFPRI.bVotedToSkipTraderTime;
if (bShowingSkipTrader && !ReadyButton.GetBool("visible"))

View File

@ -442,6 +442,14 @@ var int SpawnedMonsterProperties[EMonsterProperties];
*/
var transient array< byte > BossRushEnemies;
// Maps to skip
const MapBiolapse = 'KF-Biolapse';
const MapNightmare = 'KF-Nightmare';
const MapPowerCore = 'KF-PowerCore_Holdout';
const MapDescent = 'KF-TheDescent';
const MapKrampus = 'KF-KrampusLair';
const MapSteam = 'KF-SteamFortress';
/************************************************************************************
* @name Native
***********************************************************************************/
@ -1193,14 +1201,7 @@ function ResetPickups( array<KFPickupFactory> PickupList, int NumPickups )
PossiblePickups = PickupList;
if (OutbreakEvent != none && OutbreakEvent.ActiveEvent.bUnlimitedWeaponPickups && KFPickupFactory_Item(PickupList[0]) != none)
{
NumIterations = Min(NumPickups, PickupList.Length - 1);
}
else
{
NumIterations = Min(NumPickups, PickupList.Length);
}
NumIterations = Min(NumPickups, PickupList.Length - 1);
for ( i = 0; i < NumIterations; i++ )
{
@ -1267,8 +1268,15 @@ function ActivateNextPickup( KFPickupFactory NextFactory, int RespawnDelay )
{
if( NextFactory != none )
{
NextFactory.bToBeActivated = true;
NextFactory.SetTimer( RespawnDelay, , nameof(NextFactory.Reset) );
if (NextFactory.CanUsePickup())
{
NextFactory.bToBeActivated = true;
NextFactory.SetTimer( RespawnDelay, , nameof(NextFactory.Reset) );
}
else
{
NextFactory.SetPickupHidden();
}
}
}
@ -1421,6 +1429,14 @@ function RestartPlayer(Controller NewPlayer)
}
}
function ResetGunGame(KFPlayerController_WeeklySurvival KFPC_WS)
{
}
function RestartGunGamePlayerWeapon(KFPlayerController_WeeklySurvival KFPC_WS, byte WaveToUse)
{
}
/** Returns a low rating if other players are nearby (spawn will fail) */
function float RatePlayerStart(PlayerStart P, byte Team, Controller Player)
{
@ -2895,62 +2911,69 @@ function string GetNextMap()
{
local array<string> MapList;
local int i;
local name MapName;
if ( bUseMapList && GameMapCycles.Length > 0 )
if ( bUseMapList && GameMapCycles.Length > 0 )
{
if ( MapCycleIndex == INDEX_NONE )
{
MapList = GameMapCycles[ActiveMapCycle].Maps;
MapCycleIndex = GetCurrentMapCycleIndex(MapList);
if ( MapCycleIndex == INDEX_NONE )
{
MapList = GameMapCycles[ActiveMapCycle].Maps;
MapCycleIndex = GetCurrentMapCycleIndex(MapList);
if ( MapCycleIndex == INDEX_NONE )
{
// Assume current map is actually zero
MapCycleIndex = 0;
}
// Assume current map is actually zero
MapCycleIndex = 0;
}
}
for (i = 0; i < GameMapCycles[ActiveMapCycle].Maps.length; ++i)
for (i = 0; i < GameMapCycles[ActiveMapCycle].Maps.length; ++i)
{
MapCycleIndex = MapCycleIndex + 1 < GameMapCycles[ActiveMapCycle].Maps.length ? (MapCycleIndex + 1) : 0;
/**
This could be changed to read replicated values instead of engine ones.
*/
if (MyKFGRI.IsA('KFGameReplicationInfo_WeeklySurvival'))
{
MapCycleIndex = MapCycleIndex + 1 < GameMapCycles[ActiveMapCycle].Maps.length ? (MapCycleIndex + 1) : 0;
if (MyKFGRI.IsA('KFGameReplicationInfo_WeeklySurvival'))
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
{
if ((class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 11 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[11]) || // Scavenger
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14])) // Boss Rush
{
if (GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex] == "KF-Biolapse" ||
GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex] == "KF-Nightmare" ||
GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex] == "KF-PowerCore_Holdout" ||
GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex] == "KF-TheDescent" ||
GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex] == "KF-KrampusLair")
{
continue;
}
}
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
/* Temporary removal of SteamFrotress for BossRush */
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14] &&
GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex] == "KF-SteamFortress")
if (MapName == MapBiolapse ||
MapName == MapNightmare ||
MapName == MapPowerCore ||
MapName == MapDescent ||
MapName == MapKrampus)
{
continue;
}
/**/
}
if ( IsMapAllowedInCycle(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]) )
/* Temporary removal of SteamFrotress for BossRush */
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14] &&
MapName == MapSteam)
{
SaveConfig();
return GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex];
continue;
}
/* */
}
return string(WorldInfo.GetPackageName());
}
else
{
return string(WorldInfo.GetPackageName());
if ( IsMapAllowedInCycle(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]) )
{
SaveConfig();
return GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex];
}
}
return string(WorldInfo.GetPackageName());
}
else
{
return string(WorldInfo.GetPackageName());
}
return "";
}
@ -3781,14 +3804,22 @@ function UpdateCurrentMapVoteTime(byte NewTime, optional bool bStartTime);
function float GetTraderTime()
{
local float MapOverride;
local float TraderTimeModifier;
TraderTimeModifier = 1.f;
if (OutbreakEvent != none && OutbreakEvent.ActiveEvent.TraderTimeModifier != 1.f)
{
TraderTimeModifier = OutbreakEvent.ActiveEvent.TraderTimeModifier;
}
MapOverride = DifficultyInfo.GetTraderTimeByMap(WorldInfo.GetMapName(true));
if (MapOverride > 0.f)
{
return MapOverride;
return MapOverride * TraderTimeModifier;
}
return DifficultyInfo.GetTraderTimeByDifficulty();
return DifficultyInfo.GetTraderTimeByDifficulty() * TraderTimeModifier;
}

View File

@ -60,6 +60,7 @@ var repnotify bool bTraderIsOpen;
var repnotify bool bWaveIsActive;
var repnotify bool bWaveStarted;
var bool bIsEndlessPaused;
var bool bForceSkipTraderUI;
/** Replicates at beginning and end of waves to change track / track type */
var repnotify byte MusicTrackRepCount;
@ -107,6 +108,8 @@ var repnotify PerkAvailableData PerksAvailableData;
var byte WaveMax; // The "end" wave
var repnotify byte WaveNum; // The wave we are currently in
var bool bWaveIsEndless;
var repnotify byte GunGameWavesCurrent;
var repnotify bool bWaveGunGameIsFinal;
var int AIRemaining;
var int WaveTotalAICount;
var bool bEndlessMode;
@ -358,6 +361,9 @@ var transient bool bIsBrokenTrader;
************************************/
var int CurrentWeeklyIndex;
/** If true, force show skip time between waves ready button */
var bool bForceShowSkipTrader;
/************************************
* Steam heartbeat
************************************/
@ -389,11 +395,12 @@ cpptext
replication
{
if ( bNetDirty )
TraderVolume, TraderVolumeCheckType, bTraderIsOpen, NextTrader, WaveNum, bWaveIsEndless, AIRemaining, WaveTotalAICount, bWaveIsActive, MaxHumanCount, bGlobalDamage,
TraderVolume, TraderVolumeCheckType, bTraderIsOpen, NextTrader, WaveNum, bWaveIsEndless, GunGameWavesCurrent, bWaveGunGameIsFinal, AIRemaining, WaveTotalAICount, bWaveIsActive, MaxHumanCount, bGlobalDamage,
CurrentObjective, PreviousObjective, PreviousObjectiveResult, PreviousObjectiveXPResult, PreviousObjectiveVoshResult, MusicIntensity, ReplicatedMusicTrackInfo, MusicTrackRepCount,
bIsUnrankedGame, GameSharedUnlocks, bHidePawnIcons, ConsoleGameSessionGuid, GameDifficulty, GameDifficultyModifier, BossIndex, bWaveStarted, NextObjective, bIsBrokenTrader, bIsWeeklyMode, CurrentWeeklyIndex, bIsEndlessPaused; //@HSL - JRO - 3/21/2016 - PS4 Sessions
bIsUnrankedGame, GameSharedUnlocks, bHidePawnIcons, ConsoleGameSessionGuid, GameDifficulty, GameDifficultyModifier, BossIndex, bWaveStarted, NextObjective, bIsBrokenTrader, bIsWeeklyMode,
CurrentWeeklyIndex, bIsEndlessPaused, bForceSkipTraderUI; //@HSL - JRO - 3/21/2016 - PS4 Sessions
if ( bNetInitial )
GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled;
GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled, bForceShowSkipTrader;
if ( bNetInitial || bNetDirty )
PerksAvailableData;
if ( bNetInitial && Role == ROLE_Authority )
@ -543,6 +550,14 @@ simulated event ReplicatedEvent(name VarName)
{
UpdatePerksAvailable();
}
else if (VarName == 'GunGameWavesCurrent')
{
UpdateHUDWaveCount();
}
else if (VarName == 'bWaveGunGameIsFinal')
{
UpdateHUDWaveCount();
}
else
{
super.ReplicatedEvent(VarName);
@ -797,7 +812,7 @@ simulated function EndGame()
bMatchHasBegun = false;
bMatchIsOver = true;
class'KFGameEngine'.static.RefreshOnlineGameData(false);
class'KFGameEngine'.static.RefreshOnlineGameData(true);
}
/* Welcome screen shenanigans */
@ -1111,6 +1126,7 @@ function SetWaveActive(bool bWaveActive, optional byte NewMusicIntensity)
// set up music intensity for this wave
MusicIntensity = NewMusicIntensity;
bTraderIsOpen = !bWaveActive && bMatchHasBegun && bTradersEnabled;
bForceSkipTraderUI = !bWaveActive && bMatchHasBegun && bForceShowSkipTrader;
bWaveIsActive = bWaveActive;
bForceNetUpdate = true;
@ -2029,21 +2045,25 @@ function int SetNextObjective(array<KFInterface_MapObjective> PossibleObjectives
while (PossibleObjectives.Length > 0)
{
RandID = Rand(PossibleObjectives.Length);
PctChanceToActivate = PossibleObjectives[RandID].GetActivationPctChance();
if (bForceNextObjective || (PossibleObjectives[RandID].CanActivateObjective() && PreviousObjective != PossibleObjectives[RandID] && (PctChanceToActivate >= 1.f || DieRoll <= PctChanceToActivate)))
{
if (bActivateImmediately)
if (PossibleObjectives[RandID].CanActivateObjectiveByWeekly())
{
PctChanceToActivate = PossibleObjectives[RandID].GetActivationPctChance();
if (bForceNextObjective || (PossibleObjectives[RandID].CanActivateObjective() && PreviousObjective != PossibleObjectives[RandID] && (PctChanceToActivate >= 1.f || DieRoll <= PctChanceToActivate)))
{
ActivateObjective(PossibleObjectives[RandID], bUseEndlessSpawning);
if (bActivateImmediately)
{
ActivateObjective(PossibleObjectives[RandID], bUseEndlessSpawning);
}
else
{
NextObjective = Actor(PossibleObjectives[RandID]);
NextObjectiveIsEndless = bUseEndlessSpawning;
KFInterface_MapObjective(NextObjective).NotifyObjectiveSelected();
}
return RandID;
}
else
{
NextObjective = Actor(PossibleObjectives[RandID]);
NextObjectiveIsEndless = bUseEndlessSpawning;
KFInterface_MapObjective(NextObjective).NotifyObjectiveSelected();
}
return RandID;
}
}
PossibleObjectives.Remove(RandID, 1);
}
@ -2268,4 +2288,8 @@ defaultproperties
PreviousObjectiveXPResult=-1
bIsBrokenTrader=false
bIsWeeklyMode=false
bForceShowSkipTrader=false
bForceSkipTraderUI=false
GunGameWavesCurrent=1
bWaveGunGameIsFinal=false
}

View File

@ -204,7 +204,7 @@ static function class<KFGFxSpecialeventObjectivesContainer> GetSpecialEventClass
case SEI_Spring:
return class'KFGFxSpecialEventObjectivesContainer_Spring2021';
case SEI_Summer:
return class'KFGFxSpecialEventObjectivesContainer_Summer2021';
return class'KFGFxSpecialEventObjectivesContainer_Summer2022';
case SEI_Fall:
return class'KFGFxSpecialEventObjectivesContainer_Fall2021';
case SEI_Winter:

View File

@ -1866,7 +1866,7 @@ event bool FilterButtonInput(int ControllerId, name ButtonName, EInputEvent Inpu
PartyWidget.ReadyButton.SetBool("selected", KFPRI.bReadyToPlay);
}
else if(KFPRI.bHasSpawnedIn && !KFGRI.bMatchIsOver && KFGRI.bMatchHasBegun && KFGRI.bTraderIsOpen && CurrentMenu != TraderMenu && bMenusOpen)
else if(KFPRI.bHasSpawnedIn && !KFGRI.bMatchIsOver && KFGRI.bMatchHasBegun && (KFGRI.bTraderIsOpen || KFGRI.bForceSkipTraderUI) && CurrentMenu != TraderMenu && bMenusOpen)
{
bForceCloseMenuNextTime = true;
CurrentMenu.Callback_ReadyClicked(true);

View File

@ -234,7 +234,7 @@ function Callback_ReadyClicked( bool bReady )
if (KFGRI.bMatchHasBegun)
{
//player has spawned, skip trader time
if (KFGRI.bTraderIsOpen && KFPRI.bHasSpawnedIn)
if ((KFGRI.bTraderIsOpen || KFGRI.bForceSkipTraderUI) && KFPRI.bHasSpawnedIn)
{
if (KFPC.MyGFxManager.bMenusOpen && KFPC.MyGFxManager.CurrentMenu != KFPC.MyGFxManager.TraderMenu)
{
@ -506,6 +506,26 @@ function Callback_ChatFocusOut()
Manager.UpdateDynamicIgnoreKeys();
}
function Callback_OnLoadoutPrevWeaponPressed()
{
Manager.PerksMenu.OnPrevWeaponPressed();
}
function Callback_OnLoadoutNextWeaponPressed()
{
Manager.PerksMenu.OnNextWeaponPressed();
}
function Callback_OnLoadoutPrevGrenadePressed()
{
Manager.PerksMenu.OnPrevGrenadePressed();
}
function Callback_OnLoadoutNextGrenadePressed()
{
Manager.PerksMenu.OnNextGrenadePressed();
}
/** RETURN TO THESE FUNCTIONS */
/************************************************************************

View File

@ -92,7 +92,7 @@ simulated function PlayImpactEffects(const vector HitLocation, const Pawn Effect
}
}
bIsWeaponHandlingEffects = KFPawn(EffectInstigator).MyKFWeapon.bForceHandleImpacts;
bIsWeaponHandlingEffects = KFPawn(EffectInstigator).MyKFWeapon != none ? KFPawn(EffectInstigator).MyKFWeapon.bForceHandleImpacts : false;
// Trace using the Instigator as the TraceOwner so that melee weapons don't collide with Instigator
HitActor = EffectInstigator.Trace(NewHitLoc, HitNormal, (HitLocation - (HitNormal * 32)), HitLocation + (HitNormal * 32), !bWorldImpactsOnly,, HitInfo, TRACEFLAG_Bullet);

View File

@ -11,6 +11,7 @@
interface KFInterface_MapObjective;
// Status
simulated function bool CanActivateObjectiveByWeekly();
simulated function ActivateObjective();
simulated function DeactivateObjective();
simulated function GrantReward(KFPlayerReplicationInfo KFPRI, KFPlayerController KFPC);

View File

@ -495,6 +495,130 @@ function bool ClassNameIsInInventory(name ItemClassName, out Inventory out_Inven
return false;
}
/**
* returns the best weapon for this Pawn in loadout
*/
simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon, optional bool allow9mm )
{
local KFWeapon W, BestWeapon;
local float Rating, BestRating;
ForEach InventoryActors( class'KFWeapon', W )
{
if( w.HasAnyAmmo() )
{
if( bForceADifferentWeapon &&
W == Instigator.Weapon )
{
continue;
}
Rating = W.GetWeaponRating();
if( BestWeapon == None ||
Rating > BestRating )
{
if (allow9mm == false)
{
if (W.bIsBackupWeapon && !W.IsMeleeWeapon())
{
continue;
}
}
BestWeapon = W;
BestRating = Rating;
}
}
}
if (BestWeapon == none && allow9mm == false)
{
ForEach InventoryActors( class'KFWeapon', W )
{
if( w.HasAnyAmmo() )
{
if( bForceADifferentWeapon &&
W == Instigator.Weapon )
{
continue;
}
Rating = W.GetWeaponRating();
if( BestWeapon == None ||
Rating > BestRating )
{
BestWeapon = W;
BestRating = Rating;
}
}
}
}
return BestWeapon;
}
/**
* Switch to best weapon available in loadout
* Network: LocalPlayer
*/
simulated function SwitchToBestWeapon( optional bool bForceADifferentWeapon, optional bool check_9mm_logic = false )
{
local Weapon BestWeapon;
local PlayerController PC;
local KFPlayerInput KFPI;
local bool bCanSwapTo9mm;
if (check_9mm_logic)
{
// Default behaviour is you can't swap to 9mm
bCanSwapTo9mm = false;
PC = PlayerController(Instigator.Controller);
if ( PC != None )
{
KFPI = KFPlayerInput(PC.PlayerInput);
if (KFPI != None)
{
bCanSwapTo9mm = KFPI.bAllowSwapTo9mm;
}
}
}
else
{
bCanSwapTo9mm = true;
}
`LogInv("bForceADifferentWeapon:" @ bForceADifferentWeapon);
// if we don't already have a pending weapon,
if( bForceADifferentWeapon ||
PendingWeapon == None ||
(AIController(Instigator.Controller) != None) )
{
// figure out the new weapon to bring up
BestWeapon = GetBestWeapon( bForceADifferentWeapon, bCanSwapTo9mm );
if( BestWeapon == None )
{
return;
}
// if it matches our current weapon then don't bother switching
if( BestWeapon == Instigator.Weapon )
{
BestWeapon = None;
PendingWeapon = None;
Instigator.Weapon.Activate();
}
}
// stop any current weapon fire
Instigator.Controller.StopFiring();
// and activate the new pending weapon
SetCurrentWeapon(BestWeapon);
}
/**
* Switches to Previous weapon
* Network: Client
@ -943,7 +1067,7 @@ reliable client function SetCurrentWeapon(Weapon DesiredWeapon)
local KFWeapon DesiredKFW;
local KFWeapon PendingKFW;
CurrentKFW = KFWeapon(Instigator.Weapon);
CurrentKFW = Instigator != none ? KFWeapon(Instigator.Weapon) : none;
if ( CurrentKFW != none )
{
// Set the flag to switch to ironsights when the weapon is brought up
@ -963,6 +1087,7 @@ reliable client function SetCurrentWeapon(Weapon DesiredWeapon)
// Only change your weapon if it is different or we weant to equip the weapon we are currently putting down
DesiredKFW = KFWeapon(DesiredWeapon);
if( DesiredKFW != none &&
Instigator != none &&
(DesiredKFW != Instigator.Weapon || Instigator.Weapon.IsInState('WeaponPuttingDown')) )
{
if ( DesiredKFW.bHasIronSights )

View File

@ -63,6 +63,11 @@ simulated function PlayActivationSoundEvent()
}
}
simulated function bool CanActivateObjectiveByWeekly()
{
return true;
}
// Status
simulated function ActivateObjective()
{

View File

@ -158,6 +158,11 @@ simulated function ActivateBoundarySplines()
}
}
simulated function bool CanActivateObjectiveByWeekly()
{
return true;
}
// Status
simulated function ActivateObjective()
{

View File

@ -70,6 +70,7 @@ defaultproperties
ColumnIds.Add(STATID_ACHIEVE_MoonbaseCollectibles)
ColumnIds.Add(STATID_ACHIEVE_NetherholdCollectibles)
ColumnIds.Add(STATID_ACHIEVE_CarillonHamletCollectibles)
ColumnIds.Add(STATID_ACHIEVE_RigCollectibles)
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky5, Name="AchievementMrPerky5"))
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky10, Name = "AchievementMrPerky10"))
@ -124,8 +125,9 @@ defaultproperties
ColumnMappings.Add((Id=STATID_ACHIEVE_DesolationCollectibles,Name="AchievementCollectDesolation"))
ColumnMappings.Add((Id=STATID_ACHIEVE_HellmarkStationCollectibles,Name="AchievementCollectHellmarkStation"))
ColumnMappings.Add((Id=STATID_ACHIEVE_ElysiumEndlessWaveFifteen,Name="AchievementEndlessElysium"))
ColumnMappings.Add((Id=STATID_ACHIEVE_Dystopia2029Collectibles,NAme="AchievementCollectDystopia2029"))
ColumnMappings.Add((Id=STATID_ACHIEVE_MoonbaseCollectibles,NAme="AchievementCollectMoonbase"))
ColumnMappings.Add((Id=STATID_ACHIEVE_NetherholdCollectibles,NAme="AchievementCollectNetherhold"))
ColumnMappings.Add((Id=STATID_ACHIEVE_CarillonHamletCollectibles,NAme="AchievementCollectCarillonHamlet"))
ColumnMappings.Add((Id=STATID_ACHIEVE_Dystopia2029Collectibles,Name="AchievementCollectDystopia2029"))
ColumnMappings.Add((Id=STATID_ACHIEVE_MoonbaseCollectibles,Name="AchievementCollectMoonbase"))
ColumnMappings.Add((Id=STATID_ACHIEVE_NetherholdCollectibles,Name="AchievementCollectNetherhold"))
ColumnMappings.Add((Id=STATID_ACHIEVE_CarillonHamletCollectibles,Name="AchievementCollectCarillonHamlet"))
ColumnMappings.Add((Id=STATID_ACHIEVE_RigCollectibles,Name="AchievementCollectRig"))
}

View File

@ -441,6 +441,10 @@ const KFACHID_CarillonHamletHard = 289;
const KFACHID_CarillonHamletHellOnEarth = 290;
const KFACHID_CarillonHamletCollectibles = 291;
const KFACHID_RigHard = 292;
const KFACHID_RigHellOnEarth = 293;
const KFACHID_RigCollectibles = 294;
/* __TW_ANALYTICS_ */
var int PerRoundWeldXP;
var int PerRoundHealXP;
@ -2078,6 +2082,7 @@ defaultproperties
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Thrown_C4, KFDT_Explosive_C4,KFDT_Bludgeon_C4),CompletionAmount=2500))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_GrenadeLauncher_M79, KFDT_Ballistic_M79Impact,KFDT_Explosive_M79,KFDT_Bludgeon_M79),CompletionAmount=7000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_Boomy, KFDT_Ballistic_HRG_Boomy,KFDT_Explosive_HRG_Boomy,KFDT_Bludgeon_HRG_Boomy),CompletionAmount=7000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_Crossboom, KFDT_Piercing_HRG_Crossboom,KFDT_Explosive_HRG_Crossboom,KFDT_Explosive_HRG_CrossboomAlt,KFDT_Bludgeon_HRG_Crossboom),CompletionAmount=7000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_HRG_Kaboomstick, KFDT_Ballistic_HRG_Kaboomstick,KFDT_Explosive_HRG_Kaboomstick,KFDT_Bludgeon_HRG_Kaboomstick),CompletionAmount=9000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_RocketLauncher_RPG7, KFDT_Ballistic_RPG7Impact,KFDT_Explosive_RPG7,KFDT_Explosive_RPG7BackBlast,KFDT_Bludgeon_RPG7),CompletionAmount=7500))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_AssaultRifle_M16M203, KFDT_Ballistic_M16M203,KFDT_Bludgeon_M16M203,KFDT_Ballistic_M203Impact,KFDT_Explosive_M16M203),CompletionAmount=9000)) //7000
@ -2124,6 +2129,7 @@ defaultproperties
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Bow_Crossbow, KFDT_Bludgeon_Crossbow,KFDT_Piercing_Crossbow),CompletionAmount=7000)) //5000
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_M14EBR, KFDT_Bludgeon_M14EBR,KFDT_Ballistic_M14EBR),CompletionAmount=9000)) //7000
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_SonicGun, KFDT_Bludgeon_HRG_SonicGun, KFDT_Ballistic_HRG_SonicGun_SonicBlastUncharged, KFDT_Ballistic_HRG_SonicGun_SonicBlastHalfCharged, KFDT_Ballistic_HRG_SonicGun_SonicBlastFullyCharged),CompletionAmount=7000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_CranialPopper, KFDT_Bludgeon_HRG_CranialPopper,KFDT_Piercing_HRG_CranialPopper,KFDT_Blast_HRG_CranialPopper),CompletionAmount=7000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_RailGun, KFDT_Bludgeon_RailGun,KFDT_Ballistic_RailGun),CompletionAmount=5000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_CenterfireMB464, KFDT_Bludgeon_CenterfireMB464,KFDT_Ballistic_CenterfireMB464),CompletionAmount=7000)) //5000
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_M99, KFDT_Bludgeon_M99,KFDT_Ballistic_M99),CompletionAmount=5000))
@ -2277,6 +2283,9 @@ defaultproperties
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CARILLONHAMLET),CompletionAmount=1))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CARILLONHAMLET),CompletionAmount=2))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CARILLONHAMLET),CompletionAmount=3))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-RIG),CompletionAmount=1))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-RIG),CompletionAmount=2))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-RIG),CompletionAmount=3))
//Versus Damage
// Per design doc that I have right now, these are x class damage y players, not damage y amount

View File

@ -72,4 +72,5 @@ defaultproperties
Properties.Add((PropertyId = STATID_ACHIEVE_MoonbaseCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_NetherholdCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_CarillonHamletCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_RigCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
}

View File

@ -99,6 +99,10 @@ struct StatAdjustments
/** WeakPoints to show special VFX*/
var() array<WeakPoint> WeakPoints;
/** Score given when killed on GunGame weekly */
var() byte GunGameKilledScore;
var() byte GunGameAssistanceScore;
structdefaultproperties
{
HealthScale = 1.f;
@ -118,6 +122,8 @@ struct StatAdjustments
DoshGiven=INDEX_NONE
InitialGroundSpeedModifierScale = 1.0
GunGameKilledScore = 0;
GunGameAssistanceScore = 0;
}
};
@ -140,6 +146,24 @@ struct BossRushOverrides
var() array <BossRushOverridesPerWave> PerWaves;
};
struct GunGameLevel
{
var() int RequiredScore;
var() array< class<KFWeaponDefinition> > GrantedWeapons;
};
struct GunGameRespawnLevel
{
var() int Wave;
var() int Level;
};
struct GunGamePerkData
{
var() array<GunGameLevel> GunGameLevels;
var() array<GunGameRespawnLevel> GunGameRespawnLevels;
};
/** Individual property overrides that drive other behavior to allow for
* a large amount of variety in our weekly event mode.
*/
@ -210,6 +234,9 @@ struct WeeklyOverrides
/** Whether or not to skip opening of the trader */
var() bool bDisableTraders;
/** Whether or not to force show skip trader button */
var() bool bForceShowSkipTrader;
/** When to reset pickups */
var() PickupResetTime PickupResetTime;
@ -394,6 +421,12 @@ struct WeeklyOverrides
/** Global modifier of dosh received by players when a zed is killed. Default value is 1.0 */
var() float DoshOnKillGlobalModifier;
/** Disable Add Dosh */
var() bool bDisableAddDosh;
/** Disable Throw Weapon */
var() bool bDisableThrowWeapon;
/** Delay After a wave starts for applying global damage. */
var() float DamageDelayAfterWaveStarted;
@ -411,9 +444,24 @@ struct WeeklyOverrides
var() BossRushOverrides BossRushOverrideParams;
/** */
var() bool bGunGameMode;
/** Information about each level in Gun Game Mode */
var() GunGamePerkData GunGamePerksData;
/** Ignores damage caused by headshots. */
var() bool bInvulnerableHeads;
/** Trade time override. */
var() float TraderTimeModifier;
/** Time between waves override. */
var() float TimeBetweenWaves;
/** Wether or not we only can spawn Armor on the Item pickups */
var() bool bOnlyArmorItemPickup;
structdefaultproperties
{
GameLength = GL_Short
@ -471,7 +519,14 @@ struct WeeklyOverrides
DroppedItemLifespan=-1.0f
bForceWWLMusic = false;
bBossRushMode = false;
bDisableAddDosh = false;
bDisableThrowWeapon = false;
bGunGameMode = false;
bInvulnerableHeads = false;
TraderTimeModifier = 1.f;
TimeBetweenWaves = -1.f;
bOnlyArmorItemPickup=false;
bForceShowSkipTrader = false;
}
};
@ -485,12 +540,14 @@ struct CachedOutbreakInfo
var float CachedWorldGravityZ;
var float CachedGlobalGravityZ;
var PerkAvailableData PerksAvailableData;
var bool bForceShowSkipTrader;
structdefaultproperties
{
bTradersEnabled=true,
bTradersEnabled=true
bAllowGrenadePurchase=true
GameAmmoCostScale=1.0
bForceShowSkipTrader=false
}
};
@ -506,7 +563,7 @@ var WeeklyOverrides ActiveEvent;
/** Stored values of World Info and GRI items incase we need to reset it. */
var CachedOutbreakInfo CachedItems;
function SetActiveEvent(int ActiveEventIdx)
function int SetActiveEvent(int ActiveEventIdx)
{
`if(`notdefined(ShippingPC))
local string LocalURL;
@ -537,6 +594,8 @@ function SetActiveEvent(int ActiveEventIdx)
ActiveEvent = SetEvents[ActiveEventIdx];
}
`endif
return ActiveEventIdx;
}
function ClearActiveEvent()
@ -562,6 +621,7 @@ function ClearActiveEvent()
KFGameReplicationInfo(GameReplicationInfo).bAllowGrenadePurchase = CachedItems.bAllowGrenadePurchase;
KFGameReplicationInfo(GameReplicationInfo).bTradersEnabled = CachedItems.bTradersEnabled;
KFGameReplicationInfo(GameReplicationInfo).MaxPerkLevel = CachedItems.MaxPerkLevel;
KFGameReplicationInfo(GameReplicationInfo).bForceShowSkipTrader = CachedItems.bForceShowSkipTrader;
}
ActiveEvent = EmptyEvent;
@ -588,6 +648,7 @@ function CacheGRI()
CachedItems.bAllowGrenadePurchase = KFGameReplicationInfo(GameReplicationInfo).bAllowGrenadePurchase;
CachedItems.bTradersEnabled = KFGameReplicationInfo(GameReplicationInfo).bTradersEnabled;
CachedItems.MaxPerkLevel = KFGameReplicationInfo(GameReplicationInfo).MaxPerkLevel;
CachedItems.bForceShowSkipTrader = KFGameReplicationInfo(GameReplicationInfo).bForceShowSkipTrader;
}
}
@ -641,6 +702,7 @@ function UpdateGRI()
KFGRI.bAllowGrenadePurchase = !ActiveEvent.bDisableGrenades;
KFGRI.bTradersEnabled = !ActiveEvent.bDisableTraders;
KFGRI.MaxPerkLevel = ActiveEvent.MaxPerkLevel;
KFGRI.bForceShowSkipTrader = ActiveEvent.bForceShowSkipTrader;
}
}
@ -893,6 +955,9 @@ function AdjustDefaults(out KFPawn_Monster P, array <StatAdjustments> Adjustment
P.HealByAssistance = ToAdjust.HealByAssistance;
P.InitialGroundSpeedModifier *= ToAdjust.InitialGroundSpeedModifierScale;
P.GunGameKilledScore = ToAdjust.GunGameKilledScore;
P.GunGameAssistanceScore = ToAdjust.GunGameAssistanceScore;
if (ToAdjust.bStartEnraged)
{
//If we aren't using the AI controller's spawn enrage, go into the pawn

View File

@ -880,6 +880,12 @@ var repnotify byte WeaponSpecialAction;
********************************************************************************************* */
var transient byte LastHitZoneIndex;
/**
AutoTurret
*/
var const bool bIsTurret;
replication
{
// Replicated to ALL
@ -887,7 +893,7 @@ replication
AmbientSound, WeaponClassForAttachmentTemplate, bIsSprinting, InjuredHitZones,
KnockdownImpulse, ReplicatedSpecialMove, bEmpDisrupted, bEmpPanicked, bFirePanicked,
RepFireBurnedAmount, bUnaffectedByZedTime, bMovesFastInZedTime, IntendedBodyScale,
IntendedHeadScale, AttackSpeedModifier, bHasStartedFire, PowerUpAmbientSound;
IntendedHeadScale, AttackSpeedModifier, bHasStartedFire, PowerUpAmbientSound, BodyScaleChangePerSecond;
if ( bNetDirty && WorldInfo.TimeSeconds < LastTakeHitTimeout )
HitFxInfo, HitFxRadialInfo, HitFxInstigator, HitFxAddedRelativeLocs, HitFxAddedHitCount;
if ( Physics == PHYS_RigidBody && !bTearOff )
@ -2696,6 +2702,7 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
HitFxInfo.HitBoneIndex = HZI_HEAD;
}
`endif
// NVCHANGE_BEGIN - RLS - Debugging Effects
bAllowHeadshot = CanCountHeadshots();
OldHealth = Health;
@ -2778,6 +2785,12 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
}
InstigatorMonster = InstigatedBy == none ? none : KFPawn_Monster(InstigatedBy.Pawn);
if (InDamage > 0 && InstigatedBy != none && InstigatedBy.Pawn.IsA('KFPawn_Human'))
{
InDamage = InDamage * AfflictionHandler.GetAfflictionDamageTakenModifier();
}
if( InDamage > 0 && InstigatorMonster != None )
{
// Increase AI damage by AI Damage modifiers
@ -5393,6 +5406,8 @@ simulated function StopExtraVFX(Name FXLabel)
}
}
simulated function SetTurretWeaponAttachment(class<KFWeapon> WeaponClass) {}
defaultproperties
{
InventoryManagerClass=class'KFInventoryManager'
@ -5648,11 +5663,15 @@ defaultproperties
// Visuals
IntendedBodyScale=1.0
CurrentBodyScale=1.0
BodyScaleChangePerSecond=0.5
BodyScaleChangePerSecond=0.5f
IntendedHeadScale=1.0
CurrentHeadScale=1.0
bAllowDeathSM=true
bCanBePinned=false
LastHitZoneIndex=0
// ---------------------------------------------
// AutoTurret
bIsTurret=false
}

View File

@ -471,6 +471,14 @@ function AddDefaultInventory()
DefaultInventory.AddItem(class<Inventory>(DynamicLoadObject("KFGameContent.KFInventory_Money", class'Class')));
Super.AddDefaultInventory();
if (GameInfo.OutbreakEvent != none && GameInfo.OutbreakEvent.ActiveEvent.bGunGameMode)
{
if (KFPlayerController_WeeklySurvival(Controller) != none)
{
KFPlayerController_WeeklySurvival(Controller).UpdateInitialHeldWeapon();
}
}
}
/** When switching weapon modify GroundSpeed by encumbrance level */
@ -491,6 +499,12 @@ simulated function bool CanThrowWeapon()
{
local KFPlayerController KFPC;
if (KFGameInfo(WorldInfo.Game).OutbreakEvent != none
&& KFGameInfo(WorldInfo.Game).OutbreakEvent.ActiveEvent.bDisableThrowWeapon)
{
return false;
}
KFPC = KFPlayerController(Controller);
if (KFPC != none && KFPC.MyGFxManager != none && KFPC.MyGFxManager.TraderMenu != none && KFPC.MyGFxManager.CurrentMenu == KFPC.MyGFxManager.TraderMenu)
{
@ -2128,11 +2142,11 @@ client reliable function ClientOverrideHumanDefaults()
{
return;
}
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
if (KFGRI != none && KFGRI.CurrentWeeklyIndex == 12)
{
if (KFGRI != none && KFGRI.CurrentWeeklyIndex == 12)
{
KFPRI = KFPlayerReplicationInfo(KFPC_WS.PlayerReplicationInfo);
if (KFPRI != none)
{
@ -2144,7 +2158,7 @@ client reliable function ClientOverrideHumanDefaults()
KFPRI.SetWeeklyCharacterAttachment(CowboyHatIndex, 0);
}
}
}
}
}
defaultproperties

View File

@ -95,6 +95,9 @@ var int HealByAssistance;
/** WWL Hat attach name*/
var name ZEDCowboyHatAttachName;
/** GunGameMode: score given when killed */
var byte GunGameKilledScore;
var byte GunGameAssistanceScore;
/**
* Information on resistant or vulnerable damage types
@ -568,6 +571,13 @@ var transient array<ParticleSystemComponent> WeakPointVFXComponents;
var repnotify WeakPoint WeakPoints_TS[`TINY_SKULL_MAX_WEAKPOINTS];
var ParticleSystem WeakPointParticleTemplate;
/*********************************************************************************************
* @name ShrinkRayGun
********************************************************************************************* */
var bool bCanBeKilledByShrinking;
var float ShrinkEffectModifier;
/*********************************************************************************************
* @name Delegates
********************************************************************************************* */
@ -2050,6 +2060,7 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
local KFAIController KFAIC;
local KFPawn_Monster KFPM;
local float NapalmCheckDist;
local float InfernoRadius;
AIMonster = KFAIController_Monster(InstigatedBy);
KFDT = class<KFDamageType>(DamageType);
@ -2098,9 +2109,9 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
&& DamageCauser != none
&& KFDT != none
&& KFDT.default.DoT_Type == DOT_Fire
&& KFDT != class'KFDT_Fire_Napalm'
&& WorldInfo.RealTimeSeconds - LastNapalmInfectCheckTime > 0.25f )
&& KFDT != class'KFDT_Fire_Napalm')
{
if( KFPC != none
&& KFPC.GetPerk() != none
&& KFPC.GetPerk().CanSpreadNapalm()
@ -2130,6 +2141,29 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
}
}
if( Damage > 0
&& InstigatedBy != none
&& KFDT != none
&& KFDT.default.DoT_Type == DOT_Fire
&& KFDT != class'KFDT_Fire_Napalm'
&& KFPC != none
&& KFPC.GetPerk() != none
&& KFPC.GetPerk().CanSpreadInferno()
&& class'KFPerk'.static.IsDamageTypeOnThisPerk(KFDT, class'KFPerk_Firebug') )
{
InfernoRadius = CylinderComponent.CollisionRadius + class'KFPerk_Firebug'.static.GetInfernoRadius();
//PawnOwner.DrawDebugSphere(PawnOwner.Location, InfernoRadius, 20, 255, 255, 0, true);
foreach CollidingActors(class'KFPawn_Monster', KFPM, InfernoRadius, Location, true,,)
{
KFPM.ApplyDamageOverTime(Damage,
KFPC,
KFDT);
}
}
KFPRI = KFPlayerReplicationInfo( PlayerReplicationInfo );
if( KFPRI != none )
{
@ -4907,7 +4941,8 @@ DefaultProperties
IncapSettings(AF_Microwave)=(Cooldown=5.0, Duration=5.0,)
IncapSettings(AF_Freeze)=(Cooldown=5.0)
IncapSettings(AF_Snare)=(Cooldown=5.0, Duration=5.0,)
IncapSettings(AF_BigHead)=(Cooldown=0.0, Duration=10.0)
IncapSettings(AF_Shrink)=(Cooldown=0.0, Duration=10.0)
// ---------------------------------------------
// Movement / Physics
bCanCrouch=false
@ -5052,4 +5087,10 @@ DefaultProperties
ZEDCowboyHatAttachName=HEAD_Attach
WeakPointParticleTemplate=ParticleSystem'FX_Gameplay_EMIT.FX_Weak_Indicator'
GunGameKilledScore=0
GunGameAssistanceScore=0
bCanBeKilledByShrinking=true
ShrinkEffectModifier=1.0f
}

View File

@ -445,4 +445,6 @@ defaultproperties
bCanBePinned=false
VortexAttracionModifier=0.3f
bCanBeKilledByShrinking=false
}

View File

@ -461,6 +461,39 @@ static function bool IsBackupWeapon( KFWeapon KFW )
return KFW != none && KFW.default.bIsBackupWeapon;
}
/**
* @brief Return if a weapon is a knife
*
* @param KFW Weapon to check
* @return true if knife weapon
*/
static simulated public function bool IsKnife( KFWeapon KFW )
{
return KFW != none && KFW.default.bIsBackupWeapon && KFW.IsMeleeWeapon();
}
/**
* @brief Return if a weapon is a welder
*
* @param KFW Weapon to check
* @return true if knife weapon
*/
static simulated public function bool IsWelder( KFWeapon KFW )
{
return KFW != none && KFW.Class.Name == 'KFWeap_Welder';
}
/**
* @brief Return if a weapon is the syringe
*
* @param KFW Weapon to check
* @return true if syringe weapon
*/
static simulated public function bool IsSyringe( KFWeapon KFW )
{
return KFW != none && KFW.Class.Name == 'KFWeap_Healer_Syringe';
}
/**
* @brief Return if a weapon is Dual 9mm
*
@ -505,6 +538,29 @@ static function bool IsDoshinegun( KFWeapon KFW )
return KFW != none && KFW.Class.Name == 'KFWeap_AssaultRifle_Doshinegun';
}
/**
* @brief Return if a weapon is Crossboom (special case for high rounds perk)
*
* @param KFW Weapon to check
* @return true if backup weapon
*/
static function bool IsHRGCrossboom( KFWeapon KFW )
{
return KFW != none && KFW.Class.Name == 'KFWeap_HRG_Crossboom';
}
/**
* @brief Return if a weapon is AutoTurret (should ignore ammo upgrades)
*
* @param KFW Weapon to check
* @return true if backup weapon
*/
static function bool IsAutoTurret( KFWeapon KFW )
{
return KFW != none && KFW.Class.Name == 'KFWeap_AutoTurret';
}
/*********************************************************************************************
* @name Build / Level Management - Apply and save the updated build and level
********************************************************************************************* */
@ -789,7 +845,7 @@ simulated final function int GetSavedBuild()
simulated event PreBeginPlay()
{
// Set the grenade class for this perk
GrenadeClass = class<KFProj_Grenade>(DynamicLoadObject(GrenadeWeaponDef.default.WeaponClassPath, class'Class'));
GrenadeClass = class<KFProj_Grenade>(DynamicLoadObject(GetGrenadeClassPath(), class'Class'));
PerkIcon = Texture2D(DynamicLoadObject(GetPerkIconPath(), class'Texture2D'));
MyKFGRI = KFGameReplicationInfo(WorldInfo.GRI);
@ -1020,6 +1076,12 @@ simulated function string GetKnifeWeaponClassPath()
return KnifeWeaponDef.default.WeaponClassPath;
}
/* Returns the primary weapon's class path for this perk */
simulated function string GetGrenadeClassPath()
{
return GrenadeWeaponDef.default.WeaponClassPath;
}
simulated function bool PerkNeedsTick(){ return false; }
/**
@ -1208,6 +1270,7 @@ simulated function bool IsFlarotovActive(){ return false; }
function float GetDoTScalerAdditions(class<KFDamageType> KFDT);
function bool GetFireStumble( optional KFPawn KFP, optional class<DamageType> DamageType ){ return false; }
function bool CanSpreadNapalm(){ return false; }
function bool CanSpreadInferno(){ return false; }
function bool CouldBeZedShrapnel( class<KFDamageType> KFDT ){ return false; }
simulated function bool ShouldShrapnel(){ return false; }
simulated function float GetSplashDamageModifier(){ return 1.f; }
@ -1293,6 +1356,11 @@ function OnWaveEnded();
function OnWaveStart();
/**
* Notifications for Wave start / end but on client
*/
simulated function OnClientWaveEnded();
simulated function bool GetUsingTactialReload( KFWeapon KFW )
{
return false;
@ -1493,6 +1561,46 @@ simulated function FormatPerkSkills()
simulated function PlayerDied(){}
static simulated function bool CanChoosePrimaryWeapon()
{
return false;
}
static simulated function bool CanChooseGrenade()
{
return false;
}
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 function byte GetGrenadeSelectedIndex() { return 255;}
simulated function InitializeGrenades();
static simulated function string GetPrimaryWeaponName(byte Idx)
{
return default.PrimaryWeaponDef.static.GetItemName();
}
static simulated function string GetPrimaryWeaponImagePath(byte Idx)
{
return default.PrimaryWeaponDef.static.GetImagePath();
}
static simulated function string GetGrenadeWeaponName(byte Idx)
{
return default.GrenadeWeaponDef.static.GetItemName();
}
static simulated function string GetGrenadeWeaponImagePath(byte Idx)
{
return default.GrenadeWeaponDef.static.GetImagePath();
}
DefaultProperties
{
bTickIsDisabled=TRUE

View File

@ -251,7 +251,8 @@ simulated function ModifyMagSizeAndNumber( KFWeapon KFW, out int MagazineCapacit
TempCapacity = MagazineCapacity;
// FAMAS needs its secondary ammo affected
if( (!bSecondary || IsFAMAS(KFW)) && IsWeaponOnPerk( KFW, WeaponPerkClass, self.class ) && (KFW == none || !KFW.bNoMagazine) )
// Autoturret cannot modify its magazine capacity
if( (!bSecondary || IsFAMAS(KFW)) && !IsAutoTurret(KFW) && IsWeaponOnPerk( KFW, WeaponPerkClass, self.class ) && (KFW == none || !KFW.bNoMagazine) )
{
if( IsLargeMagActive() )
{
@ -260,9 +261,10 @@ simulated function ModifyMagSizeAndNumber( KFWeapon KFW, out int MagazineCapacit
if( IsEatLeadActive() )
{
TempCapacity += MagazineCapacity * GetSkillValue( PerkSkills[ECommandoEatLead] );
TempCapacity += MagazineCapacity * GetSkillValue( PerkSkills[ECommandoEatLead] );
}
}
MagazineCapacity = Round(TempCapacity);
}

View File

@ -126,6 +126,7 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
{
local KFWeapon KFW;
local float TempDamage;
local bool bIsCrossboom;
if( DamageType != none && IsDamageIgnoredDT( DamageType ) )
{
@ -140,7 +141,9 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
KFW = GetWeaponFromDamageCauser( DamageCauser );
}
if( (KFW != none && IsWeaponOnPerk( KFW,, self.class )) || (DamageType != none && IsDamageTypeOnPerk( DamageType )) )
bIsCrossboom = IsHRGCrossboom(KFW);
if( (KFW != none && (IsWeaponOnPerk( KFW,, self.class )) || bIsCrossboom) || (DamageType != none && IsDamageTypeOnPerk( DamageType )) )
{
`QALog( "Base Damage Given" @ DamageType @ KFW @ InDamage, bLogPerk );
//Passive
@ -153,9 +156,9 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
`QALog( "Bombadier Given" @ DamageType @ KFW @ InDamage * GetSkillValue( PerkSkills[EDemoDamage] ), bLogPerk );
}
if( IsDirectHitActive() && DamageType != none && IsDamageTypeOnPerk( DamageType ) )
if( IsDirectHitActive() && ((DamageType != none && IsDamageTypeOnPerk( DamageType )) || bIsCrossboom ))
{
if( class<KFDT_Ballistic_Shell>(DamageType) != none || class<KFDT_Bludgeon>(DamageType)!=none)
if( class<KFDT_Ballistic_Shell>(DamageType) != none || class<KFDT_Bludgeon>(DamageType)!=none || (bIsCrossboom && class<KFDT_Piercing>(DamageType) != none))
{
TempDamage += InDamage * GetSkillValue( PerkSkills[EDemoDirectHit] );
`QALog( "High Impact Damage Given" @ DamageType @ KFW @ InDamage * GetSkillValue( PerkSkills[EDemoDirectHit] ), bLogPerk );

View File

@ -32,7 +32,8 @@ var private const class<DamageType> SnareCausingDmgTypeClass;
var private const int NapalmDamage;
/** Multiplier on CylinderComponent.CollisionRadius to check for infecting other zeds */
var private const float NapalmCheckCollisionScale;
// Radius in cm to check for, this is added to CylinderComponent.CollisionRadius
var private const float InfernoRadius;
enum EFirebugSkills
{
@ -294,11 +295,21 @@ function bool CanSpreadNapalm()
return IsNapalmActive();
}
function bool CanSpreadInferno()
{
return IsInfernoActive();
}
static final function float GetNapalmCheckCollisionScale()
{
return default.NapalmCheckCollisionScale;
}
static final function float GetInfernoRadius()
{
return default.InfernoRadius;
}
/**
* @brief Checks if a zed could potentially explode later
*
@ -634,6 +645,7 @@ DefaultProperties
NapalmDamage=7 //50
NapalmCheckCollisionScale=2.0f //6.0
InfernoRadius=800.0f
ShrapnelChance=0.3f //0.2

View File

@ -806,7 +806,7 @@ simulated function bool ShouldDisableZedTimeSkillsForWildWest()
{
if (WorldInfo.NetMode == NM_Client)
{
return MyKFGRI.bIsWeeklyMode && class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12;
return MyKFGRI.bIsWeeklyMode && MyKFGRI.CurrentWeeklyIndex == 12;
}
else
{

View File

@ -696,7 +696,7 @@ function bool ShouldDisableZedTimeSkillsForWildWest()
{
if (WorldInfo.NetMode == NM_Client)
{
return MyKFGRI.bIsWeeklyMode && class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12;
return MyKFGRI.bIsWeeklyMode && MyKFGRI.CurrentWeeklyIndex == 12;
}
else
{
@ -708,7 +708,7 @@ simulated function bool IsFanfareActiveForWildWest()
{
if (WorldInfo.NetMode == NM_Client)
{
return MyKFGRI.bIsWeeklyMode && class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12;
return MyKFGRI.bIsWeeklyMode && MyKFGRI.CurrentWeeklyIndex == 12;
}
else
{

View File

@ -423,7 +423,7 @@ simulated function Interact( KFPawn_Human KFPH )
{
foreach KFPH.InvManager.InventoryActors( class'KFWeapon', KFW )
{
if( KFW.static.DenyPerkResupply() )
if( KFW.DenyPerkResupply() )
{
continue;
}

View File

@ -47,14 +47,24 @@ var class<KFWeaponDefinition> HealingGrenadeWeaponDef;
var class<KFWeaponDefinition> MolotovGrenadeWeaponDef;
var private const array<class<KFWeaponDefinition> > PrimaryWeaponPaths;
var private const array<class<KFWeaponDefinition> > GrenadeWeaponPaths;
var private const array<string> KnifeWeaponPaths;
var int StartingWeaponClassIndex;
var byte StartingWeaponClassIndex;
var byte StartingGrenadeClassIndex; // This is the cached value for the tentative Grenade selection (only applied when gameplay time)
var byte CurrentGrenadeClassIndex; // This is the gameplay value we use for Grenade Index, it can only be changed while TraderTime / Wave Start / Wave Ended
var private const array<name> TacticalReloadAsReloadRateClassNames;
/** When MakeThingsGoBoom skill is selected the survivalist gets additional explosive resistance */
var private const float MakeThingsGoBoomExplosiveResistance;
var private const byte MedicGrenadeIndex;
var private const byte FirebugGrenadeIndex;
var private transient bool bIsGrenadeDirty;
`define WEAP_IDX_NONE 255
/*********************************************************************************************
* @name Perk init and spawning
******************************************************************************************** */
@ -105,7 +115,11 @@ function bool ShouldGetAllTheXP()
/* Returns the primary weapon's class path for this perk */
simulated function string GetPrimaryWeaponClassPath()
{
StartingWeaponClassIndex = Rand(PrimaryWeaponPaths.length);
if (StartingWeaponClassIndex == `WEAP_IDX_NONE)
{
StartingWeaponClassIndex = Rand(PrimaryWeaponPaths.length);
}
AutoBuyLoadOutPath.InsertItem(0,PrimaryWeaponPaths[StartingWeaponClassIndex]);
return PrimaryWeaponPaths[StartingWeaponClassIndex].default.WeaponClassPath;
}
@ -556,16 +570,7 @@ simulated function float GetSnarePowerModifier( optional class<DamageType> Damag
/* Returns the grenade class for this perk */
simulated function class< KFProj_Grenade > GetGrenadeClass()
{
if( IsAmmoVestActive() )
{
return class<KFProj_Grenade>(DynamicLoadObject(HealingGrenadeWeaponDef.default.WeaponClassPath, class'Class'));
}
else if( IsBigPocketsActive() )
{
return class<KFProj_Grenade>(DynamicLoadObject(MolotovGrenadeWeaponDef.default.WeaponClassPath, class'Class'));
}
return GrenadeClass;
return class<KFProj_Grenade>(DynamicLoadObject(GrenadeWeaponPaths[CurrentGrenadeClassIndex].default.WeaponClassPath, class'Class'));
}
/**
@ -744,41 +749,379 @@ simulated static function GetPassiveStrings( out array<string> PassiveValues, ou
simulated function string GetGrenadeImagePath()
{
if( IsAmmoVestActive() )
{
return default.HealingGrenadeWeaponDef.Static.GetImagePath();
}
else if( IsBigPocketsActive() )
{
return default.MolotovGrenadeWeaponDef.Static.GetImagePath();
}
return default.GrenadeWeaponDef.Static.GetImagePath();
return CurrentGrenadeClassIndex == `WEAP_IDX_NONE ? default.GrenadeWeaponDef.static.GetImagePath() : default.GrenadeWeaponPaths[CurrentGrenadeClassIndex].static.GetImagePath();
}
simulated function class<KFWeaponDefinition> GetGrenadeWeaponDef()
{
if( IsAmmoVestActive() )
{
return default.HealingGrenadeWeaponDef;
}
else if( IsBigPocketsActive() )
{
return default.MolotovGrenadeWeaponDef;
return GrenadeWeaponPaths[CurrentGrenadeClassIndex];
}
static simulated function bool CanChoosePrimaryWeapon()
{
return true;
}
static simulated function bool CanChooseGrenade()
{
return true;
}
simulated function byte OnPrevWeaponSelected()
{
if (StartingWeaponClassIndex == `WEAP_IDX_NONE)
{
StartingWeaponClassIndex = PrimaryWeaponPaths.Length - 1;
}
else if (StartingWeaponClassIndex == 0)
{
StartingWeaponClassIndex = `WEAP_IDX_NONE;
}
else
{
--StartingWeaponClassIndex;
}
return default.GrenadeWeaponDef;
return StartingWeaponClassIndex;
}
simulated function byte OnNextWeaponSelected()
{
if (StartingWeaponClassIndex == `WEAP_IDX_NONE)
{
StartingWeaponClassIndex = 0;
}
else if (StartingWeaponClassIndex == PrimaryWeaponPaths.Length - 1)
{
StartingWeaponClassIndex = `WEAP_IDX_NONE;
}
else
{
++StartingWeaponClassIndex;
}
return StartingWeaponClassIndex;
}
simulated function byte OnPrevGrenadeSelected()
{
if (StartingGrenadeClassIndex == `WEAP_IDX_NONE)
{
StartingGrenadeClassIndex = GrenadeWeaponPaths.Length - 1;
}
else
{
--StartingGrenadeClassIndex;
if (StartingGrenadeClassIndex == FirebugGrenadeIndex && !IsBigPocketsActive())
{
--StartingGrenadeClassIndex;
}
if (StartingGrenadeClassIndex == MedicGrenadeIndex && !IsAmmoVestActive())
{
--StartingGrenadeClassIndex;
}
if (StartingGrenadeClassIndex > GrenadeWeaponPaths.Length - 1)
{
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
}
}
bIsGrenadeDirty=true;
return StartingGrenadeClassIndex;
}
simulated function byte OnNextGrenadeSelected()
{
if (StartingGrenadeClassIndex == `WEAP_IDX_NONE)
{
StartingGrenadeClassIndex = 0;
}
else
{
++StartingGrenadeClassIndex;
if (StartingGrenadeClassIndex == MedicGrenadeIndex && !IsAmmoVestActive())
{
++StartingGrenadeClassIndex;
}
if (StartingGrenadeClassIndex == FirebugGrenadeIndex && !IsBigPocketsActive())
{
++StartingGrenadeClassIndex;
}
if (StartingGrenadeClassIndex > GrenadeWeaponPaths.Length - 1)
{
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
}
}
bIsGrenadeDirty=true;
return StartingGrenadeClassIndex;
}
static simulated function string GetPrimaryWeaponName(byte Idx)
{
return Idx == `WEAP_IDX_NONE ? default.PrimaryWeaponDef.static.GetItemName() : default.PrimaryWeaponPaths[Idx].static.GetItemName();
}
static simulated function string GetPrimaryWeaponImagePath(byte Idx)
{
return Idx == `WEAP_IDX_NONE ? default.PrimaryWeaponDef.static.GetImagePath() : default.PrimaryWeaponPaths[Idx].static.GetImagePath();
}
static simulated function string GetGrenadeWeaponName(byte Idx)
{
return Idx == `WEAP_IDX_NONE ? default.GrenadeWeaponDef.static.GetItemName() : default.GrenadeWeaponPaths[Idx].static.GetItemName();
}
static simulated function string GetGrenadeWeaponImagePath(byte Idx)
{
return Idx == `WEAP_IDX_NONE ? default.GrenadeWeaponDef.static.GetImagePath() : default.GrenadeWeaponPaths[Idx].static.GetImagePath();
}
/* Returns the primary weapon's class path for this perk */
simulated function string GetGrenadeClassPath()
{
return GrenadeWeaponPaths[StartingGrenadeClassIndex].default.WeaponClassPath;
}
simulated function byte GetGrenadeSelectedIndex() { return CurrentGrenadeClassIndex; }
simulated function byte SetWeaponSelectedIndex(byte idx)
{
if (idx >= default.PrimaryWeaponPaths.Length && idx < 255)
{
StartingWeaponClassIndex = 0;
}
else if (idx == 255)
{
StartingWeaponClassIndex = `WEAP_IDX_NONE;
}
else
{
StartingWeaponClassIndex = idx;
}
ServerUpdateCurrentWeapon(StartingWeaponClassIndex);
return StartingWeaponClassIndex;
}
simulated function byte SetGrenadeSelectedIndex(byte idx)
{
local KFGameReplicationInfo KFGRI;
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
if (idx >= default.GrenadeWeaponPaths.Length && idx < 255)
{
StartingGrenadeClassIndex = 0;
}
else if (idx == 255)
{
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
}
else
{
StartingGrenadeClassIndex = idx;
if (StartingGrenadeClassIndex == MedicGrenadeIndex || StartingGrenadeClassIndex == FirebugGrenadeIndex)
{
if (IsAmmoVestActive())
{
StartingGrenadeClassIndex = MedicGrenadeIndex;
}
else if (IsBigPocketsActive())
{
StartingGrenadeClassIndex = FirebugGrenadeIndex;
}
else
{
StartingGrenadeClassIndex = 0;
}
}
}
// If we are in no gameplay time insta change
if (!KFGRI.bWaveIsActive)
{
UpdateCurrentGrenade();
}
return StartingGrenadeClassIndex;
}
simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
{
local KFGameReplicationInfo KFGRI;
local bool AmmoVestActive, BigPocketsActive;
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
AmmoVestActive = false;
BigPocketsActive = false;
if (idx >= default.GrenadeWeaponPaths.Length && idx < 255)
{
StartingGrenadeClassIndex = 0;
}
else if (idx == 255)
{
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
}
else
{
StartingGrenadeClassIndex = idx;
if (StartingGrenadeClassIndex == MedicGrenadeIndex || StartingGrenadeClassIndex == FirebugGrenadeIndex)
{
AmmoVestActive = InSelectedSkills[2] == 1;
BigPocketsActive = InSelectedSkills[2] == 2;
if (IsChoosingPrev)
{
if (StartingGrenadeClassIndex == FirebugGrenadeIndex)
{
if (BigPocketsActive == false)
{
--StartingGrenadeClassIndex;
}
}
if (StartingGrenadeClassIndex == MedicGrenadeIndex)
{
if (AmmoVestActive == false)
{
--StartingGrenadeClassIndex;
}
}
}
else if (IsChoosingNext)
{
if (StartingGrenadeClassIndex == MedicGrenadeIndex)
{
if (AmmoVestActive == false)
{
++StartingGrenadeClassIndex;
}
}
if (StartingGrenadeClassIndex == FirebugGrenadeIndex)
{
if (BigPocketsActive == false)
{
++StartingGrenadeClassIndex;
}
}
}
else
{
if (AmmoVestActive)
{
StartingGrenadeClassIndex = MedicGrenadeIndex;
}
else if (BigPocketsActive)
{
StartingGrenadeClassIndex = FirebugGrenadeIndex;
}
else
{
StartingGrenadeClassIndex = 0;
}
}
if (StartingGrenadeClassIndex > GrenadeWeaponPaths.Length - 1)
{
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
}
}
}
// If we are in no gameplay time insta change
if (!KFGRI.bWaveIsActive)
{
UpdateCurrentGrenade();
}
return StartingGrenadeClassIndex;
}
simulated function InitializeGrenades()
{
local byte MaxValue;
if (StartingGrenadeClassIndex == `WEAP_IDX_NONE && ( bIsGrenadeDirty || CurrentGrenadeClassIndex == `WEAP_IDX_NONE))
{
MaxValue = (!IsAmmoVestActive() && !IsBigPocketsActive()) ? GrenadeWeaponPaths.length - 1 : GrenadeWeaponPaths.length;
CurrentGrenadeClassIndex = Rand(MaxValue);
if ( (!IsAmmoVestActive() && CurrentGrenadeClassIndex == MedicGrenadeIndex) ||
(!IsBigPocketsActive() && CurrentGrenadeClassIndex == FirebugGrenadeIndex) ||
(CurrentLevel < 15 && (CurrentGrenadeClassIndex == MedicGrenadeIndex || CurrentGrenadeClassIndex == FirebugGrenadeIndex)))
{
CurrentGrenadeClassIndex = GrenadeWeaponPaths.length - 1;
}
bIsGrenadeDirty = false;
if (Controller(Owner).IsLocalController())
{
ServerUpdateCurrentGrenade(CurrentGrenadeClassIndex);
}
}
}
simulated function OnClientWaveEnded()
{
super.OnWaveEnded();
UpdateCurrentGrenade();
}
simulated function UpdateCurrentGrenade()
{
if (StartingGrenadeClassIndex == `WEAP_IDX_NONE)
{
InitializeGrenades();
}
else if (CurrentGrenadeClassIndex != StartingGrenadeClassIndex || bIsGrenadeDirty)
{
CurrentGrenadeClassIndex = StartingGrenadeClassIndex;
if (Controller(Owner).IsLocalController())
{
ServerUpdateCurrentGrenade(CurrentGrenadeClassIndex);
}
}
}
reliable server function ServerUpdateCurrentWeapon(byte Value)
{
StartingWeaponClassIndex = Value;
}
reliable server function ServerUpdateCurrentGrenade(byte CurrentIndex)
{
CurrentGrenadeClassIndex = CurrentIndex;
}
DefaultProperties
{
StartingWeaponClassIndex=Index_None
StartingWeaponClassIndex=0
StartingGrenadeClassIndex=0
CurrentGrenadeClassIndex=0
bIsGrenadeDirty=true
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Survivalist'
PrimaryWeaponDef=class'KFWeapDef_Random'
KnifeWeaponDef=class'KFweapDef_Knife_Survivalist'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Commando'
GrenadeWeaponDef=class'KFWeapDef_RandomGrenade'
HealingGrenadeWeaponDef=class'KFWeapDef_Grenade_Medic'
MolotovGrenadeWeaponDef=class'KFWeapDef_Grenade_Firebug'
@ -856,17 +1199,27 @@ DefaultProperties
ZedTimeModifyingStates(11)="WeaponSonicGunSingleFiring"
ZedTimeModifyingStates(12)="WeaponSonicGunCharging"
PrimaryWeaponPaths(0)=class'KFWeapDef_AR15'
PrimaryWeaponPaths(1)=class'KFWeapDef_MB500'
PrimaryWeaponPaths(2)=class'KFWeapDef_Crovel'
PrimaryWeaponPaths(3)=class'KFWeapDef_HX25'
PrimaryWeaponPaths(4)=class'KFWeapDef_MedicPistol'
PrimaryWeaponPaths(0)=class'KFWeapDef_Crovel'
PrimaryWeaponPaths(1)=class'KFWeapDef_AR15'
PrimaryWeaponPaths(2)=class'KFWeapDef_MB500'
PrimaryWeaponPaths(3)=class'KFWeapDef_MedicPistol'
PrimaryWeaponPaths(4)=class'KFWeapDef_HX25'
PrimaryWeaponPaths(5)=class'KFWeapDef_CaulkBurn'
PrimaryWeaponPaths(6)=class'KFWeapDef_Remington1858Dual'
PrimaryWeaponPaths(7)=class'KFWeapDef_Winchester1894'
PrimaryWeaponPaths(8)=class'KFWeapDef_MP7'
AutoBuyLoadOutPath=(class'KFWeapDef_DragonsBreath', class'KFWeapDef_FreezeThrower', class'KFWeapDef_MedicRifle', class'KFWeapDef_LazerCutter')
GrenadeWeaponPaths(0)=class'KFWeapDef_Grenade_Commando'
GrenadeWeaponPaths(1)=class'KFWeapDef_Grenade_Support'
GrenadeWeaponPaths(2)=class'KFWeapDef_Grenade_Medic'
GrenadeWeaponPaths(3)=class'KFWeapDef_Grenade_Firebug'
GrenadeWeaponPaths(4)=class'KFWeapDef_Grenade_Gunslinger'
GrenadeWeaponPaths(5)=class'KFWeapDef_Grenade_SWAT'
MedicGrenadeIndex = 2;
FirebugGrenadeIndex = 3;
// Prestige Rewards
PrestigeRewardItemIconPaths[0]="WEP_SkinSet_Prestige01_Item_TEX.knives.SurvivalistKnife_PrestigePrecious_Mint_large"
PrestigeRewardItemIconPaths[1]="WEP_SkinSet_Prestige02_Item_TEX.tier01.FreezeThrower_PrestigePrecious_Mint_large"

View File

@ -37,17 +37,29 @@ var() bool bEnabledAtStart<EditCondition=bKismetDriven>;
/** Whether this pickup node has been modified by kismet (enabled or disabled) */
var transient bool bKismetEnabled;
function bool CanUsePickup()
{
return true;
}
/** Pick a weapon from 'ItemPickups' and enable it in the world */
function Reset()
{
if( bKismetDriven )
if (CanUsePickup())
{
SetInitialState();
if( bKismetDriven )
{
SetInitialState();
}
else
{
bToBeActivated = false;
GotoState('Pickup');
}
}
else
{
bToBeActivated = false;
GotoState('Pickup');
SetPickupHidden();
}
}

View File

@ -49,11 +49,42 @@ replication
PickupIndex;
}
function bool CanUsePickup()
{
local KFGameInfo KFGI;
local int i;
local bool has_armour;
KFGI = KFGameInfo( WorldInfo.Game );
if (KFGI != none && KFGI.OutbreakEvent != none)
{
if (KFGI.OutbreakEvent.ActiveEvent.bOnlyArmorItemPickup)
{
for (i = 0 ; i < ItemPickups.Length ; i++)
{
if (ItemPickups[i].ItemClass.Name == ArmorClassName)
{
has_armour = true;
break;
}
}
}
if (has_armour == false)
{
return false;
}
}
return super.CanUsePickup();
}
simulated event PreBeginPlay()
{
local KFGameInfo KFGI;
// For Scavenger weekly, we need to treat the factory items as non kismet items.
// For Scavenger weekly, we need to treat the factory items as non kismet items.
KFGI = KFGameInfo( WorldInfo.Game );
if (KFGI != none && KFGI.OutbreakEvent != none && KFGI.OutbreakEvent.ActiveEvent.bUnlimitedWeaponPickups)
{
@ -62,7 +93,6 @@ simulated event PreBeginPlay()
bKismetDriven=false;
}
}
////////////////////////////////////////
super.PreBeginPlay();
}
@ -152,10 +182,26 @@ function int ChooseWeaponPickup()
local int i, DesiredItemIdx;
local float Weight, TotalWeight, RandomWeight;
local array<int> IndexList;
local KFGameInfo KFGI;
KFGI = KFGameInfo(WorldInfo.Game);
DesiredItemIdx = 255;
// Add up the total weight for all valid attacks
for(i = 0; i < ItemPickups.Length; i++)
{
if (KFGI != none && KFGI.OutbreakEvent != none)
{
if (KFGI.OutbreakEvent.ActiveEvent.bOnlyArmorItemPickup)
{
if (ItemPickups[i].ItemClass.Name != 'KFInventory_Armor')
{
continue;
}
}
}
if ( ItemPickups[i].Priority > 0.f )
{
TotalWeight += ItemPickups[i].Priority;
@ -194,11 +240,26 @@ simulated native function GetPickupMesh(class<KFWeapon> ItemClass);
/** Use the pickups static mesh for this factory */
simulated function SetPickupMesh()
{
local KFGameInfo KFGI;
if (PickupIndex >= ItemPickups.Length)
{
return;
}
KFGI = KFGameInfo(WorldInfo.Game);
if (KFGI != none && KFGI.OutbreakEvent != none)
{
if (KFGI.OutbreakEvent.ActiveEvent.bOnlyArmorItemPickup)
{
if (ItemPickups[PickupIndex].ItemClass.Name != ArmorClassName)
{
return;
}
}
}
if (ItemPickups[PickupIndex].ItemClass.Name == ArmorClassName)
{
FinalizePickupMesh(StaticMeshComponent(ItemPickups[PickupIndex].ItemClass.default.PickupFactoryMesh).StaticMesh);
@ -307,12 +368,24 @@ function ActivateNewPickup(Pawn P)
{
local KFGameInfo KFGI;
KFGI = KFGameInfo( WorldInfo.Game );
if (KFGI != none && KFGI.OutbreakEvent != none)
{
if (KFGI.OutbreakEvent.ActiveEvent.bOnlyArmorItemPickup)
{
if (ItemPickups[PickupIndex].ItemClass.Name != ArmorClassName)
{
return;
}
}
}
if( bKismetDriven )
{
return;
}
KFGI = KFGameInfo( WorldInfo.Game );
if ( KFGI != none )
{
KFGI.EnableNewPickup( KFGI.ItemPickups, KFGI.DifficultyInfo.GetWeaponPickupInterval(KFGI.GetLivingPlayerCount()), self );

View File

@ -113,6 +113,10 @@ var private const bool bPerkStatsLoaded;
/** Id of previously selected perk */
var public byte SavedPerkIndex;
/** Index of the weapon chosen for the survival perk */
var public byte SurvivalPerkWeapIndex;
/** Index of the grenade chosen for the survival perk */
var public byte SurvivalPerkGrenIndex;
/** Player zed spawn params (Versus) */
var transient sPlayerZedSpawnInfo PlayerZedSpawnInfo;
@ -136,6 +140,10 @@ var protected float UnmodifiedFOV;
var transient protected int BenefactorDosh;
var private const int BenefactorDoshReq;
var array<KFPawn_Monster> KilledZeds;
var array<float> KilledZedsLastZPosition;
var KFSeaTrigger SeaTrigger;
/*********************************************************************************************
* @name UDK Variables
********************************************************************************************* */
@ -712,6 +720,14 @@ var transient bool bNoGoActive;
var transient byte StoredLocalUserNum;
/*********************************************************************************************
* @name KFWeap_Autoturret
With the trader you can buy and sell the weapon without exploding the turrets. Add them to
the controller to keep track of them rather than the weapon.
**********************************************************************************************/
var transient array<Actor> DeployedTurrets;
cpptext
{
virtual UBOOL Tick( FLOAT DeltaSeconds, ELevelTick TickType );
@ -811,6 +827,8 @@ native private function ShowPreClientTravelMovie(string URLString);
simulated event PostBeginPlay()
{
local KFSeaTrigger actor_search;
super.PostBeginPlay();
PostAkEvent( ResetFiltersEvent );
@ -831,6 +849,18 @@ simulated event PostBeginPlay()
OnlineSub.AddOnReadOnlineAvatarCompleteDelegate(OnAvatarReceived);
OnlineSub.AddOnReadOnlineAvatarByNameCompleteDelegate(OnAvatarURLPS4Received);
}
foreach AllActors(class'KFSeaTrigger', actor_search)
{
SeaTrigger = actor_search;
if (WorldInfo.NetMode == NM_Client || WorldInfo.NetMode == NM_Standalone)
{
SetTimer(1.f, true, nameOf(ZedKillsSeaDetection));
}
break;
}
}
function UpdateVOIP()
@ -952,7 +982,8 @@ simulated event name GetSeasonalStateName()
local int EventId;
local KFMapInfo KFMI;
local bool bIsWWLWeekly; // WWL Weekly should not allow seasonal overrides
local KFGameReplicationInfo KFGRI;
EventId = class'KFGameEngine'.static.GetSeasonalEventID();
KFMI = KFMapInfo(WorldInfo.GetMapInfo());
if (KFMI != none)
@ -960,7 +991,8 @@ simulated event name GetSeasonalStateName()
KFMI.ModifySeasonalEventId(EventId);
}
bIsWWLWeekly = class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12 && KFGameReplicationInfo(WorldInfo.GRI) != none && KFGameReplicationInfo(WorldInfo.GRI).bIsWeeklyMode;
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
bIsWWLWeekly = KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12;
if (bIsWWLWeekly)
return 'No_Event';
@ -1566,13 +1598,15 @@ function OnReadProfileSettingsComplete(byte LocalUserNum,bool bWasSuccessful)
if(Profile != none)
{
SavedPerkIndex = byte(Profile.GetProfileInt(KFID_SavedPerkIndex));
bSkipNonCriticalForceLookAt = Profile.GetProfileBool(KFID_AutoTurnOff);
bShowKillTicker = Profile.GetProfileBool(KFID_ShowKillTicker);
bNoEarRingingSound = Profile.GetProfileBool(KFID_ReduceHightPitchSounds);
bHideBossHealthBar = Profile.GetProfileBool(KFID_HideBossHealthBar);
bDisableAutoUpgrade = Profile.GetProfileBool(KFID_DisableAutoUpgrade);
SavedPerkIndex = byte(Profile.GetProfileInt(KFID_SavedPerkIndex));
bSkipNonCriticalForceLookAt = Profile.GetProfileBool(KFID_AutoTurnOff);
bShowKillTicker = Profile.GetProfileBool(KFID_ShowKillTicker);
bNoEarRingingSound = Profile.GetProfileBool(KFID_ReduceHightPitchSounds);
bHideBossHealthBar = Profile.GetProfileBool(KFID_HideBossHealthBar);
bDisableAutoUpgrade = Profile.GetProfileBool(KFID_DisableAutoUpgrade);
bHideRemotePlayerHeadshotEffects = Profile.GetProfileBool(KFID_HideRemoteHeadshotEffects);
SurvivalPerkWeapIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingWeapIdx));
SurvivalPerkGrenIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingGrenIdx));
KFPRI = KFPlayerReplicationInfo(PlayerReplicationInfo);
if(KFPRI != none)
@ -2581,6 +2615,30 @@ function NotifyPlayTogetherFailed(optional string LocKey = "UnableToPlayTogether
* @name Dosh Vault
********************************************************************************************* */
public function bool CanUseDosh()
{
/** If this is run in Server or Standalone, GameInfo exists so can access to the OutbreakEvent */
if (Role == Role_Authority)
{
return KFGameInfo(WorldInfo.Game).OutbreakEvent == none
|| !KFGameInfo(WorldInfo.Game).OutbreakEvent.ActiveEvent.bDisableAddDosh;
}
/** But in client, GameInfo doesn't exist, so needs to be checked in a different way. */
else
{
/**
In client there's a kfgame replication info that contains if the mode is a weekly, and the index.
This way would also work in server, but will need to be in code rather than using the weekly variables.
*/
/** Another option is to use instead a variable replicated just with that value */
return KFGameReplicationInfo(WorldInfo.GRI) == none
|| !KFGameReplicationInfo(WorldInfo.GRI).bIsWeeklyMode
|| KFGameReplicationInfo(WorldInfo.GRI).CurrentWeeklyIndex != 16;
}
return true;
}
function int GetPreStigeValueDoshRewardValue()
{
if (StatsWrite != none)
@ -2672,6 +2730,34 @@ function CheckHasViewedDoshVault()
}
}
/*********************************************************************************************
* @name Gun Game
********************************************************************************************* */
public function bool CanUseGunGame()
{
/** If this is run in Server or Standalone, GameInfo exists so can access to the OutbreakEvent */
if (Role == Role_Authority)
{
return KFGameInfo(WorldInfo.Game).OutbreakEvent != none
&& KFGameInfo(WorldInfo.Game).OutbreakEvent.ActiveEvent.bGunGameMode;
}
/** But in client, GameInfo doesn't exist, so needs to be checked in a different way. */
else
{
/**
In client there's a kfgame replication info that contains if the mode is a weekly, and the index.
This way would also work in server, but will need to be in code rather than using the weekly variables.
*/
/** Another option is to use instead a variable replicated just with that value */
return KFGameReplicationInfo(WorldInfo.GRI) != none
&& KFGameReplicationInfo(WorldInfo.GRI).bIsWeeklyMode
&& KFGameReplicationInfo(WorldInfo.GRI).CurrentWeeklyIndex == 16;
}
return false;
}
/*********************************************************************************************
* @name Skill Tracking
********************************************************************************************* */
@ -3089,6 +3175,8 @@ function RecievedNewPerkClass()
{
MyGfxManager.TraderMenu.UpdatePlayerInfo();
}
InitPerkLoadout();
}
/*********************************************************************************************
@ -3976,7 +4064,7 @@ simulated final function Pawn GetPickedAimAtTarget(out float bestAim, out float
return PickAimAtTarget(bestAim, bestDist, FireDir, projStart, MaxRange, bTargetTeammates);
}
exec function SwitchToBestWeapon(optional bool bForceNewWeapon)
exec function SwitchToBestWeapon(optional bool bForceNewWeapon, optional bool check_9mm_logic = false)
{
// Don't let players use an exec to bring up a weapon if the weapon prevents it
if( Pawn != none && Pawn.Weapon != none && KFWeapon(Pawn.Weapon) != none )
@ -3987,7 +4075,7 @@ exec function SwitchToBestWeapon(optional bool bForceNewWeapon)
}
}
super.SwitchToBestWeapon(bForceNewWeapon);
super.SwitchToBestWeapon(bForceNewWeapon, check_9mm_logic);
}
/**
@ -4148,6 +4236,7 @@ simulated event OnWeaponAsyncContentLoaded(class<KFWeapon> WeaponClass)
local KFPawn_Human KFPH;
local KFDroppedPickup KFDP;
local KFPawn KFP;
// Attempt to set the weapon attachment for any player than might need theirs set. This is a backup
// for when content isn't quite ready when WeaponClassForAttachmentTemplate is replicated.
@ -4169,6 +4258,14 @@ simulated event OnWeaponAsyncContentLoaded(class<KFWeapon> WeaponClass)
KFDP.SetPickupMesh(WeaponClass.default.DroppedPickupMesh);
}
}
foreach WorldInfo.AllPawns(class'KFPawn', KFP)
{
if (KFP.bIsTurret && WeaponClass == KFP.WeaponClassForAttachmentTemplate)
{
KFP.SetTurretWeaponAttachment(WeaponClass);
}
}
}
/*********************************************************************************************
@ -5285,7 +5382,9 @@ function bool ShouldDisplayGameplayPostProcessFX()
/* ZED time effect is active */
CurrentZEDTimeEffectIntensity > 0.f ||
/* sepia effect */
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12) ||
(KFGameReplicationInfo(WorldInfo.GRI) != none &&
KFGameReplicationInfo(WorldInfo.GRI).bIsWeeklyMode &&
KFGameReplicationInfo(WorldInfo.GRI).CurrentWeeklyIndex == 12) ||
/* Night vision active */
bNightVisionActive ||
SirenScreamEffectTimeRemaining > 0.f ||
@ -7154,6 +7253,8 @@ simulated function OnStatsInitialized( bool bWasSuccessful )
LoadAllPerkLevels();
ClientInitializePerks();
InitPerkLoadout();
// Update the GFX menu if we need to
if( MyGFxManager != none && MyGFxManager.PerksMenu != none )
{
@ -9186,6 +9287,13 @@ event Destroyed()
StingerAkComponent.StopEvents();
}
// Destroy deployed turrets
// Destroyed event on Turret calls the KFPlayer to modify the same list, that's why we use a while loop...
while (DeployedTurrets.Length > 0)
{
DeployedTurrets[0].Destroy();
}
SetRTPCValue( 'Health', 100, true );
PostAkEvent( LowHealthStopEvent );
bPlayingLowHealthSFX = false;
@ -9215,6 +9323,7 @@ event Destroyed()
ClearMixerDelegates();
ClearDiscord();
}
ClientMatchEnded();
Super.Destroyed();
@ -9340,6 +9449,43 @@ state Dead
}
}
simulated function ZedKillsSeaDetection()
{
local int i;
local KFPawn_Monster Monster;
local float LastMonsterZPosition;
for (i = KilledZeds.Length - 1; i >= 0; i--)
{
Monster = KilledZeds[i];
// If respawned...
if (Monster == None || Monster.Health > 0)
{
KilledZeds.Remove(i, 1);
KilledZedsLastZPosition.Remove(i, 1);
continue;
}
LastMonsterZPosition = KilledZedsLastZPosition[i];
KilledZedsLastZPosition[i] = Monster.Location.Z;
// If we are falling...
if (LastMonsterZPosition > Monster.Location.Z)
{
// If we passed the point of the sea trigger detection
if (Monster.Location.Z < SeaTrigger.Location.Z)
{
ClientOnTriggerUsed(class'KFSeaTrigger');
KilledZeds.Remove(i, 1);
KilledZedsLastZPosition.Remove(i, 1);
}
}
}
}
/**
* Should be to instigate a transition to spectating, automatically handles notifying server or notifying the owning client as necessary.
*/
@ -9916,6 +10062,15 @@ unreliable client event ClientHearDialog( Actor DialogSpeaker, AkEvent DialogEve
}
}
reliable client function NotifyKilledForTracking(KFPawn_Monster KilledMonster)
{
if (KilledMonster != None && KilledZeds.Find(KilledMonster) == INDEX_NONE)
{
KilledZeds.AddItem(KilledMonster);
KilledZedsLastZPosition.AddItem(KilledMonster.Location.Z);
}
}
function NotifyKilled( Controller Killer, Controller Killed, pawn KilledPawn, class<DamageType> damageType )
{
local KFPawn_Monster MonsterPawn;
@ -9937,6 +10092,12 @@ function NotifyKilled( Controller Killer, Controller Killed, pawn KilledPawn, cl
MatchStats.ZedsKilledLastWave++;
CheckForZedOnDeathAchievements( MonsterPawn );
// If we need to track killed zeds, make the function to be called on client...
if (SeaTrigger != none)
{
NotifyKilledForTracking(MonsterPawn);
}
}
// Own death. Like PawnDied(), but with more input parameters
else if ( self == Killed )
@ -10065,7 +10226,7 @@ exec function RequestSkipTrader()
{
if (KFGRI.bMatchHasBegun)
{
if (KFGRI.bTraderIsOpen && KFPRI.bHasSpawnedIn)
if ((KFGRI.bTraderIsOpen || KFGRI.bForceSkipTraderUI) && KFPRI.bHasSpawnedIn)
{
KFPRI.RequestSkiptTrader(KFPRI);
if (MyGFxManager != none)
@ -11728,6 +11889,24 @@ event OnServerTakeoverResponseRecieved()
}
}
reliable client function ForceMonsterHeadExplode(KFPawn_Monster Victim)
{
if (Victim != none)
{
Victim.bIsHeadless=true;
Victim.PlayHeadAsplode();
}
}
simulated function InitPerkLoadout()
{
if (CurrentPerk.IsA('KFPerk_Survivalist'))
{
CurrentPerk.SetWeaponSelectedIndex(SurvivalPerkWeapIndex);
CurrentPerk.SetGrenadeSelectedIndex(SurvivalPerkGrenIndex);
}
}
defaultproperties
{
EarnedDosh=0

View File

@ -38,8 +38,26 @@ var protected const AkEvent RhythmMethodSoundReset;
var protected const AkEvent RhythmMethodSoundHit;
var protected const AkEvent RhythmMethodSoundTop;
var protected const AkEvent AracnoStompSoundEvent;
var protected const AKEvent GunGameLevelUpSoundEvent;
var protected const AKEvent GunGameLevelUpFinalWeaponSoundEvent;
struct native GunGameInfo
{
var transient byte Level;
var transient int Score;
var array<byte> GunGamePreselectedWeapons;
var byte WaveToUseForRestart;
var bool GiveWeaponMaster;
structdefaultproperties
{
Level=0;
Score=0;
WaveToUseForRestart=0;
GiveWeaponMaster=false;
}
};
var transient GunGameInfo GunGameData;
cpptext
{
@ -49,7 +67,7 @@ cpptext
replication
{
if (bNetDirty)
bUsingPermanentZedTime, ZedTimeRadius, ZedTimeBossRadius, ZedTimeHeight, GoompaStreak;
bUsingPermanentZedTime, ZedTimeRadius, ZedTimeBossRadius, ZedTimeHeight, GoompaStreak, GunGameData;
}
simulated event PostBeginPlay()
@ -114,6 +132,22 @@ function RecheckZedTime()
EnterZedTime();
}
reliable client function UpdateWaveCount()
{
if (MyGFxHUD != none)
{
MyGFxHUD.UpdateWaveCount();
}
}
reliable client function UpdateGunGameWidget(int score, int max_score, int level, int max_level)
{
if (MyGFxHUD != none)
{
MyGFxHUD.UpdateGunGameWidget(score, max_score, level, max_level);
}
}
/**
Arachnophobia Goompa Stomp Streak functions
*/
@ -195,13 +229,35 @@ reliable client function GoompaStompMessage( byte StompNum)
}
}
reliable client function PlayGunGameMessage(bool isLastLevel)
{
if (isLastLevel)
{
if (GunGameLevelUpFinalWeaponSoundEvent != none)
{
PlaySoundBase(GunGameLevelUpFinalWeaponSoundEvent);
}
}
else
{
if (GunGameLevelUpSoundEvent != none)
{
PlaySoundBase(GunGameLevelUpSoundEvent);
}
}
}
/** Resets all gameplay FX to initial state.
Append to this list if additional effects are added. */
function ResetGameplayPostProcessFX()
{
local KFGameReplicationInfo KFGRI;
super.ResetGameplayPostProcessFX();
if( GameplayPostProcessEffectMIC != none && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
if((KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12) && GameplayPostProcessEffectMIC != none)
{
GameplayPostProcessEffectMIC.SetScalarParameterValue(EffectZedTimeSepiaParamName, 1.f);
}
@ -228,6 +284,55 @@ simulated function ResetBossCamera()
super(PlayerController).ResetCameraMode();
}
function RestartGunGame()
{
local KFGameInfo KFGI;
local KFGameReplicationInfo KFGRI;
KFGI = KFGameInfo(WorldInfo.Game);
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
if (KFGI != none && KFGRI != none)
{
KFGI.RestartGunGamePlayerWeapon(self, GunGameData.WaveToUseForRestart);
}
}
function UpdateInitialHeldWeapon()
{
//local KFWeapon KFW;
local KFPawn_Human KFPH;
local KFGameInfo KFGI;
local KFGameReplicationInfo KFGRI;
KFPH = KFPawn_Human(Pawn);
if (KFPH == none || KFPH.InvManager == none)
{
return;
}
/*foreach KFPH.InvManager.InventoryActors( class'KFWeapon', KFW )
{
/** Seems its in order, so knife goes first. Equip it */
KFPH.InvManager.SetCurrentWeapon(KFW);
break;
}*/
KFGI = KFGameInfo(WorldInfo.Game);
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
if (KFGI != none && KFGRI != none)
{
KFGI.ResetGunGame(self);
GunGameData.WaveToUseForRestart = KFGRI.WaveNum;
SetTimer(1.0, false, 'RestartGunGame');
}
}
//
defaultProperties
{
@ -239,4 +344,6 @@ defaultProperties
RhythmMethodSoundHit =AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Hit'
RhythmMethodSoundTop =AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Top'
AracnoStompSoundEvent =AkEvent'WW_GLO_Runtime.WeeklyArcno'
GunGameLevelUpSoundEvent=AkEvent'WW_GLO_Runtime.WeeklyAALevelUp'
GunGameLevelUpFinalWeaponSoundEvent=AkEvent'WW_GLO_Runtime.WeeklyAALevelFinal'
}

View File

@ -2062,8 +2062,10 @@ function vector GetBestAutoTargetLocation(Pawn CheckTarget, out name outBoneName
if( KFP != none )
{
// Get the location from the pawn we're targeting if we can
KFP.GetAutoTargetBones(WeakBones, NormalBones);
if (!KFP.GetAutoTargetBones(WeakBones, NormalBones))
{
return vect(0,0,0);
}
// cone setup
GetPlayerViewPoint( CamLoc, CamRot );
CamRot += WeaponBufferRotation;

View File

@ -1351,6 +1351,15 @@ reliable server private function ServerSetPlayerReady( bool bReady )
/** Called on server to +/- dosh. Do not modify score directly */
function AddDosh( int DoshAmount, optional bool bEarned )
{
local KFPlayerController KFPC;
/** Server code: controllers exist */
KFPC = KFPlayerController(Owner);
if (KFPC != none && !KFPC.CanUseDosh())
{
return;
}
//If the game has turned off dosh earning for this PRI, early out.
if (!bAllowDoshEarning && bEarned)
{
@ -1465,6 +1474,10 @@ simulated function NotifyWaveEnded()
{
bVotedToSkipTraderTime = false;
if ( (WorldInfo.NetMode == NM_Standalone || WorldInfo.NetMode == NM_Client) && KFPlayerController(Owner) != none && KFPlayerController(Owner).GetPerk() != none)
{
KFPlayerController(Owner).GetPerk().OnClientWaveEnded();
}
/*local KFGameReplicationInfo KFGRI;
if( Role == ROLE_Authority )
@ -1475,6 +1488,11 @@ simulated function NotifyWaveEnded()
KFGRI.VoteCollector.ResetSkipTraderBeforeWaveStarts();
}
}*/
if ( (WorldInfo.NetMode == NM_Standalone || WorldInfo.NetMode == NM_Client) && KFPlayerController(Owner) != none && KFPlayerController(Owner).GetPerk() != none)
{
KFPlayerController(Owner).GetPerk().OnClientWaveEnded();
}
}
//reset the icons here

View File

@ -380,4 +380,10 @@ defaultproperties
// Added 16/07/2021 - QoL: Quick Swap button allowing 9mm as an option.
ProfileMappings.Add((Id=KFID_AllowSwapTo9mm, Name="AllowSwitchTo9mm", MappingType=PVMT_RawValue))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_AllowSwapTo9mm,Data=(Type=SDT_Int32,Value1=0))))
// Added 07/02/2022 - QoL: Allow survivalits to chose starting weapons.
ProfileMappings.Add((Id=KFID_SurvivalStartingWeapIdx, Name="Survival Starting Weapon Index", MappingType=PVMT_RawValue))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SurvivalStartingWeapIdx,Data=(Type=SDT_Int32,Value1=0))))
ProfileMappings.Add((Id=KFID_SurvivalStartingGrenIdx, Name="Survival Starting Grenade Index", MappingType=PVMT_RawValue))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SurvivalStartingGrenIdx,Data=(Type=SDT_Int32,Value1=0))))
}

View File

@ -182,6 +182,8 @@ function SetFrozenParameter(float FreezeAmount)
local MaterialInstanceConstant MIC;
local int i;
local bool bIsWWLMode;
local KFGameReplicationInfo KFGRI;
if ( PawnOwner.WorldInfo.NetMode != NM_DedicatedServer )
{
FreezeMatParamValue = FreezeAmount;
@ -201,7 +203,8 @@ function SetFrozenParameter(float FreezeAmount)
if (KFPawn_Monster(KFPOwner) != none)
{
bIsWWLMode = class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12 && KFGameReplicationInfo(PawnOwner.WorldInfo.GRI) != none && KFGameReplicationInfo(PawnOwner.WorldInfo.GRI).bIsWeeklyMode;
KFGRI = KFGameReplicationInfo(PawnOwner.WorldInfo.GRI);
bIsWWLMode = KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12;
for (i = 0; i < KFPawn_Monster(KFPOwner).StaticAttachList.length; i++)
{

View File

@ -0,0 +1,41 @@
//=============================================================================
// KFSeaTrigger
//=============================================================================
// Simple trigger used for sea to bypass kismet
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//
//=============================================================================
class KFSeaTrigger extends Trigger_PawnsOnly
placeable
native;
// This class is totally dummy, it is used to place the trigger on the Scene
// Then on KFPlayerController we detect this exists and do the logic for Zeds falling to the sea
cpptext
{
#if WITH_EDITOR
virtual void CheckForErrors(); // Skip 'Trigger is not referenced' warning
#endif
}
event Touch(Actor Other, PrimitiveComponent OtherComp, vector HitLocation, vector HitNormal)
{
}
event UnTouch(Actor Other)
{
}
DefaultProperties
{
Begin Object NAME=CollisionCylinder
CollisionRadius=+00200.000000
CollisionHeight=+00100.000000
End Object
bProjTarget=false
bStatic=true
}

View File

@ -32,7 +32,9 @@ enum ESharedContentUnlock
SCU_Thermite,
SCU_BladedPistol,
SCU_ParasiteImplanter,
SCU_Doshinegun
SCU_Doshinegun,
SCU_AutoTurret,
SCU_ShrinkRayGun
};
@ -212,6 +214,7 @@ static private event bool CheckCustomizationOwnership(KFPlayerReplicationInfo PR
local SkinVariant Skin;
local AttachmentVariants Attachment;
local int i;
local KFGameReplicationInfo KFGRI;
CharArch = PRI.CharacterArchetypes[PRI.RepCustomizationInfo.CharacterIndex];
@ -246,10 +249,12 @@ static private event bool CheckCustomizationOwnership(KFPlayerReplicationInfo PR
return FALSE;
}
KFGRI = KFGameReplicationInfo(PRI.WorldInfo.GRI);
// accessory
for( i=0; i < `MAX_COSMETIC_ATTACHMENTS; i++ )
{
if (i == 2 && PRI.WorldInfo.GRI.IsA('KFGameReplicationInfo_WeeklySurvival') && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
if (i == 2 && KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12)
{
continue;
}
@ -360,4 +365,12 @@ defaultproperties
Name=KFWeap_AssaultRifle_Doshinegun,
IconPath="WEP_UI_Doshinegun_TEX.UI_Weapon_Select_Doshinegun",
ID=9275)}
SharedContentList(SCU_AutoTurret)={(
Name=KFWeap_AutoTurret,
IconPath="WEP_UI_AutoTurret_TEX.UI_WeaponSelect_AutoTurret",
ID=9284)}
SharedContentList(SCU_ShrinkRayGun)={(
Name=KFWeap_ShrinkRayGun,
IconPath="WEP_UI_ShrinkRay_Gun_TEX.UI_Weapon_Select_Shrink_Ray_Gun",
ID=9290)}
}

View File

@ -434,7 +434,7 @@ function ServerStartVoteSkipTrader(PlayerReplicationInfo PRI)
}
// Trader is not open, we are not allowed to initiate a skip trader vote
if(!KFGRI.bTraderIsOpen)
if(!KFGRI.bTraderIsOpen && !KFGRI.bForceShowSkipTrader)
{
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_SkipTraderIsNotOpen);
return;

View File

@ -31,6 +31,8 @@ var AkEvent PilotLightPlayEvent;
/** Pilot light sound stop event */
var AkEvent PilotLightStopEvent;
var protected bool bInvertPilot;
/** Effect for the pilot light. */
var protected KFParticleSystemComponent PSC_PilotLight;
/** Socket to attach the pilot light to. */
@ -263,9 +265,17 @@ simulated function StopPilotSound()
simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
{
local int Idx;
local bool doEnable;
doEnable = bLightEnabled;
if (bInvertPilot)
{
doEnable = bLightEnabled == false;
}
// Don't turn these on if we're not in third person
if( bLightEnabled && (Instigator != none && Instigator.IsFirstPerson()) )
if (doEnable && (Instigator != none && Instigator.IsFirstPerson()))
{
return;
}
@ -273,7 +283,7 @@ simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
// turn off lights
for (Idx=0; Idx<PilotLights.length; ++Idx)
{
PilotLights[Idx].Light.SetEnabled(bLightEnabled);
PilotLights[Idx].Light.SetEnabled(doEnable);
}
}
@ -507,6 +517,8 @@ defaultproperties
TickGroup=TG_PostUpdateWork
End Object
PSC_PilotLight=PilotLight0
bInvertPilot=false
}

View File

@ -0,0 +1,29 @@
//=============================================================================
// KFWeapDef_AutoTurret
//=============================================================================
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_AutoTurret extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_AutoTurret"
BuyPrice=500
AmmoPricePerMag=60 // 27
ImagePath="WEP_UI_AutoTurret_TEX.UI_WeaponSelect_AutoTurret"
EffectiveRange=18
UpgradePrice[0]=700
UpgradePrice[1]=1500
UpgradeSellPrice[0]=525
UpgradeSellPrice[1]=1650
SharedUnlockId=SCU_AutoTurret
}

View File

@ -0,0 +1,19 @@
//=============================================================================
// KFWeapDef_AutoTurretWeapon
//=============================================================================
// Weapon attached to a drone
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_AutoTurretWeapon extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_AutoTurretWeapon"
BuyPrice=0
AmmoPricePerMag=0
ImagePath="ui_weaponselect_tex.UI_WeaponSelect_AR15"
}

View File

@ -0,0 +1,25 @@
//=============================================================================
// KFWeapDef_HRG_CranialPopper
//=============================================================================
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_HRG_CranialPopper extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_HRG_CranialPopper"
BuyPrice=1100
AmmoPricePerMag=40
ImagePath="wep_ui_hrg_cranialpopper_tex.UI_WeaponSelect_HRG_CranialPopper"
EffectiveRange=90
UpgradePrice[0]=700
UpgradePrice[1]=1500
UpgradeSellPrice[0]=525
UpgradeSellPrice[1]=1650
}

View File

@ -0,0 +1,27 @@
//=============================================================================
// KFWeapDef_HRG_Crossboom
//=============================================================================
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_HRG_Crossboom extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_HRG_Crossboom"
BuyPrice=900
AmmoPricePerMag=14
ImagePath="WEP_UI_HRG_Crossboom_TEX.UI_WeaponSelect_Crossboom"
EffectiveRange=80
UpgradePrice[0]=700
UpgradePrice[1]=1500
UpgradeSellPrice[0]=525
UpgradeSellPrice[1]=1650
}

View File

@ -0,0 +1,15 @@
//=============================================================================
// KFWeapDef_RandomGrenade
//=============================================================================
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_RandomGrenade extends KFWeaponDefinition
abstract;
DefaultProperties
{
ImagePath="wep_ui_shared_tex.UI_WeaponSelect_QuestionMark"
WeaponClassPath="KFGameContent.KFWeap_RandomGrenade"
}

View File

@ -0,0 +1,28 @@
//=============================================================================
// KFWeapDef_ShrinkRayGun
//=============================================================================
//=============================================================================
// Killing Floor 2
// Copyright (C) 2021 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_ShrinkRayGun extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_ShrinkRayGun"
BuyPrice=1200
AmmoPricePerMag=50
ImagePath="WEP_UI_ShrinkRay_Gun_TEX.UI_Weapon_Select_Shrink_Ray_Gun"
EffectiveRange=12
UpgradePrice[0]=700
UpgradePrice[1]=1500
UpgradeSellPrice[0]=525
UpgradeSellPrice[1]=1650
SharedUnlockId=SCU_ShrinkRayGun
}

View File

@ -33,6 +33,8 @@ var AkEvent PilotLightPlayEvent;
/** Pilot light sound stop event */
var AkEvent PilotLightStopEvent;
var protected bool bInvertPilot;
/** Effect for the pilot light. */
var() protected KFParticleSystemComponent PSC_PilotLight;
/** Socket to attach the pilot light to. */
@ -47,6 +49,9 @@ var float LastBarrelHeat;
/** Whether this weapon should warn AI when it fires */
var() const bool bWarnAIWhenFiring;
/** Modifier to the speed for barrel cooldown */
var const float CooldownBarrelModifier;
/*********************************************************************************************
* @name Optional dynamic pilot lights
********************************************************************************************* */
@ -147,13 +152,26 @@ simulated event Tick(float DeltaTime)
}
else
{
if( BarrelHeat > 0 )
if (ActiveFlameSpray != none)
{
FlameHeat = ActiveFlameSpray.MaterialHeatRange.X;
}
else if (FlameSprayArchetype != none)
{
FlameHeat = FlameSprayArchetype.default.MaterialHeatRange.X;
}
else
{
FlameHeat = 0;
}
if( BarrelHeat != FlameHeat )
{
// Cool the barrel down when not shooting
BarrelHeat -= DeltaTime * 0.5;
if( BarrelHeat < 0 )
BarrelHeat -= DeltaTime * CooldownBarrelModifier;
if( BarrelHeat < FlameHeat )
{
BarrelHeat = 0;
BarrelHeat = FlameHeat;
}
}
}
@ -340,9 +358,17 @@ simulated protected function TurnOffPilot()
simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
{
local int Idx;
local bool doEnable;
doEnable = bLightEnabled;
if (bInvertPilot)
{
doEnable = bLightEnabled == false;
}
// Don't turn these on if we're not the local playercontroller
if( bLightEnabled && (Instigator == none || !Instigator.IsLocallyControlled() || !Instigator.IsFirstPerson()) )
if (doEnable && (Instigator == none || !Instigator.IsLocallyControlled() || !Instigator.IsFirstPerson()))
{
return;
}
@ -350,7 +376,7 @@ simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
// turn off lights
for (Idx=0; Idx<PilotLights.length; ++Idx)
{
PilotLights[Idx].Light.SetEnabled(bLightEnabled);
PilotLights[Idx].Light.SetEnabled(doEnable);
}
}
@ -379,7 +405,9 @@ simulated function StopPilotSound()
simulated function StartLoopingFireEffects(byte FireModeNum, optional bool bForceAnim)
{
StopPilotSound();
SetPilotDynamicLightEnabled(false);
SetPilotDynamicLightEnabled(false);
super.StartLoopingFireEffects(FireModeNum, bForceAnim);
}
@ -389,8 +417,10 @@ simulated function StartLoopingFireEffects(byte FireModeNum, optional bool bForc
simulated function StopLoopingFireEffects(byte FireModeNum)
{
super.StopLoopingFireEffects(FireModeNum);
StartPilotSound();
SetPilotDynamicLightEnabled(true);
SetPilotDynamicLightEnabled(true);
}
/**
@ -800,10 +830,14 @@ defaultproperties
bWeaponNeedsServerPosition=true
bInvertPilot=false
// Aim Assist
AimCorrectionSize=0.f
// AI Warning
MaxAIWarningDistSQ=1000000
MaxAIWarningDistFromPointSQ=40000
CooldownBarrelModifier=0.5f
}

View File

@ -1246,7 +1246,7 @@ simulated function Timer_UpdateWeaponSkin()
// for remote clients to preload content when a user picks up a weapon without
// having to do the full setting stack.
simulated native static function TriggerAsyncContentLoad(class<KFWeapon> WeaponClass);
native private function StartLoadWeaponContent();
native protected function StartLoadWeaponContent();
native private function LoadWeaponContent();
native private function CacheWeaponContent();
native private function UnloadWeaponContent();
@ -1618,6 +1618,21 @@ simulated function AttachLaserSight()
}
}
function GunGameRemove()
{
if (Instigator != none && Instigator.InvManager != none)
{
Instigator.InvManager.RemoveFromInventory(Self);
}
Instigator = None;
GotoState('');
AIController = None;
Destroy();
}
/**
* Drop this item out in to the world
*/
@ -1815,9 +1830,24 @@ reliable client function ClientNotifyPickedUp()
}
/** Treat as non-standard equipment item for */
simulated static function bool DenyPerkResupply()
simulated function bool DenyPerkResupply()
{
return default.InventoryGroup >= IG_Equipment;
if (default.InventoryGroup >= IG_Equipment)
{
if (Class.Name == 'KFWeap_Thrown_C4')
{
return false;
}
if (Class.Name == 'KFWeap_AutoTurret')
{
return false;
}
return true;
}
return false;
}
simulated static function bool IsMeleeWeapon()
@ -6488,7 +6518,7 @@ simulated state WeaponFiring
Instigator.WeaponStoppedFiring(self, false);
}
if ( bPlayingLoopingFireAnim || bPlayingLoopingFireAnim )
if ( bPlayingLoopingFireAnim || bPlayingLoopingFireSnd )
{
StopLoopingFireEffects(CurrentFireMode);
}

View File

@ -2748,6 +2748,9 @@ defaultproperties
//Dragon & Koi Pulverizer
Skins.Add((Id=7519, Weapondef=class'KFWeapDef_Pulverizer', MIC_1P=("WEP_SkinSet_DragonKoi_03_MAT.dragonkoi_pulverizer.DragonKoi_Pulverizer_1P_Mint_MIC"), MIC_3P="WEP_SkinSet_DragonKoi_03_MAT.dragonkoi_pulverizer.DragonKoi_Pulverizer_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet_DragonKoi_03_MAT.dragonkoi_pulverizer.DragonKoi_Pulverizer_3P_Pickup_MIC"))
//Standard Ion Sword
Skins.Add((Id=7715, Weapondef=class'KFWeapDef_IonThruster', MIC_1P=("WEP_1P_Ion_Sword_MAT.Wep_1stP_Ion_Sword_MIC"), MIC_3P="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_MIC", MIC_Pickup="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_Pickup_MIC"))
//Dosh Royale Ion Sword
Skins.Add((Id=7716, Weapondef=class'KFWeapDef_IonThruster', MIC_1P=("WEP_1P_Ion_Sword_MAT.Wep_1st_Ion_Sword_DoshRoyale_MIC"), MIC_3P="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_DoshRoyale_MIC", MIC_Pickup="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_DoshRoyale_Pickup_MIC"))
@ -2763,6 +2766,9 @@ defaultproperties
//Shatter Ion Sword
Skins.Add((Id=7720, Weapondef=class'KFWeapDef_IonThruster', MIC_1P=("WEP_1P_Ion_Sword_MAT.Wep_1st_Ion_Sword_Shatter_MIC"), MIC_3P="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_Shatter_MIC", MIC_Pickup="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_Shatter_Pickup_MIC"))
//Standard Chiappa Rhino
Skins.Add((Id=7704, Weapondef=class'KFWeapDef_ChiappaRhino', MIC_1P=("wep_1p_chiapparhino_mat.WEP_1P_ChiappaRhino_MIC"), MIC_3P="WEP_3P_ChiappoRhino_MAT.WEP_3P_ChiappaRhino_MIC", MIC_Pickup="WEP_3P_ChiappoRhino_MAT.3P_Pickup_ChiappaRhino_MIC"))
//Dosh Royale Chiappa Rhino
Skins.Add((Id=7705, Weapondef=class'KFWeapDef_ChiappaRhino', MIC_1P=("wep_1p_chiapparhino_mat.WEP_1P_ChiappaRhinos_DoshRoyale_MIC"), MIC_3P="WEP_3P_ChiappoRhino_MAT.WEP_3P_ChiappaRhino_DoshRoyale_MIC", MIC_Pickup="WEP_3P_ChiappoRhino_MAT.3P_Pickup_ChiappaRhino_DoshRoyale_MIC"))
@ -2798,6 +2804,26 @@ defaultproperties
Skins.Add((Id=7796, Weapondef=class'KFWeapDef_MicrowaveRifle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_1P_FieldTested_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_3P_FieldTested_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_3P_Pickup_MIC"))
Skins.Add((Id=7797, Weapondef=class'KFWeapDef_MicrowaveRifle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_1P_Mint_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_3P_Pickup_MIC"))
//Jaeger Desert Eagle
//BattleScarred
Skins.Add((Id=7798, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_1P_BattleScarred_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_BattleScarred_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Pickup_MIC"))
//Field Tested
Skins.Add((Id=7799, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_1P_FieldTested_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_FieldTested_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Pickup_MIC"))
//Mint
Skins.Add((Id=7800, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Pickup_MIC"))
//Jaeger P90
//BattleScarred
Skins.Add((Id=7804, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet27_MAT.jaeger_p90.jaeger_P90_1P_BattleScarred_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_BattleScarred_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_Pickup_MIC"))
//Field Tested
Skins.Add((Id=7805, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet27_MAT.jaeger_p90.jaeger_P90_1P_FieldTested_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_FieldTested_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_Pickup_MIC"))
//Mint
Skins.Add((Id=7806, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet27_MAT.jaeger_p90.jaeger_P90_1P_Mint_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_Pickup_MIC"))
//Jaeger Desert Eagle BattleScarred
Skins.Add((Id=8031, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_1P_BattleScarred_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_BattleScarred_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Pickup_MIC"))
@ -3613,6 +3639,42 @@ defaultproperties
//Doshinegun Koi Dream
Skins.Add((Id=9276, Weapondef=class'KFWeapDef_Doshinegun', MIC_1P=("wep_skinset53_mat.Wep_Doshinegun_koidream_body_PM", "wep_skinset53_mat.Wep_Doshinegun_koidream_mag_PM"), MIC_3P="WEP_SkinSet53_MAT.Wep_Doshinegun_koidream_3P_PM", MIC_Pickup="WEP_SkinSet53_MAT.Wep_Doshinegun_koidream_3P_Pickup_MIC"));
//Sentinel Standard
Skins.Add((Id=9284, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("wep_1p_autoturret_mat.Wep_1P_AutoTurret_MIC","Wep_1P_AutoTurret_MAT.Wep_1P_Remote_MIC"), MIC_3P="WEP_3P_AutoTurret_MAT.WEP_3P_AutoTurret_MIC", MIC_Pickup="wep_3p_autoturret_mat.3P_Pickup_AutoTurret_MIC"))
//Sentinel 1942
Skins.Add((Id=9285, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_1942_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_1942_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_1942_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_1942_AutoTurrent_Pickup_MIC"))
//Sentinel Black Bird
Skins.Add((Id=9286, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_BlackBird_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_BlackBird_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_BlackBird_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_BlackBird_AutoTurrent_Pickup_MIC"))
//Sentinel Hades
Skins.Add((Id=9287, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_Hades_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_Hades_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_Hades_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_Hades_AutoTurrent_Pickup_MIC"))
//Sentinel Ice Storm
Skins.Add((Id=9288, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_IceStorm_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_IceStorm_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_IceStorm_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_IceStorm_AutoTurrent_Pickup_MIC"))
//Sentinel Shock
Skins.Add((Id=9289, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_Shock_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_Shock_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_Shock_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_Shock_AutoTurrent_Pickup_MIC"))
//Reducto Ray Standard
Skins.Add((Id=9290, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_1p_shrinkray_gun_mat.Wep_1P_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_3p_shrinkray_gun_mat.WEP_3P_ShrinkRay_Gun_MIC", MIC_Pickup="wep_3p_shrinkray_gun_mat.3P_Pickup_ShrinkRay_Gun_MIC"))
//Reducto Ray Atomic Love
Skins.Add((Id=9291, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_AtomicLove_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_AtomicLove_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_AtomicLove_ShrinkRay_Pickup_MIC"))
//Reducto Ray Destructor
Skins.Add((Id=9292, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_Destructor_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_Destructor_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_Destructor_ShrinkRay_Pickup_MIC"))
//Reducto Ray Heavy Metal
Skins.Add((Id=9293, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_HeavyMetal_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_HeavyMetal_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_HeavyMetal_ShrinkRay_Pickup_MIC"))
//Reducto Ray HellsFury
Skins.Add((Id=9294, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_HellsFury_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_HellsFury_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_HellsFury_ShrinkRay_Pickup_MIC"))
//Reducto Ray Lucky Strike
Skins.Add((Id=9295, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_LuckyStrike_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_LuckyStrike_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_LuckyStrike_ShrinkRay_Pickup_MIC"))
//BeyondHorizon AA12
Skins.Add((Id=8845, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet43_MAT.space_aa12.Space_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet43_MAT.space_aa12.Space_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet43_MAT.space_aa12.Space_AA12_3P_Pickup_MIC"))
@ -3858,4 +3920,183 @@ defaultproperties
//XMas Sour Spitfire
Skins.Add((Id=9217, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Flaregun', MIC_1P=("WEP_SkinSet52_MAT.sour_flaregun.Sour_FlareGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet52_MAT.sour_flaregun.Sour_FlareGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet52_MAT.sour_flaregun.Sour_FlareGun_3P_Pickup_MIC"))
//Neon Boomstick
Skins.Add((Id=9335, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("wep_skinset56_mat.neon_doublebarrel.Neon_DoubleBarrel_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neon_doublebarrel.Neon_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neon_doublebarrel.Neon_DoubleBarrel_3P_Pickup_MIC"))
//Neon HZ12
Skins.Add((Id=9336, Weapondef=class'KFWeapDef_HZ12', MIC_1P=("wep_skinset56_mat.neon_hz12.Neon_HZ12_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neon_hz12.Neon_HZ12_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neon_hz12.Neon_HZ12_3P_Pickup_MIC"))
//Neon HRG Beluga Beat
Skins.Add((Id=9337, Weapondef=class'KFWeapDef_HRG_SonicGun', MIC_1P=("wep_skinset56_mat.neon_hrgsonicgun.Neon_HRGSonicGun_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neon_hrgsonicgun.Neon_HRGSonicGun_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neon_hrgsonicgun.Neon_HRGSonicGun_3P_Pickup_MIC"))
//Neon Zweihander
Skins.Add((Id=9338, Weapondef=class'KFWeapDef_Zweihander', MIC_1P=("wep_skinset56_mat.neon_zweihander.Neon_Zweihander_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neon_zweihander.Neon_Zweihander_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neon_zweihander.Neon_Zweihander_3P_Pickup_MIC"))
//Neon RGB Boomstick
Skins.Add((Id=9339, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("wep_skinset56_mat.neonrgb_doublebarrel.NeonRGB_DoubleBarrel_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neonrgb_doublebarrel.NeonRGB_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neonrgb_doublebarrel.NeonRGB_DoubleBarrel_3P_Pickup_MIC"))
//Neon RGB HZ12
Skins.Add((Id=9340, Weapondef=class'KFWeapDef_HZ12', MIC_1P=("wep_skinset56_mat.neonrgb_hz12.NeonRGB_HZ12_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neonrgb_hz12.NeonRGB_HZ12_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neonrgb_hz12.NeonRGB_HZ12_3P_Pickup_MIC"))
//Neon RGB HRG Beluga Beat
Skins.Add((Id=9341, Weapondef=class'KFWeapDef_HRG_SonicGun', MIC_1P=("wep_skinset56_mat.neonrgb_hrgsonicgun.NeonRGB_HRGSonicGun_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neonrgb_hrgsonicgun.NeonRGB_HRGSonicGun_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neonrgb_hrgsonicgun.NeonRGB_HRGSonicGun_3P_Pickup_MIC"))
//Neon RGB Zweihander
Skins.Add((Id=9342, Weapondef=class'KFWeapDef_Zweihander', MIC_1P=("wep_skinset56_mat.neonrgb_zweihander.NeonRGB_Zweihander_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neonrgb_zweihander.NeonRGB_Zweihander_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neonrgb_zweihander.NeonRGB_Zweihander_3P_Pickup_MIC"))
//Classic Mint 9MM
Skins.Add((Id=9343, Weapondef=class'KFWeapDef_9mm', MIC_1P=("wep_skinset57_mat.classic_9mm.Classic_9MM_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.classic_9mm.Classic_9MM_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.classic_9mm.Classic_9MM_3P_Pickup_MIC"))
//Classic Mint AA12
Skins.Add((Id=9344, Weapondef=class'KFWeapDef_AA12', MIC_1P=("wep_skinset57_mat.classic_aa12.Classic_AA12_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.classic_aa12.Classic_AA12_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.classic_aa12.Classic_AA12_3P_Pickup_MIC"))
//Classic Mint Boomstick
Skins.Add((Id=9345, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("wep_skinset57_mat.classic_doublebarrel.Classic_DoubleBarrel_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.classic_doublebarrel.Classic_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.classic_doublebarrel.Classic_DoubleBarrel_3P_Pickup_MIC"))
//Classic Mint M1911
Skins.Add((Id=9346, Weapondef=class'KFWeapDef_Colt1911', MIC_1P=("wep_skinset57_mat.classic_m1911.Classic_M1911_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.classic_m1911.Classic_M1911_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.classic_m1911.Classic_M1911_3P_Pickup_MIC"))
//Classic Precious 9MM
Skins.Add((Id=9347, Weapondef=class'KFWeapDef_9mm', MIC_1P=("wep_skinset57_mat.standard_9mm.Standard_9MM_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.standard_9mm.Standard_9MM_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.standard_9mm.Standard_9MM_3P_Pickup_MIC"))
//Classic Precious AA12
Skins.Add((Id=9348, Weapondef=class'KFWeapDef_AA12', MIC_1P=("wep_skinset57_mat.standard_aa12.Standard_AA12_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.standard_aa12.Standard_AA12_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.standard_aa12.Standard_AA12_3P_Pickup_MIC"))
//Classic Precious Boomstick
Skins.Add((Id=9349, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("wep_skinset57_mat.standard_doublebarrel.Standard_DoubleBarrel_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.standard_doublebarrel.Standard_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.standard_doublebarrel.Standard_DoubleBarrel_3P_Pickup_MIC"))
//Classic Precious M1911
Skins.Add((Id=9350, Weapondef=class'KFWeapDef_Colt1911', MIC_1P=("wep_skinset57_mat.standard_m1911.Standard_M1911_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.standard_m1911.Standard_M1911_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.standard_m1911.Standard_M1911_3P_Pickup_MIC"))
//Chameleon Dynamic Desert Eagle
Skins.Add((Id=9351, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("wep_skinset58_mat.chameleon_deagle.Chameleon_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleon_deagle.Chameleon_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleon_deagle.Chameleon_Deagle_3P_Pickup_MIC"))
//Chameleon Dynamic Katana
Skins.Add((Id=9352, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Katana', MIC_1P=("wep_skinset58_mat.chameleon_katana.Chameleon_Katana_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleon_katana.Chameleon_Katana_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleon_katana.Chameleon_Katana_3P_Pickup_MIC"))
//Chameleon Dynamic Kriss SMG
Skins.Add((Id=9353, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Kriss', MIC_1P=("wep_skinset58_mat.chameleon_kriss.Chameleon_Kriss_1P_Mint_MIC", "wep_skinset58_mat.chameleon_kriss.Chameleon_Kriss_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleon_kriss.Chameleon_Kriss_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleon_kriss.Chameleon_Kriss_3P_Pickup_MIC"))
//Chameleon Dynamic RPG-7
Skins.Add((Id=9354, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("wep_skinset58_mat.chameleon_rpg7.Chameleon_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleon_rpg7.Chameleon_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleon_rpg7.Chameleon_RPG7_3P_Pickup_MIC"))
//Chameleon Dynamic RGB Desert Eagle
Skins.Add((Id=9355, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("wep_skinset58_mat.chameleonrgb_deagle.ChameleonRGB_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleonrgb_deagle.ChameleonRGB_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleonrgb_deagle.ChameleonRGB_Deagle_3P_Pickup_MIC"))
//Chameleon Dynamic RGB Katana
Skins.Add((Id=9356, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Katana', MIC_1P=("wep_skinset58_mat.chameleonrgb_katana.ChameleonRGB_Katana_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleonrgb_katana.ChameleonRGB_Katana_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleonrgb_katana.ChameleonRGB_Katana_3P_Pickup_MIC"))
//Chameleon Dynamic RGB Kriss SMG
Skins.Add((Id=9357, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Kriss', MIC_1P=("wep_skinset58_mat.chameleonrgb_kriss.ChameleonRGB_Kriss_1P_Mint_MIC", "wep_skinset58_mat.chameleonrgb_kriss.ChameleonRGB_Kriss_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleonrgb_kriss.ChameleonRGB_Kriss_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleonrgb_kriss.ChameleonRGB_Kriss_3P_Pickup_MIC"))
//Chameleon Dynamic RGB RPG-7
Skins.Add((Id=9358, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("wep_skinset58_mat.chameleonrgb_rpg7.ChameleonRGB_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleonrgb_rpg7.ChameleonRGB_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleonrgb_rpg7.ChameleonRGB_RPG7_3P_Pickup_MIC"))
//Deep Sea Antique AA12
Skins.Add((Id=9298, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSea_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSea_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSea_AA12_3P_Pickup_MIC"))
//Deep Sea Aqua AA12
Skins.Add((Id=9299, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaAqua_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaAqua_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaAqua_AA12_3P_Pickup_MIC"))
//Deep Sea Coral AA12
Skins.Add((Id=9300, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaCoral_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaCoral_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaCoral_AA12_3P_Pickup_MIC"))
//Deep Sea Pearl AA12
Skins.Add((Id=9301, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPearl_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPearl_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPearl_AA12_3P_Pickup_MIC"))
//Deep Sea Black Seal AA12
Skins.Add((Id=9302, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaBlackSeal_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaBlackSeal_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaBlackSeal_AA12_3P_Pickup_MIC"))
//Deep Sea Precious AA12
Skins.Add((Id=9303, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPrecious_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPrecious_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPrecious_AA12_3P_Pickup_MIC"))
//Deep Sea Antique FN FAL
Skins.Add((Id=9304, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSea_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSea_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSea_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSea_FNFAL_3P_Pickup_MIC"))
//Deep Sea Aqua FN FAL
Skins.Add((Id=9305, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaAqua_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaAqua_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaAqua_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaAqua_FNFAL_3P_Pickup_MIC"))
//Deep Sea Coral FN FAL
Skins.Add((Id=9306, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaCoral_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaCoral_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaCoral_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaCoral_FNFAL_3P_Pickup_MIC"))
//Deep Sea Pearl FN FAL
Skins.Add((Id=9307, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPearl_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPearl_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPearl_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPearl_FNFAL_3P_Pickup_MIC"))
//Deep Sea Black Seal FN FAL
Skins.Add((Id=9308, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaBlackSeal_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaBlackSeal_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaBlackSeal_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaBlackSeal_FNFAL_3P_Pickup_MIC"))
//Deep Sea Precious FN FAL
Skins.Add((Id=9309, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPrecious_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPrecious_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPrecious_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPrecious_FNFAL_3P_Pickup_MIC"))
//Deep Sea Antique M14EBR
Skins.Add((Id=9310, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSea_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSea_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSea_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSea_M14EBR_3P_Pickup_MIC"))
//Deep Sea Aqua M14EBR
Skins.Add((Id=9311, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaAqua_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaAqua_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaAqua_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaAqua_M14EBR_3P_Pickup_MIC"))
//Deep Sea Coral M14EBR
Skins.Add((Id=9312, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaCoral_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaCoral_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaCoral_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaCoral_M14EBR_3P_Pickup_MIC"))
//Deep Sea Pearl M14EBR
Skins.Add((Id=9313, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPearl_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPearl_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPearl_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPearl_M14EBR_3P_Pickup_MIC"))
//Deep Sea Black Seal M14EBR
Skins.Add((Id=9314, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaBlackSeal_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaBlackSeal_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaBlackSeal_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaBlackSeal_M14EBR_3P_Pickup_MIC"))
//Deep Sea Precious M14EBR
Skins.Add((Id=9315, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPrecious_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPrecious_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPrecious_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPrecious_M14EBR_3P_Pickup_MIC"))
//Deep Sea Antique MAC 10
Skins.Add((Id=9316, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSea_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSea_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSea_MAC10_3P_Pickup_MIC"))
//Deep Sea Aqua MAC 10
Skins.Add((Id=9317, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaAqua_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaAqua_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaAqua_MAC10_3P_Pickup_MIC"))
//Deep Sea Coral MAC 10
Skins.Add((Id=9318, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaCoral_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaCoral_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaCoral_MAC10_3P_Pickup_MIC"))
//Deep Sea Pearl MAC 10
Skins.Add((Id=9319, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPearl_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPearl_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPearl_MAC10_3P_Pickup_MIC"))
//Deep Sea Black Seal MAC 10
Skins.Add((Id=9320, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaBlackSeal_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaBlackSeal_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaBlackSeal_MAC10_3P_Pickup_MIC"))
//Deep Sea Precious MAC 10
Skins.Add((Id=9321, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPrecious_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPrecious_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPrecious_MAC10_3P_Pickup_MIC"))
//Deep Sea Antique MP5RAS
Skins.Add((Id=9322, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSea_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSea_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSea_MP5RAS_3P_Pickup_MIC"))
//Deep Sea Aqua MP5RAS
Skins.Add((Id=9323, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaAqua_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaAqua_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaAqua_MP5RAS_3P_Pickup_MIC"))
//Deep Sea Coral MP5RAS
Skins.Add((Id=9324, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaCoral_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaCoral_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaCoral_MP5RAS_3P_Pickup_MIC"))
//Deep Sea Pearl MP5RAS
Skins.Add((Id=9325, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPearl_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPearl_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPearl_MP5RAS_3P_Pickup_MIC"))
//Deep Sea Black Seal MP5RAS
Skins.Add((Id=9326, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaBlackSeal_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaBlackSeal_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaBlackSeal_MP5RAS_3P_Pickup_MIC"))
//Deep Sea Precious MP5RAS
Skins.Add((Id=9327, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPrecious_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPrecious_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPrecious_MP5RAS_3P_Pickup_MIC"))
//Deep Sea Antique RPG-7
Skins.Add((Id=9328, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSea_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSea_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSea_RPG7_3P_Pickup_MIC"))
//Deep Sea Aqua RPG-7
Skins.Add((Id=9329, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaAqua_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaAqua_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaAqua_RPG7_3P_Pickup_MIC"))
//Deep Sea Coral RPG-7
Skins.Add((Id=9330, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaCoral_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaCoral_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaCoral_RPG7_3P_Pickup_MIC"))
//Deep Sea Pearl RPG-7
Skins.Add((Id=9331, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPearl_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPearl_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPearl_RPG7_3P_Pickup_MIC"))
//Deep Sea Black Seal RPG-7
Skins.Add((Id=9332, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaBlackSeal_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaBlackSeal_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaBlackSeal_RPG7_3P_Pickup_MIC"))
//Deep Sea Precious RPG-7
Skins.Add((Id=9333, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPrecious_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPrecious_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPrecious_RPG7_3P_Pickup_MIC"))
}

View File

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

View File

@ -156,4 +156,5 @@ const STATID_ACHIEVE_Dystopia2029Collectibles = 4058;
const STATID_ACHIEVE_MoonbaseCollectibles = 4059;
const STATID_ACHIEVE_NetherholdCollectibles = 4060;
const STATID_ACHIEVE_CarillonHamletCollectibles = 4061;
const STATID_ACHIEVE_RigCollectibles = 4062;
/** `endif */

View File

@ -74,3 +74,5 @@ const KFID_GamepadDeadzoneScale = 175;
const KFID_GamepadAccelerationJumpScale = 176;
const KFID_HasTabbedToStore = 177;
const KFID_AllowSwapTo9mm = 178; // Halloween 2021 QoL: added option to quick switch weapons to 9mm
const KFID_SurvivalStartingWeapIdx=179; // Summer 2022 QoL: added option to choose starting weapon for survival perk
const KFID_SurvivalStartingGrenIdx=180; // Summer 2022 QoL: added option to choose starting grenade for survival perk

View File

@ -0,0 +1,27 @@
//=============================================================================
// KFDT_Ballistic_AutoTurret
//=============================================================================
// Class Description
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFDT_Ballistic_AutoTurret extends KFDT_Ballistic_AssaultRifle
abstract
hidedropdown;
defaultproperties
{
KDamageImpulse=900
KDeathUpKick=-300
KDeathVel=100
StumblePower=5
GunHitPower=0
WeaponDef=class'KFWeapDef_AutoTurret'
//Perk
ModifierPerkList(0)=class'KFPerk_Commando'
}

View File

@ -0,0 +1,67 @@
//=============================================================================
// KFDT_Blast_HRG_CranialPopper
//=============================================================================
// Damage caused by the cranial popper alternate fire
//=============================================================================
// Killing Floor 2
// Copyright (C) 2021 Tripwire Interactive LLC
//=============================================================================
class KFDT_Blast_HRG_CranialPopper extends KFDT_Ballistic_Rifle
abstract
hidedropdown;
static simulated function bool CanDismemberHitZone( name InHitZoneName )
{
switch ( InHitZoneName )
{
case 'head':
return false; //true to dismember
}
return false;
}
/**
* Allows the damage type to customize exactly which hit zones it can dismember while the zed is alive
*/
//static simulated function bool CanDismemberHitZoneWhileAlive(name InHitZoneName)
//{
// switch ( InHitZoneName )
// {
// case 'head':
// return true;
// }
//
// return false;
//}
DefaultProperties
{
// This weapon uses radial impulses
RadialDamageImpulse=1500
KDamageImpulse=0
KDeathUpKick=500.0
KDeathVel=300
// unreal physics momentum
bExtraMomentumZ=True
KnockdownPower=0
StunPower=250
StumblePower=0
GunHitPower=0
MeleeHitPower=0
EMPPower=0
//bCanObliterate=true
//ObliterationHealthThreshold=-75
//ObliterationDamageThreshold=100
bCanGib=true
GoreDamageGroup=DGT_Obliteration
WeaponDef=class'KFWeapDef_HRG_CranialPopper'
ModifierPerkList(0)=class'KFPerk_Sharpshooter'
}

View File

@ -0,0 +1,16 @@
//=============================================================================
// KFDT_Bludgeon_AutoTurret
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFDT_Bludgeon_AutoTurret extends KFDT_Bludgeon_RifleButt
abstract
hidedropdown;
DefaultProperties
{
//defaults
WeaponDef=class'KFWeapDef_AutoTurret'
}

View File

@ -0,0 +1,16 @@
//=============================================================================
// KFDT_Bludgeon_HRG_CranialPopper
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFDT_Bludgeon_HRG_CranialPopper extends KFDT_Bludgeon_RifleButt
abstract
hidedropdown;
DefaultProperties
{
//defaults
WeaponDef=class'KFWeapDef_HRG_CranialPopper'
}

View File

@ -0,0 +1,16 @@
//=============================================================================
// KFDT_Bludgeon_HRG_Crossboom
//=============================================================================
// Killing Floor 2
// Copyright (C) 2022 Tripwire Interactive LLC
//=============================================================================
class KFDT_Bludgeon_HRG_Crossboom extends KFDT_Bludgeon_RifleButt
abstract
hidedropdown;
DefaultProperties
{
//defaults
WeaponDef=class'KFWeapDef_HRG_Crossboom'
}

View File

@ -0,0 +1,16 @@
//=============================================================================
// KFDT_Bludgeon_Flamethrower
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFDT_Bludgeon_ShrinkRay extends KFDT_Bludgeon_RifleButt
abstract
hidedropdown;
DefaultProperties
{
//defaults
WeaponDef=class'KFWeapDef_ShrinkRayGun'
}

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