class PawnWeldFire extends WeldFire; var array > ValidWeldTypes; simulated Function Timer() { local Actor HitActor; local vector StartTrace, EndTrace, HitLocation, HitNormal,AdjustedLocation; local rotator PointRot; local int MyDamage; If( !KFWeapon(Weapon).bNoHit ) { MyDamage = MeleeDamage + Rand(MaxAdditionalDamage); if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none ) { MyDamage = float(MyDamage) * KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetWeldSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo)); } PointRot = Instigator.GetViewRotation(); StartTrace = Instigator.Location + Instigator.EyePosition(); if( AIController(Instigator.Controller)!=None && Instigator.Controller.Target!=None ) { EndTrace = StartTrace + vector(PointRot)*weaponRange; Weapon.bBlockHitPointTraces = false; HitActor = Trace( HitLocation, HitNormal, EndTrace, StartTrace, true); Weapon.bBlockHitPointTraces = Weapon.default.bBlockHitPointTraces; if( HitActor==None ) { EndTrace = Instigator.Controller.Target.Location; Weapon.bBlockHitPointTraces = false; HitActor = Trace( HitLocation, HitNormal, EndTrace, StartTrace, true); Weapon.bBlockHitPointTraces = Weapon.default.bBlockHitPointTraces; } if( HitActor==None ) HitLocation = Instigator.Controller.Target.Location; HitActor = Instigator.Controller.Target; } else { EndTrace = StartTrace + vector(PointRot)*weaponRange; Weapon.bBlockHitPointTraces = false; HitActor = Trace( HitLocation, HitNormal, EndTrace, StartTrace, true); Weapon.bBlockHitPointTraces = Weapon.default.bBlockHitPointTraces; } LastHitActor = HitActor; if( HitActor != none && IsValidWeldTarget(HitActor) && Level.NetMode!=NM_Client ) { AdjustedLocation = Hitlocation; AdjustedLocation.Z = (Hitlocation.Z - 0.15 * Instigator.collisionheight); HitActor.TakeDamage(MyDamage, Instigator, HitLocation , vector(PointRot),hitDamageClass); Spawn(class'KFWelderHitEffect',,, AdjustedLocation, rotator(HitLocation - StartTrace)); } } } function bool IsValidWeldTarget(actor HitActor) { local int idx; /* No Welding of in-active breaker boxes */ if(HitActor.IsA('KF_BreakerBoxNPC') && !KF_BreakerBoxNPC(HitActor).bActive) { return false; } for(idx = 0 ; idx < ValidWeldTypes.length ; idx ++) { if(ClassIsChildOf(HitActor.Class,ValidWeldTypes[idx])) { return true; } } return false; } function Actor GetWeldTarget() { local Actor A; local vector Dummy,End,Start; if( AIController(Instigator.Controller)!=None ) Return Pawn(Instigator.Controller.Target); Start = Instigator.Location+Instigator.EyePosition(); End = Start+vector(Instigator.GetViewRotation())*weaponRange; Instigator.bBlockHitPointTraces = false; A = Instigator.Trace(Dummy,Dummy,End,Start,True); Instigator.bBlockHitPointTraces = Instigator.default.bBlockHitPointTraces; return A; } function bool AllowFire() { local Actor WeldTarget; WeldTarget = GetWeldTarget(); // Can't use welder, if no door. if ( WeldTarget == none || !IsValidWeldTarget(WeldTarget) ) { if ( KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).CheckForHint(54); if ( FailTime + 0.5 < Level.TimeSeconds ) { PlayerController(Instigator.Controller).ClientMessage(NoWeldTargetMessage, 'CriticalEvent'); FailTime = Level.TimeSeconds; } } return false; } return Weapon.AmmoAmount(ThisModeNum) >= AmmoPerFire ; } defaultproperties { ValidWeldTypes(0) = class 'KFDoorMover' ValidWeldTypes(1) = class 'KF_StoryNPC_Static' }