grenades work on terrain but not landscape

my hand grenades fall through landscape 75% of the time but work fine on terrain.thay are a straight copy of the rocketlaunchers grenade scripts except for the mesh,but the rocketlauncher grenades also pass through landscape.

I see no difference in the collision for landscape and terrain so im a bit stuck.

any ideas?

Never heard of this.As a test,try in kismet with a key/button pressed to spawn a single grenade.(not sure if it will provide any useful info)
How big is the terrain?Did you try to do it with a small basic landscape plane?

add bCollideWorld = true; to the grenade

O_and_N.I will try a small landscape this morning.although I think it happens on all landscapes.for me anyway.

.yeah I tried this already,still happens.even a huge filing cabinet passes through.

Yummy-Vegetables.this is already set.and I have toggled pretty much every setting in the grenades projectile.uc.

thanks for the suggestions.i tried to fix this about 3 years ago when I made the switch from terrain to landscape but it didn’t manage then and went without the grenades till now.thought my better understanding of uscript would make it simple.

Just tested my grenades/mollys on the one piece of Landscape I have and same result as yours . On the flat they bounce along ok but against a hill or incline that resists them they go straight thru. I’ve converted most of my Landscapes to static meshes (bar the one) and nothing goes thru those.

I have considered converting to static mesh or back to terrain but I was hoping to avoid this.

at least I know now its not just my installation.thanks.

I have a grenade launcher that extends from the grenades of the rocket launcher.Will try it, and if successful will post the script here.

Ok.Using landscape definitely gives me similar results.Better go with terrain or convert to statick mesh(here you coud try to bake the landscape texture to the statick mesh in max/maya)or you coud leave the landscape the way it is>export a copy from udk and in max lower the polycount maximum conserving the silhouette>import it in udk and place it over the existing landscape>make it invisible and colide per poly.

the second option sounds like a workable plan.thinking outside the box.wonderfull.

nice.

reduced the exported landscape mesh to 50000 polys from half a million.works a treat.

rebuilding the lighting now so I can fully test.

Glad it worked.Still 50k is still a litle too much.If you want, send me the mesh to see if i can lower it more.

I can lower it more if needed but as it is covers the entire map I was just pleased to get it below the 65k cap and import it as 1 mesh and still retain enough detail.ive rebuilt the lighting and no sign of any performance issues.

its messed with the pathnodes though and rebuilding them has taken half an hour so far and is still not halfway.where as it was 7 mins before.still its a small price to pay to get my grenades back.especially with the new zombie count.:slight_smile:

Thats happens extending from UTgame classes?

I haven’t noticed nothing similar using arrows, but they are extending from actor.

yes,a straight copy of UTProj_Grenade.

the underfloor mesh works but does have a performance cost,quite a high one.i will try to reduce the mesh again but am not hopefull.

I will probably attempt to code my own grenade script.

thanks cobaltUDK.

I have extended from projectile and added the required vars and it is perfect.bouncing correctly and doing the damage.i just need to get the explosion template and sound to fire and I will post the code.



class Proj_handGranade extends Projectile;

var StaticMeshComponent MyMesh;

var float tossz, AccelRate;
var SoundCue	ExplosionSound;
var ParticleSystem ProjFlightTemplate;
var ParticleSystem ProjExplosionTemplate;
var class<UDKExplosionLight> ExplosionLightClass;
var bool bWaitForEffects;
var float MaxExplosionLightDistance;
var class<PointLightComponent> ProjectileLightClass;
var PointLightComponent ProjectileLight;
var float MaxEffectDistance;
var MaterialInterface ExplosionDecal;
var float DecalWidth, DecalHeight;
var float DurationOfDecal;
var name DecalDissolveParamName;
var bool bSuppressSounds;
var bool bSuppressExplosionFX;
var bool bAttachExplosionToVehicles;
var bool bAdvanceExplosionEffect;
var bool EffectIsRelevant;
var float CheckRadius;
var float CustomGravityScaling;
var bool bShuttingDown;
var ParticleSystemComponent	ProjEffects;

