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 ) if ( Pawn == None || Pawn.InvManager == None )
return; return;
Pawn.InvManager.SwitchToBestWeapon(bForceNewWeapon); Pawn.InvManager.SwitchToBestWeapon(bForceNewWeapon, check_9mm_logic);
} }
/* epic =============================================== /* epic ===============================================
@ -1070,7 +1070,11 @@ exec function SwitchToBestWeapon(optional bool bForceNewWeapon)
*/ */
reliable client function ClientSwitchToBestWeapon(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 =============================================== /* epic ===============================================

View File

@ -386,7 +386,7 @@ simulated function float GetWeaponRatingFor( Weapon W )
/** /**
* returns the best weapon for this Pawn in loadout * 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 Weapon W, BestWeapon;
local float Rating, BestRating; local float Rating, BestRating;
@ -419,7 +419,7 @@ simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon )
* Switch to best weapon available in loadout * Switch to best weapon available in loadout
* Network: LocalPlayer * Network: LocalPlayer
*/ */
simulated function SwitchToBestWeapon( optional bool bForceADifferentWeapon ) simulated function SwitchToBestWeapon( optional bool bForceADifferentWeapon, optional bool check_9mm_logic = false )
{ {
local Weapon BestWeapon; 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 StartTime (optional) What time to start the animation at
* @param bPlayBackwards (optional) Play this animation backwards * @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 AnimNodeSequence AnimNode;
local float DesiredRate; local float DesiredRate;
local bool bIsAnimPlayed;
bIsAnimPlayed = false;
AnimNode = AnimNodeSequence(Animations); AnimNode = AnimNodeSequence(Animations);
if (AnimNode == None && Animations.IsA('AnimTree')) 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) if (bRestartIfAlreadyPlaying || !AnimNode.bPlaying)
{ {
AnimNode.PlayAnim(bLoop, DesiredRate, StartTime); AnimNode.PlayAnim(bLoop, DesiredRate, StartTime);
bIsAnimPlayed = true;
} }
else 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 = (Duration > 0.0) ? (AnimNode.AnimSeq.SequenceLength / (Duration * AnimNode.AnimSeq.RateScale)) : 1.0;
DesiredRate = (bPlayBackwards) ? -DesiredRate : DesiredRate; DesiredRate = (bPlayBackwards) ? -DesiredRate : DesiredRate;
AnimNode.PlayAnim(bLoop, DesiredRate, StartTime); AnimNode.PlayAnim(bLoop, DesiredRate, StartTime);
bIsAnimPlayed = true;
} }
} }
} }
return bIsAnimPlayed;
} }
/** simple generic case animation stopper /** simple generic case animation stopper

View File

@ -42,7 +42,8 @@ struct AARAward
var array<AARAward> TeamAwardList; var array<AARAward> TeamAwardList;
enum ETeamAwards enum ETeamAwards
{ {
ETA_WeaponMaster,
ETA_ZedStomper, ETA_ZedStomper,
ETA_MedicineMaster, ETA_MedicineMaster,
ETA_ZedSlayer, ETA_ZedSlayer,
@ -1103,6 +1104,9 @@ static function GetTeamAward(ETeamAwards AwardIndex, out AARAward TempAwardObjec
case ETA_ZedStomper: case ETA_ZedStomper:
Give_ZedStomper(TempAwardObject, KFPCArray); Give_ZedStomper(TempAwardObject, KFPCArray);
break; 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) function ReceiveAwardInfo(byte AwardID, PlayerReplicationInfo PRI, int Value)
{ {
TeamAwardList[AwardID].PRI = PRI; 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_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_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_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 //zed awards
TeamAwardList(ETA_Carnage)=(TitleIdentifier="Carnage",ValueIdentifier="CarnageValue",IconPath="ui_award_zeds.UI_Award_ZED_RawDmg") 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") 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 ) 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 // total immunity during cooldown
if ( LastActivationTime > 0 && `TimeSinceEx(PawnOwner, LastActivationTime) < Cooldown ) if ( LastActivationTime > 0 && `TimeSinceEx(PawnOwner, LastActivationTime) < Cooldown )
@ -80,14 +80,14 @@ function Accrue(float InPower)
CurrentStrength = fClamp(CurrentStrength + InPower, InPower, INCAP_THRESHOLD); CurrentStrength = fClamp(CurrentStrength + InPower, InPower, INCAP_THRESHOLD);
if ( CurrentStrength >= INCAP_THRESHOLD ) if ( CurrentStrength >= INCAP_THRESHOLD )
{ {
Activate(); Activate(DamageType);
} }
`log(Class.Name@"Added="$InPower@"NewStrength="$CurrentStrength, bDebug); `log(Class.Name@"Added="$InPower@"NewStrength="$CurrentStrength, bDebug);
} }
/** */ /** */
function Activate() function Activate(optional class<KFDamageType> DamageType = none)
{ {
if ( SpecialMove != SM_None ) if ( SpecialMove != SM_None )
{ {
@ -159,6 +159,11 @@ function float GetAttackSpeedModifier()
return 1.f; return 1.f;
} }
function float GetDamageTakenModifier()
{
return 0.f;
}
defaultproperties defaultproperties
{ {
//bDebug=true //bDebug=true

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,7 +9,7 @@
class KFAffliction_MediumRecovery extends KFAfflictionBase; class KFAffliction_MediumRecovery extends KFAfflictionBase;
/** */ /** */
function Activate() function Activate(optional class<KFDamageType> DamageType = none)
{ {
// Attempt to interrupt the special move // Attempt to interrupt the special move
if( PawnOwner.SpecialMove != SM_None ) 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 */ /** Sound to play when this pawn stops being on fire */
var protected AkEvent OnSteamEndSound; var protected AkEvent OnSteamEndSound;
function Activate() function Activate(optional class<KFDamageType> DamageType = none)
{ {
Super.Activate(); Super.Activate();
SetMicrowavePanicked(true); SetMicrowavePanicked(true);

View File

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

View File

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

View File

@ -871,7 +871,7 @@ private function SetAttachmentMeshAndSkin(
CharAttachmentSocketName, KFP.ArmsMesh, KFP, true); CharAttachmentSocketName, KFP.ArmsMesh, KFP, true);
KFGRI = KFGameReplicationInfo(KFP.WorldInfo.GRI); 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( SetWeeklyCowboyAttachmentSkinMaterial(
AttachmentSlotIndex, AttachmentSlotIndex,
@ -917,7 +917,7 @@ private function SetAttachmentMeshAndSkin(
CharAttachmentSocketName, KFP.Mesh, KFP, false); CharAttachmentSocketName, KFP.Mesh, KFP, false);
KFGRI = KFGameReplicationInfo(KFP.WorldInfo.GRI); 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( SetWeeklyCowboyAttachmentSkinMaterial(
AttachmentSlotIndex, 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.StaticAttachment = StaticMesh(DynamicLoadObject(ZEDCowboyHatMeshPath, class'StaticMesh'));
NewAttachment.AttachSocketName = KFPawn_Monster(KFP).ZEDCowboyHatAttachName; 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> DifficultyStrings;
var localized array<string> LengthStrings; 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> ServerTypeStrings;
var localized array<string> PermissionStrings; var localized array<string> PermissionStrings;
var localized array<string> ConsolePermissionStrings; 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 FreezePower;
var float SnarePower; var float SnarePower;
var float BleedPower; var float BleedPower;
var float BigHeadPower;
var float ShrinkPower;
/********************************************************************************************* /*********************************************************************************************
Impact Effects Impact Effects
********************************************************************************************* */ ********************************************************************************************* */

View File

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

View File

@ -89,7 +89,19 @@ function UpdateWaveCount()
} }
CurrentWaveNum = KFGRI.WaveNum; 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); SetString("waveNumber", class'KFGFxHUD_WaveInfo'.default.BossWaveString);
} }

View File

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

View File

@ -306,6 +306,7 @@ function UpdateAttachmentsList(array<AttachmentVariants> Attachments)
local string AttachmentName; local string AttachmentName;
local PlayerController PC; local PlayerController PC;
local bool bIsWildWest; local bool bIsWildWest;
local KFGameReplicationInfo KFGRI;
bIsWildWest = false; bIsWildWest = false;
ItemIndex = 0; ItemIndex = 0;
@ -322,7 +323,8 @@ function UpdateAttachmentsList(array<AttachmentVariants> Attachments)
ItemIndex++; ItemIndex++;
PC = GetPC(); 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++) for (i = 0; i < Attachments.length; i++)
{ {
@ -773,9 +775,14 @@ function ForceWeeklyCowboyHat()
{ {
local PlayerController PC; local PlayerController PC;
local int CowboyHatIndex; 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); CowboyHatIndex = FindCowboyHatAttachmentIndex(CurrentCharInfo);
if (CowboyHatIndex >= 0) if (CowboyHatIndex >= 0)

View File

@ -131,9 +131,22 @@ struct InventoryHelper
var int ItemDefinition; var int ItemDefinition;
var int ItemIndex; var int ItemIndex;
var int ItemCount; var int ItemCount;
var ItemType Type;
var GFxObject GfxItemObject; 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 EInventoryWeaponType_Filter CurrentWeaponTypeFilter;
var int CurrentPerkIndexFilter; var int CurrentPerkIndexFilter;
var ItemRarity CurrentRarityFilter; var ItemRarity CurrentRarityFilter;
@ -142,9 +155,14 @@ var EINventory_Filter CurrentInventoryFilter;
var ExchangeRuleSets RuleToExchange; var ExchangeRuleSets RuleToExchange;
var private int CrcTable[256];
function InitializeMenu( KFGFxMoviePlayer_Manager InManager ) function InitializeMenu( KFGFxMoviePlayer_Manager InManager )
{ {
super.InitializeMenu( InManager ); super.InitializeMenu( InManager );
CrcInit();
KFPC = KFPlayerController(GetPC()); KFPC = KFPlayerController(GetPC());
CurrentPerkIndexFilter = KFPC.PerkList.length; //default value 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() function InitInventory()
{ {
local int i, ItemIndex, HelperIndex; local int i, ItemIndex, HelperIndex, WeaponItemID, SearchWeaponSkinIndex;
local ItemProperties TempItemDetailsHolder; local ItemProperties TempItemDetailsHolder;
local GFxObject ItemArray, ItemObject; local GFxObject ItemArray, ItemObject;
local bool bActiveItem; local bool bActiveItem;
local array<InventoryHelper> ActiveItems; local array<InventoryHelper> ActiveItems, ValidSkinItems, FailedSkinItems;
local InventoryHelper HelperItem; local InventoryHelper HelperItem;
local array<ExchangeRuleSets> ExchangeRules; local array<ExchangeRuleSets> ExchangeRules;
local class<KFWeaponDefinition> WeaponDef;
local string SkinType;
local GFxObject PendingItem; local GFxObject PendingItem;
@ -249,6 +347,7 @@ function InitInventory()
SetObject("inventoryList", ItemArray); SetObject("inventoryList", ItemArray);
return; return;
} }
for (i = 0; i < OnlineSub.CurrentInventory.length; i++) for (i = 0; i < OnlineSub.CurrentInventory.length; i++)
{ {
//look item up to get info on it. //look item up to get info on it.
@ -264,10 +363,62 @@ function InitInventory()
ItemObject = CreateObject("Object"); ItemObject = CreateObject("Object");
HelperIndex = ActiveItems.Find('ItemDefinition', onlineSub.CurrentInventory[i].Definition); HelperIndex = ActiveItems.Find('ItemDefinition', onlineSub.CurrentInventory[i].Definition);
if(HelperIndex == INDEX_NONE) if (HelperIndex == INDEX_NONE)
{ {
HelperItem.ItemDefinition = onlineSub.CurrentInventory[i].Definition; HelperItem.ItemDefinition = onlineSub.CurrentInventory[i].Definition;
HelperItem.ItemCount = onlineSub.CurrentInventory[i].Quantity; 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); ActiveItems.AddItem(HelperItem);
HelperIndex = ActiveItems.length - 1; HelperIndex = ActiveItems.length - 1;
} }
@ -314,9 +465,87 @@ function InitInventory()
OnlineSub.ClearNewlyAdded(); 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); SetObject("inventoryList", ItemArray);
@ -376,6 +605,9 @@ function OnItemExhangeTimeOut()
function FinishCraft() function FinishCraft()
{ {
SetVisible(true); SetVisible(true);
`Log("FinishCraft");
NeedToRegenerateSkinList = true;
} }
function SetMatineeColor(int ItemRarity) function SetMatineeColor(int ItemRarity)
@ -494,10 +726,12 @@ function bool IsItemActive(int ItemDefinition)
if(WeaponDef != none) if(WeaponDef != none)
{ {
return class'KFWeaponSkinList'.Static.IsSkinEquip(WeaponDef, ItemDefinition); if (class'KFWeaponSkinList'.Static.IsSkinEquip(WeaponDef, ItemDefinition))
{
return true;
}
} }
return false; return false;
} }
@ -953,6 +1187,7 @@ function Callback_Equip( int ItemDefinition )
} }
//refresh inventory //refresh inventory
NeedToRegenerateSkinList = true; // need to regenerate as the equipped state changed
InitInventory(); InitInventory();
} }
@ -1249,6 +1484,8 @@ function Callback_PreviewItem( int ItemDefinition )
defaultproperties defaultproperties
{ {
NeedToRegenerateSkinList=false
CurrentWeaponTypeFilter = EInvWT_None; CurrentWeaponTypeFilter = EInvWT_None;
CurrentRarityFilter = ITR_NONE; CurrentRarityFilter = ITR_NONE;

View File

@ -39,11 +39,17 @@ var KFPlayerReplicationInfo MyKFPRI;
var bool bModifiedSkills; var bool bModifiedSkills;
var bool bModifiedPerk; var bool bModifiedPerk;
var bool bChangesMadeDuringLobby; var bool bChangesMadeDuringLobby;
var bool bModifiedWeaponIndexes;
var name PerkLevelupSound; var name PerkLevelupSound;
var byte SelectedSkillsHolder[`MAX_PERK_SKILLS]; 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) function InitializeMenu(KFGFxMoviePlayer_Manager InManager)
{ {
super.InitializeMenu(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 = KFGFxPerksContainer_Details(Widget);//some reason this is coming out to none!
DetailsContainer.Initialize( self ); DetailsContainer.Initialize( self );
DetailsContainer.UpdateDetails(PerkClass); DetailsContainer.UpdateDetails(PerkClass, SelectedSkillsHolder, false, false);
DetailsContainer.UpdatePassives(PerkClass); DetailsContainer.UpdatePassives(PerkClass);
} }
break; break;
@ -114,6 +120,8 @@ function OnOpen()
{ {
local KFGameReplicationInfo KFGRI; local KFGameReplicationInfo KFGRI;
GetGameViewportClient().HandleInputAxis = OnAxisModified;
LastPerkIndex = KFPC.SavedPerkIndex; LastPerkIndex = KFPC.SavedPerkIndex;
MyKFPRI = KFPlayerReplicationInfo( GetPC().PlayerReplicationInfo ); MyKFPRI = KFPlayerReplicationInfo( GetPC().PlayerReplicationInfo );
@ -196,9 +204,11 @@ event OnClose()
{ {
local bool bShouldUpdatePerk; local bool bShouldUpdatePerk;
GetGameViewportClient().HandleInputAxis = none;
if( KFPC != none ) if( KFPC != none )
{ {
if( bModifiedPerk || bModifiedSkills ) if( bModifiedPerk || bModifiedSkills || bModifiedWeaponIndexes)
{ {
bShouldUpdatePerk = bModifiedPerk && LastPerkIndex != KFPC.SavedPerkIndex; bShouldUpdatePerk = bModifiedPerk && LastPerkIndex != KFPC.SavedPerkIndex;
@ -215,8 +225,15 @@ event OnClose()
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SavedPerkIndex, LastPerkIndex ); Manager.CachedProfile.SetProfileSettingValueInt( KFID_SavedPerkIndex, LastPerkIndex );
} }
if (bModifiedWeaponIndexes)
{
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingWeapIdx, KFPC.SurvivalPerkWeapIndex );
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingGrenIdx, KFPC.SurvivalPerkGrenIndex );
}
bModifiedPerk = false; bModifiedPerk = false;
bModifiedSkills = false; bModifiedSkills = false;
bModifiedWeaponIndexes = false;
} }
} }
@ -323,7 +340,7 @@ function UpdateContainers( class<KFPerk> PerkClass, optional bool bClickedIndex=
if( DetailsContainer != none ) if( DetailsContainer != none )
{ {
DetailsContainer.UpdateDetails( PerkClass ); DetailsContainer.UpdateDetails( PerkClass, SelectedSkillsHolder, false, false );
DetailsContainer.UpdatePassives( PerkClass ); DetailsContainer.UpdatePassives( PerkClass );
} }
@ -457,6 +474,11 @@ function Callback_SkillSelected( byte TierIndex, byte SkillIndex )
SelectedSkillsHolder[TierIndex] = SkillIndex; SelectedSkillsHolder[TierIndex] = SkillIndex;
UpdateSkillsUI(KFPC.PerkList[LastPerkIndex].PerkClass); UpdateSkillsUI(KFPC.PerkList[LastPerkIndex].PerkClass);
SavePerkData(); SavePerkData();
if ( KFPC.PerkList[LastPerkIndex].PerkClass.Name == 'KFPerk_Survivalist' )
{
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, false );
}
} }
} }
@ -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 defaultproperties
{ {
PerkLevelupSound=LevelUp_Popup PerkLevelupSound=LevelUp_Popup
@ -481,4 +607,9 @@ defaultproperties
SubWidgetBindings.Add((WidgetName="SelectedPerkSummaryContainer",WidgetClass=class'KFGFxPerksContainer_SkillsSummary')) SubWidgetBindings.Add((WidgetName="SelectedPerkSummaryContainer",WidgetClass=class'KFGFxPerksContainer_SkillsSummary'))
LastPerkIndex=255 LastPerkIndex=255
LastPerkLevel=255 LastPerkLevel=255
bAxisResetLeft=true
bAxisResetRight=false
StickInputThreshold=0.5
StickResetThreshold=0.5
} }

View File

@ -216,7 +216,11 @@ function SetSumarryInfo()
} }
else 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)); TextObject.SetString("waveTime", WaveString @ KFGRI.WaveNum @"-" @FormatTime(KFGRI.ElapsedTime));
} }

