From 32e0c9eda21beba5615e9fa4dea2a386e80a6aee Mon Sep 17 00:00:00 2001 From: MysterD Date: Sat, 28 May 2022 00:49:28 -0700 Subject: [PATCH] Re-request level or area if stuck in invalid state for a while --- src/pc/network/network.c | 28 +++++++++++++++++++ src/pc/network/network.h | 2 +- src/pc/network/packets/packet_area_request.c | 1 + src/pc/network/packets/packet_level_request.c | 1 + 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/pc/network/network.c b/src/pc/network/network.c index 2ee1c4013..902ae0728 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -42,6 +42,7 @@ u32 gNetworkAreaTimerClock = 0; u32 gNetworkAreaTimer = 0; void* gNetworkServerAddr = NULL; bool gNetworkSentJoin = false; +u8 gNetworkRequestLocationTimer = 0; u8 gDebugPacketIdBuffer[256] = { 0xFF }; u8 gDebugPacketSentBuffer[256] = { 0 }; @@ -424,6 +425,33 @@ void network_update(void) { network_update_reliable(); packet_ordered_update(); } + + // update level/area request timers + struct NetworkPlayer* np = gNetworkPlayerLocal; + if (np != NULL && !np->currLevelSyncValid) { + gNetworkRequestLocationTimer++; + if (gNetworkRequestLocationTimer > 90) { + // find a NetworkPlayer around that location + struct NetworkPlayer *npLevelAreaMatch = get_network_player_from_area(np->currCourseNum, np->currActNum, np->currLevelNum, np->currAreaIndex); + struct NetworkPlayer *npLevelMatch = get_network_player_from_level(np->currCourseNum, np->currActNum, np->currLevelNum); + struct NetworkPlayer *npAny = (npLevelAreaMatch == NULL) ? npLevelMatch : npLevelAreaMatch; + + bool inCredits = (np->currActNum == 99); + if (npAny == NULL || inCredits) { + // no NetworkPlayer in the level + network_send_sync_valid(np, np->currCourseNum, np->currActNum, np->currLevelNum, np->currAreaIndex); + return; + } + + // matching NetworkPlayer is client + if (npAny == npLevelAreaMatch) { + network_send_level_area_request(np, npAny); + } else { + network_send_level_request(np, npAny); + } + } + } + } void network_register_mod(char* modName) { diff --git a/src/pc/network/network.h b/src/pc/network/network.h index 77a057095..d0fe5d11d 100644 --- a/src/pc/network/network.h +++ b/src/pc/network/network.h @@ -113,7 +113,7 @@ extern struct SyncObject gSyncObjects[]; extern struct ServerSettings gServerSettings; extern struct StringLinkedList gRegisteredMods; extern bool gNetworkSentJoin; - +extern u8 gNetworkRequestLocationTimer; extern u8 gDebugPacketIdBuffer[]; extern u8 gDebugPacketSentBuffer[]; extern u8 gDebugPacketOnBuffer; diff --git a/src/pc/network/packets/packet_area_request.c b/src/pc/network/packets/packet_area_request.c index 44db627d3..f4c6a7ea7 100644 --- a/src/pc/network/packets/packet_area_request.c +++ b/src/pc/network/packets/packet_area_request.c @@ -4,6 +4,7 @@ #include "pc/debuglog.h" void network_send_area_request(struct NetworkPlayer* fromNp, struct NetworkPlayer* toNp) { + gNetworkRequestLocationTimer = 0; if (gNetworkType == NT_SERVER && toNp == gNetworkPlayerLocal) { // requesting server's area, send it immediately network_send_area(fromNp); diff --git a/src/pc/network/packets/packet_level_request.c b/src/pc/network/packets/packet_level_request.c index dee5c413b..d1f05da7f 100644 --- a/src/pc/network/packets/packet_level_request.c +++ b/src/pc/network/packets/packet_level_request.c @@ -4,6 +4,7 @@ #include "pc/debuglog.h" void network_send_level_request(struct NetworkPlayer* fromNp, struct NetworkPlayer* toNp) { + gNetworkRequestLocationTimer = 0; if (gNetworkType == NT_SERVER && toNp == gNetworkPlayerLocal) { // requesting server's level, send it immediately network_send_level(fromNp, false);