219 lines
5.0 KiB
Ucode
219 lines
5.0 KiB
Ucode
//=============================================================================
|
|
// Flame
|
|
//=============================================================================
|
|
class FlameTendril extends ShotgunBullet;
|
|
|
|
var bool bRing, bHitWater, bWaterStart;
|
|
var Effects Corona;
|
|
var Emitter FlameTrail;
|
|
var byte TimerRunCount;
|
|
|
|
simulated function PostBeginPlay()
|
|
{
|
|
SetTimer(0.2, true);
|
|
|
|
Velocity = Speed * Vector(Rotation); // starts off slower so combo can be done closer
|
|
|
|
if ( Level.NetMode != NM_DedicatedServer )
|
|
{
|
|
if ( !PhysicsVolume.bWaterVolume )
|
|
{
|
|
FlameTrail = Spawn(class'FlameThrowerFlameB',self);
|
|
Trail = Spawn(class'FlameThrowerFlame',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 );
|
|
}
|
|
|
|
if ( KFHumanPawn(Instigator) != none )
|
|
{
|
|
if ( EffectIsRelevant(Location,false) )
|
|
{
|
|
Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal));
|
|
Spawn(class'FuelFlame',self,,Location);
|
|
}
|
|
}
|
|
|
|
SetCollisionSize(0.0, 0.0);
|
|
Destroy();
|
|
}
|
|
|
|
simulated function Destroyed()
|
|
{
|
|
if ( Trail != none )
|
|
{
|
|
Trail.mRegen=False;
|
|
Trail.SetPhysics(PHYS_None);
|
|
}
|
|
|
|
if ( FlameTrail != none )
|
|
{
|
|
FlameTrail.Kill();
|
|
FlameTrail.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()
|
|
{
|
|
Velocity = Default.Speed * Normal(Velocity);
|
|
|
|
if ( Trail != none )
|
|
{
|
|
Trail.mSizeRange[0] *= 1.8;
|
|
Trail.mSizeRange[1] *= 1.8;
|
|
}
|
|
|
|
if ( FlameTrail != none )
|
|
{
|
|
FlameTrail.SetDrawScale(FlameTrail.DrawScale * 1.5);
|
|
}
|
|
|
|
TimerRunCount++;
|
|
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
|
|
{
|
|
if ( TimerRunCount >= 2 + KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.ExtraRange(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo)) )
|
|
{
|
|
Explode(Location,VRand());
|
|
}
|
|
}
|
|
else if ( TimerRunCount >= 2 )
|
|
{
|
|
Explode(Location,VRand());
|
|
}
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
DamageAtten=5.000000
|
|
MaxPenetrations=3
|
|
PenDamageReduction=0
|
|
HeadShotDamageMult=1.0
|
|
Speed=2300.000000
|
|
MaxSpeed=2400.000000
|
|
bSwitchToZeroCollision=True
|
|
Damage=12//6
|
|
DamageRadius=150.000000
|
|
MomentumTransfer=0.000000
|
|
MyDamageType=class'DamTypeBurned'
|
|
ExplosionDecal=class'KFMod.FlameThrowerBurnMark'
|
|
DrawType=DT_None
|
|
StaticMesh=none
|
|
CullDistance=3000.000000
|
|
LifeSpan=5
|
|
DrawScale=5.000000 //5
|
|
Style=STY_None
|
|
|
|
Physics=PHYS_Falling
|
|
TossZ=+200.0 // +100
|
|
|
|
RemoteRole=ROLE_SimulatedProxy
|
|
bBlockHitPointTraces=false
|
|
}
|