Correct player angle when respawning from crushing

This commit is contained in:
Sally Coolatta 2020-09-26 03:12:22 -04:00
parent 9042f31dc3
commit 2f6962c103
9 changed files with 50 additions and 29 deletions

View file

@ -3028,7 +3028,7 @@ static void Got_Respawn(UINT8 **cp, INT32 playernum)
if (!P_IsObjectOnGround(players[respawnplayer].mo)) if (!P_IsObjectOnGround(players[respawnplayer].mo))
return; return;
K_DoIngameRespawn(&players[respawnplayer], false); K_DoIngameRespawn(&players[respawnplayer]);
demo_extradata[playernum] |= DXD_RESPAWN; demo_extradata[playernum] |= DXD_RESPAWN;
} }
} }

View file

@ -243,7 +243,7 @@ void G_ReadDemoExtraData(void)
if (players[p].mo) if (players[p].mo)
{ {
// Is this how this should work..? // Is this how this should work..?
K_DoIngameRespawn(&players[p], false); K_DoIngameRespawn(&players[p]);
} }
} }
if (extradata & DXD_SKIN) if (extradata & DXD_SKIN)

View file

@ -2310,7 +2310,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
if (leveltime > (starttime + (TICRATE/2)) && !p->spectator) if (leveltime > (starttime + (TICRATE/2)) && !p->spectator)
{ {
K_DoIngameRespawn(p, true); K_DoIngameRespawn(p);
} }
} }

View file

@ -81,16 +81,16 @@ static void K_RespawnAtWaypoint(player_t *player, waypoint_t *waypoint)
player->respawn.pointx = waypoint->mobj->x; player->respawn.pointx = waypoint->mobj->x;
player->respawn.pointy = waypoint->mobj->y; player->respawn.pointy = waypoint->mobj->y;
player->respawn.pointz = waypoint->mobj->z; player->respawn.pointz = waypoint->mobj->z;
player->respawn.flip = (waypoint->mobj->flags2 & MF2_OBJECTFLIP) ? true : false; // K_RespawnOffset wants a boolean! player->respawn.flip = (waypoint->mobj->flags2 & MF2_OBJECTFLIP) ? true : false; // K_RespawnOffset wants a boolean!
player->respawn.pointz += K_RespawnOffset(player, player->respawn.flip); player->respawn.pointz += K_RespawnOffset(player, player->respawn.flip);
} }
/*-------------------------------------------------- /*--------------------------------------------------
void K_DoIngameRespawn(player_t *player, boolean fromTheDead) void K_DoIngameRespawn(player_t *player)
See header file for description. See header file for description.
--------------------------------------------------*/ --------------------------------------------------*/
void K_DoIngameRespawn(player_t *player, boolean fromTheDead) void K_DoIngameRespawn(player_t *player)
{ {
if (!player->mo || P_MobjWasRemoved(player->mo)) if (!player->mo || P_MobjWasRemoved(player->mo))
{ {
@ -117,18 +117,14 @@ void K_DoIngameRespawn(player_t *player, boolean fromTheDead)
player->kartstuff[k_ringboost] = 0; player->kartstuff[k_ringboost] = 0;
player->kartstuff[k_driftboost] = 0; player->kartstuff[k_driftboost] = 0;
player->kartstuff[k_drift] = 0;
player->kartstuff[k_driftcharge] = 0; P_ResetPlayer(player);
player->kartstuff[k_pogospring] = 0;
// Set up respawn position if invalid // Set up respawn position if invalid
if (player->respawn.wp != NULL && leveltime >= starttime) if (player->respawn.wp != NULL && leveltime >= starttime)
{ {
const UINT32 dist = RESPAWN_DIST + (player->airtime * 48); const UINT32 dist = RESPAWN_DIST + (player->airtime * 48);
if (fromTheDead == true) player->respawn.distanceleft = (dist * mapobjectscale) / FRACUNIT;
player->respawn.distanceleft = 0;
else
player->respawn.distanceleft = (dist * mapobjectscale) / FRACUNIT;
K_RespawnAtWaypoint(player, player->respawn.wp); K_RespawnAtWaypoint(player, player->respawn.wp);
} }
else else
@ -236,17 +232,11 @@ void K_DoIngameRespawn(player_t *player, boolean fromTheDead)
} }
/*-------------------------------------------------- /*--------------------------------------------------
static size_t K_NextRespawnWaypointIndex(waypoint_t *waypoint) size_t K_NextRespawnWaypointIndex(waypoint_t *waypoint)
Returns the index for the next respawn waypoint. See header file for description.
Input Arguments:-
waypoint - Waypoint to look after.
Return:-
An table index for waypoint_t -> nextwaypoints.
--------------------------------------------------*/ --------------------------------------------------*/
static size_t K_NextRespawnWaypointIndex(waypoint_t *waypoint) size_t K_NextRespawnWaypointIndex(waypoint_t *waypoint)
{ {
size_t i = 0U; size_t i = 0U;
size_t newwaypoint = SIZE_MAX; size_t newwaypoint = SIZE_MAX;

View file

@ -39,20 +39,34 @@ fixed_t K_RespawnOffset(player_t *player, boolean flip);
/*-------------------------------------------------- /*--------------------------------------------------
void K_DoIngameRespawn(player_t *player, boolean fromTheDead); void K_DoIngameRespawn(player_t *player);
Starts the respawning animation for the specified player, Starts the respawning animation for the specified player,
updating their respawn variables in preparation. updating their respawn variables in preparation.
Input Arguments:- Input Arguments:-
player - Player to preform this for. player - Player to preform this for.
fromTheDead - Doesn't set the distance variable. If respawning from dying, then this should be true.
Return:- Return:-
None None
--------------------------------------------------*/ --------------------------------------------------*/
void K_DoIngameRespawn(player_t *player, boolean fromTheDead); void K_DoIngameRespawn(player_t *player);
/*--------------------------------------------------
size_t K_NextRespawnWaypointIndex(waypoint_t *waypoint);
Returns the index for the next respawn waypoint.
Input Arguments:-
waypoint - Waypoint to look past.
Return:-
An table index for waypoint_t -> nextwaypoints.
--------------------------------------------------*/
size_t K_NextRespawnWaypointIndex(waypoint_t *waypoint);
/*-------------------------------------------------- /*--------------------------------------------------

View file

@ -11174,7 +11174,7 @@ void A_RemoteDamage(mobj_t *actor)
if (locvar2 == 1) // Kill mobj! if (locvar2 == 1) // Kill mobj!
{ {
if (target->player) if (target->player)
K_DoIngameRespawn(target->player, false); K_DoIngameRespawn(target->player);
else else
P_KillMobj(target, source, source, DMG_NORMAL); P_KillMobj(target, source, source, DMG_NORMAL);
} }

View file

@ -1660,7 +1660,7 @@ static boolean P_KillPlayer(player_t *player, UINT8 type)
{ {
case DMG_DEATHPIT: case DMG_DEATHPIT:
// Respawn kill types // Respawn kill types
K_DoIngameRespawn(player, false); K_DoIngameRespawn(player);
return false; return false;
default: default:
// Everything else REALLY kills // Everything else REALLY kills

View file

@ -10314,7 +10314,7 @@ void P_MovePlayerToStarpost(INT32 playernum)
mobj_t *mobj = p->mo; mobj_t *mobj = p->mo;
I_Assert(mobj != NULL); I_Assert(mobj != NULL);
K_DoIngameRespawn(p, true); K_DoIngameRespawn(p);
P_UnsetThingPosition(mobj); P_UnsetThingPosition(mobj);
mobj->x = p->respawn.pointx; mobj->x = p->respawn.pointx;
@ -10338,6 +10338,23 @@ void P_MovePlayerToStarpost(INT32 playernum)
mobj->z = z; mobj->z = z;
// Correct angle
if (p->respawn.wp != NULL)
{
size_t nwp = K_NextRespawnWaypointIndex(p->respawn.wp);
waypoint_t *wp;
if (nwp != SIZE_MAX)
{
wp = p->respawn.wp->nextwaypoints[nwp];
mobj->angle = p->drawangle = R_PointToAngle2(
mobj->x, mobj->y,
wp->mobj->x, wp->mobj->y
);
}
}
P_AfterPlayerSpawn(playernum); P_AfterPlayerSpawn(playernum);
} }

View file

@ -1992,7 +1992,7 @@ static void K_HandleLapIncrement(player_t *player)
if (leveltime < starttime) if (leveltime < starttime)
{ {
// Will fault the player // Will fault the player
K_DoIngameRespawn(player, false); K_DoIngameRespawn(player);
} }
else if ((player->starpostnum == numstarposts) || (player->laps == 0)) else if ((player->starpostnum == numstarposts) || (player->laps == 0))
{ {