200 lines
5.0 KiB
Ucode
200 lines
5.0 KiB
Ucode
//=============================================================================
|
|
// Frag Grenade Inventory class
|
|
//=============================================================================
|
|
class Frag extends KFWeapon;
|
|
|
|
var() name TossAnim;
|
|
var() float TossTime;
|
|
var() float TossSpawnTime;
|
|
|
|
var bool bTossActive;
|
|
var bool bTossSpawned;
|
|
|
|
var(Sounds) sound ThrowSound;
|
|
var float NadeThrowTimeout; // Fallback countdown so that player couldn't get stuck unable to fire regardless of if the server drops some packets
|
|
var float NadeThrowTime; // Last time a nade was thrown
|
|
|
|
replication
|
|
{
|
|
reliable if(Role < ROLE_Authority)
|
|
ServerThrow, ServerStartThrow;
|
|
}
|
|
|
|
simulated event StartThrow()
|
|
{
|
|
if( Role < ROLE_Authority )
|
|
{
|
|
if(TossTime>TossSpawnTime)
|
|
{
|
|
KFPawn(Instigator).SetNadeTimeOut(TossSpawnTime + (TossTime-TossSpawnTime));
|
|
}
|
|
else
|
|
{
|
|
KFPawn(Instigator).SetNadeTimeOut(TossSpawnTime);
|
|
}
|
|
}
|
|
|
|
ServerStartThrow();
|
|
PlayAnim(TossAnim, 1.0, 0.0); // FireAnimRate, TweenTime);
|
|
PlaySound(FireMode[0].FireSound,SLOT_Interact,2.0);
|
|
bTossActive = true;
|
|
bTossSpawned = false;
|
|
SetTimer(TossSpawnTime, false);
|
|
}
|
|
|
|
simulated function Timer()
|
|
{
|
|
if(bTossActive)
|
|
{
|
|
if(!bTossSpawned)
|
|
{
|
|
ServerThrow();
|
|
bTossSpawned=true;
|
|
if(TossTime>TossSpawnTime)
|
|
SetTimer(TossTime-TossSpawnTime, false);
|
|
else Timer();
|
|
}
|
|
else
|
|
{
|
|
bTossActive = false;
|
|
KFPawn(Instigator).ThrowGrenadeFinished();
|
|
}
|
|
}
|
|
else super.Timer();
|
|
}
|
|
|
|
function ServerThrow()
|
|
{
|
|
ConsumeAmmo(0, 1);
|
|
FireMode[0].DoFireEffect();
|
|
PlaySound(ThrowSound,SLOT_Interact,2.0);
|
|
}
|
|
|
|
function ServerStartThrow()
|
|
{
|
|
if( Role == ROLE_Authority && !Instigator.IsLocallyControlled() )
|
|
{
|
|
bTossActive = true;
|
|
}
|
|
|
|
NadeThrowTime = Level.TimeSeconds;
|
|
|
|
// Set the timeout to the same length as the timer run throughs on the client
|
|
if(TossTime>TossSpawnTime)
|
|
{
|
|
NadeThrowTimeout = TossSpawnTime + (TossTime-TossSpawnTime);
|
|
}
|
|
else
|
|
{
|
|
NadeThrowTimeout = TossSpawnTime;
|
|
}
|
|
|
|
if( KFPawn(Instigator) != none )
|
|
{
|
|
KFPawn(Instigator).HandleNadeThrowAnim();
|
|
}
|
|
}
|
|
|
|
// Have to use Tick here because we need this to run on the server
|
|
function Tick( float DeltaTime )
|
|
{
|
|
super.Tick(DeltaTime);
|
|
|
|
if( bTossActive && Role == ROLE_Authority && !Instigator.IsLocallyControlled())
|
|
{
|
|
// if its been too long since a nade was thrown, just timeout and
|
|
// clear this flag on the pawn. Need this since most of the nade
|
|
// throwing code doesn't run on the server!!! - Ramm
|
|
if( (Level.TimeSeconds - NadeThrowTime) > NadeThrowTimeout )
|
|
{
|
|
KFPawn(Instigator).bThrowingNade = false;
|
|
bTossActive = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
function float GetAIRating()
|
|
{
|
|
local Bot B;
|
|
|
|
|
|
B = Bot(Instigator.Controller);
|
|
if ( (B == None) || (B.Enemy == None) )
|
|
return AIRating;
|
|
|
|
return (AIRating + 0.0003 * FClamp(1500 - VSize(B.Enemy.Location - Instigator.Location),0,1000));
|
|
}
|
|
|
|
function byte BestMode()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// don't select this weapon, it's not used that way any more
|
|
simulated function float RateSelf()
|
|
{
|
|
return -100;
|
|
}
|
|
|
|
// Never select this directly
|
|
simulated function Weapon PrevWeapon(Weapon CurrentChoice, Weapon CurrentWeapon)
|
|
{
|
|
if ( Inventory == None )
|
|
return CurrentChoice;
|
|
else
|
|
return Inventory.PrevWeapon(CurrentChoice,CurrentWeapon);
|
|
}
|
|
simulated function Weapon NextWeapon(Weapon CurrentChoice, Weapon CurrentWeapon)
|
|
{
|
|
if ( Inventory == None )
|
|
return CurrentChoice;
|
|
else
|
|
return Inventory.NextWeapon(CurrentChoice,CurrentWeapon);
|
|
}
|
|
simulated function Weapon WeaponChange( byte F, bool bSilent )
|
|
{
|
|
if ( Inventory == None )
|
|
return None;
|
|
else return Inventory.WeaponChange(F,bSilent);
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
skins(0)=Shader'KillingFloorWeapons.Frag_Grenade.FragShader'
|
|
|
|
TossAnim="Toss"
|
|
TossTime=.366//1.000000
|
|
TossSpawnTime=0.2//0.800000
|
|
MagCapacity=1
|
|
ReloadRate=1.000000
|
|
ReloadAnim="Reload"
|
|
ReloadAnimRate=1.000000
|
|
Weight=1.000000
|
|
bKFNeverThrow=True
|
|
FireModeClass(0)=Class'KFMod.FragFire'
|
|
FireModeClass(1)=Class'KFMod.NoFire'
|
|
PutDownAnim="PutDown"
|
|
Description="the frag grenade releases a dense cloud of shrapnel in a large area of effect around its detonation zone. Use with caution. "
|
|
|
|
Priority=40
|
|
InventoryGroup=0
|
|
PickupClass=Class'KFMod.FragPickup'
|
|
BobDamping=10.000000
|
|
AttachmentClass=Class'KFMod.FragAttachment'
|
|
IconCoords=(X1=458,Y1=82,X2=491,Y2=133)
|
|
ItemName="Frag Grenade"
|
|
Mesh=SkeletalMesh'KF_Weapons_Trip.Frag_Trip'
|
|
TransientSoundVolume=1.000000
|
|
TransientSoundRadius=700.000000
|
|
AmbientGlow=2
|
|
|
|
DisplayFOV=70.000000
|
|
StandardDisplayFOV=70.0
|
|
|
|
ThrowSound=sound'KF_GrenadeSnd.Nade_Throw'
|
|
|
|
AIRating=-5
|
|
CurrentRating=-5
|
|
TraderInfoTexture=texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Grenade'
|
|
}
|