From bda758a9c57ad6ca9dfaee08801089b9fa57d959 Mon Sep 17 00:00:00 2001 From: puvvadar Date: Wed, 23 Jun 2021 10:56:22 -0700 Subject: [PATCH 1/2] Adjust cleanup logic to handle Session events more cohesively --- .../UdpTransport/UdpConnection.cpp | 4 +++ .../Multiplayer/MultiplayerConstants.h | 4 +-- .../Source/MultiplayerSystemComponent.cpp | 30 ++++++++++++++----- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpConnection.cpp b/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpConnection.cpp index 9aaee2e095..c76fcbd32b 100644 --- a/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpConnection.cpp +++ b/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpConnection.cpp @@ -115,6 +115,10 @@ namespace AzNetworking bool UdpConnection::Disconnect(DisconnectReason reason, TerminationEndpoint endpoint) { + if (m_state == ConnectionState::Disconnected) + { + return true; + } if (m_state == ConnectionState::Disconnecting) { AZStd::string reasonString = ToString(reason); diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerConstants.h b/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerConstants.h index b82fab91be..05c8b1fc78 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerConstants.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerConstants.h @@ -25,8 +25,8 @@ namespace Multiplayer constexpr AZStd::string_view MPEditorInterfaceName("MultiplayerEditorNetworkInterface"); constexpr AZStd::string_view LocalHost("127.0.0.1"); - constexpr uint16_t DefaultServerPort = 30090; - constexpr uint16_t DefaultServerEditorPort = 30091; + constexpr uint16_t DefaultServerPort = 33450; + constexpr uint16_t DefaultServerEditorPort = 33451; } diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp index 6ad23967cb..fc176447ec 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp @@ -216,18 +216,24 @@ namespace Multiplayer void MultiplayerSystemComponent::Terminate() { + // Cleanup connections, fire events and uninitialize state auto visitor = [](IConnection& connection) { connection.Disconnect(DisconnectReason::TerminatedByUser, TerminationEndpoint::Local); }; m_networkInterface->GetConnectionSet().VisitConnections(visitor); if (GetAgentType() == MultiplayerAgentType::DedicatedServer || GetAgentType() == MultiplayerAgentType::ClientServer) { m_networkInterface->StopListening(); m_shutdownEvent.Signal(m_networkInterface); + } + InitializeMultiplayer(MultiplayerAgentType::Uninitialized); + + // Signal session management, do this after uninitializing state + if (GetAgentType() == MultiplayerAgentType::DedicatedServer || GetAgentType() == MultiplayerAgentType::ClientServer) + { if (AZ::Interface::Get() != nullptr) { AZ::Interface::Get()->HandleDestroySession(); } } - InitializeMultiplayer(MultiplayerAgentType::Uninitialized); } bool MultiplayerSystemComponent::RequestPlayerJoinSession(const AzFramework::SessionConnectionConfig& config) @@ -281,14 +287,22 @@ namespace Multiplayer bool MultiplayerSystemComponent::OnDestroySessionBegin() { - bool disconnectSuccessful = true; - IConnectionSet& connectionSet = m_networkInterface->GetConnectionSet(); - connectionSet.VisitConnections([&disconnectSuccessful](IConnection& connection) + // This can be triggered external from Multiplayer so only run if we are in an Initialized state + if (GetAgentType() == MultiplayerAgentType::Uninitialized) { - bool didDisconnect = connection.Disconnect(DisconnectReason::TerminatedByServer, TerminationEndpoint::Remote); - disconnectSuccessful = disconnectSuccessful && didDisconnect; - }); - return disconnectSuccessful; + return true; + } + + auto visitor = [](IConnection& connection) { connection.Disconnect(DisconnectReason::TerminatedByUser, TerminationEndpoint::Local); }; + m_networkInterface->GetConnectionSet().VisitConnections(visitor); + if (GetAgentType() == MultiplayerAgentType::DedicatedServer || GetAgentType() == MultiplayerAgentType::ClientServer) + { + m_networkInterface->StopListening(); + m_shutdownEvent.Signal(m_networkInterface); + } + InitializeMultiplayer(MultiplayerAgentType::Uninitialized); + + return true; } void MultiplayerSystemComponent::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time) From 632d774d4c5df4b5efabaa3fc90c9db3089bfcb3 Mon Sep 17 00:00:00 2001 From: puvvadar Date: Wed, 23 Jun 2021 11:44:21 -0700 Subject: [PATCH 2/2] Add disconnect type param to Terminate --- .../Code/Include/Multiplayer/IMultiplayer.h | 3 ++- .../Code/Source/MultiplayerSystemComponent.cpp | 12 ++++++------ .../Code/Source/MultiplayerSystemComponent.h | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/IMultiplayer.h b/Gems/Multiplayer/Code/Include/Multiplayer/IMultiplayer.h index cc1d1d56af..cbc49d6ea9 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/IMultiplayer.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/IMultiplayer.h @@ -94,7 +94,8 @@ namespace Multiplayer virtual bool Connect(AZStd::string remoteAddress, uint16_t port) = 0; // Disconnects all multiplayer connections, stops listening on the server and invokes handlers appropriate to network context - virtual void Terminate() = 0; + //! @param reason The reason for terminating connections + virtual void Terminate(AzNetworking::DisconnectReason reason) = 0; //! Adds a ClientDisconnectedEvent Handler which is invoked on the client when a disconnection occurs //! @param handler The ClientDisconnectedEvent Handler to add diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp index fc176447ec..9c2fa2f828 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp @@ -214,10 +214,10 @@ namespace Multiplayer return m_networkInterface->Connect(address) != InvalidConnectionId; } - void MultiplayerSystemComponent::Terminate() + void MultiplayerSystemComponent::Terminate(AzNetworking::DisconnectReason reason) { // Cleanup connections, fire events and uninitialize state - auto visitor = [](IConnection& connection) { connection.Disconnect(DisconnectReason::TerminatedByUser, TerminationEndpoint::Local); }; + auto visitor = [reason](IConnection& connection) { connection.Disconnect(reason, TerminationEndpoint::Local); }; m_networkInterface->GetConnectionSet().VisitConnections(visitor); if (GetAgentType() == MultiplayerAgentType::DedicatedServer || GetAgentType() == MultiplayerAgentType::ClientServer) { @@ -249,7 +249,7 @@ namespace Multiplayer { if (GetAgentType() == MultiplayerAgentType::Client) { - Terminate(); + Terminate(DisconnectReason::TerminatedByUser); } } @@ -293,7 +293,7 @@ namespace Multiplayer return true; } - auto visitor = [](IConnection& connection) { connection.Disconnect(DisconnectReason::TerminatedByUser, TerminationEndpoint::Local); }; + auto visitor = [](IConnection& connection) { connection.Disconnect(DisconnectReason::TerminatedByServer, TerminationEndpoint::Local); }; m_networkInterface->GetConnectionSet().VisitConnections(visitor); if (GetAgentType() == MultiplayerAgentType::DedicatedServer || GetAgentType() == MultiplayerAgentType::ClientServer) { @@ -716,7 +716,7 @@ namespace Multiplayer { if (m_networkInterface->GetConnectionSet().GetActiveConnectionCount() == 0) { - Terminate(); + Terminate(DisconnectReason::TerminatedByServer); } } } @@ -989,7 +989,7 @@ namespace Multiplayer void disconnect([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments) { - AZ::Interface::Get()->Terminate(); + AZ::Interface::Get()->Terminate(DisconnectReason::TerminatedByUser); } AZ_CONSOLEFREEFUNC(disconnect, AZ::ConsoleFunctorFlags::DontReplicate, "Disconnects any open multiplayer connections"); } diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h index cc5af38f04..8b030bd86f 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h @@ -114,7 +114,7 @@ namespace Multiplayer void AddSessionShutdownHandler(SessionShutdownEvent::Handler& handler) override; bool StartHosting(uint16_t port, bool isDedicated = true) override; bool Connect(AZStd::string remoteAddress, uint16_t port) override; - void Terminate() override; + void Terminate(AzNetworking::DisconnectReason reason) override; void SendReadyForEntityUpdates(bool readyForEntityUpdates) override; AZ::TimeMs GetCurrentHostTimeMs() const override; INetworkTime* GetNetworkTime() override;