View File

@ -70,6 +70,9 @@ var KFGFxWidget_BossHealthBar bossHealthBar;
var KFGFxWidget_MapText MapTextWidget; var KFGFxWidget_MapText MapTextWidget;
// Widget that displays map texts // Widget that displays map texts
var KFGFxWidget_MapCounterText MapCounterTextWidget; var KFGFxWidget_MapCounterText MapCounterTextWidget;
// Widget that displays gun mode texts
var KFGFxWidget_GunGame GunGameWidget;
var KFPlayerController KFPC; var KFPlayerController KFPC;
@ -102,6 +105,9 @@ var Protected float LastUpdateTime;
// The name of the player currently being voted on to kick // The name of the player currently being voted on to kick
var string PendingKickPlayerName; var string PendingKickPlayerName;
// Gun game variables
var transient bool bLastGunGameVisibility;
/** On creation of the HUD */ /** On creation of the HUD */
function Init(optional LocalPlayer LocPlay) function Init(optional LocalPlayer LocPlay)
{ {
@ -348,6 +354,13 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
GoompaCounterWidget=KFGFxWidget_GoompaCounter(Widget); GoompaCounterWidget=KFGFxWidget_GoompaCounter(Widget);
} }
break; break;
case 'GunGameContainer':
if (GunGameWidget == none)
{
GunGameWidget=KFGFxWidget_GunGame(Widget);
SetWidgetPathBinding( Widget, WidgetPath );
}
break;
} }
return true; return true;
@ -376,6 +389,8 @@ function UpdateWeaponSelect()
/** Update all the unique HUD pieces */ /** Update all the unique HUD pieces */
function TickHud(float DeltaTime) function TickHud(float DeltaTime)
{ {
local bool bGunGameVisibility;
if(KFPC == none || KFPC.WorldInfo.TimeSeconds - LastUpdateTime < UpdateInterval ) if(KFPC == none || KFPC.WorldInfo.TimeSeconds - LastUpdateTime < UpdateInterval )
{ {
return; return;
@ -447,6 +462,22 @@ function TickHud(float DeltaTime)
{ {
GfxScoreBoardPlayer.TickHud(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() function UpdateObjectiveActive()
@ -781,7 +812,18 @@ function DisplayExpandedWaveInfo()
} }
else 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); 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 // Input
//============================================================== //==============================================================
@ -1441,6 +1491,8 @@ DefaultProperties
bAutoPlay=true bAutoPlay=true
bIsSpectating=false bIsSpectating=false
bLastGunGameVisibility=true
WidgetBindings.Add((WidgetName="ObjectiveContainer",WidgetClass=class'KFGFxHUD_ObjectiveConatiner')) WidgetBindings.Add((WidgetName="ObjectiveContainer",WidgetClass=class'KFGFxHUD_ObjectiveConatiner'))
WidgetBindings.Add((WidgetName="SpectatorInfoWidget",WidgetClass=class'KFGFxHUD_SpectatorInfo')) WidgetBindings.Add((WidgetName="SpectatorInfoWidget",WidgetClass=class'KFGFxHUD_SpectatorInfo'))
WidgetBindings.Add((WidgetName="PlayerStatWidgetMC",WidgetClass=class'KFGFxHUD_PlayerStatus')) WidgetBindings.Add((WidgetName="PlayerStatWidgetMC",WidgetClass=class'KFGFxHUD_PlayerStatus'))
@ -1465,6 +1517,7 @@ DefaultProperties
WidgetBindings.Add((WidgetName="bossHealthBar", WidgetClass=class'KFGFxWidget_BossHealthBar')) WidgetBindings.Add((WidgetName="bossHealthBar", WidgetClass=class'KFGFxWidget_BossHealthBar'))
WidgetBindings.Add((WidgetName="mapTextWidget", WidgetClass=class'KFGFxWidget_MapText')) WidgetBindings.Add((WidgetName="mapTextWidget", WidgetClass=class'KFGFxWidget_MapText'))
WidgetBindings.Add((WidgetName="counterMapTextWidget", WidgetClass=class'KFGFxWidget_MapCounterText')) 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" SpecialWaveIconPath(AT_Clot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Cyst"

View File

@ -25,53 +25,68 @@ function LocalizeContainer()
GetObject("basicLoadoutTextField").SetString("text", BasicLoadoutString); 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 GFxObject DetailsProvider;
local KFPlayerController KFPC;
local array<string> WeaponNames; local array<string> WeaponNames;
local array<string> WeaponSources; local array<string> WeaponSources;
local int i; local int i;
DetailsProvider = CreateObject( "Object" ); 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() ); KFPC = KFPlayerController( GetPC() );
if ( KFPC != none) if ( KFPC == none)
{ {
if(KFPC != none) return;
{
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 );
} }
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) 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 ); 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 localized string TopVotesString;
var string MapVoteString; //localized in parent and parent passes it to this class 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 // Initialization
//============================================================== //==============================================================
@ -47,36 +55,46 @@ function SetMapOptions()
local bool IsWeeklyMode; local bool IsWeeklyMode;
local bool IsBrokenTrader; local bool IsBrokenTrader;
local bool IsBossRush; local bool IsBossRush;
local bool IsGunGame;
local bool bShouldSkipMaps;
local name MapName;
KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI); KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI);
bShouldSkipMaps = false;
Counter = 0; Counter = 0;
if(KFGRI != none && KFGRI.VoteCollector != none) if(KFGRI != none && KFGRI.VoteCollector != none)
{ {
ServerMapList = KFGRI.VoteCollector.MapList; ServerMapList = KFGRI.VoteCollector.MapList;
IsWeeklyMode = KFGRI.bIsWeeklyMode; IsWeeklyMode = KFGRI.bIsWeeklyMode;
IsBrokenTrader = KFGRI.CurrentWeeklyIndex == 11; IsBrokenTrader = KFGRI.CurrentWeeklyIndex == 11;
IsBossRush = KFGRI.CurrentWeeklyIndex == 14; IsBossRush = KFGRI.CurrentWeeklyIndex == 14;
IsGunGame = KFGRI.CurrentWeeklyIndex == 16;
bShouldSkipMaps = IsWeeklyMode && (IsBrokenTrader || IsBossRush || IsGunGame);
//gfx //gfx
MapList = CreateArray(); MapList = CreateArray();
for (i = 0; i < ServerMapList.length; i++) for (i = 0; i < ServerMapList.length; i++)
{ {
if ( IsWeeklyMode && (IsBrokenTrader || IsBossRush) && ( ServerMapList[i] == "KF-Biolapse" || MapName = name(ServerMapList[i]);
ServerMapList[i] == "KF-Nightmare" || if ( bShouldSkipMaps && ( MapName == MapBiolapse ||
ServerMapList[i] == "KF-PowerCore_Holdout" || MapName == MapNightmare ||
ServerMapList[i] == "KF-TheDescent" || MapName == MapPowerCore ||
ServerMapList[i] == "KF-KrampusLair")) MapName == MapDescent ||
MapName == MapKrampus))
{ {
continue; continue;
} }
/* Temporary removal of SteamFrotress for BossRush */ /* Temporary removal of SteamFrotress for BossRush */
if (IsWeeklyMode && IsBossRush && ServerMapList[i] == "KF-SteamFortress") if (IsWeeklyMode && IsBossRush && MapName == MapSteam)
{ {
continue; continue;
} }
/**/ /* */
MapObject = CreateObject("Object"); MapObject = CreateObject("Object");
MapObject.SetString("label", class'KFCommon_LocalizedStrings'.static.GetFriendlyMapName(ServerMapList[i]) ); MapObject.SetString("label", class'KFCommon_LocalizedStrings'.static.GetFriendlyMapName(ServerMapList[i]) );

View File

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

View File

@ -182,31 +182,40 @@ function FillWhatsNew()
local SWhatsNew item; local SWhatsNew item;
WhatsNewItems.Remove(0, WhatsNewItems.Length); WhatsNewItems.Remove(0, WhatsNewItems.Length);
// Latest Update // Latest Update
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_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); WhatsNewItems.AddItem(item);
// KF2 Armory Season Pass 2021 // KF2 Armory Season Pass 2022
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Spring_Armory_Season_Pass", "ArmorySeasonPass", "https://store.steampowered.com/app/1524820/Killing_Floor_2__Armory_Season_Pass"); item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_ArmorySeasonPassII", "ArmorySeasonPass", "https://store.steampowered.com/app/1914490/KF2__Season_Pass_2022");
WhatsNewItems.AddItem(item); WhatsNewItems.AddItem(item);
// Featured Time Limited 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); WhatsNewItems.AddItem(item);
// Featured Full Gear // 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); WhatsNewItems.AddItem(item);
// Featured Outfit Bundle // 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); WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle // Featured Weapon
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Christmas", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9264"); item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_ReductoRay", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9367");
WhatsNewItems.AddItem(item); WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle // Featured Weapon
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Alchemist_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9265"); item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_Sentinel","FeaturedItemBundle","https://store.steampowered.com/buyitem/232090/9368");
WhatsNewItems.AddItem(item);
// Featured Cosmetic Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Alchemist","FeaturedItemBundle","https://store.steampowered.com/buyitem/232090/9266");
WhatsNewItems.AddItem(item); WhatsNewItems.AddItem(item);
// Featured Weapon Bundle // 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); WhatsNewItems.AddItem(item);
// Misc Community Links // Misc Community Links
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityHub", "Jaegorhorn", "https://steamcommunity.com/app/232090"); item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityHub", "Jaegorhorn", "https://steamcommunity.com/app/232090");

