From 33f6d643be93f390cb6006f9ce23098200a5bbe6 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Sun, 7 Jan 2024 22:01:20 +0100 Subject: [PATCH] port: net: add command line arguments for quick hosting and joining --- port/include/net/net.h | 3 +++ port/src/net/net.c | 23 +++++++++++++++++++++++ port/src/net/netmenu.c | 8 ++++---- src/game/mainmenu.c | 15 +++++++++++++++ 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/port/include/net/net.h b/port/include/net/net.h index db0e02616..32db191ec 100644 --- a/port/include/net/net.h +++ b/port/include/net/net.h @@ -105,6 +105,9 @@ struct netclient { extern s32 g_NetMode; +extern s32 g_NetJoinLatch; +extern s32 g_NetHostLatch; + // net frame, ticks at 60 fps, starts at 0 when the server is started extern u32 g_NetTick; extern u32 g_NetNextSyncId; diff --git a/port/src/net/net.c b/port/src/net/net.c index 350aac3c7..869019d24 100644 --- a/port/src/net/net.c +++ b/port/src/net/net.c @@ -30,6 +30,9 @@ s32 g_NetMode = NETMODE_NONE; +s32 g_NetHostLatch = false; +s32 g_NetJoinLatch = false; + u32 g_NetServerUpdateRate = 1; u32 g_NetServerInRate = 128 * 1024; u32 g_NetServerOutRate = 128 * 1024; @@ -334,6 +337,26 @@ void netInit(void) return; } + const s32 argmaxclients = sysArgGetInt("--maxclients", -1); + if (argmaxclients > 0) { + g_NetMaxClients = argmaxclients; + } + + const s32 argport = sysArgGetInt("--port", -1); + if (argport > 0 && argport < 0x10000) { + g_NetServerPort = argport; + } + + const char *argjoin = sysArgGetString("--connect"); + if (argjoin) { + strncpy(g_NetLastJoinAddr, argjoin, sizeof(g_NetLastJoinAddr) - 1); + g_NetJoinLatch = true; + } + + if (sysArgCheck("--host")) { + g_NetHostLatch = true; + } + g_NetInit = true; } diff --git a/port/src/net/netmenu.c b/port/src/net/netmenu.c index c9e944c41..779beb84d 100644 --- a/port/src/net/netmenu.c +++ b/port/src/net/netmenu.c @@ -56,7 +56,7 @@ static char *menuhandlerHostPortValue(struct menuitem *item) return tmp; } -static MenuItemHandlerResult menuhandlerHostStart(s32 operation, struct menuitem *item, union handlerdata *data) +MenuItemHandlerResult menuhandlerHostStart(s32 operation, struct menuitem *item, union handlerdata *data) { if (operation == MENUOP_SET) { if (netStartServer(g_NetMenuPort, g_NetMenuMaxPlayers) == 0) { @@ -292,7 +292,7 @@ static MenuItemHandlerResult menuhandlerJoinAddress(s32 operation, struct menuit return 0; } -static MenuItemHandlerResult menuhandlerJoinStart(s32 operation, struct menuitem *item, union handlerdata *data) +MenuItemHandlerResult menuhandlerJoinStart(s32 operation, struct menuitem *item, union handlerdata *data) { if (operation == MENUOP_SET) { if (netStartClient(g_NetJoinAddr) == 0) { @@ -350,7 +350,7 @@ struct menudialogdef g_NetJoinMenuDialog = { /* main */ -static MenuItemHandlerResult menuhandlerHostGame(s32 operation, struct menuitem *item, union handlerdata *data) +MenuItemHandlerResult menuhandlerHostGame(s32 operation, struct menuitem *item, union handlerdata *data) { if (operation == MENUOP_SET) { g_NetMenuPort = g_NetServerPort; @@ -360,7 +360,7 @@ static MenuItemHandlerResult menuhandlerHostGame(s32 operation, struct menuitem return 0; } -static MenuItemHandlerResult menuhandlerJoinGame(s32 operation, struct menuitem *item, union handlerdata *data) +MenuItemHandlerResult menuhandlerJoinGame(s32 operation, struct menuitem *item, union handlerdata *data) { if (operation == MENUOP_SET) { if (g_NetJoinAddr[0] == '\0') { diff --git a/src/game/mainmenu.c b/src/game/mainmenu.c index 3c28cb34a..00998fc26 100644 --- a/src/game/mainmenu.c +++ b/src/game/mainmenu.c @@ -45,6 +45,10 @@ struct menudialogdef g_CinemaMenuDialog; #ifndef PLATFORM_N64 extern struct menudialogdef g_ExtendedMenuDialog; extern struct menudialogdef g_NetMenuDialog; +extern MenuItemHandlerResult menuhandlerJoinGame(s32 operation, struct menuitem *item, union handlerdata *data); +extern MenuItemHandlerResult menuhandlerJoinStart(s32 operation, struct menuitem *item, union handlerdata *data); +extern MenuItemHandlerResult menuhandlerHostGame(s32 operation, struct menuitem *item, union handlerdata *data); +extern MenuItemHandlerResult menuhandlerHostStart(s32 operation, struct menuitem *item, union handlerdata *data); #endif char *menuTextCurrentStageName(struct menuitem *item) @@ -4881,6 +4885,17 @@ MenuDialogHandlerResult menudialogMainMenu(s32 operation, struct menudialogdef * g_MissionConfig.iscoop = false; g_MissionConfig.isanti = false; } +#ifndef PLATFORM_N64 + if (g_NetJoinLatch) { + menuhandlerJoinGame(MENUOP_SET, NULL, NULL); + menuhandlerJoinStart(MENUOP_SET, NULL, NULL); + g_NetJoinLatch = false; + } else if (g_NetHostLatch) { + menuhandlerHostGame(MENUOP_SET, NULL, NULL); + menuhandlerHostStart(MENUOP_SET, NULL, NULL); + g_NetHostLatch = false; + } +#endif break; }