/**
 * Set the initial velocity and cook time
 */
simulated function PostBeginPlay()
{
	Super.PostBeginPlay();
	SetTimer(3.5+FRand()*0.5,false);                  //Grenade begins unarmed
	RandSpin(100000);
}

function Init(vector Direction)
{
	SetRotation(Rotator(Direction));

	Velocity = Speed * Direction;
	TossZ = TossZ + (FRand() * TossZ / 2.0) - (TossZ / 4.0);
	Velocity.Z += TossZ;
	Acceleration = AccelRate * Normal(Velocity);
}

/**
 * Explode
 */
simulated function Timer()   
{
	Explode(Location, vect(0,0,1));
}

/**
 * Give a little bounce
 */
simulated event HitWall(vector HitNormal, Actor Wall, PrimitiveComponent WallComp)    
{
	bBlockedByInstigator = true;

	if ( WorldInfo.NetMode != NM_DedicatedServer )
	{
		PlaySound(ImpactSound, true);
	}

	// check to make sure we didn't hit a pawn

	if ( Pawn(Wall) == none )
	{
		Velocity = 0.75*(( Velocity dot HitNormal ) * HitNormal * -2.0 + Velocity);   // Reflect off Wall w/damping
		Speed = VSize(Velocity);

		if (Velocity.Z > 400)
		{
			Velocity.Z = 0.5 * (400 + Velocity.Z);
		}
		// If we hit a pawn or we are moving too slowly, explod

		if ( Speed < 20 || Pawn(Wall) != none )
		{
			ImpactedActor = Wall;
			SetPhysics(PHYS_None);
		}
	}
	else if ( Wall != Instigator ) 	// Hit a different pawn, just explode
	{
		Explode(Location, HitNormal);
	}
}

/**
 * When a grenade enters the water, kill effects/velocity and let it sink
 */
simulated function PhysicsVolumeChange( PhysicsVolume NewVolume )
{
	if ( WaterVolume(NewVolume) != none )
	{
		Velocity *= 0.25;
	}

	Super.PhysicsVolumeChange(NewVolume);
}

simulated function Explode(vector HitLocation, vector HitNormal)
{
	if (Damage>0 && DamageRadius>0)
	{
		if ( Role == ROLE_Authority )
			MakeNoise(1.0);
		if ( !bShuttingDown )
		{
			ProjectileHurtRadius(HitLocation, HitNormal );
		}
	}
	SpawnExplosionEffects(HitLocation, HitNormal);

	ShutDown();
}

simulated function HideProjectile()
{
	local MeshComponent ComponentIt;
	foreach ComponentList(class'MeshComponent',ComponentIt)
	{
		ComponentIt.SetHidden(true);
	}
}



simulated function Shutdown()
{
	local vector HitLocation, HitNormal;

	bShuttingDown=true;
	HitNormal = normal(Velocity * -1);
	Trace(HitLocation,HitNormal,(Location + (HitNormal*-32)), Location + (HitNormal*32),true,vect(0,0,0));

	SetPhysics(PHYS_None);

	if (ProjEffects!=None)
	{
		ProjEffects.DeactivateSystem();
	}

	if (WorldInfo.NetMode != NM_DedicatedServer && !bSuppressExplosionFX)
	{
		SpawnExplosionEffects(Location, HitNormal);
	}

	HideProjectile();
	SetCollision(false,false);

	// If we have to wait for effects, tweak the death conditions

	if (bWaitForEffects)
	{
		if (bNetTemporary)
		{
			if ( WorldInfo.NetMode == NM_DedicatedServer )
			{
				// We are on a dedicated server and not replicating anything nor do we have effects so destroy right away
				Destroy();
			}
			else
			{
				// We can't die right away but make sure we don't replicate to anyone
				RemoteRole = ROLE_None;
				// make sure we leave enough lifetime for the effect to play
				LifeSpan = FMax(LifeSpan, 2.0);
			}
		}
		else
		{
			bTearOff = true;
			if (WorldInfo.NetMode == NM_DedicatedServer)
			{
				LifeSpan = 0.15;
			}
			else
			{
				// make sure we leave enough lifetime for the effect to play
				LifeSpan = FMax(LifeSpan, 2.0);
			}
		}
	}
	else
	{
		Destroy();
	}
}

