From e7f06691a548a6b9aa272d045308783a1166306e Mon Sep 17 00:00:00 2001 From: EmeraldLockdown <86802223+EmeraldLoc@users.noreply.github.com> Date: Mon, 2 Mar 2026 21:57:24 -0600 Subject: [PATCH] syncing (should) work now --- src/pc/network/network.c | 2 + src/pc/network/packets/packet.c | 2 + src/pc/network/packets/packet.h | 12 ++- src/pc/network/packets/packet_download.c | 2 +- .../packets/packet_download_save_files.c | 97 +++++++++++++++++++ src/pc/network/packets/packet_reliable.c | 2 + 6 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 src/pc/network/packets/packet_download_save_files.c diff --git a/src/pc/network/network.c b/src/pc/network/network.c index 6bd1d4882..31f880991 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -239,6 +239,8 @@ bool network_allow_unknown_local_index(enum PacketType packetType) { || (packetType == PACKET_MOD_LIST_ENTRY) || (packetType == PACKET_MOD_LIST_FILE) || (packetType == PACKET_MOD_LIST_DONE) + || (packetType == PACKET_DOWNLOAD_SAVE_REQUEST) + || (packetType == PACKET_DOWNLOAD_SAVE_FILE) || (packetType == PACKET_DOWNLOAD_REQUEST) || (packetType == PACKET_DOWNLOAD) || (packetType == PACKET_KEEP_ALIVE) diff --git a/src/pc/network/packets/packet.c b/src/pc/network/packets/packet.c index 199a88e5a..67dd43fa6 100644 --- a/src/pc/network/packets/packet.c +++ b/src/pc/network/packets/packet.c @@ -95,6 +95,8 @@ void packet_process(struct Packet* p) { case PACKET_MODERATOR: network_receive_moderator(p); break; case PACKET_KEEP_ALIVE: network_receive_keep_alive(p); break; case PACKET_LEAVING: network_receive_leaving(p); break; + case PACKET_DOWNLOAD_SAVE_REQUEST: network_receive_download_saves_request(p); break; + case PACKET_DOWNLOAD_SAVE_FILE: network_receive_download_save(p); break; case PACKET_SAVE_FILE: network_receive_save_file(p); break; case PACKET_SAVE_SET_FLAG: network_receive_save_set_flag(p); break; case PACKET_SAVE_REMOVE_FLAG: network_receive_save_remove_flag(p); break; diff --git a/src/pc/network/packets/packet.h b/src/pc/network/packets/packet.h index 5ab859760..48290584f 100644 --- a/src/pc/network/packets/packet.h +++ b/src/pc/network/packets/packet.h @@ -31,6 +31,9 @@ enum PacketType { PACKET_KICK, PACKET_KEEP_ALIVE, PACKET_LEAVING, + PACKET_DOWNLOAD_SAVE_REQUEST, + PACKET_DOWNLOAD_SAVE_FILE, + PACKET_FINISHED_DOWNLOAD_SAVE_FILE, PACKET_SAVE_FILE, PACKET_SAVE_SET_FLAG, PACKET_SAVE_REMOVE_FLAG, @@ -74,7 +77,7 @@ enum PacketType { PACKET_LUA_CUSTOM, PACKET_LUA_CUSTOM_BYTESTRING, - + PACKET_COMMAND, PACKET_MODERATOR, @@ -256,6 +259,12 @@ void network_receive_keep_alive(struct Packet* p); void network_send_leaving(u8 globalIndex); void network_receive_leaving(struct Packet* p); +// packet_download_save_files.c +void network_send_download_save_files_request(void); +void network_receive_download_saves_request(UNUSED struct Packet* p); +void network_send_download_save(int chunk); +void network_receive_download_save(struct Packet* p); + // packet_save_file.c void network_send_save_file(s32 fileIndex); void network_receive_save_file(struct Packet* p); @@ -308,7 +317,6 @@ void network_send_area_request(struct NetworkPlayer* fromNp, struct NetworkPlaye void network_receive_area_request(struct Packet* p); // packet_area.c - void area_remove_sync_ids_add(u32 syncId); void area_remove_sync_ids_clear(void); void network_send_area(struct NetworkPlayer* toNp); diff --git a/src/pc/network/packets/packet_download.c b/src/pc/network/packets/packet_download.c index ab5aa4917..b10ab9606 100644 --- a/src/pc/network/packets/packet_download.c +++ b/src/pc/network/packets/packet_download.c @@ -199,7 +199,7 @@ static void network_update_offset_groups(void) { mod->enabled = true; } LOG_INFO("Download complete!"); - network_send_join_request(); + network_send_download_save_files_request(); return; } diff --git a/src/pc/network/packets/packet_download_save_files.c b/src/pc/network/packets/packet_download_save_files.c new file mode 100644 index 000000000..1dafb1383 --- /dev/null +++ b/src/pc/network/packets/packet_download_save_files.c @@ -0,0 +1,97 @@ +#include +#include "../network.h" +#include "PR/os_eeprom.h" +#include "game/save_file.h" +#include "pc/debuglog.h" + +extern u8* gOverrideEeprom; +static u8 eeprom[NUM_SAVE_FILES][EEPROM_SIZE] = { 0 }; +static int filledEepromData = 0; +static int chunks = (NUM_SAVE_FILES * EEPROM_SIZE + (PACKET_LENGTH - 8) - 1) / (PACKET_LENGTH - 8); + +void network_send_download_save_files_request(void) { + SOFT_ASSERT(gNetworkType == NT_CLIENT); + + filledEepromData = 0; + + struct Packet p = { 0 }; + packet_init(&p, PACKET_DOWNLOAD_SAVE_REQUEST, true, PLMT_NONE); + + network_send_to((gNetworkPlayerServer != NULL) ? gNetworkPlayerServer->localIndex : 0, &p); + LOG_INFO("sending download save files request"); +} + +void network_receive_download_saves_request(UNUSED struct Packet* p) { + SOFT_ASSERT(gNetworkType == NT_SERVER); + + for (int i = 0; i < chunks; i++) { + network_send_download_save(i); + } + + LOG_INFO("sending save info"); +} + +void network_send_download_save(int chunk) { + SOFT_ASSERT(gNetworkType == NT_SERVER); + + int startingSaveFile = chunk * (NUM_SAVE_FILES + chunks - 1) / chunks; + int endSaveFile = (chunk + 1) * (NUM_SAVE_FILES + chunks - 1) / chunks; + if (endSaveFile > NUM_SAVE_FILES) endSaveFile = NUM_SAVE_FILES; + + struct Packet p = { 0 }; + packet_init(&p, PACKET_DOWNLOAD_SAVE_FILE, true, PLMT_NONE); + packet_write(&p, &startingSaveFile, sizeof(startingSaveFile)); + packet_write(&p, &endSaveFile, sizeof(endSaveFile)); + + for (int i = startingSaveFile; i < endSaveFile; i++) { + u8 content[EEPROM_SIZE] = { 0 }; + char filePath[256]; + save_file_get_dir(i, filePath, 256, NULL); + fs_file_t* fp = fs_open(filePath); + if (fp != NULL) { + fs_read(fp, content, EEPROM_SIZE); + fs_close(fp); + } + packet_write(&p, content, sizeof(content)); + } + + network_send_to(0, &p); +} + +void network_receive_download_save(struct Packet* p) { + SOFT_ASSERT(gNetworkType == NT_CLIENT); + + if (p->localIndex != UNKNOWN_LOCAL_INDEX) { + if (gNetworkPlayerServer == NULL || gNetworkPlayerServer->localIndex != p->localIndex) { + LOG_ERROR("Received download from known local index '%d'", p->localIndex); + return; + } + } + + if (filledEepromData >= NUM_SAVE_FILES * EEPROM_SIZE) { + LOG_ERROR("Received eeprom data after eeprom was filled"); + djui_popup_create(DLANG(NOTIF, DISCONNECT_CLOSED), 1); + network_shutdown(false, false, false, false); + return; + } + + int startingSaveFile = 0; + int endSaveFile = 0; + packet_read(p, &startingSaveFile, sizeof(startingSaveFile)); + packet_read(p, &endSaveFile, sizeof(endSaveFile)); + + for (int i = startingSaveFile; i < endSaveFile; i++) { + packet_read(p, &eeprom[i], sizeof(eeprom[i])); + filledEepromData += EEPROM_SIZE; + } + + if (filledEepromData == NUM_SAVE_FILES * EEPROM_SIZE) { + filledEepromData = 0; + network_send_join_request(); + } else if (filledEepromData > NUM_SAVE_FILES * EEPROM_SIZE) { + LOG_ERROR("Filled eeprom data too much! Should be %d, but is %d", NUM_SAVE_FILES * EEPROM_SIZE, filledEepromData); + djui_popup_create(DLANG(NOTIF, DISCONNECT_CLOSED), 1); + network_shutdown(false, false, false, false); + return; + } +} diff --git a/src/pc/network/packets/packet_reliable.c b/src/pc/network/packets/packet_reliable.c index a1176a311..1486b1165 100644 --- a/src/pc/network/packets/packet_reliable.c +++ b/src/pc/network/packets/packet_reliable.c @@ -130,6 +130,8 @@ void network_remember_reliable(struct Packet* p) { static float adjust_max_elapsed(enum PacketType packetType, float maxElapsed) { switch (packetType) { + case PACKET_DOWNLOAD_SAVE_REQUEST: + case PACKET_DOWNLOAD_SAVE_FILE: case PACKET_DOWNLOAD_REQUEST: case PACKET_DOWNLOAD: case PACKET_MOD_LIST_REQUEST: