Fix spindash being broken in quicksand

# Conflicts:
#	src/p_mobj.c
#	src/p_user.c
This commit is contained in:
toaster 2019-07-17 21:33:18 +01:00
parent c8cfc3110f
commit 438c4d1d51
3 changed files with 84 additions and 80 deletions

View File

@ -142,7 +142,7 @@ boolean P_IsObjectOnGround(mobj_t *mo);
boolean P_IsObjectOnGroundIn(mobj_t *mo, sector_t *sec);
boolean P_InSpaceSector(mobj_t *mo);
boolean P_InQuicksand(mobj_t *mo);
boolean P_PlayerHitFloor(player_t *player);
boolean P_PlayerHitFloor(player_t *player, boolean dorollstuff);
void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative);
void P_RestoreMusic(player_t *player);

View File

@ -3047,7 +3047,7 @@ static void P_PlayerZMovement(mobj_t *mo)
}
}
clipmomz = P_PlayerHitFloor(mo->player);
clipmomz = P_PlayerHitFloor(mo->player, true);
if (!(mo->player->pflags & PF_SPINNING) && mo->player->powers[pw_carry] != CR_NIGHTSMODE)
mo->player->pflags &= ~PF_STARTDASH;

View File

@ -2007,13 +2007,15 @@ boolean P_InSpaceSector(mobj_t *mo) // Returns true if you are in space
//
// Handles player hitting floor surface.
// Returns whether to clip momz.
boolean P_PlayerHitFloor(player_t *player)
boolean P_PlayerHitFloor(player_t *player, boolean dorollstuff)
{
boolean clipmomz;
I_Assert(player->mo != NULL);
if ((clipmomz = !(P_CheckDeathPitCollide(player->mo))) && player->mo->health && !player->spectator)
{
if (dorollstuff)
{
if ((player->charability2 == CA2_SPINDASH) && !(player->pflags & PF_THOKKED) && (player->cmd.buttons & BT_USE) && (FixedHypot(player->mo->momx, player->mo->momy) > (5*player->mo->scale)))
{
@ -2022,11 +2024,12 @@ boolean P_PlayerHitFloor(player_t *player)
S_StartSound(player->mo, sfx_spin);
}
else
{
player->pflags &= ~PF_SPINNING;
}
if (player->pflags & PF_GLIDING) // ground gliding
{
if (!player->skidtime)
player->skidtime = TICRATE;
player->mo->tics = -1;
}
@ -2072,6 +2075,8 @@ boolean P_PlayerHitFloor(player_t *player)
S_StartSound(missile, missile->info->seesound);
}
}
else if (player->charability2 == CA2_GUNSLINGER && player->panim == PA_ABILITY2)
;
else if (player->pflags & PF_JUMPED || !(player->pflags & PF_SPINNING)
|| player->powers[pw_tailsfly] || player->mo->state-states == S_PLAY_FLY_TIRED)
{
@ -2102,7 +2107,6 @@ boolean P_PlayerHitFloor(player_t *player)
P_SetPlayerMobjState(player->mo, S_PLAY_STND);
}
}
}
if (!(player->pflags & PF_GLIDING))
player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE);
@ -2537,7 +2541,7 @@ static void P_CheckQuicksand(player_t *player)
player->mo->z = ceilingheight - player->mo->height;
if (player->mo->momz <= 0)
P_PlayerHitFloor(player);
P_PlayerHitFloor(player, false);
}
else
{
@ -2549,7 +2553,7 @@ static void P_CheckQuicksand(player_t *player)
player->mo->z = floorheight;
if (player->mo->momz >= 0)
P_PlayerHitFloor(player);
P_PlayerHitFloor(player, false);
}
friction = abs(rover->master->v1->y - rover->master->v2->y)>>6;