Legacy:EONSGrenadeLauncher
Status: Finished. Feel free to use code derived from this weapon, but please provide credit to me in the comments and/or ReadMe file of your new creation.
Description: The EONS Grenade Launcher is a modification of the UT2004 ONS Grenade Launcher intended to improve the weapon's usefulness in a variety of situations.
New Features:
1. Grenades fire on primary fire at a much higher velocity. Additionally, grenades fire roughly 15% faster, but do 15% less damage and have only 90% of the original blast radius.
2. Grenades explosions create electromagnetic interference capable of temporarily disabling a vehicle and ejecting its driver (if any). Light vehicles have a 50% chance to be disabled, Medium vehicles have a 25% chance to be disabled, and Heavy vehicles have a 10% chance to be disabled.
3. The secondary fire triggering mechanism has an improved rate of fire.
//========================================================================
// EONSGrenadeLauncher
// EONS Grenade Launcher written by Wail of Suicide
// Feel free to use this content in any maps you create, but please provide credit in the readme.
// Contact: wailofsuicide@gmail.com - Comments and suggestions welcome.
//========================================================================
class EONSGrenadeLauncher extends ONSGrenadeLauncher;
defaultproperties
{
ItemName="EONS Grenade Launcher"
Description="The EONS Grenade Launcher fires electro-magnetic grenades at high velocity, which will attach to enemy players and vehicles. The magnetic interference caused by an exploding EONS grenade has a chance of disabling vehicles and ejecting their drivers."
InventoryGroup=3
GroupOffset=10
FireModeClass(0)=class'EONS-GrenadeLauncher_BETA1.EONSGrenadeLauncherFire'
FireModeClass(1)=class'EONS-GrenadeLauncher_BETA1.EONSGrenadeLauncherAltFire'
PickupClass=class'EONS-GrenadeLauncher_BETA1.EONSGrenadeLauncherPickup'
}
//========================================================================
// EONSGrenadeLauncherFire
// Enhanced Grenade Launcher written by Wail of Suicide 4/8/06
//========================================================================
class EONSGrenadeLauncherFire extends ONSGrenadeFire;
defaultproperties
{
ProjectileClass=class'EONS-GrenadeLauncher_BETA1.EONSGrenadeProjectile'
FireRate=0.55
}
//========================================================================
// EONSGrenadeProjectile
// Enhanced Grenade Launcher written by Wail of Suicide
//========================================================================
class EONSGrenadeProjectile extends ONSGrenadeProjectile;
#exec AUDIO IMPORT FILE="Sounds\GrenadeFloor.wav" NAME="GrenadeFloor" GROUP="GrenadeLauncher"
//Altered Explosion VFX
simulated function Destroyed()
{
if ( Trail != None )
Trail.mRegen = false; // stop the emitter from regenerating
//explosion
if ( !bNoFX )
{
if ( EffectIsRelevant(Location,false) )
{
Spawn(class'EONSGrenadeExplosionEffect',,, Location, rotator(vect(0,0,1)));
Spawn(ExplosionDecal,self,, Location, rotator(vect(0,0,-1)));
}
PlaySound(Sound'WeaponSounds.ShockRifle.ShockComboFire',,3.75*TransientSoundVolume);
}
if ( EONSGrenadeLauncher(Owner) != None)
EONSGrenadeLauncher(Owner).CurrentGrenades--;
if ( Beacon != None )
Beacon.Destroy();
Super(Projectile).Destroyed();
}
//Changed Grenade Trail
simulated function PostBeginPlay()
{
local PlayerController PC;
Super(Projectile).PostBeginPlay();
if ( Level.NetMode != NM_DedicatedServer)
{
PC = Level.GetLocalPlayerController();
if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 5500 )
Trail = Spawn(class'EONS-GrenadeLauncher_BETA1.EONSGrenadeSmokeTrail', self,, Location, Rotation);
}
Velocity = Speed * Vector(Rotation);
RandSpin(25000);
if (PhysicsVolume.bWaterVolume)
Velocity = 0.6*Velocity;
if (Role == ROLE_Authority && Instigator != None)
Team = Instigator.GetTeamNum();
}
//Modified projectile bounce SFX volume
simulated function HitWall( vector HitNormal, actor Wall )
{
local Vector VNorm;
local PlayerController PC;
if (Vehicle(Wall) != None)
{
Touch(Wall);
return;
}
// Reflect off Wall w/damping
VNorm = (Velocity dot HitNormal) * HitNormal;
Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel;
RandSpin(100000);
Speed = VSize(Velocity);
if ( Speed < 40 )
{
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,7.5*TransientSoundVolume);
if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false) )
{
PC = Level.GetLocalPlayerController();
if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 2000 )
Spawn(HitEffectClass,,, Location, Rotator(HitNormal));
LastSparkTime = Level.TimeSeconds;
}
}
}
simulated function HurtRadius( float DamageAmount, float DamageRadius, class<DamageType> DamageType, float Momentum, vector HitLocation )
{
local actor Victims;
local float damageScale, dist;
local vector dir;
local float r;
if ( bHurtEntry )
return;
bHurtEntry = true;
foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation )
{
r = FRand();
// don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') )
{
dir = Victims.Location - HitLocation;
dist = FMax(1,VSize(dir));
dir = dir/dist;
damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius);
if ( Instigator == None || Instigator.Controller == None )
Victims.SetDelayedDamageInstigatorController( InstigatorController );
if ( Victims == LastTouched )
LastTouched = None;
Victims.TakeDamage
(
damageScale * DamageAmount,
Instigator,
Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,
(damageScale * Momentum * dir),
DamageType
);
if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, Instigator.Controller, DamageType, Momentum, HitLocation);
if ( r > 0.50 && (Vehicle(Victims) != None)
&& (Pawn(Victims).GetTeamNum() != Instigator.Controller.GetTeamNum())
&& ( Vehicle(Victims).IsA('ONSHoverBike')
|| Vehicle(Victims).IsA('ONSAttackCraft')
|| Vehicle(Victims).IsA('ONSDualAttackCraft') ) )
Vehicle(Victims).EjectDriver();
if ( r > 0.75 && (Vehicle(Victims) != None)
&& (Pawn(Victims).GetTeamNum() != Instigator.Controller.GetTeamNum())
&& ( Vehicle(Victims).IsA('ONSRV')
|| Vehicle(Victims).IsA('ONSPRV')
|| Vehicle(Victims).IsA('ONSArtillery') ) )
Vehicle(Victims).EjectDriver();
if ( r > 0.90 && (Vehicle(Victims) != None)
&& (Pawn(Victims).GetTeamNum() != Instigator.Controller.GetTeamNum())
&& ( Vehicle(Victims).IsA('ONSHoverTank')
|| Vehicle(Victims).IsA('ONSShockTank')
|| Vehicle(Victims).IsA('ONSStationaryWeaponPawn')
|| Vehicle(Victims).IsA('ONSVehicle') ) )
Vehicle(Victims).EjectDriver();
}
}
if ( (LastTouched != None) && (LastTouched != self) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') )
{
Victims = LastTouched;
LastTouched = None;
dir = Victims.Location - HitLocation;
dist = FMax(1,VSize(dir));
dir = dir/dist;
damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius));
if ( Instigator == None || Instigator.Controller == None )
Victims.SetDelayedDamageInstigatorController(InstigatorController);
Victims.TakeDamage
(
damageScale * DamageAmount,
Instigator,
Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,
(damageScale * Momentum * dir),
DamageType
);
if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation);
}
bHurtEntry = false;
}
simulated function BlowUp(vector HitLocation)
{
HurtRadius(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation );
if ( Role == ROLE_Authority )
MakeNoise(1.0);
}
defaultproperties
{
MyDamageType=class'EONS-GrenadeLauncher_BETA1.DamTypeEONSGrenadeProjectile'
Damage=85.00
DamageRadius=155.0
Speed=1800
MaxSpeed=4000
ImpactSound=Sound'EONS-GrenadeLauncher_BETA1.GrenadeFloor'
}