From 2f6962c1032d6e7b6fcb36deadc965bce3e98c81 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 26 Sep 2020 03:12:22 -0400 Subject: [PATCH] Correct player angle when respawning from crushing --- src/d_netcmd.c | 2 +- src/g_demo.c | 2 +- src/g_game.c | 2 +- src/k_respawn.c | 28 +++++++++------------------- src/k_respawn.h | 20 +++++++++++++++++--- src/p_enemy.c | 2 +- src/p_inter.c | 2 +- src/p_mobj.c | 19 ++++++++++++++++++- src/p_spec.c | 2 +- 9 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ea829d638..a93e86ac0 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3028,7 +3028,7 @@ static void Got_Respawn(UINT8 **cp, INT32 playernum) if (!P_IsObjectOnGround(players[respawnplayer].mo)) return; - K_DoIngameRespawn(&players[respawnplayer], false); + K_DoIngameRespawn(&players[respawnplayer]); demo_extradata[playernum] |= DXD_RESPAWN; } } diff --git a/src/g_demo.c b/src/g_demo.c index cbe82ce5b..559867531 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -243,7 +243,7 @@ void G_ReadDemoExtraData(void) if (players[p].mo) { // Is this how this should work..? - K_DoIngameRespawn(&players[p], false); + K_DoIngameRespawn(&players[p]); } } if (extradata & DXD_SKIN) diff --git a/src/g_game.c b/src/g_game.c index 3aff89ed9..ad71f4d8b 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2310,7 +2310,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) if (leveltime > (starttime + (TICRATE/2)) && !p->spectator) { - K_DoIngameRespawn(p, true); + K_DoIngameRespawn(p); } } diff --git a/src/k_respawn.c b/src/k_respawn.c index c2c5051d8..7c0a7241e 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -81,16 +81,16 @@ static void K_RespawnAtWaypoint(player_t *player, waypoint_t *waypoint) player->respawn.pointx = waypoint->mobj->x; player->respawn.pointy = waypoint->mobj->y; 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); } /*-------------------------------------------------- - void K_DoIngameRespawn(player_t *player, boolean fromTheDead) + void K_DoIngameRespawn(player_t *player) 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)) { @@ -117,18 +117,14 @@ void K_DoIngameRespawn(player_t *player, boolean fromTheDead) player->kartstuff[k_ringboost] = 0; player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_drift] = 0; - player->kartstuff[k_driftcharge] = 0; - player->kartstuff[k_pogospring] = 0; + + P_ResetPlayer(player); // Set up respawn position if invalid if (player->respawn.wp != NULL && leveltime >= starttime) { const UINT32 dist = RESPAWN_DIST + (player->airtime * 48); - if (fromTheDead == true) - player->respawn.distanceleft = 0; - else - player->respawn.distanceleft = (dist * mapobjectscale) / FRACUNIT; + player->respawn.distanceleft = (dist * mapobjectscale) / FRACUNIT; K_RespawnAtWaypoint(player, player->respawn.wp); } 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. - - Input Arguments:- - waypoint - Waypoint to look after. - - Return:- - An table index for waypoint_t -> nextwaypoints. + See header file for description. --------------------------------------------------*/ -static size_t K_NextRespawnWaypointIndex(waypoint_t *waypoint) +size_t K_NextRespawnWaypointIndex(waypoint_t *waypoint) { size_t i = 0U; size_t newwaypoint = SIZE_MAX; diff --git a/src/k_respawn.h b/src/k_respawn.h index 96b552eb4..d5a946560 100644 --- a/src/k_respawn.h +++ b/src/k_respawn.h @@ -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, updating their respawn variables in preparation. Input Arguments:- player - Player to preform this for. - fromTheDead - Doesn't set the distance variable. If respawning from dying, then this should be true. Return:- 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); /*-------------------------------------------------- diff --git a/src/p_enemy.c b/src/p_enemy.c index 16d6a1c5c..605ba24b0 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -11174,7 +11174,7 @@ void A_RemoteDamage(mobj_t *actor) if (locvar2 == 1) // Kill mobj! { if (target->player) - K_DoIngameRespawn(target->player, false); + K_DoIngameRespawn(target->player); else P_KillMobj(target, source, source, DMG_NORMAL); } diff --git a/src/p_inter.c b/src/p_inter.c index 46f918c42..ca2735ca5 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1660,7 +1660,7 @@ static boolean P_KillPlayer(player_t *player, UINT8 type) { case DMG_DEATHPIT: // Respawn kill types - K_DoIngameRespawn(player, false); + K_DoIngameRespawn(player); return false; default: // Everything else REALLY kills diff --git a/src/p_mobj.c b/src/p_mobj.c index acbc5cd2a..b17a97be1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10314,7 +10314,7 @@ void P_MovePlayerToStarpost(INT32 playernum) mobj_t *mobj = p->mo; I_Assert(mobj != NULL); - K_DoIngameRespawn(p, true); + K_DoIngameRespawn(p); P_UnsetThingPosition(mobj); mobj->x = p->respawn.pointx; @@ -10338,6 +10338,23 @@ void P_MovePlayerToStarpost(INT32 playernum) 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); } diff --git a/src/p_spec.c b/src/p_spec.c index ee59d0ff6..0e32b0470 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1992,7 +1992,7 @@ static void K_HandleLapIncrement(player_t *player) if (leveltime < starttime) { // Will fault the player - K_DoIngameRespawn(player, false); + K_DoIngameRespawn(player); } else if ((player->starpostnum == numstarposts) || (player->laps == 0)) {