189 lines
4.9 KiB
Ucode
189 lines
4.9 KiB
Ucode
|
//=============================================================================
|
||
|
// KFProj_Grenade_GravityImploder
|
||
|
//=============================================================================
|
||
|
// Killing Floor 2
|
||
|
// Copyright (C) 2020 Tripwire Interactive LLC
|
||
|
//=============================================================================
|
||
|
|
||
|
class KFProj_Grenade_GravityImploder extends KFProj_BallisticExplosive
|
||
|
hidedropdown;
|
||
|
|
||
|
/* Ensure it detonates */
|
||
|
var float DetonationTime;
|
||
|
var float VortexDuration;
|
||
|
|
||
|
var float VortexRadius;
|
||
|
var float VortexImpulseStrength;
|
||
|
var protected transient bool bVortexActive;
|
||
|
|
||
|
var protected RB_RadialImpulseComponent RadialImpulseComponent;
|
||
|
|
||
|
simulated state GrenadeState
|
||
|
{
|
||
|
simulated event BeginState(Name PrevStateName)
|
||
|
{
|
||
|
super.BeginState(PrevStateName);
|
||
|
|
||
|
if (Role == ROLE_Authority)
|
||
|
{
|
||
|
SetTimer(DetonationTime, false, nameOf(Timer_Detonate));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
simulated state VortexState
|
||
|
{
|
||
|
simulated event BeginState(Name PrevStateName)
|
||
|
{
|
||
|
super.BeginState(PrevStateName);
|
||
|
|
||
|
ClearTimer(nameof(Timer_Detonate));
|
||
|
|
||
|
bVortexActive = true;
|
||
|
|
||
|
if (Role == ROLE_Authority)
|
||
|
{
|
||
|
SetTimer(VortexDuration, false, 'Timer_EndVortex');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
simulated event Tick(float DeltaTime)
|
||
|
{
|
||
|
local float ImpulseModifier;
|
||
|
|
||
|
if(bVortexActive && (WorldInfo.NetMode == NM_Client || WorldInfo.NetMode == NM_Standalone))
|
||
|
{
|
||
|
// ImpulseModifier = (bReduceGibImpulseOnTick) ? (1.0f - AccumulatedTime / Lifetime) : 1.0f;
|
||
|
ImpulseModifier = 1.0f;
|
||
|
|
||
|
RadialImpulseComponent.ImpulseRadius = VortexRadius;
|
||
|
RadialImpulseComponent.ImpulseStrength = VortexImpulseStrength * ImpulseModifier;
|
||
|
RadialImpulseComponent.bVelChange = true;
|
||
|
RadialImpulseComponent.ImpulseFalloff = RIF_Constant;
|
||
|
RadialImpulseComponent.FireImpulse(Location);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the initial velocity and cook time
|
||
|
*/
|
||
|
simulated event PostBeginPlay()
|
||
|
{
|
||
|
Super.PostBeginPlay();
|
||
|
|
||
|
AdjustCanDisintigrate();
|
||
|
GotoState('GrenadeState');
|
||
|
}
|
||
|
|
||
|
simulated function Timer_Detonate()
|
||
|
{
|
||
|
Detonate();
|
||
|
}
|
||
|
|
||
|
simulated function Detonate()
|
||
|
{
|
||
|
Explode(Location, vect(0,0,1) >> Rotation);
|
||
|
}
|
||
|
|
||
|
simulated function Explode(vector HitLocation, vector HitNormal)
|
||
|
{
|
||
|
super.Explode(HitLocation, HitNormal);
|
||
|
GotoState('VortexState');
|
||
|
}
|
||
|
|
||
|
simulated function Timer_EndVortex()
|
||
|
{
|
||
|
bVortexActive = false;
|
||
|
DeferredDestroy(0.15);
|
||
|
}
|
||
|
|
||
|
|
||
|
/** Called when the owning instigator controller has left a game */
|
||
|
simulated function OnInstigatorControllerLeft()
|
||
|
{
|
||
|
if( WorldInfo.NetMode != NM_Client )
|
||
|
{
|
||
|
SetTimer( 1.f + Rand(5) + fRand(), false, nameOf(Timer_Detonate) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
defaultproperties
|
||
|
{
|
||
|
TouchTimeThreshhold = 60.0f
|
||
|
Physics=PHYS_Falling
|
||
|
Speed=3200
|
||
|
MaxSpeed=3200
|
||
|
TerminalVelocity=3200
|
||
|
GravityScale=1.0
|
||
|
LifeSpan=0.f
|
||
|
bWarnAIWhenFired=true
|
||
|
|
||
|
ProjFlightTemplate=ParticleSystem'WEP_Gravity_Imploder_EMIT.FX_Yellow_Projectile'
|
||
|
ProjFlightTemplateZedTime=ParticleSystem'WEP_Gravity_Imploder_EMIT.FX_Yellow_Projectile_ZEDTIME'
|
||
|
|
||
|
GrenadeBounceEffectInfo=KFImpactEffectInfo'FX_Impacts_ARCH.DefaultGrenadeImpacts'
|
||
|
ProjDisintegrateTemplate=ParticleSystem'ZED_Siren_EMIT.FX_Siren_grenade_disable_01'
|
||
|
AltExploEffects=KFImpactEffectInfo'WEP_Gravity_Imploder_ARCH.Yellow_Explosion_Concussive_Force'
|
||
|
|
||
|
// Grenade explosion light
|
||
|
Begin Object Class=PointLightComponent Name=ExplosionPointLight
|
||
|
LightColor=(R=0,G=25,B=250,A=255)
|
||
|
Brightness=4.f
|
||
|
Radius=2000.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=ImploTemplate0
|
||
|
Damage=350 //150
|
||
|
DamageRadius=375 //425
|
||
|
DamageFalloffExponent=0.2 //0.25
|
||
|
DamageDelay=0.f
|
||
|
MomentumTransferScale=-10000
|
||
|
|
||
|
// Damage Effects
|
||
|
MyDamageType=class'KFDT_Explosive_GravityImploder'
|
||
|
KnockDownStrength=0
|
||
|
FractureMeshRadius=200.0
|
||
|
FracturePartVel=500.0
|
||
|
|
||
|
ExplosionEffects=KFImpactEffectInfo'WEP_Gravity_Imploder_ARCH.Yellow_Explosion'
|
||
|
ExplosionSound=AkEvent'WW_WEP_Gravity_Imploder.Play_WEP_Gravity_Imploder_Grenade_Yellow_Implosion'
|
||
|
|
||
|
// Dynamic Light
|
||
|
ExploLight=ExplosionPointLight
|
||
|
ExploLightStartFadeOutTime=0.0
|
||
|
ExploLightFadeOutTime=0.2
|
||
|
|
||
|
// Camera Shake
|
||
|
CamShake=CameraShake'FX_CameraShake_Arch.Misc_Explosions.Light_Explosion_Rumble'
|
||
|
CamShakeInnerRadius=200
|
||
|
CamShakeOuterRadius=900
|
||
|
CamShakeFalloff=1.5f
|
||
|
bOrientCameraShakeTowardsEpicenter=true
|
||
|
End Object
|
||
|
ExplosionTemplate=ImploTemplate0
|
||
|
|
||
|
bIsTimedExplosive=false;
|
||
|
DetonationTime=5.0
|
||
|
|
||
|
VortexRadius=450
|
||
|
VortexImpulseStrength=-100
|
||
|
VortexDuration=0.5f
|
||
|
bVortexActive=false
|
||
|
|
||
|
Begin Object Class=RB_RadialImpulseComponent Name=ImpulseComponent0
|
||
|
End Object
|
||
|
RadialImpulseComponent=ImpulseComponent0
|
||
|
Components.Add(ImpulseComponent0)
|
||
|
}
|
||
|
|