diff --git a/src/d_clisrv.c b/src/d_clisrv.c index b397c83ae..aad0f9b1a 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2652,7 +2652,6 @@ void CL_ClearPlayer(INT32 playernum) } splitscreen_invitations[playernum] = -1; - splitscreen_partied[playernum] = false; memset(&players[playernum], 0, sizeof (player_t)); } @@ -2746,6 +2745,8 @@ void CL_RemovePlayer(INT32 playernum, INT32 reason) RemoveAdminPlayer(playernum); // don't stay admin after you're gone } + G_RemovePartyMember(playernum); + if (playernum == displayplayers[localdisplayplayers[0]] && !demo.playback) displayplayers[localdisplayplayers[0]] = consoleplayer; // don't look through someone's view who isn't there @@ -3382,6 +3383,8 @@ void SV_ResetServer(void) splitscreen_invitations[i] = -1; } + memset(splitscreen_partied, 0, sizeof splitscreen_partied); + mynode = 0; cl_packetmissed = false; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 51a4b822d..e1603bff0 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2053,7 +2053,27 @@ static void Got_AcceptPartyInvite(UINT8 **cp,INT32 playernum) static void Got_LeaveParty(UINT8 **cp,INT32 playernum) { + if (playerconsole[playernum] != playernum) + { + CONS_Alert(CONS_WARNING, M_GetText("Illegal accept splitscreen invite received from %s\n"), player_names[playernum]); + if (server) + { + XBOXSTATIC UINT8 buf[2]; + + buf[0] = (UINT8)playernum; + buf[1] = KICK_MSG_CON_FAIL; + SendNetXCmd(XD_KICK, &buf, 2); + } + return; + } + splitscreen_invitations[playernum] = -1; + if (splitscreen_party_size[playernum] > + splitscreen_original_party_size[playernum]) + { + G_RemovePartyMember(playernum); + G_ResetSplitscreen(playernum); + } } void D_SendPlayerConfig(void) diff --git a/src/g_game.h b/src/g_game.h index e96c0d480..de88d6bdc 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -310,6 +310,7 @@ void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive); void G_AddPartyMember (int party_member, int new_party_member); void G_RemovePartyMember (int party_member); +void G_ResetSplitscreen (int playernum); void G_AddPlayer(INT32 playernum); diff --git a/src/g_splitscreen.c b/src/g_splitscreen.c index 271a83569..3ff71e627 100644 --- a/src/g_splitscreen.c +++ b/src/g_splitscreen.c @@ -22,8 +22,8 @@ int splitscreen_party[MAXPLAYERS][MAXSPLITSCREENPLAYERS]; boolean splitscreen_partied[MAXPLAYERS]; -static void -ResetParty (int playernum) +void +G_ResetSplitscreen (int playernum) { INT32 old_displayplayers[MAXSPLITSCREENPLAYERS]; @@ -91,16 +91,16 @@ G_RemovePartyMember (int playernum) memcpy(old_party, splitscreen_party[playernum], sizeof old_party); memcpy(new_party, old_party, before * sizeof *old_party); - while (i < after) - { - splitscreen_partied[old_party[i]] = false; - - i++; - } - memcpy(&new_party[before], &old_party[after], ( old_party_size - after ) * sizeof *new_party); + if (splitscreen_partied[playernum] && + localdisplayplayers[0] >= after) + { + for (i = 0; i < MAXSPLITSCREENPLAYERS; ++i) + localdisplayplayers[i] -= views; + } + views = ( old_party_size - views ); for (i = 0; i < old_party_size; ++i) @@ -114,8 +114,7 @@ G_RemovePartyMember (int playernum) } } - ResetParty(playernum); - + /* don't want to remove yourself from your own screen! */ if (playernum != consoleplayer && splitscreen_partied[playernum]) { splitscreen_partied[playernum] = false; @@ -181,6 +180,8 @@ G_AddPartyMember (int invitation, int playernum) /* in my party or adding me? */ if (splitscreen_partied[invitation]) { + splitscreen_partied[playernum] = true; + for (i = old_party_size; i < new_party_size; ++i) { displayplayers[i] = party[i]; @@ -192,6 +193,8 @@ G_AddPartyMember (int invitation, int playernum) } else if (playernum == consoleplayer) { + splitscreen_partied[invitation] = true; + for (i = 0; i <= splitscreen; ++i) { localdisplayplayers[i] = ( old_party_size + i );