Homing Missiles
By Postal
Intermediate
I am quite sure we all like having a lock on
someone with the eightball, it is always fun to know you are going
to hit someone with a little package of pain. But perhaps you are sick of having
to keep aiming at the stupid bots as they run around like headless
chickens. Well now I shall
tell you what to do about it.
We are going to make a subclass or RocketMK2. We are going to modify the code
used in the seeking missiles to find a target them by
themselves. So to go over
quick idea, the eightball finds the target you are looking at, and
tell the rocket that, we are going to make the rocket find its own
target.
So lets look at the seeking rocket code:
simulated function Timer()
This is timer so it is called upon
constantly to keep updating the course of the missile towards the
target
{
local ut_SpriteSmokePuff b;
local vector SeekingDir;
local float MagnitudeVel;
if ( InitialDir == vect(0,0,0) ) InitialDir = Normal(Velocity);
if ( (Seeking != None) && (Seeking != Instigator) )
{
If the guy we are aiming at is not you or
if that guys doesn’t exist
SeekingDir = Normal(Seeking.Location - Location);
if ( (SeekingDir Dot InitialDir) > 0 )
{
This code makes it home in on its target
MagnitudeVel =
VSize(Velocity);
SeekingDir = Normal(SeekingDir * 0.5 * MagnitudeVel + Velocity);
Velocity =
MagnitudeVel * SeekingDir;
Acceleration = 25 * SeekingDir;
SetRotation(rotator(Velocity));
}
}
And this makes the smoke behind the
missile.
if ( bHitWater ||
(Level.NetMode == NM_DedicatedServer) ) Return;
if ( (Level.bHighDetailMode && !Level.bDropDetail) ||
(FRand() < 0.5) )
{
b = Spawn(class'ut_SpriteSmokePuff');
B.DrawScale = 0.5;
b.RemoteRole = ROLE_None;
}
}
So what we need to do is have the rocket
find its own target.
foreach
visiblecollidingactors(class'Pawn', I, 2000,, true)
That will find all pawns in the visible
area for 2000 unreal units and refers to them as I for reference.
So I ended up with this:
simulated function Timer()
{
local ut_SpriteSmokePuff b;
local vector SeekingDir;
local float MagnitudeVel;
Local Pawn i;
Reference term for the pawns we find.
if ( InitialDir == vect(0,0,0) ) InitialDir = Normal(Velocity);
If ( (Seeking == None) || (Seeking == Instigator) )
{
If we havent got a target or if that
target is you.
foreach visiblecollidingactors(class'Pawn', I, 2000,, true)
{
If (i != Instigator && I.Health >0)
{
If the target is not dead or you.
Seeking = I;
New target.
}
}
}
Else if ( (Seeking != None) && (Seeking != Instigator) )
{
SeekingDir = Normal(Seeking.Location - Location);
if ( (SeekingDir Dot InitialDir) > 0 )
{
MagnitudeVel = VSize(Velocity);
SeekingDir = Normal(SeekingDir * 0.5 * MagnitudeVel + Velocity);
Velocity = MagnitudeVel * SeekingDir;
Acceleration = 25 * SeekingDir;
SetRotation(rotator(Velocity));
}
}
if ( bHitWater || (Level.NetMode == NM_DedicatedServer) ) Return;
if ( (Level.bHighDetailMode && !Level.bDropDetail) ||
(FRand() < 0.5) )
{
b = Spawn(class'ut_SpriteSmokePuff');
B.DrawScale = 0.5;
b.RemoteRole = ROLE_None;
}
}
And that all we need for a self guided
missle
 Visitors Since December 26, 2000
|