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

104 lines
3.4 KiB
Ucode

//=============================================================================
// Stun Nade
//=============================================================================
class StunProj extends Grenade;
var() vector RotMag; // how far to rot view
var() vector RotRate; // how fast to rot view
var() float RotTime; // how much time to rot the instigator's view
var() vector OffsetMag; // max view offset vertically
var() vector OffsetRate; // how fast to offset view vertically
var() float OffsetTime; // how much time to offset view
#exec OBJ LOAD FILE=PatchSounds.uax
simulated function Explode(vector HitLocation, vector HitNormal)
{
local Controller C;
local PlayerController LocalPlayer;
BlowUp(HitLocation);
PlaySound(sound'PatchSounds.StunNadeBoomSound',,100.5*TransientSoundVolume);
if ( EffectIsRelevant(Location,false) )
{
Spawn(class'KFmod.KFMiniExplosion',,, HitLocation, rotator(vect(0,0,1)));
Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal));
}
Destroy();
// Shake nearby players screens
LocalPlayer = Level.GetLocalPlayerController();
if ( (LocalPlayer != None) && (VSize(Location - LocalPlayer.ViewTarget.Location) < DamageRadius) )
LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime);
for ( C=Level.ControllerList; C!=None; C=C.NextController )
if ( (PlayerController(C) != None) && (C != LocalPlayer)
&& (VSize(Location - PlayerController(C).ViewTarget.Location) < DamageRadius) )
C.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime);
}
simulated function Destroyed()
{
if ( Trail == None )
Trail.mRegen = false; // stop the emitter from regenerating
Super.Destroyed();
}
simulated function PostBeginPlay()
{
local PlayerController PC;
Super.PostBeginPlay();
if ( Level.NetMode != NM_DedicatedServer)
{
PC = Level.GetLocalPlayerController();
if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 5500 )
}
if ( Role == ROLE_Authority )
{
Velocity = Speed * Vector(Rotation);
RandSpin(25000);
bCanHitOwner = false;
if (Instigator.HeadVolume.bWaterVolume)
{
bHitWater = true;
Velocity = 0.6*Velocity;
}
}
}
simulated function ProcessTouch( actor Other, vector HitLocation )
{
// if ( !Other.bWorldGeometry && (Other != Instigator || bCanHitOwner) )
//{
// Explode(HitLocation, Normal(HitLocation-Other.Location));
// }
}
defaultproperties
{
RotMag=(X=100.000000,Y=100.000000,Z=100.000000)
RotRate=(X=500.000000,Y=500.000000,Z=500.000000)
RotTime=3.000000
OffsetMag=(X=40.000000,Y=40.000000,Z=40.000000)
OffsetRate=(X=500.000000,Y=500.000000,Z=500.000000)
OffsetTime=3.000000
DampenFactor=0.250000
DampenFactorParallel=0.400000
HitEffectClass=None
Speed=160.000000
MaxSpeed=350.000000
Damage=25.000000
DamageRadius=350.000000
MomentumTransfer=25000.000000
MyDamageType=Class'KFMod.DamTypeStunNade'
StaticMesh=StaticMesh'PatchStatics.StunProjectile'
DrawScale=0.400000
AmbientGlow=0
bUnlit=False
}