class stub_DualiesFire extends DualiesFire; var int penValue; function DoTrace(Vector Start, Rotator Dir) { local Vector X,Y,Z, End, HitLocation, HitNormal, ArcEnd; local Actor Other; local byte HitCount,HCounter; local float HitDamage; local array HitPoints; local KFPawn HitPawn; local array IgnoreActors; local Actor DamageActor; local int i; MaxRange(); Weapon.GetViewAxes(X, Y, Z); if ( Weapon.WeaponCentered() ) { ArcEnd = (Instigator.Location + Weapon.EffectOffset.X * X + 1.5 * Weapon.EffectOffset.Z * Z); } else { ArcEnd = (Instigator.Location + Instigator.CalcDrawOffset(Weapon) + Weapon.EffectOffset.X * X + Weapon.Hand * Weapon.EffectOffset.Y * Y + Weapon.EffectOffset.Z * Z); } X = Vector(Dir); End = Start + TraceRange * X; HitDamage = DamageMax; // MK23Fire, DualMK23Fire = 3 // DeagleFire, DualDeagleFire, Magnum44Fire, Dual44MagnumFire = 10 if (self.class.name == 'MK23Fire' || self.class.name == 'DualMK23Fire') class'stub_DualiesFire'.default.penValue = 3; else class'stub_DualiesFire'.default.penValue = 10; while( (HitCount++) < class'stub_DualiesFire'.default.penValue ) // there was fixed value here per parent class { DamageActor = none; Other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1); if( Other==None ) { break; } else if( Other==Instigator || Other.Base == Instigator ) { IgnoreActors[IgnoreActors.Length] = Other; Other.SetCollision(false); Start = HitLocation; continue; } if( ExtendedZCollision(Other)!=None && Other.Owner!=None ) { IgnoreActors[IgnoreActors.Length] = Other; IgnoreActors[IgnoreActors.Length] = Other.Owner; Other.SetCollision(false); Other.Owner.SetCollision(false); DamageActor = Pawn(Other.Owner); } if ( !Other.bWorldGeometry && Other!=Level ) { HitPawn = KFPawn(Other); if ( HitPawn != none ) { // Hit detection debugging /*log("PreLaunchTrace hit "$HitPawn.PlayerReplicationInfo.PlayerName); HitPawn.HitStart = Start; HitPawn.HitEnd = End;*/ if(!HitPawn.bDeleteMe) HitPawn.ProcessLocationalDamage(int(HitDamage), Instigator, HitLocation, Momentum*X,DamageType,HitPoints); // Hit detection debugging /*if( Level.NetMode == NM_Standalone) HitPawn.DrawBoneLocation();*/ IgnoreActors[IgnoreActors.Length] = Other; IgnoreActors[IgnoreActors.Length] = HitPawn.AuxCollisionCylinder; Other.SetCollision(false); HitPawn.AuxCollisionCylinder.SetCollision(false); DamageActor = Other; } else { if ( KFMonster(Other)!=None ) { IgnoreActors[IgnoreActors.Length] = Other; Other.SetCollision(false); DamageActor = Other; } else if ( DamageActor == none ) { DamageActor = Other; } Other.TakeDamage(int(HitDamage), Instigator, HitLocation, Momentum*X, DamageType); } if ( (HCounter++) >= 4 || Pawn(DamageActor) == None ) { break; } HitDamage/=2; Start = HitLocation; } else if ( HitScanBlockingVolume(Other) == None ) { if ( KFWeaponAttachment(Weapon.ThirdPersonActor) != none ) KFWeaponAttachment(Weapon.ThirdPersonActor).UpdateHit(Other,HitLocation,HitNormal); Break; } } // Turn the collision back on for any actors we turned it off // FIXED accessed none IgnoreActors ! if (IgnoreActors.Length <= 0) return; for (i=0; i