Skip to content

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
    }
}
Clone this wiki locally