Rewrote structure of packet_level_area_inform - should fix 'Peach's Castle' bug

This commit is contained in:
MysterD 2022-03-27 18:21:53 -07:00
parent 0a679efa07
commit 0bb48cb6e7
8 changed files with 55 additions and 61 deletions

View file

@ -196,6 +196,7 @@ void clear_areas(void) {
if (np != NULL) {
np->currAreaSyncValid = false;
np->currLevelSyncValid = false;
network_send_level_area_inform();
}
gCurrentArea = NULL;
@ -268,6 +269,7 @@ void unload_area(void) {
struct NetworkPlayer* np = gNetworkPlayerLocal;
if (np != NULL) {
np->currAreaSyncValid = false;
network_send_level_area_inform();
}
network_clear_sync_objects();

View file

@ -217,9 +217,9 @@ u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 mode
// update course/level
np->currLevelAreaSeqId = 0;
network_player_update_course_level(np, 0, 0, 16, 1);
np->currLevelSyncValid = false;
np->currAreaSyncValid = false;
network_player_update_course_level(np, 0, 0, 16, 1);
// update visuals
np->fadeOpacity = 0;
@ -313,7 +313,13 @@ u8 network_player_disconnected(u8 globalIndex) {
return UNKNOWN_GLOBAL_INDEX;
}
void network_player_update_course_level(struct NetworkPlayer *np, s16 courseNum, s16 actNum, s16 levelNum, s16 areaIndex) {
void network_player_update_course_level(struct NetworkPlayer* np, s16 courseNum, s16 actNum, s16 levelNum, s16 areaIndex) {
// prevent sync valid packets from corrupting areaIndex
if (areaIndex == -1) {
areaIndex = np->currAreaIndex;
}
// display popup
bool inCredits = (np->currActNum == 99);
if (np->currCourseNum != courseNum && np->localIndex != 0 && !inCredits) {
@ -335,10 +341,19 @@ void network_player_update_course_level(struct NetworkPlayer *np, s16 courseNum,
}
}
bool mismatch = (np->currCourseNum != courseNum)
|| (np->currActNum != actNum)
|| (np->currLevelNum != levelNum)
|| (np->currAreaIndex != areaIndex);
np->currCourseNum = courseNum;
np->currActNum = actNum;
np->currLevelNum = levelNum;
np->currAreaIndex = areaIndex;
if (mismatch && (np == gNetworkPlayerLocal)) {
network_send_level_area_inform();
}
}
void network_player_shutdown(void) {

View file

@ -293,7 +293,7 @@ void network_send_level_macro(struct NetworkPlayer* destNp);
void network_receive_level_macro(struct Packet* p);
// packet_level_area_inform.c
void network_send_level_area_inform(struct NetworkPlayer* np);
void network_send_level_area_inform(void);
void network_receive_level_area_inform(struct Packet* p);
// packet_level_respawn_info.c

View file

@ -7,8 +7,8 @@
static void player_changed_area(struct NetworkPlayer *np, s16 courseNum, s16 actNum, s16 levelNum, s16 areaIndex) {
// set NetworkPlayer variables
network_player_update_course_level(np, courseNum, actNum, levelNum, areaIndex);
np->currAreaSyncValid = false;
network_player_update_course_level(np, courseNum, actNum, levelNum, areaIndex);
reservation_area_change(np);
// find a NetworkPlayer at that area
@ -18,14 +18,11 @@ static void player_changed_area(struct NetworkPlayer *np, s16 courseNum, s16 act
if (npLevelAreaMatch == NULL || inCredits) {
// no NetworkPlayer in the level
network_send_sync_valid(np, courseNum, actNum, levelNum, areaIndex);
network_send_level_area_inform(np);
return;
}
// matching NetworkPlayer is client
network_send_area_request(np, npLevelAreaMatch);
network_send_level_area_inform(np);
}
void network_send_change_area(void) {
@ -52,9 +49,9 @@ void network_send_change_area(void) {
packet_write(&p, &gCurrAreaIndex, sizeof(s16));
network_send_to(gNetworkPlayerServer->localIndex, &p);
struct NetworkPlayer *np = gNetworkPlayerLocal;
network_player_update_course_level(np, gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex);
struct NetworkPlayer* np = gNetworkPlayerLocal;
np->currAreaSyncValid = false;
network_player_update_course_level(np, gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex);
LOG_INFO("tx change area");
}

View file

@ -7,9 +7,9 @@
static void player_changed_level(struct NetworkPlayer *np, s16 courseNum, s16 actNum, s16 levelNum, s16 areaIndex) {
// set NetworkPlayer variables
network_player_update_course_level(np, courseNum, actNum, levelNum, areaIndex);
np->currLevelSyncValid = false;
np->currAreaSyncValid = false;
network_player_update_course_level(np, courseNum, actNum, levelNum, areaIndex);
reservation_area_change(np);
// find a NetworkPlayer around that location
@ -21,7 +21,6 @@ static void player_changed_level(struct NetworkPlayer *np, s16 courseNum, s16 ac
if (npAny == NULL || inCredits) {
// no NetworkPlayer in the level
network_send_sync_valid(np, courseNum, actNum, levelNum, areaIndex);
network_send_level_area_inform(np);
return;
}
@ -31,7 +30,6 @@ static void player_changed_level(struct NetworkPlayer *np, s16 courseNum, s16 ac
} else {
network_send_level_request(np, npAny);
}
network_send_level_area_inform(np);
}
void network_send_change_level(void) {
@ -58,10 +56,10 @@ void network_send_change_level(void) {
packet_write(&p, &gCurrAreaIndex, sizeof(s16));
network_send_to(gNetworkPlayerServer->localIndex, &p);
struct NetworkPlayer *np = gNetworkPlayerLocal;
network_player_update_course_level(np, gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex);
struct NetworkPlayer* np = gNetworkPlayerLocal;
np->currAreaSyncValid = false;
np->currLevelSyncValid = false;
network_player_update_course_level(np, gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex);
LOG_INFO("tx change level");
}

View file

@ -8,37 +8,27 @@
#include "game/level_info.h"
#include "game/mario_misc.h"
static u16 sLevelAreaInformSeq[MAX_PLAYERS][MAX_PLAYERS] = { 0 };
void network_send_level_area_inform(void) {
struct NetworkPlayer* np = gNetworkPlayerLocal;
if (np == NULL) { return; }
np->currLevelAreaSeqId++;
void network_send_level_area_inform(struct NetworkPlayer *np) {
SOFT_ASSERT(gNetworkType == NT_SERVER);
for (s32 i = 1; i < MAX_PLAYERS; i++) {
struct NetworkPlayer *np2 = &gNetworkPlayers[i];
if (!np2->connected) { continue; }
if (np2->localIndex == np->localIndex) { continue; }
u16 seq = ++sLevelAreaInformSeq[np->globalIndex][i];
struct Packet p = { 0 };
packet_init(&p, PACKET_LEVEL_AREA_INFORM, true, PLMT_NONE);
packet_write(&p, &seq, sizeof(u16));
packet_write(&p, &np->globalIndex, sizeof(u8));
packet_write(&p, &np->currCourseNum, sizeof(s16));
packet_write(&p, &np->currActNum, sizeof(s16));
packet_write(&p, &np->currLevelNum, sizeof(s16));
packet_write(&p, &np->currAreaIndex, sizeof(s16));
packet_write(&p, &np->currLevelSyncValid, sizeof(u8));
packet_write(&p, &np->currAreaSyncValid, sizeof(u8));
network_send_to(np2->localIndex, &p);
}
struct Packet p = { 0 };
packet_init(&p, PACKET_LEVEL_AREA_INFORM, true, PLMT_NONE);
packet_write(&p, &np->currLevelAreaSeqId, sizeof(u16));
packet_write(&p, &np->globalIndex, sizeof(u8));
packet_write(&p, &np->currCourseNum, sizeof(s16));
packet_write(&p, &np->currActNum, sizeof(s16));
packet_write(&p, &np->currLevelNum, sizeof(s16));
packet_write(&p, &np->currAreaIndex, sizeof(s16));
packet_write(&p, &np->currLevelSyncValid, sizeof(u8));
packet_write(&p, &np->currAreaSyncValid, sizeof(u8));
network_send(&p);
LOG_INFO("tx level area inform for global %d: (%d, %d, %d, %d)", np->globalIndex, np->currCourseNum, np->currActNum, np->currLevelNum, np->currAreaIndex);
}
void network_receive_level_area_inform(struct Packet *p) {
SOFT_ASSERT(gNetworkType != NT_SERVER);
void network_receive_level_area_inform(struct Packet* p) {
u16 seq;
u8 globalIndex;
s16 courseNum, actNum, levelNum, areaIndex;
@ -61,14 +51,14 @@ void network_receive_level_area_inform(struct Packet *p) {
}
if (np == gNetworkPlayerLocal) { return; }
if (sLevelAreaInformSeq[0][globalIndex] >= seq && abs(sLevelAreaInformSeq[0][globalIndex] - seq) < 256) {
LOG_INFO("Received old level area inform seq: %d vs %d", sLevelAreaInformSeq[0][globalIndex], seq);
if (np->currLevelAreaSeqId >= seq && abs(np->currLevelAreaSeqId - seq) < 256) {
LOG_INFO("Received old level area inform seq: %d vs %d", np->currLevelAreaSeqId, seq);
return;
}
sLevelAreaInformSeq[0][globalIndex] = seq;
network_player_update_course_level(np, courseNum, actNum, levelNum, areaIndex);
np->currLevelAreaSeqId = seq;
np->currLevelSyncValid = levelSyncValid;
np->currAreaSyncValid = areaSyncValid;
}
network_player_update_course_level(np, courseNum, actNum, levelNum, areaIndex);
}

View file

@ -106,9 +106,9 @@ void network_receive_network_players(struct Packet *p) {
struct NetworkPlayer *np = &gNetworkPlayers[localIndex];
if (localIndex != 0) {
np->currLevelAreaSeqId = levelAreaSeqId;
network_player_update_course_level(np, courseNum, actNum, levelNum, areaIndex);
np->currLevelSyncValid = levelSyncValid;
np->currAreaSyncValid = areaSyncValid;
network_player_update_course_level(np, courseNum, actNum, levelNum, areaIndex);
LOG_INFO("received network player location (%d, %d, %d, %d)", courseNum, actNum, levelNum, areaIndex);
if (gNetworkType == NT_CLIENT && globalIndex != 0 && localIndex != 0) {
gNetworkSystem->save_id(localIndex, networkId);

View file

@ -5,7 +5,7 @@
#include "pc/debuglog.h"
void network_send_sync_valid(struct NetworkPlayer* toNp, s16 courseNum, s16 actNum, s16 levelNum, s16 areaIndex) {
bool wasAreaSyncValid = toNp->currAreaSyncValid;
bool wasSyncValid = (toNp->currLevelSyncValid && toNp->currAreaSyncValid);
// set the NetworkPlayers sync valid
toNp->currLevelSyncValid = true;
@ -16,13 +16,10 @@ void network_send_sync_valid(struct NetworkPlayer* toNp, s16 courseNum, s16 actN
gNetworkAreaSyncing = false;
// call hooks
if (toNp == gNetworkPlayerLocal && !wasAreaSyncValid) {
network_player_update_course_level(toNp, courseNum, actNum, levelNum, (areaIndex != -1) ? areaIndex : toNp->currAreaIndex);
if (!wasSyncValid) {
network_player_update_course_level(toNp, courseNum, actNum, levelNum, areaIndex);
smlua_call_event_hooks(HOOK_ON_SYNC_VALID);
}
// but we do need to send level area inform
network_send_level_area_inform(toNp);
return;
}
@ -64,12 +61,12 @@ void network_receive_sync_valid(struct Packet* p) {
return;
}
bool wasAreaSyncValid = np->currAreaSyncValid;
bool wasSyncValid = (np->currLevelSyncValid && np->currAreaSyncValid);
np->currLevelSyncValid = true;
np->currAreaSyncValid = true;
if (np == gNetworkPlayerLocal && !wasAreaSyncValid) {
network_player_update_course_level(np, courseNum, actNum, levelNum, (areaIndex != -1) ? areaIndex : np->currAreaIndex);
if (np == gNetworkPlayerLocal && !wasSyncValid) {
network_player_update_course_level(np, courseNum, actNum, levelNum, areaIndex);
smlua_call_event_hooks(HOOK_ON_SYNC_VALID);
}
@ -79,11 +76,6 @@ void network_receive_sync_valid(struct Packet* p) {
network_send_sync_valid(gNetworkPlayerServer, courseNum, actNum, levelNum, areaIndex);
}
// inform everyone that this player is valid
if (gNetworkType == NT_SERVER) {
network_send_level_area_inform(np);
}
// we're no longer syncing
gNetworkAreaSyncing = false;
}