Adjust cleanup logic to handle Session events more cohesively
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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<AzFramework::ISessionHandlingProviderRequests>::Get() != nullptr)
|
||||
{
|
||||
AZ::Interface<AzFramework::ISessionHandlingProviderRequests>::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)
|
||||
|
||||
Reference in New Issue
Block a user