Update based on feedback. Adding event to MPSystemComponent for receiving a server acceptance packet. The editor system component subscribes to this event and tells the server we're ready for entity updates

Signed-off-by: Gene Walters <genewalt@amazon.com>
This commit is contained in:
Gene Walters
2021-10-06 15:44:43 -07:00
parent cfba31f6a0
commit 26079f7350
5 changed files with 37 additions and 20 deletions
@@ -44,6 +44,7 @@ namespace Multiplayer
using ClientDisconnectedEvent = AZ::Event<>;
using ConnectionAcquiredEvent = AZ::Event<MultiplayerAgentDatum>;
using ServerAcceptanceReceivedEvent = AZ::Event<>;
using SessionInitEvent = AZ::Event<AzNetworking::INetworkInterface*>;
using SessionShutdownEvent = AZ::Event<AzNetworking::INetworkInterface*>;
@@ -102,6 +103,10 @@ namespace Multiplayer
//! @param handler The ConnectionAcquiredEvent Handler to add
virtual void AddConnectionAcquiredHandler(ConnectionAcquiredEvent::Handler& handler) = 0;
//! Adds a ServerAcceptanceReceived Handler which is invoked when the client receives the accept packet from the server.
//! @param handler The ServerAcceptanceReceived Handler to add
virtual void AddServerAcceptanceReceivedHandler(ServerAcceptanceReceivedEvent::Handler& handler) = 0;
//! Adds a SessionInitEvent Handler which is invoked when a new network session starts.
//! @param handler The SessionInitEvent Handler to add
virtual void AddSessionInitHandler(SessionInitEvent::Handler& handler) = 0;
@@ -62,6 +62,7 @@ namespace Multiplayer
}
MultiplayerEditorSystemComponent::MultiplayerEditorSystemComponent()
: m_serverAcceptanceReceivedHandler([this](){OnServerAcceptanceReceived();})
{
;
}
@@ -70,6 +71,7 @@ namespace Multiplayer
{
AzFramework::GameEntityContextEventBus::Handler::BusConnect();
AzToolsFramework::EditorEvents::Bus::Handler::BusConnect();
AZ::Interface<IMultiplayer>::Get()->AddServerAcceptanceReceivedHandler(m_serverAcceptanceReceivedHandler);
}
void MultiplayerEditorSystemComponent::Deactivate()
@@ -146,10 +148,8 @@ namespace Multiplayer
AZStd::replace(projectPath.begin(), projectPath.end(), AZ::IO::WindowsPathSeparator, AZ::IO::PosixPathSeparator);
AzFramework::ProcessLauncher::ProcessLaunchInfo processLaunchInfo;
processLaunchInfo.m_commandlineParameters = AZStd::string::format(
R"("%s" --project-path "%s" --editorsv_isDedicated true --sv_defaultPlayerSpawnAsset "%s")",
serverPath.c_str(),
projectPath.c_str(),
static_cast<AZ::CVarFixedString>(sv_defaultPlayerSpawnAsset).c_str());
R"("%s" --project-path "%s" --editorsv_isDedicated true --sv_defaultPlayerSpawnAsset "%s")", serverPath.c_str(),
projectPath.c_str(), static_cast<AZ::CVarFixedString>(sv_defaultPlayerSpawnAsset).c_str());
processLaunchInfo.m_showWindow = true;
processLaunchInfo.m_processPriority = AzFramework::ProcessPriority::PROCESSPRIORITY_NORMAL;
@@ -245,4 +245,12 @@ namespace Multiplayer
void MultiplayerEditorSystemComponent::OnGameEntitiesReset()
{
}
void MultiplayerEditorSystemComponent::OnServerAcceptanceReceived()
{
// We're now accepting the connection to the EditorServer.
// In normal game clients SendReadyForEntityUpdates will be enabled once the appropriate level's root spawnable is loaded,
// but since we're in Editor, we're already in the level.
AZ::Interface<IMultiplayer>::Get()->SendReadyForEntityUpdates(true);
}
}
@@ -8,6 +8,8 @@
#pragma once
#include "Multiplayer/IMultiplayer.h"
#include <IEditor.h>
#include <Editor/MultiplayerEditorConnection.h>
@@ -45,6 +47,9 @@ namespace Multiplayer
MultiplayerEditorSystemComponent();
~MultiplayerEditorSystemComponent() override = default;
//! Called once the editor receives the server's accept packet
void OnServerAcceptanceReceived();
//! AZ::Component overrides.
//! @{
void Activate() override;
@@ -71,5 +76,7 @@ namespace Multiplayer
IEditor* m_editor = nullptr;
AzFramework::ProcessWatcher* m_serverProcess = nullptr;
AzNetworking::ConnectionId m_editorConnId;
ServerAcceptanceReceivedEvent::Handler m_serverAcceptanceReceivedHandler;
};
}
@@ -489,23 +489,13 @@ namespace Multiplayer
{
m_didHandshake = true;
// If this is an Editor then we're now accepting the connection to the EditorServer.
// In normal game clients SendReadyForEntityUpdates will be enabled once the appropriate level's root spawnable is loaded,
// but since we're in Editor, we're already in the level.
AZ::ApplicationTypeQuery applicationType;
AZ::ComponentApplicationBus::Broadcast(&AZ::ComponentApplicationRequests::QueryApplicationType, applicationType);
if (applicationType.IsEditor())
{
SendReadyForEntityUpdates(true);
}
else
{
AZ::CVarFixedString commandString = "sv_map " + packet.GetMap();
AZ::Interface<AZ::IConsole>::Get()->PerformCommand(commandString.c_str());
AZ::CVarFixedString commandString = "sv_map " + packet.GetMap();
AZ::Interface<AZ::IConsole>::Get()->PerformCommand(commandString.c_str());
AZ::CVarFixedString loadLevelString = "LoadLevel " + packet.GetMap();
AZ::Interface<AZ::IConsole>::Get()->PerformCommand(loadLevelString.c_str());
}
AZ::CVarFixedString loadLevelString = "LoadLevel " + packet.GetMap();
AZ::Interface<AZ::IConsole>::Get()->PerformCommand(loadLevelString.c_str());
m_serverAcceptanceReceivedEvent.Signal();
return true;
}
@@ -800,6 +790,11 @@ namespace Multiplayer
handler.Connect(m_connAcquiredEvent);
}
void MultiplayerSystemComponent::AddServerAcceptanceReceivedHandler(ServerAcceptanceReceivedEvent::Handler& handler)
{
handler.Connect(m_serverAcceptanceReceivedEvent);
}
void MultiplayerSystemComponent::AddSessionInitHandler(SessionInitEvent::Handler& handler)
{
handler.Connect(m_initEvent);
@@ -111,6 +111,7 @@ namespace Multiplayer
void AddConnectionAcquiredHandler(ConnectionAcquiredEvent::Handler& handler) override;
void AddSessionInitHandler(SessionInitEvent::Handler& handler) override;
void AddSessionShutdownHandler(SessionShutdownEvent::Handler& handler) override;
void AddServerAcceptanceReceivedHandler(ServerAcceptanceReceivedEvent::Handler& handler) override;
bool StartHosting(uint16_t port, bool isDedicated = true) override;
bool Connect(AZStd::string remoteAddress, uint16_t port) override;
void Terminate(AzNetworking::DisconnectReason reason) override;
@@ -151,6 +152,7 @@ namespace Multiplayer
SessionInitEvent m_initEvent;
SessionShutdownEvent m_shutdownEvent;
ConnectionAcquiredEvent m_connAcquiredEvent;
ServerAcceptanceReceivedEvent m_serverAcceptanceReceivedEvent;
ClientDisconnectedEvent m_clientDisconnectedEvent;
AZStd::queue<AZStd::string> m_pendingConnectionTickets;