95 lines
2.8 KiB
Ucode
95 lines
2.8 KiB
Ucode
|
// Written by Marco.
|
||
|
class ExtProj_CrackerGrenade extends KFProj_FragGrenade
|
||
|
hidedropdown;
|
||
|
|
||
|
var() byte NumCrackers;
|
||
|
|
||
|
simulated function PostBeginPlay()
|
||
|
{
|
||
|
Super.PostBeginPlay();
|
||
|
SetTimer(FuseTime+FRand()*0.25, true, 'ExplodeTimer');
|
||
|
}
|
||
|
simulated function ExplodeTimer()
|
||
|
{
|
||
|
local Actor HitActor;
|
||
|
local vector HitLocation, HitNormal;
|
||
|
|
||
|
if( WorldInfo.NetMode!=NM_Client && InstigatorController==none )
|
||
|
{
|
||
|
Destroy();
|
||
|
return;
|
||
|
}
|
||
|
GetExplodeEffectLocation(HitLocation, HitNormal, HitActor);
|
||
|
if( --NumCrackers==0 )
|
||
|
TriggerExplosion(HitLocation, HitNormal, HitActor);
|
||
|
else SmallExplosion(HitLocation, HitNormal, HitActor);
|
||
|
}
|
||
|
simulated function SmallExplosion(Vector HitLocation, Vector HitNormal, Actor HitActor)
|
||
|
{
|
||
|
local vector NudgedHitLocation, ExplosionDirection;
|
||
|
|
||
|
Velocity = VRand()*(900.f*FRand());
|
||
|
SetPhysics(PHYS_Falling);
|
||
|
if (ExplosionTemplate != None)
|
||
|
{
|
||
|
// using a hitlocation slightly away from the impact point is nice for certain things
|
||
|
NudgedHitLocation = HitLocation + (HitNormal * 32.f);
|
||
|
|
||
|
ExplosionActor = Spawn(ExplosionActorClass, self,, NudgedHitLocation, rotator(HitNormal));
|
||
|
if (ExplosionActor != None)
|
||
|
{
|
||
|
ExplosionActor.RemoteRole = ROLE_None;
|
||
|
ExplosionActor.Instigator = Instigator;
|
||
|
ExplosionActor.InstigatorController = InstigatorController;
|
||
|
|
||
|
PrepareExplosionTemplate();
|
||
|
|
||
|
// If the locations are zero (probably because this exploded in the air) set defaults
|
||
|
if( IsZero(HitLocation) )
|
||
|
HitLocation = Location;
|
||
|
|
||
|
if( IsZero(HitNormal) )
|
||
|
{
|
||
|
HitNormal = vect(0,0,1);
|
||
|
}
|
||
|
|
||
|
// these are needed for the decal tracing later in GameExplosionActor.Explode()
|
||
|
ExplosionTemplate.HitActor = HitActor;
|
||
|
ExplosionTemplate.HitLocation = HitLocation;// NudgedHitLocation
|
||
|
ExplosionTemplate.HitNormal = HitNormal;
|
||
|
|
||
|
// If desired, attach to mover if we hit one
|
||
|
if(bAttachExplosionToHitMover && InterpActor(HitActor) != None)
|
||
|
{
|
||
|
ExplosionActor.Attachee = HitActor;
|
||
|
ExplosionTemplate.bAttachExplosionEmitterToAttachee = TRUE;
|
||
|
ExplosionActor.SetBase(HitActor);
|
||
|
}
|
||
|
|
||
|
// directional?
|
||
|
if (ExplosionTemplate.bDirectionalExplosion)
|
||
|
{
|
||
|
ExplosionDirection = GetExplosionDirection(HitNormal);
|
||
|
//DrawDebugLine(ExplosionActor.Location, ExplosionActor.Location+ExplosionDirection*64, 255, 255, 0, TRUE);
|
||
|
}
|
||
|
|
||
|
// @todo: make this function responsible for setting explosion instance parameters, and take instance parameters
|
||
|
// out of GearExplosion (e.g. Attachee)
|
||
|
PrepareExplosionActor(ExplosionActor);
|
||
|
|
||
|
ExplosionActor.Explode(ExplosionTemplate, ExplosionDirection); // go bewm
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
|
||
|
{
|
||
|
}
|
||
|
simulated function Explode(vector HitLocation, vector HitNormal);
|
||
|
|
||
|
defaultproperties
|
||
|
{
|
||
|
bCanDisintegrate=false
|
||
|
FuseTime=0.35
|
||
|
NumCrackers=6
|
||
|
bNetTemporary=true
|
||
|
}
|