mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2026-04-28 04:51:40 +00:00
syncing (should) work now
This commit is contained in:
parent
fc5ad1ead8
commit
e7f06691a5
6 changed files with 114 additions and 3 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
97
src/pc/network/packets/packet_download_save_files.c
Normal file
97
src/pc/network/packets/packet_download_save_files.c
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
#include <stdio.h>
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue