233 lines
7.1 KiB
Ucode
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"
|
|
}
|