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

103 lines
4.2 KiB
Ucode

class ScrnFlareProjectile extends FlareRevolverProjectile;
//overrided to use alternate burning mechanism
simulated function HurtRadius( float DamageAmount, float DamageRadius, class<DamageType> DamageType, float Momentum, vector HitLocation )
{
// v9.57 - flares do not explode anymore but do burn damage on impact
}
simulated function ProcessTouch(Actor Other, Vector HitLocation)
{
local vector X;
local Vector TempHitLocation, HitNormal, OtherLocation;
local array<int> HitPoints;
local KFPawn HitPawn;
// Don't let it hit this player, or blow up on another player
if ( Other == none || Other == Instigator || Other.Base == Instigator )
return;
// Don't collide with bullet whip attachments
// if( KFBulletWhipAttachment(Other) != none )
// {
// return;
// }
// Don't allow hits on poeple on the same team
HitPawn = KFPawn(Other);
if( HitPawn != none && Instigator != none && HitPawn.PlayerReplicationInfo != none
&& HitPawn.PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex )
return;
// Use the instigator's location if it exists. This fixes issues with
// the original location of the projectile being really far away from
// the real Origloc due to it taking a couple of milliseconds to
// replicate the location to the client and the first replicated location has
// already moved quite a bit.
if( Instigator != none )
OrigLoc = Instigator.Location;
X = Vector(Rotation);
OtherLocation = Other.Location;
if ( Role == ROLE_Authority ) {
if( ROBulletWhipAttachment(Other) != none )
{
if ( Other.Base.bDeleteMe )
return; // don't collide with dead players
Other = Instigator.HitPointTrace(TempHitLocation, HitNormal, HitLocation + (200 * X), HitPoints, HitLocation,, 1);
if( Other == none || HitPoints.Length == 0 )
return;
HitPawn = KFPawn(Other);
if ( HitPawn != none ) {
if( !HitPawn.bDeleteMe )
return;
if( Instigator != none && HitPawn.PlayerReplicationInfo != none
&& HitPawn.PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex )
return;
HitPawn.ProcessLocationalDamage(ImpactDamage, Instigator, TempHitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType,HitPoints);
HitPawn.ProcessLocationalDamage(Damage, Instigator, TempHitLocation, vect(0,0,0), MyDamageType, HitPoints);
}
}
else {
if ( ExtendedZCollision(Other) != none)
Other = Other.Owner; // ExtendedZCollision is attached to and owned by a KFMonster
if ( Pawn(Other) != none && Pawn(Other).IsHeadShot(HitLocation, X, 1.0) ) {
// ImpactDamage *= HeadShotDamageMult; // don't use projectile's mult. but damtype's
Damage *= HeadShotDamageMult;
}
Other.TakeDamage( ImpactDamage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType );
if ( KFMonster(Other) != none && class'ScrnBalance'.default.Mut.BurnMech != none ) {
class'ScrnBalance'.default.Mut.BurnMech.MakeBurnDamage(
KFMonster(Other), Damage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), MyDamageType );
}
else {
Other.TakeDamage(Damage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), MyDamageType);
}
}
}
if( !bDud )
Explode(HitLocation,Normal(HitLocation-Other.Location));
}
defaultproperties
{
ExplosionEmitter=Class'ScrnBalanceSrv.ScrnFlareRevolverImpact'
FlameTrailEmitterClass=Class'ScrnBalanceSrv.ScrnFlareRevolverTrail'
ImpactDamageType=Class'ScrnBalanceSrv.ScrnDamTypeFlareProjectileImpact'
ImpactDamage=85
Damage=30.000000
MyDamageType=Class'ScrnBalanceSrv.ScrnDamTypeFlare'
LightBrightness=170.000000
AmbientGlow=170
}