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

339 lines
7.5 KiB
Ucode

//=============================================================================
// Modified MP7 MedicGun Inventory class
//=============================================================================
class MP7MMedicGun extends KFMedicGun;
// Return a float value representing the current healing charge amount
simulated function float ChargeBar()
{
return FClamp(float(HealAmmoCharge)/float(MaxAmmoCount),0,1);
}
simulated function MaxOutAmmo()
{
if ( bNoAmmoInstances )
{
if ( AmmoClass[0] != None )
AmmoCharge[0] = MaxAmmo(0);
return;
}
if ( Ammo[0] != None )
Ammo[0].AmmoAmount = Ammo[0].MaxAmmo;
HealAmmoCharge = MaxAmmoCount;
}
simulated function SuperMaxOutAmmo()
{
HealAmmoCharge = 999;
if ( bNoAmmoInstances )
{
if ( AmmoClass[0] != None )
AmmoCharge[0] = 999;
return;
}
if ( Ammo[0] != None )
Ammo[0].AmmoAmount = 999;
}
simulated function int MaxAmmo(int mode)
{
if( Mode == 1 )
{
return MaxAmmoCount;
}
else
{
return super.MaxAmmo(mode);
}
}
simulated function FillToInitialAmmo()
{
if ( bNoAmmoInstances )
{
if ( AmmoClass[0] != None )
AmmoCharge[0] = Max(AmmoCharge[0], AmmoClass[0].Default.InitialAmount);
HealAmmoCharge = MaxAmmoCount;
return;
}
if ( Ammo[0] != None )
Ammo[0].AmmoAmount = Ammo[0].AmmoAmount;
HealAmmoCharge = MaxAmmoCount;
}
simulated function int AmmoAmount(int mode)
{
if( Mode == 1 )
{
return HealAmmoCharge;
}
else
{
return super.AmmoAmount(mode);
}
}
simulated function bool AmmoMaxed(int mode)
{
if( Mode == 1 )
{
return HealAmmoCharge>=MaxAmmoCount;
}
else
{
return super.AmmoMaxed(mode);
}
}
simulated function float AmmoStatus(optional int Mode) // returns float value for ammo amount
{
if( Mode == 1 )
{
return float(HealAmmoCharge)/float(MaxAmmoCount);
}
else
{
return super.AmmoStatus(Mode);
}
}
simulated function bool ConsumeAmmo(int Mode, float load, optional bool bAmountNeededIsMax)
{
if( Mode == 1 )
{
if( Load>HealAmmoCharge )
{
return false;
}
HealAmmoCharge-=Load;
Return True;
}
else
{
return super.ConsumeAmmo(Mode, load, bAmountNeededIsMax);
}
}
function bool AddAmmo(int AmmoToAdd, int Mode)
{
if( Mode == 1 )
{
if( HealAmmoCharge<MaxAmmoCount )
{
HealAmmoCharge+=AmmoToAdd;
if( HealAmmoCharge>MaxAmmoCount )
{
HealAmmoCharge = MaxAmmoCount;
}
}
return true;
}
else
{
return super.AddAmmo(AmmoToAdd,Mode);
}
}
simulated function bool HasAmmo()
{
if( HealAmmoCharge > 0 )
{
return true;
}
if ( bNoAmmoInstances )
{
return ( (AmmoClass[0] != none && FireMode[0] != none && AmmoCharge[0] >= FireMode[0].AmmoPerFire) );
}
return (Ammo[0] != none && FireMode[0] != none && Ammo[0].AmmoAmount >= FireMode[0].AmmoPerFire);
}
simulated function CheckOutOfAmmo()
{
return;
}
simulated function Tick(float dt)
{
if ( Level.NetMode!=NM_Client && HealAmmoCharge<MaxAmmoCount && RegenTimer<Level.TimeSeconds )
{
RegenTimer = Level.TimeSeconds + AmmoRegenRate;
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
{
HealAmmoCharge += 10 * KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetSyringeChargeRate(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo));
}
else
{
HealAmmoCharge += 10;
}
if ( HealAmmoCharge > MaxAmmoCount )
{
HealAmmoCharge = MaxAmmoCount;
}
}
}
simulated function bool StartFire(int Mode)
{
if( Mode == 1 )
return super.StartFire(Mode);
if( !super.StartFire(Mode) ) // returns false when mag is empty
return false;
if( AmmoAmount(0) <= 0 )
{
return false;
}
AnimStopLooping();
if( !FireMode[Mode].IsInState('FireLoop') && (AmmoAmount(0) > 0) )
{
FireMode[Mode].StartFiring();
return true;
}
else
{
return false;
}
return true;
}
simulated function AnimEnd(int channel)
{
local name anim;
local float frame, rate;
if(!FireMode[0].IsInState('FireLoop'))
{
GetAnimParams(0, anim, frame, rate);
if (ClientState == WS_ReadyToFire)
{
if ((FireMode[0] == None || !FireMode[0].bIsFiring) && (FireMode[1] == None || !FireMode[1].bIsFiring))
{
PlayIdle();
}
}
}
}
simulated event OnZoomOutFinished()
{
local name anim;
local float frame, rate;
GetAnimParams(0, anim, frame, rate);
if (ClientState == WS_ReadyToFire)
{
// Play the regular idle anim when we're finished zooming out
if (anim == IdleAimAnim)
{
PlayIdle();
}
// Switch looping fire anims if we switched to/from zoomed
else if( FireMode[0].IsInState('FireLoop') && anim == 'Fire_Iron_Loop')
{
LoopAnim('Fire_Loop', FireMode[0].FireLoopAnimRate, FireMode[0].TweenTime);
}
}
}
/**
* Called by the native code when the interpolation of the first person weapon to the zoomed position finishes
*/
simulated event OnZoomInFinished()
{
local name anim;
local float frame, rate;
GetAnimParams(0, anim, frame, rate);
if (ClientState == WS_ReadyToFire)
{
// Play the iron idle anim when we're finished zooming in
if (anim == IdleAnim)
{
PlayIdle();
}
// Switch looping fire anims if we switched to/from zoomed
else if( FireMode[0].IsInState('FireLoop') && anim == 'Fire_Loop' )
{
LoopAnim('Fire_Iron_Loop', FireMode[0].FireLoopAnimRate, FireMode[0].TweenTime);
}
}
}
defaultproperties
{
HealAmmoCharge=500
AmmoRegenRate=0.300000
HealBoostAmount=20
SkinRefs(0)="KF_Weapons2_Trip_T.Special.MP_7_cmb"
SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr"
SleeveNum=2
WeaponReloadAnim=Reload_MP7
IdleAimAnim=Idle_Iron
MagCapacity=20
ReloadRate=3.166
ReloadAnim="Reload"
ReloadAnimRate=1.000000
Weight=3.000000
bModeZeroCanDryFire=True
FireModeClass(0)=Class'KFMod.MP7MFire'
FireModeClass(1)=Class'KFMod.MP7MAltFire'
PutDownAnim="PutDown"
SelectSoundRef="KF_MP7Snd.MP7_Select"
SelectForce="SwitchToAssaultRifle"
bShowChargingBar=True
Description="An advanced prototype submachine gun. Modified to fire healing darts."
EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000)
Priority=90
InventoryGroup=3
GroupOffset=5
PickupClass=Class'KFMod.MP7MPickup'
PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000)
BobDamping=6.000000
AttachmentClass=Class'KFMod.MP7MAttachment'
IconCoords=(X1=245,Y1=39,X2=329,Y2=79)
ItemName="MP7M Medic Gun"
MeshRef="KF_Weapons2_Trip.MP7_Trip"
DrawScale=1.00000
TransientSoundVolume=1.250000
AmbientGlow=0
AIRating=0.55
CurrentRating=0.55
DisplayFOV=55.000000
StandardDisplayFOV=55.0//60.0
PlayerIronSightFOV=65
ZoomTime=0.25
FastZoomOutTime=0.2
ZoomInRotation=(Pitch=-910,Yaw=0,Roll=2910)
bHasAimingMode=true
ZoomedDisplayFOV=45
HudImageRef="KillingFloor2HUD.WeaponSelect.MP7m_unselected"
SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MP7m"
TraderInfoTexture=texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MP7m'
SuccessfulHealMessage="You healed "
bIsTier2Weapon=true
}