diff --git a/src/k_follower.c b/src/k_follower.c index f288d63f1..78e233e4c 100644 --- a/src/k_follower.c +++ b/src/k_follower.c @@ -419,6 +419,7 @@ void K_HandleFollower(player_t *player) K_UpdateFollowerState(player->follower, fl->idlestate, FOLLOWERSTATE_IDLE); P_SetTarget(&player->follower->target, player->mo); // we need that to know when we need to disappear + P_SetTarget(&player->follower->punt_ref, player->mo); player->follower->angle = player->follower->old_angle = player->mo->angle; // This is safe to only spawn it here, the follower is removed then respawned when switched. @@ -427,10 +428,12 @@ void K_HandleFollower(player_t *player) bmobj = P_SpawnMobj(player->follower->x, player->follower->y, player->follower->z, MT_FOLLOWERBUBBLE_FRONT); P_SetTarget(&player->follower->hnext, bmobj); P_SetTarget(&bmobj->target, player->follower); // Used to know if we have to despawn at some point. + P_SetTarget(&bmobj->punt_ref, player->mo); bmobj = P_SpawnMobj(player->follower->x, player->follower->y, player->follower->z, MT_FOLLOWERBUBBLE_BACK); P_SetTarget(&player->follower->hnext->hnext, bmobj); // this seems absolutely stupid, I know, but this will make updating the momentums/flags of these a bit easier. P_SetTarget(&bmobj->target, player->follower); // Ditto + P_SetTarget(&bmobj->punt_ref, player->mo); } } else // follower exists, woo! diff --git a/src/k_kart.c b/src/k_kart.c index 46972f9a0..6f57ffe2b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8082,6 +8082,9 @@ static void K_UpdateTripwire(player_t *player) P_SetTarget(&front->target, player->mo); P_SetTarget(&back->target, player->mo); + P_SetTarget(&front->punt_ref, player->mo); + P_SetTarget(&back->punt_ref, player->mo); + front->dispoffset = 1; front->old_angle = back->old_angle = K_MomentumAngle(player->mo); back->dispoffset = -1; diff --git a/src/objects/emerald.c b/src/objects/emerald.c index 65b23edb6..e749efb92 100644 --- a/src/objects/emerald.c +++ b/src/objects/emerald.c @@ -276,6 +276,7 @@ static void spawn_lens_flare(mobj_t *emerald) void Obj_BeginEmeraldOrbit(mobj_t *emerald, mobj_t *target, fixed_t radius, INT32 revolution_time, tic_t fuse) { P_SetTarget(&emerald_orbit(emerald), target); + P_SetTarget(&emerald->punt_ref, target); if (P_MobjWasRemoved(emerald_award(emerald))) { diff --git a/src/p_mobj.c b/src/p_mobj.c index 11f804ab8..f5b14929c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5434,6 +5434,9 @@ void P_RunOverlays(void) mo->scale = mo->destscale = FixedMul(mo->target->scale, mo->movefactor); mo->angle = (mo->target->player ? mo->target->player->drawangle : mo->target->angle) + mo->movedir; + P_SetTarget(&mo->punt_ref, mo->target->punt_ref); + mo->reappear = mo->target->reappear; + if (!(mo->threshold & OV_DONTSCREENOFFSET)) { mo->spritexoffset = mo->target->spritexoffset; diff --git a/src/p_user.c b/src/p_user.c index b1a0fd3cd..d5e781e19 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1332,6 +1332,11 @@ void P_DoPlayerExit(player_t *player, pflags_t flags) { G_BeginLevelExit(); } + + if (specialstageinfo.valid == true && losing == false && P_MobjWasRemoved(player->mo) == false) + { + K_MakeObjectReappear(player->mo); + } } K_InitPlayerTally(player);