diff --git a/lib/coopnet/linux/libcoopnet.a b/lib/coopnet/linux/libcoopnet.a index b60075fbc..e9139df66 100644 Binary files a/lib/coopnet/linux/libcoopnet.a and b/lib/coopnet/linux/libcoopnet.a differ diff --git a/src/pc/discord/discord_activity.c b/src/pc/discord/discord_activity.c index be0015010..794035c42 100644 --- a/src/pc/discord/discord_activity.c +++ b/src/pc/discord/discord_activity.c @@ -10,6 +10,8 @@ extern struct DiscordApplication app; struct DiscordActivity sCurActivity = { 0 }; static int sQueuedLobby = 0; +static uint64_t sQueuedLobbyId = 0; +static char sQueuedLobbyPassword[64] = ""; static void on_activity_update_callback(UNUSED void* data, enum EDiscordResult result) { LOG_INFO("> on_activity_update_callback returned %d", result); @@ -31,7 +33,7 @@ static void on_activity_join(UNUSED void* data, const char* secret) { // extract lobby ID token = strtok(NULL, ":"); char* end; - u64 lobbyId = strtoll(token, &end, 10); + u64 lobbyId = strtoull(token, &end, 10); // extract lobby password token = strtok(NULL, ":"); @@ -41,8 +43,8 @@ static void on_activity_join(UNUSED void* data, const char* secret) { if (gNetworkType != NT_NONE) { network_shutdown(true, false, false, false); } - gCoopNetDesiredLobby = lobbyId; - snprintf(gCoopNetPassword, 64, "%s", token); + sQueuedLobbyId = lobbyId; + snprintf(sQueuedLobbyPassword, 64, "%s", token); sQueuedLobby = 2; #endif } @@ -138,6 +140,8 @@ void discord_activity_update(void) { void discord_activity_update_check(void) { if (sQueuedLobby > 0) { if (--sQueuedLobby == 0) { + gCoopNetDesiredLobby = sQueuedLobbyId; + snprintf(gCoopNetPassword, 64, "%s", sQueuedLobbyPassword); network_reset_reconnect_and_rehost(); network_set_system(NS_COOPNET); network_init(NT_CLIENT, false); diff --git a/src/pc/network/coopnet/coopnet.c b/src/pc/network/coopnet/coopnet.c index 8c2928ed1..92c3f2fda 100644 --- a/src/pc/network/coopnet/coopnet.c +++ b/src/pc/network/coopnet/coopnet.c @@ -173,6 +173,11 @@ static int ns_coopnet_network_send(u8 localIndex, void* address, u8* data, u16 d return 0; } +static bool coopnet_allow_invite(void) { + if (sLocalLobbyId == 0) { return false; } + return (sLocalLobbyOwnerId == coopnet_get_local_user_id()) || (strlen(gCoopNetPassword) == 0); +} + static void ns_coopnet_get_lobby_id(UNUSED char* destination, UNUSED u32 destLength) { if (sLocalLobbyId == 0) { snprintf(destination, destLength, "%s", ""); @@ -182,7 +187,7 @@ static void ns_coopnet_get_lobby_id(UNUSED char* destination, UNUSED u32 destLen } static void ns_coopnet_get_lobby_secret(UNUSED char* destination, UNUSED u32 destLength) { - if (sLocalLobbyId == 0) { + if (sLocalLobbyId == 0 || !coopnet_allow_invite()) { snprintf(destination, destLength, "%s", ""); } else { snprintf(destination, destLength, "coopnet:%" PRIu64":%s", sLocalLobbyId, gCoopNetPassword); diff --git a/src/pc/network/network_player.c b/src/pc/network/network_player.c index ac1b4ed37..70376c5a1 100644 --- a/src/pc/network/network_player.c +++ b/src/pc/network/network_player.c @@ -10,6 +10,7 @@ #include "game/hardcoded.h" #include "game/object_helpers.h" #include "pc/lua/smlua_hooks.h" +#include "pc/network/socket/socket.h" #include "lag_compensation.h" #ifdef DISCORD_SDK #include "pc/discord/discord.h" @@ -179,13 +180,15 @@ void network_player_update(void) { if (!np->connected && i > 0) { continue; } float elapsed = (clock_elapsed() - np->lastReceived); -#ifndef DEVELOPMENT +#ifdef DEVELOPMENT + if (elapsed > NETWORK_PLAYER_TIMEOUT && (gNetworkSystem != &gNetworkSystemSocket)) { +#else if (elapsed > NETWORK_PLAYER_TIMEOUT) { +#endif LOG_INFO("dropping player %d", i); network_player_disconnected(i); continue; } -#endif elapsed = (clock_elapsed() - np->lastSent); if (elapsed > NETWORK_PLAYER_TIMEOUT / 3.0f) { network_send_keep_alive(np->localIndex); @@ -196,12 +199,14 @@ void network_player_update(void) { if (!np->connected) { return; } float elapsed = (clock_elapsed() - np->lastReceived); -#ifndef DEVELOPMENT +#ifdef DEVELOPMENT + if (elapsed > NETWORK_PLAYER_TIMEOUT * 1.5f && (gNetworkSystem != &gNetworkSystemSocket)) { +#else if (elapsed > NETWORK_PLAYER_TIMEOUT * 1.5f) { +#endif LOG_INFO("dropping due to no server connectivity"); network_shutdown(false, false, true, false); } -#endif elapsed = (clock_elapsed() - np->lastSent); if (elapsed > NETWORK_PLAYER_TIMEOUT / 3.0f) {