-
-
Notifications
You must be signed in to change notification settings - Fork 8
Plugin settings
Logan McNaughton edited this page Mar 13, 2025
·
6 revisions
gopher64-netplay-server provides a way for clients to send and receive arbitrary data (usually, plugin settings).
Player 1 sends their settings, other players receive settings and overwrite their local values. This is done to prevent desyncs.
See the following example:
static void setup_netplay()
{
uint8_t settings_slot = 64; // slots 64-127 can be used for sending data
uint32_t settings_size = 4; // size, in bytes, of the settings data
char buffer[settings_size + 5];
buffer[0] = settings_slot; // send settings
uint32_t swapped_size = SDL_SwapBE32(settings_size); // settings_size must be in big endian format
memcpy(&buffer[1], &swapped_size, 4);
memcpy(&buffer[5], &vk_ssreadbacks, 1);
memcpy(&buffer[6], &vk_ssdither, 1);
memcpy(&buffer[7], &vk_native_texture_lod, 1);
memcpy(&buffer[8], &vk_native_tex_rect, 1);
m64p_error netplay_init = ConfigSendNetplayConfig(&buffer[0], sizeof(buffer));
if (netplay_init == M64ERR_INVALID_STATE) { // we are not player 1, receive settings
buffer[0] = settings_slot + 64; // get settings, the "get" slot is always +64 from the send slot
ConfigSendNetplayConfig(&buffer[0], 1);
ConfigReceiveNetplayConfig(&buffer[0], settings_size);
memcpy(&vk_ssreadbacks, &buffer[0], 1);
memcpy(&vk_ssdither, &buffer[1], 1);
memcpy(&vk_native_texture_lod, &buffer[2], 1);
memcpy(&vk_native_tex_rect, &buffer[3], 1);
DebugMessage(M64MSG_INFO, "Received Parallel RDP settings via netplay");
} else if (netplay_init == M64ERR_SUCCESS) {
DebugMessage(M64MSG_INFO, "Sent Parallel RDP settings via netplay");
}
if (netplay_init != M64ERR_NOT_INIT) { // netplay is enabled
DebugMessage(M64MSG_INFO, "Netplay enabled, disabling vsync");
vk_synchronous = 1; // force synchronous rdp during netplay
window_vsync = 0; // force disable vsync during netplay
}
}