239 lines
8.0 KiB
Ucode
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"
|
|
}
|