187 lines
6.0 KiB
Ucode
187 lines
6.0 KiB
Ucode
//=============================================================================
|
|
// SCAR MK17 Inventory class
|
|
//=============================================================================
|
|
class ScrnSCARMK17AssaultRifle extends SCARMK17AssaultRifle
|
|
config(user);
|
|
|
|
var name ReloadShortAnim;
|
|
var float ReloadShortRate;
|
|
|
|
var transient bool bShortReload;
|
|
|
|
//bolt moving things
|
|
var vector ChargingHandleOffset;
|
|
var rotator BoltReleaseRotation;
|
|
var bool bBoltReleased;
|
|
var transient bool bBoltLockQueued;
|
|
var float BoltLockTime;
|
|
var float BoltReleaseTime;
|
|
|
|
//allow firemode switch even if empty
|
|
simulated function AltFire(float F)
|
|
{
|
|
DoToggle();
|
|
}
|
|
|
|
//called to set bolt at end position at end of timer
|
|
simulated function MoveBoltForward()
|
|
{
|
|
SetBoneLocation( 'Charging_Bolt', ChargingHandleOffset, 0 ); //move bolt to forward position
|
|
SetBoneRotation( 'Bolt_Release', BoltReleaseRotation, , 0 ); //move bolt release to not locked back rotation
|
|
}
|
|
|
|
//called to set bolt at end position at end of timer
|
|
simulated function MoveBoltToLocked()
|
|
{
|
|
SetBoneLocation( 'Charging_Bolt', ChargingHandleOffset, 100 ); //move bolt to locked open position
|
|
SetBoneRotation( 'Bolt_Release', BoltReleaseRotation, , 100 ); //move bolt release to locked open rotation
|
|
}
|
|
|
|
//lock bolt if empty and selected
|
|
simulated function BringUp(optional Weapon PrevWeapon)
|
|
{
|
|
Super.BringUp(PrevWeapon);
|
|
if (MagAmmoRemaining == 0 )
|
|
MoveBoltToLocked();
|
|
}
|
|
|
|
simulated function WeaponTick(float dt)
|
|
{
|
|
//handles locking bolt
|
|
if (BoltLockTime > 0)
|
|
{
|
|
if( bBoltLockQueued && Level.TimeSeconds > BoltLockTime)
|
|
{
|
|
MoveBoltToLocked(); //lock bolt back
|
|
BoltLockTime = 0;
|
|
}
|
|
}
|
|
//handles releasing bolt after reload
|
|
if(bIsReloading && !bBoltReleased && Level.TimeSeconds >= BoltReleaseTime)
|
|
{
|
|
bBoltReleased = true;
|
|
MoveBoltForward(); //move bolt forward (only noticeable for empty reload)
|
|
}
|
|
Super.WeaponTick(dt);
|
|
}
|
|
|
|
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 = 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;
|
|
bBoltLockQueued = false;
|
|
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);
|
|
MoveBoltToLocked(); //shouldn't be needed but I put it here anyway to make sure it works
|
|
BoltReleaseTime = Level.TimeSeconds + 0.89*Default.ReloadRate/ReloadMulti;
|
|
}
|
|
else if (MagAmmoRemaining >= 1)
|
|
{
|
|
PlayAnim(ReloadShortAnim, ReloadAnimRate*ReloadMulti, 0.1);
|
|
}
|
|
}
|
|
|
|
simulated function ClientFinishReloading()
|
|
{
|
|
bBoltReleased = false; //allow bolt to be released again
|
|
MoveBoltForward(); //force bolt forward in case setting it in weapontick is broken
|
|
Super.ClientFinishReloading();
|
|
}
|
|
|
|
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=2.270000
|
|
ChargingHandleOffset=(X=-0.067000)
|
|
BoltReleaseRotation=(Roll=10)
|
|
FireModeClass(0)=Class'ScrnBalanceSrv.ScrnSCARMK17Fire'
|
|
PickupClass=Class'ScrnBalanceSrv.ScrnSCARMK17Pickup'
|
|
ItemName="SCARMK17 SE"
|
|
}
|