// If this actor

event TornOff()
{
	ShutDown();
	Super.TornOff();
}



simulated function SpawnExplosionEffects(vector HitLocation, vector HitNormal)
{
	local vector LightLoc, LightHitLocation, LightHitNormal;
	local vector Direction;
	local ParticleSystemComponent ProjExplosion;
	local Actor EffectAttachActor;
	local MaterialInstanceTimeVarying MITV_Decal;

	if (WorldInfo.NetMode != NM_DedicatedServer)
	{
		if (ProjectileLight != None)
		{
			DetachComponent(ProjectileLight);
			ProjectileLight = None;
		}
		if (ProjExplosionTemplate != None )
		{
			EffectAttachActor = (bAttachExplosionToVehicles || (UTVehicle(ImpactedActor) == None)) ? ImpactedActor : None;
			if (!bAdvanceExplosionEffect)
			{
	   			ProjExplosion = WorldInfo.MyEmitterPool.SpawnEmitter(ProjExplosionTemplate, HitLocation, rotator(HitNormal), EffectAttachActor);
	         	}
			else
			{
				Direction = normal(Velocity - 2.0 * HitNormal * (Velocity dot HitNormal)) * Vect(1,1,0);
				ProjExplosion = WorldInfo.MyEmitterPool.SpawnEmitter(ProjExplosionTemplate, HitLocation, rotator(Direction), EffectAttachActor);
				ProjExplosion.SetVectorParameter('Velocity',Direction);
				ProjExplosion.SetVectorParameter('HitNormal',HitNormal);
			}
			SetExplosionEffectParameters(ProjExplosion);

			if ( !WorldInfo.bDropDetail && ((ExplosionLightClass != None) || (ExplosionDecal != none)) && ShouldSpawnExplosionLight(HitLocation, HitNormal) )
			{
				if ( ExplosionLightClass != None )
				{
					if (Trace(LightHitLocation, LightHitNormal, HitLocation + (0.25 * ExplosionLightClass.default.TimeShift[0].Radius * HitNormal), HitLocation, false) == None)
					{
						LightLoc = HitLocation + (0.25 * ExplosionLightClass.default.TimeShift[0].Radius * (vect(1,0,0) >> ProjExplosion.Rotation));
					}
					else
					{
						LightLoc = HitLocation + (0.5 * VSize(HitLocation - LightHitLocation) * (vect(1,0,0) >> ProjExplosion.Rotation));
					}

					UDKEmitterPool(WorldInfo.MyEmitterPool).SpawnExplosionLight(ExplosionLightClass, LightLoc, EffectAttachActor);
				}

				// this code is mostly duplicated in:  UTGib, UTProjectile, UTVehicle, UTWeaponAttachment be aware when updating
				if (ExplosionDecal != None && Pawn(ImpactedActor) == None )
				{
					if( MaterialInstanceTimeVarying(ExplosionDecal) != none )
					{
						// hack, since they don't show up on terrain anyway
						if ( Terrain(ImpactedActor) == None )
						{
						MITV_Decal = new(self) class'MaterialInstanceTimeVarying';
						MITV_Decal.SetParent( ExplosionDecal );

						WorldInfo.MyDecalManager.SpawnDecal(MITV_Decal, HitLocation, rotator(-HitNormal), DecalWidth, DecalHeight, 10.0, FALSE );
						//here we need to see if we are an MITV and then set the burn out times to occur
						MITV_Decal.SetScalarStartTime( DecalDissolveParamName, DurationOfDecal );
					}
					}
					else
					{
						WorldInfo.MyDecalManager.SpawnDecal( ExplosionDecal, HitLocation, rotator(-HitNormal), DecalWidth, DecalHeight, 10.0, true );
					}
				}
			}
		}

		if (ExplosionSound != None && !bSuppressSounds)
		{
			PlaySound(ExplosionSound, true);
		}

		bSuppressExplosionFX = true; // so we don't get called again
	}
}

