Cleaned up code. Puffs no longer need ALWAYSPUFF.
- A_CustomBulletAttack and A_FireBullets will perform a second P_LineAttack to get a puff which only returns to the previous function after a tracer.
This commit is contained in:
parent
4750dfd8b6
commit
10fabc3ab7
3 changed files with 87 additions and 37 deletions
|
|
@ -1666,6 +1666,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomBulletAttack)
|
|||
S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM);
|
||||
for (i = 0; i < numbullets; i++)
|
||||
{
|
||||
bool temp = false;
|
||||
DAngle angle = bangle;
|
||||
DAngle slope = bslope;
|
||||
|
||||
|
|
@ -1686,6 +1687,11 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomBulletAttack)
|
|||
damage *= ((pr_cabullet()%3)+1);
|
||||
|
||||
AActor *puff = P_LineAttack(self, angle, range, slope, damage, NAME_Hitscan, pufftype, laflags);
|
||||
if (!puff)
|
||||
{
|
||||
temp = true;
|
||||
puff = P_LineAttack(self, bangle, range, bslope, 0, NAME_Hitscan, pufftype, laflags | LAF_NOINTERACT);
|
||||
}
|
||||
|
||||
if (puff && missile)
|
||||
{
|
||||
|
|
@ -1694,14 +1700,20 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomBulletAttack)
|
|||
AActor *proj = P_SpawnMissileXYZ(self->Vec3Offset(x, y, self->GetBobOffset() + Spawnheight), self, puff, missile, false);
|
||||
if (proj)
|
||||
{
|
||||
if (flags & CBAF_PUFFTARGET) proj->target = puff;
|
||||
if (flags & CBAF_PUFFMASTER) proj->master = puff;
|
||||
if (flags & CBAF_PUFFTRACER) proj->tracer = puff;
|
||||
double missilespeed;
|
||||
A_Face(proj, puff, 0., 0.);
|
||||
missilespeed = fabs(proj->Angles.Pitch.Cos() * proj->Speed);
|
||||
proj->Vel.Z = proj->Angles.Pitch.Sin() * proj->Speed;
|
||||
proj->VelFromAngle(missilespeed);
|
||||
// FAF_BOTTOM = 1
|
||||
// Aim for the base of the puff as that's where blood puffs will spawn... roughly.
|
||||
|
||||
A_Face(proj, puff, 0., 0., 0., 0., 1);
|
||||
proj->Vel3DFromAngle(-proj->Angles.Pitch, proj->Speed);
|
||||
|
||||
if (temp)
|
||||
puff->Destroy();
|
||||
else
|
||||
{
|
||||
if (flags & CBAF_PUFFTARGET) proj->target = puff;
|
||||
if (flags & CBAF_PUFFMASTER) proj->master = puff;
|
||||
if (flags & CBAF_PUFFTRACER) proj->tracer = puff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1837,7 +1849,7 @@ enum FB_Flags
|
|||
FBF_PUFFTRACER = 256,
|
||||
};
|
||||
|
||||
static void FireBulletMissile(AActor *self, PClassActor *missile, AActor *puff, DAngle angle, double Spawnheight, double Spawnofs_xy, int flags)
|
||||
static void FireBulletMissile(AActor *self, PClassActor *missile, AActor *puff, DAngle angle, double Spawnheight, double Spawnofs_xy, int flags, bool temp)
|
||||
{
|
||||
if (self && missile && puff)
|
||||
{
|
||||
|
|
@ -1847,14 +1859,20 @@ static void FireBulletMissile(AActor *self, PClassActor *missile, AActor *puff,
|
|||
AActor *proj = P_SpawnPlayerMissile(self, ofs.X, ofs.Y, Spawnheight, missile, angle, nullptr, nullptr, false, true);
|
||||
if (proj)
|
||||
{
|
||||
if (flags & FBF_PUFFTARGET) proj->target = puff;
|
||||
if (flags & FBF_PUFFMASTER) proj->master = puff;
|
||||
if (flags & FBF_PUFFTRACER) proj->tracer = puff;
|
||||
double missilespeed;
|
||||
A_Face(proj, puff, 0., 0.);
|
||||
missilespeed = fabs(proj->Angles.Pitch.Cos() * proj->Speed);
|
||||
proj->Vel.Z = proj->Angles.Pitch.Sin() * proj->Speed;
|
||||
proj->VelFromAngle(missilespeed);
|
||||
// FAF_BOTTOM = 1
|
||||
// Aim for the base of the puff as that's where blood puffs will spawn... roughly.
|
||||
|
||||
A_Face(proj, puff, 0., 0., 0., 0., 1);
|
||||
proj->Vel3DFromAngle(-proj->Angles.Pitch, proj->Speed);
|
||||
|
||||
if (temp)
|
||||
puff->Destroy();
|
||||
else
|
||||
{
|
||||
if (flags & FBF_PUFFTARGET) proj->target = puff;
|
||||
if (flags & FBF_PUFFMASTER) proj->master = puff;
|
||||
if (flags & FBF_PUFFTRACER) proj->tracer = puff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1910,8 +1928,15 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_FireBullets)
|
|||
if (!(flags & FBF_NORANDOM))
|
||||
damage *= ((pr_cwbullet()%3)+1);
|
||||
|
||||
bool temp = false;
|
||||
AActor *puff = P_LineAttack(self, bangle, range, bslope, damage, NAME_Hitscan, pufftype, laflags);
|
||||
FireBulletMissile(self, missile, puff, bangle, Spawnheight, Spawnofs_xy, flags);
|
||||
|
||||
if (!puff)
|
||||
{
|
||||
temp = true;
|
||||
puff = P_LineAttack(self, bangle, range, bslope, 0, NAME_Hitscan, pufftype, laflags | LAF_NOINTERACT);
|
||||
}
|
||||
FireBulletMissile(self, missile, puff, bangle, Spawnheight, Spawnofs_xy, flags, temp);
|
||||
|
||||
}
|
||||
else
|
||||
|
|
@ -1939,8 +1964,15 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_FireBullets)
|
|||
if (!(flags & FBF_NORANDOM))
|
||||
damage *= ((pr_cwbullet()%3)+1);
|
||||
|
||||
bool temp = false;
|
||||
AActor *puff = P_LineAttack(self, angle, range, slope, damage, NAME_Hitscan, pufftype, laflags);
|
||||
FireBulletMissile(self, missile, puff, angle, Spawnheight, Spawnofs_xy, flags);
|
||||
|
||||
if (!puff)
|
||||
{
|
||||
temp = true;
|
||||
puff = P_LineAttack(self, bangle, range, bslope, 0, NAME_Hitscan, pufftype, laflags | LAF_NOINTERACT);
|
||||
}
|
||||
FireBulletMissile(self, missile, puff, angle, Spawnheight, Spawnofs_xy, flags, temp);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue