diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7975891e9..92c2563cc 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2494,24 +2494,34 @@ void CL_ClearPlayer(INT32 playernum) { int i; - if (players[playernum].mo) + if (gamestate == GS_LEVEL) { - P_RemoveMobj(players[playernum].mo); + if (players[playernum].mo) + { + P_RemoveMobj(players[playernum].mo); + P_SetTarget(&players[playernum].mo, NULL); + } + + P_SetTarget(&players[playernum].skybox.viewpoint, NULL); + P_SetTarget(&players[playernum].skybox.centerpoint, NULL); + P_SetTarget(&players[playernum].awayviewmobj, NULL); + P_SetTarget(&players[playernum].followmobj, NULL); } + // Handle parties. + for (i = 0; i < MAXPLAYERS; ++i) + { + if (splitscreen_invitations[i] == playernum) + splitscreen_invitations[i] = -1; + } - for (i = 0; i < MAXPLAYERS; ++i) - { - if (splitscreen_invitations[i] == playernum) - splitscreen_invitations[i] = -1; - } + splitscreen_party_size[playernum] = 0; + splitscreen_original_party_size[playernum] = 0; - splitscreen_invitations[playernum] = -1; - splitscreen_party_size[playernum] = 0; - splitscreen_original_party_size[playernum] = 0; + // Wipe the struct. + memset(&players[playernum], 0, sizeof (player_t)); - memset(&players[playernum], 0, sizeof (player_t)); - - RemoveAdminPlayer(playernum); // don't stay admin after you're gone + // Handle post-cleanup. + RemoveAdminPlayer(playernum); // don't stay admin after you're gone } // diff --git a/src/g_game.c b/src/g_game.c index d4ae8fb27..1af63a55e 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2180,8 +2180,12 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) boolean followerready; INT32 followerskin; UINT16 followercolor; + mobj_t *follower; // old follower, will probably be removed by the time we're dead but you never know. + mobj_t *skyboxviewpoint; + mobj_t *skyboxcenterpoint; + INT32 charflags; UINT32 followitem; @@ -2308,7 +2312,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) nextcheck = 0; xtralife = 0; - follower = NULL; } else { @@ -2346,8 +2349,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) exiting = players[player].exiting; khudcardanimation = (exiting > 0) ? players[player].karthud[khud_cardanimation] : 0; - - follower = players[player].follower; starpostx = players[player].starpostx; starposty = players[player].starposty; @@ -2369,7 +2370,18 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) if (!betweenmaps) { // Obliterate follower from existence (if valid memory) + follower = players[player].follower; P_SetTarget(&players[player].follower, NULL); + P_SetTarget(&players[player].awayviewmobj, NULL); + P_SetTarget(&players[player].followmobj, NULL); + + skyboxviewpoint = players[player].skybox.viewpoint; + skyboxcenterpoint = players[player].skybox.centerpoint; + } + else + { + follower = NULL; + skyboxviewpoint = skyboxcenterpoint = NULL; } spectatorreentry = players[player].spectatorreentry; @@ -2447,6 +2459,9 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) if (follower) P_RemoveMobj(follower); + + p->skybox.viewpoint = skyboxviewpoint; + p->skybox.centerpoint = skyboxcenterpoint; p->followerready = followerready; p->followerskin = followerskin; diff --git a/src/p_mobj.c b/src/p_mobj.c index 5e82bd467..64faed58e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10960,15 +10960,12 @@ void P_SpawnPlayer(INT32 playernum) } p->followitem = skins[p->skin].followitem; - - //awayview stuff - p->awayviewmobj = NULL; - p->awayviewtics = 0; - - p->skybox.viewpoint = skyboxviewpnts[0]; - p->skybox.centerpoint = skyboxcenterpnts[0]; - - P_SetTarget(&p->follower, NULL); // cleanse follower from existence + + if (p->jointime <= 1 || leveltime <= 1) + { + P_SetTarget(&p->skybox.viewpoint, skyboxviewpnts[0]); + P_SetTarget(&p->skybox.centerpoint, skyboxcenterpnts[0]); + } if (K_PlayerShrinkCheat(p) == true) { diff --git a/src/p_spec.c b/src/p_spec.c index 1de11bca1..0a9498608 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2293,12 +2293,12 @@ static void P_SwitchSkybox(INT32 args, player_t *player, skybox_t *skybox) if (args != TMS_CENTERPOINT) // Only viewpoint, or both. { - player->skybox.viewpoint = skybox->viewpoint; + P_SetTarget(&player->skybox.viewpoint, skybox->viewpoint); } if (args != TMS_VIEWPOINT) // Only centerpoint, or both. { - player->skybox.centerpoint = skybox->centerpoint; + P_SetTarget(&player->skybox.centerpoint, skybox->centerpoint); } } @@ -3446,23 +3446,29 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha INT32 viewid = args[0]; INT32 centerid = args[1]; + + mobj_t *set; // set viewpoint mobj if (args[2] != TMS_CENTERPOINT) { if (viewid >= 0 && viewid < 16) - skybox.viewpoint = skyboxviewpnts[viewid]; + set = skyboxviewpnts[viewid]; else - skybox.viewpoint = NULL; + set = NULL; + + P_SetTarget(&skybox.viewpoint, set); } // set centerpoint mobj if (args[2] != TMS_VIEWPOINT) { if (centerid >= 0 && centerid < 16) - skybox.centerpoint = skyboxcenterpnts[centerid]; + set = skyboxcenterpnts[centerid]; else - skybox.centerpoint = NULL; + set = NULL; + + P_SetTarget(&skybox.centerpoint, set); } if (args[3]) // Applies to all players