/** ShouldSpawnExplosionLight()
Decide whether or not to create an explosion light for this explosion
*/
simulated function bool ShouldSpawnExplosionLight(vector HitLocation, vector HitNormal)
{
	local PlayerController P;
	local float Dist;

	// decide whether to spawn explosion light
	ForEach LocalPlayerControllers(class'PlayerController', P)
	{
		Dist = VSize(P.ViewTarget.Location - Location);
		if ( (P.Pawn == Instigator) || (Dist < ExplosionLightClass.Default.Radius) || ((Dist < MaxExplosionLightDistance) && ((vector(P.Rotation) dot (Location - P.ViewTarget.Location)) > 0)) )
		{
			return true;
		}
	}
	return false;
}


simulated function SetExplosionEffectParameters(ParticleSystemComponent ProjExplosion);

























defaultproperties
{
        Begin Object Name=CollisionCylinder
		CollisionRadius=+24//014.000000
		CollisionHeight=+24//014.000000
	End Object
	CylinderComponent=CollisionCylinder
	
	Begin Object Class=StaticMeshComponent Name=ProjectileMesh
		StaticMesh=StaticMesh'goodies.Mesh.hgranadew'
		Scale=1
		CullDistance=12000
		CollideActors=true
		CastShadow=false
		bAcceptsLights=false
		BlockRigidBody=true
		BlockActors=true
		BlockZeroExtent=True
	        BlockNonZeroExtent=True
		bUseAsOccluder=FALSE
		
		RBChannel=RBCC_GameplayPhysics
		RBCollideWithChannels=(Default=TRUE,BlockingVolume=TRUE,GameplayPhysics=TRUE,EffectPhysics=TRUE)
		

	End Object
	Components.Add(ProjectileMesh)
	MyMesh=ProjectileMesh
	


	ProjFlightTemplate=ParticleSystem'goodies.Effects.handgranade'

	ProjExplosionTemplate=ParticleSystem'Envy_Effects.VH_Deaths.P_VH_Death_SpecialCase_1_Base_Near'
	ExplosionLightClass=class'UTGame.UTRocketExplosionLight'

	speed=600
	MaxSpeed=800.0
	Damage=720.0
	DamageRadius=800
	MomentumTransfer=50000
	MyDamageType=class'DmgType_gazGrenade'
	LifeSpan=0.0
	ExplosionSound=SoundCue'A_Weapon_RocketLauncher.Cue.A_Weapon_RL_Impact_Cue'
	ExplosionDecal=MaterialInstanceTimeVarying'WP_RocketLauncher.Decals.MITV_WP_RocketLauncher_Impact_Decal01'
	DecalWidth=128.0
	DecalHeight=128.0
	bCollideWorld=true
	bBounce=true
	TossZ=+50.0
	Physics=PHYS_Falling
	CheckRadius=86.0
	ImpactSound=SoundCue'A_Weapon_RocketLauncher.Cue.A_Weapon_RL_GrenadeFloor_Cue'
	bNetTemporary=False
	bWaitForEffects=false
	CustomGravityScaling=0.5
	bcollidecomplex=false

        AccelRate=1
        MaxExplosionLightDistance=+4000.0
        MaxEffectDistance=+10000.0

	CollisionType=COLLIDE_CustomDefault

}


all working nicely.

Excellent , it works, except SpawnFlightEffects(); needs to go into PostBeginPlay();

Once you have that you don’t need the mesh info. ProjExplosionTemplate=ParticleSystem’yourParticleSystem’ will work.

I’ve been trying to work out where the problem is exactly. I guess it’s the UTProj_Grenade code. I did try the mesh alone (as per your code) not using the emitter because I thought the problem could be the FlightEffects emitter. But as I have the code below using the emitter it collides fine - and my mollys which now extend my grenade work fine too.

