class SchlonzGrenade extends Grenade; simulated function PostBeginPlay() { local vector X,Y,Z; Super.PostBeginPlay(); if ( Role == ROLE_Authority ) { GetAxes( Instigator.Rotation,X,Y,Z ); Velocity = X * (Instigator.Velocity Dot X)*0.4 + Vector(Rotation) * (Speed + FRand() * 100); Velocity.z += 210; RandSpin( 50000 ); } } // PostBeginPlay simulated function HitWall( vector HitNormal, actor Wall ) { if( !bTimerSet ) { SetTimer( ExplodeTimer, false ); bTimerSet = true; } bCanHitOwner = True; // Reflect off Wall w/damping Velocity = 0.75*(( Velocity dot HitNormal ) * HitNormal * (-2.0) + Velocity); // Reflect off Wall w/damping RandSpin( 100000 ); Speed = VSize( Velocity ); if( Speed < 20 ) { bBounce = False; SetPhysics( PHYS_None ); if ( Trail != None ) Trail.mRegen = false; // stop the emitter from regenerating } else { if( (Level.NetMode != NM_DedicatedServer) && (Speed > 250) ) PlaySound( ImpactSound, SLOT_Misc ); if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false) ) { Spawn( HitEffectClass,,, Location, Rotator(HitNormal) ); LastSparkTime = Level.TimeSeconds; } } } // HitWall defaultproperties { ExplodeTimer=2.500000 Speed=600.000000 MaxSpeed=1000.000000 Damage=80.000000 MomentumTransfer=50000.000000 }