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

239 lines
8.0 KiB
Ucode

class ScrnM4203AssaultRifle extends M4203AssaultRifle
config(user);
var transient bool bTriggerReleased; // indicates that fire button is released, but need to end the burst
var transient float PrevFireTime;
var name ReloadShortAnim;
var float ReloadShortRate;
var transient bool bShortReload;
var vector ZoomedViewOffset;
//copypaste to add additional offset
simulated event RenderOverlays( Canvas Canvas )
{
local int m;
local vector DrawOffset;
if (Instigator == None)
return;
if ( Instigator.Controller != None )
Hand = Instigator.Controller.Handedness;
if ((Hand < -1.0) || (Hand > 1.0))
return;
// draw muzzleflashes/smoke for all fire modes so idle state won't
// cause emitters to just disappear
for (m = 0; m < NUM_FIRE_MODES; m++)
{
if (FireMode[m] != None)
{
FireMode[m].DrawMuzzleFlash(Canvas);
}
}
DrawOffset = (90/DisplayFOV * ZoomedViewOffset) >> Instigator.GetViewRotation(); //calculate additional offset
SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) + DrawOffset); //add additional offset
SetRotation( Instigator.GetViewRotation() + ZoomRotInterp);
//PreDrawFPWeapon(); // Laurent -- Hook to override things before render (like rotation if using a staticmesh)
bDrawingFirstPerson = true;
Canvas.DrawActor(self, false, false, DisplayFOV);
bDrawingFirstPerson = false;
}
simulated function bool StartFire(int Mode)
{
if ( Mode > 0 ) {
if ( FireMode[0].IsInState('WaitingForFireButtonRelease') )
FireMode[0].GotoState('');
if ( AmmoAmount(1) > 1 ) {
KFShotgunFire(FireMode[1]).FireAimedAnim='Fire_Iron_Secondary';
FireMode[1].FireAnim='Fire_Secondary';
FireMode[1].default.FireRate=1.99;
}
else {
KFShotgunFire(FireMode[1]).FireAimedAnim='FireLast_Iron_Secondary';
FireMode[1].FireAnim='FireLast_Secondary';
FireMode[1].default.FireRate=0.5;
}
return super.StartFire(Mode);
}
if (FireMode[0].IsInState('WaitingForFireButtonRelease') || FireMode[0].IsInState('FireBurst'))
return false;
if( !super(KFWeapon).StartFire(0) ) // returns false when mag is empty
return false;
//AnimStopLooping();
//prevent fire button spam-clicking
if( !FireMode[0].IsInState('FireBurst') && (AmmoAmount(0) > 0) && Level.TimeSeconds > PrevFireTime + 0.2 )
{
PrevFireTime = Level.TimeSeconds;
bTriggerReleased = false;
FireMode[0].GotoState('FireBurst');
return true;
}
return false;
}
simulated function ReallyStopFire(int Mode)
{
super.StopFire(Mode);
}
simulated function StopFire(int Mode)
{
//log("StopFire("$Mode$")", 'ScrnBalance');
if ( Mode > 0 ) {
if ( FireMode[0].IsInState('WaitingForFireButtonRelease') ) //this shouldn't happed, but just to be sure
FireMode[0].GotoState('');
super.StopFire(Mode);
return;
}
// Dear Server and Mighty Cthulhu, who's living inside KFMod code and makes stuff glitching all the time,
// By setting the flag below I want to acknowledge you my wish of stopping bring death to this holy place
// as soon as my weapon stops firing (burst ends).
// So please allow me to reload my gun this time!
// kind regards,
// Client.
bTriggerReleased = true;
// Always shoots full burt
// if ( FireMode[0].IsInState('WaitingForFireButtonRelease') )
// FireMode[0].GotoState('');
// else if ( !FireMode[0].IsInState('FireBurst') )
// super.StopFire(0);
// Allows stopping fire
super.StopFire(Mode);
if (FireMode[Mode].IsInState('WaitingForFireButtonRelease'))
FireMode[Mode].GotoState('');
}
exec function ReloadMeNow()
{
local float ReloadMulti;
// tbs burst fire won't screw reload
if ( FireMode[0].IsInState('FireBurst') || FireMode[0].IsInState('WaitingForFireButtonRelease') )
FireMode[0].GotoState('');
if(!AllowReload())
return;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self);
else
ReloadMulti = 1.0;
bIsReloading = true;
ReloadTimer = Level.TimeSeconds;
bShortReload = MagAmmoRemaining > 0;
if ( bShortReload )
ReloadRate = Default.ReloadShortRate / ReloadMulti;
else
ReloadRate = Default.ReloadRate / ReloadMulti;
if( bHoldToReload )
{
NumLoadedThisReload = 0;
}
ClientReload();
Instigator.SetAnimAction(WeaponReloadAnim);
if ( Level.Game.NumPlayers > 1 && KFGameType(Level.Game).bWaveInProgress && KFPlayerController(Instigator.Controller) != none &&
Level.TimeSeconds - KFPlayerController(Instigator.Controller).LastReloadMessageTime > KFPlayerController(Instigator.Controller).ReloadMessageDelay )
{
KFPlayerController(Instigator.Controller).Speech('AUTO', 2, "");
KFPlayerController(Instigator.Controller).LastReloadMessageTime = Level.TimeSeconds;
}
}
simulated function ClientReload()
{
local float ReloadMulti;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self);
else
ReloadMulti = 1.0;
bIsReloading = true;
if (MagAmmoRemaining <= 0)
{
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
else if (MagAmmoRemaining >= 1)
{
PlayAnim(ReloadShortAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
}
function AddReloadedAmmo()
{
local int a;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
a = MagCapacity;
if ( bShortReload )
a++; // 1 bullet already bolted
if ( AmmoAmount(0) >= a )
MagAmmoRemaining = a;
else
MagAmmoRemaining = AmmoAmount(0);
// this seems redudant -- PooSH
// if( !bHoldToReload )
// {
// ClientForceKFAmmoUpdate(MagAmmoRemaining,AmmoAmount(0));
// }
if ( PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none )
{
KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnWeaponReloaded();
}
}
defaultproperties
{
ReloadShortAnim="Reload"
ReloadShortRate=1.900000
ZoomedViewOffset=(Z=-0.250000)
ReloadRate=2.794846
ReloadAnimRate=1.300000
FireModeClass(0)=Class'ScrnBalanceSrv.ScrnM4203BulletFire'
FireModeClass(1)=Class'ScrnBalanceSrv.ScrnM203Fire'
IdleAnimRate=0.330000
Description="An assault rifle with an attached grenade launcher. Shoots in 3-bullet fixed-burst mode."
InventoryGroup=3
PickupClass=Class'ScrnBalanceSrv.ScrnM4203Pickup'
PlayerViewPivot=(Pitch=25,Yaw=5)
ItemName="M4 203 SE"
}