(perhaps a couple of reasonable comparison problem examples, or not: maybe the UTProj_Grenade code isn’t at fault… I had a problem with a weapon not picking up ammo -solved after I extended the weapon from the weapon, and the latter extended only had basic defaultproperties and that was about it. But after that it picked up ammo. Another time a weapon wouldn’t reload, and again I extended, and again problem solved. No code changes, nothing, just extended and they worked. Maybe the UT nade doesn’t like being extended from?? When I have some patience I’ll take a look at the nade code.)

Anyway, this works:



class GrenadeKFZproj extends Projectile;

//problem, extended from UTProj_Grenade but they don't collide with Landscape hills
//https: forums.unrealengine.com/showthread.php?124817-grenades-work-on-terrain-but-not-landscape
//solved, but otherwise die landscape die

var float BounceDamping;
var float TossZ;
var float AccelRate;
var float MaxExplosionLightDistance;
var float CustomGravityScaling;
var float CheckRadius;
var float DecalWidth, DecalHeight;
var float DurationOfDecal;

var ParticleSystem ProjFlightTemplate;
var ParticleSystem ProjExplosionTemplate;
var ParticleSystemComponent ProjEffects;
var class<UDKExplosionLight> ExplosionLightClass;
var class<PointLightComponent> ProjectileLightClass;
var SoundCue ExplosionSound;
var PointLightComponent ProjectileLight;
var MaterialInterface ExplosionDecal;
var name DecalDissolveParamName;

var bool bWaitForEffects;
var bool bShuttingDown;
var bool bAdvanceExplosionEffect;
var bool bSuppressExplosionFX;

function LowerTheMFGun()
{
	local WeaponKFZ KFZWeap;

	KFZWeap = WeaponKFZ(Owner);
	if (KFZWeap != None)
	{
		KFZWeap.WeaponAside4Grenade();
	}
}

function RaiseTheMFGun()
{
	local WeaponKFZ KFZWeap;

	KFZWeap = WeaponKFZ(Owner);
	if (KFZWeap != None)
	{
		KFZWeap.WeaponAside4Grenade();
		KFZPawn(Instigator).MakeNoise(21.0, 'GunFire');
	}
}

simulated function PostBeginPlay()
{
	super.PostBeginPlay();
	SpawnFlightEffects();
	SetTimer(2.5+FRand()*0.5,false);
	RandSpin(100000);
}

function Init(vector Direction)
{
     SetRotation(Rotator(Direction));
     Velocity = Speed * Direction;
//    TossZ = TossZ + (FRand() * TossZ / 4.0) - (TossZ / 5.0);
     Velocity.Z += TossZ;
     Acceleration = AccelRate * Normal(Velocity);
}

simulated function Timer()
{
	Explode(Location, vect(0,0,1));
}

simulated event HitWall(vector HitNormal, Actor Wall, PrimitiveComponent WallComp)
{
 	bBlockedByInstigator = true;

	if ( WorldInfo.NetMode != NM_DedicatedServer )
		{
	PlaySound(ImpactSound, true);
		}

     // check to make sure we didn't hit a pawn
	if ( Pawn(Wall) == none )
		{
		Velocity = 0.75*(( Velocity dot HitNormal ) * HitNormal * -2.0 + Velocity);
		Speed = VSize(Velocity);  

	if (Velocity.Z > 400)  
		{
		Velocity.Z = 0.5 * (400 + Velocity.Z);
		}
// If we hit a pawn or we are moving too slowly, explod

	if ( Speed < 20 || Pawn(Wall) != none )
		{
		ImpactedActor = Wall;
		SetPhysics(PHYS_None);
		}
	}
	else if ( Wall != Instigator )     // Hit a different pawn, just explode
	{
	Explode(Location, HitNormal);
	}
}

simulated event Landed(Vector HitNormal, Actor FloorActor)
{
    HitWall(HitNormal, FloorActor, None);
}

simulated function PhysicsVolumeChange( PhysicsVolume NewVolume )
{
     if ( WaterVolume(NewVolume) != none )
     {
          Velocity *= 0.25;
     }
     Super.PhysicsVolumeChange(NewVolume);
}

