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