1
0
This commit is contained in:
2020-12-13 18:09:05 +03:00
parent dd42f84140
commit 1fd126afa1
109 changed files with 6341 additions and 241 deletions

View File

@ -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;

View 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
}

View File

@ -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'
}

View File

@ -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'
}

View 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'
}

View File

@ -15,7 +15,7 @@ defaultproperties
KDeathUpKick=0
KDeathVel=500
StumblePower=150
StumblePower=200 //150
MeleeHitPower=100
WeaponDef=class'KFWeapDef_FireAxe'

View 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'
}

View File

@ -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;

View File

@ -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;

View File

@ -7,8 +7,7 @@
// Copyright (C) 2017 Tripwire Interactive LLC
//=============================================================================
class KFDT_Fire_FlareGun_Dual extends KFDT_Fire_FlareGun
abstract
hidedropdown;
abstract;
defaultproperties
{

View File

@ -9,8 +9,7 @@
//=============================================================================
class KFDT_Fire_Ground_DragonsBreath extends KFDT_Fire_Ground
abstract
hidedropdown;
abstract;
static function int GetKillerDialogID()
{

View File

@ -8,8 +8,7 @@
// Tulio Beloqui (Saber Interactive)
//=============================================================================
class KFDT_Fire_Ground_FlareGun extends KFDT_Fire_Ground
abstract
hidedropdown;
abstract;
static function int GetKillerDialogID()
{

View File

@ -9,8 +9,7 @@
//=============================================================================
class KFDT_Fire_Ground_HRGScorcher extends KFDT_Fire_Ground
abstract
hidedropdown;
abstract;
static function int GetKillerDialogID()
{

View File

@ -9,8 +9,7 @@
//=============================================================================
class KFDT_Fire_Ground_MolotovGrenade extends KFDT_Fire_Ground
abstract
hidedropdown;
abstract;
defaultproperties
{

View File

@ -9,8 +9,7 @@
//=============================================================================
class KFDT_Fire_MolotovGrenade extends KFDT_Fire
abstract
hidedropdown;
abstract;
defaultproperties
{

View File

@ -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'
}

View File

@ -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;

View File

@ -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

View File

@ -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'

View 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'
}

View File

@ -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;

View File

@ -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 )

View File

@ -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 )

View 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'
}

View 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;
}

View File

@ -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

View File

@ -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)))

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View 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'
}

View 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'
}

View File

@ -259,5 +259,7 @@ defaultproperties
End Object
ExplosionTemplate=ExploTemplate0
ExplosionActorClass=class'KFExplosionActor'
bDamageDestructiblesOnTouch=true
}

View 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'
}

View File

@ -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'

View 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'
}

View File

@ -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'

View File

@ -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

View File

@ -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

View 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
}

View 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
}

View 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
}

View 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;
}

View File

@ -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
}

View File

@ -599,6 +599,7 @@ defaultproperties
HippedRecoilModifier=1.5
SecondaryAmmoTexture=Texture2D'ui_firemodes_tex.UI_FireModeSelect_Grenade'
bUseGrenadeAsSecondaryAmmo=true
// Inventory / Grouping
InventorySize=6

View File

@ -565,6 +565,7 @@ defaultproperties
HippedRecoilModifier=1.5
SecondaryAmmoTexture=Texture2D'ui_firemodes_tex.UI_FireModeSelect_Grenade'
bUseGrenadeAsSecondaryAmmo=true
// Inventory / Grouping
InventorySize=8

View File

@ -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

View File

@ -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);
}

View File

@ -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'

View File

@ -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'

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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

View 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;
}

View File

@ -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