simulated function SpawnFlightEffects()
{
	if (WorldInfo.NetMode != NM_DedicatedServer && ProjFlightTemplate != None)
	{
		ProjEffects = WorldInfo.MyEmitterPool.SpawnEmitterCustomLifetime(ProjFlightTemplate);
		ProjEffects.SetAbsolute(false, false, false);
		ProjEffects.SetLODLevel(WorldInfo.bDropDetail ? 1 : 0);
		ProjEffects.OnSystemFinished = MyOnParticleSystemFinished;
		ProjEffects.bUpdateComponentInTick = true;
		AttachComponent(ProjEffects);
	}
}

simulated function MyOnParticleSystemFinished(ParticleSystemComponent PSC)
{
	if (PSC == ProjEffects)
	{
		if (bWaitForEffects)
		{
			if (bShuttingDown)
			{
				// it is not safe to destroy the actor here because other threads are doing stuff, so do it next tick
				LifeSpan = 0.01;
			}
			else
			{
				bWaitForEffects = false;
			}
		}
		// clear component and return to pool
		DetachComponent(ProjEffects);
		WorldInfo.MyEmitterPool.OnParticleSystemFinished(ProjEffects);
		ProjEffects = None;
	}
}

simulated function SpawnExplosionEffects(vector HitLocation, vector HitNormal)
{
	local vector LightLoc, LightHitLocation, LightHitNormal;
	local vector Direction;
	local ParticleSystemComponent ProjExplosion;
	local Actor EffectAttachActor;
	local MaterialInstanceTimeVarying MITV_Decal;

	if (WorldInfo.NetMode != NM_DedicatedServer)
	{
		if (ProjectileLight != None)
		{
			DetachComponent(ProjectileLight);
			ProjectileLight = None;
		}
		if (ProjExplosionTemplate != None)
		{
			// Disabling for the demo to prevent explosions from attaching to the pawn...
//			EffectAttachActor = (bAttachExplosionToVehicles || (UTVehicle(ImpactedActor) == None)) ? ImpactedActor : None;
			EffectAttachActor = None;
			if (!bAdvanceExplosionEffect)
			{
				ProjExplosion = WorldInfo.MyEmitterPool.SpawnEmitter(ProjExplosionTemplate, HitLocation, rotator(HitNormal), EffectAttachActor);
			}
			else
			{
				Direction = normal(Velocity - 2.0 * HitNormal * (Velocity dot HitNormal)) * Vect(1,1,0);
				ProjExplosion = WorldInfo.MyEmitterPool.SpawnEmitter(ProjExplosionTemplate, HitLocation, rotator(Direction), EffectAttachActor);
				ProjExplosion.SetVectorParameter('Velocity',Direction);
				ProjExplosion.SetVectorParameter('HitNormal',HitNormal);
			}
			SetExplosionEffectParameters(ProjExplosion);

			if ( !WorldInfo.bDropDetail && ((ExplosionLightClass != None) || (ExplosionDecal != none)) && ShouldSpawnExplosionLight(HitLocation, HitNormal) )
			{
				if ( ExplosionLightClass != None )
				{
					if (Trace(LightHitLocation, LightHitNormal, HitLocation + (0.25 * ExplosionLightClass.default.TimeShift[0].Radius * HitNormal), HitLocation, false) == None)
					{
						LightLoc = HitLocation + (0.25 * ExplosionLightClass.default.TimeShift[0].Radius * (vect(1,0,0) >> ProjExplosion.Rotation));
					}
					else
					{
						LightLoc = HitLocation + (0.5 * VSize(HitLocation - LightHitLocation) * (vect(1,0,0) >> ProjExplosion.Rotation));
					}

					UDKEmitterPool(WorldInfo.MyEmitterPool).SpawnExplosionLight(ExplosionLightClass, LightLoc, EffectAttachActor);
				}

				// this code is mostly duplicated in:  UTGib, UTProjectile, UTVehicle, UTWeaponAttachment be aware when updating
				if (ExplosionDecal != None && Pawn(ImpactedActor) == None )
				{
					if( MaterialInstanceTimeVarying(ExplosionDecal) != none )
					{
						// hack, since they don't show up on terrain anyway
						if ( Terrain(ImpactedActor) == None )
						{
						MITV_Decal = new(self) class'MaterialInstanceTimeVarying';
						MITV_Decal.SetParent( ExplosionDecal );

						WorldInfo.MyDecalManager.SpawnDecal(MITV_Decal, HitLocation, rotator(-HitNormal), DecalWidth, DecalHeight, 10.0, FALSE );
						//here we need to see if we are an MITV and then set the burn out times to occur
						MITV_Decal.SetScalarStartTime( DecalDissolveParamName, DurationOfDecal );
					}
					}
					else
					{
						WorldInfo.MyDecalManager.SpawnDecal( ExplosionDecal, HitLocation, rotator(-HitNormal), DecalWidth, DecalHeight, 10.0, true );
					}
				}
			}
		}

		if (ExplosionSound != None)
		{
			PlaySound(ExplosionSound, true);
		}

		bSuppressExplosionFX = true; // so we don't get called again
	}
}

