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

104 lines
2.5 KiB
Ucode

class ScrnFrag extends Frag;
var transient float CookExplodeTimer;
var transient bool bCooking, bThrowingCooked;
var transient bool bBlewInHands; //client didn't throw nade - it blew up in his hands
//var float CookThrowRate; //how faster we throwing a cooked nade comparing with regular throw
replication
{
reliable if(Role < ROLE_Authority)
ServerCookNade;
reliable if(Role == ROLE_Authority)
ClientThrowCooked;
}
//executed on client-side only
simulated function CookNade()
{
if( !Instigator.IsLocallyControlled() )
return;
HandleSleeveSwapping(); // use proper arms
ServerCookNade();
if( Role < ROLE_Authority ) {
CookExplodeTimer = Level.TimeSeconds + class'ScrnBalanceSrv.ScrnNade'.default.ExplodeTimer;
bCooking = true;
bThrowingCooked = false;
}
KFPawn(Instigator).SecondaryItem = self; //it'll be replicated
PlayAnim(TossAnim, 10, 0.0, 0);
FreezeAnimAt(4.8, 0);
}
//server
function ServerCookNade()
{
CookExplodeTimer = Level.TimeSeconds + class'ScrnBalanceSrv.ScrnNade'.default.ExplodeTimer;
bCooking = true;
bThrowingCooked = false;
bBlewInHands = false;
}
function Tick( float DeltaTime )
{
super.Tick(DeltaTime);
//server: tell client to throw nade, when countdown reached
if (bCooking && !bThrowingCooked && Level.TimeSeconds >= CookExplodeTimer) {
bBlewInHands = true;
ClientThrowCooked();
}
}
simulated function ClientThrowCooked()
{
if( !Instigator.IsLocallyControlled() )
return;
bThrowingCooked = true;
StartThrow();
if( Role < ROLE_Authority )
bCooking = false; //set here to immediately hide progress bar from the HUD
}
simulated function StartThrow()
{
if (bCooking && !bThrowingCooked)
return; //can't throw nade while cooking
HandleSleeveSwapping(); // use proper arms
super.StartThrow();
}
function ServerStartThrow()
{
if( !Instigator.IsLocallyControlled() ) {
bThrowingCooked = bCooking;
}
super.ServerStartThrow();
}
function ServerThrow()
{
if ( HasAmmo() ) {
ConsumeAmmo(0, 1);
FireMode[0].DoFireEffect();
PlaySound(ThrowSound,SLOT_Interact,2.0);
}
}
defaultproperties
{
Weight=0.000000
FireModeClass(0)=Class'ScrnBalanceSrv.ScrnFragFire'
PickupClass=Class'ScrnBalanceSrv.ScrnFragPickup'
ItemName="Frag Grenade SE"
bAlwaysRelevant=True
}