1
0
KF2-Dev-Scripts/KFGameContent/Classes/KFProj_Grenade_HRGTeslauncher.uc
2020-12-13 18:01:13 +03:00

213 lines
6.0 KiB
Ucode

//=============================================================================
// KFProj_Grenade_HRGTeslauncher
//=============================================================================
// EMP Grenade projectile class
//=============================================================================
// Killing Floor 2
// Copyright (C) 2018 Tripwire Interactive LLC
// - Fernando Ferrando @ Saber Interactive
//=============================================================================
class KFProj_Grenade_HRGTeslauncher extends KFProj_EMPGrenade
hidedropdown;
var array<Actor> ImpactList;
//==============
/* Touching
simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
{
if (Other != Instigator && !Other.bWorldGeometry)
{
// Don't hit teammates
if (Other.GetTeamNum() == GetTeamNum())
{
return;
}
if (!bHasExploded && !bHasDisintegrated)
{
GetExplodeEffectLocation(HitLocation, HitNormal, Other);
TriggerExplosion(HitLocation, HitNormal, Other);
}
}
super.ProcessTouch(Other, HitLocation, HitNormal);
}*/
//==============
// Touching
simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
{
//local bool bWantsClientSideDudHit;
local float TraveledDistance;
// If we collided with a Siren shield, let the shield code handle touches
if( Other.IsA('KFTrigger_SirenProjectileShield') )
{
return;
}
// Don't hit teammates
if( Other.GetTeamNum() == GetTeamNum() )
{
return;
}
// Need to do client side dud hits if this is a client
//if( Instigator != none && Instigator.Role < ROLE_Authority )
//{
// bWantsClientSideDudHit = true;
//}
TraveledDistance = (`TimeSince(CreationTime) * Speed);
TraveledDistance *= TraveledDistance;
// Process impact hits
if (Other != Instigator && !Other.bStatic)
{
// check/ignore repeat touch events
if( !CheckRepeatingTouch(Other) && Other.GetTeamNum() != GetTeamNum())
{
ProcessBulletTouch(Other, HitLocation, HitNormal);
}
}
if( WorldInfo.NetMode == NM_Standalone ||
(WorldInfo.NetMode == NM_ListenServer && Instigator != none && Instigator.IsLocallyControlled()) )
{
Super.ProcessTouch( Other, HitLocation, HitNormal );
if (!bHasExploded && !bHasDisintegrated)
{
GetExplodeEffectLocation(HitLocation, HitNormal, Other);
TriggerExplosion(HitLocation, HitNormal, Other);
}
return;
}
if( Owner != none && KFWeapon( Owner ) != none && Instigator != none )
{
if( Instigator.Role < ROLE_Authority && Instigator.IsLocallyControlled() )
{
KFWeapon(Owner).HandleClientProjectileExplosion(HitLocation, self);
Super.ProcessTouch( Other, HitLocation, HitNormal );
if (!bHasExploded && !bHasDisintegrated)
{
GetExplodeEffectLocation(HitLocation, HitNormal, Other);
TriggerExplosion(HitLocation, HitNormal, Other);
}
return;
}
}
}
/** Handle bullet collision and damage */
simulated function ProcessBulletTouch(Actor Other, Vector HitLocation, Vector HitNormal)
{
if (ImpactList.Find(Other) != INDEX_NONE)
{
return;
}
if (Other != none)
{
ImpactList.AddItem(Other);
}
super.ProcessBulletTouch(Other, HitLocation, HitNormal);
}
/** 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 (like those little coffee tables in biotics)
return;
}
Explode( Location, HitNormal );
}
// for nukes && concussive force
simulated protected function PrepareExplosionTemplate()
{
class'KFPerk_Berserker'.static.PrepareExplosive( Instigator, self );
super.PrepareExplosionTemplate();
}
defaultproperties
{
FuseTime=0.25 //0.5
Speed=4000
MaxSpeed=4000
TerminalVelocity=4000
TossZ=150
ProjFlightTemplate = ParticleSystem'WEP_HRG_Teslauncher_EMIT.FX_Medic_GrenadeLauncher_Projectile'
ProjFlightTemplateZedTime = ParticleSystem'WEP_HRG_Teslauncher_EMIT.FX_Medic_GrenadeLauncher_Projectile_ZEDTIME'
ExplosionActorClass=class'KFExplosionActor'
WeaponSelectTexture=Texture2D'ui_weaponselect_tex.UI_WeaponSelect_EMPGrenade'
bSyncToOriginalLocation=true
bSyncToThirdPersonMuzzleLocation=true
bWarnAIWhenFired=true
// set collision size to 0 so it doesn't cause non-zero extent checks against zeds
Begin Object Name=CollisionCylinder
CollisionRadius=0.f
CollisionHeight=0.f
End Object
// Grenade explosion light
Begin Object Name=ExplosionPointLight
LightColor=(R=128,G=200,B=255,A=255)
Brightness=4.f
Radius=750.f
FalloffExponent=10.f
CastShadows=False
CastStaticShadows=FALSE
CastDynamicShadows=True
bEnabled=FALSE
LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE)
End Object
// explosion
Begin Object Class=KFGameExplosion Name=ExploTemplate0
Damage=25 //100
DamageRadius=350 //600
DamageFalloffExponent=1 //2
DamageDelay=0.f
// Damage Effects
MyDamageType=class'KFDT_EMP_TeslauncherEMPGrenade'
FractureMeshRadius=100
FracturePartVel=250.0
ExplosionEffects=KFImpactEffectInfo'FX_Impacts_ARCH.Explosions.EMPGrenade_Explosion'
ExplosionSound=AkEvent'WW_WEP_EXP_Grenade_EMP.Play_WEP_EXP_Grenade_EMP_Explosion'
// Dynamic Light
ExploLight=ExplosionPointLight
ExploLightStartFadeOutTime=0.5
ExploLightFadeOutTime=0.25
ExploLightFlickerIntensity=5.f
ExploLightFlickerInterpSpeed=15.f
// Camera Shake
CamShake=CameraShake'FX_CameraShake_Arch.Grenades.Default_Grenade'
CamShakeInnerRadius=100
CamShakeOuterRadius=450
CamShakeFalloff=1.5f
bOrientCameraShakeTowardsEpicenter=true
End Object
ExplosionTemplate=ExploTemplate0
// Temporary effect (5.14.14)
ProjDisintegrateTemplate=ParticleSystem'ZED_Siren_EMIT.FX_Siren_grenade_disable_01'
AssociatedPerkClass=class'KFPerk_Berserker'
}