upload
This commit is contained in:
parent
47731ae0b8
commit
df19937a54
@ -1052,12 +1052,12 @@ function ReceiveProjectileWarning(Projectile Proj);
|
||||
* =====================================================
|
||||
*/
|
||||
|
||||
exec function SwitchToBestWeapon(optional bool bForceNewWeapon)
|
||||
exec function SwitchToBestWeapon(optional bool bForceNewWeapon, optional bool check_9mm_logic = false)
|
||||
{
|
||||
if ( Pawn == None || Pawn.InvManager == None )
|
||||
return;
|
||||
|
||||
Pawn.InvManager.SwitchToBestWeapon(bForceNewWeapon);
|
||||
Pawn.InvManager.SwitchToBestWeapon(bForceNewWeapon, check_9mm_logic);
|
||||
}
|
||||
|
||||
/* epic ===============================================
|
||||
@ -1070,7 +1070,11 @@ exec function SwitchToBestWeapon(optional bool bForceNewWeapon)
|
||||
*/
|
||||
reliable client function ClientSwitchToBestWeapon(optional bool bForceNewWeapon)
|
||||
{
|
||||
SwitchToBestWeapon(bForceNewWeapon);
|
||||
local bool check_9mm_logic;
|
||||
|
||||
check_9mm_logic = true;
|
||||
|
||||
SwitchToBestWeapon(bForceNewWeapon, check_9mm_logic);
|
||||
}
|
||||
|
||||
/* epic ===============================================
|
||||
|
@ -386,7 +386,7 @@ simulated function float GetWeaponRatingFor( Weapon W )
|
||||
/**
|
||||
* returns the best weapon for this Pawn in loadout
|
||||
*/
|
||||
simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon )
|
||||
simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon, optional bool allow9mm )
|
||||
{
|
||||
local Weapon W, BestWeapon;
|
||||
local float Rating, BestRating;
|
||||
@ -419,7 +419,7 @@ simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon )
|
||||
* Switch to best weapon available in loadout
|
||||
* Network: LocalPlayer
|
||||
*/
|
||||
simulated function SwitchToBestWeapon( optional bool bForceADifferentWeapon )
|
||||
simulated function SwitchToBestWeapon( optional bool bForceADifferentWeapon, optional bool check_9mm_logic = false )
|
||||
{
|
||||
local Weapon BestWeapon;
|
||||
|
||||
|
@ -1385,11 +1385,13 @@ simulated final native function ShowMaterialSection(int MaterialID, bool bShow,
|
||||
* @param StartTime (optional) What time to start the animation at
|
||||
* @param bPlayBackwards (optional) Play this animation backwards
|
||||
*/
|
||||
function PlayAnim(name AnimName, optional float Duration, optional bool bLoop, optional bool bRestartIfAlreadyPlaying = true, optional float StartTime=0.0f, optional bool bPlayBackwards=false)
|
||||
function bool PlayAnim(name AnimName, optional float Duration, optional bool bLoop, optional bool bRestartIfAlreadyPlaying = true, optional float StartTime=0.0f, optional bool bPlayBackwards=false)
|
||||
{
|
||||
local AnimNodeSequence AnimNode;
|
||||
local float DesiredRate;
|
||||
local bool bIsAnimPlayed;
|
||||
|
||||
bIsAnimPlayed = false;
|
||||
AnimNode = AnimNodeSequence(Animations);
|
||||
if (AnimNode == None && Animations.IsA('AnimTree'))
|
||||
{
|
||||
@ -1408,6 +1410,8 @@ function PlayAnim(name AnimName, optional float Duration, optional bool bLoop, o
|
||||
if (bRestartIfAlreadyPlaying || !AnimNode.bPlaying)
|
||||
{
|
||||
AnimNode.PlayAnim(bLoop, DesiredRate, StartTime);
|
||||
|
||||
bIsAnimPlayed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1423,9 +1427,13 @@ function PlayAnim(name AnimName, optional float Duration, optional bool bLoop, o
|
||||
DesiredRate = (Duration > 0.0) ? (AnimNode.AnimSeq.SequenceLength / (Duration * AnimNode.AnimSeq.RateScale)) : 1.0;
|
||||
DesiredRate = (bPlayBackwards) ? -DesiredRate : DesiredRate;
|
||||
AnimNode.PlayAnim(bLoop, DesiredRate, StartTime);
|
||||
|
||||
bIsAnimPlayed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bIsAnimPlayed;
|
||||
}
|
||||
|
||||
/** simple generic case animation stopper
|
||||
|
@ -43,6 +43,7 @@ var array<AARAward> TeamAwardList;
|
||||
|
||||
enum ETeamAwards
|
||||
{
|
||||
ETA_WeaponMaster,
|
||||
ETA_ZedStomper,
|
||||
ETA_MedicineMaster,
|
||||
ETA_ZedSlayer,
|
||||
@ -1103,6 +1104,9 @@ static function GetTeamAward(ETeamAwards AwardIndex, out AARAward TempAwardObjec
|
||||
case ETA_ZedStomper:
|
||||
Give_ZedStomper(TempAwardObject, KFPCArray);
|
||||
break;
|
||||
case ETA_WeaponMaster:
|
||||
GiveWeaponMaster(TempAwardObject, KFPCArray);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1416,6 +1420,27 @@ static function Give_ZedStomper(out AARAward outAward, const out Array<KFPlayerC
|
||||
}
|
||||
}
|
||||
|
||||
static function GiveWeaponMaster(out AARAward outAward, const out Array<KFPlayerController> KFPCArray)
|
||||
{
|
||||
local int i;
|
||||
local KFPlayerController_WeeklySurvival KFPC_WS;
|
||||
|
||||
for(i = 0; i < KFPCArray.Length; i++)
|
||||
{
|
||||
KFPC_WS = KFPlayerController_WeeklySurvival(KFPCArray[i]);
|
||||
if (KFPC_WS != none)
|
||||
{
|
||||
if (KFPC_WS.GunGameData.GiveWeaponMaster)
|
||||
{
|
||||
outAward.PRI = KFPCArray[i].PlayerReplicationInfo;
|
||||
outAward.DisplayValue = 1;
|
||||
`log(KFPCArray[i].PlayerReplicationInfo.PlayerName @"Weapon Master", class'EphemeralMatchStats'.default.bShowMatchStatsLogging);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function ReceiveAwardInfo(byte AwardID, PlayerReplicationInfo PRI, int Value)
|
||||
{
|
||||
TeamAwardList[AwardID].PRI = PRI;
|
||||
@ -1435,6 +1460,7 @@ DefaultProperties
|
||||
TeamAwardList(ETA_HeadPopper)=(TitleIdentifier="HeadPopper",ValueIdentifier="HeadPopperValue",IconPath="UI_Award_Team.UI_Award_Team-Headshots")
|
||||
TeamAwardList(ETA_Dominator)=(TitleIdentifier="Dominator",ValueIdentifier="DominatorValue",IconPath="UI_Award_Team.UI_Award_Team-BossKO")
|
||||
TeamAwardList(ETA_ZedStomper)=(TitleIdentifier="ZedStomper",ValueIdentifier="ZedStomperValue",IconPath="UI_Award_Team.UI_Award_Team-ZedStomper")
|
||||
TeamAwardList(ETA_WeaponMaster)=(TitleIdentifier="WeaponMaster",ValueIdentifier="WeaponMasterValue",IconPath="UI_Award_Team.UI_Award_Team_GunMode")
|
||||
//zed awards
|
||||
TeamAwardList(ETA_Carnage)=(TitleIdentifier="Carnage",ValueIdentifier="CarnageValue",IconPath="ui_award_zeds.UI_Award_ZED_RawDmg")
|
||||
TeamAwardList(ETA_Closer)=(TitleIdentifier="Closer",ValueIdentifier="CloserValue",IconPath="ui_award_zeds.UI_Award_ZED_Kills")
|
||||
|
@ -25,7 +25,7 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
|
||||
}
|
||||
|
||||
/** */
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
if ( !bIsActive )
|
||||
{
|
||||
|
@ -57,7 +57,7 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
|
||||
}
|
||||
|
||||
/** */
|
||||
function Accrue(float InPower)
|
||||
function Accrue(float InPower, optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
// total immunity during cooldown
|
||||
if ( LastActivationTime > 0 && `TimeSinceEx(PawnOwner, LastActivationTime) < Cooldown )
|
||||
@ -80,14 +80,14 @@ function Accrue(float InPower)
|
||||
CurrentStrength = fClamp(CurrentStrength + InPower, InPower, INCAP_THRESHOLD);
|
||||
if ( CurrentStrength >= INCAP_THRESHOLD )
|
||||
{
|
||||
Activate();
|
||||
Activate(DamageType);
|
||||
}
|
||||
|
||||
`log(Class.Name@"Added="$InPower@"NewStrength="$CurrentStrength, bDebug);
|
||||
}
|
||||
|
||||
/** */
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
if ( SpecialMove != SM_None )
|
||||
{
|
||||
@ -159,6 +159,11 @@ function float GetAttackSpeedModifier()
|
||||
return 1.f;
|
||||
}
|
||||
|
||||
function float GetDamageTakenModifier()
|
||||
{
|
||||
return 0.f;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
//bDebug=true
|
||||
|
@ -83,6 +83,8 @@ enum EAfflictionType
|
||||
AF_Freeze,
|
||||
AF_Microwave,
|
||||
AF_Bleed,
|
||||
AF_BigHead,
|
||||
AF_Shrink,
|
||||
|
||||
AF_Custom1,
|
||||
AF_Custom2,
|
||||
@ -258,7 +260,7 @@ protected function ProcessSpecialMoveAfflictions(KFPerk InstigatorPerk, vector H
|
||||
// increment affliction power
|
||||
if (KnockdownPower > 0 && CanDoSpecialmove(SM_Knockdown))
|
||||
{
|
||||
AccrueAffliction(AF_Knockdown, KnockdownPower, BodyPart, InstigatorPerk);
|
||||
AccrueAffliction(AF_Knockdown, KnockdownPower, BodyPart, InstigatorPerk, DamageType);
|
||||
}
|
||||
if (StunPower > 0 && CanDoSpecialmove(SM_Stunned))
|
||||
{
|
||||
@ -342,7 +344,7 @@ protected function ProcessHitReactionAfflictions(KFPerk InstigatorPerk, class<KF
|
||||
protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KFDamageType> DamageType, Actor DamageCauser)
|
||||
{
|
||||
local KFWeapon DamageWeapon;
|
||||
local float BurnPower, EMPPower, PoisonPower, MicrowavePower, BleedPower;
|
||||
local float BurnPower, EMPPower, PoisonPower, MicrowavePower, BleedPower, BigHeadPower, ShrinkPower;
|
||||
local KFInterface_DamageCauser KFDmgCauser;
|
||||
|
||||
// Get upgraded affliction power
|
||||
@ -354,6 +356,10 @@ protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KF
|
||||
PoisonPower = DamageWeapon.GetUpgradedAfflictionPower(AF_Poison, DamageType.default.PoisonPower);
|
||||
MicrowavePower = DamageWeapon.GetUpgradedAfflictionPower(AF_Microwave, DamageType.default.MicrowavePower);
|
||||
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
|
||||
{
|
||||
@ -362,6 +368,8 @@ protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KF
|
||||
PoisonPower = DamageType.default.PoisonPower;
|
||||
MicrowavePower = DamageType.default.MicrowavePower;
|
||||
BleedPower = DamageType.default.BleedPower;
|
||||
BigHeadPower = DamageType.default.BigHeadPower;
|
||||
ShrinkPower = DamageType.default.ShrinkPower;
|
||||
}
|
||||
|
||||
KFDmgCauser = KFInterface_DamageCauser(DamageCauser);
|
||||
@ -397,7 +405,7 @@ protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KF
|
||||
|
||||
if (BurnPower > 0)
|
||||
{
|
||||
AccrueAffliction(AF_FirePanic, BurnPower);
|
||||
AccrueAffliction(AF_FirePanic, BurnPower, , InstigatorPerk, DamageType);
|
||||
}
|
||||
if (PoisonPower > 0 || DamageType.static.AlwaysPoisons())
|
||||
{
|
||||
@ -411,6 +419,14 @@ protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KF
|
||||
{
|
||||
AccrueAffliction(AF_Bleed, BleedPower);
|
||||
}
|
||||
if (BigHeadPower > 0)
|
||||
{
|
||||
AccrueAffliction(AF_BigHead, BigHeadPower);
|
||||
}
|
||||
if (ShrinkPower > 0)
|
||||
{
|
||||
AccrueAffliction(AF_Shrink, ShrinkPower,,InstigatorPerk);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -422,7 +438,7 @@ protected function ProcessEffectBasedAfflictions(KFPerk InstigatorPerk, class<KF
|
||||
* Adds StackedPower
|
||||
* @return true if the affliction effect should be applied
|
||||
*/
|
||||
function AccrueAffliction(EAfflictionType Type, float InPower, optional EHitZoneBodyPart BodyPart, optional KFPerk InstigatorPerk)
|
||||
function AccrueAffliction(EAfflictionType Type, float InPower, optional EHitZoneBodyPart BodyPart, optional KFPerk InstigatorPerk, optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
if ( InPower <= 0 || Type >= IncapSettings.Length )
|
||||
{
|
||||
@ -453,7 +469,7 @@ function AccrueAffliction(EAfflictionType Type, float InPower, optional EHitZone
|
||||
|
||||
if ( InPower > 0 )
|
||||
{
|
||||
Afflictions[Type].Accrue(InPower);
|
||||
Afflictions[Type].Accrue(InPower, DamageType);
|
||||
}
|
||||
}
|
||||
|
||||
@ -626,6 +642,11 @@ function float GetAfflictionDamageModifier()
|
||||
{
|
||||
if (Afflictions[i] != none)
|
||||
{
|
||||
if (i == AF_BigHead)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
DamageModifier += Afflictions[i].GetDamageModifier();
|
||||
}
|
||||
}
|
||||
@ -633,6 +654,23 @@ function float GetAfflictionDamageModifier()
|
||||
return DamageModifier;
|
||||
}
|
||||
|
||||
function float GetAfflictionDamageTakenModifier()
|
||||
{
|
||||
local float DamageModifier;
|
||||
local int i;
|
||||
|
||||
DamageModifier = 1.f;
|
||||
for (i = 0; i < Afflictions.Length; ++i)
|
||||
{
|
||||
if (Afflictions[i] != none)
|
||||
{
|
||||
DamageModifier += Afflictions[i].GetDamageTakenModifier();
|
||||
}
|
||||
}
|
||||
|
||||
return DamageModifier;
|
||||
}
|
||||
|
||||
/** Accessor to get known affliction speed modifier - Multiplicative from all mods */
|
||||
function float GetAfflictionSpeedModifier()
|
||||
{
|
||||
@ -668,6 +706,25 @@ function float GetAfflictionAttackSpeedModifier()
|
||||
return SpeedModifier;
|
||||
}
|
||||
|
||||
|
||||
function float GetBigHeadAfflictionDamageModifier()
|
||||
{
|
||||
local float DamageModifier;
|
||||
|
||||
DamageModifier = 0.f;
|
||||
|
||||
if (Afflictions.Length > AF_BigHead)
|
||||
{
|
||||
if (Afflictions[AF_BigHead] != none)
|
||||
{
|
||||
DamageModifier = Afflictions[AF_BigHead].GetDamageModifier();
|
||||
}
|
||||
}
|
||||
|
||||
return DamageModifier;
|
||||
}
|
||||
|
||||
|
||||
/** Turns off all affliction sounds / effects */
|
||||
simulated function Shutdown()
|
||||
{
|
||||
@ -745,4 +802,6 @@ defaultproperties
|
||||
AfflictionClasses(AF_Knockdown)=class'KFAffliction_Knockdown'
|
||||
AfflictionClasses(AF_Snare)=class'KFAffliction_Snare'
|
||||
AfflictionClasses(AF_Bleed)=class'KFAffliction_Bleed'
|
||||
AfflictionClasses(AF_BigHead)=class'KFAffliction_BigHead'
|
||||
AfflictionClasses(AF_Shrink)=class'KFAffliction_Shrink'
|
||||
}
|
||||
|
136
KFGame/Classes/KFAffliction_BigHead.uc
Normal file
136
KFGame/Classes/KFAffliction_BigHead.uc
Normal 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)};
|
||||
|
||||
}
|
@ -115,7 +115,7 @@ function float GetAttackSpeedModifier()
|
||||
return 1.f;
|
||||
}
|
||||
|
||||
function Accrue(float InPower)
|
||||
function Accrue(float InPower, optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
super.Accrue(InPower);
|
||||
if (PawnOwner != none)
|
||||
|
@ -25,7 +25,7 @@ var protected AkEvent OnEMPSound;
|
||||
/** Sound to play when this pawn stops being EMP'd */
|
||||
var protected AkEvent OnEMPEndSound;
|
||||
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
Super.Activate();
|
||||
SetEMPPanicked(true);
|
||||
|
@ -20,7 +20,7 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
|
||||
DisruptCooldown = P.IncapSettings[Type].ChildAfflictionCooldown;
|
||||
}
|
||||
|
||||
function Accrue(float InPower)
|
||||
function Accrue(float InPower, optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
Super.Accrue(InPower);
|
||||
|
||||
|
@ -28,6 +28,8 @@ var protected AkEvent OnFireSound;
|
||||
/** Sound to play when this pawn stops being on fire */
|
||||
var protected AkEvent OnFireEndSound;
|
||||
|
||||
var transient KFPlayerController Instigator;
|
||||
|
||||
function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
|
||||
{
|
||||
Super.Init(P, Type, InstigatorPerk);
|
||||
@ -35,9 +37,14 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
|
||||
// copy over some settings from the affliction handler that we'll need
|
||||
FireFullyCharredDuration = P.AfflictionHandler.FireFullyCharredDuration;
|
||||
FireCharPercentThreshhold = P.AfflictionHandler.FireCharPercentThreshhold;
|
||||
|
||||
if (InstigatorPerk != none)
|
||||
{
|
||||
Instigator = InstigatorPerk.OwnerPC;
|
||||
}
|
||||
}
|
||||
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
// fire can accrue after death, but cannot trigger panic
|
||||
if ( !PawnOwner.bPlayedDeath )
|
||||
|
@ -9,7 +9,7 @@
|
||||
class KFAffliction_HeavyRecovery extends KFAfflictionBase;
|
||||
|
||||
/** */
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
// Attempt to interrupt the special move
|
||||
if( PawnOwner.SpecialMove != SM_None )
|
||||
|
@ -9,9 +9,9 @@
|
||||
class KFAffliction_Knockdown extends KFAfflictionBase;
|
||||
|
||||
/** */
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
ActivateKnockdown(PawnOwner.HitFxInfo.DamageType,
|
||||
ActivateKnockdown(DamageType,
|
||||
PawnOwner.HitFxInfo.HitLocation,
|
||||
PawnOwner.DecodeUnitVector( PawnOwner.HitFxInfo.EncodedHitDirection ),
|
||||
PawnOwner.HitFxInfo.HitBoneIndex);
|
||||
|
@ -9,7 +9,7 @@
|
||||
class KFAffliction_MediumRecovery extends KFAfflictionBase;
|
||||
|
||||
/** */
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
// Attempt to interrupt the special move
|
||||
if( PawnOwner.SpecialMove != SM_None )
|
||||
|
@ -30,7 +30,7 @@ var protected AkEvent OnSteamSound;
|
||||
/** Sound to play when this pawn stops being on fire */
|
||||
var protected AkEvent OnSteamEndSound;
|
||||
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
Super.Activate();
|
||||
SetMicrowavePanicked(true);
|
||||
|
@ -8,7 +8,7 @@
|
||||
//=============================================================================
|
||||
class KFAffliction_Poison extends KFAfflictionAdvanced;
|
||||
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
Super.Activate();
|
||||
SetPoisoned(true);
|
||||
|
182
KFGame/Classes/KFAffliction_Shrink.uc
Normal file
182
KFGame/Classes/KFAffliction_Shrink.uc
Normal 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
|
||||
}
|
@ -24,7 +24,7 @@ function Init(KFPawn P, EAfflictionType Type, KFPerk InstigatorPerk)
|
||||
}
|
||||
|
||||
/** */
|
||||
function Activate()
|
||||
function Activate(optional class<KFDamageType> DamageType = none)
|
||||
{
|
||||
if( !bIsActive )
|
||||
{
|
||||
|
@ -386,7 +386,6 @@ function PurchaseWeapon(STraderItem ShopItem)
|
||||
Price = GetAdjustedBuyPriceFor(ShopItem);
|
||||
// XMAS 2021 Seasonal Objective
|
||||
KFPC = Outer;
|
||||
`Log("ADDING WEAPON PURCHASED");
|
||||
KFPC.AddWeaponPurchased(ShopItem.WeaponDef, Price);
|
||||
//
|
||||
|
||||
|
@ -871,7 +871,7 @@ private function SetAttachmentMeshAndSkin(
|
||||
CharAttachmentSocketName, KFP.ArmsMesh, KFP, true);
|
||||
|
||||
KFGRI = KFGameReplicationInfo(KFP.WorldInfo.GRI);
|
||||
if (AttachmentSlotIndex == 2 && KFP != none && KFGRI.bIsWeeklyMode && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
|
||||
if (AttachmentSlotIndex == 2 && KFP != none && KFGRI.bIsWeeklyMode && (KFGRI.CurrentWeeklyIndex == 12))
|
||||
{
|
||||
SetWeeklyCowboyAttachmentSkinMaterial(
|
||||
AttachmentSlotIndex,
|
||||
@ -917,7 +917,7 @@ private function SetAttachmentMeshAndSkin(
|
||||
CharAttachmentSocketName, KFP.Mesh, KFP, false);
|
||||
|
||||
KFGRI = KFGameReplicationInfo(KFP.WorldInfo.GRI);
|
||||
if (AttachmentSlotIndex == 2 && KFP != none && KFGRI.bIsWeeklyMode && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
|
||||
if (AttachmentSlotIndex == 2 && KFP != none && KFGRI.bIsWeeklyMode && (KFGRI.CurrentWeeklyIndex == 12))
|
||||
{
|
||||
SetWeeklyCowboyAttachmentSkinMaterial(
|
||||
AttachmentSlotIndex,
|
||||
|
@ -273,7 +273,7 @@ simulated function SetCharacterMeshFromArch( KFPawn KFP, optional KFPlayerReplic
|
||||
}
|
||||
}
|
||||
|
||||
if (KFP != none && KFGRI.bIsWeeklyMode && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
|
||||
if (KFP != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12)
|
||||
{
|
||||
NewAttachment.StaticAttachment = StaticMesh(DynamicLoadObject(ZEDCowboyHatMeshPath, class'StaticMesh'));
|
||||
NewAttachment.AttachSocketName = KFPawn_Monster(KFP).ZEDCowboyHatAttachName;
|
||||
|
@ -18,6 +18,9 @@ var localized string FailedToReachInventoryServerString;
|
||||
|
||||
var localized array<string> DifficultyStrings;
|
||||
var localized array<string> LengthStrings;
|
||||
var localized string SpecialLengthString;
|
||||
var localized string WeaponLevelString;
|
||||
var localized string GunPointsString;
|
||||
var localized array<string> ServerTypeStrings;
|
||||
var localized array<string> PermissionStrings;
|
||||
var localized array<string> ConsolePermissionStrings;
|
||||
|
27
KFGame/Classes/KFDT_ShrinkDeath.uc
Normal file
27
KFGame/Classes/KFDT_ShrinkDeath.uc
Normal 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'
|
||||
}
|
@ -91,7 +91,8 @@ var float MicrowavePower;
|
||||
var float FreezePower;
|
||||
var float SnarePower;
|
||||
var float BleedPower;
|
||||
|
||||
var float BigHeadPower;
|
||||
var float ShrinkPower;
|
||||
/*********************************************************************************************
|
||||
Impact Effects
|
||||
********************************************************************************************* */
|
||||
|
@ -36,6 +36,8 @@ var bool bUsesSecondaryAmmo;
|
||||
var bool bUsesGrenadesAsSecondaryAmmo;
|
||||
var bool bUsesSecondaryAmmoAltHUD;
|
||||
|
||||
var transient bool bLastDoshVisibility;
|
||||
|
||||
var class<KFPerk> LastPerkClass;
|
||||
var KFWeapon LastWeapon;
|
||||
|
||||
@ -45,6 +47,8 @@ var ASColorTransform DefaultColor;
|
||||
var ASColorTransform RedColor;
|
||||
var name OldState;
|
||||
|
||||
var transient byte LastGrenadeIndex;
|
||||
|
||||
function InitializeHUD()
|
||||
{
|
||||
MyKFPC = KFPlayerController(GetPC());
|
||||
@ -87,6 +91,20 @@ function UpdateDosh()
|
||||
{
|
||||
local int CurrentDosh;
|
||||
local int DeltaDosh;
|
||||
local bool bCanUseDosh;
|
||||
|
||||
bCanUseDosh = MyKFPC.CanUseDosh();
|
||||
|
||||
if (bCanUseDosh != bLastDoshVisibility)
|
||||
{
|
||||
UpdateDoshVisibility(bCanUseDosh);
|
||||
bLastDoshVisibility = bCanUseDosh;
|
||||
}
|
||||
|
||||
if (!bCanUseDosh)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (MyKFPC.PlayerReplicationInfo != none)
|
||||
{
|
||||
@ -102,6 +120,18 @@ function UpdateDosh()
|
||||
}
|
||||
}
|
||||
|
||||
function UpdateDoshVisibility(bool visible)
|
||||
{
|
||||
if (visible)
|
||||
{
|
||||
SetBool("DoshSetVisibility", true);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetBool("DoshSetVisibility", false);
|
||||
}
|
||||
}
|
||||
|
||||
function UpdateGrenades()
|
||||
{
|
||||
local int CurrentGrenades;
|
||||
@ -125,6 +155,12 @@ function UpdateGrenades()
|
||||
SetString("backpackGrenadeType", "img://" $ MyKFPC.CurrentPerk.GetGrenadeImagePath());
|
||||
LastPerkClass = MyKFPC.CurrentPerk.Class;
|
||||
LastSavedBuild = MyKFPC.CurrentPerk.GetSavedBuild();
|
||||
LastGrenadeIndex = MyKFPC.CurrentPerk.GetGrenadeSelectedIndex();
|
||||
}
|
||||
else if (MyKFPC.CurrentPerk.GetGrenadeSelectedIndex() != LastGrenadeIndex)
|
||||
{
|
||||
SetString("backpackGrenadeType", "img://" $ MyKFPC.CurrentPerk.GetGrenadeImagePath());
|
||||
LastGrenadeIndex = MyKFPC.CurrentPerk.GetGrenadeSelectedIndex();
|
||||
}
|
||||
}
|
||||
// Update the grenades count value
|
||||
@ -328,4 +364,6 @@ DefaultProperties
|
||||
{
|
||||
LastMaxWeight=-1
|
||||
LastWeight=-1
|
||||
bLastDoshVisibility=true
|
||||
LastGrenadeIndex=0
|
||||
}
|
||||
|
@ -89,7 +89,19 @@ function UpdateWaveCount()
|
||||
}
|
||||
|
||||
CurrentWaveNum = KFGRI.WaveNum;
|
||||
if(KFGRI.IsBossWave())
|
||||
|
||||
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
|
||||
{
|
||||
if (KFGRI.bWaveGunGameIsFinal)
|
||||
{
|
||||
SetString("waveNumber", FinalString);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetString("waveNumber", "" $ KFGRI.GunGameWavesCurrent);
|
||||
}
|
||||
}
|
||||
else if(KFGRI.IsBossWave())
|
||||
{
|
||||
SetString("waveNumber", class'KFGFxHUD_WaveInfo'.default.BossWaveString);
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ function TickHud(float DeltaTime)
|
||||
|
||||
function UpdateWaveCount()
|
||||
{
|
||||
local int CurrentWaveMax,CurrentWave;
|
||||
local int CurrentWaveMax, CurrentWave;
|
||||
|
||||
if( KFGRI == none )
|
||||
{
|
||||
@ -83,21 +83,46 @@ function UpdateWaveCount()
|
||||
return;
|
||||
}
|
||||
|
||||
// Max # of waves.
|
||||
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
|
||||
{
|
||||
CurrentWave = KFGRI.GunGameWavesCurrent;
|
||||
CurrentWaveMax = KFGRI.GetFinalWaveNum();
|
||||
if(LastWaveMax != CurrentWaveMax)
|
||||
|
||||
if (KFGRI.bWaveGunGameIsFinal)
|
||||
{
|
||||
CurrentWave = CurrentWaveMax + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentWaveMax = -1;
|
||||
}
|
||||
|
||||
Setint("maxGunGameWave" , CurrentWaveMax);
|
||||
Setint("currentGunGameWave" , CurrentWave);
|
||||
|
||||
LastWaveMax = CurrentWaveMax;
|
||||
LastWave = CurrentWave;
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentWave = KFGRI.WaveNum;
|
||||
CurrentWaveMax = KFGRI.GetFinalWaveNum();
|
||||
|
||||
// Max # of waves.
|
||||
if (LastWaveMax != CurrentWaveMax)
|
||||
{
|
||||
SetInt("maxWaves" , KFGRI.default.bEndlessMode ? INDEX_NONE : CurrentWaveMax);
|
||||
LastWaveMax = CurrentWaveMax;
|
||||
}
|
||||
|
||||
// Current wave we're on.
|
||||
CurrentWave = KFGRI.WaveNum;
|
||||
if(CurrentWave != LastWave)
|
||||
if (CurrentWave != LastWave)
|
||||
{
|
||||
SetInt("currentWave" , CurrentWave);
|
||||
|
||||
LastWave = CurrentWave;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function UpdateZEDCount()
|
||||
|
@ -306,6 +306,7 @@ function UpdateAttachmentsList(array<AttachmentVariants> Attachments)
|
||||
local string AttachmentName;
|
||||
local PlayerController PC;
|
||||
local bool bIsWildWest;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
bIsWildWest = false;
|
||||
ItemIndex = 0;
|
||||
@ -322,7 +323,8 @@ function UpdateAttachmentsList(array<AttachmentVariants> Attachments)
|
||||
ItemIndex++;
|
||||
|
||||
PC = GetPC();
|
||||
bIsWildWest = (PC != none && Pc.WorldInfo.GRI.IsA('KFGameReplicationInfo_WeeklySurvival') && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12));
|
||||
KFGRI = PC != none ? KFGameReplicationInfo(Pc.WorldInfo.GRI) : none;
|
||||
bIsWildWest = (KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12);
|
||||
|
||||
for (i = 0; i < Attachments.length; i++)
|
||||
{
|
||||
@ -773,9 +775,14 @@ function ForceWeeklyCowboyHat()
|
||||
{
|
||||
local PlayerController PC;
|
||||
local int CowboyHatIndex;
|
||||
PC = GetPC();
|
||||
local bool bIsWildWest;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
if (PC != none && Pc.WorldInfo.GRI.IsA('KFGameReplicationInfo_WeeklySurvival') && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
|
||||
PC = GetPC();
|
||||
KFGRI = PC != none ? KFGameReplicationInfo(Pc.WorldInfo.GRI) : none;
|
||||
bIsWildWest = (KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12);
|
||||
|
||||
if (bIsWildWest)
|
||||
{
|
||||
CowboyHatIndex = FindCowboyHatAttachmentIndex(CurrentCharInfo);
|
||||
if (CowboyHatIndex >= 0)
|
||||
|
@ -131,9 +131,22 @@ struct InventoryHelper
|
||||
var int ItemDefinition;
|
||||
var int ItemIndex;
|
||||
var int ItemCount;
|
||||
var ItemType Type;
|
||||
var GFxObject GfxItemObject;
|
||||
|
||||
// For ordering in weapon skins
|
||||
var int WeaponDef;
|
||||
var int Price;
|
||||
//var string FullName;
|
||||
var int SkinType;
|
||||
var ItemRarity Rarity;
|
||||
var int Quality;
|
||||
};
|
||||
|
||||
var array<InventoryHelper> SkinListWeaponsSearchCache;
|
||||
var array<InventoryHelper> SkinListOrderedCache;
|
||||
var bool NeedToRegenerateSkinList;
|
||||
|
||||
var EInventoryWeaponType_Filter CurrentWeaponTypeFilter;
|
||||
var int CurrentPerkIndexFilter;
|
||||
var ItemRarity CurrentRarityFilter;
|
||||
@ -142,9 +155,14 @@ var EINventory_Filter CurrentInventoryFilter;
|
||||
|
||||
var ExchangeRuleSets RuleToExchange;
|
||||
|
||||
var private int CrcTable[256];
|
||||
|
||||
function InitializeMenu( KFGFxMoviePlayer_Manager InManager )
|
||||
{
|
||||
super.InitializeMenu( InManager );
|
||||
|
||||
CrcInit();
|
||||
|
||||
KFPC = KFPlayerController(GetPC());
|
||||
CurrentPerkIndexFilter = KFPC.PerkList.length; //default value
|
||||
|
||||
@ -229,15 +247,95 @@ function OnClose()
|
||||
}
|
||||
}
|
||||
|
||||
final function CrcInit() {
|
||||
|
||||
const CrcPolynomial = 0xedb88320;
|
||||
|
||||
local int CrcValue;
|
||||
local int IndexBit;
|
||||
local int IndexEntry;
|
||||
|
||||
for (IndexEntry = 0; IndexEntry < 256; IndexEntry++) {
|
||||
CrcValue = IndexEntry;
|
||||
|
||||
for (IndexBit = 8; IndexBit > 0; IndexBit--)
|
||||
if ((CrcValue & 1) != 0)
|
||||
CrcValue = (CrcValue >>> 1) ^ CrcPolynomial;
|
||||
else
|
||||
CrcValue = CrcValue >>> 1;
|
||||
|
||||
CrcTable[IndexEntry] = CrcValue;
|
||||
}
|
||||
}
|
||||
|
||||
final function int Crc(coerce string Text)
|
||||
{
|
||||
local int CrcValue;
|
||||
local int IndexChar;
|
||||
local int StrLen;
|
||||
|
||||
CrcValue = 0xffffffff;
|
||||
StrLen = Len(Text);
|
||||
for (IndexChar = 0; IndexChar < StrLen; IndexChar++)
|
||||
CrcValue = (CrcValue >>> 8) ^ CrcTable[(Asc(Mid(Text, IndexChar, 1)) ^ CrcValue) & 0xff];
|
||||
|
||||
return CrcValue;
|
||||
}
|
||||
|
||||
delegate int SortByWeaponTypeDefinition(InventoryHelper A, InventoryHelper B)
|
||||
{
|
||||
return A.WeaponDef < B.WeaponDef ? -1 : +1;
|
||||
}
|
||||
|
||||
delegate int SortByPrice(InventoryHelper A, InventoryHelper B)
|
||||
{
|
||||
return A.Price > B.Price ? -1 : +1;
|
||||
}
|
||||
|
||||
delegate int SortByRarity(InventoryHelper A, InventoryHelper B)
|
||||
{
|
||||
return A.Rarity > B.Rarity ? -1 : +1;
|
||||
}
|
||||
|
||||
delegate int SortBySkinType(InventoryHelper A, InventoryHelper B)
|
||||
{
|
||||
return A.SkinType > B.SkinType ? -1 : +1;
|
||||
}
|
||||
|
||||
delegate int SortByQuality(InventoryHelper A, InventoryHelper B)
|
||||
{
|
||||
return A.Quality < B.Quality ? -1 : +1;
|
||||
}
|
||||
|
||||
delegate int SortByAll(InventoryHelper A, InventoryHelper B)
|
||||
{
|
||||
//local int WeapDefValue, SkinTypeValue;
|
||||
|
||||
/** Format: Compare lower ? -1 : (Compare upper) : 1 : (Equal case, repeat formula with the next sort condition) */
|
||||
return A.Price > B.Price ? -1 : (A.Price < B.Price ? 1 : (
|
||||
//STRCompare(A.WeaponDef, B.WeaponDef, WeapDefValue) < 0 ? -1 : ( WeapDefValue != 0 ? 1 : (
|
||||
A.WeaponDef < B.WeaponDef ? -1 : (A.WeaponDef > B.WeaponDef ? 1 : (
|
||||
A.Rarity > B.Rarity ? -1 : (A.Rarity < B.Rarity ? 1 : (
|
||||
//STRCompare(A.SkinType, B.SkinType, SkinTypeValue) > 0 ? -1 : ( SkinTypeValue != 0 ? 1 : (
|
||||
A.SkinType > B.SkinType ? -1 : (A.SkinType < B.SkinType ? 1 : (
|
||||
A.Quality < B.Quality ? -1 : 1
|
||||
))
|
||||
))
|
||||
))
|
||||
));
|
||||
}
|
||||
|
||||
function InitInventory()
|
||||
{
|
||||
local int i, ItemIndex, HelperIndex;
|
||||
local int i, ItemIndex, HelperIndex, WeaponItemID, SearchWeaponSkinIndex;
|
||||
local ItemProperties TempItemDetailsHolder;
|
||||
local GFxObject ItemArray, ItemObject;
|
||||
local bool bActiveItem;
|
||||
local array<InventoryHelper> ActiveItems;
|
||||
local array<InventoryHelper> ActiveItems, ValidSkinItems, FailedSkinItems;
|
||||
local InventoryHelper HelperItem;
|
||||
local array<ExchangeRuleSets> ExchangeRules;
|
||||
local class<KFWeaponDefinition> WeaponDef;
|
||||
local string SkinType;
|
||||
|
||||
local GFxObject PendingItem;
|
||||
|
||||
@ -249,6 +347,7 @@ function InitInventory()
|
||||
SetObject("inventoryList", ItemArray);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < OnlineSub.CurrentInventory.length; i++)
|
||||
{
|
||||
//look item up to get info on it.
|
||||
@ -264,10 +363,62 @@ function InitInventory()
|
||||
ItemObject = CreateObject("Object");
|
||||
HelperIndex = ActiveItems.Find('ItemDefinition', onlineSub.CurrentInventory[i].Definition);
|
||||
|
||||
if(HelperIndex == INDEX_NONE)
|
||||
if (HelperIndex == INDEX_NONE)
|
||||
{
|
||||
HelperItem.ItemDefinition = onlineSub.CurrentInventory[i].Definition;
|
||||
HelperItem.ItemCount = onlineSub.CurrentInventory[i].Quantity;
|
||||
|
||||
if (TempItemDetailsHolder.Type == ITP_WeaponSkin)
|
||||
{
|
||||
// Copy required stuff
|
||||
//HelperItem.FullName = TempItemDetailsHolder.Name;
|
||||
HelperItem.Rarity = TempItemDetailsHolder.Rarity;
|
||||
HelperItem.Quality = TempItemDetailsHolder.Quality;
|
||||
|
||||
if (bool(OnlineSub.CurrentInventory[i].NewlyAdded))
|
||||
{
|
||||
NeedToRegenerateSkinList = true;
|
||||
}
|
||||
|
||||
// Search on the cache, to speed up
|
||||
WeaponItemID = SkinListWeaponsSearchCache.Find('ItemDefinition', HelperItem.ItemDefinition);
|
||||
|
||||
if (WeaponItemID != INDEX_NONE)
|
||||
{
|
||||
HelperItem.WeaponDef = SkinListWeaponsSearchCache[WeaponItemID].WeaponDef;
|
||||
HelperItem.Price = SkinListWeaponsSearchCache[WeaponItemID].Price;
|
||||
HelperItem.SkinType = SkinListWeaponsSearchCache[WeaponItemID].SkinType;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get right part of the string without from the first "| "
|
||||
SearchWeaponSkinIndex = InStr(TempItemDetailsHolder.Name, "|");
|
||||
SkinType = Right(TempItemDetailsHolder.Name, Len(TempItemDetailsHolder.Name) - SearchWeaponSkinIndex - 2);
|
||||
|
||||
// Get the left part of the string without the next "| "
|
||||
SearchWeaponSkinIndex = InStr(SkinType, "|");
|
||||
HelperItem.SkinType = CrC(Left(SkinType, SearchWeaponSkinIndex));
|
||||
|
||||
WeaponItemID = class'KFWeaponSkinList'.default.Skins.Find('Id', HelperItem.ItemDefinition);
|
||||
|
||||
if (WeaponItemID != INDEX_NONE)
|
||||
{
|
||||
WeaponDef = class'KFWeaponSkinList'.default.Skins[WeaponItemID].WeaponDef;
|
||||
|
||||
// All Weapons start by KFGameContent.KFWeap_ Skip that prefix.
|
||||
HelperItem.WeaponDef = CrC(Mid(WeaponDef.default.WeaponClassPath, 21));
|
||||
HelperItem.Price = WeaponDef.default.BuyPrice;
|
||||
}
|
||||
else
|
||||
{
|
||||
HelperItem.WeaponDef = -1;
|
||||
HelperItem.Price = 0;
|
||||
}
|
||||
|
||||
SkinListWeaponsSearchCache.AddItem(HelperItem);
|
||||
}
|
||||
}
|
||||
|
||||
ActiveItems.AddItem(HelperItem);
|
||||
HelperIndex = ActiveItems.length - 1;
|
||||
}
|
||||
@ -314,10 +465,88 @@ function InitInventory()
|
||||
|
||||
OnlineSub.ClearNewlyAdded();
|
||||
|
||||
if (CurrentInventoryFilter == EInv_WeaponSkins)
|
||||
{
|
||||
// If need to refresh... we regenerate the list, if not reuse our Cache
|
||||
NeedToRegenerateSkinList = NeedToRegenerateSkinList || ActiveItems.Length != SkinListOrderedCache.Length;
|
||||
if (NeedToRegenerateSkinList)
|
||||
{
|
||||
NeedToRegenerateSkinList = false;
|
||||
|
||||
/*`Log("START ORDERING!!!");
|
||||
`Log("----------");*/
|
||||
|
||||
for (i = 0 ; i < ActiveItems.Length; i++)
|
||||
{
|
||||
// If doesn't have weapon definition, don't consider, only add as FailedItem to be added at the end
|
||||
if (ActiveItems[i].WeaponDef != -1)
|
||||
{
|
||||
ValidSkinItems.AddItem(ActiveItems[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
FailedSkinItems.AddItem(ActiveItems[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Now we have all valid weapons
|
||||
|
||||
// We want to order by Price - Weapon Def - Rarity - Quality
|
||||
// So we order inverse that way we keep the final list with the design intention
|
||||
|
||||
ValidSkinItems.Sort(SortByAll);
|
||||
|
||||
SkinListOrderedCache = ValidSkinItems;
|
||||
|
||||
/*for (i = 0 ; i < SkinListOrderedCache.Length; i++)
|
||||
{
|
||||
`Log("ID : " $SkinListOrderedCache[i].ItemDefinition);
|
||||
`Log("Weapon Def : " $SkinListOrderedCache[i].WeaponDef);
|
||||
`Log("Price : " $SkinListOrderedCache[i].Price);
|
||||
//`Log("Full Name : " $SkinListOrderedCache[i].FullName);
|
||||
`Log("Skin : " $SkinListOrderedCache[i].SkinType);
|
||||
`Log("Rarity : " $SkinListOrderedCache[i].Rarity);
|
||||
`Log("Quality : " $SkinListOrderedCache[i].Quality);
|
||||
`Log("----------");
|
||||
}*/
|
||||
|
||||
// FailedItems are weapons that don't have a Weapon Definition, this might be a case with old unsupported content?
|
||||
for (i = 0; i < FailedSkinItems.Length; i++)
|
||||
{
|
||||
/*if (FailedSkinItems[i].FullName != "")
|
||||
{
|
||||
`Log("FailedSkinItems ID : " $FailedSkinItems[i].ItemDefinition);
|
||||
`Log("FailedSkinItems Price : " $FailedSkinItems[i].Price);
|
||||
`Log("FailedSkinItems Full Name : " $FailedSkinItems[i].FullName);
|
||||
`Log("FailedSkinItems Skin : " $FailedSkinItems[i].SkinType);
|
||||
`Log("FailedSkinItems Rarity : " $FailedSkinItems[i].Rarity);
|
||||
`Log("FailedFailedSkinItemsItems Quality : " $FailedSkinItems[i].Quality);
|
||||
`Log("----------");
|
||||
}*/
|
||||
|
||||
SkinListOrderedCache.AddItem(FailedSkinItems[i]);
|
||||
}
|
||||
|
||||
/*`Log("FINISH ORDERING!!!");
|
||||
`Log("----------");*/
|
||||
}
|
||||
else
|
||||
{
|
||||
//`Log("USING SKIN LIST CACHE!!!");
|
||||
}
|
||||
|
||||
for (i = 0; i < SkinListOrderedCache.length; i++)
|
||||
{
|
||||
ItemArray.SetElementObject(i, SkinListOrderedCache[i].GfxItemObject);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < ActiveItems.length; i++)
|
||||
{
|
||||
ItemArray.SetElementObject(i, ActiveItems[i].GfxItemObject);
|
||||
}
|
||||
}
|
||||
|
||||
SetObject("inventoryList", ItemArray);
|
||||
|
||||
@ -376,6 +605,9 @@ function OnItemExhangeTimeOut()
|
||||
function FinishCraft()
|
||||
{
|
||||
SetVisible(true);
|
||||
|
||||
`Log("FinishCraft");
|
||||
NeedToRegenerateSkinList = true;
|
||||
}
|
||||
|
||||
function SetMatineeColor(int ItemRarity)
|
||||
@ -494,9 +726,11 @@ function bool IsItemActive(int ItemDefinition)
|
||||
|
||||
if(WeaponDef != none)
|
||||
{
|
||||
return class'KFWeaponSkinList'.Static.IsSkinEquip(WeaponDef, ItemDefinition);
|
||||
if (class'KFWeaponSkinList'.Static.IsSkinEquip(WeaponDef, ItemDefinition))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -953,6 +1187,7 @@ function Callback_Equip( int ItemDefinition )
|
||||
}
|
||||
|
||||
//refresh inventory
|
||||
NeedToRegenerateSkinList = true; // need to regenerate as the equipped state changed
|
||||
InitInventory();
|
||||
}
|
||||
|
||||
@ -1249,6 +1484,8 @@ function Callback_PreviewItem( int ItemDefinition )
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
NeedToRegenerateSkinList=false
|
||||
|
||||
CurrentWeaponTypeFilter = EInvWT_None;
|
||||
CurrentRarityFilter = ITR_NONE;
|
||||
|
||||
|
@ -39,11 +39,17 @@ var KFPlayerReplicationInfo MyKFPRI;
|
||||
var bool bModifiedSkills;
|
||||
var bool bModifiedPerk;
|
||||
var bool bChangesMadeDuringLobby;
|
||||
var bool bModifiedWeaponIndexes;
|
||||
|
||||
var name PerkLevelupSound;
|
||||
|
||||
var byte SelectedSkillsHolder[`MAX_PERK_SKILLS];
|
||||
|
||||
var const private float StickInputThreshold;
|
||||
var const private float StickResetThreshold;
|
||||
|
||||
var transient bool bAxisResetLeft, bAxisResetRight;
|
||||
|
||||
function InitializeMenu(KFGFxMoviePlayer_Manager InManager)
|
||||
{
|
||||
super.InitializeMenu(InManager);
|
||||
@ -77,7 +83,7 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
|
||||
{
|
||||
DetailsContainer = KFGFxPerksContainer_Details(Widget);//some reason this is coming out to none!
|
||||
DetailsContainer.Initialize( self );
|
||||
DetailsContainer.UpdateDetails(PerkClass);
|
||||
DetailsContainer.UpdateDetails(PerkClass, SelectedSkillsHolder, false, false);
|
||||
DetailsContainer.UpdatePassives(PerkClass);
|
||||
}
|
||||
break;
|
||||
@ -114,6 +120,8 @@ function OnOpen()
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
GetGameViewportClient().HandleInputAxis = OnAxisModified;
|
||||
|
||||
LastPerkIndex = KFPC.SavedPerkIndex;
|
||||
|
||||
MyKFPRI = KFPlayerReplicationInfo( GetPC().PlayerReplicationInfo );
|
||||
@ -196,9 +204,11 @@ event OnClose()
|
||||
{
|
||||
local bool bShouldUpdatePerk;
|
||||
|
||||
GetGameViewportClient().HandleInputAxis = none;
|
||||
|
||||
if( KFPC != none )
|
||||
{
|
||||
if( bModifiedPerk || bModifiedSkills )
|
||||
if( bModifiedPerk || bModifiedSkills || bModifiedWeaponIndexes)
|
||||
{
|
||||
bShouldUpdatePerk = bModifiedPerk && LastPerkIndex != KFPC.SavedPerkIndex;
|
||||
|
||||
@ -215,8 +225,15 @@ event OnClose()
|
||||
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SavedPerkIndex, LastPerkIndex );
|
||||
}
|
||||
|
||||
if (bModifiedWeaponIndexes)
|
||||
{
|
||||
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingWeapIdx, KFPC.SurvivalPerkWeapIndex );
|
||||
Manager.CachedProfile.SetProfileSettingValueInt( KFID_SurvivalStartingGrenIdx, KFPC.SurvivalPerkGrenIndex );
|
||||
}
|
||||
|
||||
bModifiedPerk = false;
|
||||
bModifiedSkills = false;
|
||||
bModifiedWeaponIndexes = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -323,7 +340,7 @@ function UpdateContainers( class<KFPerk> PerkClass, optional bool bClickedIndex=
|
||||
|
||||
if( DetailsContainer != none )
|
||||
{
|
||||
DetailsContainer.UpdateDetails( PerkClass );
|
||||
DetailsContainer.UpdateDetails( PerkClass, SelectedSkillsHolder, false, false );
|
||||
DetailsContainer.UpdatePassives( PerkClass );
|
||||
}
|
||||
|
||||
@ -457,6 +474,11 @@ function Callback_SkillSelected( byte TierIndex, byte SkillIndex )
|
||||
SelectedSkillsHolder[TierIndex] = SkillIndex;
|
||||
UpdateSkillsUI(KFPC.PerkList[LastPerkIndex].PerkClass);
|
||||
SavePerkData();
|
||||
|
||||
if ( KFPC.PerkList[LastPerkIndex].PerkClass.Name == 'KFPerk_Survivalist' )
|
||||
{
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, false );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -469,6 +491,110 @@ function Callback_SkillSelectionOpened()
|
||||
}
|
||||
}
|
||||
|
||||
function OnPrevWeaponPressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnPrevWeaponSelected();
|
||||
KFPC.SurvivalPerkWeapIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
function OnNextWeaponPressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnNextWeaponSelected();
|
||||
KFPC.SurvivalPerkWeapIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, true );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
function OnPrevGrenadePressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnPrevGrenadeSelected();
|
||||
KFPC.SurvivalPerkGrenIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, true, false );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
function OnNextGrenadePressed()
|
||||
{
|
||||
local byte NewIndex;
|
||||
|
||||
NewIndex = KFPC.CurrentPerk.OnNextGrenadeSelected();
|
||||
KFPC.SurvivalPerkGrenIndex = NewIndex;
|
||||
|
||||
DetailsContainer.UpdateDetails( KFPC.CurrentPerk.Class, SelectedSkillsHolder, false, true );
|
||||
bModifiedWeaponIndexes=true;
|
||||
}
|
||||
|
||||
event bool OnAxisModified( int ControllerId, name Key, float Delta, float DeltaTime, bool bGamepad )
|
||||
{
|
||||
if (GetPC().PlayerInput.bUsingGamepad )
|
||||
{
|
||||
if (DetailsContainer != none && bGamepad)
|
||||
{
|
||||
OnGamepadAxisModified(ControllerId, Key, Delta, DeltaTime, bGamepad);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function OnGamepadAxisModified( int ControllerId, name Key, float Delta, float DeltaTime, bool bGamepad )
|
||||
{
|
||||
local float AbsDelta;
|
||||
|
||||
AbsDelta = Abs(Delta);
|
||||
|
||||
if ( KFPC.CurrentPerk.static.CanChoosePrimaryWeapon() && Key == 'XboxTypeS_LeftX' )
|
||||
{
|
||||
if (bAxisResetLeft && AbsDelta > StickInputThreshold)
|
||||
{
|
||||
if (Delta < 0)
|
||||
{
|
||||
OnPrevWeaponPressed();
|
||||
}
|
||||
else
|
||||
{
|
||||
OnNextWeaponPressed();
|
||||
}
|
||||
bAxisResetLeft = false;
|
||||
}
|
||||
else if (!bAxisResetLeft && AbsDelta < StickResetThreshold)
|
||||
{
|
||||
bAxisResetLeft = true;
|
||||
}
|
||||
}
|
||||
else if (KFPC.CurrentPerk.static.CanChooseGrenade() && Key == 'XboxTypeS_RightX')
|
||||
{
|
||||
if (bAxisResetRight && AbsDelta > StickInputThreshold)
|
||||
{
|
||||
if (Delta < 0)
|
||||
{
|
||||
OnPrevGrenadePressed();
|
||||
}
|
||||
else
|
||||
{
|
||||
OnNextGrenadePressed();
|
||||
}
|
||||
bAxisResetRight = false;
|
||||
}
|
||||
else if (!bAxisResetRight && AbsDelta < StickResetThreshold)
|
||||
{
|
||||
bAxisResetRight = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
PerkLevelupSound=LevelUp_Popup
|
||||
@ -481,4 +607,9 @@ defaultproperties
|
||||
SubWidgetBindings.Add((WidgetName="SelectedPerkSummaryContainer",WidgetClass=class'KFGFxPerksContainer_SkillsSummary'))
|
||||
LastPerkIndex=255
|
||||
LastPerkLevel=255
|
||||
|
||||
bAxisResetLeft=true
|
||||
bAxisResetRight=false
|
||||
StickInputThreshold=0.5
|
||||
StickResetThreshold=0.5
|
||||
}
|
||||
|
@ -216,7 +216,11 @@ function SetSumarryInfo()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (KFGRI.default.bEndlessMode)
|
||||
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
|
||||
{
|
||||
TextObject.SetString("waveTime", WaveString @ KFGRI.GunGameWavesCurrent @"-" @FormatTime(KFGRI.ElapsedTime));
|
||||
}
|
||||
else if (KFGRI.default.bEndlessMode)
|
||||
{
|
||||
TextObject.SetString("waveTime", WaveString @ KFGRI.WaveNum @"-" @FormatTime(KFGRI.ElapsedTime));
|
||||
}
|
||||
|
@ -70,6 +70,9 @@ var KFGFxWidget_BossHealthBar bossHealthBar;
|
||||
var KFGFxWidget_MapText MapTextWidget;
|
||||
// Widget that displays map texts
|
||||
var KFGFxWidget_MapCounterText MapCounterTextWidget;
|
||||
// Widget that displays gun mode texts
|
||||
var KFGFxWidget_GunGame GunGameWidget;
|
||||
|
||||
|
||||
var KFPlayerController KFPC;
|
||||
|
||||
@ -102,6 +105,9 @@ var Protected float LastUpdateTime;
|
||||
// The name of the player currently being voted on to kick
|
||||
var string PendingKickPlayerName;
|
||||
|
||||
// Gun game variables
|
||||
var transient bool bLastGunGameVisibility;
|
||||
|
||||
/** On creation of the HUD */
|
||||
function Init(optional LocalPlayer LocPlay)
|
||||
{
|
||||
@ -348,6 +354,13 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
|
||||
GoompaCounterWidget=KFGFxWidget_GoompaCounter(Widget);
|
||||
}
|
||||
break;
|
||||
case 'GunGameContainer':
|
||||
if (GunGameWidget == none)
|
||||
{
|
||||
GunGameWidget=KFGFxWidget_GunGame(Widget);
|
||||
SetWidgetPathBinding( Widget, WidgetPath );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -376,6 +389,8 @@ function UpdateWeaponSelect()
|
||||
/** Update all the unique HUD pieces */
|
||||
function TickHud(float DeltaTime)
|
||||
{
|
||||
local bool bGunGameVisibility;
|
||||
|
||||
if(KFPC == none || KFPC.WorldInfo.TimeSeconds - LastUpdateTime < UpdateInterval )
|
||||
{
|
||||
return;
|
||||
@ -447,6 +462,22 @@ function TickHud(float DeltaTime)
|
||||
{
|
||||
GfxScoreBoardPlayer.TickHud(DeltaTime);
|
||||
}
|
||||
|
||||
if (GunGameWidget != none)
|
||||
{
|
||||
bGunGameVisibility = KFPC.CanUseGunGame();
|
||||
|
||||
if (bGunGameVisibility)
|
||||
{
|
||||
bGunGameVisibility = KFPC.Pawn.Health > 0;
|
||||
}
|
||||
|
||||
if (bGunGameVisibility != bLastGunGameVisibility)
|
||||
{
|
||||
GunGameWidget.UpdateGunGameVisibility(bGunGameVisibility);
|
||||
bLastGunGameVisibility = bGunGameVisibility;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function UpdateObjectiveActive()
|
||||
@ -781,7 +812,18 @@ function DisplayExpandedWaveInfo()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (KFGRI.IsBossWave())
|
||||
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
|
||||
{
|
||||
if (KFGRI.bWaveGunGameIsFinal)
|
||||
{
|
||||
PriorityMessageObject.SetString("waveNum", class'KFGFxHUD_WaveInfo'.default.FinalWaveString);
|
||||
}
|
||||
else
|
||||
{
|
||||
PriorityMessageObject.SetString("waveNum", KFGRI.GunGameWavesCurrent $"/?");
|
||||
}
|
||||
}
|
||||
else if (KFGRI.IsBossWave())
|
||||
{
|
||||
PriorityMessageObject.SetString("waveNum", class'KFGFxHUD_WaveInfo'.default.BossWaveString);
|
||||
}
|
||||
@ -1091,6 +1133,14 @@ function UpdateGoompaCounterWidget(int value, int max)
|
||||
}
|
||||
}
|
||||
|
||||
function UpdateGunGameWidget(int score, int max_score, int level, int max_level)
|
||||
{
|
||||
if (GunGameWidget != none)
|
||||
{
|
||||
GunGameWidget.SetData(score, max_score, level, max_level);
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
// Input
|
||||
//==============================================================
|
||||
@ -1441,6 +1491,8 @@ DefaultProperties
|
||||
bAutoPlay=true
|
||||
bIsSpectating=false
|
||||
|
||||
bLastGunGameVisibility=true
|
||||
|
||||
WidgetBindings.Add((WidgetName="ObjectiveContainer",WidgetClass=class'KFGFxHUD_ObjectiveConatiner'))
|
||||
WidgetBindings.Add((WidgetName="SpectatorInfoWidget",WidgetClass=class'KFGFxHUD_SpectatorInfo'))
|
||||
WidgetBindings.Add((WidgetName="PlayerStatWidgetMC",WidgetClass=class'KFGFxHUD_PlayerStatus'))
|
||||
@ -1465,6 +1517,7 @@ DefaultProperties
|
||||
WidgetBindings.Add((WidgetName="bossHealthBar", WidgetClass=class'KFGFxWidget_BossHealthBar'))
|
||||
WidgetBindings.Add((WidgetName="mapTextWidget", WidgetClass=class'KFGFxWidget_MapText'))
|
||||
WidgetBindings.Add((WidgetName="counterMapTextWidget", WidgetClass=class'KFGFxWidget_MapCounterText'))
|
||||
WidgetBindings.ADD((WidgetName="GunGameContainer", WidgetClass=class'KFGFxWidget_GunGame'));
|
||||
|
||||
|
||||
SpecialWaveIconPath(AT_Clot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Cyst"
|
||||
|
@ -25,29 +25,22 @@ function LocalizeContainer()
|
||||
GetObject("basicLoadoutTextField").SetString("text", BasicLoadoutString);
|
||||
}
|
||||
|
||||
function UpdateDetails( class<KFPerk> PerkClass)
|
||||
function UpdateDetailsInternal(class<KFPerk> PerkClass, KFPlayerController KFPC, byte WeaponIdx, byte GrenadeIdx)
|
||||
{
|
||||
local GFxObject DetailsProvider;
|
||||
local KFPlayerController KFPC;
|
||||
local array<string> WeaponNames;
|
||||
local array<string> WeaponSources;
|
||||
local int i;
|
||||
|
||||
DetailsProvider = CreateObject( "Object" );
|
||||
|
||||
KFPC = KFPlayerController( GetPC() );
|
||||
|
||||
if ( KFPC != none)
|
||||
{
|
||||
if(KFPC != none)
|
||||
{
|
||||
DetailsProvider.SetString( "ExperienceMessage", ExperienceString @ KFPC.GetPerkXP(PerkClass) );
|
||||
}
|
||||
|
||||
if(PerkClass.default.PrimaryWeaponDef != none)
|
||||
{
|
||||
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.PrimaryWeaponDef.static.GetItemName(), PerkClass.default.PrimaryWeaponDef.static.GetImagePath());
|
||||
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());
|
||||
@ -58,7 +51,7 @@ function UpdateDetails( class<KFPerk> PerkClass)
|
||||
}
|
||||
if(PerkClass.default.GrenadeWeaponDef != none)
|
||||
{
|
||||
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.default.GrenadeWeaponDef.static.GetItemName(), PerkClass.default.GrenadeWeaponDef.static.GetImagePath());
|
||||
AddWeaponInfo(WeaponNames, WeaponSources, PerkClass.static.GetGrenadeWeaponName(GrenadeIdx), PerkClass.static.GetGrenadeWeaponImagePath(GrenadeIdx));
|
||||
}
|
||||
|
||||
for (i = 0; i < WeaponNames.length; i++)
|
||||
@ -70,8 +63,30 @@ function UpdateDetails( class<KFPerk> PerkClass)
|
||||
DetailsProvider.SetString( "EXPAction1", PerkClass.default.EXPAction1 );
|
||||
DetailsProvider.SetString( "EXPAction2", PerkClass.default.EXPAction2 );
|
||||
|
||||
DetailsProvider.SetBool("ShowPrimaryWeaponSelectors", PerkClass.static.CanChoosePrimaryWeapon());
|
||||
DetailsProvider.SetBool("ShowGrenadeSelectors", PerkClass.static.CanChooseGrenade());
|
||||
|
||||
SetObject( "detailsData", DetailsProvider );
|
||||
}
|
||||
|
||||
function UpdateDetails(class<KFPerk> PerkClass, byte SelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
|
||||
{
|
||||
local KFPlayerController KFPC;
|
||||
local byte WeaponIdx, GrenadeIdx;
|
||||
|
||||
KFPC = KFPlayerController( GetPC() );
|
||||
|
||||
if ( KFPC == none)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
WeaponIdx = 0;
|
||||
GrenadeIdx = 0;
|
||||
|
||||
UpdateAndGetCurrentWeaponIndexes(PerkClass, KFPC, WeaponIdx, GrenadeIdx, SelectedSkills, IsChoosingPrev, IsChoosingNext);
|
||||
|
||||
UpdateDetailsInternal(PerkClass, KFPC, WeaponIdx, GrenadeIdx);
|
||||
}
|
||||
|
||||
function AddWeaponInfo(out array<string> WeaponNames, out array<string> WeaponSources, string WeaponName, string WeaponSource)
|
||||
@ -108,4 +123,12 @@ function UpdatePassives(Class<KFPerk> PerkClass)
|
||||
SetObject( "passivesData", PassivesProvider );
|
||||
}
|
||||
|
||||
|
||||
function UpdateAndGetCurrentWeaponIndexes(class<KFPerk> PerkClass, KFPlayerController KFPC, out byte WeaponIdx, out byte GrenadeIdx
|
||||
, byte SelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
|
||||
{
|
||||
if (PerkClass.Name == 'KFPerk_Survivalist')
|
||||
{
|
||||
WeaponIdx = KFPC.CurrentPerk.SetWeaponSelectedIndex(KFPC.SurvivalPerkWeapIndex);
|
||||
GrenadeIdx = KFPC.CurrentPerk.SetGrenadeSelectedIndexUsingSkills(KFPC.SurvivalPerkGrenIndex, SelectedSkills, IsChoosingPrev, IsChoosingNext);
|
||||
}
|
||||
}
|
||||
|
@ -14,6 +14,14 @@ var localized string YourVoteString;
|
||||
var localized string TopVotesString;
|
||||
var string MapVoteString; //localized in parent and parent passes it to this class
|
||||
|
||||
// Maps to skip
|
||||
const MapBiolapse = 'KF-Biolapse';
|
||||
const MapNightmare = 'KF-Nightmare';
|
||||
const MapPowerCore = 'KF-PowerCore_Holdout';
|
||||
const MapDescent = 'KF-TheDescent';
|
||||
const MapKrampus = 'KF-KrampusLair';
|
||||
const MapSteam = 'KF-SteamFortress';
|
||||
|
||||
//==============================================================
|
||||
// Initialization
|
||||
//==============================================================
|
||||
@ -47,36 +55,46 @@ function SetMapOptions()
|
||||
local bool IsWeeklyMode;
|
||||
local bool IsBrokenTrader;
|
||||
local bool IsBossRush;
|
||||
local bool IsGunGame;
|
||||
local bool bShouldSkipMaps;
|
||||
local name MapName;
|
||||
|
||||
KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI);
|
||||
|
||||
bShouldSkipMaps = false;
|
||||
Counter = 0;
|
||||
|
||||
if(KFGRI != none && KFGRI.VoteCollector != none)
|
||||
{
|
||||
ServerMapList = KFGRI.VoteCollector.MapList;
|
||||
IsWeeklyMode = KFGRI.bIsWeeklyMode;
|
||||
IsBrokenTrader = KFGRI.CurrentWeeklyIndex == 11;
|
||||
IsBossRush = KFGRI.CurrentWeeklyIndex == 14;
|
||||
IsGunGame = KFGRI.CurrentWeeklyIndex == 16;
|
||||
|
||||
bShouldSkipMaps = IsWeeklyMode && (IsBrokenTrader || IsBossRush || IsGunGame);
|
||||
|
||||
//gfx
|
||||
MapList = CreateArray();
|
||||
|
||||
for (i = 0; i < ServerMapList.length; i++)
|
||||
{
|
||||
if ( IsWeeklyMode && (IsBrokenTrader || IsBossRush) && ( ServerMapList[i] == "KF-Biolapse" ||
|
||||
ServerMapList[i] == "KF-Nightmare" ||
|
||||
ServerMapList[i] == "KF-PowerCore_Holdout" ||
|
||||
ServerMapList[i] == "KF-TheDescent" ||
|
||||
ServerMapList[i] == "KF-KrampusLair"))
|
||||
MapName = name(ServerMapList[i]);
|
||||
if ( bShouldSkipMaps && ( MapName == MapBiolapse ||
|
||||
MapName == MapNightmare ||
|
||||
MapName == MapPowerCore ||
|
||||
MapName == MapDescent ||
|
||||
MapName == MapKrampus))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Temporary removal of SteamFrotress for BossRush */
|
||||
if (IsWeeklyMode && IsBossRush && ServerMapList[i] == "KF-SteamFortress")
|
||||
if (IsWeeklyMode && IsBossRush && MapName == MapSteam)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
/**/
|
||||
/* */
|
||||
|
||||
MapObject = CreateObject("Object");
|
||||
MapObject.SetString("label", class'KFCommon_LocalizedStrings'.static.GetFriendlyMapName(ServerMapList[i]) );
|
||||
|
@ -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
|
||||
}
|
@ -348,11 +348,9 @@ function UpdateOverviewInGame()
|
||||
bCustomLength = false; //not using these now
|
||||
bCustomDifficulty = false;
|
||||
|
||||
|
||||
KFGRI = KFGameReplicationInfo(GetPC().WorldInfo.GRI);
|
||||
if(KFGRI != none)
|
||||
{
|
||||
|
||||
if (KFGRI != none && KFGRI.GameClass != none && !KFGRI.GameClass.Static.GetShouldShowLength())
|
||||
{
|
||||
HideLengthInfo();
|
||||
@ -372,7 +370,16 @@ function UpdateOverviewInGame()
|
||||
}
|
||||
|
||||
CurrentLengthIndex = KFGRI.GameLength;
|
||||
if(LastLengthIndex != CurrentLengthIndex)
|
||||
|
||||
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
|
||||
{
|
||||
UpdateLength(Class'KFCommon_LocalizedStrings'.default.SpecialLengthString);
|
||||
|
||||
LastLengthIndex = CurrentLengthIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LastLengthIndex != CurrentLengthIndex)
|
||||
{
|
||||
// don't show the length category in objective mode
|
||||
if (KFGRI.GameClass.Name == ObjectiveClassName)
|
||||
@ -383,8 +390,10 @@ function UpdateOverviewInGame()
|
||||
{
|
||||
UpdateLength(bCustomLength ? Class'KFCommon_LocalizedStrings'.default.CustomString : class'KFCommon_LocalizedStrings'.static.GetLengthString(CurrentLengthIndex));
|
||||
}
|
||||
|
||||
LastLengthIndex = CurrentLengthIndex;
|
||||
}
|
||||
}
|
||||
|
||||
UpdateServerType( class'KFCommon_LocalizedStrings'.static.GetServerTypeString(int(KFGRI.bCustom)) );
|
||||
|
||||
|
@ -182,31 +182,40 @@ function FillWhatsNew()
|
||||
local SWhatsNew item;
|
||||
WhatsNewItems.Remove(0, WhatsNewItems.Length);
|
||||
// Latest Update
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_ChopTilYouDrop", "LatestUpdate", "http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_TidalTerror", "LatestUpdate", "http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// KF2 Armory Season Pass 2021
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Spring_Armory_Season_Pass", "ArmorySeasonPass", "https://store.steampowered.com/app/1524820/Killing_Floor_2__Armory_Season_Pass");
|
||||
// KF2 Armory Season Pass 2022
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_ArmorySeasonPassII", "ArmorySeasonPass", "https://store.steampowered.com/app/1914490/KF2__Season_Pass_2022");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Time Limited Item
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/5588");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_SS_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/4928");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Full Gear
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Holiday_Shopper", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9262");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_UltimateEdition", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9283");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_NeonMKVIII_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9362");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_Classic_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9363");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_DeepSea_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9364");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_Chameleon_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9365");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Outfit Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_Shopping_Uniforms", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9263");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_DeepSea_Explorer_Uniforms", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9366");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Christmas", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9264");
|
||||
// Featured Weapon
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_ReductoRay", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9367");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Skin Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Alchemist_Weapon_Skin", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9265");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Cosmetic Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_Alchemist","FeaturedItemBundle","https://store.steampowered.com/buyitem/232090/9266");
|
||||
// Featured Weapon
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_Sentinel","FeaturedItemBundle","https://store.steampowered.com/buyitem/232090/9368");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Featured Weapon Bundle
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_XMAS_Doshinegun", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9267");
|
||||
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Summer2022_Weaponsbundle", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/9369");
|
||||
WhatsNewItems.AddItem(item);
|
||||
// Misc Community Links
|
||||
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityHub", "Jaegorhorn", "https://steamcommunity.com/app/232090");
|
||||
|
@ -271,11 +271,16 @@ function FilterWeeklyMaps(out array<string> List)
|
||||
return;
|
||||
}
|
||||
|
||||
`Log("OPTIONS: Skipping Maps");
|
||||
|
||||
// Scavenger index = 11
|
||||
// BossRush index = 14
|
||||
// GunGame index = 16
|
||||
WeeklyIndex = class'KFGameEngine'.static.GetWeeklyEventIndexMod();
|
||||
if (WeeklyIndex == 11 || WeeklyIndex == 14)
|
||||
if (WeeklyIndex == 11 || WeeklyIndex == 14 || WeeklyIndex == 16)
|
||||
{
|
||||
`Log("OPTIONS: Inside, removing maps");
|
||||
|
||||
List.RemoveItem("KF-Biolapse");
|
||||
List.RemoveItem("KF-Nightmare");
|
||||
List.RemoveItem("KF-PowerCore_Holdout");
|
||||
|
@ -447,21 +447,25 @@ DefaultProperties
|
||||
|
||||
XboxFilterExceptions[0]="Wasteland Bundle" // Wasteland Outfit Bundle
|
||||
|
||||
FeaturedItemIDs[0]=7944 //Whatsnew Gold Ticket
|
||||
FeaturedItemIDs[1]=9262
|
||||
FeaturedItemIDs[2]=9263
|
||||
FeaturedItemIDs[3]=9264
|
||||
FeaturedItemIDs[4]=9265
|
||||
FeaturedItemIDs[5]=9266
|
||||
FeaturedItemIDs[6]=9267
|
||||
FeaturedItemIDs[0]=8178 //Whatsnew Gold Ticket
|
||||
FeaturedItemIDs[1]=9369
|
||||
FeaturedItemIDs[2]=9367
|
||||
FeaturedItemIDs[3]=9368
|
||||
FeaturedItemIDs[4]=9366
|
||||
FeaturedItemIDs[5]=9364
|
||||
FeaturedItemIDs[6]=9362
|
||||
FeaturedItemIDs[7]=9363
|
||||
FeaturedItemIDs[8]=9365
|
||||
|
||||
ConsoleFeaturedItemIDs[0]=7947 //Whatsnew Gold Ticket PSN
|
||||
ConsoleFeaturedItemIDs[1]=9262
|
||||
ConsoleFeaturedItemIDs[2]=9263
|
||||
ConsoleFeaturedItemIDs[3]=9264
|
||||
ConsoleFeaturedItemIDs[4]=9265
|
||||
ConsoleFeaturedItemIDs[5]=9266
|
||||
ConsoleFeaturedItemIDs[6]=9267
|
||||
ConsoleFeaturedItemIDs[0]=8181 //Whatsnew Gold Ticket PSN
|
||||
ConsoleFeaturedItemIDs[1]=9369
|
||||
ConsoleFeaturedItemIDs[2]=9367
|
||||
ConsoleFeaturedItemIDs[3]=9368
|
||||
ConsoleFeaturedItemIDs[4]=9366
|
||||
ConsoleFeaturedItemIDs[5]=9364
|
||||
ConsoleFeaturedItemIDs[6]=9362
|
||||
ConsoleFeaturedItemIDs[7]=9363
|
||||
ConsoleFeaturedItemIDs[8]=9365
|
||||
|
||||
MaxFeaturedItems=5
|
||||
}
|
@ -34,8 +34,11 @@ function UpdateGameInfo()
|
||||
}
|
||||
else
|
||||
{
|
||||
// Show the upcoming wave number for every wave except the boss wave
|
||||
if (KFGRI.default.bEndlessMode)
|
||||
if (KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 16)
|
||||
{
|
||||
FinalWaveString = WaveString @ (KFGRI.GunGameWavesCurrent) $"/?";
|
||||
}
|
||||
else if (KFGRI.default.bEndlessMode) // Show the upcoming wave number for every wave except the boss wave
|
||||
{
|
||||
// Show wave number, since there is no max
|
||||
FinalWaveString = WaveString @ (KFGRI.WaveNum);
|
||||
|
@ -31,14 +31,30 @@ function bool PopulateData()
|
||||
{
|
||||
local GFxObject DataObject;
|
||||
local KFWeeklyOutbreakInformation WeeklyInfo;
|
||||
|
||||
local bool bWeeklyComplete;
|
||||
local int WeeklyIndex;
|
||||
|
||||
bWeeklyComplete = KFPC.IsWeeklyEventComplete();
|
||||
WeeklyIndex = -1;
|
||||
|
||||
if(bWeeklyComplete != bLastWeeklyComplete || !bInitialDataPopulated)
|
||||
{
|
||||
if (KFPC.WorldInfo.NetMode == NM_Client)
|
||||
{
|
||||
if (KFPC != none && KFGameReplicationInfo(KFPC.WorldInfo.GRI) != none)
|
||||
{
|
||||
WeeklyIndex = KFGameReplicationInfo(KFPC.WorldInfo.GRI).CurrentWeeklyIndex;
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetWeeklyOutbreakInfoByIndex(WeeklyIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetPC().SetTimer(0.5f, false, nameof(PopulateData));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
|
||||
}
|
||||
|
||||
DataObject = CreateObject("Object");
|
||||
if(WeeklyInfo == none)
|
||||
@ -46,8 +62,9 @@ function bool PopulateData()
|
||||
return false;
|
||||
}
|
||||
DataObject.SetString("label", WeeklyInfo.FriendlyName);
|
||||
if(WeeklyInfo != none && WeeklyInfo.ModifierDescriptions.length > 0)
|
||||
if(WeeklyInfo.ModifierDescriptions.length > 0)
|
||||
{
|
||||
`Log("SETTING DESCRIPTION: " $WeeklyInfo.DescriptionStrings[0]);
|
||||
DataObject.SetString("description", WeeklyInfo.DescriptionStrings[0]);
|
||||
}
|
||||
DataObject.SetString("iconPath", "img://"$WeeklyInfo.IconPath);
|
||||
@ -58,8 +75,14 @@ function bool PopulateData()
|
||||
DataObject.SetString("textValue", "");
|
||||
|
||||
SetObject("weeklyObjectiveData", DataObject);
|
||||
PopulateModifiers();
|
||||
PopulateRewards();
|
||||
|
||||
if (WeeklyInfo.ModifierDescriptions.Length > 0)
|
||||
{
|
||||
SetString("weeklyDescription", WeeklyInfo.ModifierDescriptions[0]);
|
||||
}
|
||||
|
||||
PopulateModifiers(WeeklyInfo);
|
||||
PopulateRewards(WeeklyInfo, WeeklyIndex);
|
||||
|
||||
bLastWeeklyComplete = bWeeklyComplete;
|
||||
bInitialDataPopulated = true;
|
||||
@ -69,24 +92,26 @@ function bool PopulateData()
|
||||
return false;
|
||||
}
|
||||
|
||||
function PopulateModifiers()
|
||||
function PopulateModifiers(KFWeeklyOutbreakInformation WeeklyInfo)
|
||||
{
|
||||
local int i;
|
||||
local GFxObject DataObject;
|
||||
local GFxObject DataProvider; //array containing the data objects
|
||||
local KFWeeklyOutbreakInformation WeeklyInfo;
|
||||
|
||||
if (WeeklyInfo == none || (GetPC().WorldInfo.NetMode == NM_Client && KFPC.WorldInfo.GRI == none))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
DataProvider = CreateArray();
|
||||
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
|
||||
for (i = 0; i < WeeklyInfo.ModifierDescriptions.length; i++)
|
||||
{
|
||||
DataObject = CreateObject("Object");
|
||||
DataObject.SetString("label", ""); //no lable at the moment
|
||||
if(WeeklyInfo != none && WeeklyInfo.ModifierDescriptions.length > 0)
|
||||
{
|
||||
|
||||
DataObject.SetString("description", WeeklyInfo.ModifierDescriptions[i]);
|
||||
}
|
||||
|
||||
//DataObject.SetString("iconPath", "img://"$WeeklyInfo.ModifierIconPaths[i]);
|
||||
|
||||
DataProvider.SetElementObject(i, DataObject); //add it to the array
|
||||
@ -95,18 +120,21 @@ function PopulateModifiers()
|
||||
SetObject("modifiers", DataProvider); //pass to SWF
|
||||
}
|
||||
|
||||
function PopulateRewards()
|
||||
function PopulateRewards(KFWeeklyOutbreakInformation WeeklyInfo, int WeeklyIndex)
|
||||
{
|
||||
local int i, ItemCount;
|
||||
local GFxObject DataProvider; //array containing the data objects
|
||||
local KFWeeklyOutbreakInformation WeeklyInfo;
|
||||
local GFxObject GfxRewardItem;
|
||||
|
||||
if (WeeklyInfo == none)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ItemCount = 0;
|
||||
DataProvider = CreateArray();
|
||||
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
|
||||
WeeklyInfo.RewardIDs = class'KFOnlineStatsWrite'.static.GetWeeklyOutbreakRewards();
|
||||
WeeklyInfo.RewardIDs = class'KFOnlineStatsWrite'.static.GetWeeklyOutbreakRewards(WeeklyIndex);
|
||||
for (i = 0; i < WeeklyInfo.RewardIDs.length; i++)
|
||||
{
|
||||
GfxRewardItem = CreateRewardItem(WeeklyInfo, WeeklyInfo.RewardIDs[i]);
|
||||
@ -161,9 +189,9 @@ function GFxObject CreateRewardItem(KFWeeklyOutbreakInformation WeeklyInfo,int I
|
||||
function LocalizeMenu()
|
||||
{
|
||||
local GFxObject TextObject;
|
||||
local KFWeeklyOutbreakInformation WeeklyInfo;
|
||||
// local KFWeeklyOutbreakInformation WeeklyInfo;
|
||||
|
||||
WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
|
||||
// WeeklyInfo = class'KFMission_LocalizedStrings'.static.GetCurrentWeeklyOutbreakInfo();
|
||||
TextObject = CreateObject("Object");
|
||||
// Localize static text
|
||||
TextObject.SetString("currentModifier", class'KFMission_LocalizedStrings'.default.CurrentWeeklySettingsString);
|
||||
@ -172,11 +200,11 @@ function LocalizeMenu()
|
||||
TextObject.SetString("weekly", class'KFMission_LocalizedStrings'.default.WeeklyString);
|
||||
TextObject.SetString("overview", class'KFMission_LocalizedStrings'.default.WeeklyOverview);
|
||||
TextObject.SetString("vaultDosh", class'KFMission_LocalizedStrings'.default.VaultDoshString);
|
||||
|
||||
/*
|
||||
if(WeeklyInfo != none && WeeklyInfo.ModifierDescriptions.length > 0)
|
||||
{
|
||||
TextObject.SetString("description", WeeklyInfo.ModifierDescriptions[0]);
|
||||
}
|
||||
|
||||
*/
|
||||
SetObject("localizedText", TextObject);
|
||||
}
|
36
KFGame/Classes/KFGFxWidget_GunGame.uc
Normal file
36
KFGame/Classes/KFGFxWidget_GunGame.uc
Normal 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);
|
||||
}
|
||||
}
|
@ -84,12 +84,15 @@ function UpdateReadyButtonVisibility()
|
||||
//sanity check because this is happening
|
||||
MyKFPRI = KFPlayerReplicationInfo(GetPC().PlayerReplicationInfo);
|
||||
}
|
||||
|
||||
if(bReadyButtonVisible)
|
||||
{
|
||||
KFGRI = KFGameReplicationInfo( GetPC().WorldInfo.GRI );
|
||||
if ( KFGRI != none )
|
||||
{
|
||||
if (KFGRI.bMatchHasBegun && (MyKFPRI != none && MyKFPRI.bHasSpawnedIn && KFGRI.bTraderIsOpen) && !KFGRI.bMatchIsOver && MyKFPRI.GetTeamNum() != 255 )
|
||||
if (KFGRI.bMatchHasBegun
|
||||
&& (MyKFPRI != none && MyKFPRI.bHasSpawnedIn && (KFGRI.bTraderIsOpen || KFGRI.bForceSkipTraderUI))
|
||||
&& !KFGRI.bMatchIsOver && MyKFPRI.GetTeamNum() != 255)
|
||||
{
|
||||
bShowingSkipTrader = !MyKFPRI.bVotedToSkipTraderTime;
|
||||
if (bShowingSkipTrader && !ReadyButton.GetBool("visible"))
|
||||
|
@ -442,6 +442,14 @@ var int SpawnedMonsterProperties[EMonsterProperties];
|
||||
*/
|
||||
var transient array< byte > BossRushEnemies;
|
||||
|
||||
// Maps to skip
|
||||
const MapBiolapse = 'KF-Biolapse';
|
||||
const MapNightmare = 'KF-Nightmare';
|
||||
const MapPowerCore = 'KF-PowerCore_Holdout';
|
||||
const MapDescent = 'KF-TheDescent';
|
||||
const MapKrampus = 'KF-KrampusLair';
|
||||
const MapSteam = 'KF-SteamFortress';
|
||||
|
||||
/************************************************************************************
|
||||
* @name Native
|
||||
***********************************************************************************/
|
||||
@ -1193,14 +1201,7 @@ function ResetPickups( array<KFPickupFactory> PickupList, int NumPickups )
|
||||
|
||||
PossiblePickups = PickupList;
|
||||
|
||||
if (OutbreakEvent != none && OutbreakEvent.ActiveEvent.bUnlimitedWeaponPickups && KFPickupFactory_Item(PickupList[0]) != none)
|
||||
{
|
||||
NumIterations = Min(NumPickups, PickupList.Length - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
NumIterations = Min(NumPickups, PickupList.Length);
|
||||
}
|
||||
|
||||
for ( i = 0; i < NumIterations; i++ )
|
||||
{
|
||||
@ -1266,10 +1267,17 @@ function KFPickupFactory DetermineNextPickup( array<KFPickupFactory> PickupList,
|
||||
function ActivateNextPickup( KFPickupFactory NextFactory, int RespawnDelay )
|
||||
{
|
||||
if( NextFactory != none )
|
||||
{
|
||||
if (NextFactory.CanUsePickup())
|
||||
{
|
||||
NextFactory.bToBeActivated = true;
|
||||
NextFactory.SetTimer( RespawnDelay, , nameof(NextFactory.Reset) );
|
||||
}
|
||||
else
|
||||
{
|
||||
NextFactory.SetPickupHidden();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
@ -1421,6 +1429,14 @@ function RestartPlayer(Controller NewPlayer)
|
||||
}
|
||||
}
|
||||
|
||||
function ResetGunGame(KFPlayerController_WeeklySurvival KFPC_WS)
|
||||
{
|
||||
}
|
||||
|
||||
function RestartGunGamePlayerWeapon(KFPlayerController_WeeklySurvival KFPC_WS, byte WaveToUse)
|
||||
{
|
||||
}
|
||||
|
||||
/** Returns a low rating if other players are nearby (spawn will fail) */
|
||||
function float RatePlayerStart(PlayerStart P, byte Team, Controller Player)
|
||||
{
|
||||
@ -2895,6 +2911,7 @@ function string GetNextMap()
|
||||
{
|
||||
local array<string> MapList;
|
||||
local int i;
|
||||
local name MapName;
|
||||
|
||||
if ( bUseMapList && GameMapCycles.Length > 0 )
|
||||
{
|
||||
@ -2913,16 +2930,22 @@ function string GetNextMap()
|
||||
{
|
||||
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'))
|
||||
{
|
||||
if ((class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 11 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[11]) || // Scavenger
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14])) // Boss Rush
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14]) || // Boss Rush
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 16 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[16])) // Gun Game
|
||||
{
|
||||
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")
|
||||
MapName = name(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]);
|
||||
|
||||
if (MapName == MapBiolapse ||
|
||||
MapName == MapNightmare ||
|
||||
MapName == MapPowerCore ||
|
||||
MapName == MapDescent ||
|
||||
MapName == MapKrampus)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -2930,11 +2953,11 @@ function string GetNextMap()
|
||||
|
||||
/* Temporary removal of SteamFrotress for BossRush */
|
||||
if (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 14 || OutbreakEvent.ActiveEvent == OutbreakEvent.SetEvents[14] &&
|
||||
GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex] == "KF-SteamFortress")
|
||||
MapName == MapSteam)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
/**/
|
||||
/* */
|
||||
}
|
||||
|
||||
if ( IsMapAllowedInCycle(GameMapCycles[ActiveMapCycle].Maps[MapCycleIndex]) )
|
||||
@ -3781,14 +3804,22 @@ function UpdateCurrentMapVoteTime(byte NewTime, optional bool bStartTime);
|
||||
function float GetTraderTime()
|
||||
{
|
||||
local float MapOverride;
|
||||
local float TraderTimeModifier;
|
||||
|
||||
TraderTimeModifier = 1.f;
|
||||
|
||||
if (OutbreakEvent != none && OutbreakEvent.ActiveEvent.TraderTimeModifier != 1.f)
|
||||
{
|
||||
TraderTimeModifier = OutbreakEvent.ActiveEvent.TraderTimeModifier;
|
||||
}
|
||||
|
||||
MapOverride = DifficultyInfo.GetTraderTimeByMap(WorldInfo.GetMapName(true));
|
||||
if (MapOverride > 0.f)
|
||||
{
|
||||
return MapOverride;
|
||||
return MapOverride * TraderTimeModifier;
|
||||
}
|
||||
|
||||
return DifficultyInfo.GetTraderTimeByDifficulty();
|
||||
return DifficultyInfo.GetTraderTimeByDifficulty() * TraderTimeModifier;
|
||||
}
|
||||
|
||||
|
||||
|
@ -60,6 +60,7 @@ var repnotify bool bTraderIsOpen;
|
||||
var repnotify bool bWaveIsActive;
|
||||
var repnotify bool bWaveStarted;
|
||||
var bool bIsEndlessPaused;
|
||||
var bool bForceSkipTraderUI;
|
||||
|
||||
/** Replicates at beginning and end of waves to change track / track type */
|
||||
var repnotify byte MusicTrackRepCount;
|
||||
@ -107,6 +108,8 @@ var repnotify PerkAvailableData PerksAvailableData;
|
||||
var byte WaveMax; // The "end" wave
|
||||
var repnotify byte WaveNum; // The wave we are currently in
|
||||
var bool bWaveIsEndless;
|
||||
var repnotify byte GunGameWavesCurrent;
|
||||
var repnotify bool bWaveGunGameIsFinal;
|
||||
var int AIRemaining;
|
||||
var int WaveTotalAICount;
|
||||
var bool bEndlessMode;
|
||||
@ -358,6 +361,9 @@ var transient bool bIsBrokenTrader;
|
||||
************************************/
|
||||
var int CurrentWeeklyIndex;
|
||||
|
||||
/** If true, force show skip time between waves ready button */
|
||||
var bool bForceShowSkipTrader;
|
||||
|
||||
/************************************
|
||||
* Steam heartbeat
|
||||
************************************/
|
||||
@ -389,11 +395,12 @@ cpptext
|
||||
replication
|
||||
{
|
||||
if ( bNetDirty )
|
||||
TraderVolume, TraderVolumeCheckType, bTraderIsOpen, NextTrader, WaveNum, bWaveIsEndless, AIRemaining, WaveTotalAICount, bWaveIsActive, MaxHumanCount, bGlobalDamage,
|
||||
TraderVolume, TraderVolumeCheckType, bTraderIsOpen, NextTrader, WaveNum, bWaveIsEndless, GunGameWavesCurrent, bWaveGunGameIsFinal, AIRemaining, WaveTotalAICount, bWaveIsActive, MaxHumanCount, bGlobalDamage,
|
||||
CurrentObjective, PreviousObjective, PreviousObjectiveResult, PreviousObjectiveXPResult, PreviousObjectiveVoshResult, MusicIntensity, ReplicatedMusicTrackInfo, MusicTrackRepCount,
|
||||
bIsUnrankedGame, GameSharedUnlocks, bHidePawnIcons, ConsoleGameSessionGuid, GameDifficulty, GameDifficultyModifier, BossIndex, bWaveStarted, NextObjective, bIsBrokenTrader, bIsWeeklyMode, CurrentWeeklyIndex, bIsEndlessPaused; //@HSL - JRO - 3/21/2016 - PS4 Sessions
|
||||
bIsUnrankedGame, GameSharedUnlocks, bHidePawnIcons, ConsoleGameSessionGuid, GameDifficulty, GameDifficultyModifier, BossIndex, bWaveStarted, NextObjective, bIsBrokenTrader, bIsWeeklyMode,
|
||||
CurrentWeeklyIndex, bIsEndlessPaused, bForceSkipTraderUI; //@HSL - JRO - 3/21/2016 - PS4 Sessions
|
||||
if ( bNetInitial )
|
||||
GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled;
|
||||
GameLength, WaveMax, bCustom, bVersusGame, TraderItems, GameAmmoCostScale, bAllowGrenadePurchase, MaxPerkLevel, bTradersEnabled, bForceShowSkipTrader;
|
||||
if ( bNetInitial || bNetDirty )
|
||||
PerksAvailableData;
|
||||
if ( bNetInitial && Role == ROLE_Authority )
|
||||
@ -543,6 +550,14 @@ simulated event ReplicatedEvent(name VarName)
|
||||
{
|
||||
UpdatePerksAvailable();
|
||||
}
|
||||
else if (VarName == 'GunGameWavesCurrent')
|
||||
{
|
||||
UpdateHUDWaveCount();
|
||||
}
|
||||
else if (VarName == 'bWaveGunGameIsFinal')
|
||||
{
|
||||
UpdateHUDWaveCount();
|
||||
}
|
||||
else
|
||||
{
|
||||
super.ReplicatedEvent(VarName);
|
||||
@ -797,7 +812,7 @@ simulated function EndGame()
|
||||
bMatchHasBegun = false;
|
||||
bMatchIsOver = true;
|
||||
|
||||
class'KFGameEngine'.static.RefreshOnlineGameData(false);
|
||||
class'KFGameEngine'.static.RefreshOnlineGameData(true);
|
||||
}
|
||||
|
||||
/* Welcome screen shenanigans */
|
||||
@ -1111,6 +1126,7 @@ function SetWaveActive(bool bWaveActive, optional byte NewMusicIntensity)
|
||||
// set up music intensity for this wave
|
||||
MusicIntensity = NewMusicIntensity;
|
||||
bTraderIsOpen = !bWaveActive && bMatchHasBegun && bTradersEnabled;
|
||||
bForceSkipTraderUI = !bWaveActive && bMatchHasBegun && bForceShowSkipTrader;
|
||||
bWaveIsActive = bWaveActive;
|
||||
bForceNetUpdate = true;
|
||||
|
||||
@ -2029,6 +2045,9 @@ function int SetNextObjective(array<KFInterface_MapObjective> PossibleObjectives
|
||||
while (PossibleObjectives.Length > 0)
|
||||
{
|
||||
RandID = Rand(PossibleObjectives.Length);
|
||||
|
||||
if (PossibleObjectives[RandID].CanActivateObjectiveByWeekly())
|
||||
{
|
||||
PctChanceToActivate = PossibleObjectives[RandID].GetActivationPctChance();
|
||||
if (bForceNextObjective || (PossibleObjectives[RandID].CanActivateObjective() && PreviousObjective != PossibleObjectives[RandID] && (PctChanceToActivate >= 1.f || DieRoll <= PctChanceToActivate)))
|
||||
{
|
||||
@ -2044,6 +2063,7 @@ function int SetNextObjective(array<KFInterface_MapObjective> PossibleObjectives
|
||||
}
|
||||
return RandID;
|
||||
}
|
||||
}
|
||||
|
||||
PossibleObjectives.Remove(RandID, 1);
|
||||
}
|
||||
@ -2268,4 +2288,8 @@ defaultproperties
|
||||
PreviousObjectiveXPResult=-1
|
||||
bIsBrokenTrader=false
|
||||
bIsWeeklyMode=false
|
||||
bForceShowSkipTrader=false
|
||||
bForceSkipTraderUI=false
|
||||
GunGameWavesCurrent=1
|
||||
bWaveGunGameIsFinal=false
|
||||
}
|
||||
|
@ -204,7 +204,7 @@ static function class<KFGFxSpecialeventObjectivesContainer> GetSpecialEventClass
|
||||
case SEI_Spring:
|
||||
return class'KFGFxSpecialEventObjectivesContainer_Spring2021';
|
||||
case SEI_Summer:
|
||||
return class'KFGFxSpecialEventObjectivesContainer_Summer2021';
|
||||
return class'KFGFxSpecialEventObjectivesContainer_Summer2022';
|
||||
case SEI_Fall:
|
||||
return class'KFGFxSpecialEventObjectivesContainer_Fall2021';
|
||||
case SEI_Winter:
|
||||
|
@ -1866,7 +1866,7 @@ event bool FilterButtonInput(int ControllerId, name ButtonName, EInputEvent Inpu
|
||||
PartyWidget.ReadyButton.SetBool("selected", KFPRI.bReadyToPlay);
|
||||
|
||||
}
|
||||
else if(KFPRI.bHasSpawnedIn && !KFGRI.bMatchIsOver && KFGRI.bMatchHasBegun && KFGRI.bTraderIsOpen && CurrentMenu != TraderMenu && bMenusOpen)
|
||||
else if(KFPRI.bHasSpawnedIn && !KFGRI.bMatchIsOver && KFGRI.bMatchHasBegun && (KFGRI.bTraderIsOpen || KFGRI.bForceSkipTraderUI) && CurrentMenu != TraderMenu && bMenusOpen)
|
||||
{
|
||||
bForceCloseMenuNextTime = true;
|
||||
CurrentMenu.Callback_ReadyClicked(true);
|
||||
|
@ -234,7 +234,7 @@ function Callback_ReadyClicked( bool bReady )
|
||||
if (KFGRI.bMatchHasBegun)
|
||||
{
|
||||
//player has spawned, skip trader time
|
||||
if (KFGRI.bTraderIsOpen && KFPRI.bHasSpawnedIn)
|
||||
if ((KFGRI.bTraderIsOpen || KFGRI.bForceSkipTraderUI) && KFPRI.bHasSpawnedIn)
|
||||
{
|
||||
if (KFPC.MyGFxManager.bMenusOpen && KFPC.MyGFxManager.CurrentMenu != KFPC.MyGFxManager.TraderMenu)
|
||||
{
|
||||
@ -506,6 +506,26 @@ function Callback_ChatFocusOut()
|
||||
Manager.UpdateDynamicIgnoreKeys();
|
||||
}
|
||||
|
||||
function Callback_OnLoadoutPrevWeaponPressed()
|
||||
{
|
||||
Manager.PerksMenu.OnPrevWeaponPressed();
|
||||
}
|
||||
|
||||
function Callback_OnLoadoutNextWeaponPressed()
|
||||
{
|
||||
Manager.PerksMenu.OnNextWeaponPressed();
|
||||
}
|
||||
|
||||
function Callback_OnLoadoutPrevGrenadePressed()
|
||||
{
|
||||
Manager.PerksMenu.OnPrevGrenadePressed();
|
||||
}
|
||||
|
||||
function Callback_OnLoadoutNextGrenadePressed()
|
||||
{
|
||||
Manager.PerksMenu.OnNextGrenadePressed();
|
||||
}
|
||||
|
||||
/** RETURN TO THESE FUNCTIONS */
|
||||
|
||||
/************************************************************************
|
||||
|
@ -92,7 +92,7 @@ simulated function PlayImpactEffects(const vector HitLocation, const Pawn Effect
|
||||
}
|
||||
}
|
||||
|
||||
bIsWeaponHandlingEffects = KFPawn(EffectInstigator).MyKFWeapon.bForceHandleImpacts;
|
||||
bIsWeaponHandlingEffects = KFPawn(EffectInstigator).MyKFWeapon != none ? KFPawn(EffectInstigator).MyKFWeapon.bForceHandleImpacts : false;
|
||||
|
||||
// Trace using the Instigator as the TraceOwner so that melee weapons don't collide with Instigator
|
||||
HitActor = EffectInstigator.Trace(NewHitLoc, HitNormal, (HitLocation - (HitNormal * 32)), HitLocation + (HitNormal * 32), !bWorldImpactsOnly,, HitInfo, TRACEFLAG_Bullet);
|
||||
|
@ -11,6 +11,7 @@
|
||||
interface KFInterface_MapObjective;
|
||||
|
||||
// Status
|
||||
simulated function bool CanActivateObjectiveByWeekly();
|
||||
simulated function ActivateObjective();
|
||||
simulated function DeactivateObjective();
|
||||
simulated function GrantReward(KFPlayerReplicationInfo KFPRI, KFPlayerController KFPC);
|
||||
|
@ -495,6 +495,130 @@ function bool ClassNameIsInInventory(name ItemClassName, out Inventory out_Inven
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the best weapon for this Pawn in loadout
|
||||
*/
|
||||
simulated function Weapon GetBestWeapon( optional bool bForceADifferentWeapon, optional bool allow9mm )
|
||||
{
|
||||
local KFWeapon W, BestWeapon;
|
||||
local float Rating, BestRating;
|
||||
|
||||
ForEach InventoryActors( class'KFWeapon', W )
|
||||
{
|
||||
if( w.HasAnyAmmo() )
|
||||
{
|
||||
if( bForceADifferentWeapon &&
|
||||
W == Instigator.Weapon )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Rating = W.GetWeaponRating();
|
||||
if( BestWeapon == None ||
|
||||
Rating > BestRating )
|
||||
{
|
||||
if (allow9mm == false)
|
||||
{
|
||||
if (W.bIsBackupWeapon && !W.IsMeleeWeapon())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
BestWeapon = W;
|
||||
BestRating = Rating;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (BestWeapon == none && allow9mm == false)
|
||||
{
|
||||
ForEach InventoryActors( class'KFWeapon', W )
|
||||
{
|
||||
if( w.HasAnyAmmo() )
|
||||
{
|
||||
if( bForceADifferentWeapon &&
|
||||
W == Instigator.Weapon )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Rating = W.GetWeaponRating();
|
||||
if( BestWeapon == None ||
|
||||
Rating > BestRating )
|
||||
{
|
||||
BestWeapon = W;
|
||||
BestRating = Rating;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return BestWeapon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch to best weapon available in loadout
|
||||
* Network: LocalPlayer
|
||||
*/
|
||||
simulated function SwitchToBestWeapon( optional bool bForceADifferentWeapon, optional bool check_9mm_logic = false )
|
||||
{
|
||||
local Weapon BestWeapon;
|
||||
local PlayerController PC;
|
||||
local KFPlayerInput KFPI;
|
||||
local bool bCanSwapTo9mm;
|
||||
|
||||
if (check_9mm_logic)
|
||||
{
|
||||
// Default behaviour is you can't swap to 9mm
|
||||
bCanSwapTo9mm = false;
|
||||
|
||||
PC = PlayerController(Instigator.Controller);
|
||||
if ( PC != None )
|
||||
{
|
||||
KFPI = KFPlayerInput(PC.PlayerInput);
|
||||
if (KFPI != None)
|
||||
{
|
||||
bCanSwapTo9mm = KFPI.bAllowSwapTo9mm;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bCanSwapTo9mm = true;
|
||||
}
|
||||
|
||||
`LogInv("bForceADifferentWeapon:" @ bForceADifferentWeapon);
|
||||
|
||||
// if we don't already have a pending weapon,
|
||||
if( bForceADifferentWeapon ||
|
||||
PendingWeapon == None ||
|
||||
(AIController(Instigator.Controller) != None) )
|
||||
{
|
||||
// figure out the new weapon to bring up
|
||||
BestWeapon = GetBestWeapon( bForceADifferentWeapon, bCanSwapTo9mm );
|
||||
|
||||
if( BestWeapon == None )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// if it matches our current weapon then don't bother switching
|
||||
if( BestWeapon == Instigator.Weapon )
|
||||
{
|
||||
BestWeapon = None;
|
||||
PendingWeapon = None;
|
||||
Instigator.Weapon.Activate();
|
||||
}
|
||||
}
|
||||
|
||||
// stop any current weapon fire
|
||||
Instigator.Controller.StopFiring();
|
||||
|
||||
// and activate the new pending weapon
|
||||
SetCurrentWeapon(BestWeapon);
|
||||
}
|
||||
|
||||
/**
|
||||
* Switches to Previous weapon
|
||||
* Network: Client
|
||||
@ -943,7 +1067,7 @@ reliable client function SetCurrentWeapon(Weapon DesiredWeapon)
|
||||
local KFWeapon DesiredKFW;
|
||||
local KFWeapon PendingKFW;
|
||||
|
||||
CurrentKFW = KFWeapon(Instigator.Weapon);
|
||||
CurrentKFW = Instigator != none ? KFWeapon(Instigator.Weapon) : none;
|
||||
if ( CurrentKFW != none )
|
||||
{
|
||||
// Set the flag to switch to ironsights when the weapon is brought up
|
||||
@ -963,6 +1087,7 @@ reliable client function SetCurrentWeapon(Weapon DesiredWeapon)
|
||||
// Only change your weapon if it is different or we weant to equip the weapon we are currently putting down
|
||||
DesiredKFW = KFWeapon(DesiredWeapon);
|
||||
if( DesiredKFW != none &&
|
||||
Instigator != none &&
|
||||
(DesiredKFW != Instigator.Weapon || Instigator.Weapon.IsInState('WeaponPuttingDown')) )
|
||||
{
|
||||
if ( DesiredKFW.bHasIronSights )
|
||||
|
@ -63,6 +63,11 @@ simulated function PlayActivationSoundEvent()
|
||||
}
|
||||
}
|
||||
|
||||
simulated function bool CanActivateObjectiveByWeekly()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Status
|
||||
simulated function ActivateObjective()
|
||||
{
|
||||
|
@ -158,6 +158,11 @@ simulated function ActivateBoundarySplines()
|
||||
}
|
||||
}
|
||||
|
||||
simulated function bool CanActivateObjectiveByWeekly()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Status
|
||||
simulated function ActivateObjective()
|
||||
{
|
||||
|
@ -70,6 +70,7 @@ defaultproperties
|
||||
ColumnIds.Add(STATID_ACHIEVE_MoonbaseCollectibles)
|
||||
ColumnIds.Add(STATID_ACHIEVE_NetherholdCollectibles)
|
||||
ColumnIds.Add(STATID_ACHIEVE_CarillonHamletCollectibles)
|
||||
ColumnIds.Add(STATID_ACHIEVE_RigCollectibles)
|
||||
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky5, Name="AchievementMrPerky5"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky10, Name = "AchievementMrPerky10"))
|
||||
@ -124,8 +125,9 @@ defaultproperties
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_DesolationCollectibles,Name="AchievementCollectDesolation"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_HellmarkStationCollectibles,Name="AchievementCollectHellmarkStation"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_ElysiumEndlessWaveFifteen,Name="AchievementEndlessElysium"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_Dystopia2029Collectibles,NAme="AchievementCollectDystopia2029"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_MoonbaseCollectibles,NAme="AchievementCollectMoonbase"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_NetherholdCollectibles,NAme="AchievementCollectNetherhold"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_CarillonHamletCollectibles,NAme="AchievementCollectCarillonHamlet"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_Dystopia2029Collectibles,Name="AchievementCollectDystopia2029"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_MoonbaseCollectibles,Name="AchievementCollectMoonbase"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_NetherholdCollectibles,Name="AchievementCollectNetherhold"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_CarillonHamletCollectibles,Name="AchievementCollectCarillonHamlet"))
|
||||
ColumnMappings.Add((Id=STATID_ACHIEVE_RigCollectibles,Name="AchievementCollectRig"))
|
||||
}
|
||||
|
@ -441,6 +441,10 @@ const KFACHID_CarillonHamletHard = 289;
|
||||
const KFACHID_CarillonHamletHellOnEarth = 290;
|
||||
const KFACHID_CarillonHamletCollectibles = 291;
|
||||
|
||||
const KFACHID_RigHard = 292;
|
||||
const KFACHID_RigHellOnEarth = 293;
|
||||
const KFACHID_RigCollectibles = 294;
|
||||
|
||||
/* __TW_ANALYTICS_ */
|
||||
var int PerRoundWeldXP;
|
||||
var int PerRoundHealXP;
|
||||
@ -2078,6 +2082,7 @@ defaultproperties
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Thrown_C4, KFDT_Explosive_C4,KFDT_Bludgeon_C4),CompletionAmount=2500))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_GrenadeLauncher_M79, KFDT_Ballistic_M79Impact,KFDT_Explosive_M79,KFDT_Bludgeon_M79),CompletionAmount=7000))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_Boomy, KFDT_Ballistic_HRG_Boomy,KFDT_Explosive_HRG_Boomy,KFDT_Bludgeon_HRG_Boomy),CompletionAmount=7000))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_Crossboom, KFDT_Piercing_HRG_Crossboom,KFDT_Explosive_HRG_Crossboom,KFDT_Explosive_HRG_CrossboomAlt,KFDT_Bludgeon_HRG_Crossboom),CompletionAmount=7000))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_HRG_Kaboomstick, KFDT_Ballistic_HRG_Kaboomstick,KFDT_Explosive_HRG_Kaboomstick,KFDT_Bludgeon_HRG_Kaboomstick),CompletionAmount=9000))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_RocketLauncher_RPG7, KFDT_Ballistic_RPG7Impact,KFDT_Explosive_RPG7,KFDT_Explosive_RPG7BackBlast,KFDT_Bludgeon_RPG7),CompletionAmount=7500))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_AssaultRifle_M16M203, KFDT_Ballistic_M16M203,KFDT_Bludgeon_M16M203,KFDT_Ballistic_M203Impact,KFDT_Explosive_M16M203),CompletionAmount=9000)) //7000
|
||||
@ -2124,6 +2129,7 @@ defaultproperties
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Bow_Crossbow, KFDT_Bludgeon_Crossbow,KFDT_Piercing_Crossbow),CompletionAmount=7000)) //5000
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_M14EBR, KFDT_Bludgeon_M14EBR,KFDT_Ballistic_M14EBR),CompletionAmount=9000)) //7000
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_SonicGun, KFDT_Bludgeon_HRG_SonicGun, KFDT_Ballistic_HRG_SonicGun_SonicBlastUncharged, KFDT_Ballistic_HRG_SonicGun_SonicBlastHalfCharged, KFDT_Ballistic_HRG_SonicGun_SonicBlastFullyCharged),CompletionAmount=7000))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_CranialPopper, KFDT_Bludgeon_HRG_CranialPopper,KFDT_Piercing_HRG_CranialPopper,KFDT_Blast_HRG_CranialPopper),CompletionAmount=7000))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_RailGun, KFDT_Bludgeon_RailGun,KFDT_Ballistic_RailGun),CompletionAmount=5000))
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_CenterfireMB464, KFDT_Bludgeon_CenterfireMB464,KFDT_Ballistic_CenterfireMB464),CompletionAmount=7000)) //5000
|
||||
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_M99, KFDT_Bludgeon_M99,KFDT_Ballistic_M99),CompletionAmount=5000))
|
||||
@ -2277,6 +2283,9 @@ defaultproperties
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CARILLONHAMLET),CompletionAmount=1))
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CARILLONHAMLET),CompletionAmount=2))
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-CARILLONHAMLET),CompletionAmount=3))
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-RIG),CompletionAmount=1))
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-RIG),CompletionAmount=2))
|
||||
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-RIG),CompletionAmount=3))
|
||||
|
||||
//Versus Damage
|
||||
// Per design doc that I have right now, these are x class damage y players, not damage y amount
|
||||
|
@ -72,4 +72,5 @@ defaultproperties
|
||||
Properties.Add((PropertyId = STATID_ACHIEVE_MoonbaseCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
|
||||
Properties.Add((PropertyId = STATID_ACHIEVE_NetherholdCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
|
||||
Properties.Add((PropertyId = STATID_ACHIEVE_CarillonHamletCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
|
||||
Properties.Add((PropertyId = STATID_ACHIEVE_RigCollectibles, Data = (Type = SDT_Int32, Value1 = 0)))
|
||||
}
|
||||
|
@ -99,6 +99,10 @@ struct StatAdjustments
|
||||
/** WeakPoints to show special VFX*/
|
||||
var() array<WeakPoint> WeakPoints;
|
||||
|
||||
/** Score given when killed on GunGame weekly */
|
||||
var() byte GunGameKilledScore;
|
||||
var() byte GunGameAssistanceScore;
|
||||
|
||||
structdefaultproperties
|
||||
{
|
||||
HealthScale = 1.f;
|
||||
@ -118,6 +122,8 @@ struct StatAdjustments
|
||||
DoshGiven=INDEX_NONE
|
||||
|
||||
InitialGroundSpeedModifierScale = 1.0
|
||||
GunGameKilledScore = 0;
|
||||
GunGameAssistanceScore = 0;
|
||||
}
|
||||
};
|
||||
|
||||
@ -140,6 +146,24 @@ struct BossRushOverrides
|
||||
var() array <BossRushOverridesPerWave> PerWaves;
|
||||
};
|
||||
|
||||
struct GunGameLevel
|
||||
{
|
||||
var() int RequiredScore;
|
||||
var() array< class<KFWeaponDefinition> > GrantedWeapons;
|
||||
};
|
||||
|
||||
struct GunGameRespawnLevel
|
||||
{
|
||||
var() int Wave;
|
||||
var() int Level;
|
||||
};
|
||||
|
||||
struct GunGamePerkData
|
||||
{
|
||||
var() array<GunGameLevel> GunGameLevels;
|
||||
var() array<GunGameRespawnLevel> GunGameRespawnLevels;
|
||||
};
|
||||
|
||||
/** Individual property overrides that drive other behavior to allow for
|
||||
* a large amount of variety in our weekly event mode.
|
||||
*/
|
||||
@ -210,6 +234,9 @@ struct WeeklyOverrides
|
||||
/** Whether or not to skip opening of the trader */
|
||||
var() bool bDisableTraders;
|
||||
|
||||
/** Whether or not to force show skip trader button */
|
||||
var() bool bForceShowSkipTrader;
|
||||
|
||||
/** When to reset pickups */
|
||||
var() PickupResetTime PickupResetTime;
|
||||
|
||||
@ -394,6 +421,12 @@ struct WeeklyOverrides
|
||||
/** Global modifier of dosh received by players when a zed is killed. Default value is 1.0 */
|
||||
var() float DoshOnKillGlobalModifier;
|
||||
|
||||
/** Disable Add Dosh */
|
||||
var() bool bDisableAddDosh;
|
||||
|
||||
/** Disable Throw Weapon */
|
||||
var() bool bDisableThrowWeapon;
|
||||
|
||||
/** Delay After a wave starts for applying global damage. */
|
||||
var() float DamageDelayAfterWaveStarted;
|
||||
|
||||
@ -411,9 +444,24 @@ struct WeeklyOverrides
|
||||
|
||||
var() BossRushOverrides BossRushOverrideParams;
|
||||
|
||||
/** */
|
||||
var() bool bGunGameMode;
|
||||
|
||||
/** Information about each level in Gun Game Mode */
|
||||
var() GunGamePerkData GunGamePerksData;
|
||||
|
||||
/** Ignores damage caused by headshots. */
|
||||
var() bool bInvulnerableHeads;
|
||||
|
||||
/** Trade time override. */
|
||||
var() float TraderTimeModifier;
|
||||
|
||||
/** Time between waves override. */
|
||||
var() float TimeBetweenWaves;
|
||||
|
||||
/** Wether or not we only can spawn Armor on the Item pickups */
|
||||
var() bool bOnlyArmorItemPickup;
|
||||
|
||||
structdefaultproperties
|
||||
{
|
||||
GameLength = GL_Short
|
||||
@ -471,7 +519,14 @@ struct WeeklyOverrides
|
||||
DroppedItemLifespan=-1.0f
|
||||
bForceWWLMusic = false;
|
||||
bBossRushMode = false;
|
||||
bDisableAddDosh = false;
|
||||
bDisableThrowWeapon = false;
|
||||
bGunGameMode = false;
|
||||
bInvulnerableHeads = false;
|
||||
TraderTimeModifier = 1.f;
|
||||
TimeBetweenWaves = -1.f;
|
||||
bOnlyArmorItemPickup=false;
|
||||
bForceShowSkipTrader = false;
|
||||
}
|
||||
};
|
||||
|
||||
@ -485,12 +540,14 @@ struct CachedOutbreakInfo
|
||||
var float CachedWorldGravityZ;
|
||||
var float CachedGlobalGravityZ;
|
||||
var PerkAvailableData PerksAvailableData;
|
||||
var bool bForceShowSkipTrader;
|
||||
|
||||
structdefaultproperties
|
||||
{
|
||||
bTradersEnabled=true,
|
||||
bTradersEnabled=true
|
||||
bAllowGrenadePurchase=true
|
||||
GameAmmoCostScale=1.0
|
||||
bForceShowSkipTrader=false
|
||||
}
|
||||
};
|
||||
|
||||
@ -506,7 +563,7 @@ var WeeklyOverrides ActiveEvent;
|
||||
/** Stored values of World Info and GRI items incase we need to reset it. */
|
||||
var CachedOutbreakInfo CachedItems;
|
||||
|
||||
function SetActiveEvent(int ActiveEventIdx)
|
||||
function int SetActiveEvent(int ActiveEventIdx)
|
||||
{
|
||||
`if(`notdefined(ShippingPC))
|
||||
local string LocalURL;
|
||||
@ -537,6 +594,8 @@ function SetActiveEvent(int ActiveEventIdx)
|
||||
ActiveEvent = SetEvents[ActiveEventIdx];
|
||||
}
|
||||
`endif
|
||||
|
||||
return ActiveEventIdx;
|
||||
}
|
||||
|
||||
function ClearActiveEvent()
|
||||
@ -562,6 +621,7 @@ function ClearActiveEvent()
|
||||
KFGameReplicationInfo(GameReplicationInfo).bAllowGrenadePurchase = CachedItems.bAllowGrenadePurchase;
|
||||
KFGameReplicationInfo(GameReplicationInfo).bTradersEnabled = CachedItems.bTradersEnabled;
|
||||
KFGameReplicationInfo(GameReplicationInfo).MaxPerkLevel = CachedItems.MaxPerkLevel;
|
||||
KFGameReplicationInfo(GameReplicationInfo).bForceShowSkipTrader = CachedItems.bForceShowSkipTrader;
|
||||
}
|
||||
|
||||
ActiveEvent = EmptyEvent;
|
||||
@ -588,6 +648,7 @@ function CacheGRI()
|
||||
CachedItems.bAllowGrenadePurchase = KFGameReplicationInfo(GameReplicationInfo).bAllowGrenadePurchase;
|
||||
CachedItems.bTradersEnabled = KFGameReplicationInfo(GameReplicationInfo).bTradersEnabled;
|
||||
CachedItems.MaxPerkLevel = KFGameReplicationInfo(GameReplicationInfo).MaxPerkLevel;
|
||||
CachedItems.bForceShowSkipTrader = KFGameReplicationInfo(GameReplicationInfo).bForceShowSkipTrader;
|
||||
}
|
||||
}
|
||||
|
||||
@ -641,6 +702,7 @@ function UpdateGRI()
|
||||
KFGRI.bAllowGrenadePurchase = !ActiveEvent.bDisableGrenades;
|
||||
KFGRI.bTradersEnabled = !ActiveEvent.bDisableTraders;
|
||||
KFGRI.MaxPerkLevel = ActiveEvent.MaxPerkLevel;
|
||||
KFGRI.bForceShowSkipTrader = ActiveEvent.bForceShowSkipTrader;
|
||||
}
|
||||
}
|
||||
|
||||
@ -893,6 +955,9 @@ function AdjustDefaults(out KFPawn_Monster P, array <StatAdjustments> Adjustment
|
||||
P.HealByAssistance = ToAdjust.HealByAssistance;
|
||||
P.InitialGroundSpeedModifier *= ToAdjust.InitialGroundSpeedModifierScale;
|
||||
|
||||
P.GunGameKilledScore = ToAdjust.GunGameKilledScore;
|
||||
P.GunGameAssistanceScore = ToAdjust.GunGameAssistanceScore;
|
||||
|
||||
if (ToAdjust.bStartEnraged)
|
||||
{
|
||||
//If we aren't using the AI controller's spawn enrage, go into the pawn
|
||||
|
@ -880,6 +880,12 @@ var repnotify byte WeaponSpecialAction;
|
||||
********************************************************************************************* */
|
||||
var transient byte LastHitZoneIndex;
|
||||
|
||||
/**
|
||||
AutoTurret
|
||||
*/
|
||||
var const bool bIsTurret;
|
||||
|
||||
|
||||
replication
|
||||
{
|
||||
// Replicated to ALL
|
||||
@ -887,7 +893,7 @@ replication
|
||||
AmbientSound, WeaponClassForAttachmentTemplate, bIsSprinting, InjuredHitZones,
|
||||
KnockdownImpulse, ReplicatedSpecialMove, bEmpDisrupted, bEmpPanicked, bFirePanicked,
|
||||
RepFireBurnedAmount, bUnaffectedByZedTime, bMovesFastInZedTime, IntendedBodyScale,
|
||||
IntendedHeadScale, AttackSpeedModifier, bHasStartedFire, PowerUpAmbientSound;
|
||||
IntendedHeadScale, AttackSpeedModifier, bHasStartedFire, PowerUpAmbientSound, BodyScaleChangePerSecond;
|
||||
if ( bNetDirty && WorldInfo.TimeSeconds < LastTakeHitTimeout )
|
||||
HitFxInfo, HitFxRadialInfo, HitFxInstigator, HitFxAddedRelativeLocs, HitFxAddedHitCount;
|
||||
if ( Physics == PHYS_RigidBody && !bTearOff )
|
||||
@ -2696,6 +2702,7 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
|
||||
HitFxInfo.HitBoneIndex = HZI_HEAD;
|
||||
}
|
||||
`endif
|
||||
|
||||
// NVCHANGE_BEGIN - RLS - Debugging Effects
|
||||
bAllowHeadshot = CanCountHeadshots();
|
||||
OldHealth = Health;
|
||||
@ -2778,6 +2785,12 @@ function AdjustDamage(out int InDamage, out vector Momentum, Controller Instigat
|
||||
}
|
||||
|
||||
InstigatorMonster = InstigatedBy == none ? none : KFPawn_Monster(InstigatedBy.Pawn);
|
||||
|
||||
if (InDamage > 0 && InstigatedBy != none && InstigatedBy.Pawn.IsA('KFPawn_Human'))
|
||||
{
|
||||
InDamage = InDamage * AfflictionHandler.GetAfflictionDamageTakenModifier();
|
||||
}
|
||||
|
||||
if( InDamage > 0 && InstigatorMonster != None )
|
||||
{
|
||||
// Increase AI damage by AI Damage modifiers
|
||||
@ -5393,6 +5406,8 @@ simulated function StopExtraVFX(Name FXLabel)
|
||||
}
|
||||
}
|
||||
|
||||
simulated function SetTurretWeaponAttachment(class<KFWeapon> WeaponClass) {}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
InventoryManagerClass=class'KFInventoryManager'
|
||||
@ -5648,11 +5663,15 @@ defaultproperties
|
||||
// Visuals
|
||||
IntendedBodyScale=1.0
|
||||
CurrentBodyScale=1.0
|
||||
BodyScaleChangePerSecond=0.5
|
||||
BodyScaleChangePerSecond=0.5f
|
||||
IntendedHeadScale=1.0
|
||||
CurrentHeadScale=1.0
|
||||
bAllowDeathSM=true
|
||||
|
||||
bCanBePinned=false
|
||||
LastHitZoneIndex=0
|
||||
|
||||
// ---------------------------------------------
|
||||
// AutoTurret
|
||||
bIsTurret=false
|
||||
}
|
||||
|
@ -471,6 +471,14 @@ function AddDefaultInventory()
|
||||
DefaultInventory.AddItem(class<Inventory>(DynamicLoadObject("KFGameContent.KFInventory_Money", class'Class')));
|
||||
|
||||
Super.AddDefaultInventory();
|
||||
|
||||
if (GameInfo.OutbreakEvent != none && GameInfo.OutbreakEvent.ActiveEvent.bGunGameMode)
|
||||
{
|
||||
if (KFPlayerController_WeeklySurvival(Controller) != none)
|
||||
{
|
||||
KFPlayerController_WeeklySurvival(Controller).UpdateInitialHeldWeapon();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** When switching weapon modify GroundSpeed by encumbrance level */
|
||||
@ -491,6 +499,12 @@ simulated function bool CanThrowWeapon()
|
||||
{
|
||||
local KFPlayerController KFPC;
|
||||
|
||||
if (KFGameInfo(WorldInfo.Game).OutbreakEvent != none
|
||||
&& KFGameInfo(WorldInfo.Game).OutbreakEvent.ActiveEvent.bDisableThrowWeapon)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
KFPC = KFPlayerController(Controller);
|
||||
if (KFPC != none && KFPC.MyGFxManager != none && KFPC.MyGFxManager.TraderMenu != none && KFPC.MyGFxManager.CurrentMenu == KFPC.MyGFxManager.TraderMenu)
|
||||
{
|
||||
|
@ -95,6 +95,9 @@ var int HealByAssistance;
|
||||
/** WWL Hat attach name*/
|
||||
var name ZEDCowboyHatAttachName;
|
||||
|
||||
/** GunGameMode: score given when killed */
|
||||
var byte GunGameKilledScore;
|
||||
var byte GunGameAssistanceScore;
|
||||
|
||||
/**
|
||||
* Information on resistant or vulnerable damage types
|
||||
@ -568,6 +571,13 @@ var transient array<ParticleSystemComponent> WeakPointVFXComponents;
|
||||
var repnotify WeakPoint WeakPoints_TS[`TINY_SKULL_MAX_WEAKPOINTS];
|
||||
var ParticleSystem WeakPointParticleTemplate;
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name ShrinkRayGun
|
||||
********************************************************************************************* */
|
||||
|
||||
var bool bCanBeKilledByShrinking;
|
||||
var float ShrinkEffectModifier;
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Delegates
|
||||
********************************************************************************************* */
|
||||
@ -2050,6 +2060,7 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
|
||||
local KFAIController KFAIC;
|
||||
local KFPawn_Monster KFPM;
|
||||
local float NapalmCheckDist;
|
||||
local float InfernoRadius;
|
||||
|
||||
AIMonster = KFAIController_Monster(InstigatedBy);
|
||||
KFDT = class<KFDamageType>(DamageType);
|
||||
@ -2098,9 +2109,9 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
|
||||
&& DamageCauser != none
|
||||
&& KFDT != none
|
||||
&& KFDT.default.DoT_Type == DOT_Fire
|
||||
&& KFDT != class'KFDT_Fire_Napalm'
|
||||
&& WorldInfo.RealTimeSeconds - LastNapalmInfectCheckTime > 0.25f )
|
||||
&& KFDT != class'KFDT_Fire_Napalm')
|
||||
{
|
||||
|
||||
if( KFPC != none
|
||||
&& KFPC.GetPerk() != none
|
||||
&& KFPC.GetPerk().CanSpreadNapalm()
|
||||
@ -2130,6 +2141,29 @@ event TakeDamage(int Damage, Controller InstigatedBy, vector HitLocation, vector
|
||||
}
|
||||
}
|
||||
|
||||
if( Damage > 0
|
||||
&& InstigatedBy != none
|
||||
&& KFDT != none
|
||||
&& KFDT.default.DoT_Type == DOT_Fire
|
||||
&& KFDT != class'KFDT_Fire_Napalm'
|
||||
&& KFPC != none
|
||||
&& KFPC.GetPerk() != none
|
||||
&& KFPC.GetPerk().CanSpreadInferno()
|
||||
&& class'KFPerk'.static.IsDamageTypeOnThisPerk(KFDT, class'KFPerk_Firebug') )
|
||||
{
|
||||
|
||||
InfernoRadius = CylinderComponent.CollisionRadius + class'KFPerk_Firebug'.static.GetInfernoRadius();
|
||||
|
||||
//PawnOwner.DrawDebugSphere(PawnOwner.Location, InfernoRadius, 20, 255, 255, 0, true);
|
||||
|
||||
foreach CollidingActors(class'KFPawn_Monster', KFPM, InfernoRadius, Location, true,,)
|
||||
{
|
||||
KFPM.ApplyDamageOverTime(Damage,
|
||||
KFPC,
|
||||
KFDT);
|
||||
}
|
||||
}
|
||||
|
||||
KFPRI = KFPlayerReplicationInfo( PlayerReplicationInfo );
|
||||
if( KFPRI != none )
|
||||
{
|
||||
@ -4907,7 +4941,8 @@ DefaultProperties
|
||||
IncapSettings(AF_Microwave)=(Cooldown=5.0, Duration=5.0,)
|
||||
IncapSettings(AF_Freeze)=(Cooldown=5.0)
|
||||
IncapSettings(AF_Snare)=(Cooldown=5.0, Duration=5.0,)
|
||||
|
||||
IncapSettings(AF_BigHead)=(Cooldown=0.0, Duration=10.0)
|
||||
IncapSettings(AF_Shrink)=(Cooldown=0.0, Duration=10.0)
|
||||
// ---------------------------------------------
|
||||
// Movement / Physics
|
||||
bCanCrouch=false
|
||||
@ -5052,4 +5087,10 @@ DefaultProperties
|
||||
ZEDCowboyHatAttachName=HEAD_Attach
|
||||
|
||||
WeakPointParticleTemplate=ParticleSystem'FX_Gameplay_EMIT.FX_Weak_Indicator'
|
||||
|
||||
GunGameKilledScore=0
|
||||
GunGameAssistanceScore=0
|
||||
|
||||
bCanBeKilledByShrinking=true
|
||||
ShrinkEffectModifier=1.0f
|
||||
}
|
||||
|
@ -445,4 +445,6 @@ defaultproperties
|
||||
bCanBePinned=false
|
||||
|
||||
VortexAttracionModifier=0.3f
|
||||
|
||||
bCanBeKilledByShrinking=false
|
||||
}
|
@ -461,6 +461,39 @@ static function bool IsBackupWeapon( KFWeapon KFW )
|
||||
return KFW != none && KFW.default.bIsBackupWeapon;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return if a weapon is a knife
|
||||
*
|
||||
* @param KFW Weapon to check
|
||||
* @return true if knife weapon
|
||||
*/
|
||||
static simulated public function bool IsKnife( KFWeapon KFW )
|
||||
{
|
||||
return KFW != none && KFW.default.bIsBackupWeapon && KFW.IsMeleeWeapon();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return if a weapon is a welder
|
||||
*
|
||||
* @param KFW Weapon to check
|
||||
* @return true if knife weapon
|
||||
*/
|
||||
static simulated public function bool IsWelder( KFWeapon KFW )
|
||||
{
|
||||
return KFW != none && KFW.Class.Name == 'KFWeap_Welder';
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return if a weapon is the syringe
|
||||
*
|
||||
* @param KFW Weapon to check
|
||||
* @return true if syringe weapon
|
||||
*/
|
||||
static simulated public function bool IsSyringe( KFWeapon KFW )
|
||||
{
|
||||
return KFW != none && KFW.Class.Name == 'KFWeap_Healer_Syringe';
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return if a weapon is Dual 9mm
|
||||
*
|
||||
@ -505,6 +538,29 @@ static function bool IsDoshinegun( KFWeapon KFW )
|
||||
return KFW != none && KFW.Class.Name == 'KFWeap_AssaultRifle_Doshinegun';
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return if a weapon is Crossboom (special case for high rounds perk)
|
||||
*
|
||||
* @param KFW Weapon to check
|
||||
* @return true if backup weapon
|
||||
*/
|
||||
static function bool IsHRGCrossboom( KFWeapon KFW )
|
||||
{
|
||||
return KFW != none && KFW.Class.Name == 'KFWeap_HRG_Crossboom';
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return if a weapon is AutoTurret (should ignore ammo upgrades)
|
||||
*
|
||||
* @param KFW Weapon to check
|
||||
* @return true if backup weapon
|
||||
*/
|
||||
static function bool IsAutoTurret( KFWeapon KFW )
|
||||
{
|
||||
return KFW != none && KFW.Class.Name == 'KFWeap_AutoTurret';
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Build / Level Management - Apply and save the updated build and level
|
||||
********************************************************************************************* */
|
||||
@ -789,7 +845,7 @@ simulated final function int GetSavedBuild()
|
||||
simulated event PreBeginPlay()
|
||||
{
|
||||
// Set the grenade class for this perk
|
||||
GrenadeClass = class<KFProj_Grenade>(DynamicLoadObject(GrenadeWeaponDef.default.WeaponClassPath, class'Class'));
|
||||
GrenadeClass = class<KFProj_Grenade>(DynamicLoadObject(GetGrenadeClassPath(), class'Class'));
|
||||
PerkIcon = Texture2D(DynamicLoadObject(GetPerkIconPath(), class'Texture2D'));
|
||||
|
||||
MyKFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
@ -1020,6 +1076,12 @@ simulated function string GetKnifeWeaponClassPath()
|
||||
return KnifeWeaponDef.default.WeaponClassPath;
|
||||
}
|
||||
|
||||
/* Returns the primary weapon's class path for this perk */
|
||||
simulated function string GetGrenadeClassPath()
|
||||
{
|
||||
return GrenadeWeaponDef.default.WeaponClassPath;
|
||||
}
|
||||
|
||||
simulated function bool PerkNeedsTick(){ return false; }
|
||||
|
||||
/**
|
||||
@ -1208,6 +1270,7 @@ simulated function bool IsFlarotovActive(){ return false; }
|
||||
function float GetDoTScalerAdditions(class<KFDamageType> KFDT);
|
||||
function bool GetFireStumble( optional KFPawn KFP, optional class<DamageType> DamageType ){ return false; }
|
||||
function bool CanSpreadNapalm(){ return false; }
|
||||
function bool CanSpreadInferno(){ return false; }
|
||||
function bool CouldBeZedShrapnel( class<KFDamageType> KFDT ){ return false; }
|
||||
simulated function bool ShouldShrapnel(){ return false; }
|
||||
simulated function float GetSplashDamageModifier(){ return 1.f; }
|
||||
@ -1293,6 +1356,11 @@ function OnWaveEnded();
|
||||
|
||||
function OnWaveStart();
|
||||
|
||||
/**
|
||||
* Notifications for Wave start / end but on client
|
||||
*/
|
||||
simulated function OnClientWaveEnded();
|
||||
|
||||
simulated function bool GetUsingTactialReload( KFWeapon KFW )
|
||||
{
|
||||
return false;
|
||||
@ -1493,6 +1561,46 @@ simulated function FormatPerkSkills()
|
||||
|
||||
simulated function PlayerDied(){}
|
||||
|
||||
static simulated function bool CanChoosePrimaryWeapon()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static simulated function bool CanChooseGrenade()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
simulated function byte OnPrevWeaponSelected() { return 255; }
|
||||
simulated function byte OnNextWeaponSelected() { return 255; }
|
||||
simulated function byte OnPrevGrenadeSelected() { return 255; }
|
||||
simulated function byte OnNextGrenadeSelected() { return 255; }
|
||||
simulated function byte SetWeaponSelectedIndex(byte idx);
|
||||
simulated function byte SetGrenadeSelectedIndex(byte idx);
|
||||
simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext);
|
||||
simulated function byte GetGrenadeSelectedIndex() { return 255;}
|
||||
simulated function InitializeGrenades();
|
||||
|
||||
static simulated function string GetPrimaryWeaponName(byte Idx)
|
||||
{
|
||||
return default.PrimaryWeaponDef.static.GetItemName();
|
||||
}
|
||||
|
||||
static simulated function string GetPrimaryWeaponImagePath(byte Idx)
|
||||
{
|
||||
return default.PrimaryWeaponDef.static.GetImagePath();
|
||||
}
|
||||
|
||||
static simulated function string GetGrenadeWeaponName(byte Idx)
|
||||
{
|
||||
return default.GrenadeWeaponDef.static.GetItemName();
|
||||
}
|
||||
|
||||
static simulated function string GetGrenadeWeaponImagePath(byte Idx)
|
||||
{
|
||||
return default.GrenadeWeaponDef.static.GetImagePath();
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
bTickIsDisabled=TRUE
|
||||
|
@ -251,7 +251,8 @@ simulated function ModifyMagSizeAndNumber( KFWeapon KFW, out int MagazineCapacit
|
||||
TempCapacity = MagazineCapacity;
|
||||
|
||||
// FAMAS needs its secondary ammo affected
|
||||
if( (!bSecondary || IsFAMAS(KFW)) && IsWeaponOnPerk( KFW, WeaponPerkClass, self.class ) && (KFW == none || !KFW.bNoMagazine) )
|
||||
// Autoturret cannot modify its magazine capacity
|
||||
if( (!bSecondary || IsFAMAS(KFW)) && !IsAutoTurret(KFW) && IsWeaponOnPerk( KFW, WeaponPerkClass, self.class ) && (KFW == none || !KFW.bNoMagazine) )
|
||||
{
|
||||
if( IsLargeMagActive() )
|
||||
{
|
||||
@ -264,6 +265,7 @@ simulated function ModifyMagSizeAndNumber( KFWeapon KFW, out int MagazineCapacit
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MagazineCapacity = Round(TempCapacity);
|
||||
}
|
||||
|
||||
|
@ -126,6 +126,7 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
|
||||
{
|
||||
local KFWeapon KFW;
|
||||
local float TempDamage;
|
||||
local bool bIsCrossboom;
|
||||
|
||||
if( DamageType != none && IsDamageIgnoredDT( DamageType ) )
|
||||
{
|
||||
@ -140,7 +141,9 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
|
||||
KFW = GetWeaponFromDamageCauser( DamageCauser );
|
||||
}
|
||||
|
||||
if( (KFW != none && IsWeaponOnPerk( KFW,, self.class )) || (DamageType != none && IsDamageTypeOnPerk( DamageType )) )
|
||||
bIsCrossboom = IsHRGCrossboom(KFW);
|
||||
|
||||
if( (KFW != none && (IsWeaponOnPerk( KFW,, self.class )) || bIsCrossboom) || (DamageType != none && IsDamageTypeOnPerk( DamageType )) )
|
||||
{
|
||||
`QALog( "Base Damage Given" @ DamageType @ KFW @ InDamage, bLogPerk );
|
||||
//Passive
|
||||
@ -153,9 +156,9 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
|
||||
`QALog( "Bombadier Given" @ DamageType @ KFW @ InDamage * GetSkillValue( PerkSkills[EDemoDamage] ), bLogPerk );
|
||||
}
|
||||
|
||||
if( IsDirectHitActive() && DamageType != none && IsDamageTypeOnPerk( DamageType ) )
|
||||
if( IsDirectHitActive() && ((DamageType != none && IsDamageTypeOnPerk( DamageType )) || bIsCrossboom ))
|
||||
{
|
||||
if( class<KFDT_Ballistic_Shell>(DamageType) != none || class<KFDT_Bludgeon>(DamageType)!=none)
|
||||
if( class<KFDT_Ballistic_Shell>(DamageType) != none || class<KFDT_Bludgeon>(DamageType)!=none || (bIsCrossboom && class<KFDT_Piercing>(DamageType) != none))
|
||||
{
|
||||
TempDamage += InDamage * GetSkillValue( PerkSkills[EDemoDirectHit] );
|
||||
`QALog( "High Impact Damage Given" @ DamageType @ KFW @ InDamage * GetSkillValue( PerkSkills[EDemoDirectHit] ), bLogPerk );
|
||||
|
@ -32,7 +32,8 @@ var private const class<DamageType> SnareCausingDmgTypeClass;
|
||||
var private const int NapalmDamage;
|
||||
/** Multiplier on CylinderComponent.CollisionRadius to check for infecting other zeds */
|
||||
var private const float NapalmCheckCollisionScale;
|
||||
|
||||
// Radius in cm to check for, this is added to CylinderComponent.CollisionRadius
|
||||
var private const float InfernoRadius;
|
||||
|
||||
enum EFirebugSkills
|
||||
{
|
||||
@ -294,11 +295,21 @@ function bool CanSpreadNapalm()
|
||||
return IsNapalmActive();
|
||||
}
|
||||
|
||||
function bool CanSpreadInferno()
|
||||
{
|
||||
return IsInfernoActive();
|
||||
}
|
||||
|
||||
static final function float GetNapalmCheckCollisionScale()
|
||||
{
|
||||
return default.NapalmCheckCollisionScale;
|
||||
}
|
||||
|
||||
static final function float GetInfernoRadius()
|
||||
{
|
||||
return default.InfernoRadius;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Checks if a zed could potentially explode later
|
||||
*
|
||||
@ -634,6 +645,7 @@ DefaultProperties
|
||||
|
||||
NapalmDamage=7 //50
|
||||
NapalmCheckCollisionScale=2.0f //6.0
|
||||
InfernoRadius=800.0f
|
||||
|
||||
ShrapnelChance=0.3f //0.2
|
||||
|
||||
|
@ -806,7 +806,7 @@ simulated function bool ShouldDisableZedTimeSkillsForWildWest()
|
||||
{
|
||||
if (WorldInfo.NetMode == NM_Client)
|
||||
{
|
||||
return MyKFGRI.bIsWeeklyMode && class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12;
|
||||
return MyKFGRI.bIsWeeklyMode && MyKFGRI.CurrentWeeklyIndex == 12;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -696,7 +696,7 @@ function bool ShouldDisableZedTimeSkillsForWildWest()
|
||||
{
|
||||
if (WorldInfo.NetMode == NM_Client)
|
||||
{
|
||||
return MyKFGRI.bIsWeeklyMode && class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12;
|
||||
return MyKFGRI.bIsWeeklyMode && MyKFGRI.CurrentWeeklyIndex == 12;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -708,7 +708,7 @@ simulated function bool IsFanfareActiveForWildWest()
|
||||
{
|
||||
if (WorldInfo.NetMode == NM_Client)
|
||||
{
|
||||
return MyKFGRI.bIsWeeklyMode && class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12;
|
||||
return MyKFGRI.bIsWeeklyMode && MyKFGRI.CurrentWeeklyIndex == 12;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -423,7 +423,7 @@ simulated function Interact( KFPawn_Human KFPH )
|
||||
{
|
||||
foreach KFPH.InvManager.InventoryActors( class'KFWeapon', KFW )
|
||||
{
|
||||
if( KFW.static.DenyPerkResupply() )
|
||||
if( KFW.DenyPerkResupply() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -47,14 +47,24 @@ var class<KFWeaponDefinition> HealingGrenadeWeaponDef;
|
||||
var class<KFWeaponDefinition> MolotovGrenadeWeaponDef;
|
||||
|
||||
var private const array<class<KFWeaponDefinition> > PrimaryWeaponPaths;
|
||||
var private const array<class<KFWeaponDefinition> > GrenadeWeaponPaths;
|
||||
var private const array<string> KnifeWeaponPaths;
|
||||
var int StartingWeaponClassIndex;
|
||||
var byte StartingWeaponClassIndex;
|
||||
var byte StartingGrenadeClassIndex; // This is the cached value for the tentative Grenade selection (only applied when gameplay time)
|
||||
var byte CurrentGrenadeClassIndex; // This is the gameplay value we use for Grenade Index, it can only be changed while TraderTime / Wave Start / Wave Ended
|
||||
|
||||
var private const array<name> TacticalReloadAsReloadRateClassNames;
|
||||
|
||||
/** When MakeThingsGoBoom skill is selected the survivalist gets additional explosive resistance */
|
||||
var private const float MakeThingsGoBoomExplosiveResistance;
|
||||
|
||||
var private const byte MedicGrenadeIndex;
|
||||
var private const byte FirebugGrenadeIndex;
|
||||
|
||||
var private transient bool bIsGrenadeDirty;
|
||||
|
||||
`define WEAP_IDX_NONE 255
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Perk init and spawning
|
||||
******************************************************************************************** */
|
||||
@ -105,7 +115,11 @@ function bool ShouldGetAllTheXP()
|
||||
/* Returns the primary weapon's class path for this perk */
|
||||
simulated function string GetPrimaryWeaponClassPath()
|
||||
{
|
||||
if (StartingWeaponClassIndex == `WEAP_IDX_NONE)
|
||||
{
|
||||
StartingWeaponClassIndex = Rand(PrimaryWeaponPaths.length);
|
||||
}
|
||||
|
||||
AutoBuyLoadOutPath.InsertItem(0,PrimaryWeaponPaths[StartingWeaponClassIndex]);
|
||||
return PrimaryWeaponPaths[StartingWeaponClassIndex].default.WeaponClassPath;
|
||||
}
|
||||
@ -556,16 +570,7 @@ simulated function float GetSnarePowerModifier( optional class<DamageType> Damag
|
||||
/* Returns the grenade class for this perk */
|
||||
simulated function class< KFProj_Grenade > GetGrenadeClass()
|
||||
{
|
||||
if( IsAmmoVestActive() )
|
||||
{
|
||||
return class<KFProj_Grenade>(DynamicLoadObject(HealingGrenadeWeaponDef.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
else if( IsBigPocketsActive() )
|
||||
{
|
||||
return class<KFProj_Grenade>(DynamicLoadObject(MolotovGrenadeWeaponDef.default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
|
||||
return GrenadeClass;
|
||||
return class<KFProj_Grenade>(DynamicLoadObject(GrenadeWeaponPaths[CurrentGrenadeClassIndex].default.WeaponClassPath, class'Class'));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -744,41 +749,379 @@ simulated static function GetPassiveStrings( out array<string> PassiveValues, ou
|
||||
|
||||
simulated function string GetGrenadeImagePath()
|
||||
{
|
||||
if( IsAmmoVestActive() )
|
||||
{
|
||||
return default.HealingGrenadeWeaponDef.Static.GetImagePath();
|
||||
}
|
||||
else if( IsBigPocketsActive() )
|
||||
{
|
||||
return default.MolotovGrenadeWeaponDef.Static.GetImagePath();
|
||||
}
|
||||
|
||||
return default.GrenadeWeaponDef.Static.GetImagePath();
|
||||
return CurrentGrenadeClassIndex == `WEAP_IDX_NONE ? default.GrenadeWeaponDef.static.GetImagePath() : default.GrenadeWeaponPaths[CurrentGrenadeClassIndex].static.GetImagePath();
|
||||
}
|
||||
|
||||
|
||||
simulated function class<KFWeaponDefinition> GetGrenadeWeaponDef()
|
||||
{
|
||||
if( IsAmmoVestActive() )
|
||||
return GrenadeWeaponPaths[CurrentGrenadeClassIndex];
|
||||
}
|
||||
|
||||
static simulated function bool CanChoosePrimaryWeapon()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static simulated function bool CanChooseGrenade()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
simulated function byte OnPrevWeaponSelected()
|
||||
{
|
||||
if (StartingWeaponClassIndex == `WEAP_IDX_NONE)
|
||||
{
|
||||
return default.HealingGrenadeWeaponDef;
|
||||
StartingWeaponClassIndex = PrimaryWeaponPaths.Length - 1;
|
||||
}
|
||||
else if( IsBigPocketsActive() )
|
||||
else if (StartingWeaponClassIndex == 0)
|
||||
{
|
||||
return default.MolotovGrenadeWeaponDef;
|
||||
StartingWeaponClassIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
--StartingWeaponClassIndex;
|
||||
}
|
||||
|
||||
return default.GrenadeWeaponDef;
|
||||
return StartingWeaponClassIndex;
|
||||
}
|
||||
|
||||
simulated function byte OnNextWeaponSelected()
|
||||
{
|
||||
if (StartingWeaponClassIndex == `WEAP_IDX_NONE)
|
||||
{
|
||||
StartingWeaponClassIndex = 0;
|
||||
}
|
||||
else if (StartingWeaponClassIndex == PrimaryWeaponPaths.Length - 1)
|
||||
{
|
||||
StartingWeaponClassIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
++StartingWeaponClassIndex;
|
||||
}
|
||||
|
||||
return StartingWeaponClassIndex;
|
||||
}
|
||||
|
||||
simulated function byte OnPrevGrenadeSelected()
|
||||
{
|
||||
if (StartingGrenadeClassIndex == `WEAP_IDX_NONE)
|
||||
{
|
||||
StartingGrenadeClassIndex = GrenadeWeaponPaths.Length - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
--StartingGrenadeClassIndex;
|
||||
|
||||
if (StartingGrenadeClassIndex == FirebugGrenadeIndex && !IsBigPocketsActive())
|
||||
{
|
||||
--StartingGrenadeClassIndex;
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex == MedicGrenadeIndex && !IsAmmoVestActive())
|
||||
{
|
||||
--StartingGrenadeClassIndex;
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex > GrenadeWeaponPaths.Length - 1)
|
||||
{
|
||||
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
bIsGrenadeDirty=true;
|
||||
|
||||
return StartingGrenadeClassIndex;
|
||||
}
|
||||
|
||||
simulated function byte OnNextGrenadeSelected()
|
||||
{
|
||||
if (StartingGrenadeClassIndex == `WEAP_IDX_NONE)
|
||||
{
|
||||
StartingGrenadeClassIndex = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
++StartingGrenadeClassIndex;
|
||||
|
||||
if (StartingGrenadeClassIndex == MedicGrenadeIndex && !IsAmmoVestActive())
|
||||
{
|
||||
++StartingGrenadeClassIndex;
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex == FirebugGrenadeIndex && !IsBigPocketsActive())
|
||||
{
|
||||
++StartingGrenadeClassIndex;
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex > GrenadeWeaponPaths.Length - 1)
|
||||
{
|
||||
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
bIsGrenadeDirty=true;
|
||||
|
||||
return StartingGrenadeClassIndex;
|
||||
}
|
||||
|
||||
static simulated function string GetPrimaryWeaponName(byte Idx)
|
||||
{
|
||||
return Idx == `WEAP_IDX_NONE ? default.PrimaryWeaponDef.static.GetItemName() : default.PrimaryWeaponPaths[Idx].static.GetItemName();
|
||||
}
|
||||
|
||||
static simulated function string GetPrimaryWeaponImagePath(byte Idx)
|
||||
{
|
||||
return Idx == `WEAP_IDX_NONE ? default.PrimaryWeaponDef.static.GetImagePath() : default.PrimaryWeaponPaths[Idx].static.GetImagePath();
|
||||
}
|
||||
|
||||
static simulated function string GetGrenadeWeaponName(byte Idx)
|
||||
{
|
||||
return Idx == `WEAP_IDX_NONE ? default.GrenadeWeaponDef.static.GetItemName() : default.GrenadeWeaponPaths[Idx].static.GetItemName();
|
||||
}
|
||||
|
||||
static simulated function string GetGrenadeWeaponImagePath(byte Idx)
|
||||
{
|
||||
return Idx == `WEAP_IDX_NONE ? default.GrenadeWeaponDef.static.GetImagePath() : default.GrenadeWeaponPaths[Idx].static.GetImagePath();
|
||||
}
|
||||
|
||||
/* Returns the primary weapon's class path for this perk */
|
||||
simulated function string GetGrenadeClassPath()
|
||||
{
|
||||
return GrenadeWeaponPaths[StartingGrenadeClassIndex].default.WeaponClassPath;
|
||||
}
|
||||
|
||||
simulated function byte GetGrenadeSelectedIndex() { return CurrentGrenadeClassIndex; }
|
||||
|
||||
simulated function byte SetWeaponSelectedIndex(byte idx)
|
||||
{
|
||||
if (idx >= default.PrimaryWeaponPaths.Length && idx < 255)
|
||||
{
|
||||
StartingWeaponClassIndex = 0;
|
||||
}
|
||||
else if (idx == 255)
|
||||
{
|
||||
StartingWeaponClassIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartingWeaponClassIndex = idx;
|
||||
}
|
||||
|
||||
ServerUpdateCurrentWeapon(StartingWeaponClassIndex);
|
||||
|
||||
return StartingWeaponClassIndex;
|
||||
}
|
||||
|
||||
simulated function byte SetGrenadeSelectedIndex(byte idx)
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
|
||||
if (idx >= default.GrenadeWeaponPaths.Length && idx < 255)
|
||||
{
|
||||
StartingGrenadeClassIndex = 0;
|
||||
}
|
||||
else if (idx == 255)
|
||||
{
|
||||
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartingGrenadeClassIndex = idx;
|
||||
|
||||
if (StartingGrenadeClassIndex == MedicGrenadeIndex || StartingGrenadeClassIndex == FirebugGrenadeIndex)
|
||||
{
|
||||
if (IsAmmoVestActive())
|
||||
{
|
||||
StartingGrenadeClassIndex = MedicGrenadeIndex;
|
||||
}
|
||||
else if (IsBigPocketsActive())
|
||||
{
|
||||
StartingGrenadeClassIndex = FirebugGrenadeIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartingGrenadeClassIndex = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we are in no gameplay time insta change
|
||||
if (!KFGRI.bWaveIsActive)
|
||||
{
|
||||
UpdateCurrentGrenade();
|
||||
}
|
||||
|
||||
return StartingGrenadeClassIndex;
|
||||
}
|
||||
|
||||
simulated function byte SetGrenadeSelectedIndexUsingSkills(byte idx, byte InSelectedSkills[`MAX_PERK_SKILLS], bool IsChoosingPrev, bool IsChoosingNext)
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
local bool AmmoVestActive, BigPocketsActive;
|
||||
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
|
||||
AmmoVestActive = false;
|
||||
BigPocketsActive = false;
|
||||
|
||||
if (idx >= default.GrenadeWeaponPaths.Length && idx < 255)
|
||||
{
|
||||
StartingGrenadeClassIndex = 0;
|
||||
}
|
||||
else if (idx == 255)
|
||||
{
|
||||
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartingGrenadeClassIndex = idx;
|
||||
|
||||
if (StartingGrenadeClassIndex == MedicGrenadeIndex || StartingGrenadeClassIndex == FirebugGrenadeIndex)
|
||||
{
|
||||
AmmoVestActive = InSelectedSkills[2] == 1;
|
||||
BigPocketsActive = InSelectedSkills[2] == 2;
|
||||
|
||||
if (IsChoosingPrev)
|
||||
{
|
||||
if (StartingGrenadeClassIndex == FirebugGrenadeIndex)
|
||||
{
|
||||
if (BigPocketsActive == false)
|
||||
{
|
||||
--StartingGrenadeClassIndex;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex == MedicGrenadeIndex)
|
||||
{
|
||||
if (AmmoVestActive == false)
|
||||
{
|
||||
--StartingGrenadeClassIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (IsChoosingNext)
|
||||
{
|
||||
if (StartingGrenadeClassIndex == MedicGrenadeIndex)
|
||||
{
|
||||
if (AmmoVestActive == false)
|
||||
{
|
||||
++StartingGrenadeClassIndex;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex == FirebugGrenadeIndex)
|
||||
{
|
||||
if (BigPocketsActive == false)
|
||||
{
|
||||
++StartingGrenadeClassIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AmmoVestActive)
|
||||
{
|
||||
StartingGrenadeClassIndex = MedicGrenadeIndex;
|
||||
}
|
||||
else if (BigPocketsActive)
|
||||
{
|
||||
StartingGrenadeClassIndex = FirebugGrenadeIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartingGrenadeClassIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingGrenadeClassIndex > GrenadeWeaponPaths.Length - 1)
|
||||
{
|
||||
StartingGrenadeClassIndex = `WEAP_IDX_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we are in no gameplay time insta change
|
||||
if (!KFGRI.bWaveIsActive)
|
||||
{
|
||||
UpdateCurrentGrenade();
|
||||
}
|
||||
|
||||
return StartingGrenadeClassIndex;
|
||||
}
|
||||
|
||||
simulated function InitializeGrenades()
|
||||
{
|
||||
local byte MaxValue;
|
||||
|
||||
if (StartingGrenadeClassIndex == `WEAP_IDX_NONE && ( bIsGrenadeDirty || CurrentGrenadeClassIndex == `WEAP_IDX_NONE))
|
||||
{
|
||||
MaxValue = (!IsAmmoVestActive() && !IsBigPocketsActive()) ? GrenadeWeaponPaths.length - 1 : GrenadeWeaponPaths.length;
|
||||
CurrentGrenadeClassIndex = Rand(MaxValue);
|
||||
|
||||
if ( (!IsAmmoVestActive() && CurrentGrenadeClassIndex == MedicGrenadeIndex) ||
|
||||
(!IsBigPocketsActive() && CurrentGrenadeClassIndex == FirebugGrenadeIndex) ||
|
||||
(CurrentLevel < 15 && (CurrentGrenadeClassIndex == MedicGrenadeIndex || CurrentGrenadeClassIndex == FirebugGrenadeIndex)))
|
||||
{
|
||||
CurrentGrenadeClassIndex = GrenadeWeaponPaths.length - 1;
|
||||
}
|
||||
|
||||
bIsGrenadeDirty = false;
|
||||
|
||||
if (Controller(Owner).IsLocalController())
|
||||
{
|
||||
ServerUpdateCurrentGrenade(CurrentGrenadeClassIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
simulated function OnClientWaveEnded()
|
||||
{
|
||||
super.OnWaveEnded();
|
||||
UpdateCurrentGrenade();
|
||||
}
|
||||
|
||||
simulated function UpdateCurrentGrenade()
|
||||
{
|
||||
if (StartingGrenadeClassIndex == `WEAP_IDX_NONE)
|
||||
{
|
||||
InitializeGrenades();
|
||||
}
|
||||
else if (CurrentGrenadeClassIndex != StartingGrenadeClassIndex || bIsGrenadeDirty)
|
||||
{
|
||||
CurrentGrenadeClassIndex = StartingGrenadeClassIndex;
|
||||
|
||||
if (Controller(Owner).IsLocalController())
|
||||
{
|
||||
ServerUpdateCurrentGrenade(CurrentGrenadeClassIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
reliable server function ServerUpdateCurrentWeapon(byte Value)
|
||||
{
|
||||
StartingWeaponClassIndex = Value;
|
||||
}
|
||||
|
||||
reliable server function ServerUpdateCurrentGrenade(byte CurrentIndex)
|
||||
{
|
||||
CurrentGrenadeClassIndex = CurrentIndex;
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
StartingWeaponClassIndex=Index_None
|
||||
StartingWeaponClassIndex=0
|
||||
StartingGrenadeClassIndex=0
|
||||
CurrentGrenadeClassIndex=0
|
||||
bIsGrenadeDirty=true
|
||||
|
||||
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Survivalist'
|
||||
|
||||
PrimaryWeaponDef=class'KFWeapDef_Random'
|
||||
KnifeWeaponDef=class'KFweapDef_Knife_Survivalist'
|
||||
GrenadeWeaponDef=class'KFWeapDef_Grenade_Commando'
|
||||
GrenadeWeaponDef=class'KFWeapDef_RandomGrenade'
|
||||
HealingGrenadeWeaponDef=class'KFWeapDef_Grenade_Medic'
|
||||
MolotovGrenadeWeaponDef=class'KFWeapDef_Grenade_Firebug'
|
||||
|
||||
@ -856,17 +1199,27 @@ DefaultProperties
|
||||
ZedTimeModifyingStates(11)="WeaponSonicGunSingleFiring"
|
||||
ZedTimeModifyingStates(12)="WeaponSonicGunCharging"
|
||||
|
||||
PrimaryWeaponPaths(0)=class'KFWeapDef_AR15'
|
||||
PrimaryWeaponPaths(1)=class'KFWeapDef_MB500'
|
||||
PrimaryWeaponPaths(2)=class'KFWeapDef_Crovel'
|
||||
PrimaryWeaponPaths(3)=class'KFWeapDef_HX25'
|
||||
PrimaryWeaponPaths(4)=class'KFWeapDef_MedicPistol'
|
||||
PrimaryWeaponPaths(0)=class'KFWeapDef_Crovel'
|
||||
PrimaryWeaponPaths(1)=class'KFWeapDef_AR15'
|
||||
PrimaryWeaponPaths(2)=class'KFWeapDef_MB500'
|
||||
PrimaryWeaponPaths(3)=class'KFWeapDef_MedicPistol'
|
||||
PrimaryWeaponPaths(4)=class'KFWeapDef_HX25'
|
||||
PrimaryWeaponPaths(5)=class'KFWeapDef_CaulkBurn'
|
||||
PrimaryWeaponPaths(6)=class'KFWeapDef_Remington1858Dual'
|
||||
PrimaryWeaponPaths(7)=class'KFWeapDef_Winchester1894'
|
||||
PrimaryWeaponPaths(8)=class'KFWeapDef_MP7'
|
||||
AutoBuyLoadOutPath=(class'KFWeapDef_DragonsBreath', class'KFWeapDef_FreezeThrower', class'KFWeapDef_MedicRifle', class'KFWeapDef_LazerCutter')
|
||||
|
||||
GrenadeWeaponPaths(0)=class'KFWeapDef_Grenade_Commando'
|
||||
GrenadeWeaponPaths(1)=class'KFWeapDef_Grenade_Support'
|
||||
GrenadeWeaponPaths(2)=class'KFWeapDef_Grenade_Medic'
|
||||
GrenadeWeaponPaths(3)=class'KFWeapDef_Grenade_Firebug'
|
||||
GrenadeWeaponPaths(4)=class'KFWeapDef_Grenade_Gunslinger'
|
||||
GrenadeWeaponPaths(5)=class'KFWeapDef_Grenade_SWAT'
|
||||
|
||||
MedicGrenadeIndex = 2;
|
||||
FirebugGrenadeIndex = 3;
|
||||
|
||||
// Prestige Rewards
|
||||
PrestigeRewardItemIconPaths[0]="WEP_SkinSet_Prestige01_Item_TEX.knives.SurvivalistKnife_PrestigePrecious_Mint_large"
|
||||
PrestigeRewardItemIconPaths[1]="WEP_SkinSet_Prestige02_Item_TEX.tier01.FreezeThrower_PrestigePrecious_Mint_large"
|
||||
|
@ -37,9 +37,16 @@ var() bool bEnabledAtStart<EditCondition=bKismetDriven>;
|
||||
/** Whether this pickup node has been modified by kismet (enabled or disabled) */
|
||||
var transient bool bKismetEnabled;
|
||||
|
||||
function bool CanUsePickup()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Pick a weapon from 'ItemPickups' and enable it in the world */
|
||||
function Reset()
|
||||
{
|
||||
if (CanUsePickup())
|
||||
{
|
||||
if( bKismetDriven )
|
||||
{
|
||||
SetInitialState();
|
||||
@ -49,6 +56,11 @@ function Reset()
|
||||
bToBeActivated = false;
|
||||
GotoState('Pickup');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPickupHidden();
|
||||
}
|
||||
}
|
||||
|
||||
// Called after PostBeginPlay.
|
||||
|
@ -49,11 +49,42 @@ replication
|
||||
PickupIndex;
|
||||
}
|
||||
|
||||
function bool CanUsePickup()
|
||||
{
|
||||
local KFGameInfo KFGI;
|
||||
local int i;
|
||||
local bool has_armour;
|
||||
|
||||
KFGI = KFGameInfo( WorldInfo.Game );
|
||||
|
||||
if (KFGI != none && KFGI.OutbreakEvent != none)
|
||||
{
|
||||
if (KFGI.OutbreakEvent.ActiveEvent.bOnlyArmorItemPickup)
|
||||
{
|
||||
for (i = 0 ; i < ItemPickups.Length ; i++)
|
||||
{
|
||||
if (ItemPickups[i].ItemClass.Name == ArmorClassName)
|
||||
{
|
||||
has_armour = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (has_armour == false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return super.CanUsePickup();
|
||||
}
|
||||
|
||||
simulated event PreBeginPlay()
|
||||
{
|
||||
local KFGameInfo KFGI;
|
||||
|
||||
// For Scavenger weekly, we need to treat the factory items as non kismet items.
|
||||
// For Scavenger weekly, we need to treat the factory items as non kismet items.
|
||||
KFGI = KFGameInfo( WorldInfo.Game );
|
||||
if (KFGI != none && KFGI.OutbreakEvent != none && KFGI.OutbreakEvent.ActiveEvent.bUnlimitedWeaponPickups)
|
||||
{
|
||||
@ -62,7 +93,6 @@ simulated event PreBeginPlay()
|
||||
bKismetDriven=false;
|
||||
}
|
||||
}
|
||||
////////////////////////////////////////
|
||||
|
||||
super.PreBeginPlay();
|
||||
}
|
||||
@ -152,10 +182,26 @@ function int ChooseWeaponPickup()
|
||||
local int i, DesiredItemIdx;
|
||||
local float Weight, TotalWeight, RandomWeight;
|
||||
local array<int> IndexList;
|
||||
local KFGameInfo KFGI;
|
||||
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
|
||||
DesiredItemIdx = 255;
|
||||
|
||||
// Add up the total weight for all valid attacks
|
||||
for(i = 0; i < ItemPickups.Length; i++)
|
||||
{
|
||||
if (KFGI != none && KFGI.OutbreakEvent != none)
|
||||
{
|
||||
if (KFGI.OutbreakEvent.ActiveEvent.bOnlyArmorItemPickup)
|
||||
{
|
||||
if (ItemPickups[i].ItemClass.Name != 'KFInventory_Armor')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( ItemPickups[i].Priority > 0.f )
|
||||
{
|
||||
TotalWeight += ItemPickups[i].Priority;
|
||||
@ -194,11 +240,26 @@ simulated native function GetPickupMesh(class<KFWeapon> ItemClass);
|
||||
/** Use the pickups static mesh for this factory */
|
||||
simulated function SetPickupMesh()
|
||||
{
|
||||
local KFGameInfo KFGI;
|
||||
|
||||
if (PickupIndex >= ItemPickups.Length)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
|
||||
if (KFGI != none && KFGI.OutbreakEvent != none)
|
||||
{
|
||||
if (KFGI.OutbreakEvent.ActiveEvent.bOnlyArmorItemPickup)
|
||||
{
|
||||
if (ItemPickups[PickupIndex].ItemClass.Name != ArmorClassName)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ItemPickups[PickupIndex].ItemClass.Name == ArmorClassName)
|
||||
{
|
||||
FinalizePickupMesh(StaticMeshComponent(ItemPickups[PickupIndex].ItemClass.default.PickupFactoryMesh).StaticMesh);
|
||||
@ -307,12 +368,24 @@ function ActivateNewPickup(Pawn P)
|
||||
{
|
||||
local KFGameInfo KFGI;
|
||||
|
||||
KFGI = KFGameInfo( WorldInfo.Game );
|
||||
|
||||
if (KFGI != none && KFGI.OutbreakEvent != none)
|
||||
{
|
||||
if (KFGI.OutbreakEvent.ActiveEvent.bOnlyArmorItemPickup)
|
||||
{
|
||||
if (ItemPickups[PickupIndex].ItemClass.Name != ArmorClassName)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( bKismetDriven )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
KFGI = KFGameInfo( WorldInfo.Game );
|
||||
if ( KFGI != none )
|
||||
{
|
||||
KFGI.EnableNewPickup( KFGI.ItemPickups, KFGI.DifficultyInfo.GetWeaponPickupInterval(KFGI.GetLivingPlayerCount()), self );
|
||||
|
@ -113,6 +113,10 @@ var private const bool bPerkStatsLoaded;
|
||||
|
||||
/** Id of previously selected perk */
|
||||
var public byte SavedPerkIndex;
|
||||
/** Index of the weapon chosen for the survival perk */
|
||||
var public byte SurvivalPerkWeapIndex;
|
||||
/** Index of the grenade chosen for the survival perk */
|
||||
var public byte SurvivalPerkGrenIndex;
|
||||
|
||||
/** Player zed spawn params (Versus) */
|
||||
var transient sPlayerZedSpawnInfo PlayerZedSpawnInfo;
|
||||
@ -136,6 +140,10 @@ var protected float UnmodifiedFOV;
|
||||
var transient protected int BenefactorDosh;
|
||||
var private const int BenefactorDoshReq;
|
||||
|
||||
var array<KFPawn_Monster> KilledZeds;
|
||||
var array<float> KilledZedsLastZPosition;
|
||||
var KFSeaTrigger SeaTrigger;
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name UDK Variables
|
||||
********************************************************************************************* */
|
||||
@ -712,6 +720,14 @@ var transient bool bNoGoActive;
|
||||
|
||||
var transient byte StoredLocalUserNum;
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name KFWeap_Autoturret
|
||||
|
||||
With the trader you can buy and sell the weapon without exploding the turrets. Add them to
|
||||
the controller to keep track of them rather than the weapon.
|
||||
**********************************************************************************************/
|
||||
var transient array<Actor> DeployedTurrets;
|
||||
|
||||
cpptext
|
||||
{
|
||||
virtual UBOOL Tick( FLOAT DeltaSeconds, ELevelTick TickType );
|
||||
@ -811,6 +827,8 @@ native private function ShowPreClientTravelMovie(string URLString);
|
||||
|
||||
simulated event PostBeginPlay()
|
||||
{
|
||||
local KFSeaTrigger actor_search;
|
||||
|
||||
super.PostBeginPlay();
|
||||
|
||||
PostAkEvent( ResetFiltersEvent );
|
||||
@ -831,6 +849,18 @@ simulated event PostBeginPlay()
|
||||
OnlineSub.AddOnReadOnlineAvatarCompleteDelegate(OnAvatarReceived);
|
||||
OnlineSub.AddOnReadOnlineAvatarByNameCompleteDelegate(OnAvatarURLPS4Received);
|
||||
}
|
||||
|
||||
foreach AllActors(class'KFSeaTrigger', actor_search)
|
||||
{
|
||||
SeaTrigger = actor_search;
|
||||
|
||||
if (WorldInfo.NetMode == NM_Client || WorldInfo.NetMode == NM_Standalone)
|
||||
{
|
||||
SetTimer(1.f, true, nameOf(ZedKillsSeaDetection));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function UpdateVOIP()
|
||||
@ -952,6 +982,7 @@ simulated event name GetSeasonalStateName()
|
||||
local int EventId;
|
||||
local KFMapInfo KFMI;
|
||||
local bool bIsWWLWeekly; // WWL Weekly should not allow seasonal overrides
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
EventId = class'KFGameEngine'.static.GetSeasonalEventID();
|
||||
KFMI = KFMapInfo(WorldInfo.GetMapInfo());
|
||||
@ -960,7 +991,8 @@ simulated event name GetSeasonalStateName()
|
||||
KFMI.ModifySeasonalEventId(EventId);
|
||||
}
|
||||
|
||||
bIsWWLWeekly = class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12 && KFGameReplicationInfo(WorldInfo.GRI) != none && KFGameReplicationInfo(WorldInfo.GRI).bIsWeeklyMode;
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
bIsWWLWeekly = KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12;
|
||||
if (bIsWWLWeekly)
|
||||
return 'No_Event';
|
||||
|
||||
@ -1573,6 +1605,8 @@ function OnReadProfileSettingsComplete(byte LocalUserNum,bool bWasSuccessful)
|
||||
bHideBossHealthBar = Profile.GetProfileBool(KFID_HideBossHealthBar);
|
||||
bDisableAutoUpgrade = Profile.GetProfileBool(KFID_DisableAutoUpgrade);
|
||||
bHideRemotePlayerHeadshotEffects = Profile.GetProfileBool(KFID_HideRemoteHeadshotEffects);
|
||||
SurvivalPerkWeapIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingWeapIdx));
|
||||
SurvivalPerkGrenIndex = byte(Profile.GetProfileInt(KFID_SurvivalStartingGrenIdx));
|
||||
|
||||
KFPRI = KFPlayerReplicationInfo(PlayerReplicationInfo);
|
||||
if(KFPRI != none)
|
||||
@ -2581,6 +2615,30 @@ function NotifyPlayTogetherFailed(optional string LocKey = "UnableToPlayTogether
|
||||
* @name Dosh Vault
|
||||
********************************************************************************************* */
|
||||
|
||||
public function bool CanUseDosh()
|
||||
{
|
||||
/** If this is run in Server or Standalone, GameInfo exists so can access to the OutbreakEvent */
|
||||
if (Role == Role_Authority)
|
||||
{
|
||||
return KFGameInfo(WorldInfo.Game).OutbreakEvent == none
|
||||
|| !KFGameInfo(WorldInfo.Game).OutbreakEvent.ActiveEvent.bDisableAddDosh;
|
||||
}
|
||||
/** But in client, GameInfo doesn't exist, so needs to be checked in a different way. */
|
||||
else
|
||||
{
|
||||
/**
|
||||
In client there's a kfgame replication info that contains if the mode is a weekly, and the index.
|
||||
This way would also work in server, but will need to be in code rather than using the weekly variables.
|
||||
*/
|
||||
/** Another option is to use instead a variable replicated just with that value */
|
||||
return KFGameReplicationInfo(WorldInfo.GRI) == none
|
||||
|| !KFGameReplicationInfo(WorldInfo.GRI).bIsWeeklyMode
|
||||
|| KFGameReplicationInfo(WorldInfo.GRI).CurrentWeeklyIndex != 16;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function int GetPreStigeValueDoshRewardValue()
|
||||
{
|
||||
if (StatsWrite != none)
|
||||
@ -2672,6 +2730,34 @@ function CheckHasViewedDoshVault()
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Gun Game
|
||||
********************************************************************************************* */
|
||||
|
||||
public function bool CanUseGunGame()
|
||||
{
|
||||
/** If this is run in Server or Standalone, GameInfo exists so can access to the OutbreakEvent */
|
||||
if (Role == Role_Authority)
|
||||
{
|
||||
return KFGameInfo(WorldInfo.Game).OutbreakEvent != none
|
||||
&& KFGameInfo(WorldInfo.Game).OutbreakEvent.ActiveEvent.bGunGameMode;
|
||||
}
|
||||
/** But in client, GameInfo doesn't exist, so needs to be checked in a different way. */
|
||||
else
|
||||
{
|
||||
/**
|
||||
In client there's a kfgame replication info that contains if the mode is a weekly, and the index.
|
||||
This way would also work in server, but will need to be in code rather than using the weekly variables.
|
||||
*/
|
||||
/** Another option is to use instead a variable replicated just with that value */
|
||||
return KFGameReplicationInfo(WorldInfo.GRI) != none
|
||||
&& KFGameReplicationInfo(WorldInfo.GRI).bIsWeeklyMode
|
||||
&& KFGameReplicationInfo(WorldInfo.GRI).CurrentWeeklyIndex == 16;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Skill Tracking
|
||||
********************************************************************************************* */
|
||||
@ -3089,6 +3175,8 @@ function RecievedNewPerkClass()
|
||||
{
|
||||
MyGfxManager.TraderMenu.UpdatePlayerInfo();
|
||||
}
|
||||
|
||||
InitPerkLoadout();
|
||||
}
|
||||
|
||||
/*********************************************************************************************
|
||||
@ -3976,7 +4064,7 @@ simulated final function Pawn GetPickedAimAtTarget(out float bestAim, out float
|
||||
return PickAimAtTarget(bestAim, bestDist, FireDir, projStart, MaxRange, bTargetTeammates);
|
||||
}
|
||||
|
||||
exec function SwitchToBestWeapon(optional bool bForceNewWeapon)
|
||||
exec function SwitchToBestWeapon(optional bool bForceNewWeapon, optional bool check_9mm_logic = false)
|
||||
{
|
||||
// Don't let players use an exec to bring up a weapon if the weapon prevents it
|
||||
if( Pawn != none && Pawn.Weapon != none && KFWeapon(Pawn.Weapon) != none )
|
||||
@ -3987,7 +4075,7 @@ exec function SwitchToBestWeapon(optional bool bForceNewWeapon)
|
||||
}
|
||||
}
|
||||
|
||||
super.SwitchToBestWeapon(bForceNewWeapon);
|
||||
super.SwitchToBestWeapon(bForceNewWeapon, check_9mm_logic);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -4148,6 +4236,7 @@ simulated event OnWeaponAsyncContentLoaded(class<KFWeapon> WeaponClass)
|
||||
|
||||
local KFPawn_Human KFPH;
|
||||
local KFDroppedPickup KFDP;
|
||||
local KFPawn KFP;
|
||||
|
||||
// Attempt to set the weapon attachment for any player than might need theirs set. This is a backup
|
||||
// for when content isn't quite ready when WeaponClassForAttachmentTemplate is replicated.
|
||||
@ -4169,6 +4258,14 @@ simulated event OnWeaponAsyncContentLoaded(class<KFWeapon> WeaponClass)
|
||||
KFDP.SetPickupMesh(WeaponClass.default.DroppedPickupMesh);
|
||||
}
|
||||
}
|
||||
|
||||
foreach WorldInfo.AllPawns(class'KFPawn', KFP)
|
||||
{
|
||||
if (KFP.bIsTurret && WeaponClass == KFP.WeaponClassForAttachmentTemplate)
|
||||
{
|
||||
KFP.SetTurretWeaponAttachment(WeaponClass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************************
|
||||
@ -5285,7 +5382,9 @@ function bool ShouldDisplayGameplayPostProcessFX()
|
||||
/* ZED time effect is active */
|
||||
CurrentZEDTimeEffectIntensity > 0.f ||
|
||||
/* sepia effect */
|
||||
(class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12) ||
|
||||
(KFGameReplicationInfo(WorldInfo.GRI) != none &&
|
||||
KFGameReplicationInfo(WorldInfo.GRI).bIsWeeklyMode &&
|
||||
KFGameReplicationInfo(WorldInfo.GRI).CurrentWeeklyIndex == 12) ||
|
||||
/* Night vision active */
|
||||
bNightVisionActive ||
|
||||
SirenScreamEffectTimeRemaining > 0.f ||
|
||||
@ -7154,6 +7253,8 @@ simulated function OnStatsInitialized( bool bWasSuccessful )
|
||||
LoadAllPerkLevels();
|
||||
ClientInitializePerks();
|
||||
|
||||
InitPerkLoadout();
|
||||
|
||||
// Update the GFX menu if we need to
|
||||
if( MyGFxManager != none && MyGFxManager.PerksMenu != none )
|
||||
{
|
||||
@ -9186,6 +9287,13 @@ event Destroyed()
|
||||
StingerAkComponent.StopEvents();
|
||||
}
|
||||
|
||||
// Destroy deployed turrets
|
||||
// Destroyed event on Turret calls the KFPlayer to modify the same list, that's why we use a while loop...
|
||||
while (DeployedTurrets.Length > 0)
|
||||
{
|
||||
DeployedTurrets[0].Destroy();
|
||||
}
|
||||
|
||||
SetRTPCValue( 'Health', 100, true );
|
||||
PostAkEvent( LowHealthStopEvent );
|
||||
bPlayingLowHealthSFX = false;
|
||||
@ -9215,6 +9323,7 @@ event Destroyed()
|
||||
ClearMixerDelegates();
|
||||
ClearDiscord();
|
||||
}
|
||||
|
||||
ClientMatchEnded();
|
||||
|
||||
Super.Destroyed();
|
||||
@ -9340,6 +9449,43 @@ state Dead
|
||||
}
|
||||
}
|
||||
|
||||
simulated function ZedKillsSeaDetection()
|
||||
{
|
||||
local int i;
|
||||
local KFPawn_Monster Monster;
|
||||
local float LastMonsterZPosition;
|
||||
|
||||
for (i = KilledZeds.Length - 1; i >= 0; i--)
|
||||
{
|
||||
Monster = KilledZeds[i];
|
||||
|
||||
// If respawned...
|
||||
if (Monster == None || Monster.Health > 0)
|
||||
{
|
||||
KilledZeds.Remove(i, 1);
|
||||
KilledZedsLastZPosition.Remove(i, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
LastMonsterZPosition = KilledZedsLastZPosition[i];
|
||||
|
||||
KilledZedsLastZPosition[i] = Monster.Location.Z;
|
||||
|
||||
// If we are falling...
|
||||
if (LastMonsterZPosition > Monster.Location.Z)
|
||||
{
|
||||
// If we passed the point of the sea trigger detection
|
||||
if (Monster.Location.Z < SeaTrigger.Location.Z)
|
||||
{
|
||||
ClientOnTriggerUsed(class'KFSeaTrigger');
|
||||
|
||||
KilledZeds.Remove(i, 1);
|
||||
KilledZedsLastZPosition.Remove(i, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Should be to instigate a transition to spectating, automatically handles notifying server or notifying the owning client as necessary.
|
||||
*/
|
||||
@ -9916,6 +10062,15 @@ unreliable client event ClientHearDialog( Actor DialogSpeaker, AkEvent DialogEve
|
||||
}
|
||||
}
|
||||
|
||||
reliable client function NotifyKilledForTracking(KFPawn_Monster KilledMonster)
|
||||
{
|
||||
if (KilledMonster != None && KilledZeds.Find(KilledMonster) == INDEX_NONE)
|
||||
{
|
||||
KilledZeds.AddItem(KilledMonster);
|
||||
KilledZedsLastZPosition.AddItem(KilledMonster.Location.Z);
|
||||
}
|
||||
}
|
||||
|
||||
function NotifyKilled( Controller Killer, Controller Killed, pawn KilledPawn, class<DamageType> damageType )
|
||||
{
|
||||
local KFPawn_Monster MonsterPawn;
|
||||
@ -9937,6 +10092,12 @@ function NotifyKilled( Controller Killer, Controller Killed, pawn KilledPawn, cl
|
||||
MatchStats.ZedsKilledLastWave++;
|
||||
|
||||
CheckForZedOnDeathAchievements( MonsterPawn );
|
||||
|
||||
// If we need to track killed zeds, make the function to be called on client...
|
||||
if (SeaTrigger != none)
|
||||
{
|
||||
NotifyKilledForTracking(MonsterPawn);
|
||||
}
|
||||
}
|
||||
// Own death. Like PawnDied(), but with more input parameters
|
||||
else if ( self == Killed )
|
||||
@ -10065,7 +10226,7 @@ exec function RequestSkipTrader()
|
||||
{
|
||||
if (KFGRI.bMatchHasBegun)
|
||||
{
|
||||
if (KFGRI.bTraderIsOpen && KFPRI.bHasSpawnedIn)
|
||||
if ((KFGRI.bTraderIsOpen || KFGRI.bForceSkipTraderUI) && KFPRI.bHasSpawnedIn)
|
||||
{
|
||||
KFPRI.RequestSkiptTrader(KFPRI);
|
||||
if (MyGFxManager != none)
|
||||
@ -11728,6 +11889,24 @@ event OnServerTakeoverResponseRecieved()
|
||||
}
|
||||
}
|
||||
|
||||
reliable client function ForceMonsterHeadExplode(KFPawn_Monster Victim)
|
||||
{
|
||||
if (Victim != none)
|
||||
{
|
||||
Victim.bIsHeadless=true;
|
||||
Victim.PlayHeadAsplode();
|
||||
}
|
||||
}
|
||||
|
||||
simulated function InitPerkLoadout()
|
||||
{
|
||||
if (CurrentPerk.IsA('KFPerk_Survivalist'))
|
||||
{
|
||||
CurrentPerk.SetWeaponSelectedIndex(SurvivalPerkWeapIndex);
|
||||
CurrentPerk.SetGrenadeSelectedIndex(SurvivalPerkGrenIndex);
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
EarnedDosh=0
|
||||
|
@ -38,8 +38,26 @@ var protected const AkEvent RhythmMethodSoundReset;
|
||||
var protected const AkEvent RhythmMethodSoundHit;
|
||||
var protected const AkEvent RhythmMethodSoundTop;
|
||||
var protected const AkEvent AracnoStompSoundEvent;
|
||||
var protected const AKEvent GunGameLevelUpSoundEvent;
|
||||
var protected const AKEvent GunGameLevelUpFinalWeaponSoundEvent;
|
||||
|
||||
struct native GunGameInfo
|
||||
{
|
||||
var transient byte Level;
|
||||
var transient int Score;
|
||||
var array<byte> GunGamePreselectedWeapons;
|
||||
var byte WaveToUseForRestart;
|
||||
var bool GiveWeaponMaster;
|
||||
|
||||
structdefaultproperties
|
||||
{
|
||||
Level=0;
|
||||
Score=0;
|
||||
WaveToUseForRestart=0;
|
||||
GiveWeaponMaster=false;
|
||||
}
|
||||
};
|
||||
var transient GunGameInfo GunGameData;
|
||||
|
||||
cpptext
|
||||
{
|
||||
@ -49,7 +67,7 @@ cpptext
|
||||
replication
|
||||
{
|
||||
if (bNetDirty)
|
||||
bUsingPermanentZedTime, ZedTimeRadius, ZedTimeBossRadius, ZedTimeHeight, GoompaStreak;
|
||||
bUsingPermanentZedTime, ZedTimeRadius, ZedTimeBossRadius, ZedTimeHeight, GoompaStreak, GunGameData;
|
||||
}
|
||||
|
||||
simulated event PostBeginPlay()
|
||||
@ -114,6 +132,22 @@ function RecheckZedTime()
|
||||
EnterZedTime();
|
||||
}
|
||||
|
||||
reliable client function UpdateWaveCount()
|
||||
{
|
||||
if (MyGFxHUD != none)
|
||||
{
|
||||
MyGFxHUD.UpdateWaveCount();
|
||||
}
|
||||
}
|
||||
|
||||
reliable client function UpdateGunGameWidget(int score, int max_score, int level, int max_level)
|
||||
{
|
||||
if (MyGFxHUD != none)
|
||||
{
|
||||
MyGFxHUD.UpdateGunGameWidget(score, max_score, level, max_level);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Arachnophobia Goompa Stomp Streak functions
|
||||
*/
|
||||
@ -195,13 +229,35 @@ reliable client function GoompaStompMessage( byte StompNum)
|
||||
}
|
||||
}
|
||||
|
||||
reliable client function PlayGunGameMessage(bool isLastLevel)
|
||||
{
|
||||
if (isLastLevel)
|
||||
{
|
||||
if (GunGameLevelUpFinalWeaponSoundEvent != none)
|
||||
{
|
||||
PlaySoundBase(GunGameLevelUpFinalWeaponSoundEvent);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GunGameLevelUpSoundEvent != none)
|
||||
{
|
||||
PlaySoundBase(GunGameLevelUpSoundEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Resets all gameplay FX to initial state.
|
||||
Append to this list if additional effects are added. */
|
||||
function ResetGameplayPostProcessFX()
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
super.ResetGameplayPostProcessFX();
|
||||
|
||||
if( GameplayPostProcessEffectMIC != none && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
|
||||
if((KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12) && GameplayPostProcessEffectMIC != none)
|
||||
{
|
||||
GameplayPostProcessEffectMIC.SetScalarParameterValue(EffectZedTimeSepiaParamName, 1.f);
|
||||
}
|
||||
@ -228,6 +284,55 @@ simulated function ResetBossCamera()
|
||||
super(PlayerController).ResetCameraMode();
|
||||
}
|
||||
|
||||
function RestartGunGame()
|
||||
{
|
||||
local KFGameInfo KFGI;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
|
||||
if (KFGI != none && KFGRI != none)
|
||||
{
|
||||
KFGI.RestartGunGamePlayerWeapon(self, GunGameData.WaveToUseForRestart);
|
||||
}
|
||||
}
|
||||
|
||||
function UpdateInitialHeldWeapon()
|
||||
{
|
||||
//local KFWeapon KFW;
|
||||
local KFPawn_Human KFPH;
|
||||
local KFGameInfo KFGI;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
KFPH = KFPawn_Human(Pawn);
|
||||
|
||||
if (KFPH == none || KFPH.InvManager == none)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/*foreach KFPH.InvManager.InventoryActors( class'KFWeapon', KFW )
|
||||
{
|
||||
/** Seems its in order, so knife goes first. Equip it */
|
||||
|
||||
KFPH.InvManager.SetCurrentWeapon(KFW);
|
||||
break;
|
||||
}*/
|
||||
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
|
||||
if (KFGI != none && KFGRI != none)
|
||||
{
|
||||
KFGI.ResetGunGame(self);
|
||||
|
||||
GunGameData.WaveToUseForRestart = KFGRI.WaveNum;
|
||||
|
||||
SetTimer(1.0, false, 'RestartGunGame');
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
defaultProperties
|
||||
{
|
||||
@ -239,4 +344,6 @@ defaultProperties
|
||||
RhythmMethodSoundHit =AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Hit'
|
||||
RhythmMethodSoundTop =AkEvent'WW_UI_PlayerCharacter.Play_R_Method_Top'
|
||||
AracnoStompSoundEvent =AkEvent'WW_GLO_Runtime.WeeklyArcno'
|
||||
GunGameLevelUpSoundEvent=AkEvent'WW_GLO_Runtime.WeeklyAALevelUp'
|
||||
GunGameLevelUpFinalWeaponSoundEvent=AkEvent'WW_GLO_Runtime.WeeklyAALevelFinal'
|
||||
}
|
||||
|
@ -2062,8 +2062,10 @@ function vector GetBestAutoTargetLocation(Pawn CheckTarget, out name outBoneName
|
||||
if( KFP != none )
|
||||
{
|
||||
// Get the location from the pawn we're targeting if we can
|
||||
KFP.GetAutoTargetBones(WeakBones, NormalBones);
|
||||
|
||||
if (!KFP.GetAutoTargetBones(WeakBones, NormalBones))
|
||||
{
|
||||
return vect(0,0,0);
|
||||
}
|
||||
// cone setup
|
||||
GetPlayerViewPoint( CamLoc, CamRot );
|
||||
CamRot += WeaponBufferRotation;
|
||||
|
@ -1351,6 +1351,15 @@ reliable server private function ServerSetPlayerReady( bool bReady )
|
||||
/** Called on server to +/- dosh. Do not modify score directly */
|
||||
function AddDosh( int DoshAmount, optional bool bEarned )
|
||||
{
|
||||
local KFPlayerController KFPC;
|
||||
|
||||
/** Server code: controllers exist */
|
||||
KFPC = KFPlayerController(Owner);
|
||||
if (KFPC != none && !KFPC.CanUseDosh())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//If the game has turned off dosh earning for this PRI, early out.
|
||||
if (!bAllowDoshEarning && bEarned)
|
||||
{
|
||||
@ -1465,6 +1474,10 @@ simulated function NotifyWaveEnded()
|
||||
{
|
||||
bVotedToSkipTraderTime = false;
|
||||
|
||||
if ( (WorldInfo.NetMode == NM_Standalone || WorldInfo.NetMode == NM_Client) && KFPlayerController(Owner) != none && KFPlayerController(Owner).GetPerk() != none)
|
||||
{
|
||||
KFPlayerController(Owner).GetPerk().OnClientWaveEnded();
|
||||
}
|
||||
/*local KFGameReplicationInfo KFGRI;
|
||||
|
||||
if( Role == ROLE_Authority )
|
||||
@ -1475,6 +1488,11 @@ simulated function NotifyWaveEnded()
|
||||
KFGRI.VoteCollector.ResetSkipTraderBeforeWaveStarts();
|
||||
}
|
||||
}*/
|
||||
|
||||
if ( (WorldInfo.NetMode == NM_Standalone || WorldInfo.NetMode == NM_Client) && KFPlayerController(Owner) != none && KFPlayerController(Owner).GetPerk() != none)
|
||||
{
|
||||
KFPlayerController(Owner).GetPerk().OnClientWaveEnded();
|
||||
}
|
||||
}
|
||||
|
||||
//reset the icons here
|
||||
|
@ -380,4 +380,10 @@ defaultproperties
|
||||
// Added 16/07/2021 - QoL: Quick Swap button allowing 9mm as an option.
|
||||
ProfileMappings.Add((Id=KFID_AllowSwapTo9mm, Name="AllowSwitchTo9mm", MappingType=PVMT_RawValue))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_AllowSwapTo9mm,Data=(Type=SDT_Int32,Value1=0))))
|
||||
|
||||
// Added 07/02/2022 - QoL: Allow survivalits to chose starting weapons.
|
||||
ProfileMappings.Add((Id=KFID_SurvivalStartingWeapIdx, Name="Survival Starting Weapon Index", MappingType=PVMT_RawValue))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SurvivalStartingWeapIdx,Data=(Type=SDT_Int32,Value1=0))))
|
||||
ProfileMappings.Add((Id=KFID_SurvivalStartingGrenIdx, Name="Survival Starting Grenade Index", MappingType=PVMT_RawValue))
|
||||
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_SurvivalStartingGrenIdx,Data=(Type=SDT_Int32,Value1=0))))
|
||||
}
|
||||
|
@ -182,6 +182,8 @@ function SetFrozenParameter(float FreezeAmount)
|
||||
local MaterialInstanceConstant MIC;
|
||||
local int i;
|
||||
local bool bIsWWLMode;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
if ( PawnOwner.WorldInfo.NetMode != NM_DedicatedServer )
|
||||
{
|
||||
FreezeMatParamValue = FreezeAmount;
|
||||
@ -201,7 +203,8 @@ function SetFrozenParameter(float FreezeAmount)
|
||||
|
||||
if (KFPawn_Monster(KFPOwner) != none)
|
||||
{
|
||||
bIsWWLMode = class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12 && KFGameReplicationInfo(PawnOwner.WorldInfo.GRI) != none && KFGameReplicationInfo(PawnOwner.WorldInfo.GRI).bIsWeeklyMode;
|
||||
KFGRI = KFGameReplicationInfo(PawnOwner.WorldInfo.GRI);
|
||||
bIsWWLMode = KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12;
|
||||
|
||||
for (i = 0; i < KFPawn_Monster(KFPOwner).StaticAttachList.length; i++)
|
||||
{
|
||||
|
41
KFGame/Classes/KFSeaTrigger.uc
Normal file
41
KFGame/Classes/KFSeaTrigger.uc
Normal 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
|
||||
}
|
@ -32,7 +32,9 @@ enum ESharedContentUnlock
|
||||
SCU_Thermite,
|
||||
SCU_BladedPistol,
|
||||
SCU_ParasiteImplanter,
|
||||
SCU_Doshinegun
|
||||
SCU_Doshinegun,
|
||||
SCU_AutoTurret,
|
||||
SCU_ShrinkRayGun
|
||||
};
|
||||
|
||||
|
||||
@ -212,6 +214,7 @@ static private event bool CheckCustomizationOwnership(KFPlayerReplicationInfo PR
|
||||
local SkinVariant Skin;
|
||||
local AttachmentVariants Attachment;
|
||||
local int i;
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
|
||||
CharArch = PRI.CharacterArchetypes[PRI.RepCustomizationInfo.CharacterIndex];
|
||||
|
||||
@ -246,10 +249,12 @@ static private event bool CheckCustomizationOwnership(KFPlayerReplicationInfo PR
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
KFGRI = KFGameReplicationInfo(PRI.WorldInfo.GRI);
|
||||
// accessory
|
||||
for( i=0; i < `MAX_COSMETIC_ATTACHMENTS; i++ )
|
||||
{
|
||||
if (i == 2 && PRI.WorldInfo.GRI.IsA('KFGameReplicationInfo_WeeklySurvival') && (class'KFGameEngine'.static.GetWeeklyEventIndexMod() == 12))
|
||||
if (i == 2 && KFGRI != none && KFGRI.bIsWeeklyMode && KFGRI.CurrentWeeklyIndex == 12)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -360,4 +365,12 @@ defaultproperties
|
||||
Name=KFWeap_AssaultRifle_Doshinegun,
|
||||
IconPath="WEP_UI_Doshinegun_TEX.UI_Weapon_Select_Doshinegun",
|
||||
ID=9275)}
|
||||
SharedContentList(SCU_AutoTurret)={(
|
||||
Name=KFWeap_AutoTurret,
|
||||
IconPath="WEP_UI_AutoTurret_TEX.UI_WeaponSelect_AutoTurret",
|
||||
ID=9284)}
|
||||
SharedContentList(SCU_ShrinkRayGun)={(
|
||||
Name=KFWeap_ShrinkRayGun,
|
||||
IconPath="WEP_UI_ShrinkRay_Gun_TEX.UI_Weapon_Select_Shrink_Ray_Gun",
|
||||
ID=9290)}
|
||||
}
|
||||
|
@ -434,7 +434,7 @@ function ServerStartVoteSkipTrader(PlayerReplicationInfo PRI)
|
||||
}
|
||||
|
||||
// Trader is not open, we are not allowed to initiate a skip trader vote
|
||||
if(!KFGRI.bTraderIsOpen)
|
||||
if(!KFGRI.bTraderIsOpen && !KFGRI.bForceShowSkipTrader)
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_SkipTraderIsNotOpen);
|
||||
return;
|
||||
|
@ -31,6 +31,8 @@ var AkEvent PilotLightPlayEvent;
|
||||
/** Pilot light sound stop event */
|
||||
var AkEvent PilotLightStopEvent;
|
||||
|
||||
var protected bool bInvertPilot;
|
||||
|
||||
/** Effect for the pilot light. */
|
||||
var protected KFParticleSystemComponent PSC_PilotLight;
|
||||
/** Socket to attach the pilot light to. */
|
||||
@ -263,9 +265,17 @@ simulated function StopPilotSound()
|
||||
simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
|
||||
{
|
||||
local int Idx;
|
||||
local bool doEnable;
|
||||
|
||||
doEnable = bLightEnabled;
|
||||
|
||||
if (bInvertPilot)
|
||||
{
|
||||
doEnable = bLightEnabled == false;
|
||||
}
|
||||
|
||||
// Don't turn these on if we're not in third person
|
||||
if( bLightEnabled && (Instigator != none && Instigator.IsFirstPerson()) )
|
||||
if (doEnable && (Instigator != none && Instigator.IsFirstPerson()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -273,7 +283,7 @@ simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
|
||||
// turn off lights
|
||||
for (Idx=0; Idx<PilotLights.length; ++Idx)
|
||||
{
|
||||
PilotLights[Idx].Light.SetEnabled(bLightEnabled);
|
||||
PilotLights[Idx].Light.SetEnabled(doEnable);
|
||||
}
|
||||
}
|
||||
|
||||
@ -507,6 +517,8 @@ defaultproperties
|
||||
TickGroup=TG_PostUpdateWork
|
||||
End Object
|
||||
PSC_PilotLight=PilotLight0
|
||||
|
||||
bInvertPilot=false
|
||||
}
|
||||
|
||||
|
||||
|
29
KFGame/Classes/KFWeapDef_AutoTurret.uc
Normal file
29
KFGame/Classes/KFWeapDef_AutoTurret.uc
Normal 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
|
||||
|
||||
}
|
19
KFGame/Classes/KFWeapDef_AutoTurretWeapon.uc
Normal file
19
KFGame/Classes/KFWeapDef_AutoTurretWeapon.uc
Normal 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"
|
||||
}
|
25
KFGame/Classes/KFWeapDef_HRG_CranialPopper.uc
Normal file
25
KFGame/Classes/KFWeapDef_HRG_CranialPopper.uc
Normal 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
|
||||
}
|
27
KFGame/Classes/KFWeapDef_HRG_Crossboom.uc
Normal file
27
KFGame/Classes/KFWeapDef_HRG_Crossboom.uc
Normal 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
|
||||
}
|
15
KFGame/Classes/KFWeapDef_RandomGrenade.uc
Normal file
15
KFGame/Classes/KFWeapDef_RandomGrenade.uc
Normal 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"
|
||||
}
|
28
KFGame/Classes/KFWeapDef_ShrinkRayGun.uc
Normal file
28
KFGame/Classes/KFWeapDef_ShrinkRayGun.uc
Normal 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
|
||||
}
|
@ -33,6 +33,8 @@ var AkEvent PilotLightPlayEvent;
|
||||
/** Pilot light sound stop event */
|
||||
var AkEvent PilotLightStopEvent;
|
||||
|
||||
var protected bool bInvertPilot;
|
||||
|
||||
/** Effect for the pilot light. */
|
||||
var() protected KFParticleSystemComponent PSC_PilotLight;
|
||||
/** Socket to attach the pilot light to. */
|
||||
@ -47,6 +49,9 @@ var float LastBarrelHeat;
|
||||
/** Whether this weapon should warn AI when it fires */
|
||||
var() const bool bWarnAIWhenFiring;
|
||||
|
||||
/** Modifier to the speed for barrel cooldown */
|
||||
var const float CooldownBarrelModifier;
|
||||
|
||||
/*********************************************************************************************
|
||||
* @name Optional dynamic pilot lights
|
||||
********************************************************************************************* */
|
||||
@ -147,13 +152,26 @@ simulated event Tick(float DeltaTime)
|
||||
}
|
||||
else
|
||||
{
|
||||
if( BarrelHeat > 0 )
|
||||
if (ActiveFlameSpray != none)
|
||||
{
|
||||
FlameHeat = ActiveFlameSpray.MaterialHeatRange.X;
|
||||
}
|
||||
else if (FlameSprayArchetype != none)
|
||||
{
|
||||
FlameHeat = FlameSprayArchetype.default.MaterialHeatRange.X;
|
||||
}
|
||||
else
|
||||
{
|
||||
FlameHeat = 0;
|
||||
}
|
||||
|
||||
if( BarrelHeat != FlameHeat )
|
||||
{
|
||||
// Cool the barrel down when not shooting
|
||||
BarrelHeat -= DeltaTime * 0.5;
|
||||
if( BarrelHeat < 0 )
|
||||
BarrelHeat -= DeltaTime * CooldownBarrelModifier;
|
||||
if( BarrelHeat < FlameHeat )
|
||||
{
|
||||
BarrelHeat = 0;
|
||||
BarrelHeat = FlameHeat;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -340,9 +358,17 @@ simulated protected function TurnOffPilot()
|
||||
simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
|
||||
{
|
||||
local int Idx;
|
||||
local bool doEnable;
|
||||
|
||||
doEnable = bLightEnabled;
|
||||
|
||||
if (bInvertPilot)
|
||||
{
|
||||
doEnable = bLightEnabled == false;
|
||||
}
|
||||
|
||||
// Don't turn these on if we're not the local playercontroller
|
||||
if( bLightEnabled && (Instigator == none || !Instigator.IsLocallyControlled() || !Instigator.IsFirstPerson()) )
|
||||
if (doEnable && (Instigator == none || !Instigator.IsLocallyControlled() || !Instigator.IsFirstPerson()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -350,7 +376,7 @@ simulated function SetPilotDynamicLightEnabled( bool bLightEnabled )
|
||||
// turn off lights
|
||||
for (Idx=0; Idx<PilotLights.length; ++Idx)
|
||||
{
|
||||
PilotLights[Idx].Light.SetEnabled(bLightEnabled);
|
||||
PilotLights[Idx].Light.SetEnabled(doEnable);
|
||||
}
|
||||
}
|
||||
|
||||
@ -379,7 +405,9 @@ simulated function StopPilotSound()
|
||||
simulated function StartLoopingFireEffects(byte FireModeNum, optional bool bForceAnim)
|
||||
{
|
||||
StopPilotSound();
|
||||
|
||||
SetPilotDynamicLightEnabled(false);
|
||||
|
||||
super.StartLoopingFireEffects(FireModeNum, bForceAnim);
|
||||
}
|
||||
|
||||
@ -389,7 +417,9 @@ simulated function StartLoopingFireEffects(byte FireModeNum, optional bool bForc
|
||||
simulated function StopLoopingFireEffects(byte FireModeNum)
|
||||
{
|
||||
super.StopLoopingFireEffects(FireModeNum);
|
||||
|
||||
StartPilotSound();
|
||||
|
||||
SetPilotDynamicLightEnabled(true);
|
||||
}
|
||||
|
||||
@ -800,10 +830,14 @@ defaultproperties
|
||||
|
||||
bWeaponNeedsServerPosition=true
|
||||
|
||||
bInvertPilot=false
|
||||
|
||||
// Aim Assist
|
||||
AimCorrectionSize=0.f
|
||||
|
||||
// AI Warning
|
||||
MaxAIWarningDistSQ=1000000
|
||||
MaxAIWarningDistFromPointSQ=40000
|
||||
|
||||
CooldownBarrelModifier=0.5f
|
||||
}
|
@ -1246,7 +1246,7 @@ simulated function Timer_UpdateWeaponSkin()
|
||||
// for remote clients to preload content when a user picks up a weapon without
|
||||
// having to do the full setting stack.
|
||||
simulated native static function TriggerAsyncContentLoad(class<KFWeapon> WeaponClass);
|
||||
native private function StartLoadWeaponContent();
|
||||
native protected function StartLoadWeaponContent();
|
||||
native private function LoadWeaponContent();
|
||||
native private function CacheWeaponContent();
|
||||
native private function UnloadWeaponContent();
|
||||
@ -1618,6 +1618,21 @@ simulated function AttachLaserSight()
|
||||
}
|
||||
}
|
||||
|
||||
function GunGameRemove()
|
||||
{
|
||||
if (Instigator != none && Instigator.InvManager != none)
|
||||
{
|
||||
Instigator.InvManager.RemoveFromInventory(Self);
|
||||
}
|
||||
|
||||
Instigator = None;
|
||||
GotoState('');
|
||||
|
||||
AIController = None;
|
||||
|
||||
Destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Drop this item out in to the world
|
||||
*/
|
||||
@ -1815,9 +1830,24 @@ reliable client function ClientNotifyPickedUp()
|
||||
}
|
||||
|
||||
/** Treat as non-standard equipment item for */
|
||||
simulated static function bool DenyPerkResupply()
|
||||
simulated function bool DenyPerkResupply()
|
||||
{
|
||||
return default.InventoryGroup >= IG_Equipment;
|
||||
if (default.InventoryGroup >= IG_Equipment)
|
||||
{
|
||||
if (Class.Name == 'KFWeap_Thrown_C4')
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Class.Name == 'KFWeap_AutoTurret')
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
simulated static function bool IsMeleeWeapon()
|
||||
@ -6488,7 +6518,7 @@ simulated state WeaponFiring
|
||||
Instigator.WeaponStoppedFiring(self, false);
|
||||
}
|
||||
|
||||
if ( bPlayingLoopingFireAnim || bPlayingLoopingFireAnim )
|
||||
if ( bPlayingLoopingFireAnim || bPlayingLoopingFireSnd )
|
||||
{
|
||||
StopLoopingFireEffects(CurrentFireMode);
|
||||
}
|
||||
|
@ -2748,6 +2748,9 @@ defaultproperties
|
||||
//Dragon & Koi Pulverizer
|
||||
Skins.Add((Id=7519, Weapondef=class'KFWeapDef_Pulverizer', MIC_1P=("WEP_SkinSet_DragonKoi_03_MAT.dragonkoi_pulverizer.DragonKoi_Pulverizer_1P_Mint_MIC"), MIC_3P="WEP_SkinSet_DragonKoi_03_MAT.dragonkoi_pulverizer.DragonKoi_Pulverizer_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet_DragonKoi_03_MAT.dragonkoi_pulverizer.DragonKoi_Pulverizer_3P_Pickup_MIC"))
|
||||
|
||||
//Standard Ion Sword
|
||||
Skins.Add((Id=7715, Weapondef=class'KFWeapDef_IonThruster', MIC_1P=("WEP_1P_Ion_Sword_MAT.Wep_1stP_Ion_Sword_MIC"), MIC_3P="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_MIC", MIC_Pickup="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_Pickup_MIC"))
|
||||
|
||||
//Dosh Royale Ion Sword
|
||||
Skins.Add((Id=7716, Weapondef=class'KFWeapDef_IonThruster', MIC_1P=("WEP_1P_Ion_Sword_MAT.Wep_1st_Ion_Sword_DoshRoyale_MIC"), MIC_3P="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_DoshRoyale_MIC", MIC_Pickup="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_DoshRoyale_Pickup_MIC"))
|
||||
|
||||
@ -2763,6 +2766,9 @@ defaultproperties
|
||||
//Shatter Ion Sword
|
||||
Skins.Add((Id=7720, Weapondef=class'KFWeapDef_IonThruster', MIC_1P=("WEP_1P_Ion_Sword_MAT.Wep_1st_Ion_Sword_Shatter_MIC"), MIC_3P="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_Shatter_MIC", MIC_Pickup="WEP_3P_Ion_Sword_MAT.Wep_3rdP_Ion_Sword_Shatter_Pickup_MIC"))
|
||||
|
||||
//Standard Chiappa Rhino
|
||||
Skins.Add((Id=7704, Weapondef=class'KFWeapDef_ChiappaRhino', MIC_1P=("wep_1p_chiapparhino_mat.WEP_1P_ChiappaRhino_MIC"), MIC_3P="WEP_3P_ChiappoRhino_MAT.WEP_3P_ChiappaRhino_MIC", MIC_Pickup="WEP_3P_ChiappoRhino_MAT.3P_Pickup_ChiappaRhino_MIC"))
|
||||
|
||||
//Dosh Royale Chiappa Rhino
|
||||
Skins.Add((Id=7705, Weapondef=class'KFWeapDef_ChiappaRhino', MIC_1P=("wep_1p_chiapparhino_mat.WEP_1P_ChiappaRhinos_DoshRoyale_MIC"), MIC_3P="WEP_3P_ChiappoRhino_MAT.WEP_3P_ChiappaRhino_DoshRoyale_MIC", MIC_Pickup="WEP_3P_ChiappoRhino_MAT.3P_Pickup_ChiappaRhino_DoshRoyale_MIC"))
|
||||
|
||||
@ -2798,6 +2804,26 @@ defaultproperties
|
||||
Skins.Add((Id=7796, Weapondef=class'KFWeapDef_MicrowaveRifle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_1P_FieldTested_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_3P_FieldTested_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_3P_Pickup_MIC"))
|
||||
Skins.Add((Id=7797, Weapondef=class'KFWeapDef_MicrowaveRifle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_1P_Mint_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_microwaveassault.Jaeger_MicrowaveAssault_3P_Pickup_MIC"))
|
||||
|
||||
//Jaeger Desert Eagle
|
||||
//BattleScarred
|
||||
Skins.Add((Id=7798, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_1P_BattleScarred_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_BattleScarred_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Pickup_MIC"))
|
||||
|
||||
//Field Tested
|
||||
Skins.Add((Id=7799, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_1P_FieldTested_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_FieldTested_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Pickup_MIC"))
|
||||
|
||||
//Mint
|
||||
Skins.Add((Id=7800, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Pickup_MIC"))
|
||||
|
||||
//Jaeger P90
|
||||
//BattleScarred
|
||||
Skins.Add((Id=7804, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet27_MAT.jaeger_p90.jaeger_P90_1P_BattleScarred_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_BattleScarred_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_Pickup_MIC"))
|
||||
|
||||
//Field Tested
|
||||
Skins.Add((Id=7805, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet27_MAT.jaeger_p90.jaeger_P90_1P_FieldTested_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_FieldTested_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_Pickup_MIC"))
|
||||
|
||||
//Mint
|
||||
Skins.Add((Id=7806, Weapondef=class'KFWeapDef_P90', MIC_1P=("WEP_SkinSet27_MAT.jaeger_p90.jaeger_P90_1P_Mint_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_p90.Jaeger_P90_3P_Pickup_MIC"))
|
||||
|
||||
//Jaeger Desert Eagle BattleScarred
|
||||
Skins.Add((Id=8031, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_1P_BattleScarred_MIC"), MIC_3P="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_BattleScarred_MIC", MIC_Pickup="WEP_SkinSet27_MAT.jaeger_deagle.Jaeger_Deagle_3P_Pickup_MIC"))
|
||||
|
||||
@ -3613,6 +3639,42 @@ defaultproperties
|
||||
//Doshinegun Koi Dream
|
||||
Skins.Add((Id=9276, Weapondef=class'KFWeapDef_Doshinegun', MIC_1P=("wep_skinset53_mat.Wep_Doshinegun_koidream_body_PM", "wep_skinset53_mat.Wep_Doshinegun_koidream_mag_PM"), MIC_3P="WEP_SkinSet53_MAT.Wep_Doshinegun_koidream_3P_PM", MIC_Pickup="WEP_SkinSet53_MAT.Wep_Doshinegun_koidream_3P_Pickup_MIC"));
|
||||
|
||||
//Sentinel Standard
|
||||
Skins.Add((Id=9284, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("wep_1p_autoturret_mat.Wep_1P_AutoTurret_MIC","Wep_1P_AutoTurret_MAT.Wep_1P_Remote_MIC"), MIC_3P="WEP_3P_AutoTurret_MAT.WEP_3P_AutoTurret_MIC", MIC_Pickup="wep_3p_autoturret_mat.3P_Pickup_AutoTurret_MIC"))
|
||||
|
||||
//Sentinel 1942
|
||||
Skins.Add((Id=9285, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_1942_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_1942_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_1942_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_1942_AutoTurrent_Pickup_MIC"))
|
||||
|
||||
//Sentinel Black Bird
|
||||
Skins.Add((Id=9286, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_BlackBird_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_BlackBird_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_BlackBird_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_BlackBird_AutoTurrent_Pickup_MIC"))
|
||||
|
||||
//Sentinel Hades
|
||||
Skins.Add((Id=9287, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_Hades_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_Hades_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_Hades_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_Hades_AutoTurrent_Pickup_MIC"))
|
||||
|
||||
//Sentinel Ice Storm
|
||||
Skins.Add((Id=9288, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_IceStorm_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_IceStorm_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_IceStorm_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_IceStorm_AutoTurrent_Pickup_MIC"))
|
||||
|
||||
//Sentinel Shock
|
||||
Skins.Add((Id=9289, Weapondef=class'KFWeapDef_AutoTurret', MIC_1P=("WEP_SkinSet54_MAT.Wep_1P_Shock_AutoTurret_MIC","WEP_SkinSet54_MAT.Wep_1P_Shock_Remote_MIC"), MIC_3P="wep_skinset54_mat.Wep_3P_Shock_AutoTurret_MIC", MIC_Pickup="wep_skinset54_mat.Wep_3P_Shock_AutoTurrent_Pickup_MIC"))
|
||||
|
||||
//Reducto Ray Standard
|
||||
Skins.Add((Id=9290, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_1p_shrinkray_gun_mat.Wep_1P_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_3p_shrinkray_gun_mat.WEP_3P_ShrinkRay_Gun_MIC", MIC_Pickup="wep_3p_shrinkray_gun_mat.3P_Pickup_ShrinkRay_Gun_MIC"))
|
||||
|
||||
//Reducto Ray Atomic Love
|
||||
Skins.Add((Id=9291, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_AtomicLove_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_AtomicLove_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_AtomicLove_ShrinkRay_Pickup_MIC"))
|
||||
|
||||
//Reducto Ray Destructor
|
||||
Skins.Add((Id=9292, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_Destructor_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_Destructor_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_Destructor_ShrinkRay_Pickup_MIC"))
|
||||
|
||||
//Reducto Ray Heavy Metal
|
||||
Skins.Add((Id=9293, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_HeavyMetal_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_HeavyMetal_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_HeavyMetal_ShrinkRay_Pickup_MIC"))
|
||||
|
||||
//Reducto Ray HellsFury
|
||||
Skins.Add((Id=9294, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_HellsFury_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_HellsFury_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_HellsFury_ShrinkRay_Pickup_MIC"))
|
||||
|
||||
//Reducto Ray Lucky Strike
|
||||
Skins.Add((Id=9295, Weapondef=class'KFWeapDef_ShrinkRayGun', MIC_1P=("wep_skinset55_mat.Wep_1P_LuckyStrike_ShrinkRay_Gun_MIC","WEP_1P_ShrinkRay_Gun_MAT.WEP_ShrinkRay_Glass_MIC"), MIC_3P="wep_skinset55_mat.Wep_3P_LuckyStrike_ShrinkRay_Gun_MIC", MIC_Pickup="wep_skinset55_mat.Wep_3P_LuckyStrike_ShrinkRay_Pickup_MIC"))
|
||||
|
||||
//BeyondHorizon AA12
|
||||
Skins.Add((Id=8845, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet43_MAT.space_aa12.Space_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet43_MAT.space_aa12.Space_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet43_MAT.space_aa12.Space_AA12_3P_Pickup_MIC"))
|
||||
|
||||
@ -3858,4 +3920,183 @@ defaultproperties
|
||||
|
||||
//XMas Sour Spitfire
|
||||
Skins.Add((Id=9217, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Flaregun', MIC_1P=("WEP_SkinSet52_MAT.sour_flaregun.Sour_FlareGun_1P_Mint_MIC"), MIC_3P="WEP_SkinSet52_MAT.sour_flaregun.Sour_FlareGun_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet52_MAT.sour_flaregun.Sour_FlareGun_3P_Pickup_MIC"))
|
||||
|
||||
//Neon Boomstick
|
||||
Skins.Add((Id=9335, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("wep_skinset56_mat.neon_doublebarrel.Neon_DoubleBarrel_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neon_doublebarrel.Neon_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neon_doublebarrel.Neon_DoubleBarrel_3P_Pickup_MIC"))
|
||||
|
||||
//Neon HZ12
|
||||
Skins.Add((Id=9336, Weapondef=class'KFWeapDef_HZ12', MIC_1P=("wep_skinset56_mat.neon_hz12.Neon_HZ12_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neon_hz12.Neon_HZ12_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neon_hz12.Neon_HZ12_3P_Pickup_MIC"))
|
||||
|
||||
//Neon HRG Beluga Beat
|
||||
Skins.Add((Id=9337, Weapondef=class'KFWeapDef_HRG_SonicGun', MIC_1P=("wep_skinset56_mat.neon_hrgsonicgun.Neon_HRGSonicGun_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neon_hrgsonicgun.Neon_HRGSonicGun_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neon_hrgsonicgun.Neon_HRGSonicGun_3P_Pickup_MIC"))
|
||||
|
||||
//Neon Zweihander
|
||||
Skins.Add((Id=9338, Weapondef=class'KFWeapDef_Zweihander', MIC_1P=("wep_skinset56_mat.neon_zweihander.Neon_Zweihander_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neon_zweihander.Neon_Zweihander_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neon_zweihander.Neon_Zweihander_3P_Pickup_MIC"))
|
||||
|
||||
//Neon RGB Boomstick
|
||||
Skins.Add((Id=9339, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("wep_skinset56_mat.neonrgb_doublebarrel.NeonRGB_DoubleBarrel_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neonrgb_doublebarrel.NeonRGB_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neonrgb_doublebarrel.NeonRGB_DoubleBarrel_3P_Pickup_MIC"))
|
||||
|
||||
//Neon RGB HZ12
|
||||
Skins.Add((Id=9340, Weapondef=class'KFWeapDef_HZ12', MIC_1P=("wep_skinset56_mat.neonrgb_hz12.NeonRGB_HZ12_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neonrgb_hz12.NeonRGB_HZ12_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neonrgb_hz12.NeonRGB_HZ12_3P_Pickup_MIC"))
|
||||
|
||||
//Neon RGB HRG Beluga Beat
|
||||
Skins.Add((Id=9341, Weapondef=class'KFWeapDef_HRG_SonicGun', MIC_1P=("wep_skinset56_mat.neonrgb_hrgsonicgun.NeonRGB_HRGSonicGun_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neonrgb_hrgsonicgun.NeonRGB_HRGSonicGun_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neonrgb_hrgsonicgun.NeonRGB_HRGSonicGun_3P_Pickup_MIC"))
|
||||
|
||||
//Neon RGB Zweihander
|
||||
Skins.Add((Id=9342, Weapondef=class'KFWeapDef_Zweihander', MIC_1P=("wep_skinset56_mat.neonrgb_zweihander.NeonRGB_Zweihander_1P_Mint_MIC"), MIC_3P="wep_skinset56_mat.neonrgb_zweihander.NeonRGB_Zweihander_3P_Mint_MIC", MIC_Pickup="wep_skinset56_mat.neonrgb_zweihander.NeonRGB_Zweihander_3P_Pickup_MIC"))
|
||||
|
||||
//Classic Mint 9MM
|
||||
Skins.Add((Id=9343, Weapondef=class'KFWeapDef_9mm', MIC_1P=("wep_skinset57_mat.classic_9mm.Classic_9MM_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.classic_9mm.Classic_9MM_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.classic_9mm.Classic_9MM_3P_Pickup_MIC"))
|
||||
|
||||
//Classic Mint AA12
|
||||
Skins.Add((Id=9344, Weapondef=class'KFWeapDef_AA12', MIC_1P=("wep_skinset57_mat.classic_aa12.Classic_AA12_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.classic_aa12.Classic_AA12_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.classic_aa12.Classic_AA12_3P_Pickup_MIC"))
|
||||
|
||||
//Classic Mint Boomstick
|
||||
Skins.Add((Id=9345, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("wep_skinset57_mat.classic_doublebarrel.Classic_DoubleBarrel_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.classic_doublebarrel.Classic_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.classic_doublebarrel.Classic_DoubleBarrel_3P_Pickup_MIC"))
|
||||
|
||||
//Classic Mint M1911
|
||||
Skins.Add((Id=9346, Weapondef=class'KFWeapDef_Colt1911', MIC_1P=("wep_skinset57_mat.classic_m1911.Classic_M1911_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.classic_m1911.Classic_M1911_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.classic_m1911.Classic_M1911_3P_Pickup_MIC"))
|
||||
|
||||
//Classic Precious 9MM
|
||||
Skins.Add((Id=9347, Weapondef=class'KFWeapDef_9mm', MIC_1P=("wep_skinset57_mat.standard_9mm.Standard_9MM_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.standard_9mm.Standard_9MM_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.standard_9mm.Standard_9MM_3P_Pickup_MIC"))
|
||||
|
||||
//Classic Precious AA12
|
||||
Skins.Add((Id=9348, Weapondef=class'KFWeapDef_AA12', MIC_1P=("wep_skinset57_mat.standard_aa12.Standard_AA12_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.standard_aa12.Standard_AA12_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.standard_aa12.Standard_AA12_3P_Pickup_MIC"))
|
||||
|
||||
//Classic Precious Boomstick
|
||||
Skins.Add((Id=9349, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("wep_skinset57_mat.standard_doublebarrel.Standard_DoubleBarrel_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.standard_doublebarrel.Standard_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.standard_doublebarrel.Standard_DoubleBarrel_3P_Pickup_MIC"))
|
||||
|
||||
//Classic Precious M1911
|
||||
Skins.Add((Id=9350, Weapondef=class'KFWeapDef_Colt1911', MIC_1P=("wep_skinset57_mat.standard_m1911.Standard_M1911_1P_Mint_MIC"), MIC_3P="wep_skinset57_mat.standard_m1911.Standard_M1911_3P_Mint_MIC", MIC_Pickup="wep_skinset57_mat.standard_m1911.Standard_M1911_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic Desert Eagle
|
||||
Skins.Add((Id=9351, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("wep_skinset58_mat.chameleon_deagle.Chameleon_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleon_deagle.Chameleon_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleon_deagle.Chameleon_Deagle_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic Katana
|
||||
Skins.Add((Id=9352, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Katana', MIC_1P=("wep_skinset58_mat.chameleon_katana.Chameleon_Katana_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleon_katana.Chameleon_Katana_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleon_katana.Chameleon_Katana_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic Kriss SMG
|
||||
Skins.Add((Id=9353, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Kriss', MIC_1P=("wep_skinset58_mat.chameleon_kriss.Chameleon_Kriss_1P_Mint_MIC", "wep_skinset58_mat.chameleon_kriss.Chameleon_Kriss_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleon_kriss.Chameleon_Kriss_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleon_kriss.Chameleon_Kriss_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic RPG-7
|
||||
Skins.Add((Id=9354, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("wep_skinset58_mat.chameleon_rpg7.Chameleon_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleon_rpg7.Chameleon_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleon_rpg7.Chameleon_RPG7_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic RGB Desert Eagle
|
||||
Skins.Add((Id=9355, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("wep_skinset58_mat.chameleonrgb_deagle.ChameleonRGB_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleonrgb_deagle.ChameleonRGB_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleonrgb_deagle.ChameleonRGB_Deagle_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic RGB Katana
|
||||
Skins.Add((Id=9356, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Katana', MIC_1P=("wep_skinset58_mat.chameleonrgb_katana.ChameleonRGB_Katana_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleonrgb_katana.ChameleonRGB_Katana_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleonrgb_katana.ChameleonRGB_Katana_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic RGB Kriss SMG
|
||||
Skins.Add((Id=9357, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Kriss', MIC_1P=("wep_skinset58_mat.chameleonrgb_kriss.ChameleonRGB_Kriss_1P_Mint_MIC", "wep_skinset58_mat.chameleonrgb_kriss.ChameleonRGB_Kriss_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleonrgb_kriss.ChameleonRGB_Kriss_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleonrgb_kriss.ChameleonRGB_Kriss_3P_Pickup_MIC"))
|
||||
|
||||
//Chameleon Dynamic RGB RPG-7
|
||||
Skins.Add((Id=9358, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("wep_skinset58_mat.chameleonrgb_rpg7.ChameleonRGB_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet58_MAT.chameleonrgb_rpg7.ChameleonRGB_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet58_MAT.chameleonrgb_rpg7.ChameleonRGB_RPG7_3P_Pickup_MIC"))
|
||||
//Deep Sea Antique AA12
|
||||
Skins.Add((Id=9298, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSea_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSea_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSea_AA12_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Aqua AA12
|
||||
Skins.Add((Id=9299, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaAqua_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaAqua_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaAqua_AA12_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Coral AA12
|
||||
Skins.Add((Id=9300, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaCoral_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaCoral_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaCoral_AA12_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Pearl AA12
|
||||
Skins.Add((Id=9301, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPearl_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPearl_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPearl_AA12_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Black Seal AA12
|
||||
Skins.Add((Id=9302, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaBlackSeal_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaBlackSeal_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaBlackSeal_AA12_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Precious AA12
|
||||
Skins.Add((Id=9303, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPrecious_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPrecious_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_aa12.DeepSeaPrecious_AA12_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Antique FN FAL
|
||||
Skins.Add((Id=9304, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSea_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSea_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSea_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSea_FNFAL_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Aqua FN FAL
|
||||
Skins.Add((Id=9305, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaAqua_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaAqua_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaAqua_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaAqua_FNFAL_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Coral FN FAL
|
||||
Skins.Add((Id=9306, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaCoral_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaCoral_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaCoral_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaCoral_FNFAL_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Pearl FN FAL
|
||||
Skins.Add((Id=9307, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPearl_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPearl_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPearl_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPearl_FNFAL_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Black Seal FN FAL
|
||||
Skins.Add((Id=9308, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaBlackSeal_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaBlackSeal_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaBlackSeal_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaBlackSeal_FNFAL_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Precious FN FAL
|
||||
Skins.Add((Id=9309, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_FNFAL', MIC_1P=("WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPrecious_FNFAL_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPrecious_FNFAL_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPrecious_FNFAL_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_fnfal.DeepSeaPrecious_FNFAL_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Antique M14EBR
|
||||
Skins.Add((Id=9310, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSea_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSea_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSea_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSea_M14EBR_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Aqua M14EBR
|
||||
Skins.Add((Id=9311, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaAqua_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaAqua_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaAqua_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaAqua_M14EBR_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Coral M14EBR
|
||||
Skins.Add((Id=9312, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaCoral_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaCoral_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaCoral_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaCoral_M14EBR_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Pearl M14EBR
|
||||
Skins.Add((Id=9313, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPearl_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPearl_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPearl_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPearl_M14EBR_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Black Seal M14EBR
|
||||
Skins.Add((Id=9314, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaBlackSeal_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaBlackSeal_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaBlackSeal_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaBlackSeal_M14EBR_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Precious M14EBR
|
||||
Skins.Add((Id=9315, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M14EBR', MIC_1P=("WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPrecious_M14EBR_1P_Mint_MIC", "WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPrecious_M14EBR_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPrecious_M14EBR_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_m14ebr.DeepSeaPrecious_M14EBR_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Antique MAC 10
|
||||
Skins.Add((Id=9316, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSea_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSea_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSea_MAC10_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Aqua MAC 10
|
||||
Skins.Add((Id=9317, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaAqua_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaAqua_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaAqua_MAC10_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Coral MAC 10
|
||||
Skins.Add((Id=9318, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaCoral_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaCoral_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaCoral_MAC10_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Pearl MAC 10
|
||||
Skins.Add((Id=9319, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPearl_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPearl_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPearl_MAC10_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Black Seal MAC 10
|
||||
Skins.Add((Id=9320, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaBlackSeal_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaBlackSeal_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaBlackSeal_MAC10_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Precious MAC 10
|
||||
Skins.Add((Id=9321, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Mac10', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPrecious_MAC10_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPrecious_MAC10_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mac10.DeepSeaPrecious_MAC10_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Antique MP5RAS
|
||||
Skins.Add((Id=9322, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSea_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSea_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSea_MP5RAS_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Aqua MP5RAS
|
||||
Skins.Add((Id=9323, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaAqua_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaAqua_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaAqua_MP5RAS_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Coral MP5RAS
|
||||
Skins.Add((Id=9324, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaCoral_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaCoral_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaCoral_MP5RAS_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Pearl MP5RAS
|
||||
Skins.Add((Id=9325, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPearl_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPearl_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPearl_MP5RAS_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Black Seal MP5RAS
|
||||
Skins.Add((Id=9326, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaBlackSeal_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaBlackSeal_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaBlackSeal_MP5RAS_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Precious MP5RAS
|
||||
Skins.Add((Id=9327, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MP5RAS', MIC_1P=("WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPrecious_MP5RAS_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPrecious_MP5RAS_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_mp5ras.DeepSeaPrecious_MP5RAS_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Antique RPG-7
|
||||
Skins.Add((Id=9328, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSea_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSea_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSea_RPG7_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Aqua RPG-7
|
||||
Skins.Add((Id=9329, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaAqua_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaAqua_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaAqua_RPG7_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Coral RPG-7
|
||||
Skins.Add((Id=9330, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaCoral_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaCoral_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaCoral_RPG7_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Pearl RPG-7
|
||||
Skins.Add((Id=9331, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPearl_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPearl_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPearl_RPG7_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Black Seal RPG-7
|
||||
Skins.Add((Id=9332, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaBlackSeal_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaBlackSeal_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaBlackSeal_RPG7_3P_Pickup_MIC"))
|
||||
|
||||
//Deep Sea Precious RPG-7
|
||||
Skins.Add((Id=9333, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPrecious_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPrecious_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet59_MAT.deepsea_rpg7.DeepSeaPrecious_RPG7_3P_Pickup_MIC"))
|
||||
}
|
@ -27,7 +27,7 @@ var localized array<string> ModifierDescriptions;
|
||||
cpptext
|
||||
{
|
||||
/** Num of Weekly events available */
|
||||
static const int NumWeeklyEvents = 16;
|
||||
static const int NumWeeklyEvents = 17;
|
||||
}
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -156,4 +156,5 @@ const STATID_ACHIEVE_Dystopia2029Collectibles = 4058;
|
||||
const STATID_ACHIEVE_MoonbaseCollectibles = 4059;
|
||||
const STATID_ACHIEVE_NetherholdCollectibles = 4060;
|
||||
const STATID_ACHIEVE_CarillonHamletCollectibles = 4061;
|
||||
const STATID_ACHIEVE_RigCollectibles = 4062;
|
||||
/** `endif */
|
||||
|
@ -74,3 +74,5 @@ const KFID_GamepadDeadzoneScale = 175;
|
||||
const KFID_GamepadAccelerationJumpScale = 176;
|
||||
const KFID_HasTabbedToStore = 177;
|
||||
const KFID_AllowSwapTo9mm = 178; // Halloween 2021 QoL: added option to quick switch weapons to 9mm
|
||||
const KFID_SurvivalStartingWeapIdx=179; // Summer 2022 QoL: added option to choose starting weapon for survival perk
|
||||
const KFID_SurvivalStartingGrenIdx=180; // Summer 2022 QoL: added option to choose starting grenade for survival perk
|
||||
|
27
KFGameContent/Classes/KFDT_Ballistic_AutoTurret.uc
Normal file
27
KFGameContent/Classes/KFDT_Ballistic_AutoTurret.uc
Normal 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'
|
||||
}
|
67
KFGameContent/Classes/KFDT_Blast_HRG_CranialPopper.uc
Normal file
67
KFGameContent/Classes/KFDT_Blast_HRG_CranialPopper.uc
Normal 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'
|
||||
}
|
16
KFGameContent/Classes/KFDT_Bludgeon_AutoTurret.uc
Normal file
16
KFGameContent/Classes/KFDT_Bludgeon_AutoTurret.uc
Normal 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'
|
||||
}
|
16
KFGameContent/Classes/KFDT_Bludgeon_HRG_CranialPopper.uc
Normal file
16
KFGameContent/Classes/KFDT_Bludgeon_HRG_CranialPopper.uc
Normal 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'
|
||||
}
|
16
KFGameContent/Classes/KFDT_Bludgeon_HRG_Crossboom.uc
Normal file
16
KFGameContent/Classes/KFDT_Bludgeon_HRG_Crossboom.uc
Normal 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'
|
||||
}
|
16
KFGameContent/Classes/KFDT_Bludgeon_ShrinkRay.uc
Normal file
16
KFGameContent/Classes/KFDT_Bludgeon_ShrinkRay.uc
Normal 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
Loading…
Reference in New Issue
Block a user