Additional P_SetTarget mobj_t pointer fixes on player struct

2a87cfcdf1
This commit is contained in:
NepDisk 2024-09-06 22:15:18 -04:00
parent dc25bafd27
commit b65c9fd33d
4 changed files with 59 additions and 31 deletions

View file

@ -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
}
//

View file

@ -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;

View file

@ -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)
{

View file

@ -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