rott/kf_sources/KFMod/Classes/BlowerBileProjectile.uc
2026-07-14 20:27:09 +07:00

204 lines
4.7 KiB
Ucode

//=============================================================================
// BlowerBileProjectile
//=============================================================================
// Projectile class for the bloat bile thrower
//=============================================================================
// Killing Floor Source
// Copyright (C) 2013 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class BlowerBileProjectile extends ShotgunBullet;
var Emitter ExtraTrail;
simulated function PostBeginPlay()
{
SetTimer(0.2, true);
Velocity = Speed * Vector(Rotation);
if ( Level.NetMode != NM_DedicatedServer )
{
if ( !PhysicsVolume.bWaterVolume )
{
ExtraTrail = Spawn(class'BlowerThrowerSecondaryEmitter',self);
Trail = Spawn(class'BlowerThrowerPrimaryEmitter',self);
}
}
Velocity.z += TossZ;
}
simulated function PostNetBeginPlay()
{
local PlayerController PC;
Super.PostNetBeginPlay();
if ( Level.NetMode == NM_DedicatedServer )
{
return;
}
if ( Level.bDropDetail || (Level.DetailMode == DM_Low) )
{
bDynamicLight = false;
LightType = LT_None;
}
else
{
PC = Level.GetLocalPlayerController();
if ( (Instigator != None) && (PC == Instigator.Controller) )
{
return;
}
if ( (PC == None) || (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 3000) )
{
bDynamicLight = false;
LightType = LT_None;
}
}
}
simulated function Landed( vector HitNormal )
{
Explode(Location,HitNormal);
}
simulated function Explode(vector HitLocation,vector HitNormal)
{
if ( Role == ROLE_Authority )
{
HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation );
}
PlaySound(ImpactSound, SLOT_Misc);
if ( KFHumanPawn(Instigator) != none )
{
if ( EffectIsRelevant(Location,false) )
{
Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal));
Spawn(class'KFMod.VomGroundSplash',self,,HitLocation,rotator(HitNormal));
}
}
SetCollisionSize(0.0, 0.0);
Destroy();
}
simulated function Destroyed()
{
if ( Trail != none )
{
Trail.mRegen=False;
Trail.SetPhysics(PHYS_None);
}
if ( ExtraTrail != none )
{
ExtraTrail.Kill();
ExtraTrail.SetPhysics(PHYS_None);
}
Super.Destroyed();
}
function ProcessTouch (Actor Other, vector HitLocation)
{
if ( Other == none || Other == Instigator || Other.Base == Instigator )
return;
// Don't spawn an explosion if low gore is on
if ( Other != Instigator && class'GameInfo'.static.UseLowGore() && Other.IsA('KFMonster') )
{
if ( Role == ROLE_Authority )
{
HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation );
}
if ( KFHumanPawn(Instigator) != none )
{
if ( EffectIsRelevant(Location,false) )
{
Spawn(ExplosionDecal,self,,Location, Rotator(-Location));
}
}
SetCollisionSize(0.0, 0.0);
Destroy();
}
else if ( Other != Instigator && !Other.IsA('FlameTendril') && !Other.IsA('FuelFlame') && !Other.IsA('PhysicsVolume') )
{
Explode(self.Location,self.Location);
}
}
simulated singular function HitWall(vector HitNormal, actor Wall)
{
if ( Role == ROLE_Authority )
{
if ( !Wall.bStatic && !Wall.bWorldGeometry )
{
if ( Instigator == None || Instigator.Controller == None )
{
Wall.SetDelayedDamageInstigatorController( InstigatorController );
}
Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType);
if ( DamageRadius > 0 && Vehicle(Wall) != None && Vehicle(Wall).Health > 0 )
{
Vehicle(Wall).DriverRadiusDamage(Damage, DamageRadius, InstigatorController, MyDamageType, MomentumTransfer, Location);
}
HurtWall = Wall;
}
MakeNoise(1.0);
}
Explode(Location + ExploWallOut * HitNormal, HitNormal);
HurtWall = None;
}
simulated function Timer()
{
if ( ExtraTrail != none )
{
ExtraTrail.SetDrawScale(ExtraTrail.DrawScale * 1.5);
}
}
defaultproperties
{
MaxPenetrations=1
PenDamageReduction=0
HeadShotDamageMult=1.0
Speed=1000.0
MaxSpeed=1000.0
bSwitchToZeroCollision=True
Damage=30
DamageRadius=120.000000
MomentumTransfer=0.000000
MyDamageType=class'KFMod.DamTypeBlowerThrower'
ExplosionDecal=class'KFMod.VomitDecal'
DrawType=DT_None
StaticMesh=none
CullDistance=3000.000000
LifeSpan=5
DrawScale=5.000000
Style=STY_None
Physics=PHYS_Falling
TossZ=+200.0
RemoteRole=ROLE_SimulatedProxy
bBlockHitPointTraces=false
ImpactSound=Sound'KF_EnemiesFinalSnd.Bloat_AcidSplash'
}