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

124 lines
4.3 KiB
Ucode

class ScrnNailGun extends NailGun;
var transient ScrnAchievements.AchStrInfo ach_Nail100m, ach_NailToWall, ach_PushShiver, ach_ProNailer; //related achievements
replication
{
reliable if(Role < ROLE_Authority)
ServerChangeFireModeEx;
}
simulated function PostBeginPlay()
{
local SRStatsBase Stats;
super.PostBeginPlay();
// cache achievements here, so each projectile won't be supposed to search to them in the list
if ( Role == ROLE_Authority && Instigator != none && ScrnPlayerController(Instigator.Controller) != none ) {
Stats = SRStatsBase(ScrnPlayerController(Instigator.Controller).SteamStatsAndAchievements);
if ( Stats != none ) {
ach_Nail100m = class'ScrnBalanceSrv.ScrnAchievements'.static.GetAchievementByID(Stats.Rep, 'NailPush100m', true);
ach_NailToWall = class'ScrnBalanceSrv.ScrnAchievements'.static.GetAchievementByID(Stats.Rep, 'Nail250Zeds', true);
ach_PushShiver = class'ScrnBalanceSrv.ScrnAchievements'.static.GetAchievementByID(Stats.Rep, 'NailPushShiver', true);
ach_ProNailer = class'ScrnBalanceSrv.ScrnAchievements'.static.GetAchievementByID(Stats.Rep, 'ProNailer', true);
}
}
}
// Use alt fire to switch fire modes
simulated function AltFire(float F)
{
if(ReadyToFire(0))
{
DoToggle();
}
}
// Toggle semi/auto fire
simulated function DoToggle ()
{
local PlayerController Player;
Player = Level.GetLocalPlayerController();
if ( Player != none ) {
FireMode[0].AmmoPerFire = FireMode[0].default.AmmoPerFire - FireMode[0].AmmoPerFire + 1;
if ( FireMode[0].AmmoPerFire == 1 )
Player.ReceiveLocalizedMessage(class'ScrnBalanceSrv.ScrnFireModeSwitchMessage',4);
else
Player.ReceiveLocalizedMessage(class'ScrnBalanceSrv.ScrnFireModeSwitchMessage',5);
ServerChangeFireModeEx(FireMode[0].AmmoPerFire);
}
}
// Set the new fire mode on the server
function ServerChangeFireModeEx(byte NewAmmoPerFire)
{
FireMode[0].AmmoPerFire = NewAmmoPerFire;
}
exec function SwitchModes()
{
DoToggle();
}
simulated function bool ConsumeAmmo( int Mode, float Load, optional bool bAmountNeededIsMax )
{
local Inventory Inv;
local bool bOutOfAmmo;
local KFWeapon KFWeap;
if ( Super(Weapon).ConsumeAmmo(Mode, Load, bAmountNeededIsMax) )
{
if ( Load > 0 && (Mode == 0 || bReduceMagAmmoOnSecondaryFire) ) {
MagAmmoRemaining -= Load; // Changed from "MagAmmoRemaining--" -- PooSH
if ( MagAmmoRemaining < 0 )
MagAmmoRemaining = 0;
}
NetUpdateTime = Level.TimeSeconds - 1;
if ( FireMode[Mode].AmmoPerFire > 0 && InventoryGroup > 0 && !bMeleeWeapon && bConsumesPhysicalAmmo &&
(Ammo[0] == none || FireMode[0] == none || FireMode[0].AmmoPerFire <= 0 || Ammo[0].AmmoAmount < FireMode[0].AmmoPerFire) &&
(Ammo[1] == none || FireMode[1] == none || FireMode[1].AmmoPerFire <= 0 || Ammo[1].AmmoAmount < FireMode[1].AmmoPerFire) )
{
bOutOfAmmo = true;
for ( Inv = Instigator.Inventory; Inv != none; Inv = Inv.Inventory )
{
KFWeap = KFWeapon(Inv);
if ( Inv.InventoryGroup > 0 && KFWeap != none && !KFWeap.bMeleeWeapon && KFWeap.bConsumesPhysicalAmmo &&
((KFWeap.Ammo[0] != none && KFWeap.FireMode[0] != none && KFWeap.FireMode[0].AmmoPerFire > 0 &&KFWeap.Ammo[0].AmmoAmount >= KFWeap.FireMode[0].AmmoPerFire) ||
(KFWeap.Ammo[1] != none && KFWeap.FireMode[1] != none && KFWeap.FireMode[1].AmmoPerFire > 0 && KFWeap.Ammo[1].AmmoAmount >= KFWeap.FireMode[1].AmmoPerFire)) )
{
bOutOfAmmo = false;
break;
}
}
if ( bOutOfAmmo )
{
PlayerController(Instigator.Controller).Speech('AUTO', 3, "");
}
}
return true;
}
return false;
}
defaultproperties
{
MagCapacity=42
Weight=6.000000
bTorchEnabled=False
FireModeClass(0)=Class'ScrnBalanceSrv.ScrnNailGunFire'
FireModeClass(1)=Class'KFMod.NoFire'
PickupClass=Class'ScrnBalanceSrv.ScrnNailGunPickup'
ItemName="Nailgun SE"
}