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

174 lines
5.3 KiB
Ucode

//=============================================================================
// MAC Fire
//=============================================================================
class ScrnMAC10Fire extends MAC10Fire;
var() Sound BoltCloseSound;
var string BoltCloseSoundRef;
var bool bClientEffectPlayed;
//load additional sound
static function PreloadAssets(LevelInfo LevelInfo, optional KFFire Spawned)
{
local ScrnMac10Fire ScrnSpawned;
super.PreloadAssets(LevelInfo, Spawned);
if ( default.BoltCloseSoundRef != "" )
{
default.BoltCloseSound = sound(DynamicLoadObject(default.BoltCloseSoundRef, class'Sound', true));
}
ScrnSpawned = ScrnMac10Fire(Spawned);
if ( ScrnSpawned != none )
{
ScrnSpawned.BoltCloseSound = default.BoltCloseSound;
}
}
static function bool UnloadAssets()
{
default.BoltCloseSound = none;
return super.UnloadAssets();
}
function DoCloseBolt()
{
ScrnMAC10MP(KFWeap).CloseBolt();
if (BoltCloseSound != none && !bClientEffectPlayed )
{
Weapon.PlayOwnedSound(BoltCloseSound,SLOT_Interact,TransientSoundVolume * 0.85,,TransientSoundRadius,1.00,false);
bClientEffectPlayed = true;
}
}
state FireLoop
{
function BeginState()
{
super.BeginState();
NextFireTime = Level.TimeSeconds - 0.000001; //fire now!
}
function ModeTick(float dt)
{
if( KFWeap.MagAmmoRemaining < 1 )
{
DoCloseBolt(); //plays sound and sets bBoltClosed
}
Super.ModeTick(dt);
}
}
function ModeDoFire()
{
if ( Instigator != none && Instigator.IsLocallyControlled() ) {
if (KFWeap.MagAmmoRemaining <= 0 && !KFWeap.bIsReloading && ( Level.TimeSeconds - LastFireTime>FireRate )
&& !ScrnMAC10MP(KFWeap).bBoltClosed )
{
LastFireTime = Level.TimeSeconds;
DoCloseBolt(); //plays sound and sets bBoltClosed
}
else
{
bClientEffectPlayed = false; //reset if not empty
}
}
Super.ModeDoFire();
}
// Overwritten to switch damage types for the firebug
function DoTrace(Vector Start, Rotator Dir)
{
local Vector X,Y,Z, End, HitLocation, HitNormal, ArcEnd;
local Actor Other;
local KFWeaponAttachment WeapAttach;
local array<int> HitPoints;
local KFPawn HitPawn;
local KFMonster KFMonsterVictim;
MaxRange();
Weapon.GetViewAxes(X, Y, Z);
DamageType = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.static.GetMAC10DamageType(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo));
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;
Other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1);
if ( Other != None && Other != Instigator && Other.Base != Instigator )
{
WeapAttach = KFWeaponAttachment(Weapon.ThirdPersonActor);
if ( !Other.bWorldGeometry )
{
// Update hit effect except for pawns
if ( !Other.IsA('Pawn') && !Other.IsA('HitScanBlockingVolume') &&
!Other.IsA('ExtendedZCollision') )
{
if( WeapAttach!=None )
{
WeapAttach.UpdateHit(Other, HitLocation, HitNormal);
}
}
HitPawn = KFPawn(Other);
if ( HitPawn != none )
{
if ( !HitPawn.bDeleteMe )
{
HitPawn.ProcessLocationalDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType, HitPoints);
}
}
else
{
if ( ExtendedZCollision(Other) != none)
Other = Other.Owner; // ExtendedZCollision is attached to and owned by a KFMonster
KFMonsterVictim = KFMonster(Other);
if ( KFMonsterVictim != none && KFMonsterVictim.Health > 0
&& ClassIsChildOf(DamageType, class'DamTypeMAC10MPInc')
&& class'ScrnBalance'.default.Mut.BurnMech != none)
{
class'ScrnBalance'.default.Mut.BurnMech.MakeBurnDamage(
KFMonsterVictim, DamageMax, Instigator, HitLocation, Momentum * X, DamageType);
}
else {
Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType);
}
}
}
else
{
HitLocation = HitLocation + 2.0 * HitNormal;
if ( WeapAttach != None )
{
WeapAttach.UpdateHit(Other,HitLocation,HitNormal);
}
}
}
else
{
HitLocation = End;
HitNormal = Normal(Start - End);
}
}
defaultproperties
{
BoltCloseSoundRef="KF_FNFALSnd.FNFAL_Bolt_Forward"
FireAnim="Fire_Iron"
FireEndAnim="Fire_Iron_End"
}