class NitroProjectile extends ShotgunBullet abstract; var class Trail1Class, Trail2Class; var Emitter Trail1, Trail2; simulated function PostBeginPlay() { SetTimer(0.2, true); Velocity = Speed * Vector(Rotation); if ( Level.NetMode != NM_DedicatedServer ) { if ( !PhysicsVolume.bWaterVolume ) { Trail1 = Spawn(Trail1Class,self); Trail2 = Spawn(Trail2Class,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); if ( Level.DetailMode >= DM_High ) Spawn(class'NitroGroundEffect',self,,Location); } 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 && !Level.bDropDetail ) { if ( EffectIsRelevant(Location,false) ) { Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal)); if ( Level.DetailMode > DM_Low ) { Spawn(class'NitroSplash',self,,HitLocation,rotator(HitNormal)); if ( Level.DetailMode >= DM_SuperHigh ) Spawn(class'NitroImpact',self,,HitLocation,rotator(-HitNormal)); } } } SetCollisionSize(0.0, 0.0); Destroy(); } // overrided to don't damage projectiles simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) { local actor Victims; local float damageScale, dist; local vector dir; if ( bHurtEntry ) return; bHurtEntry = true; foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation ) { // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && !Victims.IsA('Projectile') ) { dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == None || Instigator.Controller == None ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = None; Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType ); if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); } } if ( (LastTouched != None) && (LastTouched != self) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') && !Victims.IsA('Projectile') ) { Victims = LastTouched; LastTouched = None; dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); if ( Instigator == None || Instigator.Controller == None ) Victims.SetDelayedDamageInstigatorController(InstigatorController); Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType ); if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); } bHurtEntry = false; } simulated function Destroyed() { if ( Trail != none ) { Trail.mRegen=False; Trail.SetPhysics(PHYS_None); } if ( Trail1 != none ) { Trail1.Kill(); Trail1.SetPhysics(PHYS_None); } if ( Trail2 != none ) { Trail2.Kill(); Trail2.SetPhysics(PHYS_None); } Super.Destroyed(); } simulated function ProcessTouch (Actor Other, vector HitLocation) { if ( Other == none || Other == Instigator || Other.Base == Instigator ) return; if ( Other != Instigator && !Other.IsA('PhysicsVolume') && !Other.IsA('Projectile') && !Other.IsA('ROBulletWhipAttachment') ) { // Don't allow hits on people on the same team // if( KFHumanPawn(Other) != none && Instigator != none // && KFHumanPawn(Other).GetTeamNum() == Instigator.GetTeamNum() ) // return; if ( KFPawn(Other) != none && KFPawn(Other).BurnDown > 1 ) KFPawn(Other).BurnDown /= 2; 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 ( Trail2 != none ) // Trail2.SetDrawScale(Trail2.DrawScale * 1.5); // } defaultproperties { Trail1Class=Class'ScrnHTec.NitroTrail' Trail2Class=Class'ScrnHTec.NitroTrailB' MaxPenetrations=1 PenDamageReduction=0.000000 HeadShotDamageMult=1.000000 Speed=750.000000 MaxSpeed=750.000000 TossZ=200.000000 Damage=5.000000 DamageRadius=120.000000 MomentumTransfer=0.000000 MyDamageType=Class'ScrnHTec.DamTypeFreezerNitro' ImpactSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_AcidSplash' ExplosionDecal=Class'ScrnHTec.NitroDecal' DrawType=DT_None StaticMesh=None Physics=PHYS_Falling LifeSpan=5.000000 DrawScale=5.000000 Style=STY_None bBlockHitPointTraces=False }