From bda758a9c57ad6ca9dfaee08801089b9fa57d959 Mon Sep 17 00:00:00 2001 From: puvvadar Date: Wed, 23 Jun 2021 10:56:22 -0700 Subject: [PATCH] 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)