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

218 lines
6.5 KiB
Ucode

class ScrnMP5MMedicGun extends MP5MMedicGun;
var float ReloadShortRate;
var string NewAnimRef;
var string OldAnimRef;
var MeshAnimation NewAnim; //test
var ScrnMP5MBullets MP5MBullets; //for tactical reload
var transient bool bShortReload;
static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount)
{
local ScrnMP5MMedicGun spawned;
super.PreloadAssets(Inv, bSkipRefCount);
if (default.NewAnimRef == "")
return;
default.NewAnim = MeshAnimation(DynamicLoadObject(default.NewAnimRef, class'MeshAnimation', true));
spawned = ScrnMP5MMedicGun(Inv);
if( spawned != none ) {
spawned.NewAnim = default.NewAnim;
spawned.AddNewAnim();
}
}
static function bool UnloadAssets()
{
default.NewAnim = none;
return super.UnloadAssets();
}
//new anim in PostBeginPlay because adding it in PreloadAssets didn't work
simulated function PostBeginPlay()
{
super.PostBeginPlay();
AddNewAnim();
if (Level.NetMode != NM_DedicatedServer) {
//attach bullets to old mag for tactical reload
if ( MP5MBullets == none ) {
MP5MBullets = spawn(class'ScrnMP5MBullets',self);
}
if ( MP5MBullets != none ) {
AttachToBone(MP5MBullets, 'Empty_Magazine');
}
}
}
simulated function AddNewAnim()
{
if (NewAnim == none || NewAnimRef == "")
return;
LinkSkelAnim(NewAnim); //load new anim
//for some reason linking the new anim removed the link to the old one, so we need to load it again
LinkSkelAnim(MeshAnimation(DynamicLoadObject(OldAnimRef, class'MeshAnimation', true)));
}
//destroy mp5m bullets when done
simulated function Destroyed()
{
if ( MP5MBullets != None )
MP5MBullets.Destroy();
super.Destroyed();
}
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;
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)
{
bShortReload = false;
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti, 0.1);
if (MP5MBullets != none)
{
MP5MBullets.SetDrawScale(0.0);
}
}
else if (MagAmmoRemaining >= 1)
{
bShortReload = true;
if (NewAnim != none && HasAnim('reloadshort'))
{
PlayAnim('reloadshort', ReloadAnimRate*ReloadMulti, 0.1);
}
else
{
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti*(ReloadRate/ReloadShortRate), 0.1);
}
if (MP5MBullets != none)
{
MP5MBullets.SetDrawScale(1.0);
MP5MBullets.HandleBulletScale(MagAmmoRemaining);
}
}
}
//added delay after reload and moved idle into timer
simulated function ClientFinishReloading()
{
bIsReloading = false;
if (!bShortReload )
{
PlayIdle(); //don't play blend for tactical reload to avoid magazine tween
}
if(Instigator.PendingWeapon != none && Instigator.PendingWeapon != self)
Instigator.Controller.ClientSwitchToBestWeapon();
}
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
{
ReloadShortRate=2.000000
NewAnimRef="ScrnAnims.mp5_anim_new"
OldAnimRef="KF_Wep_MP5.Mp5_anim"
HealAmmoCharge=0
MagCapacity=30
ReloadRate=2.900000
bReduceMagAmmoOnSecondaryFire=False
ReloadAnimRate=1.300000
Weight=4.000000
FireModeClass(0)=Class'ScrnBalanceSrv.ScrnMP5MFire'
FireModeClass(1)=Class'ScrnBalanceSrv.ScrnMP5MAltFire'
InventoryGroup=4
PickupClass=Class'ScrnBalanceSrv.ScrnMP5MPickup'
PlayerViewPivot=(Pitch=45,Yaw=5)
ItemName="MP5M Medic Gun SE"
}