upload
This commit is contained in:
@ -9,8 +9,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Ballistic_DragonsBreath extends KFDT_Ballistic_Shotgun
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
// Damage type to use for the burning damage over time
|
||||
var class<KFDamageType> BurnDamageType;
|
||||
|
50
KFGameContent/Classes/KFDT_Ballistic_Frost_Shotgun_Axe.uc
Normal file
50
KFGameContent/Classes/KFDT_Ballistic_Frost_Shotgun_Axe.uc
Normal file
@ -0,0 +1,50 @@
|
||||
//=============================================================================
|
||||
// KFDT_Ballistic_Frost_Shotgun_Axe
|
||||
//=============================================================================
|
||||
// Ballistic damage with light impact energy, but stronger hit reactions
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2019 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Ballistic_Frost_Shotgun_Axe extends KFDT_Ballistic_Shotgun
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
/** Allows the damage type to customize exactly which hit zones it can dismember */
|
||||
static simulated function bool CanDismemberHitZone( name InHitZoneName )
|
||||
{
|
||||
if( super.CanDismemberHitZone( InHitZoneName ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
switch ( InHitZoneName )
|
||||
{
|
||||
case 'lupperarm':
|
||||
case 'rupperarm':
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
// Physics
|
||||
KDamageImpulse=2500 //2750
|
||||
KDeathUpKick=800
|
||||
KDeathVel=650
|
||||
|
||||
// Afflictions
|
||||
StumblePower =20 //40
|
||||
GunHitPower =20
|
||||
FreezePower =11 //17
|
||||
|
||||
WeaponDef=class'KFWeapDef_Rifle_FrostShotgunAxe'
|
||||
|
||||
ModifierPerkList(0)=class'KFPerk_Support'
|
||||
ModifierPerkList(1)=class'KFPerk_Berserker'
|
||||
|
||||
EffectGroup=FXG_Freeze
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
//=============================================================================
|
||||
// KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact
|
||||
//=============================================================================
|
||||
//
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2019 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact extends KFDT_Ballistic_HRG_Vampire_BloodBallImpact
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
PoisonPower=30 //80
|
||||
StumblePower=350
|
||||
KnockdownPower=140
|
||||
GunHitPower=350
|
||||
|
||||
ModifierPerkList(0)=class'KFPerk_FieldMedic'
|
||||
WeaponDef=class'KFWeapDef_HRG_Vampire'
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
//=============================================================================
|
||||
// KFDT_Ballistic_HRG_Vampire_BloodBallImpact
|
||||
//=============================================================================
|
||||
//
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2019 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Ballistic_HRG_Vampire_BloodBallImpact extends KFDT_Ballistic_Shell
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
static simulated function bool CanDismemberHitZone( name InHitZoneName )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
DoT_Type=DOT_NONE
|
||||
|
||||
EffectGroup=FXG_Toxic
|
||||
|
||||
PoisonPower=10 //20
|
||||
StumblePower=40 //100
|
||||
KnockdownPower=0 //25
|
||||
GunHitPower=40 //100
|
||||
|
||||
ModifierPerkList(0)=class'KFPerk_FieldMedic'
|
||||
WeaponDef=class'KFWeapDef_HRG_Vampire'
|
||||
}
|
46
KFGameContent/Classes/KFDT_Bleeding_HRG_Vampire_BloodSuck.uc
Normal file
46
KFGameContent/Classes/KFDT_Bleeding_HRG_Vampire_BloodSuck.uc
Normal file
@ -0,0 +1,46 @@
|
||||
//=============================================================================
|
||||
// KFDT_Bleeding_HRG_Vampire_BloodSuck
|
||||
//=============================================================================
|
||||
//
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Bleeding_HRG_Vampire_BloodSuck extends KFDT_Bleeding
|
||||
abstract;
|
||||
|
||||
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
|
||||
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
|
||||
{
|
||||
local class<KFDamageType> ToxicDT;
|
||||
|
||||
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
|
||||
if ( ToxicDT != None )
|
||||
{
|
||||
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
//physics
|
||||
KDamageImpulse=0
|
||||
KDeathUpKick=350
|
||||
KDeathVel=350
|
||||
|
||||
//Afflictions
|
||||
BleedPower=50 //50
|
||||
StumblePower=0 //20
|
||||
GunHitPower=5
|
||||
|
||||
//Damage Over Time Components
|
||||
DoT_Type=DOT_Bleeding
|
||||
DoT_Duration=0.5 //5.0
|
||||
DoT_Interval=0.5 //1.0
|
||||
DoT_DamageScale=0.1
|
||||
bStackDoT=true
|
||||
|
||||
ModifierPerkList(0)=class'KFPerk_FieldMedic'
|
||||
WeaponDef=class'KFWeapDef_HRG_Vampire'
|
||||
}
|
@ -15,7 +15,7 @@ defaultproperties
|
||||
KDeathUpKick=0
|
||||
KDeathVel=500
|
||||
|
||||
StumblePower=150
|
||||
StumblePower=200 //150
|
||||
MeleeHitPower=100
|
||||
|
||||
WeaponDef=class'KFWeapDef_FireAxe'
|
||||
|
19
KFGameContent/Classes/KFDT_Bludgeon_HRG_Vampire.uc
Normal file
19
KFGameContent/Classes/KFDT_Bludgeon_HRG_Vampire.uc
Normal file
@ -0,0 +1,19 @@
|
||||
//=============================================================================
|
||||
// KFDT_Bludgeon_HRG_Vampire
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2015 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Bludgeon_HRG_Vampire extends KFDT_Bludgeon_RifleButt
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
StumblePower=200
|
||||
MeleeHitPower=100
|
||||
|
||||
ModifierPerkList(0)=class'KFPerk_FieldMedic'
|
||||
WeaponDef=class'KFWeapDef_HRG_Vampire'
|
||||
}
|
@ -7,8 +7,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Explosive_HRGIncendiaryRifle extends KFDT_Fire
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
// Damage type to use for the burning damage over time
|
||||
var class<KFDamageType> BurnDamageType;
|
||||
|
@ -8,8 +8,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Explosive_HuskCannon extends KFDT_Explosive
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
// Damage type to use for the burning damage over time
|
||||
var class<KFDamageType> BurnDamageType;
|
||||
|
@ -7,8 +7,7 @@
|
||||
// Copyright (C) 2017 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
class KFDT_Fire_FlareGun_Dual extends KFDT_Fire_FlareGun
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -9,8 +9,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Fire_Ground_DragonsBreath extends KFDT_Fire_Ground
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
static function int GetKillerDialogID()
|
||||
{
|
||||
|
@ -8,8 +8,7 @@
|
||||
// Tulio Beloqui (Saber Interactive)
|
||||
//=============================================================================
|
||||
class KFDT_Fire_Ground_FlareGun extends KFDT_Fire_Ground
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
static function int GetKillerDialogID()
|
||||
{
|
||||
|
@ -9,8 +9,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Fire_Ground_HRGScorcher extends KFDT_Fire_Ground
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
static function int GetKillerDialogID()
|
||||
{
|
||||
|
@ -9,8 +9,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Fire_Ground_MolotovGrenade extends KFDT_Fire_Ground
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -9,8 +9,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Fire_MolotovGrenade extends KFDT_Fire
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -0,0 +1,37 @@
|
||||
//=============================================================================
|
||||
// KFDT_Piercing_HRG_Vampire_CrystalSpike
|
||||
//=============================================================================
|
||||
// Damage type for crystal spike (alternate fire) of HRG Vampire
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Piercing_HRG_Vampire_CrystalSpike extends KFDT_Piercing
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
|
||||
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
|
||||
{
|
||||
local class<KFDamageType> ToxicDT;
|
||||
|
||||
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
|
||||
if ( ToxicDT != None )
|
||||
{
|
||||
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
KDamageImpulse=1500
|
||||
KDeathUpKick=250
|
||||
KDeathVel=150
|
||||
|
||||
StumblePower=250
|
||||
GunHitPower=100
|
||||
|
||||
ModifierPerkList(0)=class'KFPerk_FieldMedic'
|
||||
WeaponDef=class'KFWeapDef_HRG_Vampire'
|
||||
}
|
@ -6,8 +6,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Piercing_IonThrusterStab extends KFDT_Piercing
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
// Damage type to use for the burning damage over time
|
||||
var class<KFDamageType> BurnDamageType;
|
||||
|
@ -126,8 +126,9 @@ static simulated function ModifyDismembermentHitImpulse(KFPawn_Monster InPawn, n
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
KDamageImpulse=200
|
||||
KDeathUpKick=250
|
||||
KDamageImpulse=2000
|
||||
KDeathUpKick=500
|
||||
KDeathVel=500
|
||||
|
||||
StumblePower=50
|
||||
MeleeHitPower=150
|
||||
|
@ -29,11 +29,12 @@ static simulated function bool CanDismemberHitZone(name InHitZoneName)
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
KDamageImpulse=300
|
||||
KDeathUpKick=400
|
||||
KDamageImpulse=2500
|
||||
KDeathUpKick=700
|
||||
KDeathVel=700
|
||||
|
||||
StumblePower=75
|
||||
StunPower=75
|
||||
StunPower=100 //75
|
||||
MeleeHitPower=100
|
||||
|
||||
WeaponDef=class'KFWeapDef_FireAxe'
|
||||
|
142
KFGameContent/Classes/KFDT_Slashing_Frost_Shotgun_Axe.uc
Normal file
142
KFGameContent/Classes/KFDT_Slashing_Frost_Shotgun_Axe.uc
Normal file
@ -0,0 +1,142 @@
|
||||
//=============================================================================
|
||||
// KFDT_Slashing_Frost_Shotgun_Axe
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2017 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Slashing_Frost_Shotgun_Axe extends KFDT_Slashing
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
/** Allows the damage type to customize exactly which hit zones it can dismember */
|
||||
static simulated function bool CanDismemberHitZone( name InHitZoneName )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Allows the damage type to map a hit zone to a different bone for dismemberment purposes */
|
||||
static simulated function GetBoneToDismember(KFPawn_Monster InPawn, vector HitDirection, name InHitZoneName, out name OutBoneName)
|
||||
{
|
||||
local EPawnOctant SlashDir;
|
||||
local KFCharacterInfo_Monster MonsterInfo;
|
||||
|
||||
MonsterInfo = InPawn.GetCharacterMonsterInfo();
|
||||
if ( MonsterInfo == none )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SlashDir = GetLastSlashDirection(InPawn, HitDirection);
|
||||
|
||||
if( SlashDir == DIR_Forward || SlashDir == DIR_Backward )
|
||||
{
|
||||
if( InHitZoneName == 'chest' || InHitZoneName == 'head' )
|
||||
{
|
||||
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
|
||||
{
|
||||
// Randomly pick the left or right shoulder bone and split the guy in half vertically
|
||||
OutBoneName = Rand(2) == 0
|
||||
? MonsterInfo.SpecialMeleeDismemberment.LeftShoulderBoneName
|
||||
: MonsterInfo.SpecialMeleeDismemberment.RightShoulderBoneName;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( SlashDir == DIR_Left || SlashDir == DIR_Right )
|
||||
{
|
||||
if( InHitZoneName == 'chest' || InHitZoneName == 'abdomen' || InHitZoneName == 'stomach' )
|
||||
{
|
||||
if( MonsterInfo.SpecialMeleeDismemberment.bAllowHorizontalSplit )
|
||||
{
|
||||
// Split the guy in half horizontally
|
||||
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.SpineBoneName;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( SlashDir == DIR_ForwardLeft || SlashDir == DIR_BackwardRight )
|
||||
{
|
||||
if( InHitZoneName == 'chest' )
|
||||
{
|
||||
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
|
||||
{
|
||||
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.RightShoulderBoneName;
|
||||
}
|
||||
}
|
||||
else if( InHitZoneName == 'head' )
|
||||
{
|
||||
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
|
||||
{
|
||||
// Use a random chance to decide whether to dismember the head or the shoulder constraints
|
||||
if( Rand(2) == 0 )
|
||||
{
|
||||
// ... and choose one of the shoulder constraints at random
|
||||
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.RightShoulderBoneName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( SlashDir == DIR_ForwardRight || SlashDir == DIR_BackwardLeft )
|
||||
{
|
||||
if( InHitZoneName == 'chest' )
|
||||
{
|
||||
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
|
||||
{
|
||||
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.LeftShoulderBoneName;
|
||||
}
|
||||
}
|
||||
else if( InHitZoneName == 'head' )
|
||||
{
|
||||
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
|
||||
{
|
||||
// Use a random chance to decide whether to dismember the head or the shoulder constraints
|
||||
if( Rand(2) == 0 )
|
||||
{
|
||||
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.LeftShoulderBoneName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Allows the damage type to modify the impulse when a specified hit zone is dismembered */
|
||||
static simulated function ModifyDismembermentHitImpulse(KFPawn_Monster InPawn, name InHitZoneName, vector HitDirection,
|
||||
out vector OutImpulseDir, out vector OutParentImpulseDir,
|
||||
out float OutImpulseScale, out float OutParentImpulseScale)
|
||||
{
|
||||
local EPawnOctant SlashDir;
|
||||
|
||||
SlashDir = GetLastSlashDirection(InPawn, HitDirection);
|
||||
|
||||
// Apply upward impulse on decapitation from a clean horizontal slash
|
||||
if( InHitZoneName == 'head' &&
|
||||
( SlashDir == DIR_Left || SlashDir == DIR_Right ) )
|
||||
{
|
||||
OutImpulseDir += 10*vect(0,0,1);
|
||||
OutImpulseDir = Normal(OutImpulseDir);
|
||||
OutParentImpulseScale = 0.f;
|
||||
}
|
||||
// Do not apply any impulse on split in half from a vertical slash
|
||||
else if( (InHitZoneName == 'head' || InHitZoneName == 'chest' ) &&
|
||||
( SlashDir == DIR_Forward || SlashDir == DIR_Backward) )
|
||||
{
|
||||
OutImpulseScale = 0.f;
|
||||
OutParentImpulseScale = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
//IsDoingSpecialMove(SM_Frozen)
|
||||
defaultproperties
|
||||
{
|
||||
//KDamageImpulse=200
|
||||
//KDeathUpKick=250
|
||||
KDamageImpulse=2500
|
||||
KDeathUpKick=700
|
||||
KDeathVel=700
|
||||
|
||||
StumblePower=250
|
||||
MeleeHitPower=200
|
||||
|
||||
WeaponDef=class'KFWeapDef_Rifle_FrostShotgunAxe'
|
||||
|
||||
ModifierPerkList(0)=class'KFPerk_Berserker'
|
||||
}
|
@ -6,8 +6,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Slashing_IonThruster extends KFDT_Slashing
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
// Damage type to use for the burning damage over time
|
||||
var class<KFDamageType> BurnDamageType;
|
||||
|
@ -6,8 +6,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Slashing_IonThrusterHeavy extends KFDT_Slashing_IonThruster
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
/** Allows the damage type to customize exactly which hit zones it can dismember */
|
||||
static simulated function bool CanDismemberHitZone( name InHitZoneName )
|
||||
|
@ -6,8 +6,7 @@
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Slashing_IonThrusterSpecial extends KFDT_Slashing_IonThruster
|
||||
abstract
|
||||
hidedropdown;
|
||||
abstract;
|
||||
|
||||
/** Allows the damage type to customize exactly which hit zones it can dismember */
|
||||
static simulated function bool CanDismemberHitZone( name InHitZoneName )
|
||||
|
27
KFGameContent/Classes/KFDT_Toxic_HRG_Vampire_BloodBall.uc
Normal file
27
KFGameContent/Classes/KFDT_Toxic_HRG_Vampire_BloodBall.uc
Normal file
@ -0,0 +1,27 @@
|
||||
//=============================================================================
|
||||
// KFDT_Toxic_HRG_Vampire_BloodBall
|
||||
//=============================================================================
|
||||
// Toxic Cloud DamageType
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFDT_Toxic_HRG_Vampire_BloodBall extends KFDT_Toxic
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
PoisonPower=16
|
||||
StumblePower=40 //200
|
||||
KnockdownPower=0 //40
|
||||
|
||||
DoT_Type=DOT_Toxic
|
||||
DoT_Duration=2.0 //1.0
|
||||
DoT_Interval=0.5 //1.0
|
||||
DoT_DamageScale=0.1
|
||||
|
||||
ModifierPerkList(0)=class'KFPerk_FieldMedic'
|
||||
WeaponDef=class'KFWeapDef_HRG_Vampire'
|
||||
}
|
282
KFGameContent/Classes/KFExplosion_HRG_Vampire_BloodBall.uc
Normal file
282
KFGameContent/Classes/KFExplosion_HRG_Vampire_BloodBall.uc
Normal file
@ -0,0 +1,282 @@
|
||||
//=============================================================================
|
||||
// KFExplosion_HRG_Vampire_BloodBall
|
||||
//=============================================================================
|
||||
// Used by projectiles and kismet to spawn an explosion
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFExplosion_HRG_Vampire_BloodBall extends KFExplosionActorLingering;
|
||||
|
||||
var() class<KFDamageType> HealingDamageType;
|
||||
var() float HealingAmount;
|
||||
|
||||
var AkEvent SmokeLoopStartEvent;
|
||||
var AkEvent SmokeLoopStopEvent;
|
||||
|
||||
var KFPerk CachedInstigatorPerk;
|
||||
|
||||
var float ChargePercentage;
|
||||
|
||||
var float DamageByChargePercentage;
|
||||
|
||||
var float fMinAmmoutHealing;
|
||||
var float fMaxAmmoutHealing;
|
||||
|
||||
var float fAltMinAmmoutHealing;
|
||||
var float fAltMaxAmmoutHealing;
|
||||
|
||||
var bool bHealsInstigator;
|
||||
var bool bHealsDifferentAmmoutToInstigator;
|
||||
|
||||
var float ImpactDecalSizeMax;
|
||||
var float ImpactDecalSizeMin;
|
||||
|
||||
simulated function SpawnExplosionParticleSystem(ParticleSystem Template)
|
||||
{
|
||||
local ParticleSystemComponent PSC;
|
||||
local vector vec;
|
||||
|
||||
// If the template is none, grab the default
|
||||
if( !ExplosionTemplate.bAllowPerMaterialFX && Template == none )
|
||||
{
|
||||
Template = KFGameExplosion(ExplosionTemplate).ExplosionEffects.DefaultImpactEffect.ParticleTemplate;
|
||||
}
|
||||
|
||||
// Use custom pool
|
||||
PSC = WorldInfo.MyEmitterPool.SpawnEmitter(Template, Location, rotator(ExplosionTemplate.HitNormal), None);
|
||||
//ChargePercentage
|
||||
vec.X = ChargePercentage;
|
||||
vec.Y = ChargePercentage;
|
||||
vec.Z = ChargePercentage;
|
||||
PSC.SetVectorParameter( name("BlobCharge"), vec);
|
||||
PSC.SetFloatParameter( name("MineFxControlParam"), ChargePercentage);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* @param Direction For bDirectionalExplosion=true explosions, this is the forward direction of the blast.
|
||||
* Overridden to add the ability to spawn fragments from the explosion
|
||||
**/
|
||||
simulated function Explode(GameExplosion NewExplosionTemplate, optional vector Direction)
|
||||
{
|
||||
local KFPawn KFP;
|
||||
super.Explode(NewExplosionTemplate, Direction);
|
||||
|
||||
if( Instigator != none )
|
||||
{
|
||||
|
||||
KFP = KFPawn(Instigator);
|
||||
if( KFP != none )
|
||||
{
|
||||
CachedInstigatorPerk = KFP.GetPerk();
|
||||
}
|
||||
}
|
||||
|
||||
if (Role == Role_Authority)
|
||||
{
|
||||
//DelayedExplosionDamage();
|
||||
SetTimer(Interval, false, nameof(DelayedExplosionDamage), self);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deal damage or heal players
|
||||
*/
|
||||
protected simulated function AffectsPawn(Pawn Victim, float DamageScale)
|
||||
{
|
||||
local KFPawn_Human HumanVictim;
|
||||
local KFPawn_Monster MonsterVictim;
|
||||
local KFProj_MedicGrenade OwnerProjectile;
|
||||
local bool bCanRepairArmor;
|
||||
local Box BBox;
|
||||
local vector BBoxCenter;
|
||||
local Actor HitActor;
|
||||
local bool bDamageBlocked;
|
||||
local float AmountToHeal;
|
||||
|
||||
|
||||
if( Victim != none && Victim.IsAliveAndWell() )
|
||||
{
|
||||
MonsterVictim = KFPawn_Monster(Victim);
|
||||
if( MonsterVictim != none )
|
||||
{
|
||||
if( bWasFadedOut|| bDeleteMe || bPendingDelete )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Victim.GetComponentsBoundingBox(BBox);
|
||||
BBoxCenter = (BBox.Min + BBox.Max) * 0.5f;
|
||||
HitActor = TraceExplosive(BBoxCenter, Location + vect(0, 0, 20));
|
||||
bDamageBlocked = (HitActor != None && HitActor != Victim);
|
||||
if(bDamageBlocked && HitActor.IsA('KFDoorActor'))
|
||||
{
|
||||
bDamageBlocked = false;
|
||||
}
|
||||
if( !bDamageBlocked )
|
||||
{
|
||||
Victim.TakeRadiusDamage(InstigatorController, ExplosionTemplate.Damage * DamageScale, ExplosionTemplate.DamageRadius,
|
||||
ExplosionTemplate.MyDamageType, ExplosionTemplate.MomentumTransferScale, Location, bDoFullDamage,
|
||||
(Owner != None) ? Owner : self, ExplosionTemplate.DamageFalloffExponent);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Victim.GetComponentsBoundingBox(BBox);
|
||||
BBoxCenter = (BBox.Min + BBox.Max) * 0.5f;
|
||||
HitActor = TraceExplosive(BBoxCenter, Location + vect(0, 0, 20));
|
||||
bDamageBlocked = (HitActor != None && HitActor != Victim);
|
||||
if(bDamageBlocked && HitActor.IsA('KFDoorActor'))
|
||||
{
|
||||
bDamageBlocked = false;
|
||||
}
|
||||
if(!bDamageBlocked)
|
||||
{
|
||||
if(!bHealsInstigator && Victim == Instigator)
|
||||
{
|
||||
return;
|
||||
}
|
||||
HumanVictim = KFPawn_Human(Victim);
|
||||
if( HumanVictim != none && HumanVictim.GetExposureTo(Location) > 0 )
|
||||
{
|
||||
OwnerProjectile = KFProj_MedicGrenade(Owner);
|
||||
if( OwnerProjectile != none )
|
||||
{
|
||||
bCanRepairArmor = OwnerProjectile.HealedPawns.Find( HumanVictim ) == INDEX_NONE;
|
||||
}
|
||||
|
||||
if(bHealsDifferentAmmoutToInstigator && bHealsInstigator && Victim == Instigator)
|
||||
{
|
||||
AmountToHeal = FMax(fAltMinAmmoutHealing, Lerp(fAltMinAmmoutHealing, fAltMaxAmmoutHealing, DamageByChargePercentage));
|
||||
HumanVictim.HealDamage( AmountToHeal, InstigatorController, HealingDamageType, bCanRepairArmor);
|
||||
}
|
||||
else
|
||||
{
|
||||
AmountToHeal = FMax(fMinAmmoutHealing, Lerp(fMinAmmoutHealing, fMaxAmmoutHealing, DamageByChargePercentage));
|
||||
HumanVictim.HealDamage( AmountToHeal, InstigatorController, HealingDamageType, bCanRepairArmor);
|
||||
}
|
||||
|
||||
if( bCanRepairArmor )
|
||||
{
|
||||
OwnerProjectile.HealedPawns.AddItem( HumanVictim );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
simulated protected function UpdateExplosionTemplateWithPerMaterialFX(PhysicalMaterial PhysMaterial)
|
||||
{
|
||||
super.UpdateExplosionTemplateWithPerMaterialFX(PhysMaterial);
|
||||
|
||||
// Set a default impact effect if there isn't a physical material
|
||||
if( PhysMaterial == none )
|
||||
{
|
||||
MyImpactEffect = KFGameExplosion(ExplosionTemplate).ExplosionEffects.DefaultImpactEffect;
|
||||
}
|
||||
else if( WorldInfo.MyImpactEffectManager != none ) // none on dedicated server
|
||||
{
|
||||
`ImpactEffectManager.GetImpactEffect(PhysMaterial, MyImpactEffect,KFGameExplosion(ExplosionTemplate).ExplosionEffects);
|
||||
}
|
||||
|
||||
if( MyImpactEffect.ParticleTemplate != none )
|
||||
{
|
||||
ExplosionTemplate.ExplosionSound = MyImpactEffect.Sound;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//Copied from KFExplosionActor -> SpawnExplosionDecal
|
||||
//Added support to variable DecalSize depending on blood ball charge.
|
||||
simulated function SpawnExplosionDecal()
|
||||
{
|
||||
local MaterialInterface MI;
|
||||
local MaterialInstanceTimeVarying MITV_Decal;
|
||||
local int DecalMaterialsLength;
|
||||
local float DecalSize, DecalThickness;
|
||||
local KFGameExplosion KFExplosionTemplate;
|
||||
|
||||
if( WorldInfo.bDropDetail )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// If the template is none, grab the default
|
||||
if( !ExplosionTemplate.bAllowPerMaterialFX )
|
||||
{
|
||||
KFExplosionTemplate = KFGameExplosion(ExplosionTemplate);
|
||||
if( KFExplosionTemplate == none || KFExplosionTemplate.ExplosionEffects == none )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
MyImpactEffect = KFExplosionTemplate.ExplosionEffects.DefaultImpactEffect;
|
||||
}
|
||||
|
||||
// if we have a decal to spawn on impact
|
||||
DecalMaterialsLength = MyImpactEffect.DecalMaterials.length;
|
||||
if( DecalMaterialsLength > 0 )
|
||||
{
|
||||
MI = MyImpactEffect.DecalMaterials[Rand(DecalMaterialsLength)];
|
||||
if( MI != None )
|
||||
{
|
||||
DecalSize = Lerp(ImpactDecalSizeMin, ImpactDecalSizeMax, ChargePercentage);
|
||||
|
||||
//Always extend decal thickness for explosions
|
||||
DecalThickness = DecalSize * 2.f;
|
||||
|
||||
if( MaterialInstanceTimeVarying(MI) != none )
|
||||
{
|
||||
MITV_Decal = new(self) class'MaterialInstanceTimeVarying';
|
||||
MITV_Decal.SetParent( MI );
|
||||
|
||||
WorldInfo.ExplosionDecalManager.SpawnDecal(MITV_Decal, ExplosionTemplate.HitLocation, rotator(-ExplosionTemplate.HitNormal), DecalSize, DecalSize, DecalThickness, FALSE,(MyImpactEffect.bNoDecalRotation) ? 0.f : (FRand() * 360.0) );
|
||||
//here we need to see if we are an MITV and then set the burn out times to occur
|
||||
MITV_Decal.SetScalarStartTime( MyImpactEffect.DecalDissolveParamName, MyImpactEffect.DecalDuration );
|
||||
}
|
||||
else
|
||||
{
|
||||
WorldInfo.ExplosionDecalManager.SpawnDecal( MI, ExplosionTemplate.HitLocation, rotator(-ExplosionTemplate.HitNormal), DecalSize, DecalSize, DecalThickness, true,
|
||||
(MyImpactEffect.bNoDecalRotation) ? 0.f : (FRand() * 360.0),,,,,,, MyImpactEffect.DecalDuration );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
HealingDamageType=class'KFDT_Healing'
|
||||
HealingAmount=0;
|
||||
|
||||
fMinAmmoutHealing=12; //10;
|
||||
fMaxAmmoutHealing=60; //50;
|
||||
|
||||
ImpactDecalSizeMax=425.f
|
||||
ImpactDecalSizeMin=178.f
|
||||
|
||||
Interval=0
|
||||
MaxTime=0.0
|
||||
FadeOutTime=0.0
|
||||
|
||||
bExplodeMoreThanOnce=false
|
||||
bDoFullDamage=false
|
||||
|
||||
bOnlyDamagePawns=true
|
||||
|
||||
bSkipLineCheckForPawns=true
|
||||
|
||||
LoopStartEvent=none
|
||||
LoopStopEvent=none
|
||||
|
||||
//EXPERIMENTAL FEATURES FOR DESIGN
|
||||
bHealsInstigator = false;
|
||||
bHealsDifferentAmmoutToInstigator = false;
|
||||
fAltMinAmmoutHealing=1;
|
||||
fAltMaxAmmoutHealing=5;
|
||||
}
|
@ -767,6 +767,16 @@ defaultproperties
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_EMP_ArcGenerator_AltFiremodeZapDamage', DamageScale=(1.5)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.4)))
|
||||
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.25)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.5)))
|
||||
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.3)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
|
||||
|
||||
ParryResistance=4
|
||||
|
||||
|
@ -203,6 +203,9 @@ defaultproperties
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Toxic_BloatPukeMine', DamageScale=(0.00)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Toxic_BloatKingPukeMine', DamageScale=(0.00)))
|
||||
|
||||
//Special cases
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(2.0)))
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -675,6 +675,15 @@ DefaultProperties
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_EMP_ArcGenerator_AltFiremodeZapDamage', DamageScale=(1.5)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.6)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.4)))
|
||||
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.5)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
|
||||
|
||||
Begin Object Class=KFGameExplosion Name=ExploTemplate0
|
||||
Damage=40 //20
|
||||
|
@ -1231,6 +1231,13 @@ DefaultProperties
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.6)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.9)))
|
||||
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.5)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
|
||||
|
||||
|
||||
// ---------------------------------------------
|
||||
// Block Settings
|
||||
|
@ -1953,6 +1953,16 @@ defaultproperties
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.4)))
|
||||
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.25)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.5)))
|
||||
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.3)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
|
||||
|
||||
// ---------------------------------------------
|
||||
// Armor
|
||||
|
||||
|
@ -2188,6 +2188,15 @@ defaultproperties
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_EMP_ArcGenerator_AltFiremodeZapDamage', DamageScale=(1.5)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.4)))
|
||||
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.25)))
|
||||
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.5)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.3)))
|
||||
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
|
||||
|
||||
// ---------------------------------------------
|
||||
// Block Settings
|
||||
|
297
KFGameContent/Classes/KFProj_BloodBall_HRG_Vampire.uc
Normal file
297
KFGameContent/Classes/KFProj_BloodBall_HRG_Vampire.uc
Normal file
@ -0,0 +1,297 @@
|
||||
//=============================================================================
|
||||
// KFProj_BloodBall_HRG_Vampire
|
||||
//=============================================================================
|
||||
// Projectile class for Vampire
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
class KFProj_BloodBall_HRG_Vampire extends KFProjectile;
|
||||
|
||||
|
||||
/** Storing all relative info about Blood Ball charged (in order to help in replication) */
|
||||
struct BloodBallChargeInfo
|
||||
{
|
||||
var float ChargePercentage;
|
||||
var float DamageByChargePercentage;
|
||||
};
|
||||
|
||||
/** Dampen amount for every bounce */
|
||||
var float DampenFactor;
|
||||
|
||||
/** Dampen amount for parallel angle to velocity */
|
||||
var float DampenFactorParallel;
|
||||
|
||||
/** Vector to offset the ground FX particle system by when landing */
|
||||
var vector LandedFXOffset;
|
||||
|
||||
/** Armed mine collision settings */
|
||||
|
||||
/** Decal settings */
|
||||
var MaterialInterface ImpactDecalMaterial;
|
||||
var float ImpactDecalWidth;
|
||||
var float ImpactDecalHeight;
|
||||
var float ImpactDecalThickness;
|
||||
|
||||
var float MaxExplodeTriggerHeightPerPercentage;
|
||||
var float MinExplodeTriggerHeightPerPercentage;
|
||||
|
||||
var float MaxDamageRadiusPerPercentage;
|
||||
var float MinDamageRadiusPerPercentage;
|
||||
|
||||
var float MaxCollisionRadius;
|
||||
var float MinCollisionRadius;
|
||||
var float MaxCollisionHeight;
|
||||
var float MinCollisionHeight;
|
||||
|
||||
var float MaxDamagePerPercentage;
|
||||
var float MinDamagePerPercentage;
|
||||
|
||||
var repnotify BloodBallChargeInfo BloodBallCharge;
|
||||
|
||||
var float fCachedCylinderWidth, fCachedCylinderHeight;
|
||||
|
||||
//EXPERIMENTAL FEATURES
|
||||
var bool bCantBeTouchedByInstigator;
|
||||
var bool bManuallyDetonated;
|
||||
var bool bCantDetonateOnFullHP;
|
||||
|
||||
replication
|
||||
{
|
||||
if( bNetDirty && Role == Role_Authority)
|
||||
BloodBallCharge;
|
||||
}
|
||||
|
||||
simulated event ReplicatedEvent( name VarName )
|
||||
{
|
||||
super.ReplicatedEvent( VarName );
|
||||
|
||||
if( VarName == nameOf(BloodBallCharge))
|
||||
{
|
||||
ScalingExplosionTemplateByBloodBallCharge();
|
||||
ScalingProjEffectsByBloodBallCharge();
|
||||
}
|
||||
}
|
||||
|
||||
simulated function SetInheritedScale(float NewChargePercentage, float NewDamageByChargePercentage)
|
||||
{
|
||||
BloodBallCharge.DamageByChargePercentage=NewDamageByChargePercentage;
|
||||
BloodBallCharge.ChargePercentage = FMax(0.1, NewChargePercentage);//We want to see at least a bit of the projectile.
|
||||
|
||||
ScalingExplosionTemplateByBloodBallCharge();
|
||||
ScalingProjEffectsByBloodBallCharge();
|
||||
|
||||
bNetDirty=true;
|
||||
}
|
||||
|
||||
simulated function ScalingExplosionTemplateByBloodBallCharge()
|
||||
{
|
||||
fCachedCylinderWidth = Lerp(MinCollisionRadius, MaxCollisionRadius, BloodBallCharge.ChargePercentage);
|
||||
fCachedCylinderHeight = Lerp(MinCollisionHeight, MaxCollisionHeight, BloodBallCharge.ChargePercentage);
|
||||
CylinderComponent(CollisionComponent).SetCylinderSize(fCachedCylinderWidth, fCachedCylinderHeight);
|
||||
|
||||
ExplosionTemplate.DamageRadius = FMax(MinDamageRadiusPerPercentage, Lerp(MinDamageRadiusPerPercentage, MaxDamageRadiusPerPercentage, BloodBallCharge.DamageByChargePercentage));
|
||||
ExplosionTemplate.Damage = FMax(MinDamagePerPercentage, Lerp(MinDamagePerPercentage, MaxDamagePerPercentage, BloodBallCharge.DamageByChargePercentage));
|
||||
}
|
||||
|
||||
simulated function ScalingProjEffectsByBloodBallCharge()
|
||||
{
|
||||
local vector ChargePercentageVector;
|
||||
ChargePercentageVector.X = BloodBallCharge.ChargePercentage;
|
||||
ChargePercentageVector.Y = BloodBallCharge.ChargePercentage;
|
||||
ChargePercentageVector.Z = BloodBallCharge.ChargePercentage;
|
||||
|
||||
if(ProjEffects != None)
|
||||
{
|
||||
ProjEffects.SetVectorParameter( name("BlobCharge"), ChargePercentageVector);
|
||||
ProjEffects.SetFloatParameter( name("MineFxControlParam"), BloodBallCharge.ChargePercentage);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
simulated event PostBeginPlay()
|
||||
{
|
||||
super.PostBeginPlay();
|
||||
|
||||
BloodBallCharge.ChargePercentage=0;
|
||||
BloodBallCharge.DamageByChargePercentage=0;
|
||||
}
|
||||
|
||||
simulated function SpawnFlightEffects()
|
||||
{
|
||||
super.SpawnFlightEffects();
|
||||
}
|
||||
|
||||
/** Validates a touch */
|
||||
|
||||
|
||||
simulated protected function PrepareExplosionTemplate()
|
||||
{
|
||||
|
||||
local Weapon OwnerWeapon;
|
||||
local Pawn OwnerPawn;
|
||||
|
||||
super(KFProjectile).PrepareExplosionTemplate();
|
||||
OwnerWeapon = Weapon(Owner);
|
||||
if (OwnerWeapon != none)
|
||||
{
|
||||
OwnerPawn = Pawn(OwnerWeapon.Owner);
|
||||
if (OwnerPawn != none)
|
||||
{
|
||||
ExplosionTemplate.DamageRadius *= KFPawn(OwnerPawn).GetPerk().GetAoERadiusModifier();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
simulated protected function PrepareExplosionActor(GameExplosionActor GEA)
|
||||
{
|
||||
KFExplosion_HRG_Vampire_BloodBall(GEA).ChargePercentage = BloodBallCharge.ChargePercentage;
|
||||
KFExplosion_HRG_Vampire_BloodBall(GEA).DamageByChargePercentage = BloodBallCharge.DamageByChargePercentage;
|
||||
super.PrepareExplosionActor(GEA);
|
||||
}
|
||||
|
||||
/** Call ProcessBulletTouch */
|
||||
simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
|
||||
{
|
||||
if (Other == Instigator || CheckRepeatingTouch(Other))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (IgnoreTouchActor != Other)
|
||||
{
|
||||
ProcessBulletTouch(Other, HitLocation, HitNormal);
|
||||
}
|
||||
super.ProcessTouch(Other, HitLocation, HitNormal);
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
Speed=2000
|
||||
MaxSpeed=2000
|
||||
TerminalVelocity=2000
|
||||
TossZ=150
|
||||
GravityScale=0.5
|
||||
MomentumTransfer=50000.0
|
||||
|
||||
LifeSpan=300
|
||||
PostExplosionLifetime=1
|
||||
Physics=PHYS_Falling
|
||||
bBounce=true
|
||||
|
||||
ProjFlightTemplate= ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_BlobProjectile_01'
|
||||
ExplosionActorClass=class'KFExplosion_HRG_Vampire_BloodBall'
|
||||
|
||||
bSuppressSounds=false
|
||||
bAmbientSoundZedTimeOnly=false
|
||||
bAutoStartAmbientSound=false
|
||||
bStopAmbientSoundOnExplode=true
|
||||
|
||||
AmbientSoundPlayEvent=None
|
||||
AmbientSoundStopEvent=None
|
||||
|
||||
Begin Object Class=AkComponent name=AmbientAkSoundComponent
|
||||
bStopWhenOwnerDestroyed=true
|
||||
bForceOcclusionUpdateInterval=true
|
||||
OcclusionUpdateInterval=0.25f
|
||||
End Object
|
||||
AmbientComponent=AmbientAkSoundComponent
|
||||
Components.Add(AmbientAkSoundComponent)
|
||||
|
||||
//ImpactDecalMaterial=DecalMaterial'FX_Mat_Lib.FX_Puke_Mine_Splatter_DM'
|
||||
ImpactDecalWidth=178.f
|
||||
ImpactDecalHeight=178.f
|
||||
ImpactDecalThickness=28.f
|
||||
|
||||
Begin Object Name=CollisionCylinder
|
||||
CollisionRadius=10.f
|
||||
CollisionHeight=10.f
|
||||
CollideActors=true
|
||||
//PhysMaterialOverride=PhysicalMaterial'WEP_Mine_Reconstructor_EMIT.BloatPukeMine_PM'
|
||||
End Object
|
||||
|
||||
bCollideActors=true
|
||||
bProjTarget=true
|
||||
bCanBeDamaged=false
|
||||
bCollideComplex=true
|
||||
bNoEncroachCheck=true
|
||||
bPushedByEncroachers=false
|
||||
DampenFactor=0.125f
|
||||
DampenFactorParallel=0.175f
|
||||
|
||||
LandedFXOffset=(X=0,Y=0,Z=2)
|
||||
|
||||
// Since we're still using an extent cylinder, we need a line at 0
|
||||
ExtraLineCollisionOffsets.Add(())
|
||||
|
||||
// Explosion
|
||||
Begin Object Class=KFGameExplosion Name=ExploTemplate0
|
||||
Damage=200
|
||||
DamageRadius=200
|
||||
DamageFalloffExponent=0.5f
|
||||
DamageDelay=0.f
|
||||
MyDamageType=class'KFDT_Toxic_HRG_Vampire_BloodBall'
|
||||
//bIgnoreInstigator is set to true in PrepareExplosionTemplate
|
||||
|
||||
//Impulse applied to Zeds
|
||||
MomentumTransferScale=45000
|
||||
|
||||
// Damage Effects
|
||||
KnockDownStrength=0
|
||||
KnockDownRadius=0
|
||||
FractureMeshRadius=0
|
||||
FracturePartVel=0
|
||||
ExplosionEffects=KFImpactEffectInfo'WEP_HRG_Vampire_Arch.HRG_Vampire_BlobFireImpacts'
|
||||
ExplosionSound=None
|
||||
bAllowPerMaterialFX=true
|
||||
//MomentumTransferScale=0
|
||||
|
||||
// Dynamic Light
|
||||
ExploLight=none
|
||||
|
||||
// Camera Shake
|
||||
CamShake=CameraShake'WEP_Mine_Reconstructor_Arch.Camera_Shake'
|
||||
CamShakeInnerRadius=200
|
||||
CamShakeOuterRadius=400
|
||||
CamShakeFalloff=1.f
|
||||
bOrientCameraShakeTowardsEpicenter=true
|
||||
|
||||
End Object
|
||||
ExplosionTemplate=ExploTemplate0
|
||||
|
||||
GlassShatterType=FMGS_ShatterAll
|
||||
|
||||
|
||||
MaxExplodeTriggerHeightPerPercentage=22
|
||||
MinExplodeTriggerHeightPerPercentage=11
|
||||
|
||||
MaxDamageRadiusPerPercentage=280 //340
|
||||
MinDamageRadiusPerPercentage=130 //160
|
||||
|
||||
MaxDamagePerPercentage=200 //150
|
||||
MinDamagePerPercentage=20 //15
|
||||
|
||||
MaxCollisionRadius=20
|
||||
MinCollisionRadius=10
|
||||
MaxCollisionHeight=20
|
||||
MinCollisionHeight=10
|
||||
|
||||
bBlockedByInstigator=true
|
||||
bNetTemporary=false
|
||||
|
||||
bSyncToOriginalLocation=true
|
||||
bSyncToThirdPersonMuzzleLocation=true
|
||||
bUseClientSideHitDetection=true
|
||||
bUpdateSimulatedPosition=false
|
||||
|
||||
TouchTimeThreshhold=0.05
|
||||
|
||||
//EXPERIMENTAL FEATURES FOR DESING
|
||||
bManuallyDetonated=false
|
||||
bCantBeTouchedByInstigator=true
|
||||
bCantDetonateOnFullHP=true
|
||||
|
||||
AssociatedPerkClass=class'KFPerk_FieldMedic'
|
||||
}
|
247
KFGameContent/Classes/KFProj_BloodSplash.uc
Normal file
247
KFGameContent/Classes/KFProj_BloodSplash.uc
Normal file
@ -0,0 +1,247 @@
|
||||
//=============================================================================
|
||||
// KFProj_Blood Splash
|
||||
//=============================================================================
|
||||
// Projectile class for blood splashes that can leave decals.
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFProj_BloodSplash extends KFProjectile;
|
||||
|
||||
|
||||
var DecalMaterial ImpactDecalMaterial;
|
||||
var float ImpactDecalMaxSize;
|
||||
var float ImpactDecalMinSize;
|
||||
var float ImpactDecalThickness;
|
||||
|
||||
var KFPawn BloodOriginPawn;
|
||||
|
||||
/** Blow up on impact */
|
||||
simulated event HitWall(vector HitNormal, Actor Wall, PrimitiveComponent WallComp)
|
||||
{
|
||||
if( StaticMeshComponent(WallComp) != none && StaticMeshComponent(WallComp).CanBecomeDynamic() )
|
||||
{
|
||||
// pass through meshes that can move
|
||||
return;
|
||||
}
|
||||
|
||||
SpawnBloodDecal(Location, HitNormal);
|
||||
|
||||
//Explode( Location, HitNormal );
|
||||
}
|
||||
|
||||
/** Blow up on impact */
|
||||
simulated function ProcessTouch( Actor Other, Vector HitLocation, Vector HitNormal )
|
||||
{
|
||||
if( Other.bBlockActors )
|
||||
{
|
||||
// don't hit pawns because we don't want to see floating flames when the victim pawn dies
|
||||
if ( Pawn(Other) != None )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// don't hit client-side destructible actors
|
||||
// @todo: maybe don't hit any destructibles for the same reason we don't hit pawns (floating flames when destroyed)?
|
||||
if( KFDestructibleActor(Other) != none && KFDestructibleActor(Other).ReplicationMode == RT_ClientSide )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//Explode( Location, HitNormal );
|
||||
SpawnBloodDecal(Location, HitNormal);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/** Overridden to adjust particle system for different surface orientations (wall, ceiling)
|
||||
* and nudge location
|
||||
*/
|
||||
simulated protected function PrepareExplosionActor(GameExplosionActor GEA)
|
||||
{
|
||||
/*
|
||||
local KFExplosion_Molotov KFEM;
|
||||
local vector ExplosionDir;
|
||||
|
||||
super.PrepareExplosionActor( GEA );
|
||||
|
||||
// KFProjectile::Explode gives GEA a "nudged" location of 32 units, but it's too much, so use a smaller nudge
|
||||
GEA.SetLocation( Location + vector(GEA.Rotation) * 10 );
|
||||
|
||||
KFEM = KFExplosion_Molotov( GEA );
|
||||
if( KFEM != none )
|
||||
{
|
||||
ExplosionDir = vector( KFEM.Rotation );
|
||||
|
||||
if( ExplosionDir.Z < -0.95 )
|
||||
{
|
||||
// ceiling
|
||||
KFEM.LoopingParticleEffect = KFEM.default.LoopingParticleEffectCeiling;
|
||||
}
|
||||
else if( ExplosionDir.Z < 0.05 )
|
||||
{
|
||||
// wall
|
||||
KFEM.LoopingParticleEffect = KFEM.default.LoopingParticleEffectWall;
|
||||
}
|
||||
// else floor
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
simulated function SpawnBloodDecal(vector HitLocation, vector HitNormal )
|
||||
{
|
||||
local KFGoreManager GoreManager;
|
||||
|
||||
// Grab the gore manager
|
||||
GoreManager = KFGoreManager(WorldInfo.MyGoreEffectManager);
|
||||
|
||||
if (GoreManager == none || BloodOriginPawn == none)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
GoreManager.LeaveABloodSplatterDecal(BloodOriginPawn, HitLocation, Normal(Velocity));
|
||||
|
||||
//GoreManager. LeaveAPersistentBloodSplat(HitLocation, HitNormal, 1.0);
|
||||
|
||||
if (KFPawn_Monster(BloodOriginPawn) != none)
|
||||
{
|
||||
GoreManager.CausePersistentBlood(KFPawn_Monster(BloodOriginPawn), class'KFDamageType', HitLocation, Normal(Velocity), 0, false, false);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Use alternative explosion effects when Ground Fire Perk is active
|
||||
*/
|
||||
simulated function PostBeginPlay()
|
||||
{
|
||||
/*
|
||||
local KFPlayerReplicationInfo InstigatorPRI;
|
||||
|
||||
if( AltExploEffects != none && Instigator != none )
|
||||
{
|
||||
InstigatorPRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo);
|
||||
if( InstigatorPRI != none )
|
||||
{
|
||||
bAltExploEffects = InstigatorPRI.bSplashActive;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bAltExploEffects = false;
|
||||
}
|
||||
|
||||
super.PostBeginPlay();
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Force the fire not to burn the instigator, since setting it in the default props is not working for some reason - Ramm
|
||||
* Use the alternative FX for the Ground Fire Perk Skill - Tulio
|
||||
*/
|
||||
simulated protected function PrepareExplosionTemplate()
|
||||
{
|
||||
/*
|
||||
ExplosionTemplate.bIgnoreInstigator=true;
|
||||
super.PrepareExplosionTemplate();
|
||||
|
||||
if( bAltExploEffects )
|
||||
{
|
||||
ExplosionTemplate.ExplosionEffects = AltExploEffects;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
Physics=PHYS_Falling
|
||||
|
||||
bCollideComplex=TRUE // Ignore simple collision on StaticMeshes, and collide per poly
|
||||
|
||||
// network
|
||||
bNetTemporary=False
|
||||
bAlwaysReplicateExplosion=true
|
||||
AlwaysRelevantDistanceSquared=6250000 // 25m
|
||||
|
||||
// gameplay
|
||||
bBlockedByInstigator=false
|
||||
GlassShatterType=FMGS_ShatterNone
|
||||
|
||||
// audio
|
||||
bStopAmbientSoundOnExplode=false
|
||||
bAutoStartAmbientSound=false
|
||||
bAmbientSoundZedTimeOnly=false
|
||||
|
||||
AmbientSoundPlayEvent=None
|
||||
AmbientSoundStopEvent=None
|
||||
|
||||
/*
|
||||
Begin Object Class=AkComponent name=AmbientAkSoundComponent
|
||||
bStopWhenOwnerDestroyed=true
|
||||
bForceOcclusionUpdateInterval=true
|
||||
OcclusionUpdateInterval=0.25;
|
||||
End Object
|
||||
AmbientComponent=AmbientAkSoundComponent
|
||||
Components.Add(AmbientAkSoundComponent)
|
||||
*/
|
||||
|
||||
// light
|
||||
/*
|
||||
Begin Object Class=PointLightComponent Name=FlamePointLight
|
||||
LightColor=(R=245,G=190,B=140,A=255)
|
||||
Brightness=2.f
|
||||
Radius=300.f
|
||||
FalloffExponent=10.f
|
||||
CastShadows=False
|
||||
CastStaticShadows=FALSE
|
||||
CastDynamicShadows=FALSE
|
||||
bCastPerObjectShadows=false
|
||||
bEnabled=FALSE
|
||||
LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE)
|
||||
End Object
|
||||
*/
|
||||
|
||||
// explosion
|
||||
/*
|
||||
Begin Object Class=KFGameExplosion Name=ExploTemplate0
|
||||
Damage=10
|
||||
DamageRadius=150
|
||||
DamageFalloffExponent=1.f
|
||||
DamageDelay=0.f
|
||||
// Don't burn the guy that tossed it, it's just too much damage with multiple fires, its almost guaranteed to kill the guy that tossed it
|
||||
bIgnoreInstigator=true
|
||||
|
||||
MomentumTransferScale=1
|
||||
|
||||
// Damage Effects
|
||||
MyDamageType=class'KFDT_Fire_Ground_MolotovGrenade'
|
||||
KnockDownStrength=0
|
||||
FractureMeshRadius=0
|
||||
ExplosionEffects=KFImpactEffectInfo'wep_molotov_arch.Molotov_GroundFire'
|
||||
|
||||
bDirectionalExplosion=true
|
||||
|
||||
// Camera Shake
|
||||
CamShake=none
|
||||
|
||||
// Dynamic Light
|
||||
ExploLight=FlamePointLight
|
||||
ExploLightStartFadeOutTime=4.2
|
||||
ExploLightFadeOutTime=0.3
|
||||
End Object
|
||||
ExplosionTemplate=ExploTemplate0
|
||||
*/
|
||||
|
||||
ProjFlightTemplate=None
|
||||
//ExplosionActorClass=class'KFExplosion_Molotov'
|
||||
|
||||
AssociatedPerkClass=None
|
||||
|
||||
ImpactDecalMaterial=DecalMaterial'FX_Mat_Lib.FX_CH_BloodSplatter_DM'
|
||||
ImpactDecalMaxSize=125.f
|
||||
ImpactDecalMinSize=75.f
|
||||
ImpactDecalThickness=12.f
|
||||
|
||||
// Ground Fire Perk Skill Alternative FX
|
||||
//AltExploEffects=KFImpactEffectInfo'WEP_Flamethrower_ARCH.GroundFire_Splash_Impacts'
|
||||
}
|
@ -259,5 +259,7 @@ defaultproperties
|
||||
End Object
|
||||
ExplosionTemplate=ExploTemplate0
|
||||
ExplosionActorClass=class'KFExplosionActor'
|
||||
|
||||
bDamageDestructiblesOnTouch=true
|
||||
}
|
||||
|
||||
|
42
KFGameContent/Classes/KFProj_Bullet_Frost_Shotgun_Axe.uc
Normal file
42
KFGameContent/Classes/KFProj_Bullet_Frost_Shotgun_Axe.uc
Normal file
@ -0,0 +1,42 @@
|
||||
//=============================================================================
|
||||
// KFProj_Bullet_Frost_Shotgun_Axe
|
||||
//=============================================================================
|
||||
// Bullet class for the Frost_Shotgun_Axe
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2019 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFProj_Bullet_Frost_Shotgun_Axe extends KFProj_Bullet_Pellet
|
||||
hidedropdown;
|
||||
|
||||
var AkEvent oFrozenSound;
|
||||
|
||||
simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
|
||||
{
|
||||
local KFPawn p;
|
||||
p = KFPawn(Other);
|
||||
super.ProcessTouch(Other, HitLocation, HitNormal);
|
||||
if(p != none)
|
||||
{
|
||||
if(KFPawn_Monster(p).IsDoingSpecialMove(SM_Frozen))
|
||||
{
|
||||
p.PlayAkEvent(oFrozenSound);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
MaxSpeed=7000 //24000.0
|
||||
Speed=7000 //24000.0
|
||||
|
||||
DamageRadius=0
|
||||
|
||||
ProjFlightTemplate=ParticleSystem'WEP_Frost_Shotgun_Axe_EMIT.FX_FrostFang_Tracer_01'
|
||||
ProjFlightTemplateZedTime=ParticleSystem'WEP_Frost_Shotgun_Axe_EMIT.FX_FrostFang_Tracer_Zedtime_01'
|
||||
ImpactEffects=KFImpactEffectInfo'WEP_Frost_Shotgun_Axe_ARCH.WEP_FrostFang_Projectile_Impact'
|
||||
oFrozenSound=AkEvent'WW_WEP_SA_CompoundBow.Play_Arrow_Impact_Cryo'
|
||||
AssociatedPerkClass=class'KFPerk_Support'
|
||||
}
|
||||
|
@ -19,12 +19,13 @@ defaultproperties
|
||||
ProjFlightTemplate=ParticleSystem'FX_Projectile_EMIT.FX_Tracer_9MM_ZEDTime'
|
||||
|
||||
bSpawnShrapnel=true
|
||||
//bDebugShrapnel=true
|
||||
bDebugShrapnel=false
|
||||
|
||||
NumSpawnedShrapnel=3
|
||||
ShrapnelSpreadWidthEnvironment=0.5
|
||||
ShrapnelSpreadHeightEnvironment=0.5
|
||||
ShrapnelSpreadWidthZed=0.5
|
||||
ShrapnelSpreadHeightZed=0.5
|
||||
ShrapnelSpreadWidthEnvironment=0.25 //0.5
|
||||
ShrapnelSpreadHeightEnvironment=0.25 //0.5
|
||||
ShrapnelSpreadWidthZed=0.75 //0.5
|
||||
ShrapnelSpreadHeightZed=0.75 //0.5
|
||||
ShrapnelClass = class'KFProj_Bullet_Pistol_ChiappaRhinoShrapnel'
|
||||
ShrapnelSpawnSoundEvent = AkEvent'WW_WEP_ChiappaRhinos.Play_WEP_ChiappaRhinos_Bullet_Fragmentation'
|
||||
ShrapnelSpawnVFX=ParticleSystem'WEP_ChiappaRhino_EMIT.FX_ChiappaRhino_Shrapnel_Hit'
|
||||
|
63
KFGameContent/Classes/KFProj_CrystalSpike_HRG_Vampire.uc
Normal file
63
KFGameContent/Classes/KFProj_CrystalSpike_HRG_Vampire.uc
Normal file
@ -0,0 +1,63 @@
|
||||
//=============================================================================
|
||||
// KFProj_CrystalSpike_HRG_Vampire
|
||||
//=============================================================================
|
||||
// Bullet class for the HRG Vampire crystal spikes.
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
class KFProj_CrystalSpike_HRG_Vampire extends KFProj_Bullet
|
||||
hidedropdown;
|
||||
|
||||
|
||||
simulated function ProcessBulletTouch(Actor Other, Vector HitLocation, Vector HitNormal)
|
||||
{
|
||||
super.ProcessBulletTouch(Other, HitLocation, HitNormal);
|
||||
|
||||
if( WorldInfo.NetMode != NM_DedicatedServer )
|
||||
{
|
||||
if ( Other.IsA('Pawn') && Other.bCanBeDamaged)
|
||||
{
|
||||
WorldInfo.MyEmitterPool.SpawnEmitter(ImpactEffects.DefaultImpactEffect.ParticleTemplate, HitLocation, rotator(HitNormal), Other);
|
||||
PlaySoundBase(ImpactEffects.DefaultImpactEffect.Sound, true,,, HitLocation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
bWarnAIWhenFired=true
|
||||
|
||||
MaxSpeed=12000.0 //15000.0
|
||||
Speed=12000.0 ///15000.0
|
||||
TerminalVelocity=12000.0 //15000.0
|
||||
|
||||
DamageRadius=0
|
||||
|
||||
ProjFlightTemplate=ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_Projectile_ALT'
|
||||
|
||||
LifeSpan=10
|
||||
|
||||
bBlockedByInstigator=false
|
||||
bCollideActors=true
|
||||
bCollideComplex=true
|
||||
bNoEncroachCheck=true
|
||||
bNoReplicationToInstigator=false
|
||||
bUseClientSideHitDetection=true
|
||||
bUpdateSimulatedPosition=false
|
||||
bRotationFollowsVelocity=false
|
||||
bNetTemporary=false
|
||||
bSyncToOriginalLocation=true
|
||||
|
||||
ImpactEffects = KFImpactEffectInfo'WEP_HRG_Vampire_Arch.HRG_Vampire_SpikeFireImpacts'
|
||||
|
||||
AmbientSoundPlayEvent=None
|
||||
AmbientSoundStopEvent=None
|
||||
|
||||
TouchTimeThreshhold=0.15
|
||||
|
||||
AssociatedPerkClass=class'KFPerk_FieldMedic'
|
||||
}
|
||||
|
@ -142,7 +142,7 @@ defaultproperties
|
||||
FractureMeshRadius=200.0
|
||||
FracturePartVel=500.0
|
||||
//ExplosionEffects=KFImpactEffectInfo'WEP_HX25_Pistol_ARCH.HX25_Pistol_Submunition_Explosion'
|
||||
ExplosionSound=AkEvent'WW_WEP_SA_HX25.Play_WEP_SA_HX25_Explosion'
|
||||
ExplosionSound=AkEvent'ww_wep_hrg_kaboomstick.WEP_HRG_Kaboomstick_Projectile_Explo'
|
||||
ExplosionEffects=KFImpactEffectInfo'WEP_HRG_Kaboomstick_ARCH.WEP_HRG_Kaboomstick_Explosion'
|
||||
//ExplosionSound=AkEvent'WW_WEP_Seeker_6.Play_WEP_Seeker_6_Explosion'
|
||||
|
||||
|
@ -27,6 +27,7 @@ simulated event HitWall(vector HitNormal, actor Wall, PrimitiveComponent WallCom
|
||||
* Returns true if projectile actually bounced / was allowed to bounce */
|
||||
simulated function bool Bounce( vector HitNormal, Actor BouncedOff )
|
||||
{
|
||||
SetLocation(Location + HitNormal);
|
||||
super.Bounce(HitNormal, BouncedOff);
|
||||
|
||||
// stop and drop
|
||||
|
@ -29,9 +29,6 @@ var float DampenFactor;
|
||||
/** Dampen amount for parallel angle to velocity */
|
||||
var float DampenFactorParallel;
|
||||
|
||||
/** How much to offset the mine when spawning inside of collision */
|
||||
var float SpawnCollisionOffsetAmt;
|
||||
|
||||
/** Vector to offset the ground FX particle system by when landing */
|
||||
var vector LandedFXOffset;
|
||||
|
||||
@ -175,8 +172,6 @@ simulated function SetInheritedScale(float Scale, float ChargePercentage)
|
||||
/** Adds our puke mine to the pool */
|
||||
simulated event PostBeginPlay()
|
||||
{
|
||||
local vector Hitlocation, HitNormal;
|
||||
|
||||
// Cache team num
|
||||
TeamNum = GetTeamNum();
|
||||
|
||||
@ -197,13 +192,6 @@ simulated event PostBeginPlay()
|
||||
|
||||
if( Role == ROLE_Authority )
|
||||
{
|
||||
// If we're spawning in collision for some reason, offset it towards the instigator to keep it in play
|
||||
Instigator.Trace( HitLocation, HitNormal, Location, Instigator.Location, false,,, TRACEFLAG_Bullet );
|
||||
if( !IsZero(HitLocation) )
|
||||
{
|
||||
SetLocation( HitLocation + HitNormal*SpawnCollisionOffsetAmt );
|
||||
}
|
||||
|
||||
SetTimer( FuseDuration, false, nameOf(Timer_Explode) );
|
||||
}
|
||||
}
|
||||
@ -864,8 +852,6 @@ defaultproperties
|
||||
// Since we're still using an extent cylinder, we need a line at 0
|
||||
ExtraLineCollisionOffsets.Add(())
|
||||
|
||||
SpawnCollisionOffsetAmt=28.f
|
||||
|
||||
// Collision size we should use when waiting to be triggered
|
||||
ExplodeTriggerRadius=60.f
|
||||
ExplodeTriggerHeight=22.f
|
||||
|
110
KFGameContent/Classes/KFSeasonalEventStats_Xmas2020.uc
Normal file
110
KFGameContent/Classes/KFSeasonalEventStats_Xmas2020.uc
Normal file
@ -0,0 +1,110 @@
|
||||
//=============================================================================
|
||||
// KFSeasonalEventStats_Xmas2020
|
||||
//=============================================================================
|
||||
// Tracks event-specific challenges/accomplishments for Xmas 2020
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
class KFSeasonalEventStats_Xmas2020 extends KFSeasonalEventStats;
|
||||
|
||||
var transient private const int RosesRequired, TomesRequired, EndlessWaveRequired, XmasEventIndex;
|
||||
|
||||
private event Initialize(string MapName)
|
||||
{
|
||||
local string CapsMapName;
|
||||
CapsMapName = Caps(MapName);
|
||||
|
||||
bObjectiveIsValidForMap[0] = 0; // Collect 3 roses in Elysium
|
||||
bObjectiveIsValidForMap[1] = 0; // Collect 4 tomes in Elysium
|
||||
bObjectiveIsValidForMap[2] = 0; // Complete one wave in Elysium's Botanica arena
|
||||
bObjectiveIsValidForMap[3] = 0; // Complete one wave in Elysium's Loremaster Sanctum arena
|
||||
bObjectiveIsValidForMap[4] = 0; // Complete wave 15 on Endless Hard or higher difficulty on Elysium
|
||||
|
||||
if (CapsMapName == "KF-ELYSIUM")
|
||||
{
|
||||
bObjectiveIsValidForMap[0] = 1;
|
||||
bObjectiveIsValidForMap[1] = 1;
|
||||
bObjectiveIsValidForMap[2] = 1;
|
||||
bObjectiveIsValidForMap[3] = 1;
|
||||
bObjectiveIsValidForMap[4] = 1;
|
||||
}
|
||||
|
||||
SetSeasonalEventStatsMax(RosesRequired, TomesRequired, 0, 0, 0);
|
||||
}
|
||||
|
||||
private event GrantEventItems()
|
||||
{
|
||||
if (Outer.IsEventObjectiveComplete(0) &&
|
||||
Outer.IsEventObjectiveComplete(1) &&
|
||||
Outer.IsEventObjectiveComplete(2) &&
|
||||
Outer.IsEventObjectiveComplete(3) &&
|
||||
Outer.IsEventObjectiveComplete(4))
|
||||
{
|
||||
GrantEventItem(8608);
|
||||
}
|
||||
}
|
||||
|
||||
simulated function OnTryCompleteObjective(int ObjectiveIndex, int EventIndex)
|
||||
{
|
||||
local int ObjIdx;
|
||||
|
||||
// Collect 3 roses in Elysium
|
||||
ObjIdx = 0;
|
||||
if (bObjectiveIsValidForMap[ObjIdx] != 0 && ObjectiveIndex == ObjIdx && EventIndex == XmasEventIndex)
|
||||
{
|
||||
IncrementSeasonalEventStat(ObjIdx, 1);
|
||||
if (Outer.GetSeasonalEventStatValue(ObjIdx) >= RosesRequired)
|
||||
{
|
||||
FinishedObjective(XmasEventIndex, ObjIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// Collect 4 tomes in Elysium
|
||||
ObjIdx = 1;
|
||||
if (bObjectiveIsValidForMap[ObjIdx] != 0 && ObjectiveIndex == ObjIdx && EventIndex == XmasEventIndex)
|
||||
{
|
||||
IncrementSeasonalEventStat(ObjIdx, 1);
|
||||
if (Outer.GetSeasonalEventStatValue(ObjIdx) >= TomesRequired)
|
||||
{
|
||||
FinishedObjective(XmasEventIndex, ObjIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// Complete one wave in Elysium's Botanica arena
|
||||
ObjIdx = 2;
|
||||
if (bObjectiveIsValidForMap[ObjIdx] != 0 && ObjectiveIndex == ObjIdx && EventIndex == XmasEventIndex)
|
||||
{
|
||||
FinishedObjective(XmasEventIndex, ObjIdx);
|
||||
}
|
||||
|
||||
// Complete one wave in Elysium's Loremaster Sanctum arena
|
||||
ObjIdx = 3;
|
||||
if (bObjectiveIsValidForMap[ObjIdx] != 0 && ObjectiveIndex == ObjIdx && EventIndex == XmasEventIndex)
|
||||
{
|
||||
FinishedObjective(XmasEventIndex, ObjIdx);
|
||||
}
|
||||
}
|
||||
|
||||
simulated event OnWaveCompleted(class<GameInfo> GameClass, int Difficulty, int WaveNum)
|
||||
{
|
||||
local int ObjIdx;
|
||||
|
||||
// Complete wave 15 on Endless Hard or higher difficulty on Elysium
|
||||
ObjIdx = 4;
|
||||
if (bObjectiveIsValidForMap[ObjIdx] != 0)
|
||||
{
|
||||
if (WaveNum >= EndlessWaveRequired && GameClass == class'KFGameInfo_Endless' && Difficulty >= `DIFFICULTY_HARD)
|
||||
{
|
||||
FinishedObjective(XmasEventIndex, ObjIdx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
RosesRequired=3
|
||||
TomesRequired=4
|
||||
EndlessWaveRequired=15
|
||||
XmasEventIndex=SEI_Winter
|
||||
}
|
56
KFGameContent/Classes/KFSeqAct_ProgressSeasonalObjective.uc
Normal file
56
KFGameContent/Classes/KFSeqAct_ProgressSeasonalObjective.uc
Normal file
@ -0,0 +1,56 @@
|
||||
//=============================================================================
|
||||
// KFSeqAct_ProgressSeasonalObjective
|
||||
//=============================================================================
|
||||
// Sequence action to allow a map to have add progress to seasonal objectives
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFSeqAct_ProgressSeasonalObjective extends SequenceAction;
|
||||
|
||||
/** Objective index for the event this is tied to */
|
||||
var() int ObjectiveIndex;
|
||||
|
||||
/** Index of the event this is tied to */
|
||||
var() int EventIndex;
|
||||
|
||||
/** Increment progress for all players? */
|
||||
var() bool bAllPlayersAffected;
|
||||
|
||||
event Activated()
|
||||
{
|
||||
local KFPlayercontroller KFPC;
|
||||
local bool bIsObjectiveDataValid;
|
||||
|
||||
bIsObjectiveDataValid = ObjectiveIndex >= 0 && ObjectiveIndex < 5 && EventIndex > SEI_None && EventIndex < SEI_MAX;
|
||||
|
||||
if (bAllPlayersAffected)
|
||||
{
|
||||
foreach GetWorldInfo().AllControllers(class'KFPlayerController', KFPC)
|
||||
{
|
||||
if(bIsObjectiveDataValid)
|
||||
{
|
||||
KFPC.ClientOnTryCompleteObjective(ObjectiveIndex, EventIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
KFPC = KFPlayerController(GetWorldInfo().GetALocalPlayerController());
|
||||
if(bIsObjectiveDataValid)
|
||||
{
|
||||
KFPC.ClientOnTryCompleteObjective(ObjectiveIndex, EventIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
ObjName="Progress Seasonal Objective"
|
||||
ObjCategory="Killing Floor"
|
||||
|
||||
ObjectiveIndex=-1
|
||||
EventIndex=-1
|
||||
bAllPlayersAffected=true
|
||||
}
|
749
KFGameContent/Classes/KFSprayActor_HRG_Vampire.uc
Normal file
749
KFGameContent/Classes/KFSprayActor_HRG_Vampire.uc
Normal file
@ -0,0 +1,749 @@
|
||||
//=============================================================================
|
||||
// KFSprayActor_HRG_Vampire
|
||||
//=============================================================================
|
||||
// Base class for spray actor that sucks enemies blood
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2019 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
class KFSprayActor_HRG_Vampire extends KFSprayActor
|
||||
hidecategories(Object, Movement, Display, Attachment, Collision, Physics, Advanced, Debug, Mobile)
|
||||
placeable;
|
||||
|
||||
|
||||
/** Transient PSCs to workaround issue with setting the BonePSC in an archetype */
|
||||
var transient array<KFParticleSystemComponent> BoneChainComponents;
|
||||
var transient array<KFParticleSystemComponent> BoneChainComponents_1stP;
|
||||
|
||||
/** Firebug Perk can modify the flame length, we need an alternative anim for that */
|
||||
var(SprayMesh) AnimSet AltSprayAnimSet;
|
||||
|
||||
var(SuckerConfig) int MaxNumberOfZedsZapped;
|
||||
var(SuckerConfig) int MaxDistanceToBeZapped;
|
||||
var(SuckerConfig) float ZapInterval;
|
||||
var(SuckerConfig) int ChainDamage;
|
||||
|
||||
var KFWeap_HRG_Vampire OwnerWeapon;
|
||||
|
||||
/***************************************
|
||||
|
||||
INHERITED FROM SPRAY AND NOT MODIFIED
|
||||
|
||||
***************************************/
|
||||
|
||||
event PreBeginPlay()
|
||||
{
|
||||
super.PreBeginPlay();
|
||||
SetBoneChainComponents();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set (or create) PSC's for the BoneChain. Use this when creating an archetype template spray
|
||||
* effect to workaround an issue where assigning a transient default BoneChain PSC doesn't work.
|
||||
*/
|
||||
simulated function SetBoneChainComponents()
|
||||
{
|
||||
local int Idx;
|
||||
|
||||
for (Idx = 0; Idx < BoneChain.length; ++Idx)
|
||||
{
|
||||
if ( Idx < BoneChainComponents.Length )
|
||||
{
|
||||
BoneChain[Idx].BonePSC0 = BoneChainComponents[Idx];
|
||||
}
|
||||
if ( Idx < BoneChainComponents_1stP.Length )
|
||||
{
|
||||
BoneChain[Idx].BonePSC1 = BoneChainComponents_1stP[Idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
simulated function BeginSpray()
|
||||
{
|
||||
local KFPerk InstigatorPerk;
|
||||
|
||||
if( bDeleteMe )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
super.BeginSpray();
|
||||
|
||||
if( OwningKFPawn != none )
|
||||
{
|
||||
InstigatorPerk = OwningKFPawn.GetPerk();
|
||||
if( InstigatorPerk != none )
|
||||
{
|
||||
SplashDamage = default.SplashDamage;
|
||||
}
|
||||
|
||||
//SetSprayLength();
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************
|
||||
|
||||
END INHERITED FROM SPRAY AND NOT MODIFIED
|
||||
|
||||
***************************************/
|
||||
|
||||
|
||||
/**
|
||||
* Overridden to handle the rotation sound pitching for the flamethrower sound
|
||||
*/
|
||||
simulated event Tick(float DeltaTime)
|
||||
{
|
||||
super.Tick(DeltaTime);
|
||||
|
||||
// Set the rotation speed for the flamethrower sound
|
||||
if( !bDetached && OwningKFPawn != none && WorldInfo.NetMode != NM_DedicatedServer )
|
||||
{
|
||||
OwningKFPawn.SetWeaponComponentRTPCValue( "FlamethrowerRotation", RotationSpeed);
|
||||
}
|
||||
}
|
||||
|
||||
simulated function CleanupEndFire()
|
||||
{
|
||||
super.CleanupEndFire();
|
||||
SprayMeshExitCollision();
|
||||
}
|
||||
|
||||
|
||||
simulated event SprayMeshHit(Actor _TouchActor)
|
||||
{
|
||||
local KFPawn_Monster TouchActor;
|
||||
//if (Role == ROLE_Authority)
|
||||
//{
|
||||
//`Warn("TOUCHED IN: "$_TouchActor.Location$"");
|
||||
//if the sprayed actor is a monster, then we start zapping enemies
|
||||
|
||||
if(_TouchActor.IsA('KFPawn_Monster'))
|
||||
{
|
||||
TouchActor = KFPawn_Monster(_TouchActor);
|
||||
if(OwnerWeapon != none && TouchActor != OwnerWeapon.oZedCurrentlyBeingSprayed)
|
||||
{
|
||||
OwnerWeapon.SetCurrentSprayedZed(TouchActor);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SprayMeshExitCollision();
|
||||
}
|
||||
|
||||
//}
|
||||
/*if (!CheckRecentlyZapped(_TouchActor))
|
||||
{
|
||||
NewActorInfo.HitActor = _TouchActor;
|
||||
NewActorInfo.HitTime = WorldInfo.TimeSeconds;
|
||||
vRecentlyZappedActors.AddItem(NewActorInfo);
|
||||
}*/
|
||||
|
||||
super.SprayMeshHit(_TouchActor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
simulated event SprayMeshExitCollision()
|
||||
{
|
||||
if (OwnerWeapon == none)
|
||||
{
|
||||
return;
|
||||
}
|
||||
OwnerWeapon.SetCurrentSprayedZed(none);
|
||||
}
|
||||
/**
|
||||
* @brief Changes the flame's length if the Firebug's Range skill is selected
|
||||
*
|
||||
* @param InstigatorPerk Instigator's current perk
|
||||
*/
|
||||
/*simulated function SetSprayLength()
|
||||
{
|
||||
local AnimSet TempAnimSet;
|
||||
local KFPlayerReplicationInfo OwningPawnPRI;
|
||||
|
||||
if ( default.AltSprayAnimSet == None )
|
||||
{
|
||||
return; // only once length available
|
||||
}
|
||||
|
||||
// Firebug range skill can affect the flame weapons range
|
||||
OwningPawnPRI = KFPlayerReplicationInfo(OwningKFPawn.PlayerReplicationInfo);
|
||||
if( OwningPawnPRI != none )
|
||||
{
|
||||
TempAnimSet = OwningPawnPRI.bExtraFireRange ? default.AltSprayAnimSet : default.SprayAnimSet;
|
||||
}
|
||||
|
||||
// Don't set the anim set to nothing if the archetype is screwed up
|
||||
// Don't set the anim set and tree if they do not need to be changed
|
||||
if( TempAnimSet == none || TempAnimSet == SkeletalSprayMesh.AnimSets[0] )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SkeletalSprayMesh.AnimSets[0] = TempAnimSet;
|
||||
SkeletalSprayMesh.UpdateAnimations();
|
||||
SetupFX();
|
||||
}*/
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
Physics=PHYS_Interpolating
|
||||
TickGroup=TG_PostAsyncWork
|
||||
bStatic=false
|
||||
bCollideActors=TRUE
|
||||
bBlockActors=false
|
||||
bWorldGeometry=false
|
||||
// This must not be bCollideWorld or it will get pushed around in FarMoveActor
|
||||
bCollideWorld=false
|
||||
bProjTarget=false
|
||||
bIgnoreEncroachers=FALSE
|
||||
bNoEncroachCheck=TRUE
|
||||
RemoteRole=ROLE_None
|
||||
GravityScaleRange=(X=0.f,Y=-15.f)
|
||||
GravityScaleInTime=0.5f
|
||||
MomentumScale=0.15f
|
||||
MyDamageType=class'KFDT_EMP'
|
||||
|
||||
// ---------------------------------------------
|
||||
// Splash damage
|
||||
SplashGlancingDotLimit=-0.9f
|
||||
SplashRotInterpSpeed=8.f
|
||||
SplashLocInterpSpeed=40.f
|
||||
bDoCollideComplex=TRUE
|
||||
SprayDamageScaleDistRange=(X=300,Y=300)
|
||||
SprayDamage=(X=10,Y=10)
|
||||
SplashDamageRadius=300.f
|
||||
SplashDamage=10
|
||||
SplashDamageFalloffExponent=1.f
|
||||
|
||||
// ---------------------------------------------
|
||||
// Per-bone Fire FX
|
||||
PerBoneSprayFXGlobalScale=1.f
|
||||
bDoPerBoneSprayFX=TRUE
|
||||
|
||||
// ---------------------------------------------
|
||||
// Material params
|
||||
MaterialHeatRampTime=0.65f
|
||||
MaterialHeatRange=(X=0.f,Y=0.8f)
|
||||
MaterialFadeOutTime=0.2f
|
||||
MaterialCurrentFadeVal=1.f
|
||||
MatFadePow=2.f
|
||||
|
||||
// ---------------------------------------------
|
||||
// Content
|
||||
Begin Object Class=KFSkeletalMeshComponent Name=FlameCore0
|
||||
CollideActors=true
|
||||
BlockActors=false
|
||||
BlockZeroExtent=true
|
||||
BlockNonZeroExtent=true
|
||||
bUpdateSkelWhenNotRendered=TRUE
|
||||
bIgnoreControllersWhenNotRendered=FALSE
|
||||
bOverrideAttachmentOwnerVisibility=TRUE
|
||||
CastShadow=FALSE
|
||||
bAcceptsStaticDecals=FALSE
|
||||
bAcceptsDynamicDecals=FALSE
|
||||
Rotation=(Roll=-16384)
|
||||
SkeletalMesh=SkeletalMesh'FX_Flamethrower_MESH.WEP_Flamethrower_Flame_A'
|
||||
AnimTreeTemplate=AnimTree'FX_Flamethrower_ANIM.WEP_Flamethrower_Flame_AT'
|
||||
AnimSets(0)=AnimSet'FX_Flamethrower_ANIM.WEP_Flamethrower_Flame_Anim'
|
||||
End Object
|
||||
SkeletalSprayMesh=FlameCore0
|
||||
CollisionComponent=FlameCore0
|
||||
Components.Add(FlameCore0)
|
||||
|
||||
SkelMesh=SkeletalMesh'FX_Flamethrower_MESH.WEP_Flamethrower_Flame_A'
|
||||
SprayAnimSet=AnimSet'FX_Flamethrower_ANIM.WEP_Flamethrower_Flame_Anim'
|
||||
SprayAnimTreeTemplate=AnimTree'FX_Flamethrower_ANIM.WEP_Flamethrower_Flame_AT'
|
||||
|
||||
AltSprayAnimSet=AnimSet'FX_Flamethrower_ANIM.Wep_Caulk_Flame_Anim'
|
||||
|
||||
// bLeaveStickyFire=FALSE
|
||||
// StickyFireMinTimeBetweenSpawns=0.25f
|
||||
// StickyFireOwnerSafeRadius=64
|
||||
// StickyFireInitialDelay=0.5f
|
||||
// StickyFireTestLocInterpSpeed=5.f
|
||||
// StickyFireTestLocThreshold=64.f
|
||||
|
||||
ImpactEffects=KFImpactEffectInfo'WEP_Flamethrower_ARCH.Flame_Impacts'
|
||||
|
||||
SprayEndEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_End_muzzleflash_01'
|
||||
SprayStartEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_Start_muzzleflash'
|
||||
|
||||
SplashGlancingEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_flame_deflect_01'
|
||||
Begin Object Class=KFParticleSystemComponent Name=SplashGlancingPSC0
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
SplashGlancingPSC=SplashGlancingPSC0
|
||||
Components.Add(SplashGlancingPSC0)
|
||||
|
||||
SplashDirectEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_Flame_impact_01'
|
||||
Begin Object Class=KFParticleSystemComponent Name=SplashDirectPSC0
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
SplashDirectPSC=SplashDirectPSC0
|
||||
Components.Add(SplashDirectPSC0)
|
||||
|
||||
SplashPawnEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_Flame_impact_player_01'
|
||||
Begin Object Class=KFParticleSystemComponent Name=SplashPawnPSC0
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
SplashPawnPSC=SplashPawnPSC0
|
||||
Components.Add(SplashPawnPSC0)
|
||||
|
||||
Begin Object Class=KFParticleSystemComponent Name=SplashMaterialBasedPSC0
|
||||
bAutoActivate=FALSE
|
||||
Template=None // filled in by the code based on what was hit
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
SplashMaterialBasedPSC=SplashMaterialBasedPSC0
|
||||
Components.Add(SplashMaterialBasedPSC0)
|
||||
|
||||
// per-bone fire fx
|
||||
LastBoneChainIndexThatCanSpawnSplashEffects=11
|
||||
|
||||
// bone01
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone01_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
Rotation=(Yaw=32768)
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone01_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
Rotation=(Yaw=32768)
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone02
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone02_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
Rotation=(Yaw=32768)
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone02_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
Rotation=(Yaw=32768)
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone03
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone03_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
Rotation=(Yaw=32768)
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone03_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
Rotation=(Yaw=32768)
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone04
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone04_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone04_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone05
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone05_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone05_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone06
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone06_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone06_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone07
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone07_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone07_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone08
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone08_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone08_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone09
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone09_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone09_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone10
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone10_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone10_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone11
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone11_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone11_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone12
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone12_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone12_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
// bone13
|
||||
// 3rd person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone13_PSC0
|
||||
bOwnerNoSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
// first person
|
||||
Begin Object Class=KFParticleSystemComponent Name=Bone13_PSC1
|
||||
bOnlyOwnerSee=TRUE
|
||||
bAutoActivate=FALSE
|
||||
TranslucencySortPriority=1
|
||||
SecondsBeforeInactive=0
|
||||
End Object
|
||||
|
||||
BoneChain(0)={(BoneName=Bone01,
|
||||
MaterialParam=0.0,
|
||||
BoneScale=1.f,
|
||||
EffectScale=1.0f,
|
||||
ParticleSystemTemplate=none,
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_Initial_spawn_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone01_PSC0,
|
||||
BonePSC1=Bone01_PSC1)}
|
||||
BoneChain(1)={(BoneName=Bone02,
|
||||
MaterialParam=0.04,
|
||||
BoneScale=1.f,
|
||||
EffectScale=1.0f,
|
||||
ParticleSystemTemplate=none,
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_Initial_spawn_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone01_PSC0,
|
||||
BonePSC1=Bone01_PSC1)}
|
||||
BoneChain(2)={(BoneName=Bone03,
|
||||
MaterialParam=0.080000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=0.250000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_reverse_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_reverse_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone02_PSC0,
|
||||
BonePSC1=Bone02_PSC1)}
|
||||
BoneChain(3)={(BoneName=Bone04,
|
||||
MaterialParam=0.130000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=0.250000,
|
||||
ParticleSystemTemplate=None,
|
||||
ParticleSystemTemplate1P=None,
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone03_PSC0,
|
||||
BonePSC1=Bone03_PSC1)}
|
||||
BoneChain(4)={(BoneName=Bone05,
|
||||
MaterialParam=0.190000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=0.500000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone04_PSC0,
|
||||
BonePSC1=Bone04_PSC1)}
|
||||
BoneChain(5)={(BoneName=Bone06,
|
||||
MaterialParam=0.240000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=0.500000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone05_PSC0,
|
||||
BonePSC1=Bone05_PSC1)}
|
||||
BoneChain(6)={(BoneName=Bone07,
|
||||
MaterialParam=0.310000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=1.800000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone06_PSC0,
|
||||
BonePSC1=Bone06_PSC1)}
|
||||
BoneChain(7)={(BoneName=Bone08,
|
||||
MaterialParam=0.370000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=0.500000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone07_PSC0,
|
||||
BonePSC1=Bone07_PSC1)}
|
||||
BoneChain(8)={(BoneName=Bone09,
|
||||
MaterialParam=0.440000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=1.000000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone08_PSC0,
|
||||
BonePSC1=Bone08_PSC1)}
|
||||
BoneChain(9)={(BoneName=Bone10,
|
||||
MaterialParam=0.500000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=1.000000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone09_PSC0,
|
||||
BonePSC1=Bone09_PSC1)}
|
||||
BoneChain(10)={(BoneName=Bone11,
|
||||
MaterialParam=0.560000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=1.000000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone10_PSC0,
|
||||
BonePSC1=Bone10_PSC1)}
|
||||
BoneChain(11)={(BoneName=Bone12,
|
||||
MaterialParam=0.620000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=1.000000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone11_PSC0,
|
||||
BonePSC1=Bone11_PSC1)}
|
||||
BoneChain(12)={(BoneName=Bone13,
|
||||
MaterialParam=0.690000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=1.000000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone12_PSC0,
|
||||
BonePSC1=Bone12_PSC1)}
|
||||
BoneChain(13)={(BoneName=Bone14,
|
||||
MaterialParam=0.760000,
|
||||
BoneScale=1.f,
|
||||
EffectScale=1.000000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_End_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f,
|
||||
BonePSC0=Bone13_PSC0,
|
||||
BonePSC1=Bone13_PSC1)}
|
||||
BoneChain(14)={(BoneName=Bone15,
|
||||
MaterialParam=0.820000,
|
||||
BoneScale=0.f,
|
||||
EffectScale=1.000000,
|
||||
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_End_01_3P',
|
||||
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
|
||||
ParticleActivationDelay=0.0f)}
|
||||
|
||||
BoneChainComponents={(Bone01_PSC0, Bone01_PSC0, Bone02_PSC0, Bone03_PSC0, Bone04_PSC0, Bone05_PSC0, Bone06_PSC0,
|
||||
Bone07_PSC0, Bone08_PSC0, Bone09_PSC0, Bone10_PSC0, Bone11_PSC0, Bone12_PSC0, Bone13_PSC0)}
|
||||
BoneChainComponents_1stP={(Bone01_PSC1, Bone01_PSC1, Bone02_PSC1, Bone03_PSC1, Bone04_PSC1, Bone05_PSC1, Bone06_PSC1,
|
||||
Bone07_PSC1, Bone08_PSC1, Bone09_PSC1, Bone10_PSC1, Bone11_PSC1, Bone12_PSC1, Bone13_PSC1)}
|
||||
|
||||
// pointlight at far end of spray
|
||||
Begin Object Class=PointLightComponent Name=FlamePointLight2
|
||||
LightColor=(R=245,G=190,B=140,A=255)
|
||||
Brightness=4.f
|
||||
Radius=500.f
|
||||
FalloffExponent=10.f
|
||||
CastShadows=False
|
||||
CastStaticShadows=FALSE
|
||||
CastDynamicShadows=TRUE
|
||||
bCastPerObjectShadows=false
|
||||
bEnabled=FALSE
|
||||
LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE)
|
||||
End Object
|
||||
|
||||
// Muzzle Flash point light
|
||||
// want this light to illuminate characters only, so Marcus gets the glow
|
||||
Begin Object Class=PointLightComponent Name=FlamePointLight0
|
||||
LightColor=(R=250,G=150,B=85,A=255)
|
||||
Brightness=6.0f
|
||||
FalloffExponent=10.f
|
||||
Radius=750.f
|
||||
CastShadows=False
|
||||
CastStaticShadows=FALSE
|
||||
CastDynamicShadows=TRUE
|
||||
bCastPerObjectShadows=false
|
||||
bEnabled=FALSE
|
||||
LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE)
|
||||
End Object
|
||||
|
||||
SprayLights(0)=(Light=FlamePointLight0,BoneChainIndex=1,FlickerIntensity=5.f,FlickerInterpSpeed=15.f)
|
||||
SprayLights(1)=(Light=FlamePointLight2,BoneChainIndex=9,FlickerIntensity=5.f,FlickerInterpSpeed=15.f)
|
||||
|
||||
// MaterialHeatRampTime=0.65f
|
||||
// MaterialHeatRange=(X=0.f,Y=0.8f)
|
||||
// MaterialFadeOutTime=0.2f
|
||||
// MaterialCurrentFadeVal=1.f
|
||||
// MatFadePow=2.f
|
||||
// Begin Object Class=AudioComponent Name=SplashMaterialBasedAC0
|
||||
// // cue will be filled in from physicalmaterial data
|
||||
// SoundCue=None
|
||||
// bStopWhenOwnerDestroyed=TRUE
|
||||
// bUseOwnerLocation=FALSE
|
||||
// End Object
|
||||
// SplashMaterialBasedAC=SplashMaterialBasedAC0
|
||||
|
||||
// Splash audio
|
||||
Begin Object Class=AkComponent name=CurrentSplashAkSoundComponent
|
||||
bStopWhenOwnerDestroyed=true
|
||||
bForceOcclusionUpdateInterval=true
|
||||
OcclusionUpdateInterval=0.2;
|
||||
End Object
|
||||
CurrentSplashAKC=CurrentSplashAkSoundComponent
|
||||
Components.Add(CurrentSplashAkSoundComponent)
|
||||
|
||||
SplashPawnAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Play_WEP_SA_Flamethrower_Impact_Flesh'
|
||||
SplashDirectAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Play_WEP_SA_Flamethrower_Impact_Default'
|
||||
SplashGlancingAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Play_WEP_SA_Flamethrower_Impact_Default'
|
||||
|
||||
SplashPawnStopAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Stop_WEP_SA_Flamethrower_Impact_Flesh_Loop'
|
||||
SplashDirectStopAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Stop_WEP_SA_Flamethrower_Impact_Default_Loop'
|
||||
SplashGlancingStopAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Stop_WEP_SA_Flamethrower_Impact_Default_Loop'
|
||||
|
||||
Begin Object Class=KFParticleSystemComponent Name=StartFirePSC0
|
||||
bAutoActivate=TRUE
|
||||
TickGroup=TG_PostUpdateWork
|
||||
End Object
|
||||
SprayStartPSC=StartFirePSC0
|
||||
|
||||
SeedSprayVel=10000.f//5000.f
|
||||
SeedDecel=28000.f//13000.f
|
||||
SeedMaxAge=0.4f
|
||||
SeedMinChainLength=0.f
|
||||
SeedSimFreq=60.f
|
||||
SeedWarmupTime=0.25f
|
||||
VelocityScaleZ=0.3f//0.15f
|
||||
|
||||
bUseExtentTracing=true
|
||||
SpraySocketName=MuzzleFlash
|
||||
|
||||
//ImpactProjectileClass=class'KFProj_GroundFire'
|
||||
|
||||
ImpactProjectileInterval=0.099
|
||||
|
||||
|
||||
}
|
496
KFGameContent/Classes/KFWeapAttach_HRG_Vampire.uc
Normal file
496
KFGameContent/Classes/KFWeapAttach_HRG_Vampire.uc
Normal file
@ -0,0 +1,496 @@
|
||||
//=============================================================================
|
||||
// KFWeapAttach_HRG_Vampire
|
||||
//=============================================================================
|
||||
//
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2020 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
class KFWeapAttach_HRG_Vampire extends KFWeapAttach_SprayBase;
|
||||
|
||||
var transient ParticleSystemComponent ChargingPSC;
|
||||
var transient ParticleSystemComponent ChargedPSC;
|
||||
var ParticleSystem ChargingEffect;
|
||||
var ParticleSystem ChargedEffect;
|
||||
var ParticleSystem BloodStolenEffect;
|
||||
var bool bIsCharging;
|
||||
var bool bIsFullyCharged;
|
||||
var bool bIsChargeEffectsActive;
|
||||
var bool bIsBloodParticlesEffectActive;
|
||||
var bool bIsDisabledSprayVisualAndMesh;
|
||||
|
||||
var repnotify float StartFireTime;
|
||||
|
||||
var int ChargeLevel;
|
||||
|
||||
var float FXScalingFactorByCharge;
|
||||
var float ChargeRTPC;
|
||||
|
||||
var KFPawn_Monster oZedCurrentlyBeingSprayed;
|
||||
var KFPawn_Monster oZedPreviouslyBeingSprayed;
|
||||
|
||||
var KFWeap_HRG_Vampire Weapon;
|
||||
|
||||
var KFEmit_DirectionalPath BloodStolenParticles[15];
|
||||
var int NumBloodStolenParticlesForPool;
|
||||
|
||||
var transient float BloodStolenControlTime;
|
||||
|
||||
var float RateUpdateDestinationBloodParticles;
|
||||
var transient float UpdateDestinationBloodParticlesTime;
|
||||
|
||||
var class<KFProj_BloodSplash> BloodSplashClass;
|
||||
|
||||
var bool bHasToStopDoingFireAnim;
|
||||
var bool bHasToStopDoingFireAnimB;
|
||||
|
||||
/** Blood Particles */
|
||||
var(BloodParticles) float SpeedBloodParticles;
|
||||
var(BloodParticles) float SpawnRateBloodParticles;
|
||||
var(BloodParticles) float SpeedBloodParticles_3P;
|
||||
var(BloodParticles) float SpawnRateBloodParticles_3P;
|
||||
var(BloodParticles) float HalfAngleSpawnCone;
|
||||
var(BloodParticles) float CurveTurnRateUntilDestinationFinal;
|
||||
var(BloodParticles) float CurveTurnRateUntilDestinationMidPoint;
|
||||
var(BloodParticles) float LimitDistanceFinalPoint;
|
||||
var(BloodParticles) float LimitDistanceMidPoint;
|
||||
|
||||
simulated function PostBeginPlay()
|
||||
{
|
||||
local int Index;
|
||||
|
||||
super.PostBeginPlay();
|
||||
UpdateDestinationBloodParticlesTime = RateUpdateDestinationBloodParticles;
|
||||
|
||||
for( Index = (NumBloodStolenParticlesForPool - 1) ; Index >= 0 ; Index-- )
|
||||
{
|
||||
BloodStolenParticles[Index] = Spawn(class'KFEmit_DirectionalPath');
|
||||
BloodStolenParticles[Index].DeactivateEmitter();
|
||||
BloodStolenParticles[Index].SetTemplate(BloodStolenEffect, true);
|
||||
}
|
||||
}
|
||||
|
||||
simulated function StartFire()
|
||||
{
|
||||
StartFireTime = WorldInfo.TimeSeconds;
|
||||
bIsCharging = false;
|
||||
bIsFullyCharged = false;
|
||||
bIsDisabledSprayVisualAndMesh = false;
|
||||
|
||||
if (ChargingPSC == none)
|
||||
{
|
||||
ChargingPSC = new(self) class'ParticleSystemComponent';
|
||||
|
||||
if (WeapMesh != none)
|
||||
{
|
||||
WeapMesh.AttachComponentToSocket(ChargingPSC, 'MuzzleFlash');
|
||||
}
|
||||
else
|
||||
{
|
||||
AttachComponent(ChargingPSC);
|
||||
}
|
||||
ChargingPSC.SetTemplate(ChargingEffect);
|
||||
}
|
||||
|
||||
if (ChargedPSC == none)
|
||||
{
|
||||
ChargedPSC = new(self) class'ParticleSystemComponent';
|
||||
|
||||
if (WeapMesh != none)
|
||||
{
|
||||
WeapMesh.AttachComponentToSocket(ChargedPSC, 'MuzzleFlash');
|
||||
}
|
||||
else
|
||||
{
|
||||
AttachComponent(ChargedPSC);
|
||||
}
|
||||
ChargedPSC.SetTemplate(ChargedEffect);
|
||||
}
|
||||
ChargingPSC.SetActive( false );
|
||||
ChargedPSC.SetActive( false );
|
||||
}
|
||||
|
||||
simulated event Tick(float DeltaTime)
|
||||
{
|
||||
local int Index;
|
||||
local vector MuzzleFlashSocketLocation, BloodParticlesMidPointSocketLocation;
|
||||
local KFEmit_DirectionalPath EmitterToRemove;
|
||||
local vector VectorParameterParticle;
|
||||
local vector ChargePercentageVector;
|
||||
local Rotator DestinationRotation, BloodParticlesMidPointSocketRotation;
|
||||
local vector BloodSplashVelocity;
|
||||
|
||||
if(bIsChargeEffectsActive)
|
||||
{
|
||||
if(bIsCharging)
|
||||
{
|
||||
ChargingPSC.SetActive( true, true );
|
||||
ChargePercentageVector.X = ChargeRTPC;
|
||||
ChargePercentageVector.Y = ChargeRTPC;
|
||||
ChargePercentageVector.Z = ChargeRTPC;
|
||||
ChargingPSC.SetVectorParameter( name("BlobCharge"), ChargePercentageVector);
|
||||
}
|
||||
|
||||
if(bIsFullyCharged)
|
||||
{
|
||||
ChargedPSC.SetActive( true, true );
|
||||
ChargingPSC.SetFloatParameter( name("InflateBlob"), ChargeRTPC);
|
||||
}
|
||||
}
|
||||
|
||||
if (bIsDisabledSprayVisualAndMesh)
|
||||
{
|
||||
TurnOffFireSpray();
|
||||
ActiveFlameSpray.CleanupEndFire();
|
||||
}
|
||||
|
||||
//Spawning blood particles if conditions met
|
||||
if (bIsBloodParticlesEffectActive)
|
||||
{
|
||||
if(oZedCurrentlyBeingSprayed != none && oZedCurrentlyBeingSprayed.IsAliveAndWell())
|
||||
{
|
||||
CreateBloodParticle(DeltaTime, oZedCurrentlyBeingSprayed);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Updating blood stolen particles FX destination position
|
||||
|
||||
UpdateDestinationBloodParticlesTime -= DeltaTime;
|
||||
if (UpdateDestinationBloodParticlesTime <= 0)
|
||||
{
|
||||
UpdateDestinationBloodParticlesTime = RateUpdateDestinationBloodParticles;
|
||||
|
||||
if( WeapMesh != none )
|
||||
{
|
||||
GetFlameSocketLocAndRot(MuzzleFlashSocketLocation, DestinationRotation);
|
||||
WeapMesh.GetSocketWorldLocationAndRotation('BloodParticlesMidPoint', BloodParticlesMidPointSocketLocation, BloodParticlesMidPointSocketRotation);
|
||||
}
|
||||
|
||||
for( Index = (NumBloodStolenParticlesForPool - 1) ; Index >= 0 ; Index-- )
|
||||
{
|
||||
if(!BloodStolenParticles[Index].IsEnabled || BloodStolenParticles[Index] == None)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if( BloodStolenParticles[Index].bReachDestinationFinal )
|
||||
{
|
||||
EmitterToRemove = BloodStolenParticles[Index];
|
||||
//BloodStolenParticles.Remove(Index, 1);
|
||||
EmitterToRemove.DeactivateEmitter();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (BloodStolenParticles[Index].ParticleSystemComponent != None)
|
||||
{
|
||||
VectorParameterParticle.X = WorldInfo.TimeDilation;
|
||||
VectorParameterParticle.Y = WorldInfo.TimeDilation;
|
||||
VectorParameterParticle.Z = WorldInfo.TimeDilation;
|
||||
BloodStolenParticles[Index].ParticleSystemComponent.SetVectorParameter( name("ZedtimeScale"), VectorParameterParticle );
|
||||
}
|
||||
BloodStolenParticles[Index].UpdateDestination( MuzzleFlashSocketLocation, BloodParticlesMidPointSocketLocation );
|
||||
|
||||
if (FRand() > 0.47)
|
||||
{
|
||||
BloodSplashVelocity.x = 0;
|
||||
BloodSplashVelocity.y = RandRange(-100, 100);
|
||||
BloodSplashVelocity.z = -200;
|
||||
SpawnBloodSplash(BloodSplashClass, BloodStolenParticles[Index].Location, BloodSplashVelocity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Super.Tick(DeltaTime);
|
||||
}
|
||||
|
||||
simulated function FirstPersonFireEffects(Weapon W, vector HitLocation)
|
||||
{
|
||||
super.FirstPersonFireEffects(W, HitLocation);
|
||||
}
|
||||
|
||||
simulated function bool ThirdPersonFireEffects(vector HitLocation, KFPawn P, byte ThirdPersonAnimRateByte )
|
||||
{
|
||||
local EAnimSlotStance AnimType;
|
||||
local bool bResult;
|
||||
bIsChargeEffectsActive = true;
|
||||
bIsBloodParticlesEffectActive = true;
|
||||
|
||||
//bResult = Super(KFWeaponAttachment).ThirdPersonFireEffects(HitLocation,P,ThirdPersonAnimRateByte);
|
||||
|
||||
SpawnTracer(GetMuzzleLocation(), HitLocation);
|
||||
|
||||
// Effects below this point are culled based on visibility and distance
|
||||
if ( !ActorEffectIsRelevant(P, false, MaxFireEffectDistance) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
DecodeThirdPersonAnimRate( ThirdPersonAnimRateByte );
|
||||
|
||||
// Weapon shoot anims
|
||||
if( !bWeapMeshIsPawnMesh && bHasToStopDoingFireAnim == false )
|
||||
{
|
||||
PlayWeaponFireAnim();
|
||||
bHasToStopDoingFireAnim = true;
|
||||
}
|
||||
|
||||
if( P.IsDoingSpecialMove() && P.SpecialMoves[P.SpecialMove].bAllowFireAnims )
|
||||
{
|
||||
AnimType = EAS_Additive;
|
||||
}
|
||||
else
|
||||
{
|
||||
AnimType = EAS_FullBody;
|
||||
}
|
||||
|
||||
// Character shoot anims
|
||||
if ( !P.IsDoingSpecialMove() || AnimType == EAS_Additive )
|
||||
{
|
||||
if(!bHasToStopDoingFireAnimB)
|
||||
{
|
||||
bHasToStopDoingFireAnimB = true;
|
||||
PlayPawnFireAnim( P, AnimType );
|
||||
}
|
||||
|
||||
// interrupt other weapon action anims (e.g. Reload)
|
||||
if( !P.IsDoingSpecialMove() )
|
||||
{
|
||||
P.StopBodyAnim(P.bIsCrouched ? EAS_CH_UpperBody : EAS_UpperBody, 0.1f);
|
||||
}
|
||||
|
||||
if ( OnWeaponStateChanged != None )
|
||||
{
|
||||
OnWeaponStateChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
CauseMuzzleFlash(P.FiringMode);
|
||||
|
||||
// Wider effect distances for fire spray. Called on Instigator to go beyond the weapon mesh cull distance
|
||||
if ( P.FiringMode != 1 && P.ActorEffectIsRelevant(P, false, 15000, 2000) && !bIsDisabledSprayVisualAndMesh )
|
||||
{
|
||||
TurnOnFireSpray();
|
||||
bResult = true;
|
||||
}
|
||||
|
||||
return bResult;
|
||||
}
|
||||
|
||||
simulated function StopThirdPersonFireEffects(optional bool bForce)
|
||||
{
|
||||
Super.StopThirdPersonFireEffects(bForce);
|
||||
bIsChargeEffectsActive = false;
|
||||
bIsBloodParticlesEffectActive = false;
|
||||
RemoveAllBloodParticles();
|
||||
bIsDisabledSprayVisualAndMesh = false;
|
||||
if (ChargingPSC != none)
|
||||
{
|
||||
ChargingPSC.SetActive(false);
|
||||
}
|
||||
if (ChargedPSC != none)
|
||||
{
|
||||
ChargedPSC.SetActive(false);
|
||||
}
|
||||
bHasToStopDoingFireAnim = false;
|
||||
bHasToStopDoingFireAnimB = false;
|
||||
}
|
||||
|
||||
simulated function CauseMuzzleFlash(byte FiringMode)
|
||||
{
|
||||
if (MuzzleFlash == None && MuzzleFlashTemplate != None)
|
||||
{
|
||||
AttachMuzzleFlash();
|
||||
}
|
||||
|
||||
Super.CauseMuzzleFlash(FiringMode);
|
||||
}
|
||||
|
||||
simulated protected function TurnOnPilot()
|
||||
{
|
||||
Super.TurnOnPilot();
|
||||
|
||||
if( FlamePool[0] != None && KFSprayActor_HRG_Vampire(FlamePool[0]) != None && KFSprayActor_HRG_Vampire(FlamePool[0]).OwnerWeapon == None)
|
||||
{
|
||||
KFSprayActor_HRG_Vampire(FlamePool[0]).OwnerWeapon = KFWeap_HRG_Vampire(KFPawn_Human(Instigator).MyKFWeapon);
|
||||
}
|
||||
if( FlamePool[1] != None && KFSprayActor_HRG_Vampire(FlamePool[1]) != None && KFSprayActor_HRG_Vampire(FlamePool[1]).OwnerWeapon == None)
|
||||
{
|
||||
KFSprayActor_HRG_Vampire(FlamePool[1]).OwnerWeapon = KFWeap_HRG_Vampire(KFPawn_Human(Instigator).MyKFWeapon);
|
||||
}
|
||||
}
|
||||
|
||||
simulated function CreateBloodParticle(float DeltaTime, KFPawn_Monster Monster)
|
||||
{
|
||||
Local KFEmit_DirectionalPath Emitter;
|
||||
local vector DestinationLocation, MonsterLocation, BloodParticlesMidPointSocketLocation;
|
||||
local Rotator DestinationRotation, BloodParticlesMidPointSocketRotation;
|
||||
local vector BloodSplashVelocity;
|
||||
local int Index;
|
||||
|
||||
if( BloodStolenControlTime > 0 )
|
||||
{
|
||||
BloodStolenControlTime -= DeltaTime;
|
||||
return;
|
||||
}
|
||||
|
||||
Emitter = none;
|
||||
for( Index = (NumBloodStolenParticlesForPool - 1) ; Index >= 0 ; Index-- )
|
||||
{
|
||||
if(BloodStolenParticles[Index].IsEnabled == false)
|
||||
{
|
||||
//`log("I gave the emitter");
|
||||
Emitter = BloodStolenParticles[Index];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(Emitter == none)
|
||||
{
|
||||
//`log("NO EMITTER");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( WeapMesh != none && WeapMesh.SkeletalMesh != none)
|
||||
{
|
||||
GetFlameSocketLocAndRot(DestinationLocation, DestinationRotation);
|
||||
WeapMesh.GetSocketWorldLocationAndRotation('BloodParticlesMidPoint', BloodParticlesMidPointSocketLocation, BloodParticlesMidPointSocketRotation);
|
||||
}
|
||||
|
||||
BloodStolenControlTime += SpawnRateBloodParticles_3P;
|
||||
MonsterLocation = ActiveFlameSpray.GetLastContactPositionMeshHit();
|
||||
if (IsZero(MonsterLocation))
|
||||
{
|
||||
Monster.Mesh.GetBoneLocation('Spine1');
|
||||
}
|
||||
|
||||
if(MonsterLocation == vect(0,0,0))
|
||||
{
|
||||
MonsterLocation = Monster.Location + vect(0,0,20);
|
||||
}
|
||||
|
||||
if (FRand() > 0.4)
|
||||
{
|
||||
BloodSplashVelocity = BloodParticlesMidPointSocketLocation - MonsterLocation;
|
||||
BloodSplashVelocity = VRandCone(vect(0,0,-1), PI / 5) * 100;
|
||||
SpawnBloodSplash(BloodSplashClass, MonsterLocation, BloodSplashVelocity);
|
||||
}
|
||||
|
||||
//Emitter = Spawn(class'KFEmit_DirectionalPath',,, MonsterLocation);
|
||||
Emitter.ParticleSpeed = SpeedBloodParticles_3P;
|
||||
Emitter.RateTickCheckHasReached = 0.2;
|
||||
//BloodStolenParticles.AddItem(Emitter);
|
||||
Emitter.SetLocation(MonsterLocation);
|
||||
|
||||
Emitter.SetDestination(DestinationLocation, BloodParticlesMidPointSocketLocation, 20, 20, 50, 50, 0);
|
||||
Emitter.ActivateEmitter();
|
||||
//Emitter.isEnabled = true;
|
||||
|
||||
}
|
||||
|
||||
simulated function SetChargePercentage(float ChargePercentage)
|
||||
{
|
||||
ChargeRTPC = ChargePercentage;
|
||||
bIsCharging = false;
|
||||
bIsFullyCharged = false;
|
||||
|
||||
if (ChargeRTPC >= 0.0)
|
||||
{
|
||||
bIsCharging = true;
|
||||
}
|
||||
|
||||
if (ChargeRTPC >= 1.0)
|
||||
{
|
||||
bIsFullyCharged = true;
|
||||
}
|
||||
}
|
||||
|
||||
simulated function SetZedCurrentlyBeingSprayed(KFPawn_Monster ZedCurrentlyBeingSprayed)
|
||||
{
|
||||
oZedPreviouslyBeingSprayed = oZedCurrentlyBeingSprayed;
|
||||
oZedCurrentlyBeingSprayed = ZedCurrentlyBeingSprayed;
|
||||
}
|
||||
|
||||
simulated function DisableSprayVisualAndMesh()
|
||||
{
|
||||
bIsDisabledSprayVisualAndMesh = true;
|
||||
}
|
||||
|
||||
function SpawnBloodSplash( class<KFProj_BloodSplash> SpawnClass, vector SpawnLoc, vector SpawnVel )
|
||||
{
|
||||
local TraceHitInfo HitInfo;
|
||||
local vector HitLocation, HitRotation;
|
||||
local KFGoreManager GoreManager;
|
||||
|
||||
// Grab the gore manager
|
||||
GoreManager = KFGoreManager(WorldInfo.MyGoreEffectManager);
|
||||
|
||||
if (GoreManager == none || oZedCurrentlyBeingSprayed == none)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//EffectStartTrace = Location + vect(0,0,1) * 4.f;
|
||||
//EffectEndTrace = EffectStartTrace - vect(0,0,1) * 32.f;
|
||||
|
||||
// Find where to put the decal
|
||||
Trace(HitLocation, HitRotation, SpawnLoc + SpawnVel * 32.f, SpawnLoc, false,, HitInfo, TRACEFLAG_Bullet);
|
||||
//DrawDebugLine(SpawnLoc,SpawnLoc + SpawnVel * 32.f,0,255,0,TRUE);
|
||||
|
||||
// If the locations are zero (probably because this exploded in the air) set defaults
|
||||
if( IsZero(HitLocation) )
|
||||
{
|
||||
HitLocation = Location;
|
||||
}
|
||||
|
||||
if( IsZero(HitRotation) )
|
||||
{
|
||||
HitRotation = vect(0,0,1);
|
||||
}
|
||||
|
||||
|
||||
//Put the decals
|
||||
GoreManager.LeaveABloodSplatterDecal(oZedCurrentlyBeingSprayed, HitLocation, HitRotation);
|
||||
|
||||
//GoreManager. LeaveAPersistentBloodSplat(HitLocation, HitNormal, 1.0);
|
||||
|
||||
if (oZedCurrentlyBeingSprayed != none)
|
||||
{
|
||||
GoreManager.CausePersistentBlood(oZedCurrentlyBeingSprayed, class'KFDamageType', HitLocation, vect(0,0,-1), 0, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
simulated function RemoveAllBloodParticles()
|
||||
{
|
||||
local int Index;
|
||||
local KFEmit_DirectionalPath EmitterToRemove;
|
||||
|
||||
for( Index = (NumBloodStolenParticlesForPool - 1) ; Index >= 0 ; Index-- )
|
||||
{
|
||||
EmitterToRemove = BloodStolenParticles[Index];
|
||||
//BloodStolenParticles.Remove(Index, 1);
|
||||
EmitterToRemove.DeactivateEmitter();
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
ChargeRTPC=0
|
||||
bIsChargeEffectsActive=false
|
||||
bIsBloodParticlesEffectActive=false
|
||||
bIsDisabledSprayVisualAndMesh=false
|
||||
MuzzleFlashTemplate=KFMuzzleFlash'WEP_HRG_Vampire_Arch.Wep_HRG_Vampire_MuzzleFlash_3P'
|
||||
|
||||
ChargingEffect=ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_BlobCharge_3P_01'
|
||||
ChargedEffect=ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_FullCharge'
|
||||
|
||||
BloodStolenEffect=ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_BloodStolen_3P'
|
||||
|
||||
BloodSplashClass=KFProj_BloodSplash
|
||||
|
||||
RateUpdateDestinationBloodParticles = 0.7
|
||||
|
||||
NumBloodStolenParticlesForPool = 15;
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
//=============================================================================
|
||||
// KFWeapDef_HRGTeslauncher
|
||||
//=============================================================================
|
||||
// A lightweight container for basic weapon properties that can be safely
|
||||
// accessed without a weapon actor (UI, remote clients).
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2016 Tripwire Interactive LLC
|
||||
// -Brooks Butler
|
||||
//=============================================================================
|
||||
class KFWeapDef_HRGTeslauncher extends KFWeaponDefinition
|
||||
abstract;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
WeaponClassPath="KFGameContent.KFWeap_AssaultRifle_HRGTeslauncher"
|
||||
|
||||
BuyPrice=1500
|
||||
AmmoPricePerMag=62 //30
|
||||
ImagePath="WEP_UI_HRG_Teslauncher_TEX.UI_WeaponSelect_HRG_Teslauncher"
|
||||
|
||||
EffectiveRange=68
|
||||
|
||||
SecondaryAmmoMagSize=1
|
||||
SecondaryAmmoMagPrice=15 //13
|
||||
|
||||
UpgradePrice[0]=1500
|
||||
|
||||
UpgradeSellPrice[0]=1125
|
||||
}
|
@ -599,6 +599,7 @@ defaultproperties
|
||||
HippedRecoilModifier=1.5
|
||||
|
||||
SecondaryAmmoTexture=Texture2D'ui_firemodes_tex.UI_FireModeSelect_Grenade'
|
||||
bUseGrenadeAsSecondaryAmmo=true
|
||||
|
||||
// Inventory / Grouping
|
||||
InventorySize=6
|
||||
|
@ -565,6 +565,7 @@ defaultproperties
|
||||
HippedRecoilModifier=1.5
|
||||
|
||||
SecondaryAmmoTexture=Texture2D'ui_firemodes_tex.UI_FireModeSelect_Grenade'
|
||||
bUseGrenadeAsSecondaryAmmo=true
|
||||
|
||||
// Inventory / Grouping
|
||||
InventorySize=8
|
||||
|
@ -44,10 +44,10 @@ defaultproperties
|
||||
End Object
|
||||
|
||||
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Slashing_FireAxe'
|
||||
InstantHitDamage(DEFAULT_FIREMODE)=80 //90
|
||||
InstantHitDamage(DEFAULT_FIREMODE)=90 //80
|
||||
|
||||
InstantHitDamageTypes(HEAVY_ATK_FIREMODE)=class'KFDT_Slashing_FireAxeHeavy'
|
||||
InstantHitDamage(HEAVY_ATK_FIREMODE)=125 //135
|
||||
InstantHitDamage(HEAVY_ATK_FIREMODE)=135 //125 //135
|
||||
|
||||
InstantHitDamageTypes(BASH_FIREMODE)=class'KFDT_Bludgeon_FireAxeBash'
|
||||
InstantHitDamage(BASH_FIREMODE)=20
|
||||
|
@ -26,9 +26,8 @@ class KFWeap_HRG_EMP_ArcGenerator extends KFWeap_FlameBase;
|
||||
Replication
|
||||
{
|
||||
if(role == role_authority && bNetDirty)
|
||||
oZedCurrentlyBeingSprayed;
|
||||
oZedCurrentlyBeingSprayed, MaxNumberOfZedsZapped, MaxDistanceToBeZapped, ZapInterval, ChainDamage;
|
||||
}
|
||||
|
||||
/** Shoot animation to play when shooting secondary fire */
|
||||
var(Animations) const editconst name FireHeavyAnim;
|
||||
|
||||
@ -319,7 +318,6 @@ simulated function int SpawnBeam(Actor _OriginActor, Actor _DestinationActor)
|
||||
|
||||
simulated function MarkBeamToDeactivate(BeamAttachedToActor _BeamData)
|
||||
{
|
||||
`log(_BeamData.oAttachedZed);
|
||||
vAuxDeletionArray.AddItem(_BeamData);
|
||||
}
|
||||
|
||||
|
@ -39,8 +39,8 @@ defaultproperties
|
||||
GroupPriority=75
|
||||
|
||||
// Recoil
|
||||
maxRecoilPitch=750
|
||||
minRecoilPitch=675
|
||||
maxRecoilPitch=525 //750
|
||||
minRecoilPitch=472 //675
|
||||
maxRecoilYaw=300
|
||||
minRecoilYaw=-300
|
||||
RecoilRate=0.1
|
||||
@ -63,7 +63,7 @@ defaultproperties
|
||||
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HRGBuckshot'
|
||||
PenetrationPower(DEFAULT_FIREMODE)=2.0
|
||||
NumPellets(DEFAULT_FIREMODE) = 5
|
||||
Spread(DEFAULT_FIREMODE)=0.15
|
||||
Spread(DEFAULT_FIREMODE)=0.12 //0.15
|
||||
|
||||
// ALTFIRE_FIREMODE
|
||||
InstantHitDamageTypes(ALTFIRE_FIREMODE) = class'KFDT_Ballistic_HRGBuckshot'
|
||||
|
@ -61,8 +61,8 @@ defaultproperties
|
||||
GroupPriority=75
|
||||
|
||||
// Recoil
|
||||
maxRecoilPitch=750
|
||||
minRecoilPitch=675
|
||||
maxRecoilPitch=525 //750
|
||||
minRecoilPitch=472 //675
|
||||
maxRecoilYaw=300
|
||||
minRecoilYaw=-300
|
||||
RecoilRate=0.1
|
||||
@ -85,7 +85,7 @@ defaultproperties
|
||||
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HRGBuckshot'
|
||||
PenetrationPower(DEFAULT_FIREMODE)=2.0
|
||||
NumPellets(DEFAULT_FIREMODE)=5
|
||||
Spread(DEFAULT_FIREMODE)=0.15
|
||||
Spread(DEFAULT_FIREMODE)=0.12 //0.15
|
||||
|
||||
// ALTFIRE_FIREMODE
|
||||
FireModeIconPaths(ALTFIRE_FIREMODE)="ui_firemodes_tex.UI_FireModeSelect_ShotgunSingle"
|
||||
@ -96,7 +96,7 @@ defaultproperties
|
||||
InstantHitDamageTypes(ALTFIRE_FIREMODE)=class'KFDT_Ballistic_HRGBuckshot'
|
||||
PenetrationPower(ALTFIRE_FIREMODE)=2.0
|
||||
NumPellets(ALTFIRE_FIREMODE)=5
|
||||
Spread(ALTFIRE_FIREMODE)=0.15
|
||||
Spread(ALTFIRE_FIREMODE)=0.12 //0.15
|
||||
|
||||
//BASH_FIREMODE
|
||||
InstantHitDamageTypes(BASH_FIREMODE)=class'KFDT_Bludgeon_HRGBuckshot'
|
||||
|
1375
KFGameContent/Classes/KFWeap_HRG_Vampire.uc
Normal file
1375
KFGameContent/Classes/KFWeap_HRG_Vampire.uc
Normal file
File diff suppressed because it is too large
Load Diff
@ -399,6 +399,49 @@ simulated function ANIMNOTIFY_FILLMAG()
|
||||
Control.BoneTranslation = vec;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Weapon::HasAmmo
|
||||
*/
|
||||
simulated event bool HasAmmo( byte FireModeNum, optional int Amount )
|
||||
{
|
||||
local KFPerk InstigatorPerk;
|
||||
// we can always do a melee attack
|
||||
if( FireModeNum == BASH_FIREMODE )
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else if ( FireModeNum == RELOAD_FIREMODE )
|
||||
{
|
||||
return CanReload();
|
||||
}
|
||||
else if ( FireModeNum == GRENADE_FIREMODE )
|
||||
{
|
||||
if( KFInventoryManager(InvManager) != none )
|
||||
{
|
||||
return KFInventoryManager(InvManager).HasGrenadeAmmo(Amount);
|
||||
}
|
||||
}
|
||||
else if(FireModeNum == ALTFIRE_FIREMODE)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
InstigatorPerk = GetPerk();
|
||||
if( InstigatorPerk != none && InstigatorPerk.GetIsUberAmmoActive( self ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// If passed in ammo isn't set, use default ammo cost.
|
||||
if( Amount == 0 )
|
||||
{
|
||||
Amount = AmmoCost[FireModeNum];
|
||||
}
|
||||
|
||||
return AmmoCount[GetAmmoType(FireModeNum)] >= Amount;
|
||||
}
|
||||
|
||||
|
||||
simulated state MineReconstructorCharge extends WeaponFiring
|
||||
{
|
||||
//For minimal code purposes, I'll directly call global.FireAmmunition after charging is released
|
||||
|
@ -62,7 +62,7 @@ defaultproperties
|
||||
WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_Projectile
|
||||
WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_Pistol_ChiappaRhino'
|
||||
FireInterval(DEFAULT_FIREMODE)=+0.175
|
||||
InstantHitDamage(DEFAULT_FIREMODE)=70.0
|
||||
InstantHitDamage(DEFAULT_FIREMODE)=75.0 //70.0
|
||||
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_ChiappaRhino'
|
||||
PenetrationPower(DEFAULT_FIREMODE)=2.0
|
||||
Spread(DEFAULT_FIREMODE)=0.01
|
||||
|
@ -66,7 +66,7 @@ defaultproperties
|
||||
WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_Projectile
|
||||
WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_Pistol_ChiappaRhino'
|
||||
FireInterval(DEFAULT_FIREMODE)=+0.1
|
||||
InstantHitDamage(DEFAULT_FIREMODE)=70.0
|
||||
InstantHitDamage(DEFAULT_FIREMODE)=75.0 //70.0
|
||||
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_ChiappaRhino'
|
||||
PenetrationPower(DEFAULT_FIREMODE)=2.0
|
||||
Spread(DEFAULT_FIREMODE)=0.01
|
||||
@ -78,7 +78,7 @@ defaultproperties
|
||||
WeaponFireTypes(ALTFIRE_FIREMODE)= EWFT_Projectile
|
||||
WeaponProjectiles(ALTFIRE_FIREMODE)=class'KFProj_Bullet_Pistol_ChiappaRhino'
|
||||
FireInterval(ALTFIRE_FIREMODE)=+0.1
|
||||
InstantHitDamage(ALTFIRE_FIREMODE)=70.0
|
||||
InstantHitDamage(ALTFIRE_FIREMODE)=75.0 //70.0
|
||||
InstantHitDamageTypes(ALTFIRE_FIREMODE)=class'KFDT_Ballistic_ChiappaRhino'
|
||||
PenetrationPower(ALTFIRE_FIREMODE)=2.0
|
||||
Spread(ALTFIRE_FIREMODE)=0.01
|
||||
|
381
KFGameContent/Classes/KFWeap_Rifle_FrostShotgunAxe.uc
Normal file
381
KFGameContent/Classes/KFWeap_Rifle_FrostShotgunAxe.uc
Normal file
@ -0,0 +1,381 @@
|
||||
//=============================================================================
|
||||
// KFWeap_Rifle_FrostShotgunAxe
|
||||
//=============================================================================
|
||||
// A Rifle with an axe that freezes enemies
|
||||
//=============================================================================
|
||||
// Killing Floor 2
|
||||
// Copyright (C) 2019 Tripwire Interactive LLC
|
||||
//=============================================================================
|
||||
|
||||
class KFWeap_Rifle_FrostShotgunAxe extends KFWeap_MeleeBase;
|
||||
|
||||
var float LastFireInterval;
|
||||
var int iInstantHitDamageOnEnemyFrozen;
|
||||
var int iNormalInstantHitDamage;
|
||||
|
||||
/** Returns trader filter index based on weapon type */
|
||||
static simulated event EFilterTypeUI GetTraderFilter()
|
||||
{
|
||||
return FT_Rifle;
|
||||
}
|
||||
|
||||
simulated event PreBeginPlay()
|
||||
{
|
||||
super.PreBeginPlay();
|
||||
iNormalInstantHitDamage = InstantHitDamage[BASH_FIREMODE];
|
||||
}
|
||||
|
||||
/**
|
||||
* See Pawn.ProcessInstantHit
|
||||
* @param DamageReduction: Custom KF parameter to handle penetration damage reduction
|
||||
*/
|
||||
simulated function ProcessInstantHitEx(byte FiringMode, ImpactInfo Impact, optional int NumHits, optional out float out_PenetrationVal, optional int ImpactNum)
|
||||
{
|
||||
local KFPerk InstigatorPerk;
|
||||
|
||||
InstigatorPerk = GetPerk();
|
||||
if (InstigatorPerk != none)
|
||||
{
|
||||
InstigatorPerk.UpdatePerkHeadShots(Impact, InstantHitDamageTypes[FiringMode], ImpactNum);
|
||||
}
|
||||
|
||||
super.ProcessInstantHitEx(FiringMode, Impact, NumHits, out_PenetrationVal, ImpactNum);
|
||||
}
|
||||
|
||||
/** process local player impact for clientside hit detection */
|
||||
event RecieveClientImpact(byte FiringMode, const out ImpactInfo Impact, optional out float PenetrationValue, optional int ImpactNum)
|
||||
{
|
||||
// skip KFWeap_MeleeBase because it does melee stuff
|
||||
super(KFWeapon).RecieveClientImpact(FiringMode, Impact, PenetrationValue, ImpactNum);
|
||||
}
|
||||
|
||||
/** Override melee SetIronSights (which sends to heavy attack) so that this weapon ironsights normally*/
|
||||
simulated function SetIronSights(bool bNewIronSights)
|
||||
{
|
||||
super(KFWeapon).SetIronSights(bNewIronSights);
|
||||
}
|
||||
|
||||
/** Override melee ShouldOwnerWalk which doesn't account for walking when in ironsights */
|
||||
simulated function bool ShouldOwnerWalk()
|
||||
{
|
||||
return super(KFWeapon).ShouldOwnerWalk();
|
||||
}
|
||||
|
||||
/** Save off the start time for the bash to determine whether this will be a normal stab or a bullet stab */
|
||||
simulated function StartFire(byte FireModeNum)
|
||||
{
|
||||
// copying over auto reload functionality since MeleeBase overrides this by default
|
||||
if (FireModeNum == DEFAULT_FIREMODE && ShouldAutoReload(FireModeNum))
|
||||
{
|
||||
FireModeNum = RELOAD_FIREMODE;
|
||||
}
|
||||
|
||||
if (FireModeNum == RELOAD_FIREMODE)
|
||||
{
|
||||
// Skip Super/ ServerStartFire and let server wait for ServerSendToReload to force state synchronization
|
||||
BeginFire(FireModeNum);
|
||||
return;
|
||||
}
|
||||
if( FireModeNum == BASH_FIREMODE && WeaponFireTypes[FireModeNum] == EWFT_Custom )
|
||||
{
|
||||
super.StartMeleeFire(FireModeNum, MeleeAttackHelper.ChooseAttackDir(), ATK_Normal);
|
||||
return;
|
||||
}
|
||||
super.StartFire(FireModeNum);
|
||||
}
|
||||
|
||||
/** Override to drop the player out of ironsights first */
|
||||
simulated function AltFireMode()
|
||||
{
|
||||
if (!Instigator.IsLocallyControlled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// break out of ironsights when starting to block
|
||||
if (bUsingSights)
|
||||
{
|
||||
SetIronSights(false);
|
||||
}
|
||||
|
||||
StartFire(BLOCK_FIREMODE);
|
||||
}
|
||||
|
||||
simulated state MeleeBlocking
|
||||
{
|
||||
simulated function BeginState(name PreviousStateName)
|
||||
{
|
||||
super.BeginState(PreviousStateName);
|
||||
if (bUsingSights)
|
||||
{
|
||||
SetIronSights(false);
|
||||
}
|
||||
}
|
||||
simulated function bool AllowIronSights() { return false; }
|
||||
}
|
||||
|
||||
simulated function float GetFireInterval(byte FireModeNum)
|
||||
{
|
||||
if (FireModeNum == DEFAULT_FIREMODE && AmmoCount[FireModeNum] == 0)
|
||||
{
|
||||
return LastFireInterval;
|
||||
}
|
||||
|
||||
return super.GetFireInterval(FireModeNum);
|
||||
}
|
||||
|
||||
/** Called during reload state */
|
||||
simulated function bool CanOverrideMagReload(byte FireModeNum)
|
||||
{
|
||||
if (FireModeNum == BLOCK_FIREMODE)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.CanOverrideMagReload(FireModeNum);
|
||||
}
|
||||
|
||||
/** returns the damage amount for this attack */
|
||||
simulated function int GetMeleeDamage(byte FireModeNum, optional vector RayDir)
|
||||
{
|
||||
local KFMeleeHelperWeaponFrostShotgunAxe oHelper;
|
||||
local int Damage;
|
||||
oHelper = KFMeleeHelperWeaponFrostShotgunAxe(MeleeAttackHelper);
|
||||
if(oHelper.IsEnemyIced())
|
||||
{
|
||||
InstantHitDamage[FireModeNum] = iInstantHitDamageOnEnemyFrozen;
|
||||
}
|
||||
else
|
||||
{
|
||||
InstantHitDamage[FireModeNum] = iNormalInstantHitDamage;
|
||||
}
|
||||
Damage = Super.GetMeleeDamage(FireModeNum, RayDir);
|
||||
return Damage;
|
||||
}
|
||||
|
||||
|
||||
|
||||
simulated function int GetModifiedDamage(byte FireModeNum, optional vector RayDir)
|
||||
{
|
||||
switch(FireModeNum)
|
||||
{
|
||||
case DEFAULT_FIREMODE:
|
||||
return GetUpgradedStatValue(InstantHitDamage[FireModeNum], EWUS_Damage0 , CurrentWeaponUpgradeIndex);
|
||||
break;
|
||||
case ALTFIRE_FIREMODE:
|
||||
return GetUpgradedStatValue(InstantHitDamage[FireModeNum], EWUS_Damage1 , CurrentWeaponUpgradeIndex);
|
||||
break;
|
||||
case BASH_FIREMODE:
|
||||
return GetUpgradedStatValue(InstantHitDamage[FireModeNum], EWUS_Damage2 , CurrentWeaponUpgradeIndex);
|
||||
break;
|
||||
}
|
||||
return GetUpgradedStatValue(InstantHitDamage[FireModeNum], EWUS_Damage0 , CurrentWeaponUpgradeIndex);
|
||||
}
|
||||
|
||||
/** Allows weapon to calculate its own damage for display in trader */
|
||||
static simulated function float CalculateTraderWeaponStatDamage()
|
||||
{
|
||||
local float BaseDamage, DoTDamage;
|
||||
local class<KFDamageType> DamageType;
|
||||
|
||||
BaseDamage = default.InstantHitDamage[DEFAULT_FIREMODE];
|
||||
|
||||
DamageType = class<KFDamageType>(default.InstantHitDamageTypes[DEFAULT_FIREMODE]);
|
||||
if (DamageType != none && DamageType.default.DoT_Type != DOT_None)
|
||||
{
|
||||
DoTDamage = (DamageType.default.DoT_Duration / DamageType.default.DoT_Interval) * (BaseDamage * DamageType.default.DoT_DamageScale);
|
||||
}
|
||||
|
||||
return BaseDamage * default.NumPellets[DEFAULT_FIREMODE] + DoTDamage;
|
||||
}
|
||||
|
||||
/** Allows weapon to calculate its own fire rate for display in trader */
|
||||
static simulated function float CalculateTraderWeaponStatFireRate()
|
||||
{
|
||||
return 60.f / default.FireInterval[DEFAULT_FIREMODE]; // attacks per minute
|
||||
}
|
||||
|
||||
/** Spawn projectile is called once for each shot pellet fired */
|
||||
simulated function KFProjectile SpawnAllProjectiles(class<KFProjectile> KFProjClass, vector RealStartLoc, vector AimDir)
|
||||
{
|
||||
local KFPerk InstigatorPerk;
|
||||
|
||||
if (CurrentFireMode == GRENADE_FIREMODE)
|
||||
{
|
||||
return Super.SpawnProjectile(KFProjClass, RealStartLoc, AimDir);
|
||||
}
|
||||
|
||||
InstigatorPerk = GetPerk();
|
||||
if (InstigatorPerk != none)
|
||||
{
|
||||
Spread[CurrentFireMode] = default.Spread[CurrentFireMode] * InstigatorPerk.GetTightChokeModifier();
|
||||
}
|
||||
|
||||
return super.SpawnAllProjectiles(KFProjClass, RealStartLoc, AimDir);
|
||||
}
|
||||
|
||||
/** Plays a 'settle' animation after a melee attack is finished */
|
||||
simulated function PlayMeleeSettleAnim()
|
||||
{
|
||||
PlayAnimation(MeleeAttackSettleAnims[0], 0.0, false, 0.1);
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
// MeleeBase
|
||||
bMeleeWeapon=true
|
||||
|
||||
// Inventory / Grouping
|
||||
InventoryGroup=IG_Primary
|
||||
InventorySize=7
|
||||
GroupPriority=80 //75
|
||||
WeaponSelectTexture = Texture2D'WEP_UI_Frost_Shotgun_Axe_TEX.UI_WeaponSelect_FrostGun'
|
||||
// Perks
|
||||
AssociatedPerkClasses(0)=class'KFPerk_Support'
|
||||
AssociatedPerkClasses(1)=class'KFPerk_Berserker'
|
||||
|
||||
// FOV
|
||||
MeshFOV=65
|
||||
MeshIronSightFOV=45
|
||||
PlayerIronSightFOV=65
|
||||
|
||||
// Depth of field
|
||||
DOF_FG_FocalRadius=50
|
||||
DOF_FG_MaxNearBlurSize=3.5
|
||||
|
||||
// Content
|
||||
PackageKey = "Frost_Shotgun_Axe"
|
||||
FirstPersonMeshName="WEP_1P_Frost_Shotgun_Axe_MESH.Wep_1stP_Frost_Shotgun_Axe_Rig"
|
||||
FirstPersonAnimSetNames(0)="WEP_1P_Frost_Shotgun_Axe_ANIM.WEP_1stP_Frost_Shotgun_Axe"
|
||||
PickupMeshName="WEP_3P_Frost_Shotgun_Axe_MESH.Wep_3rdP_Frost_Shotgun_Pickup"
|
||||
AttachmentArchetypeName="WEP_Frost_Shotgun_Axe_ARCH.Wep_Frost_Shotgun_Axe_3P"
|
||||
MuzzleFlashTemplateName="WEP_Frost_Shotgun_Axe_ARCH.Wep_Frost_Shotgun_Axe_MuzzleFlash"
|
||||
|
||||
// Ammo
|
||||
MagazineCapacity[0]=6
|
||||
SpareAmmoCapacity[0]=66
|
||||
InitialSpareMags[0]=4
|
||||
AmmoPickupScale[0]=1
|
||||
bCanBeReloaded=true
|
||||
bReloadFromMagazine=false // @TODO: Turn off once animations are done
|
||||
|
||||
// Zooming/Position
|
||||
PlayerViewOffset = (X = 8.0,Y = 7,Z = -3.5)
|
||||
IronSightPosition = (X = 0,Y = 0,Z = 0)
|
||||
|
||||
// AI warning system
|
||||
bWarnAIWhenAiming = true
|
||||
AimWarningDelay = (X = 0.4f, Y = 0.8f)
|
||||
AimWarningCooldown = 0.0f
|
||||
|
||||
// Recoil
|
||||
maxRecoilPitch = 1050 //550
|
||||
minRecoilPitch = 900 //400
|
||||
maxRecoilYaw = 350 //150
|
||||
minRecoilYaw = -350 //-150
|
||||
RecoilRate = 0.075
|
||||
RecoilMaxYawLimit = 500
|
||||
RecoilMinYawLimit = 65035
|
||||
RecoilMaxPitchLimit = 900
|
||||
RecoilMinPitchLimit = 64785
|
||||
RecoilISMaxYawLimit = 50
|
||||
RecoilISMinYawLimit = 65485
|
||||
RecoilISMaxPitchLimit = 500
|
||||
RecoilISMinPitchLimit = 65485
|
||||
RecoilViewRotationScale = 0.6
|
||||
|
||||
FallingRecoilModifier=1.5
|
||||
HippedRecoilModifier=1.3
|
||||
|
||||
IronSightMeshFOVCompensationScale = 1.5
|
||||
|
||||
// DEFAULT_FIREMODE
|
||||
FireModeIconPaths(DEFAULT_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_ShotgunSingle'
|
||||
FiringStatesArray(DEFAULT_FIREMODE)=WeaponSingleFiring
|
||||
WeaponFireTypes(DEFAULT_FIREMODE)=EWFT_Projectile
|
||||
WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Bullet_Frost_Shotgun_Axe'
|
||||
InstantHitDamage(DEFAULT_FIREMODE)=30 //32 //30
|
||||
InstantHitDamageTypes(DEFAULT_FIREMODE) = class'KFDT_Ballistic_Frost_Shotgun_Axe'
|
||||
FireInterval(DEFAULT_FIREMODE)=0.5 //0.25 // 240 RPM
|
||||
Spread(DEFAULT_FIREMODE)=0.13 //0.007
|
||||
PenetrationPower(DEFAULT_FIREMODE)=2
|
||||
FireOffset = (X = 25,Y = 3.0,Z = -2.5)
|
||||
NumPellets(DEFAULT_FIREMODE)=7
|
||||
AmmoCost(DEFAULT_FIREMODE)=1
|
||||
LastFireInterval=0.5
|
||||
|
||||
// RELOAD_FIREMODE
|
||||
FiringStatesArray(RELOAD_FIREMODE)="Reloading"
|
||||
WeaponFireTypes(RELOAD_FIREMODE)=EWFT_InstantHit
|
||||
|
||||
// BASH_FIREMODE
|
||||
InstantHitDamageTypes(BASH_FIREMODE)=class'KFDT_Slashing_Frost_Shotgun_Axe'
|
||||
InstantHitDamage(BASH_FIREMODE)=75 //120
|
||||
FiringStatesArray(BASH_FIREMODE)=MeleeChainAttacking
|
||||
WeaponFireTypes(BASH_FIREMODE)=EWFT_Custom
|
||||
InstantHitMomentum(BASH_FIREMODE)=10000.f
|
||||
iInstantHitDamageOnEnemyFrozen = 185 //360; //300;
|
||||
|
||||
// Custom animations
|
||||
FireSightedAnims = (Shoot_Iron)
|
||||
BonesToLockOnEmpty = (RW_Hammer)
|
||||
bHasFireLastAnims = true
|
||||
|
||||
// Defensive
|
||||
BlockDamageMitigation=0.6f
|
||||
ParryDamageMitigationPercent=0.5
|
||||
ParryStrength=4
|
||||
|
||||
// Block Effects
|
||||
BlockSound=AkEvent'WW_WEP_Bullet_Impacts.Play_Block_MEL_Hammer'
|
||||
ParrySound=AkEvent'WW_WEP_Bullet_Impacts.Play_Parry_Wood'
|
||||
|
||||
// Fire Effects
|
||||
WeaponFireSnd(DEFAULT_FIREMODE) = (DefaultCue = AkEvent'WW_WEP_FrostFang.Play_FrostFang_Shoot_3p', FirstPersonCue = AkEvent'WW_WEP_FrostFang.Play_FrostFang_Shoot_1p') // @TODO: Replace Me
|
||||
WeaponDryFireSnd(DEFAULT_FIREMODE) = AkEvent'WW_WEP_FrostFang.Play_FrostFang_Dryfire' // @TODO: Replace Me
|
||||
EjectedShellForegroundDuration = 1.5f
|
||||
|
||||
// Attachments
|
||||
bHasIronSights = true
|
||||
bHasFlashlight = false
|
||||
|
||||
WeaponFireWaveForm = ForceFeedbackWaveform'FX_ForceFeedback_ARCH.Gunfire.Medium_Recoil'
|
||||
|
||||
// Aim Assist
|
||||
AimCorrectionSize=40.f
|
||||
|
||||
// Melee
|
||||
|
||||
|
||||
// Melee hitbox
|
||||
Begin Object Class=KFMeleeHelperWeaponFrostShotgunAxe Name=MeleeHelper_0
|
||||
MaxHitRange=250
|
||||
HitboxChain.Add((BoneOffset=(X=+3,Z=-190)))
|
||||
HitboxChain.Add((BoneOffset=(X=-3,Z=-170)))
|
||||
HitboxChain.Add((BoneOffset=(X=+3,Z=-150)))
|
||||
HitboxChain.Add((BoneOffset=(X=-3,Z=-130)))
|
||||
HitboxChain.Add((BoneOffset=(X=+3,Z=-110)))
|
||||
HitboxChain.Add((BoneOffset=(X=-3,Z=-90)))
|
||||
HitboxChain.Add((BoneOffset=(X=+3,Z=-70)))
|
||||
HitboxChain.Add((BoneOffset=(X=-3,Z=-50)))
|
||||
HitboxChain.Add((BoneOffset=(X=+3,Z=-30)))
|
||||
HitboxChain.Add((BoneOffset=(Z=10)))
|
||||
WorldImpactEffects=KFImpactEffectInfo'FX_Impacts_ARCH.Bladed_melee_impact'
|
||||
MeleeImpactCamShakeScale=0.03f
|
||||
bUseDirectionalMelee=true
|
||||
bHasChainAttacks=true
|
||||
bUseMeleeHitTimer=false
|
||||
// modified combo sequences
|
||||
ChainSequence_F=(DIR_Left, DIR_ForwardRight, DIR_ForwardLeft, DIR_ForwardRight, DIR_ForwardLeft)
|
||||
ChainSequence_B=(DIR_BackwardRight, DIR_ForwardLeft, DIR_BackwardLeft, DIR_ForwardRight, DIR_Left, DIR_Right, DIR_Left)
|
||||
ChainSequence_L=(DIR_Right, DIR_Left, DIR_ForwardRight, DIR_ForwardLeft, DIR_Right, DIR_Left)
|
||||
ChainSequence_R=(DIR_Left, DIR_Right, DIR_ForwardLeft, DIR_ForwardRight, DIR_Left, DIR_Right)
|
||||
End Object
|
||||
MeleeAttackHelper=MeleeHelper_0
|
||||
|
||||
// Weapon Upgrades
|
||||
WeaponUpgrades[1]=(Stats=((Stat=EWUS_Damage0, Scale=1.125f), (Stat=EWUS_Damage1, Scale=1.125f), (Stat=EWUS_Damage2, Scale=1.1f), (Stat=EWUS_Weight, Add=1)))
|
||||
WeaponUpgrades[2]=(Stats=((Stat=EWUS_Damage0, Scale=1.25f), (Stat=EWUS_Damage1, Scale=1.25f), (Stat=EWUS_Damage2, Scale=1.2f), (Stat=EWUS_Weight, Add=2)))
|
||||
|
||||
bHasToBeConsideredAsRangedWeaponForPerks=true;
|
||||
}
|
@ -157,7 +157,7 @@ simulated function PrepareAndDetonate()
|
||||
PlayAnimation(SelectedAnim, AnimDuration);
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
PlayAnimation(SelectedAnim);
|
||||
}
|
||||
}
|
||||
@ -170,7 +170,8 @@ simulated function PrepareAndDetonate()
|
||||
// Don't want to play muzzle effects or shoot animation on detonate in 3p
|
||||
//IncrementFlashCount();
|
||||
|
||||
AnimDuration = 1.f;
|
||||
//AnimDuration value here representes the ALTFIRE FireInterval
|
||||
AnimDuration = 0.75f; //1.f;
|
||||
if (bInSprintState)
|
||||
{
|
||||
SetTimer(AnimDuration * 0.8f, false, nameof(PlaySprintStart));
|
||||
@ -223,6 +224,17 @@ function RemoveDeployedHarpoon(optional int HarpoonIndex = INDEX_NONE, optional
|
||||
}
|
||||
}
|
||||
|
||||
/** Allow reloads for primary weapon to be interupted by firing secondary weapon. */
|
||||
simulated function bool CanOverrideMagReload(byte FireModeNum)
|
||||
{
|
||||
if(FireModeNum == ALTFIRE_FIREMODE)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return Super.CanOverrideMagReload(FireModeNum);
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
// Content
|
||||
@ -234,7 +246,7 @@ defaultproperties
|
||||
MuzzleFlashTemplateName="WEP_Seal_Squeal_ARCH.Wep_Seal_Squeal_MuzzleFlash" //@TODO: Replace me
|
||||
|
||||
// Inventory / Grouping
|
||||
InventorySize=8
|
||||
InventorySize=7 //8
|
||||
GroupPriority=75
|
||||
WeaponSelectTexture=Texture2D'WEP_UI_Seal_Squeal_TEX.UI_WeaponSelect_SealSqueal'
|
||||
AssociatedPerkClasses(0)=class'KFPerk_Demolitionist'
|
||||
@ -250,7 +262,7 @@ defaultproperties
|
||||
|
||||
// Ammo
|
||||
MagazineCapacity[0]=5
|
||||
SpareAmmoCapacity[0]=25
|
||||
SpareAmmoCapacity[0]=30 //25
|
||||
InitialSpareMags[0]=1
|
||||
bCanBeReloaded=true
|
||||
bReloadFromMagazine=true
|
||||
@ -288,13 +300,12 @@ defaultproperties
|
||||
WeaponProjectiles(DEFAULT_FIREMODE)=class'KFProj_Rocket_SealSqueal'
|
||||
InstantHitDamage(DEFAULT_FIREMODE)=125
|
||||
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_SealSquealImpact'
|
||||
FireInterval(DEFAULT_FIREMODE)=0.75
|
||||
FireInterval(DEFAULT_FIREMODE)=0.5 //0.75
|
||||
Spread(DEFAULT_FIREMODE)=0
|
||||
PenetrationPower(DEFAULT_FIREMODE)=0
|
||||
FireOffset=(X=25,Y=3.0,Z=-2.5)
|
||||
|
||||
// ALTFIRE_FIREMODE (remote detonate)
|
||||
//FireModeIconPaths(ALTFIRE_FIREMODE)=Texture2D'ui_firemodes_tex.UI_FireModeSelect_BulletSingle'
|
||||
FiringStatesArray(ALTFIRE_FIREMODE)=WeaponDetonating
|
||||
WeaponFireTypes(ALTFIRE_FIREMODE)=EWFT_Custom
|
||||
AmmoCost(ALTFIRE_FIREMODE)=0
|
||||
|
Reference in New Issue
Block a user