From 28c7b01b9647dcf40ccc1f18bdcb1d8d31a8a6e1 Mon Sep 17 00:00:00 2001 From: KebsCS Date: Sat, 7 Sep 2024 17:44:02 +0200 Subject: [PATCH] Fix dummy disconnecting on hot reload --- src/engine/client.h | 2 +- src/engine/client/client.cpp | 29 ++++++++++++++++++++++++++-- src/engine/client/client.h | 4 +++- src/engine/server/server.cpp | 2 ++ src/engine/shared/protocol_ex_msgs.h | 1 + src/game/server/gamecontext.cpp | 2 ++ 6 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/engine/client.h b/src/engine/client.h index a9599f89b..2d9529493 100644 --- a/src/engine/client.h +++ b/src/engine/client.h @@ -163,7 +163,7 @@ public: // dummy virtual void DummyDisconnect(const char *pReason) = 0; - virtual void DummyConnect() = 0; + virtual void DummyConnect(bool Force = false) = 0; virtual bool DummyConnected() const = 0; virtual bool DummyConnecting() const = 0; virtual bool DummyConnectingDelayed() const = 0; diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 108bfcaf1..f26486aa0 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -707,7 +707,7 @@ bool CClient::DummyConnectingDelayed() const return !DummyConnected() && !DummyConnecting() && m_LastDummyConnectTime > 0.0f && m_LastDummyConnectTime + 5.0f > GlobalTime(); } -void CClient::DummyConnect() +void CClient::DummyConnect(bool Force) { if(m_aNetClient[CONN_MAIN].State() != NETSTATE_ONLINE) { @@ -725,7 +725,7 @@ void CClient::DummyConnect() log_info("client", "Dummy is already connected/connecting."); return; } - if(DummyConnectingDelayed()) + if(!Force && DummyConnectingDelayed()) { log_info("client", "Wait before connecting dummy again."); return; @@ -1649,9 +1649,24 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy) } } } + else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_MAP_RELOAD) + { + if(m_DummyConnected) + { + m_DummyReconnectOnLoad = true; + m_DummySwapOnReconnect = g_Config.m_ClDummy == 1 ? false : true; + } + else + m_DummySwapOnReconnect = false; + } else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_CON_READY) { GameClient()->OnConnected(); + if(m_DummyReconnectOnLoad) + { + m_DummyReconnectOnLoad = false; + DummyConnect(true); + } } else if(Conn == CONN_DUMMY && Msg == NETMSG_CON_READY) { @@ -2746,6 +2761,16 @@ void CClient::Update() } } + if(m_DummySwapOnReconnect && g_Config.m_ClDummy == 1) + { + m_DummySwapOnReconnect = false; + g_Config.m_ClDummy = 0; + } + else if(!m_DummyConnected && m_DummySwapOnReconnect) + { + m_DummySwapOnReconnect = false; + } + m_LastDummy = (bool)g_Config.m_ClDummy; } diff --git a/src/engine/client/client.h b/src/engine/client/client.h index b272f8eaa..00615282f 100644 --- a/src/engine/client/client.h +++ b/src/engine/client/client.h @@ -182,6 +182,8 @@ class CClient : public IClient, public CDemoPlayer::IListener bool m_DummyConnecting = false; bool m_DummyConnected = false; float m_LastDummyConnectTime = 0.0f; + bool m_DummyReconnectOnLoad = false; + bool m_DummySwapOnReconnect = false; // graphs CGraph m_InputtimeMarginGraph; @@ -319,7 +321,7 @@ public: void Disconnect() override; void DummyDisconnect(const char *pReason) override; - void DummyConnect() override; + void DummyConnect(bool Force = false) override; bool DummyConnected() const override; bool DummyConnecting() const override; bool DummyConnectingDelayed() const override; diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 65aaf57e7..e9a2a043b 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -3510,6 +3510,8 @@ void CServer::ConStopRecord(IConsole::IResult *pResult, void *pUser) void CServer::ConMapReload(IConsole::IResult *pResult, void *pUser) { ((CServer *)pUser)->m_MapReload = true; + CMsgPacker Msg(NETMSG_MAP_RELOAD, true); + ((CServer *)pUser)->SendMsg(&Msg, MSGFLAG_VITAL | MSGFLAG_FLUSH, -1); } void CServer::ConLogout(IConsole::IResult *pResult, void *pUser) diff --git a/src/engine/shared/protocol_ex_msgs.h b/src/engine/shared/protocol_ex_msgs.h index c1e792751..d137d5c17 100644 --- a/src/engine/shared/protocol_ex_msgs.h +++ b/src/engine/shared/protocol_ex_msgs.h @@ -35,3 +35,4 @@ UUID(NETMSG_CHECKSUM_ERROR, "checksum-error@ddnet.tw") UUID(NETMSG_REDIRECT, "redirect@ddnet.org") UUID(NETMSG_RCON_CMD_GROUP_START, "rcon-cmd-group-start@ddnet.org") UUID(NETMSG_RCON_CMD_GROUP_END, "rcon-cmd-group-end@ddnet.org") +UUID(NETMSG_MAP_RELOAD, "map-reload@ddnet.org") diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index 0dedf4cb9..c8b05bebe 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -3237,6 +3237,8 @@ void CGameContext::ConHotReload(IConsole::IResult *pResult, void *pUserData) pSelf->m_apSavedTeams[pSelf->m_aTeamMapping[i]]->Save(pSelf, pSelf->m_aTeamMapping[i], true, true); } pSelf->Server()->ReloadMap(); + CMsgPacker Msg(NETMSG_MAP_RELOAD, true); + pSelf->Server()->SendMsg(&Msg, MSGFLAG_VITAL | MSGFLAG_FLUSH, -1); } void CGameContext::ConAddVote(IConsole::IResult *pResult, void *pUserData)