2020-12-13 15:01:13 +00:00
//=============================================================================
// KFPerk_SWAT
//=============================================================================
// Class Description
//=============================================================================
// Killing Floor 2
// Copyright (C) 2016 Tripwire Interactive LLC
// - Chris "schneidzekk" Schneider
//=============================================================================
class KFPerk _SWAT extends KFPerk
native ;
//`include(KFOnlineStats.uci)
/** Passives */
var private const PerkSkill WeaponDamage ; // 1% increased Perk weapon damage per level (max 25%)
var private const PerkSkill BulletResistance ;
var private const PerkSkill MagSize ;
var private const PerkSkill WeaponSwitchSpeed ;
var private const float RapidAssaultFiringRate ; // Faster firing rate in % NOTE:This is needed for combinations with the Skill: RapidAssault (Stumble Power and Rate)
var private const float SnarePower ;
var private const float TacticalMovementBobDamp ;
var private const class < KFWeaponDefinition > BackupSecondaryWeaponDef ;
2021-09-02 21:46:08 +00:00
var private const float TacticalMovementModifier ; // QoL: Tactical movement - Added modifier to move and sprint speed.
2020-12-13 15:01:13 +00:00
/** Percentage of how much armor should be damaged when the heavy armor skill is active */
var private const float HeavyArmorAbsorptionPct ;
var float CurrentHealthPenalty ;
/** Amount of damage Battering Ram bumps deal */
var int BumpDamageAmount ;
/** Damage type used for Battering Ram bump damage */
var class < DamageType > BumpDamageType ;
/** Amount of momentum when bumping zeds */
var float BumpMomentum ;
/** Multiplier for speed during zed time while enforcer is active*/
var float SWATEnforcerZedTimeSpeedScale ;
/** The last time a zed was bumped using battering ram */
var float LastBumpTime ;
/** The unique list of actors that have been bumped before the last cooldown reset */
var array < Actor > CurrentBumpedActors ;
/** The amount of time between when the last actor was bumped and another actor can be bumped again */
var float BumpCooldown ;
/** Selectable skills */
enum ESWATPerkSkills
{
ESWAT _HeavyArmor ,
ESWAT _TacticalMovement ,
ESWAT _Backup ,
ESWAT _TacticalReload ,
ESWAT _SpecialAmmunition ,
ESWAT _AmmoVest ,
ESWAT _BodyArmor ,
ESWAT _Cripple ,
ESWAT _SWATEnforcer ,
ESWAT _RapidAssault
} ;
replication
{
if ( bNetDirty )
CurrentHealthPenalty ;
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* @ name Perk init and spawning
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/** On spawn, modify owning pawn based on perk selection */
function SetPlayerDefaults ( Pawn PlayerPawn )
{
local float NewArmor ;
super . SetPlayerDefaults ( PlayerPawn ) ;
if ( OwnerPawn . Role == ROLE _Authority )
{
if ( IsHeavyArmorActive ( ) )
{
NewArmor += OwnerPawn . default . MaxArmor * GetSKillValue ( PerkSkills [ ESWAT _HeavyArmor ] ) ;
}
if ( IsBodyArmorActive ( ) )
{
NewArmor += OwnerPawn . default . MaxArmor * GetSKillValue ( PerkSkills [ ESWAT _BodyArmor ] ) ;
}
OwnerPawn . AddArmor ( Round ( NewArmor ) ) ;
}
}
/** (Server) Modify Instigator settings based on selected perk */
function ApplySkillsToPawn ( )
{
super . ApplySkillsToPawn ( ) ;
if ( OwnerPawn != none )
{
OwnerPawn . bMovesFastInZedTime = IsSWATEnforcerActive ( ) ;
}
}
simulated event float GetZedTimeSpeedScale ( )
{
return IsSWATEnforcerActive ( ) ? SWATEnforcerZedTimeSpeedScale : 1. f ;
}
/* Returns the secondary weapon's class path for this perk */
simulated function string GetSecondaryWeaponClassPath ( )
{
return IsBackupActive ( ) ? BackupSecondaryWeaponDef . default . WeaponClassPath : SecondaryWeaponDef . default . WeaponClassPath ;
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* @ name Passives
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ * *
* @ brief Modifies the damage taken
*
* @ param InDamage damage
* @ param DamageType the damage type used ( optional )
* /
function ModifyDamageTaken ( out int InDamage , optional class < DamageType > DamageType , optional Controller InstigatedBy )
{
local float TempDamage ;
if ( InDamage <= 0 )
{
return ;
}
TempDamage = InDamage ;
if ( ClassIsChildOf ( DamageType , class 'KFDT_Ballistic' ) )
{
TempDamage -= InDamage * GetPassiveValue ( BulletResistance , CurrentLevel ) ;
}
` QALog( "Total DamageResistance" @ DamageType @ GetPercentage( InDamage, Round( TempDamage ) ) @ "Start/End" @ InDamage @ Round( TempDamage ), bLogPerk );
InDamage = Round ( TempDamage ) ;
}
/ * *
* @ brief Modifies mag capacity and count
*
* @ param KFW the weapon
* @ param MagazineCapacity modified mag capacity
* @ param WeaponPerkClass the weapon ' s associated perk class ( optional )
* /
simulated function ModifyMagSizeAndNumber ( KFWeapon KFW , out int MagazineCapacity , optional array < Class < KFPerk > > WeaponPerkClass , optional bool bSecondary = false , optional name WeaponClassname )
{
local float TempCapacity ;
TempCapacity = MagazineCapacity ;
if ( ! bSecondary && ! Is9mm ( KFW ) && IsWeaponOnPerk ( KFW , WeaponPerkClass , self . class ) && ( KFW == none || ! KFW . bNoMagazine ) )
{
TempCapacity += MagazineCapacity * GetPassiveValue ( MagSize , CurrentLevel ) ;
}
MagazineCapacity = Round ( TempCapacity ) ;
}
/ * *
* @ brief The Quick Switch skill modifies the weapon switch speed
*
* @ param ModifiedSwitchTime Duration of putting down or equipping the weapon
* /
simulated function ModifyWeaponSwitchTime ( out float ModifiedSwitchTime )
{
` QALog( "(Passive Weapon Switch) Increase:" @ GetPercentage( ModifiedSwitchTime, ModifiedSwitchTime * (1.f - GetPassiveValue(WeaponSwitchSpeed, CurrentLevel)) ), bLogPerk );
ModifiedSwitchTime *= 1. f - GetPassiveValue ( WeaponSwitchSpeed , CurrentLevel ) ;
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* @ name Selectable skills functions
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ * *
* @ brief Checks if the player can be grabbed by clots
*
* @ return true if we are not grabbable
* /
function bool CanNotBeGrabbed ( )
{
return IsHeavyArmorActive ( ) ;
}
simulated function bool HasHeavyArmor ( )
{
return IsHeavyArmorActive ( ) ;
}
2022-03-29 17:30:25 +00:00
static simulated public function bool Is9mm ( KFWeapon KFW )
2020-12-13 15:01:13 +00:00
{
return KFW != none && KFW . default . bIsBackupWeapon && ! KFW . IsMeleeWeapon ( ) ;
}
/ * *
* @ brief The Tactical Movement skill lets you move quicker in iron sights
*
* @ param KFW Weapon equipped
* @ return Speed modifier
* /
simulated event float GetIronSightSpeedModifier ( KFWeapon KFW )
{
2021-03-02 11:56:51 +00:00
if ( IsTacticalMovementActive ( ) && ( Is9mm ( KFW ) || IsDual9mm ( KFW ) || IsWeaponOnPerk ( KFW , , self . class ) ) )
2020-12-13 15:01:13 +00:00
{
` QALog( "Tactical Movement Mod:" @ KFW @ GetSkillValue( PerkSkills[ESWAT_TacticalMovement] ),bLogPerk );
return GetSkillValue ( PerkSkills [ ESWAT _TacticalMovement ] ) ;
}
return 1. f ;
}
/ * *
* @ brief Triggered via KFPawn _Human . UpdateGroundSpeed . Update any speed - related variables that need to be set when
* the pawn ' s allowed ground speed changes .
* /
function FinalizeSpeedVariables ( )
{
super . FinalizeSpeedVariables ( ) ;
if ( OwnerPawn != none )
{
CurrentHealthPenalty = 1 - OwnerPawn . LowHealthSpeedPenalty ;
}
}
/ * *
* @ brief The Tactical Movement skill lets you move quicker in iron sights
*
* @ param KFW Weapon equipped
* @ return Speed modifier
* /
simulated event float GetCrouchSpeedModifier ( KFWeapon KFW )
{
2021-03-02 11:56:51 +00:00
if ( IsTacticalMovementActive ( ) && ( Is9mm ( KFW ) || IsDual9mm ( KFW ) || IsWeaponOnPerk ( KFW , , self . class ) ) )
2020-12-13 15:01:13 +00:00
{
` QALog( "Tactical Movement Mod:" @ KFW @ GetSkillValue( PerkSkills[ESWAT_TacticalMovement] ),bLogPerk );
return GetSkillValue ( PerkSkills [ ESWAT _TacticalMovement ] ) * CurrentHealthPenalty ;
}
return 1. f ;
}
simulated function ModifyWeaponBopDamping ( out float BobDamping , KFWeapon PawnWeapon )
{
If ( IsTacticalMovementActive ( ) && ( Is9mm ( PawnWeapon ) || IsWeaponOnPerk ( PawnWeapon , , self . class ) ) )
{
BobDamping *= default . TacticalMovementBobDamp ;
}
}
/ * *
* @ brief Modifies the damage dealt
*
* @ param InDamage damage
* @ param DamageCauser weapon or projectile ( optional )
* @ param MyKFPM the zed damaged ( optional )
* @ param DamageInstigator responsible controller ( optional )
* @ param class DamageType the damage type used ( optional )
* /
simulated function ModifyDamageGiven ( out int InDamage , optional Actor DamageCauser , optional KFPawn _Monster MyKFPM , optional KFPlayerController DamageInstigator , optional class < KFDamageType > DamageType , optional int HitZoneIdx )
{
local KFWeapon KFW ;
local float TempDamage ;
TempDamage = InDamage ;
if ( DamageCauser != none )
{
KFW = GetWeaponFromDamageCauser ( DamageCauser ) ;
}
if ( KFW != none )
{
2021-12-09 16:33:06 +00:00
// KFDT_Bludgeon_Doshinegun_Shot is a special case of Bludgeon damage that doesn't apply this mod.
2022-11-27 21:49:25 +00:00
if ( IsBackupActive ( ) && ( IsBackupWeapon ( KFW ) || IsDual9mm ( KFW ) || ShouldAffectBackupToDamage ( KFW , DamageType ) ) )
2020-12-13 15:01:13 +00:00
{
` QALog( "Backup Damage" @ KFW @ GetPercentage( InDamage, InDamage * GetSkillValue(PerkSkills[ESWAT_Backup])), bLogPerk );
TempDamage += InDamage * GetSkillValue ( PerkSkills [ ESWAT _Backup ] ) ;
}
else if ( IsWeaponOnPerk ( KFW , , self . class ) || ( DamageType != none && IsDamageTypeOnPerk ( DamageType ) ) )
{
` QALog( "Passive Damage" @KFW @ GetPercentage( InDamage, InDamage * GetPassiveValue(WeaponDamage, CurrentLevel)), bLogPerk );
TempDamage *= GetPassiveValue ( WeaponDamage , CurrentLevel ) ;
}
}
` QALog( "Total Damage Given" @ DamageType @ KFW @ GetPercentage( InDamage, Round(TempDamage) ), bLogPerk );
InDamage = Round ( TempDamage ) ;
}
2022-11-27 21:49:25 +00:00
/ * *
Check whether the damage and weapon are valid for the Backup skill :
Doshinegun and HRGBallisticBouncer have bludgeon projectiles that shouldn ' t get their damage modified
* /
simulated function bool ShouldAffectBackupToDamage ( KFWeapon KFW , class < KFDamageType > DamageType )
{
if ( ! ClassIsChildOf ( DamageType , class 'KFDT_Bludgeon' ) )
{
return false ;
}
if ( IsDoshinegun ( KFW ) )
{
return DamageType . Name != 'KFDT_Bludgeon_Doshinegun_Shot' ;
}
else if ( IsHRGBallisticBouncer ( KFW ) )
{
return DamageType . Name != 'KFDT_Bludgeon_HRG_BallisticBouncer_Shot' ;
}
return true ;
}
2020-12-13 15:01:13 +00:00
/ * *
* @ brief Modifies the max spare ammo
*
* @ param KFW The weapon
* @ param MaxSpareAmmo ammo amount
* @ param TraderItem the weapon ' s associated trader item info
* /
simulated function ModifyMaxSpareAmmoAmount ( KFWeapon KFW , out int MaxSpareAmmo , optional const out STraderItem TraderItem , optional bool bSecondary = false )
{
local float TempMaxSpareAmmoAmount ;
if ( IsAmmoVestActive ( ) && ! Is9mm ( KFW ) && IsWeaponOnPerk ( KFW , TraderItem . AssociatedPerkClasses , self . class ) )
{
TempMaxSpareAmmoAmount = MaxSpareAmmo ;
TempMaxSpareAmmoAmount += MaxSpareAmmo * GetSkillValue ( PerkSkills [ ESWAT _AmmoVest ] ) ;
MaxSpareAmmo = Round ( TempMaxSpareAmmoAmount ) ;
}
}
simulated function float GetSnareSpeedModifier ( )
{
return IsCrippleActive ( ) ? default . PerkSkills [ ESWAT _Cripple ] . StartingValue : 1. f ;
}
simulated function float GetSnarePowerModifier ( optional class < DamageType > DamageType , optional byte HitZoneIdx )
{
if ( IsCrippleActive ( ) && DamageType != none && IsDamageTypeOnPerk ( class < KFDamageType > ( DamageType ) ) )
{
return default . SnarePower ;
}
return 0. f ;
}
/ * *
* @ brief Modifies the pawn ' s MaxArmor
*
* @ param MaxArmor the maximum armor value
* /
function ModifyArmor ( out byte MaxArmor )
{
local float TempArmor ;
if ( IsBodyArmorActive ( ) )
{
TempArmor = MaxArmor ;
TempArmor += TempArmor * GetSkillValue ( PerkSkills [ ESWAT _BodyArmor ] ) ;
` QALog( "Modify MaxArmor" @ GetPercentage( MaxArmor, FCeil( TempArmor )), bLogPerk );
MaxArmor = Round ( TempArmor ) ;
}
}
/ * *
* @ brief Skills can modify the zed time time delation
*
* @ param StateName used weapon ' s state
* @ return time dilation modifier
* /
simulated function float GetZedTimeModifier ( KFWeapon W )
{
local name StateName ;
StateName = W . GetStateName ( ) ;
2021-03-02 11:56:51 +00:00
if ( IsRapidAssaultActive ( ) && ( Is9mm ( W ) || IsWeaponOnPerk ( W , , self . class ) || IsDual9mm ( W ) ) )
2020-12-13 15:01:13 +00:00
{
if ( ZedTimeModifyingStates . Find ( StateName ) != INDEX _NONE )
{
` QALog( "Rapid Assault Modifier" @ StateName @ RapidAssaultFiringRate, bLogPerk );
return RapidAssaultFiringRate ;
}
}
return 0. f ;
}
/ * *
* @ brief skills and weapons can modify the stumbling power
* @ return stumbling power modifier
* /
function float GetStumblePowerModifier ( optional KFPawn KFP , optional class < KFDamageType > DamageType , optional out float CooldownModifier , optional byte BodyPart )
{
local KFWeapon KFW ;
local float StumbleModifier ;
StumbleModifier = 0. f ;
KFW = GetOwnerWeapon ( ) ;
2021-03-02 11:56:51 +00:00
if ( IsSpecialAmmunitionActive ( ) && ( Is9mm ( KFW ) || IsDual9mm ( KFW ) || IsWeaponOnPerk ( KFW , , self . class ) ) )
2020-12-13 15:01:13 +00:00
{
StumbleModifier += GetSkillValue ( PerkSkills [ ESWAT _SpecialAmmunition ] ) ;
` QALog( "Special Ammunition Modifier" @ GetSkillValue( PerkSkills[ESWAT_SpecialAmmunition] ), bLogPerk );
}
if ( IsRapidAssaultActive ( ) )
{
StumbleModifier += GetSkillValue ( PerkSkills [ ESWAT _RapidAssault ] ) ;
` QALog( "Rapid Assault Modifier" @ GetSkillValue( PerkSkills[ESWAT_RapidAssault] ), bLogPerk );
}
return StumbleModifier ;
}
/ * *
* @ brief Checks if Rapid Assault is selected and if the weapon is on perk
*
* @ param KFW Weapon used
* @ return true or false
* /
simulated function bool GetIsUberAmmoActive ( KFWeapon KFW )
{
2021-03-02 11:56:51 +00:00
return IsRapidAssaultActive ( ) && ( Is9mm ( KFW ) || IsWeaponOnPerk ( KFW , , self . class ) || IsDual9mm ( KFW ) ) ;
2020-12-13 15:01:13 +00:00
}
simulated function bool ShouldKnockDownOnBump ( )
{
return IsSWATEnforcerActive ( ) && WorldInfo . TimeDilation < 1. f ;
}
simulated function OnBump ( Actor BumpedActor , KFPawn _Human BumpInstigator , vector BumpedVelocity , rotator BumpedRotation )
{
local KFPawn _Monster KFPM ;
local bool CanBump ;
if ( ShouldKnockDownOnBump ( ) && Normal ( BumpedVelocity ) dot Vector ( BumpedRotation ) > 0.7 f )
{
KFPM = KFPawn _Monster ( BumpedActor ) ;
if ( KFPM != none )
{
// cooldown so that the same zed can't be bumped multiple frames back to back
// especially relevant if they can't be knocked down or stumbled so the player is always bumping them
if ( WorldInfo . TimeSeconds - LastBumpTime > BumpCooldown )
{
CurrentBumpedActors . length = 0 ;
CurrentBumpedActors . AddItem ( BumpedActor ) ;
CanBump = true ;
}
// if still within the cooldown time, can still bump the actor as long as it hasn't been bumped yet
else if ( CurrentBumpedActors . Find ( BumpedActor ) == INDEX _NONE )
{
CurrentBumpedActors . AddItem ( BumpedActor ) ;
CanBump = true ;
}
LastBumpTime = WorldInfo . TimeSeconds ;
if ( CanBump )
{
if ( KFPM . IsHeadless ( ) )
{
KFPM . TakeDamage ( KFPM . HealthMax , BumpInstigator . Controller , BumpInstigator . Location ,
Normal ( vector ( BumpedRotation ) ) * BumpMomentum , BumpDamageType ) ;
}
else
{
KFPM . TakeDamage ( BumpDamageAmount , BumpInstigator . Controller , BumpInstigator . Location ,
Normal ( vector ( BumpedRotation ) ) * BumpMomentum , BumpDamageType ) ;
KFPM . Knockdown ( BumpedVelocity * 3 , vect ( 1 , 1 , 1 ) , KFPM . Location , 1000 , 100 ) ;
}
}
}
}
}
simulated function int GetArmorDamageAmount ( int AbsorbedAmt )
{
if ( HasHeavyArmor ( ) )
{
return Max ( Round ( AbsorbedAmt * HeavyArmorAbsorptionPct ) , 1 ) ;
}
return AbsorbedAmt ;
}
2021-09-02 21:46:08 +00:00
/ * *
* @ brief Weapons and perk skills can affect the jog / sprint speed
*
* @ param Speed jog speed
* /
simulated function ModifySpeed ( out float Speed )
{
local KFWeapon MyKFWeapon ;
local KFInventoryManager KFIM ;
if ( ! IsTacticalMovementActive ( ) )
{
return ;
}
MyKFWeapon = GetOwnerWeapon ( ) ;
if ( MyKFWeapon == none && CheckOwnerPawn ( ) )
{
KFIM = KFInventoryManager ( OwnerPawn . InvManager ) ;
if ( KFIM != none && KFIM . PendingWeapon != none )
{
MyKFWeapon = KFWeapon ( KFIM . PendingWeapon ) ;
}
}
if ( MyKFWeapon != none && ( Is9mm ( MyKFWeapon ) || IsDual9mm ( MyKFWeapon ) || IsWeaponOnPerk ( MyKFWeapon , , self . class ) ) )
{
Speed += Speed * TacticalMovementModifier ;
}
}
/ * *
* @ brief Weapons and perk skills can affect the jog / sprint speed
*
* @ param Speed sprint speed
* /
simulated function ModifySprintSpeed ( out float Speed )
{
local KFWeapon MyKFWeapon ;
local KFInventoryManager KFIM ;
if ( ! IsTacticalMovementActive ( ) )
{
return ;
}
MyKFWeapon = GetOwnerWeapon ( ) ;
if ( MyKFWeapon == none && CheckOwnerPawn ( ) )
{
KFIM = KFInventoryManager ( OwnerPawn . InvManager ) ;
if ( KFIM != none && KFIM . PendingWeapon != none )
{
MyKFWeapon = KFWeapon ( KFIM . PendingWeapon ) ;
}
}
if ( MyKFWeapon != none && ( Is9mm ( MyKFWeapon ) || IsDual9mm ( MyKFWeapon ) || IsWeaponOnPerk ( MyKFWeapon , , self . class ) ) )
{
Speed += Speed * TacticalMovementModifier ;
}
}
2020-12-13 15:01:13 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* @ name Getters etc
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ * *
* @ brief Checks if the Riot Shield skill is active
*
* @ return true / false
* /
simulated function bool IsHeavyArmorActive ( )
{
return PerkSkills [ ESWAT _HeavyArmor ] . bActive && IsPerkLevelAllowed ( ESWAT _HeavyArmor ) ;
}
/ * *
* @ brief Checks if the Tactical Movement skill is active
*
* @ return true / false
* /
simulated function bool IsTacticalMovementActive ( )
{
return PerkSkills [ ESWAT _TacticalMovement ] . bActive && IsPerkLevelAllowed ( ESWAT _TacticalMovement ) ;
}
/ * *
* @ brief Checks if backup damage skill is active
*
* @ return true / false
* /
simulated private function bool IsBackupActive ( )
{
return PerkSkills [ ESWAT _Backup ] . bActive && IsPerkLevelAllowed ( ESWAT _Backup ) ;
}
/ * *
* @ brief Checks if tactical reload skill is active ( client & server )
*
* @ return true / false
* /
simulated private function bool IsTacticalReloadActive ( )
{
return PerkSkills [ ESWAT _TacticalReload ] . bActive && IsPerkLevelAllowed ( ESWAT _TacticalReload ) ;
}
/ * *
* @ brief Should the tactical reload skill adjust the reload speed
*
* @ param KFW weapon in use
* @ return true / false
* /
simulated function bool GetUsingTactialReload ( KFWeapon KFW )
{
2021-03-02 11:56:51 +00:00
return ( IsTacticalReloadActive ( ) && ( Is9mm ( KFW ) || IsDual9mm ( KFW ) || IsWeaponOnPerk ( KFW , , self . class ) ) ) ;
2020-12-13 15:01:13 +00:00
}
/ * *
* @ brief Checks if Special Ammunition skill is active
*
* @ return true / false
* /
simulated function bool IsSpecialAmmunitionActive ( )
{
return PerkSkills [ ESWAT _SpecialAmmunition ] . bActive && IsPerkLevelAllowed ( ESWAT _SpecialAmmunition ) ;
}
/ * *
* @ brief Checks if Ammo Vest skill is active
*
* @ return true / false
* /
final simulated private function bool IsAmmoVestActive ( )
{
return PerkSkills [ ESWAT _AmmoVest ] . bActive && IsPerkLevelAllowed ( ESWAT _AmmoVest ) ;
}
/ * *
* @ brief Checks if Body Armor skill is active
*
* @ return true / false
* /
final private function bool IsBodyArmorActive ( )
{
return PerkSkills [ ESWAT _BodyArmor ] . bActive && IsPerkLevelAllowed ( ESWAT _BodyArmor ) ;
}
/ * *
* @ brief Checks if the Cripple skill is active
*
* @ return true / false
* /
final private function bool IsCrippleActive ( )
{
return PerkSkills [ ESWAT _Cripple ] . bActive && IsPerkLevelAllowed ( ESWAT _Cripple ) ;
}
/ * *
* @ brief Menace and Spartan resist zed time . You move at normal speed .
*
* @ return true if Menace or Spartan are active
* /
function bool IsSWATEnforcerActive ( )
{
return PerkSkills [ ESWAT _SWATEnforcer ] . bActive && IsPerkLevelAllowed ( ESWAT _SWATEnforcer ) ;
}
/ * *
* @ brief Rapid Assault resists zed time . You shoot at normal speed .
*
* @ return true if Menace or Spartan are active
* /
simulated function bool IsRapidAssaultActive ( )
{
return PerkSkills [ ESWAT _RapidAssault ] . bActive && WorldInfo . TimeDilation < 1. f && IsPerkLevelAllowed ( ESWAT _RapidAssault ) ;
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* @ name Hud / UI / Stats / Exp
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ * *
* @ brief how much XP is earned by a stalker kill depending on the game ' s difficulty
*
* @ param Difficulty current game difficulty
* @ return XP earned
* /
simulated static function int GetClotKillXP ( byte Difficulty )
{
return default . SecondaryXPModifier [ Difficulty ] ;
}
simulated static function GetPassiveStrings ( out array < string > PassiveValues , out array < string > Increments , byte Level )
{
PassiveValues [ 0 ] = Round ( GetPassiveValue ( default . WeaponDamage , Level ) * 100 - 100 ) $ "%" ;
PassiveValues [ 1 ] = Round ( GetPassiveValue ( default . BulletResistance , Level ) * 100 ) $ "%" ;
PassiveValues [ 2 ] = Round ( GetPassiveValue ( default . MagSize , Level ) * 100 ) $ "%" ; // Divide by 100 to convert unreal units to meters
PassiveValues [ 3 ] = Round ( GetPassiveValue ( default . WeaponSwitchSpeed , Level ) * 100 ) $ "%" ;
PassiveValues [ 4 ] = "" ;
Increments [ 0 ] = "[" @ Left ( string ( default . WeaponDamage . Increment * 100 ) , InStr ( string ( default . WeaponDamage . Increment * 100 ) , "." ) + 2 ) $ "% /" @ default . LevelString @ "]" ;
Increments [ 1 ] = "[" @ "5% +" @ Round ( default . BulletResistance . Increment * 100 ) $ "% /" @ default . LevelString @ "]" ;
Increments [ 2 ] = "[" @ Round ( default . MagSize . Increment * 100 ) $ "% /" @ default . LevelString @ "]" ;
Increments [ 3 ] = "[" @ Round ( default . WeaponSwitchSpeed . Increment * 100 ) $ "% /" @ default . LevelString @ "]" ;
Increments [ 4 ] = "" ;
}
DefaultProperties
{
PerkIcon = Texture2D 'UI_PerkIcons_TEX.UI_PerkIcon_SWAT'
PrimaryWeaponDef = class 'KFWeapDef_MP7'
BackupSecondaryWeaponDef = class 'KFWeapDef_9mmDual'
KnifeWeaponDef = class 'KFweapDef_Knife_SWAT'
GrenadeWeaponDef = class 'KFWeapDef_Grenade_SWAT'
ProgressStatID = STATID _Swat _Progress
PerkBuildStatID = STATID _Swat _Build
// Skill tracking
HitAccuracyHandicap = 0.0
HeadshotAccuracyHandicap = - 3.0
// Prestige Rewards
PrestigeRewardItemIconPaths [ 0 ] = "WEP_SkinSet_Prestige01_Item_TEX.knives.SWATKnife_PrestigePrecious_Mint_large"
PrestigeRewardItemIconPaths [ 1 ] = "WEP_SkinSet_Prestige02_Item_TEX.tier01.MP7_PrestigePrecious_Mint_large"
PrestigeRewardItemIconPaths [ 2 ] = "WEP_skinset_prestige03_itemtex.tier02.MP5RAS_PrestigePrecious_Mint_large"
PrestigeRewardItemIconPaths [ 3 ] = "wep_skinset_prestige04_itemtex.tier03.HecklerKochUMP_PrestigePrecious_Mint_large"
PrestigeRewardItemIconPaths [ 4 ] = "WEP_SkinSet_Prestige05_Item_TEX.tier04.KrissSMG_PrestigePrecious_Mint_large"
TacticalMovementBobDamp = 1.11
RapidAssaultFiringRate = 0.51 f
SnarePower = 15 //20
WeaponDamage = ( Name = "Weapon Damage" , Increment = 0.01 f , Rank = 0 , StartingValue = 1. f , MaxValue = 1.25 ) //1.25
BulletResistance = ( Name = "Bullet Resistance" , Increment = 0.01 , Rank = 0 , StartingValue = 0.05 , MaxValue = 0.3 f )
MagSize = ( Name = "Increased Mag Size" , Increment = 0.04 , Rank = 0 , StartingValue = 0. f , MaxValue = 1. f )
WeaponSwitchSpeed = ( Name = "Weapon Switch Speed" , Increment = 0.01 , Rank = 0 , StartingValue = 0. f , MaxValue = 0.25 )
HeavyArmorAbsorptionPct = 0.65 f
PerkSkills ( ESWAT _HeavyArmor ) = ( Name = "HeavyArmor" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_HeavyArmor" , Increment = 0. f , Rank = 0 , StartingValue = 0.5 f , MaxValue = 0.5 f ) //0.1
PerkSkills ( ESWAT _TacticalMovement ) = ( Name = "TacticalMovement" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_TacticalMovement" , Increment = 0. f , Rank = 0 , StartingValue = 2.5 f , MaxValue = 2.5 f )
2021-09-02 21:46:08 +00:00
PerkSkills ( ESWAT _Backup ) = ( Name = "Backup" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_Backup" , Increment = 0. f , Rank = 0 , StartingValue = 1.0 f , MaxValue = 1.0 f ) //0.85f
2020-12-13 15:01:13 +00:00
PerkSkills ( ESWAT _TacticalReload ) = ( Name = "TacticalReload" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_TacticalReload" , Increment = 0. f , Rank = 0 , StartingValue = 2.0 , MaxValue = 2.0 )
PerkSkills ( ESWAT _SpecialAmmunition ) = ( Name = "SpecialAmmunition" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_SpecialAmmunition" , Increment = 0. f , Rank = 0 , StartingValue = 2.0 f , MaxValue = 2.0 f )
PerkSkills ( ESWAT _AmmoVest ) = ( Name = "AmmoVest" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_AmmoVest" , Increment = 0. f , Rank = 0 , StartingValue = 0.3 f , MaxValue = 0.3 f )
PerkSkills ( ESWAT _BodyArmor ) = ( Name = "BodyArmor" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_BodyArmor" , Increment = 0. f , Rank = 0 , StartingValue = 0.5 f , MaxValue = 0.5 f )
PerkSkills ( ESWAT _Cripple ) = ( Name = "Cripple" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_Cripple" , Increment = 0. f , Rank = 0 , StartingValue = 0.7 f , MaxValue = 0.7 f )
PerkSkills ( ESWAT _SWATEnforcer ) = ( Name = "SWATEnforcer" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_SWATEnforcer" , Increment = 0. f , Rank = 0 , StartingValue = 1. f , MaxValue = 1. f )
PerkSkills ( ESWAT _RapidAssault ) = ( Name = "RapidAssault" , IconPath = "UI_PerkTalent_TEX.SWAT.UI_Talents_SWAT_RapidAssault" , Increment = 0. f , Rank = 0 , StartingValue = 1. f , MaxValue = 1. f )
SecondaryXPModifier ( 0 ) = 2
SecondaryXPModifier ( 1 ) = 3
SecondaryXPModifier ( 2 ) = 4
SecondaryXPModifier ( 3 ) = 7
ZedTimeModifyingStates ( 0 ) = "WeaponFiring"
ZedTimeModifyingStates ( 1 ) = "WeaponBurstFiring"
ZedTimeModifyingStates ( 2 ) = "WeaponSingleFiring"
ZedTimeModifyingStates ( 3 ) = "WeaponAltFiringAuto"
AutoBuyLoadOutPath = ( class 'KFWeapDef_MP7' , class 'KFWeapDef_MP5RAS' , class 'KFWeapDef_P90' , class 'KFWeapDef_Kriss' )
BumpDamageAmount = 450
BumpDamageType = class 'KFDT_SWATBatteringRam'
BumpMomentum = 1. f
SWATEnforcerZedTimeSpeedScale = 1.25 f
BumpCooldown = 0.1 f
2021-09-02 21:46:08 +00:00
TacticalMovementModifier = 0.2 ;
2020-12-13 15:01:13 +00:00
}