155 lines
3.8 KiB
Ucode
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
|
|
}
|