Merge pull request #1524 from aws-lumberyard-dev/mp_session_destroy

Adjust cleanup logic to handle Session events more cohesively
This commit is contained in:
AMZN-puvvadar
2021-06-23 15:44:37 -07:00
committed by GitHub
5 changed files with 36 additions and 17 deletions
@@ -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);
@@ -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
@@ -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;
}
@@ -214,20 +214,26 @@ namespace Multiplayer
return m_networkInterface->Connect(address) != InvalidConnectionId;
}
void MultiplayerSystemComponent::Terminate()
void MultiplayerSystemComponent::Terminate(AzNetworking::DisconnectReason reason)
{
auto visitor = [](IConnection& connection) { connection.Disconnect(DisconnectReason::TerminatedByUser, TerminationEndpoint::Local); };
// Cleanup connections, fire events and uninitialize state
auto visitor = [reason](IConnection& connection) { connection.Disconnect(reason, 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)
@@ -243,7 +249,7 @@ namespace Multiplayer
{
if (GetAgentType() == MultiplayerAgentType::Client)
{
Terminate();
Terminate(DisconnectReason::TerminatedByUser);
}
}
@@ -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::TerminatedByServer, 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)
@@ -702,7 +716,7 @@ namespace Multiplayer
{
if (m_networkInterface->GetConnectionSet().GetActiveConnectionCount() == 0)
{
Terminate();
Terminate(DisconnectReason::TerminatedByServer);
}
}
}
@@ -975,7 +989,7 @@ namespace Multiplayer
void disconnect([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments)
{
AZ::Interface<IMultiplayer>::Get()->Terminate();
AZ::Interface<IMultiplayer>::Get()->Terminate(DisconnectReason::TerminatedByUser);
}
AZ_CONSOLEFREEFUNC(disconnect, AZ::ConsoleFunctorFlags::DontReplicate, "Disconnects any open multiplayer connections");
}
@@ -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;