View File

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

View File

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

View File

@ -34,8 +34,11 @@ function UpdateGameInfo()
} }
else else
{ {
// Show the upcoming wave number for every wave except the boss wave if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
if (KFGRI.default.bEndlessMode) {
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 // Show wave number, since there is no max
FinalWaveString = WaveString @ (KFGRI.WaveNum); FinalWaveString = WaveString @ (KFGRI.WaveNum);

View File

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

View File

@ -442,6 +442,14 @@ var int SpawnedMonsterProperties[EMonsterProperties];
*/ */
var transient array< byte > BossRushEnemies; 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 * @name Native
***********************************************************************************/ ***********************************************************************************/
@ -1193,14 +1201,7 @@ function ResetPickups( array<KFPickupFactory> PickupList, int NumPickups )
PossiblePickups = PickupList; PossiblePickups = PickupList;
if (OutbreakEvent != none && OutbreakEvent.ActiveEvent.bUnlimitedWeaponPickups && KFPickupFactory_Item(PickupList[0]) != none) NumIterations = Min(NumPickups, PickupList.Length - 1);
{
NumIterations = Min(NumPickups, PickupList.Length - 1);
}
else
{
NumIterations = Min(NumPickups, PickupList.Length);
}
for ( i = 0; i < NumIterations; i++ ) for ( i = 0; i < NumIterations; i++ )
{ {
@ -1267,8 +1268,15 @@ function ActivateNextPickup( KFPickupFactory NextFactory, int RespawnDelay )
{ {
if( NextFactory != none ) if( NextFactory != none )
{ {
NextFactory.bToBeActivated = true; if (NextFactory.CanUsePickup())
NextFactory.SetTimer( RespawnDelay, , nameof(NextFactory.Reset) ); {
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) */ /** Returns a low rating if other players are nearby (spawn will fail) */
function float RatePlayerStart(PlayerStart P, byte Team, Controller Player) function float RatePlayerStart(PlayerStart P, byte Team, Controller Player)
{ {
@ -2895,62 +2911,69 @@ function string GetNextMap()
{ {
local array<string> MapList; local array<string> MapList;
local int i; 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 ) if ( MapCycleIndex == INDEX_NONE )
{ {
MapList = GameMapCycles[ActiveMapCycle].Maps; // Assume current map is actually zero
MapCycleIndex = GetCurrentMapCycleIndex(MapList); MapCycleIndex = 0;
if ( MapCycleIndex == INDEX_NONE )
{
// 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 ((class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 11 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[11]) || // Scavenger
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14]) || // Boss Rush
if (MyKFGRI.IsA('KFGameReplicationInfo_WeeklySurvival')) (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 16 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[16])) // Gun Game
{ {
if ((class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 11 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[11]) || // Scavenger MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
(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;
}
}
/* Temporary removal of SteamFrotress for BossRush */ if (MapName == MapBiolapse ||
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14] && MapName == MapNightmare ||
GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex] == "KF-SteamFortress") MapName == MapPowerCore ||
MapName == MapDescent ||
MapName == MapKrampus)
{ {
continue; 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(); continue;
return GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex];
} }
/* */
} }
return string(WorldInfo.GetPackageName()); if ( IsMapAllowedInCycle(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]) )
} {
else SaveConfig();
{ return GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex];
return string(WorldInfo.GetPackageName()); }
} }
return string(WorldInfo.GetPackageName());
}
else
{
return string(WorldInfo.GetPackageName());
}
return ""; return "";
} }
@ -3781,14 +3804,22 @@ function UpdateCurrentMapVoteTime(byte NewTime, optional bool bStartTime);
function float GetTraderTime() function float GetTraderTime()
{ {
local float MapOverride; 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)); MapOverride = DifficultyInfo.GetTraderTimeByMap(WorldInfo.GetMapName(true));
if (MapOverride > 0.f) 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 bWaveIsActive;
var repnotify bool bWaveStarted; var repnotify bool bWaveStarted;
var bool bIsEndlessPaused; var bool bIsEndlessPaused;
var bool bForceSkipTraderUI;
/** Replicates at beginning and end of waves to change track / track type */ /** Replicates at beginning and end of waves to change track / track type */
var repnotify byte MusicTrackRepCount; var repnotify byte MusicTrackRepCount;
@ -107,6 +108,8 @@ var repnotify PerkAvailableData PerksAvailableData;
var byte WaveMax; // The "end" wave var byte WaveMax; // The "end" wave
var repnotify byte WaveNum; // The wave we are currently in var repnotify byte WaveNum; // The wave we are currently in
var bool bWaveIsEndless; var bool bWaveIsEndless;
var repnotify byte GunGameWavesCurrent;
var repnotify bool bWaveGunGameIsFinal;
var int AIRemaining; var int AIRemaining;
var int WaveTotalAICount; var int WaveTotalAICount;
var bool bEndlessMode; var bool bEndlessMode;
@ -358,6 +361,9 @@ var transient bool bIsBrokenTrader;
************************************/ ************************************/
var int CurrentWeeklyIndex; var int CurrentWeeklyIndex;
/** If true, force show skip time between waves ready button */
var bool bForceShowSkipTrader;
/************************************ /************************************
* Steam heartbeat * Steam heartbeat
************************************/ ************************************/
@ -389,11 +395,12 @@ cpptext
replication replication
{ {
if ( bNetDirty ) 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, 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 ) if ( bNetInitial )
GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled; GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled, bForceShowSkipTrader;
if ( bNetInitial || bNetDirty ) if ( bNetInitial || bNetDirty )
PerksAvailableData; PerksAvailableData;
if ( bNetInitial && Role == ROLE_Authority ) if ( bNetInitial && Role == ROLE_Authority )
@ -543,6 +550,14 @@ simulated event ReplicatedEvent(name VarName)
{ {
UpdatePerksAvailable(); UpdatePerksAvailable();
} }
else if (VarName == 'GunGameWavesCurrent')
{
UpdateHUDWaveCount();
}
else if (VarName == 'bWaveGunGameIsFinal')
{
UpdateHUDWaveCount();
}
else else
{ {
super.ReplicatedEvent(VarName); super.ReplicatedEvent(VarName);
@ -797,7 +812,7 @@ simulated function EndGame()
bMatchHasBegun = false; bMatchHasBegun = false;
bMatchIsOver = true; bMatchIsOver = true;
class'KFGameEngine'.static.RefreshOnlineGameData(false); class'KFGameEngine'.static.RefreshOnlineGameData(true);
} }
/* Welcome screen shenanigans */ /* Welcome screen shenanigans */
@ -1111,6 +1126,7 @@ function SetWaveActive(bool bWaveActive, optional byte NewMusicIntensity)
// set up music intensity for this wave // set up music intensity for this wave
MusicIntensity = NewMusicIntensity; MusicIntensity = NewMusicIntensity;
bTraderIsOpen = !bWaveActive && bMatchHasBegun && bTradersEnabled; bTraderIsOpen = !bWaveActive && bMatchHasBegun && bTradersEnabled;
bForceSkipTraderUI = !bWaveActive && bMatchHasBegun && bForceShowSkipTrader;
bWaveIsActive = bWaveActive; bWaveIsActive = bWaveActive;
bForceNetUpdate = true; bForceNetUpdate = true;
@ -2029,21 +2045,25 @@ function int SetNextObjective(array<KFInterface_MapObjective> PossibleObjectives
while (PossibleObjectives.Length > 0) while (PossibleObjectives.Length > 0)
{ {
RandID = Rand(PossibleObjectives.Length); RandID = Rand(PossibleObjectives.Length);
PctChanceToActivate = PossibleObjectives[RandID].GetActivationPctChance();
if (bForceNextObjective || (PossibleObjectives[RandID].CanActivateObjective() && PreviousObjective != PossibleObjectives[RandID] && (PctChanceToActivate >= 1.f || DieRoll <= PctChanceToActivate))) if (PossibleObjectives[RandID].CanActivateObjectiveByWeekly())
{ {
if (bActivateImmediately) 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); PossibleObjectives.Remove(RandID, 1);
} }
@ -2268,4 +2288,8 @@ defaultproperties
PreviousObjectiveXPResult=-1 PreviousObjectiveXPResult=-1
bIsBrokenTrader=false bIsBrokenTrader=false
bIsWeeklyMode=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: case SEI_Spring:
return class'KFGFxSpecialEventObjectivesContainer_Spring2021'; return class'KFGFxSpecialEventObjectivesContainer_Spring2021';
case SEI_Summer: case SEI_Summer:
return class'KFGFxSpecialEventObjectivesContainer_Summer2021'; return class'KFGFxSpecialEventObjectivesContainer_Summer2022';
case SEI_Fall: case SEI_Fall:
return class'KFGFxSpecialEventObjectivesContainer_Fall2021'; return class'KFGFxSpecialEventObjectivesContainer_Fall2021';
case SEI_Winter: case SEI_Winter:

View File

@ -1866,7 +1866,7 @@ event bool FilterButtonInput(int ControllerId, name ButtonName, EInputEvent Inpu
PartyWidget.ReadyButton.SetBool("selected", KFPRI.bReadyToPlay); 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; bForceCloseMenuNextTime = true;
CurrentMenu.Callback_ReadyClicked(true); CurrentMenu.Callback_ReadyClicked(true);

View File

@ -234,7 +234,7 @@ function Callback_ReadyClicked( bool bReady )
if (KFGRI.bMatchHasBegun) if (KFGRI.bMatchHasBegun)
{ {
//player has spawned, skip trader time //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) if (KFPC.MyGFxManager.bMenusOpen && KFPC.MyGFxManager.CurrentMenu != KFPC.MyGFxManager.TraderMenu)
{ {
@ -506,6 +506,26 @@ function Callback_ChatFocusOut()
Manager.UpdateDynamicIgnoreKeys(); 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 */ /** 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 // 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); HitActor = EffectInstigator.Trace(NewHitLoc, HitNormal, (HitLocation - (HitNormal * 32)), HitLocation + (HitNormal * 32), !bWorldImpactsOnly,, HitInfo, TRACEFLAG_Bullet);

View File

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

View File

@ -495,6 +495,130 @@ function bool ClassNameIsInInventory(name ItemClassName, out Inventory out_Inven
return false; 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 * Switches to Previous weapon
* Network: Client * Network: Client
@ -943,7 +1067,7 @@ reliable client function SetCurrentWeapon(Weapon DesiredWeapon)
local KFWeapon DesiredKFW; local KFWeapon DesiredKFW;
local KFWeapon PendingKFW; local KFWeapon PendingKFW;
CurrentKFW = KFWeapon(Instigator.Weapon); CurrentKFW = Instigator != none ? KFWeapon(Instigator.Weapon) : none;
if ( CurrentKFW != none ) if ( CurrentKFW != none )
{ {
// Set the flag to switch to ironsights when the weapon is brought up // 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 // Only change your weapon if it is different or we weant to equip the weapon we are currently putting down
DesiredKFW = KFWeapon(DesiredWeapon); DesiredKFW = KFWeapon(DesiredWeapon);
if( DesiredKFW != none && if( DesiredKFW != none &&
Instigator != none &&
(DesiredKFW != Instigator.Weapon || Instigator.Weapon.IsInState('WeaponPuttingDown')) ) (DesiredKFW != Instigator.Weapon || Instigator.Weapon.IsInState('WeaponPuttingDown')) )
{ {
if ( DesiredKFW.bHasIronSights ) if ( DesiredKFW.bHasIronSights )

View File

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

View File

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

View File

@ -70,6 +70,7 @@ defaultproperties
ColumnIds.Add(STATID_ACHIEVE_MoonbaseCollectibles) ColumnIds.Add(STATID_ACHIEVE_MoonbaseCollectibles)
ColumnIds.Add(STATID_ACHIEVE_NetherholdCollectibles) ColumnIds.Add(STATID_ACHIEVE_NetherholdCollectibles)
ColumnIds.Add(STATID_ACHIEVE_CarillonHamletCollectibles) ColumnIds.Add(STATID_ACHIEVE_CarillonHamletCollectibles)
ColumnIds.Add(STATID_ACHIEVE_RigCollectibles)
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky5, Name="AchievementMrPerky5")) ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky5, Name="AchievementMrPerky5"))
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky10, Name = "AchievementMrPerky10")) ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky10, Name = "AchievementMrPerky10"))
@ -124,8 +125,9 @@ defaultproperties
ColumnMappings.Add((Id=STATID_ACHIEVE_DesolationCollectibles,Name="AchievementCollectDesolation")) ColumnMappings.Add((Id=STATID_ACHIEVE_DesolationCollectibles,Name="AchievementCollectDesolation"))
ColumnMappings.Add((Id=STATID_ACHIEVE_HellmarkStationCollectibles,Name="AchievementCollectHellmarkStation")) ColumnMappings.Add((Id=STATID_ACHIEVE_HellmarkStationCollectibles,Name="AchievementCollectHellmarkStation"))
ColumnMappings.Add((Id=STATID_ACHIEVE_ElysiumEndlessWaveFifteen,Name="AchievementEndlessElysium")) ColumnMappings.Add((Id=STATID_ACHIEVE_ElysiumEndlessWaveFifteen,Name="AchievementEndlessElysium"))
ColumnMappings.Add((Id=STATID_ACHIEVE_Dystopia2029Collectibles,NAme="AchievementCollectDystopia2029")) ColumnMappings.Add((Id=STATID_ACHIEVE_Dystopia2029Collectibles,Name="AchievementCollectDystopia2029"))
ColumnMappings.Add((Id=STATID_ACHIEVE_MoonbaseCollectibles,NAme="AchievementCollectMoonbase")) ColumnMappings.Add((Id=STATID_ACHIEVE_MoonbaseCollectibles,Name="AchievementCollectMoonbase"))
ColumnMappings.Add((Id=STATID_ACHIEVE_NetherholdCollectibles,NAme="AchievementCollectNetherhold")) ColumnMappings.Add((Id=STATID_ACHIEVE_NetherholdCollectibles,Name="AchievementCollectNetherhold"))
ColumnMappings.Add((Id=STATID_ACHIEVE_CarillonHamletCollectibles,NAme="AchievementCollectCarillonHamlet")) 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_CarillonHamletHellOnEarth = 290;
const KFACHID_CarillonHamletCollectibles = 291; const KFACHID_CarillonHamletCollectibles = 291;
const KFACHID_RigHard = 292;
const KFACHID_RigHellOnEarth = 293;
const KFACHID_RigCollectibles = 294;
/* __TW_ANALYTICS_ */ /* __TW_ANALYTICS_ */
var int PerRoundWeldXP; var int PerRoundWeldXP;
var int PerRoundHealXP; 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_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_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_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_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_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 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_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_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_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_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_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)) 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=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=2))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CARILLONHAMLET),CompletionAmount=3)) 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 //Versus Damage
// Per design doc that I have right now, these are x class damage y players, not damage y amount // Per design doc that I have right now, these are x class damage y players, not damage y amount

View File

@ -72,4 +72,5 @@ defaultproperties
Properties.Add((PropertyId = STATID_ACHIEVE_MoonbaseCollectibles, Data = (Type = SDT_Int32, Value1 = 0))) 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_NetherholdCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_CarillonHamletCollectibles, 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*/ /** WeakPoints to show special VFX*/
var() array<WeakPoint> WeakPoints; var() array<WeakPoint> WeakPoints;
/** Score given when killed on GunGame weekly */
var() byte GunGameKilledScore;
var() byte GunGameAssistanceScore;
structdefaultproperties structdefaultproperties
{ {
HealthScale = 1.f; HealthScale = 1.f;
@ -118,6 +122,8 @@ struct StatAdjustments
DoshGiven=INDEX_NONE DoshGiven=INDEX_NONE
InitialGroundSpeedModifierScale = 1.0 InitialGroundSpeedModifierScale = 1.0
GunGameKilledScore = 0;
GunGameAssistanceScore = 0;
} }
}; };
@ -140,6 +146,24 @@ struct BossRushOverrides
var() array <BossRushOverridesPerWave> PerWaves; 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 /** Individual property overrides that drive other behavior to allow for
* a large amount of variety in our weekly event mode. * a large amount of variety in our weekly event mode.
*/ */
@ -210,6 +234,9 @@ struct WeeklyOverrides
/** Whether or not to skip opening of the trader */ /** Whether or not to skip opening of the trader */
var() bool bDisableTraders; var() bool bDisableTraders;
/** Whether or not to force show skip trader button */
var() bool bForceShowSkipTrader;
/** When to reset pickups */ /** When to reset pickups */
var() PickupResetTime PickupResetTime; 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 */ /** Global modifier of dosh received by players when a zed is killed. Default value is 1.0 */
var() float DoshOnKillGlobalModifier; var() float DoshOnKillGlobalModifier;
/** Disable Add Dosh */
var() bool bDisableAddDosh;
/** Disable Throw Weapon */
var() bool bDisableThrowWeapon;
/** Delay After a wave starts for applying global damage. */ /** Delay After a wave starts for applying global damage. */
var() float DamageDelayAfterWaveStarted; var() float DamageDelayAfterWaveStarted;
@ -411,9 +444,24 @@ struct WeeklyOverrides
var() BossRushOverrides BossRushOverrideParams; var() BossRushOverrides BossRushOverrideParams;
/** */
var() bool bGunGameMode;
/** Information about each level in Gun Game Mode */
var() GunGamePerkData GunGamePerksData;
/** Ignores damage caused by headshots. */ /** Ignores damage caused by headshots. */
var() bool bInvulnerableHeads; 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 structdefaultproperties
{ {
GameLength = GL_Short GameLength = GL_Short
@ -471,7 +519,14 @@ struct WeeklyOverrides
DroppedItemLifespan=-1.0f DroppedItemLifespan=-1.0f
bForceWWLMusic = false; bForceWWLMusic = false;
bBossRushMode = false; bBossRushMode = false;
bDisableAddDosh = false;
bDisableThrowWeapon = false;
bGunGameMode = false;
bInvulnerableHeads = false; bInvulnerableHeads = false;
TraderTimeModifier = 1.f;
TimeBetweenWaves = -1.f;
bOnlyArmorItemPickup=false;
bForceShowSkipTrader = false;
} }
}; };
@ -485,12 +540,14 @@ struct CachedOutbreakInfo
var float CachedWorldGravityZ; var float CachedWorldGravityZ;
var float CachedGlobalGravityZ; var float CachedGlobalGravityZ;
var PerkAvailableData PerksAvailableData; var PerkAvailableData PerksAvailableData;
var bool bForceShowSkipTrader;
structdefaultproperties structdefaultproperties
{ {
bTradersEnabled=true, bTradersEnabled=true
bAllowGrenadePurchase=true bAllowGrenadePurchase=true
GameAmmoCostScale=1.0 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. */ /** Stored values of World Info and GRI items incase we need to reset it. */
var CachedOutbreakInfo CachedItems; var CachedOutbreakInfo CachedItems;
function SetActiveEvent(int ActiveEventIdx) function int SetActiveEvent(int ActiveEventIdx)
{ {
`if(`notdefined(ShippingPC)) `if(`notdefined(ShippingPC))
local string LocalURL; local string LocalURL;
@ -537,6 +594,8 @@ function SetActiveEvent(int ActiveEventIdx)
ActiveEvent = SetEvents[ActiveEventIdx]; ActiveEvent = SetEvents[ActiveEventIdx];
} }
`endif `endif
return ActiveEventIdx;
} }
function ClearActiveEvent() function ClearActiveEvent()
@ -562,6 +621,7 @@ function ClearActiveEvent()
KFGameReplicationInfo(GameReplicationInfo).bAllowGrenadePurchase = CachedItems.bAllowGrenadePurchase; KFGameReplicationInfo(GameReplicationInfo).bAllowGrenadePurchase = CachedItems.bAllowGrenadePurchase;
KFGameReplicationInfo(GameReplicationInfo).bTradersEnabled = CachedItems.bTradersEnabled; KFGameReplicationInfo(GameReplicationInfo).bTradersEnabled = CachedItems.bTradersEnabled;
KFGameReplicationInfo(GameReplicationInfo).MaxPerkLevel = CachedItems.MaxPerkLevel; KFGameReplicationInfo(GameReplicationInfo).MaxPerkLevel = CachedItems.MaxPerkLevel;
KFGameReplicationInfo(GameReplicationInfo).bForceShowSkipTrader = CachedItems.bForceShowSkipTrader;
} }
ActiveEvent = EmptyEvent; ActiveEvent = EmptyEvent;
@ -588,6 +648,7 @@ function CacheGRI()
CachedItems.bAllowGrenadePurchase = KFGameReplicationInfo(GameReplicationInfo).bAllowGrenadePurchase; CachedItems.bAllowGrenadePurchase = KFGameReplicationInfo(GameReplicationInfo).bAllowGrenadePurchase;
CachedItems.bTradersEnabled = KFGameReplicationInfo(GameReplicationInfo).bTradersEnabled; CachedItems.bTradersEnabled = KFGameReplicationInfo(GameReplicationInfo).bTradersEnabled;
CachedItems.MaxPerkLevel = KFGameReplicationInfo(GameReplicationInfo).MaxPerkLevel; CachedItems.MaxPerkLevel = KFGameReplicationInfo(GameReplicationInfo).MaxPerkLevel;
CachedItems.bForceShowSkipTrader = KFGameReplicationInfo(GameReplicationInfo).bForceShowSkipTrader;
} }
} }
@ -641,6 +702,7 @@ function UpdateGRI()
KFGRI.bAllowGrenadePurchase = !ActiveEvent.bDisableGrenades; KFGRI.bAllowGrenadePurchase = !ActiveEvent.bDisableGrenades;
KFGRI.bTradersEnabled = !ActiveEvent.bDisableTraders; KFGRI.bTradersEnabled = !ActiveEvent.bDisableTraders;
KFGRI.MaxPerkLevel = ActiveEvent.MaxPerkLevel; 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.HealByAssistance = ToAdjust.HealByAssistance;
P.InitialGroundSpeedModifier *= ToAdjust.InitialGroundSpeedModifierScale; P.InitialGroundSpeedModifier *= ToAdjust.InitialGroundSpeedModifierScale;
P.GunGameKilledScore = ToAdjust.GunGameKilledScore;
P.GunGameAssistanceScore = ToAdjust.GunGameAssistanceScore;
if (ToAdjust.bStartEnraged) if (ToAdjust.bStartEnraged)
{ {
//If we aren't using the AI controller's spawn enrage, go into the pawn //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; var transient byte LastHitZoneIndex;
/**
AutoTurret
*/
var const bool bIsTurret;
replication replication
{ {
// Replicated to ALL // Replicated to ALL
@ -887,7 +893,7 @@ replication
AmbientSound, WeaponClassForAttachmentTemplate, bIsSprinting, InjuredHitZones, AmbientSound, WeaponClassForAttachmentTemplate, bIsSprinting, InjuredHitZones,
KnockdownImpulse, ReplicatedSpecialMove, bEmpDisrupted, bEmpPanicked, bFirePanicked, KnockdownImpulse, ReplicatedSpecialMove, bEmpDisrupted, bEmpPanicked, bFirePanicked,
RepFireBurnedAmount, bUnaffectedByZedTime, bMovesFastInZedTime, IntendedBodyScale, RepFireBurnedAmount, bUnaffectedByZedTime, bMovesFastInZedTime, IntendedBodyScale,
IntendedHeadScale, AttackSpeedModifier, bHasStartedFire, PowerUpAmbientSound; IntendedHeadScale, AttackSpeedModifier, bHasStartedFire, PowerUpAmbientSound, BodyScaleChangePerSecond;
if ( bNetDirty && WorldInfo.TimeSeconds < LastTakeHitTimeout ) if ( bNetDirty && WorldInfo.TimeSeconds < LastTakeHitTimeout )
HitFxInfo, HitFxRadialInfo, HitFxInstigator, HitFxAddedRelativeLocs, HitFxAddedHitCount; HitFxInfo, HitFxRadialInfo, HitFxInstigator, HitFxAddedRelativeLocs, HitFxAddedHitCount;
if ( Physics == PHYS_RigidBody && !bTearOff ) if ( Physics == PHYS_RigidBody && !bTearOff )
@ -2696,6 +2702,7 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
HitFxInfo.HitBoneIndex = HZI_HEAD; HitFxInfo.HitBoneIndex = HZI_HEAD;
} }
`endif `endif
// NVCHANGE_BEGIN - RLS - Debugging Effects // NVCHANGE_BEGIN - RLS - Debugging Effects
bAllowHeadshot = CanCountHeadshots(); bAllowHeadshot = CanCountHeadshots();
OldHealth = Health; OldHealth = Health;
@ -2778,6 +2785,12 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
} }
InstigatorMonster = InstigatedBy == none ? none : KFPawn_Monster(InstigatedBy.Pawn); 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 ) if( InDamage > 0 && InstigatorMonster != None )
{ {
// Increase AI damage by AI Damage modifiers // Increase AI damage by AI Damage modifiers
@ -5393,6 +5406,8 @@ simulated function StopExtraVFX(Name FXLabel)
} }
} }
simulated function SetTurretWeaponAttachment(class<KFWeapon> WeaponClass) {}
defaultproperties defaultproperties
{ {
InventoryManagerClass=class'KFInventoryManager' InventoryManagerClass=class'KFInventoryManager'
@ -5648,11 +5663,15 @@ defaultproperties
// Visuals // Visuals
IntendedBodyScale=1.0 IntendedBodyScale=1.0
CurrentBodyScale=1.0 CurrentBodyScale=1.0
BodyScaleChangePerSecond=0.5 BodyScaleChangePerSecond=0.5f
IntendedHeadScale=1.0 IntendedHeadScale=1.0
CurrentHeadScale=1.0 CurrentHeadScale=1.0
bAllowDeathSM=true bAllowDeathSM=true
bCanBePinned=false bCanBePinned=false
LastHitZoneIndex=0 LastHitZoneIndex=0
// ---------------------------------------------
// AutoTurret
bIsTurret=false
} }