simulated function bool ShouldSpawnExplosionLight(vector HitLocation, vector HitNormal)
{
	local PlayerController P;
	local float Dist;

	// decide whether to spawn explosion light
	ForEach LocalPlayerControllers(class'PlayerController', P)
	{
		Dist = VSize(P.ViewTarget.Location - Location);
		if ( (P.Pawn == Instigator) || (Dist < ExplosionLightClass.Default.Radius) || ((Dist < MaxExplosionLightDistance) && ((vector(P.Rotation) dot (Location - P.ViewTarget.Location)) > 0)) )
		{
			return true;
		}
	}
	return false;
}

simulated function Explode(vector HitLocation, vector HitNormal)
{
	if (Damage>0 && DamageRadius>0)
	{
		if ( Role == ROLE_Authority )
			MakeNoise(1.0);
		if ( !bShuttingDown )
		{
			ProjectileHurtRadius(HitLocation, HitNormal );
		}
	}
	SpawnExplosionEffects(HitLocation, HitNormal);

	ShutDown();
}

simulated function SetExplosionEffectParameters(ParticleSystemComponent ProjExplosion);

defaultproperties
{

ProjFlightTemplate=ParticleSystem'KFTex6_effects.mesheffectstuff.GrenadeDM51'
//ProjExplosionTemplate=ParticleSystem'KFTex6_effects.muzzleflashes.UDKsBeautifulGeneralExplosion_mod'
ProjExplosionTemplate=ParticleSystem'KFTex6_effects.muzzleflashes.GrenExplosion'
ExplosionLightClass=class'KFZ.GrenadeLight'
ImpactSound=SoundCue'KFTex4.TheCues.GrenadeRoll'//SoundCue'A_Weapon_RocketLauncher.Cue.A_Weapon_RL_GrenadeFloor_Cue'
ExplosionSound=SoundCue'A_Weapon_RocketLauncher.Cue.A_Weapon_RL_Impact_Cue'
ExplosionDecal=MaterialInstanceTimeVarying'WP_RocketLauncher.Decals.MITV_WP_RocketLauncher_Impact_Decal01'

       Begin Object Name=CollisionCylinder
		CollisionRadius=+24//014.000000
		CollisionHeight=+24//014.000000
	End Object
	CylinderComponent=CollisionCylinder
	
	MaxExplosionLightDistance=+4000.0
	speed=1000
	MaxSpeed=1200.0
	Damage=280.0
	DamageRadius=200
	MomentumTransfer=80000
	MyDamageType=class'KFZ.DamageRocket'
	LifeSpan=0.0

     DecalWidth=512.0
     DecalHeight=512.0
     bCollideWorld=true
     bBounce=true
     TossZ=+245.0
     Physics=PHYS_Falling
     CheckRadius=36.0

     bNetTemporary=False
     bWaitForEffects=false
     CustomGravityScaling=1. //0.500
}


thanks,i used the static mesh as I didn’t see the need for the particle system on a grenade.and maybe a little easier on performance.every little counts.i forgot to remove the emitter.