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

244 lines
6.8 KiB
Ucode

//=============================================================================
// Winchester Fire
//=============================================================================
class WinchesterFire extends KFFire;
// KFTODO - Slomo compensation R&D, finish later if I have time - Ramm
//var() bool bDoSlomoCompensation;
//
//var bool bWasNormal;
//
//event ModeTick(float dt)
//{
// local name anim;
// local float frame, rate;
// local float TimeLeft;
//
// if( Weapon.Level.TimeDilation != 1.1 )
// {
// if( bWasNormal )
// {
// FireRate = default.FireRate * ((Weapon.Level.TimeDilation )/1.1);
// TweenTime = default.TweenTime * ((Weapon.Level.TimeDilation )/1.1);
// log("default.FireRate = "$default.FireRate$" FireRate = "$FireRate$" Dilation Factor "$((Weapon.Level.TimeDilation * 2.0)/1.1));
// //FireRate = default.FireRate/Rec * (Weapon.Level.TimeDilation/1.1);
// FireAnimRate = default.FireAnimRate/ ((Weapon.Level.TimeDilation )/1.1);
//
//
// Weapon.GetAnimParams(0, anim, frame, rate);
//
// if( Anim == FireAnim )
// {
// Weapon.PlayAnim(FireAnim, FireAnimRate, /*TweenTime*/);
// Weapon.SetAnimFrame( frame );
// }
//
// TimeLeft = NextFireTime - (Level.TimeSeconds - LastFireTime);
// NextFireTime = TimeLeft * ((Weapon.Level.TimeDilation /** 1.75*/)/1.1);
// }
//
// bWasNormal = false;
// }
// else
// {
// bWasNormal = true;
// }
//
//
//}
// KFTODO - Slomo compensation R&D, finish later if I have time - Ramm
//function Timer()
//{
// if( Weapon.Level.TimeDilation == 1.1 )
// {
// KFGameType(Level.Game).DramaticEvent(1.0);
// }
//}
// Overridden to support interrupting the reload
simulated function bool AllowFire()
{
if( KFWeapon(Weapon).bIsReloading && KFWeapon(Weapon).MagAmmoRemaining < 2)
return false;
if(KFPawn(Instigator).SecondaryItem!=none)
return false;
if( KFPawn(Instigator).bThrowingNade )
return false;
if( Level.TimeSeconds - LastClickTime>FireRate )
{
LastClickTime = Level.TimeSeconds;
}
if( KFWeaponShotgun(Weapon).MagAmmoRemaining<1 )
{
return false;
}
return super(WeaponFire).AllowFire();
}
event ModeDoFire()
{
local float Rec;
if (!AllowFire())
return;
if( Instigator==None || Instigator.Controller==none )
return;
Rec = GetFireSpeed();
// KFTODO - Slomo compensation R&D, finish later if I have time - Ramm
// if( bDoSlomoCompensation && Weapon.Level.TimeDilation != 1.1 )
// {
// FireRate = default.FireRate * ((Weapon.Level.TimeDilation /** 1.75*/)/1.1);
// TweenTime = default.TweenTime * ((Weapon.Level.TimeDilation /** 1.75*/)/1.1);
// log("default.FireRate = "$default.FireRate$" FireRate = "$FireRate$" Dilation Factor "$((Weapon.Level.TimeDilation * 2.0)/1.1));
// //FireRate = default.FireRate/Rec * (Weapon.Level.TimeDilation/1.1);
// FireAnimRate = default.FireAnimRate*Rec / ((Weapon.Level.TimeDilation /** 1.75*/)/1.1);
// //ReloadAnimRate = default.ReloadAnimRate*Rec / ((Weapon.Level.TimeDilation * 2.0)/1.1);
// }
// else
// {
FireRate = default.FireRate/Rec;
FireAnimRate = default.FireAnimRate;
ReloadAnimRate = default.ReloadAnimRate*Rec;
// }
Rec = 1;
LastFireTime = Level.TimeSeconds;
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
{
Spread *= KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.ModifyRecoilSpread(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self, Rec);
}
if (MaxHoldTime > 0.0)
HoldTime = FMin(HoldTime, MaxHoldTime);
// server
if (Weapon.Role == ROLE_Authority)
{
Weapon.ConsumeAmmo(ThisModeNum, Load);
DoFireEffect();
HoldTime = 0; // if bot decides to stop firing, HoldTime must be reset first
if ( (Instigator == None) || (Instigator.Controller == None) )
return;
if ( AIController(Instigator.Controller) != None )
AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true);
Instigator.DeactivateSpawnProtection();
}
// client
if (Instigator.IsLocallyControlled())
{
ShakeView();
PlayFiring();
FlashMuzzleFlash();
StartMuzzleSmoke();
}
else // server
{
ServerPlayFiring();
}
Weapon.IncrementFlashCount(ThisModeNum);
// set the next firing time. must be careful here so client and server do not get out of sync
if (bFireOnRelease)
{
if (bIsFiring)
NextFireTime += MaxHoldTime + FireRate;
else NextFireTime = Level.TimeSeconds + FireRate;
}
else
{
NextFireTime += FireRate;
NextFireTime = FMax(NextFireTime, Level.TimeSeconds);
}
Load = AmmoPerFire;
HoldTime = 0;
if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None)
{
bIsFiring = false;
Weapon.PutDown();
}
if (Weapon.Owner != none && AllowFire() && Weapon.Owner.Physics != PHYS_Falling)
{
if (FireRate > 0.25)
{
Weapon.Owner.Velocity.x *= 0.1;
Weapon.Owner.Velocity.y *= 0.1;
}
else
{
Weapon.Owner.Velocity.x *= 0.5;
Weapon.Owner.Velocity.y *= 0.5;
}
}
// client
if (Instigator.IsLocallyControlled())
{
if( bDoClientRagdollShotFX && Weapon.Level.NetMode == NM_Client &&
Weapon.Level.TimeDilation != Weapon.Level.default.TimeDilation )
{
DoClientOnlyFireEffect();
}
HandleRecoil(1.0);
}
// KFTODO - Slomo compensation R&D, finish later if I have time - Ramm
//SetTimer(0.2,False);
}
defaultproperties
{
DamageType=Class'KFMod.DamTypeWinchester'
DamageMin=110 // 150 Original // 85 Deagle
DamageMax=140 // 180 Original // 105 Deagle
Momentum=18000.000000
bPawnRapidFireAnim=True
bModeExclusive=False
bAttachSmokeEmitter=True
TransientSoundVolume=1.8
FireLoopAnim=
FireEndAnim=
FireSound=Sound'KF_RifleSnd.Rifle_Fire'
StereoFireSoundRef="KF_RifleSnd.Rifle_FireST"
NoAmmoSound=Sound'KF_RifleSnd.Rifle_DryFire'
FireForce="ShockRifleFire"
FireRate=0.900000
RecoilRate=0.1
AmmoClass=Class'KFMod.WinchesterAmmo'
AmmoPerFire=1
FireAimedAnim=AimFire
BotRefireRate=0.650000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar'
aimerror=0.000000
Spread=0.007
maxVerticalRecoilAngle=800
maxHorizontalRecoilAngle=250
bWaitForRelease=true
//** View shake **//
ShakeOffsetMag=(X=10.0,Y=3.0,Z=12.0)
ShakeOffsetRate=(X=1000.0,Y=1000.0,Z=1000.0)
ShakeOffsetTime=2.0
ShakeRotMag=(X=100.0,Y=100.0,Z=500.0)
ShakeRotRate=(X=10000.0,Y=10000.0,Z=10000.0)
ShakeRotTime=2.0
}