View File

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

View File

@ -95,6 +95,9 @@ var int HealByAssistance;
/** WWL Hat attach name*/ /** WWL Hat attach name*/
var name ZEDCowboyHatAttachName; var name ZEDCowboyHatAttachName;
/** GunGameMode: score given when killed */
var byte GunGameKilledScore;
var byte GunGameAssistanceScore;
/** /**
* Information on resistant or vulnerable damage types * 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 repnotify WeakPoint WeakPoints_TS[`TINY_SKULL_MAX_WEAKPOINTS];
var ParticleSystem WeakPointParticleTemplate; var ParticleSystem WeakPointParticleTemplate;
/*********************************************************************************************
* @name ShrinkRayGun
********************************************************************************************* */
var bool bCanBeKilledByShrinking;
var float ShrinkEffectModifier;
/********************************************************************************************* /*********************************************************************************************
* @name Delegates * @name Delegates
********************************************************************************************* */ ********************************************************************************************* */
@ -2050,6 +2060,7 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
local KFAIController KFAIC; local KFAIController KFAIC;
local KFPawn_Monster KFPM; local KFPawn_Monster KFPM;
local float NapalmCheckDist; local float NapalmCheckDist;
local float InfernoRadius;
AIMonster = KFAIController_Monster(InstigatedBy); AIMonster = KFAIController_Monster(InstigatedBy);
KFDT = class<KFDamageType>(DamageType); KFDT = class<KFDamageType>(DamageType);
@ -2098,9 +2109,9 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
&& DamageCauser != none && DamageCauser != none
&& KFDT != none && KFDT != none
&& KFDT.default.DoT_Type == DOT_Fire && KFDT.default.DoT_Type == DOT_Fire
&& KFDT != class'KFDT_Fire_Napalm' && KFDT != class'KFDT_Fire_Napalm')
&& WorldInfo.RealTimeSeconds - LastNapalmInfectCheckTime > 0.25f )
{ {
if( KFPC != none if( KFPC != none
&& KFPC.GetPerk() != none && KFPC.GetPerk() != none
&& KFPC.GetPerk().CanSpreadNapalm() && 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 ); KFPRI = KFPlayerReplicationInfo( PlayerReplicationInfo );
if( KFPRI != none ) if( KFPRI != none )
{ {
@ -4907,7 +4941,8 @@ DefaultProperties
IncapSettings(AF_Microwave)=(Cooldown=5.0, Duration=5.0,) IncapSettings(AF_Microwave)=(Cooldown=5.0, Duration=5.0,)
IncapSettings(AF_Freeze)=(Cooldown=5.0) IncapSettings(AF_Freeze)=(Cooldown=5.0)
IncapSettings(AF_Snare)=(Cooldown=5.0, Duration=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 // Movement / Physics
bCanCrouch=false bCanCrouch=false
@ -5052,4 +5087,10 @@ DefaultProperties
ZEDCowboyHatAttachName=HEAD_Attach ZEDCowboyHatAttachName=HEAD_Attach
WeakPointParticleTemplate=ParticleSystem'FX_Gameplay_EMIT.FX_Weak_Indicator' 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 bCanBePinned=false
VortexAttracionModifier=0.3f VortexAttracionModifier=0.3f
bCanBeKilledByShrinking=false
} }

View File

@ -461,6 +461,39 @@ static function bool IsBackupWeapon( KFWeapon KFW )
return KFW != none && KFW.default.bIsBackupWeapon; 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 * @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'; 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 * @name Build / Level Management - Apply and save the updated build and level
********************************************************************************************* */ ********************************************************************************************* */
@ -789,7 +845,7 @@ simulated final function int GetSavedBuild()
simulated event PreBeginPlay() simulated event PreBeginPlay()
{ {
// Set the grenade class for this perk // 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')); PerkIcon = Texture2D(DynamicLoadObject(GetPerkIconPath(), class'Texture2D'));
MyKFGRI = KFGameReplicationInfo(WorldInfo.GRI); MyKFGRI = KFGameReplicationInfo(WorldInfo.GRI);
@ -1020,6 +1076,12 @@ simulated function string GetKnifeWeaponClassPath()
return KnifeWeaponDef.default.WeaponClassPath; 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; } simulated function bool PerkNeedsTick(){ return false; }
/** /**
@ -1208,6 +1270,7 @@ simulated function bool IsFlarotovActive(){ return false; }
function float GetDoTScalerAdditions(class<KFDamageType> KFDT); function float GetDoTScalerAdditions(class<KFDamageType> KFDT);
function bool GetFireStumble( optional KFPawn KFP, optional class<DamageType> DamageType ){ return false; } function bool GetFireStumble( optional KFPawn KFP, optional class<DamageType> DamageType ){ return false; }
function bool CanSpreadNapalm(){ return false; } function bool CanSpreadNapalm(){ return false; }
function bool CanSpreadInferno(){ return false; }
function bool CouldBeZedShrapnel( class<KFDamageType> KFDT ){ return false; } function bool CouldBeZedShrapnel( class<KFDamageType> KFDT ){ return false; }
simulated function bool ShouldShrapnel(){ return false; } simulated function bool ShouldShrapnel(){ return false; }
simulated function float GetSplashDamageModifier(){ return 1.f; } simulated function float GetSplashDamageModifier(){ return 1.f; }
@ -1293,6 +1356,11 @@ function OnWaveEnded();
function OnWaveStart(); function OnWaveStart();
/**
* Notifications for Wave start / end but on client
*/
simulated function OnClientWaveEnded();
simulated function bool GetUsingTactialReload( KFWeapon KFW ) simulated function bool GetUsingTactialReload( KFWeapon KFW )
{ {
return false; return false;
@ -1493,6 +1561,46 @@ simulated function FormatPerkSkills()
simulated function PlayerDied(){} 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 DefaultProperties
{ {
bTickIsDisabled=TRUE bTickIsDisabled=TRUE

View File

@ -251,7 +251,8 @@ simulated function ModifyMagSizeAndNumber( KFWeapon KFW, out int MagazineCapacit
TempCapacity = MagazineCapacity; TempCapacity = MagazineCapacity;
// FAMAS needs its secondary ammo affected // 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() ) if( IsLargeMagActive() )
{ {
@ -260,9 +261,10 @@ simulated function ModifyMagSizeAndNumber( KFWeapon KFW, out int MagazineCapacit
if( IsEatLeadActive() ) if( IsEatLeadActive() )
{ {
TempCapacity += MagazineCapacity * GetSkillValue( PerkSkills[ECommandoEatLead] ); TempCapacity += MagazineCapacity * GetSkillValue( PerkSkills[ECommandoEatLead] );
} }
} }
MagazineCapacity = Round(TempCapacity); MagazineCapacity = Round(TempCapacity);
} }

View File

@ -126,6 +126,7 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
{ {
local KFWeapon KFW; local KFWeapon KFW;
local float TempDamage; local float TempDamage;
local bool bIsCrossboom;
if( DamageType != none && IsDamageIgnoredDT( DamageType ) ) if( DamageType != none && IsDamageIgnoredDT( DamageType ) )
{ {
@ -140,7 +141,9 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
KFW = GetWeaponFromDamageCauser( DamageCauser ); 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 ); `QALog( "Base Damage Given" @ DamageType @ KFW @ InDamage, bLogPerk );
//Passive //Passive
@ -153,9 +156,9 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
`QALog( "Bombadier Given" @ DamageType @ KFW @ InDamage * GetSkillValue( PerkSkills[EDemoDamage] ), bLogPerk ); `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] ); TempDamage += InDamage * GetSkillValue( PerkSkills[EDemoDirectHit] );
`QALog( "High Impact Damage Given" @ DamageType @ KFW @ InDamage * GetSkillValue( PerkSkills[EDemoDirectHit] ), bLogPerk ); `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; var private const int NapalmDamage;
/** Multiplier on CylinderComponent.CollisionRadius to check for infecting other zeds */ /** Multiplier on CylinderComponent.CollisionRadius to check for infecting other zeds */
var private const float NapalmCheckCollisionScale; var private const float NapalmCheckCollisionScale;
// Radius in cm to check for, this is added to CylinderComponent.CollisionRadius
var private const float InfernoRadius;
enum EFirebugSkills enum EFirebugSkills
{ {
@ -294,11 +295,21 @@ function bool CanSpreadNapalm()
return IsNapalmActive(); return IsNapalmActive();
} }
function bool CanSpreadInferno()
{
return IsInfernoActive();
}
static final function float GetNapalmCheckCollisionScale() static final function float GetNapalmCheckCollisionScale()
{ {
return default.NapalmCheckCollisionScale; return default.NapalmCheckCollisionScale;
} }
static final function float GetInfernoRadius()
{
return default.InfernoRadius;
}
/** /**
* @brief Checks if a zed could potentially explode later * @brief Checks if a zed could potentially explode later
* *
@ -634,6 +645,7 @@ DefaultProperties
NapalmDamage=7 //50 NapalmDamage=7 //50
NapalmCheckCollisionScale=2.0f //6.0 NapalmCheckCollisionScale=2.0f //6.0
InfernoRadius=800.0f
ShrapnelChance=0.3f //0.2 ShrapnelChance=0.3f //0.2

View File

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

View File

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

View File

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

View File

@ -47,14 +47,24 @@ var class<KFWeaponDefinition> HealingGrenadeWeaponDef;
var class<KFWeaponDefinition> MolotovGrenadeWeaponDef; var class<KFWeaponDefinition> MolotovGrenadeWeaponDef;
var private const array<class<KFWeaponDefinition> > PrimaryWeaponPaths; var private const array<class<KFWeaponDefinition> > PrimaryWeaponPaths;
var private const array<class<KFWeaponDefinition> > GrenadeWeaponPaths;
var private const array<string> KnifeWeaponPaths; 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; var private const array<name> TacticalReloadAsReloadRateClassNames;
/** When MakeThingsGoBoom skill is selected the survivalist gets additional explosive resistance */ /** When MakeThingsGoBoom skill is selected the survivalist gets additional explosive resistance */
var private const float MakeThingsGoBoomExplosiveResistance; 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 * @name Perk init and spawning
******************************************************************************************** */ ******************************************************************************************** */
@ -105,7 +115,11 @@ function bool ShouldGetAllTheXP()
/* Returns the primary weapon's class path for this perk */ /* Returns the primary weapon's class path for this perk */
simulated function string GetPrimaryWeaponClassPath() simulated function string GetPrimaryWeaponClassPath()
{ {
StartingWeaponClassIndex = Rand(PrimaryWeaponPaths.length); if (StartingWeaponClassIndex == `WEAP_IDX_NONE)
{
StartingWeaponClassIndex = Rand(PrimaryWeaponPaths.length);
}
AutoBuyLoadOutPath.InsertItem(0,PrimaryWeaponPaths[StartingWeaponClassIndex]); AutoBuyLoadOutPath.InsertItem(0,PrimaryWeaponPaths[StartingWeaponClassIndex]);
return PrimaryWeaponPaths[StartingWeaponClassIndex].default.WeaponClassPath; return PrimaryWeaponPaths[StartingWeaponClassIndex].default.WeaponClassPath;
} }
@ -556,16 +570,7 @@ simulated function float GetSnarePowerModifier( optional class<DamageType> Damag
/* Returns the grenade class for this perk */ /* Returns the grenade class for this perk */
simulated function class< KFProj_Grenade > GetGrenadeClass() simulated function class< KFProj_Grenade > GetGrenadeClass()
{ {
if( IsAmmoVestActive() ) return class<KFProj_Grenade>(DynamicLoadObject(GrenadeWeaponPaths[CurrentGrenadeClassIndex].default.WeaponClassPath, class'Class'));
{
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;
} }
/** /**
@ -744,41 +749,379 @@ simulated static function GetPassiveStrings( out array<string> PassiveValues, ou
simulated function string GetGrenadeImagePath() simulated function string GetGrenadeImagePath()
{ {
if( IsAmmoVestActive() ) return CurrentGrenadeClassIndex == `WEAP_IDX_NONE ? default.GrenadeWeaponDef.static.GetImagePath() : default.GrenadeWeaponPaths[CurrentGrenadeClassIndex].static.GetImagePath();
{
return default.HealingGrenadeWeaponDef.Static.GetImagePath();
}
else if( IsBigPocketsActive() )
{
return default.MolotovGrenadeWeaponDef.Static.GetImagePath();
}
return default.GrenadeWeaponDef.Static.GetImagePath();
} }
simulated function class<KFWeaponDefinition> GetGrenadeWeaponDef() simulated function class<KFWeaponDefinition> GetGrenadeWeaponDef()
{ {
if( IsAmmoVestActive() ) return GrenadeWeaponPaths[CurrentGrenadeClassIndex];
{ }
return default.HealingGrenadeWeaponDef;
} static simulated function bool CanChoosePrimaryWeapon()
else if( IsBigPocketsActive() ) {
{ return true;
return default.MolotovGrenadeWeaponDef; }
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 DefaultProperties
{ {
StartingWeaponClassIndex=Index_None StartingWeaponClassIndex=0
StartingGrenadeClassIndex=0
CurrentGrenadeClassIndex=0
bIsGrenadeDirty=true
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Survivalist' PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Survivalist'
PrimaryWeaponDef=class'KFWeapDef_Random' PrimaryWeaponDef=class'KFWeapDef_Random'
KnifeWeaponDef=class'KFweapDef_Knife_Survivalist' KnifeWeaponDef=class'KFweapDef_Knife_Survivalist'
GrenadeWeaponDef=class'KFWeapDef_Grenade_Commando' GrenadeWeaponDef=class'KFWeapDef_RandomGrenade'
HealingGrenadeWeaponDef=class'KFWeapDef_Grenade_Medic' HealingGrenadeWeaponDef=class'KFWeapDef_Grenade_Medic'
MolotovGrenadeWeaponDef=class'KFWeapDef_Grenade_Firebug' MolotovGrenadeWeaponDef=class'KFWeapDef_Grenade_Firebug'
@ -856,17 +1199,27 @@ DefaultProperties
ZedTimeModifyingStates(11)="WeaponSonicGunSingleFiring" ZedTimeModifyingStates(11)="WeaponSonicGunSingleFiring"
ZedTimeModifyingStates(12)="WeaponSonicGunCharging" ZedTimeModifyingStates(12)="WeaponSonicGunCharging"
PrimaryWeaponPaths(0)=class'KFWeapDef_AR15' PrimaryWeaponPaths(0)=class'KFWeapDef_Crovel'
PrimaryWeaponPaths(1)=class'KFWeapDef_MB500' PrimaryWeaponPaths(1)=class'KFWeapDef_AR15'
PrimaryWeaponPaths(2)=class'KFWeapDef_Crovel' PrimaryWeaponPaths(2)=class'KFWeapDef_MB500'
PrimaryWeaponPaths(3)=class'KFWeapDef_HX25' PrimaryWeaponPaths(3)=class'KFWeapDef_MedicPistol'
PrimaryWeaponPaths(4)=class'KFWeapDef_MedicPistol' PrimaryWeaponPaths(4)=class'KFWeapDef_HX25'
PrimaryWeaponPaths(5)=class'KFWeapDef_CaulkBurn' PrimaryWeaponPaths(5)=class'KFWeapDef_CaulkBurn'
PrimaryWeaponPaths(6)=class'KFWeapDef_Remington1858Dual' PrimaryWeaponPaths(6)=class'KFWeapDef_Remington1858Dual'
PrimaryWeaponPaths(7)=class'KFWeapDef_Winchester1894' PrimaryWeaponPaths(7)=class'KFWeapDef_Winchester1894'
PrimaryWeaponPaths(8)=class'KFWeapDef_MP7' PrimaryWeaponPaths(8)=class'KFWeapDef_MP7'
AutoBuyLoadOutPath=(class'KFWeapDef_DragonsBreath', class'KFWeapDef_FreezeThrower', class'KFWeapDef_MedicRifle', class'KFWeapDef_LazerCutter') 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 // Prestige Rewards
PrestigeRewardItemIconPaths[0]="WEP_SkinSet_Prestige01_Item_TEX.knives.SurvivalistKnife_PrestigePrecious_Mint_large" PrestigeRewardItemIconPaths[0]="WEP_SkinSet_Prestige01_Item_TEX.knives.SurvivalistKnife_PrestigePrecious_Mint_large"
PrestigeRewardItemIconPaths[1]="WEP_SkinSet_Prestige02_Item_TEX.tier01.FreezeThrower_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) */ /** Whether this pickup node has been modified by kismet (enabled or disabled) */
var transient bool bKismetEnabled; var transient bool bKismetEnabled;
function bool CanUsePickup()
{
return true;
}
/** Pick a weapon from 'ItemPickups' and enable it in the world */ /** Pick a weapon from 'ItemPickups' and enable it in the world */
function Reset() function Reset()
{ {
if( bKismetDriven ) if (CanUsePickup())
{ {
SetInitialState(); if( bKismetDriven )
{
SetInitialState();
}
else
{
bToBeActivated = false;
GotoState('Pickup');
}
} }
else else
{ {
bToBeActivated = false; SetPickupHidden();
GotoState('Pickup');
} }
} }

View File

@ -49,11 +49,42 @@ replication
PickupIndex; 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() simulated event PreBeginPlay()
{ {
local KFGameInfo KFGI; 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 ); KFGI = KFGameInfo( WorldInfo.Game );
if (KFGI != none && KFGI.OutbreakEvent != none && KFGI.OutbreakEvent.ActiveEvent.bUnlimitedWeaponPickups) if (KFGI != none && KFGI.OutbreakEvent != none && KFGI.OutbreakEvent.ActiveEvent.bUnlimitedWeaponPickups)
{ {
@ -62,7 +93,6 @@ simulated event PreBeginPlay()
bKismetDriven=false; bKismetDriven=false;
} }
} }
////////////////////////////////////////
super.PreBeginPlay(); super.PreBeginPlay();
} }
@ -152,10 +182,26 @@ function int ChooseWeaponPickup()
local int i, DesiredItemIdx; local int i, DesiredItemIdx;
local float Weight, TotalWeight, RandomWeight; local float Weight, TotalWeight, RandomWeight;
local array<int> IndexList; local array<int> IndexList;
local KFGameInfo KFGI;
KFGI = KFGameInfo(WorldInfo.Game);
DesiredItemIdx = 255;
// Add up the total weight for all valid attacks // Add up the total weight for all valid attacks
for(i = 0; i < ItemPickups.Length; i++) 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 ) if ( ItemPickups[i].Priority > 0.f )
{ {
TotalWeight += ItemPickups[i].Priority; TotalWeight += ItemPickups[i].Priority;
@ -194,11 +240,26 @@ simulated native function GetPickupMesh(class<KFWeapon> ItemClass);
/** Use the pickups static mesh for this factory */ /** Use the pickups static mesh for this factory */
simulated function SetPickupMesh() simulated function SetPickupMesh()
{ {
local KFGameInfo KFGI;
if (PickupIndex >= ItemPickups.Length) if (PickupIndex >= ItemPickups.Length)
{ {
return; 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) if (ItemPickups[PickupIndex].ItemClass.Name == ArmorClassName)
{ {
FinalizePickupMesh(StaticMeshComponent(ItemPickups[PickupIndex].ItemClass.default.PickupFactoryMesh).StaticMesh); FinalizePickupMesh(StaticMeshComponent(ItemPickups[PickupIndex].ItemClass.default.PickupFactoryMesh).StaticMesh);
@ -307,12 +368,24 @@ function ActivateNewPickup(Pawn P)
{ {
local KFGameInfo KFGI; 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 ) if( bKismetDriven )
{ {
return; return;
} }
KFGI = KFGameInfo( WorldInfo.Game );
if ( KFGI != none ) if ( KFGI != none )
{ {
KFGI.EnableNewPickup( KFGI.ItemPickups, KFGI.DifficultyInfo.GetWeaponPickupInterval(KFGI.GetLivingPlayerCount()), self ); 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 */ /** Id of previously selected perk */
var public byte SavedPerkIndex; 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) */ /** Player zed spawn params (Versus) */
var transient sPlayerZedSpawnInfo PlayerZedSpawnInfo; var transient sPlayerZedSpawnInfo PlayerZedSpawnInfo;
@ -136,6 +140,10 @@ var protected float UnmodifiedFOV;
var transient protected int BenefactorDosh; var transient protected int BenefactorDosh;
var private const int BenefactorDoshReq; var private const int BenefactorDoshReq;
var array<KFPawn_Monster> KilledZeds;
var array<float> KilledZedsLastZPosition;
var KFSeaTrigger SeaTrigger;
/********************************************************************************************* /*********************************************************************************************
* @name UDK Variables * @name UDK Variables
********************************************************************************************* */ ********************************************************************************************* */
@ -712,6 +720,14 @@ var transient bool bNoGoActive;
var transient byte StoredLocalUserNum; 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 cpptext
{ {
virtual UBOOL Tick( FLOAT DeltaSeconds, ELevelTick TickType ); virtual UBOOL Tick( FLOAT DeltaSeconds, ELevelTick TickType );
@ -811,6 +827,8 @@ native private function ShowPreClientTravelMovie(string URLString);
simulated event PostBeginPlay() simulated event PostBeginPlay()
{ {
local KFSeaTrigger actor_search;
super.PostBeginPlay(); super.PostBeginPlay();
PostAkEvent( ResetFiltersEvent ); PostAkEvent( ResetFiltersEvent );
@ -831,6 +849,18 @@ simulated event PostBeginPlay()
OnlineSub.AddOnReadOnlineAvatarCompleteDelegate(OnAvatarReceived); OnlineSub.AddOnReadOnlineAvatarCompleteDelegate(OnAvatarReceived);
OnlineSub.AddOnReadOnlineAvatarByNameCompleteDelegate(OnAvatarURLPS4Received); 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() function UpdateVOIP()
@ -952,7 +982,8 @@ simulated event name GetSeasonalStateName()
local int EventId; local int EventId;
local KFMapInfo KFMI; local KFMapInfo KFMI;
local bool bIsWWLWeekly; // WWL Weekly should not allow seasonal overrides local bool bIsWWLWeekly; // WWL Weekly should not allow seasonal overrides
local KFGameReplicationInfo KFGRI;
EventId = class'KFGameEngine'.static.GetSeasonalEventID(); EventId = class'KFGameEngine'.static.GetSeasonalEventID();
KFMI = KFMapInfo(WorldInfo.GetMapInfo()); KFMI = KFMapInfo(WorldInfo.GetMapInfo());
if (KFMI != none) if (KFMI != none)
@ -960,7 +991,8 @@ simulated event name GetSeasonalStateName()
KFMI.ModifySeasonalEventId(EventId); 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) if (bIsWWLWeekly)
return 'No_Event'; return 'No_Event';
@ -1566,13 +1598,15 @@ function OnReadProfileSettingsComplete(byte LocalUserNum,bool bWasSuccessful)
if(Profile != none) if(Profile != none)
{ {
SavedPerkIndex = byte(Profile.GetProfileInt(KFID_SavedPerkIndex)); SavedPerkIndex = byte(Profile.GetProfileInt(KFID_SavedPerkIndex));
bSkipNonCriticalForceLookAt = Profile.GetProfileBool(KFID_AutoTurnOff); bSkipNonCriticalForceLookAt = Profile.GetProfileBool(KFID_AutoTurnOff);
bShowKillTicker = Profile.GetProfileBool(KFID_ShowKillTicker); bShowKillTicker = Profile.GetProfileBool(KFID_ShowKillTicker);
bNoEarRingingSound = Profile.GetProfileBool(KFID_ReduceHightPitchSounds); bNoEarRingingSound = Profile.GetProfileBool(KFID_ReduceHightPitchSounds);
bHideBossHealthBar = Profile.GetProfileBool(KFID_HideBossHealthBar); bHideBossHealthBar = Profile.GetProfileBool(KFID_HideBossHealthBar);
bDisableAutoUpgrade = Profile.GetProfileBool(KFID_DisableAutoUpgrade); bDisableAutoUpgrade = Profile.GetProfileBool(KFID_DisableAutoUpgrade);
bHideRemotePlayerHeadshotEffects = Profile.GetProfileBool(KFID_HideRemoteHeadshotEffects); bHideRemotePlayerHeadshotEffects = Profile.GetProfileBool(KFID_HideRemoteHeadshotEffects);
SurvivalPerkWeapIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingWeapIdx));
SurvivalPerkGrenIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingGrenIdx));
KFPRI = KFPlayerReplicationInfo(PlayerReplicationInfo); KFPRI = KFPlayerReplicationInfo(PlayerReplicationInfo);
if(KFPRI != none) if(KFPRI != none)
@ -2581,6 +2615,30 @@ function NotifyPlayTogetherFailed(optional string LocKey = "UnableToPlayTogether
* @name Dosh Vault * @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() function int GetPreStigeValueDoshRewardValue()
{ {
if (StatsWrite != none) 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 * @name Skill Tracking
********************************************************************************************* */ ********************************************************************************************* */
@ -3089,6 +3175,8 @@ function RecievedNewPerkClass()
{ {
MyGfxManager.TraderMenu.UpdatePlayerInfo(); 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); 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 // 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 ) 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 KFPawn_Human KFPH;
local KFDroppedPickup KFDP; local KFDroppedPickup KFDP;
local KFPawn KFP;
// Attempt to set the weapon attachment for any player than might need theirs set. This is a backup // 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. // 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); 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 */ /* ZED time effect is active */
CurrentZEDTimeEffectIntensity > 0.f || CurrentZEDTimeEffectIntensity > 0.f ||
/* sepia effect */ /* sepia effect */
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12) || (KFGameReplicationInfo(WorldInfo.GRI) != none &&
KFGameReplicationInfo(WorldInfo.GRI).bIsWeeklyMode &&
KFGameReplicationInfo(WorldInfo.GRI).CurrentWeeklyIndex == 12) ||
/* Night vision active */ /* Night vision active */
bNightVisionActive || bNightVisionActive ||
SirenScreamEffectTimeRemaining > 0.f || SirenScreamEffectTimeRemaining > 0.f ||
@ -7154,6 +7253,8 @@ simulated function OnStatsInitialized( bool bWasSuccessful )
LoadAllPerkLevels(); LoadAllPerkLevels();
ClientInitializePerks(); ClientInitializePerks();
InitPerkLoadout();
// Update the GFX menu if we need to // Update the GFX menu if we need to
if( MyGFxManager != none && MyGFxManager.PerksMenu != none ) if( MyGFxManager != none && MyGFxManager.PerksMenu != none )
{ {
@ -9186,6 +9287,13 @@ event Destroyed()
StingerAkComponent.StopEvents(); 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 ); SetRTPCValue( 'Health', 100, true );
PostAkEvent( LowHealthStopEvent ); PostAkEvent( LowHealthStopEvent );
bPlayingLowHealthSFX = false; bPlayingLowHealthSFX = false;
@ -9215,6 +9323,7 @@ event Destroyed()
ClearMixerDelegates(); ClearMixerDelegates();
ClearDiscord(); ClearDiscord();
} }
ClientMatchEnded(); ClientMatchEnded();
Super.Destroyed(); 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. * 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 ) function NotifyKilled( Controller Killer, Controller Killed, pawn KilledPawn, class<DamageType> damageType )
{ {
local KFPawn_Monster MonsterPawn; local KFPawn_Monster MonsterPawn;
@ -9937,6 +10092,12 @@ function NotifyKilled( Controller Killer, Controller Killed, pawn KilledPawn, cl
MatchStats.ZedsKilledLastWave++; MatchStats.ZedsKilledLastWave++;
CheckForZedOnDeathAchievements( MonsterPawn ); 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 // Own death. Like PawnDied(), but with more input parameters
else if ( self == Killed ) else if ( self == Killed )
@ -10065,7 +10226,7 @@ exec function RequestSkipTrader()
{ {
if (KFGRI.bMatchHasBegun) if (KFGRI.bMatchHasBegun)
{ {
if (KFGRI.bTraderIsOpen && KFPRI.bHasSpawnedIn) if ((KFGRI.bTraderIsOpen || KFGRI.bForceSkipTraderUI) && KFPRI.bHasSpawnedIn)
{ {
KFPRI.RequestSkiptTrader(KFPRI); KFPRI.RequestSkiptTrader(KFPRI);
if (MyGFxManager != none) 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 defaultproperties
{ {
EarnedDosh=0 EarnedDosh=0

View File

@ -38,8 +38,26 @@ var protected const AkEvent RhythmMethodSoundReset;
var protected const AkEvent RhythmMethodSoundHit; var protected const AkEvent RhythmMethodSoundHit;
var protected const AkEvent RhythmMethodSoundTop; var protected const AkEvent RhythmMethodSoundTop;
var protected const AkEvent AracnoStompSoundEvent; 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 cpptext
{ {
@ -49,7 +67,7 @@ cpptext
replication replication
{ {
if (bNetDirty) if (bNetDirty)
bUsingPermanentZedTime, ZedTimeRadius, ZedTimeBossRadius, ZedTimeHeight, GoompaStreak; bUsingPermanentZedTime, ZedTimeRadius, ZedTimeBossRadius, ZedTimeHeight, GoompaStreak, GunGameData;
} }
simulated event PostBeginPlay() simulated event PostBeginPlay()
@ -114,6 +132,22 @@ function RecheckZedTime()
EnterZedTime(); 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 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. /** Resets all gameplay FX to initial state.
Append to this list if additional effects are added. */ Append to this list if additional effects are added. */
function ResetGameplayPostProcessFX() function ResetGameplayPostProcessFX()
{ {
local KFGameReplicationInfo KFGRI;
super.ResetGameplayPostProcessFX(); 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); GameplayPostProcessEffectMIC.SetScalarParameterValue(EffectZedTimeSepiaParamName, 1.f);
} }
@ -228,6 +284,55 @@ simulated function ResetBossCamera()
super(PlayerController).ResetCameraMode(); 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 defaultProperties
{ {
@ -239,4 +344,6 @@ defaultProperties
RhythmMethodSoundHit =AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Hit' RhythmMethodSoundHit =AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Hit'
RhythmMethodSoundTop =AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Top' RhythmMethodSoundTop =AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Top'
AracnoStompSoundEvent =AkEvent'WW_GLO_Runtime.WeeklyArcno' 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 ) if( KFP != none )
{ {
// Get the location from the pawn we're targeting if we can // 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 // cone setup
GetPlayerViewPoint( CamLoc, CamRot ); GetPlayerViewPoint( CamLoc, CamRot );
CamRot += WeaponBufferRotation; 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 */ /** Called on server to +/- dosh. Do not modify score directly */
function AddDosh( int DoshAmount, optional bool bEarned ) 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 the game has turned off dosh earning for this PRI, early out.
if (!bAllowDoshEarning && bEarned) if (!bAllowDoshEarning && bEarned)
{ {
@ -1465,6 +1474,10 @@ simulated function NotifyWaveEnded()
{ {
bVotedToSkipTraderTime = false; 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; /*local KFGameReplicationInfo KFGRI;
if( Role == ROLE_Authority ) if( Role == ROLE_Authority )
@ -1475,6 +1488,11 @@ simulated function NotifyWaveEnded()
KFGRI.VoteCollector.ResetSkipTraderBeforeWaveStarts(); 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 //reset the icons here

View File

@ -380,4 +380,10 @@ defaultproperties
// Added 16/07/2021 - QoL: Quick Swap button allowing 9mm as an option. // Added 16/07/2021 - QoL: Quick Swap button allowing 9mm as an option.
ProfileMappings.Add((Id=KFID_AllowSwapTo9mm, Name="AllowSwitchTo9mm", MappingType=PVMT_RawValue)) 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)))) 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 MaterialInstanceConstant MIC;
local int i; local int i;
local bool bIsWWLMode; local bool bIsWWLMode;
local KFGameReplicationInfo KFGRI;
if ( PawnOwner.WorldInfo.NetMode != NM_DedicatedServer ) if ( PawnOwner.WorldInfo.NetMode != NM_DedicatedServer )
{ {
FreezeMatParamValue = FreezeAmount; FreezeMatParamValue = FreezeAmount;
@ -201,7 +203,8 @@ function SetFrozenParameter(float FreezeAmount)
if (KFPawn_Monster(KFPOwner) != none) 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++) 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_Thermite,
SCU_BladedPistol, SCU_BladedPistol,
SCU_ParasiteImplanter, 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 SkinVariant Skin;
local AttachmentVariants Attachment; local AttachmentVariants Attachment;
local int i; local int i;
local KFGameReplicationInfo KFGRI;
CharArch = PRI.CharacterArchetypes[PRI.RepCustomizationInfo.CharacterIndex]; CharArch = PRI.CharacterArchetypes[PRI.RepCustomizationInfo.CharacterIndex];
@ -246,10 +249,12 @@ static private event bool CheckCustomizationOwnership(KFPlayerReplicationInfo PR
return FALSE; return FALSE;
} }
KFGRI = KFGameReplicationInfo(PRI.WorldInfo.GRI);
// accessory // accessory
for( i=0; i < `MAX_COSMETIC_ATTACHMENTS; i++ ) 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; continue;
} }
@ -360,4 +365,12 @@ defaultproperties
Name=KFWeap_AssaultRifle_Doshinegun, Name=KFWeap_AssaultRifle_Doshinegun,
IconPath="WEP_UI_Doshinegun_TEX.UI_Weapon_Select_Doshinegun", IconPath="WEP_UI_Doshinegun_TEX.UI_Weapon_Select_Doshinegun",
ID=9275)} 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 // 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); KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_SkipTraderIsNotOpen);
return; return;

View File

@ -31,6 +31,8 @@ var AkEvent PilotLightPlayEvent;
/** Pilot light sound stop event */ /** Pilot light sound stop event */
var AkEvent PilotLightStopEvent; var AkEvent PilotLightStopEvent;
var protected bool bInvertPilot;
/** Effect for the pilot light. */ /** Effect for the pilot light. */
var protected KFParticleSystemComponent PSC_PilotLight; var protected KFParticleSystemComponent PSC_PilotLight;
/** Socket to attach the pilot light to. */ /** Socket to attach the pilot light to. */
@ -263,9 +265,17 @@ simulated function StopPilotSound()
simulated function SetPilotDynamicLightEnabled( bool bLightEnabled ) simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
{ {
local int Idx; 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 // 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; return;
} }
@ -273,7 +283,7 @@ simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
// turn off lights // turn off lights
for (Idx=0; Idx<PilotLights.length; ++Idx) 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 TickGroup=TG_PostUpdateWork
End Object End Object
PSC_PilotLight=PilotLight0 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 */ /** Pilot light sound stop event */
var AkEvent PilotLightStopEvent; var AkEvent PilotLightStopEvent;
var protected bool bInvertPilot;
/** Effect for the pilot light. */ /** Effect for the pilot light. */
var() protected KFParticleSystemComponent PSC_PilotLight; var() protected KFParticleSystemComponent PSC_PilotLight;
/** Socket to attach the pilot light to. */ /** Socket to attach the pilot light to. */
@ -47,6 +49,9 @@ var float LastBarrelHeat;
/** Whether this weapon should warn AI when it fires */ /** Whether this weapon should warn AI when it fires */
var() const bool bWarnAIWhenFiring; var() const bool bWarnAIWhenFiring;
/** Modifier to the speed for barrel cooldown */
var const float CooldownBarrelModifier;
/********************************************************************************************* /*********************************************************************************************
* @name Optional dynamic pilot lights * @name Optional dynamic pilot lights
********************************************************************************************* */ ********************************************************************************************* */
@ -147,13 +152,26 @@ simulated event Tick(float DeltaTime)
} }
else 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 // Cool the barrel down when not shooting
BarrelHeat -= DeltaTime * 0.5; BarrelHeat -= DeltaTime * CooldownBarrelModifier;
if( BarrelHeat < 0 ) if( BarrelHeat < FlameHeat )
{ {
BarrelHeat = 0; BarrelHeat = FlameHeat;
} }
} }
} }
@ -340,9 +358,17 @@ simulated protected function TurnOffPilot()
simulated function SetPilotDynamicLightEnabled( bool bLightEnabled ) simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
{ {
local int Idx; 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 // 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; return;
} }
@ -350,7 +376,7 @@ simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
// turn off lights // turn off lights
for (Idx=0; Idx<PilotLights.length; ++Idx) 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) simulated function StartLoopingFireEffects(byte FireModeNum, optional bool bForceAnim)
{ {
StopPilotSound(); StopPilotSound();
SetPilotDynamicLightEnabled(false);
SetPilotDynamicLightEnabled(false);
super.StartLoopingFireEffects(FireModeNum, bForceAnim); super.StartLoopingFireEffects(FireModeNum, bForceAnim);
} }
@ -389,8 +417,10 @@ simulated function StartLoopingFireEffects(byte FireModeNum, optional bool bForc
simulated function StopLoopingFireEffects(byte FireModeNum) simulated function StopLoopingFireEffects(byte FireModeNum)
{ {
super.StopLoopingFireEffects(FireModeNum); super.StopLoopingFireEffects(FireModeNum);
StartPilotSound(); StartPilotSound();
SetPilotDynamicLightEnabled(true);
SetPilotDynamicLightEnabled(true);
} }
/** /**
@ -800,10 +830,14 @@ defaultproperties
bWeaponNeedsServerPosition=true bWeaponNeedsServerPosition=true
bInvertPilot=false
// Aim Assist // Aim Assist
AimCorrectionSize=0.f AimCorrectionSize=0.f
// AI Warning // AI Warning
MaxAIWarningDistSQ=1000000 MaxAIWarningDistSQ=1000000
MaxAIWarningDistFromPointSQ=40000 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 // for remote clients to preload content when a user picks up a weapon without
// having to do the full setting stack. // having to do the full setting stack.
simulated native static function TriggerAsyncContentLoad(class<KFWeapon> WeaponClass); simulated native static function TriggerAsyncContentLoad(class<KFWeapon> WeaponClass);
native private function StartLoadWeaponContent(); native protected function StartLoadWeaponContent();
native private function LoadWeaponContent(); native private function LoadWeaponContent();
native private function CacheWeaponContent(); native private function CacheWeaponContent();
native private function UnloadWeaponContent(); 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 * Drop this item out in to the world
*/ */
@ -1815,9 +1830,24 @@ reliable client function ClientNotifyPickedUp()
} }
/** Treat as non-standard equipment item for */ /** 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() simulated static function bool IsMeleeWeapon()
@ -6488,7 +6518,7 @@ simulated state WeaponFiring
Instigator.WeaponStoppedFiring(self, false); Instigator.WeaponStoppedFiring(self, false);
} }
if ( bPlayingLoopingFireAnim || bPlayingLoopingFireAnim ) if ( bPlayingLoopingFireAnim || bPlayingLoopingFireSnd )
{ {
StopLoopingFireEffects(CurrentFireMode); StopLoopingFireEffects(CurrentFireMode);
} }

View File

@ -2748,6 +2748,9 @@ defaultproperties
//Dragon & Koi Pulverizer //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")) 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 //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")) 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 //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")) 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 //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")) 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=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")) 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 //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")) 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 //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")); 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 //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")) 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 //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")) 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 cpptext
{ {
/** Num of Weekly events available */ /** Num of Weekly events available */
static const int NumWeeklyEvents = 16; static const int NumWeeklyEvents = 17;
} }
DefaultProperties DefaultProperties
{ {

View File

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

View File

@ -74,3 +74,5 @@ const KFID_GamepadDeadzoneScale = 175;
const KFID_GamepadAccelerationJumpScale = 176; const KFID_GamepadAccelerationJumpScale = 176;
const KFID_HasTabbedToStore = 177; const KFID_HasTabbedToStore = 177;
const KFID_AllowSwapTo9mm = 178; // Halloween 2021 QoL: added option to quick switch weapons to 9mm 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