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

233 lines
7.1 KiB
Ucode

class ScrnAA12AutoShotgun extends AA12AutoShotgun;
var name ReloadShortAnim;
var float ReloadShortRate;
var transient bool bShortReload;
var bool bBoltClosed;
var ScrnFakedProjectile FakedShell;
replication
{
reliable if(Role < ROLE_Authority)
ServerCloseBolt;
}
simulated function PostBeginPlay()
{
super.PostBeginPlay();
if ( Level.NetMode != NM_DedicatedServer )
{
if ( FakedShell == none ) //only spawn fakedshell once
FakedShell = spawn(class'ScrnFakedShell',self);
if ( FakedShell != none )
{
AttachToBone(FakedShell, 'Magazine'); //attach faked shell to AA12 magazine
FakedShell.SetDrawScale(4.7); //4.7
FakedShell.SetRelativeLocation(vect(0.15, 0, 4.00));
FakedShell.SetRelativeRotation(rot(0,32768,0));
//attempt to set shell to have same skin as AA12 (for cases where player is using golden aa12 or something)
if ( Skins.length > 1 && Skins[1] != none)
FakedShell.Skins[0] = self.Skins[1];
}
}
}
simulated function ResetBoltPosition()
{
// if ( Level.NetMode != NM_DedicatedServer )
// TODO :SetBoneLocation( 'Bolt', ChargingHandleOffset, 0 ); //reset charging handle position
}
simulated function MoveBoltForward()
{
// if ( Level.NetMode != NM_DedicatedServer )
// TODO: SetBoneLocation( 'Bolt', -ChargingHandleOffset, 100 ); //move bolt forward
}
function ServerCloseBolt()
{
bBoltClosed = true;
bShortReload = false;
}
simulated function CloseBolt()
{
ServerCloseBolt();
bBoltClosed = true;
bShortReload = false;
MoveBoltForward();
}
simulated function bool AllowReload()
{
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
if(KFInvasionBot(Instigator.Controller) != none && !bIsReloading && MagAmmoRemaining < MagCapacity && AmmoAmount(0) > MagAmmoRemaining)
return true;
if(KFFriendlyAI(Instigator.Controller) != none && !bIsReloading && MagAmmoRemaining < MagCapacity && AmmoAmount(0) > MagAmmoRemaining)
return true;
if(FireMode[0].IsFiring() || FireMode[1].IsFiring() || bIsReloading || MagAmmoRemaining >= MagCapacity || ClientState == WS_BringUp || AmmoAmount(0) <= MagAmmoRemaining ||(FireMode[0].NextFireTime - Level.TimeSeconds) > 0.1 )
return false;
return true;
}
exec function ReloadMeNow()
{
local float ReloadMulti;
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 = !bBoltClosed;
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 )
ShowFakedShell();
else
HideFakedShell();
bShortReload = !bBoltClosed; //bShortReload depends on bBoltClosed
if ( !bShortReload )
{
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
else
{
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti, 0.1);
SetTimer(0.25/ReloadMulti, false); //for tactical reload, skip reload animation only after 7.5 frames of anim so it looks good
}
}
simulated function ClientFinishReloading()
{
super.ClientFinishReloading();
bBoltClosed = false; //this is needed to reset bolt position after reload
bShortReload = true;
}
//added this for a somewhat smoother transition for tactical reload start
simulated function Timer()
{
if (bIsReloading)
{
SetAnimFrame(29.35, 0 , 1); //go straight to frame 29.35
}
Super.Timer();
}
function AddReloadedAmmo()
{
local int a;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
a = MagCapacity;
//if ( bShortReload )
// a++; // 1 bullet already bolted //disabled because aa-12 is an open bolt weapon
if ( AmmoAmount(0) >= a )
MagAmmoRemaining = a;
else
MagAmmoRemaining = AmmoAmount(0);
bBoltClosed = false;
bShortReload = true;
if ( PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none )
{
KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnWeaponReloaded();
}
}
simulated function ShowFakedShell()
{
if ( FakedShell != none )
FakedShell.SetDrawScale(4.7); //4.7
}
simulated function HideFakedShell()
{
if ( FakedShell != none )
FakedShell.SetDrawScale(0.01); //4.7
}
simulated function ClientReloadEffects()
{
HideFakedShell();
}
simulated function Destroyed()
{
if ( FakedShell != none && !FakedShell.bDeleteMe )
FakedShell.Destroy();
super.Destroyed();
}
defaultproperties
{
ReloadShortAnim="Reload"
ReloadShortRate=2.350000
FireModeClass(0)=Class'ScrnBalanceSrv.ScrnAA12Fire'
Description="An advanced fully automatic shotgun. Delivers less per-bullet damage, but awesome penetration and fire rate make it the best choise to kill everything... while you have ammo remaining"
PickupClass=Class'ScrnBalanceSrv.ScrnAA12Pickup'
ItemName="AA12 SE"
}