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

155 lines
3.8 KiB
Ucode

//=============================================================================
// Pipe Bomb Fire
//=============================================================================
class PipeBombFire extends KFShotgunFire;
#exec OBJ LOAD FILE=KF_AxeSnd.uax
var() float ProjectileSpawnDelay;
function InitEffects()
{
}
/* Convenient place to perform changes to a newly spawned projectile */
function PostSpawnProjectile(Projectile P)
{
Super.PostSpawnProjectile(P);
if( PipeBombProjectile(p) != none && Instigator != none )
{
PipeBombProjectile(p).PlacedTeam = Instigator.PlayerReplicationInfo.Team.TeamIndex;
}
}
function Timer()
{
Weapon.ConsumeAmmo(ThisModeNum, Load);
DoFireEffect();
Weapon.PlaySound(Sound'KF_AxeSnd.Axe_Fire',SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,,false);
if( Weapon.ammoAmount(0) <= 0 && Instigator != none && Instigator.Controller != none )
{
Weapon.Destroy();
Instigator.Controller.ClientSwitchToBestWeapon();
}
}
event ModeDoFire()
{
if (!AllowFire())
return;
if (MaxHoldTime > 0.0)
HoldTime = FMin(HoldTime, MaxHoldTime);
// server
if (Weapon.Role == ROLE_Authority)
{
// Consume ammo, etc later
SetTimer(ProjectileSpawnDelay, False);
HoldTime = 0; // if bot decides to stop firing, HoldTime must be reset first
if ( (Instigator == None) || (Instigator.Controller == None) )
return;
if ( AIController(Instigator.Controller) != None )
AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true);
Instigator.DeactivateSpawnProtection();
}
// client
if (Instigator.IsLocallyControlled())
{
//ShakeView();
PlayFiring();
FlashMuzzleFlash();
StartMuzzleSmoke();
}
else // server
{
ServerPlayFiring();
}
Weapon.IncrementFlashCount(ThisModeNum);
// set the next firing time. must be careful here so client and server do not get out of sync
if (bFireOnRelease)
{
if (bIsFiring)
NextFireTime += MaxHoldTime + FireRate;
else
NextFireTime = Level.TimeSeconds + FireRate;
}
else
{
NextFireTime += FireRate;
NextFireTime = FMax(NextFireTime, Level.TimeSeconds);
}
Load = AmmoPerFire;
HoldTime = 0;
if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None)
{
bIsFiring = false;
Weapon.PutDown();
}
}
function PlayFireEnd(){}
simulated function bool AllowFire()
{
if(KFWeapon(Weapon).bIsReloading)
return false;
if(KFPawn(Instigator).SecondaryItem!=none)
return false;
if(KFPawn(Instigator).bThrowingNade)
return false;
if(KFWeapon(Weapon).MagAmmoRemaining < 1)
{
if( Level.TimeSeconds - LastClickTime>FireRate )
{
LastClickTime = Level.TimeSeconds;
}
if( AIController(Instigator.Controller)!=None )
KFWeapon(Weapon).ReloadMeNow();
return false;
}
return super(WeaponFire).AllowFire();
}
defaultproperties
{
ProjectileSpawnDelay=1.1
ProjSpawnOffset=(X=10,Y=0,Z=-10)
KickMomentum=(X=0.000000,Z=0.000000)
ProjPerFire=1
bAttachSmokeEmitter=false
TransientSoundVolume=2.0
TransientSoundRadius=500.000000
FireSound=none//Sound'KF_AxeSnd.Axe_Fire'
NoAmmoSound=none
FireRate=1.75//1.27
FireAnimRate=1.0
AmmoClass=Class'KFMod.PipeBombAmmo'
ProjectileClass=Class'KFMod.PipeBombProjectile'
BotRefireRate=0.250000
FlashEmitterClass=none
aimerror=1.000000
Spread=15.0
maxVerticalRecoilAngle=0//1000
maxHorizontalRecoilAngle=0//500
FireAnim=Toss
bWaitForRelease=true
bRandomPitchFireSound=false
}