From 1e874808e9404589f7fa5698cd37ae3b6742f5c3 Mon Sep 17 00:00:00 2001 From: Yukita Mayako <catgirl@goddess.moe> Date: Tue, 23 Feb 2016 20:18:10 -0500 Subject: [PATCH] Track leaving nodes better. --- src/d_clisrv.c | 1 - src/d_enet.c | 28 +++++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index b8eb320a3d..bea0623688 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -478,7 +478,6 @@ static boolean CL_SendJoin(void) nodewaiting[servernode]++; if (splitscreen || botingame) nodewaiting[servernode]++; - net_playercount = nodewaiting[servernode]; return true; } if (server) // no need to ask yourself if you can join! diff --git a/src/d_enet.c b/src/d_enet.c index 14b385ff85..4b3b5ad57e 100644 --- a/src/d_enet.c +++ b/src/d_enet.c @@ -33,12 +33,16 @@ enum { static ENetHost *ServerHost = NULL, *ClientHost = NULL; static ENetPeer *nodetopeer[MAXNETNODES]; -static UINT8 nodeleaving[MAXNETNODES]; typedef struct PeerData_s { UINT8 node; + UINT8 flags; } PeerData; +enum { + PEER_LEAVING = 1 +}; + static void ServerSendMapInfo(UINT8 node); boolean Net_GetNetStat(void) @@ -47,6 +51,15 @@ boolean Net_GetNetStat(void) return false; } +static void DisconnectNode(UINT8 node, UINT8 why) +{ + if (nodetopeer[node] == NULL) + return; + PeerData *pdata = nodetopeer[node]->data; + pdata->flags |= PEER_LEAVING; + enet_peer_disconnect(nodetopeer[node], why); +} + static void ServerHandlePacket(UINT8 node, DataWrap data) { switch(data->ReadUINT8(data)) @@ -58,8 +71,7 @@ static void ServerHandlePacket(UINT8 node, DataWrap data) if (version != VERSION || subversion != SUBVERSION) { CONS_Printf("NETWORK: Version mismatch!?\n"); - nodeleaving[node] = true; - enet_peer_disconnect(nodetopeer[node], DISCONNECT_VERSION); + DisconnectNode(node, DISCONNECT_VERSION); break; } char *name = data->ReadStringn(data, MAXPLAYERNAME); @@ -157,6 +169,8 @@ void Net_AckTicker(void) pdata = ZZ_Alloc(sizeof(*pdata)); pdata->node = i; + pdata->flags = 0; + e.peer->data = pdata; CONS_Printf("NETWORK: Node %u connected.\n", i); @@ -166,7 +180,7 @@ void Net_AckTicker(void) if (!e.peer->data) break; pdata = (PeerData *)e.peer->data; - if (!nodeleaving[pdata->node]) + if (!(pdata->flags & PEER_LEAVING)) { XBOXSTATIC UINT8 buf[2]; buf[0] = nodetoplayer[pdata->node]; @@ -179,7 +193,6 @@ void Net_AckTicker(void) } } net_nodecount--; - nodeleaving[pdata->node] = false; nodetopeer[pdata->node] = NULL; Z_Free(pdata); e.peer->data = NULL; @@ -325,10 +338,7 @@ void D_CloseConnection(void) void Net_CloseConnection(INT32 node) { - if (nodeleaving[node] || nodetopeer[node] == NULL) - return; - nodeleaving[node] = true; - enet_peer_disconnect(nodetopeer[node], 0); + DisconnectNode(node, 0); } // Client: Can I play? =3 My name is Player so-and-so! -- GitLab