mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-31 05:30:48 +00:00
Snappier NiGHTS pickup attraction
* Old attraction is still used for non-NiGHTS players due to a momentum bug. The old way is good enough to sidestep the bug.
* Thanks Inuyasha (KS) for original code 🐶
This commit is contained in:
parent
21cb0cab3c
commit
bf74b81842
3 changed files with 37 additions and 8 deletions
|
@ -944,6 +944,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
// Yay! The thing's in reach! Pull it in!
|
||||
mo2->flags |= MF_NOCLIP|MF_NOCLIPHEIGHT;
|
||||
mo2->flags2 |= MF2_NIGHTSPULL;
|
||||
mo2->movecount = 24*FRACUNIT; // initialize the NightsItemChase timer
|
||||
P_SetTarget(&mo2->tracer, toucher);
|
||||
}
|
||||
}
|
||||
|
@ -2122,7 +2123,10 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
target->flags |= MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT; // Don't drop Tails 03-08-2000
|
||||
|
||||
if (target->flags2 & MF2_NIGHTSPULL)
|
||||
{
|
||||
P_SetTarget(&target->tracer, NULL);
|
||||
target->movecount = 0; // reset NightsItemChase timer
|
||||
}
|
||||
|
||||
// dead target is no more shootable
|
||||
target->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SPECIAL);
|
||||
|
|
40
src/p_mobj.c
40
src/p_mobj.c
|
@ -6096,9 +6096,11 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
|
|||
void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on your target
|
||||
{
|
||||
fixed_t dist, ndist, speedmul;
|
||||
angle_t vangle;
|
||||
fixed_t tx = dest->x;
|
||||
fixed_t ty = dest->y;
|
||||
fixed_t tz = dest->z + (dest->height/2); // Aim for center
|
||||
fixed_t xydist = P_AproxDistance(tx - source->x, ty - source->y);
|
||||
|
||||
if (!dest || dest->health <= 0 || !dest->player || !source->tracer)
|
||||
return;
|
||||
|
@ -6107,19 +6109,40 @@ void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on y
|
|||
source->angle = R_PointToAngle2(source->x, source->y, tx, ty);
|
||||
|
||||
// change slope
|
||||
dist = P_AproxDistance(P_AproxDistance(tx - source->x, ty - source->y), tz - source->z);
|
||||
dist = P_AproxDistance(xydist, tz - source->z);
|
||||
|
||||
if (dist < 1)
|
||||
dist = 1;
|
||||
|
||||
if (nightsgrab)
|
||||
speedmul = P_AproxDistance(dest->momx, dest->momy) + FixedMul(8*FRACUNIT, source->scale);
|
||||
else
|
||||
speedmul = P_AproxDistance(dest->momx, dest->momy) + FixedMul(source->info->speed, source->scale);
|
||||
if (nightsgrab && dest->player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
{
|
||||
source->movecount += FRACUNIT/2;
|
||||
|
||||
source->momx = FixedMul(FixedDiv(tx - source->x, dist), speedmul);
|
||||
source->momy = FixedMul(FixedDiv(ty - source->y, dist), speedmul);
|
||||
source->momz = FixedMul(FixedDiv(tz - source->z, dist), speedmul);
|
||||
if (dist < source->movecount)
|
||||
{
|
||||
source->momx = source->momy = source->momz = 0;
|
||||
P_TeleportMove(source, tx, ty, tz);
|
||||
}
|
||||
else
|
||||
{
|
||||
vangle = R_PointToAngle2(source->z, 0, tz, xydist);
|
||||
|
||||
source->momx = FixedMul(FINESINE(vangle >> ANGLETOFINESHIFT), FixedMul(FINECOSINE(source->angle >> ANGLETOFINESHIFT), source->movecount));
|
||||
source->momy = FixedMul(FINESINE(vangle >> ANGLETOFINESHIFT), FixedMul(FINESINE(source->angle >> ANGLETOFINESHIFT), source->movecount));
|
||||
source->momz = FixedMul(FINECOSINE(vangle >> ANGLETOFINESHIFT), source->movecount);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nightsgrab)
|
||||
speedmul = P_AproxDistance(dest->momx, dest->momy) + FixedMul(8*FRACUNIT, source->scale);
|
||||
else
|
||||
speedmul = P_AproxDistance(dest->momx, dest->momy) + FixedMul(source->info->speed, source->scale);
|
||||
|
||||
source->momx = FixedMul(FixedDiv(tx - source->x, dist), speedmul);
|
||||
source->momy = FixedMul(FixedDiv(ty - source->y, dist), speedmul);
|
||||
source->momz = FixedMul(FixedDiv(tz - source->z, dist), speedmul);
|
||||
}
|
||||
|
||||
// Instead of just unsetting NOCLIP like an idiot, let's check the distance to our target.
|
||||
ndist = P_AproxDistance(P_AproxDistance(tx - (source->x+source->momx),
|
||||
|
@ -6144,6 +6167,7 @@ static void P_NightsItemChase(mobj_t *thing)
|
|||
{
|
||||
P_SetTarget(&thing->tracer, NULL);
|
||||
thing->flags2 &= ~MF2_NIGHTSPULL;
|
||||
//thing->movecount = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -9762,6 +9762,7 @@ void P_PlayerThink(player_t *player)
|
|||
// Yay! The thing's in reach! Pull it in!
|
||||
mo2->flags |= MF_NOCLIP|MF_NOCLIPHEIGHT;
|
||||
mo2->flags2 |= MF2_NIGHTSPULL;
|
||||
mo2->movecount = 24*FRACUNIT; // initialize NightsItemChase timer
|
||||
P_SetTarget(&mo2->tracer, player->mo);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue