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

132 lines
3.9 KiB
Ucode

class PawnWeldFire extends WeldFire;
var array <class<Actor> > 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'
}