Re-merging latest dev after rebasing to fix DCO. Re-resolving conflicts
Signed-off-by: Gene Walters <genewalt@amazon.com>
This commit is contained in:
@@ -17,8 +17,11 @@ namespace Multiplayer
|
||||
public:
|
||||
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
|
||||
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
|
||||
|
||||
virtual void SendEditorServerInitPacket(AzNetworking::IConnection* connection) = 0;
|
||||
|
||||
//! Sends a packet that initializes a local server launched from the editor.
|
||||
//! The editor will package the data required for loading the current editor level on the editor-server; data includes entities and asset data.
|
||||
//! @param connection The connection to the editor-server
|
||||
virtual void SendEditorServerLevelDataPacket(AzNetworking::IConnection* connection) = 0;
|
||||
};
|
||||
using MultiplayerEditorServerRequestBus = AZ::EBus<MultiplayerEditorServerRequests>;
|
||||
} // namespace Multiplayer
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
<Include File="Multiplayer/MultiplayerTypes.h" />
|
||||
<Include File="Multiplayer/NetworkTime/INetworkTime.h" />
|
||||
|
||||
<Packet Name="EditorServerReadyForInit" Desc="A packet the local server will send on startup once it's ready for the EditorServerInit packet."/>
|
||||
<Packet Name="EditorServerReadyForLevelData" Desc="A packet the editor-server will send on startup once it's ready to receive all the current level data from the Editor."/>
|
||||
|
||||
<Packet Name="EditorServerInit" Desc="A packet that initializes a local server launched from the editor">
|
||||
<Packet Name="EditorServerLevelData" Desc="A packet that initializes the editor-server with level data from the editor. The packet includes data required for loading the current level on the server (entities and asset data).">
|
||||
<Member Type="bool" Name="lastUpdate" Init="false"/>
|
||||
|
||||
<!--16379 is 16384 (max TCP packet size) - 1 byte (bool lastUpdate) - 4 bytes (serialization overhead for ByteBuffer) -->
|
||||
<Member Type="AzNetworking::ByteBuffer<16379>" Name="assetData"/>
|
||||
</Packet>
|
||||
|
||||
<Packet Name="EditorServerReady" Desc="A response packet the local server should send when ready for traffic"/>
|
||||
<Packet Name="EditorServerReady" Desc="A response packet the editor-server should send after getting the editor's level data when it's ready to begin the actual game-mode network simulation."/>
|
||||
</PacketGroup>
|
||||
|
||||
@@ -37,10 +37,11 @@ namespace Multiplayer
|
||||
{
|
||||
uint16_t editorsv_port = DefaultServerEditorPort;
|
||||
const auto console = AZ::Interface<AZ::IConsole>::Get();
|
||||
|
||||
AZ_Warning(
|
||||
"MultiplayerEditorConnection", console->GetCvarValue("editorsv_port", editorsv_port) == AZ::GetValueResult::Success,
|
||||
"MultiplayerEditorConnection failed! Could not find the editorsv_port cvar; we may not be able to connect to the editor's port!")
|
||||
if (console->GetCvarValue("editorsv_port", editorsv_port) != AZ::GetValueResult::Success)
|
||||
{
|
||||
AZ_Assert( false,
|
||||
"MultiplayerEditorConnection failed! Could not find the editorsv_port cvar; we may not be able to connect to the editor's port! Please update this code to use a valid cvar!")
|
||||
}
|
||||
|
||||
AZ_Assert(m_networkEditorInterface, "MP Editor Network Interface was unregistered before Editor Server could start listening.")
|
||||
|
||||
@@ -54,7 +55,7 @@ namespace Multiplayer
|
||||
}
|
||||
else
|
||||
{
|
||||
m_networkEditorInterface->SendReliablePacket(editorServerToEditorConnectionId, MultiplayerEditorPackets::EditorServerReadyForInit());
|
||||
m_networkEditorInterface->SendReliablePacket(editorServerToEditorConnectionId, MultiplayerEditorPackets::EditorServerReadyForLevelData());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -63,7 +64,7 @@ namespace Multiplayer
|
||||
(
|
||||
[[maybe_unused]] AzNetworking::IConnection* connection,
|
||||
[[maybe_unused]] const IPacketHeader& packetHeader,
|
||||
[[maybe_unused]] MultiplayerEditorPackets::EditorServerInit& packet
|
||||
[[maybe_unused]] MultiplayerEditorPackets::EditorServerLevelData& packet
|
||||
)
|
||||
{
|
||||
// Editor Server Init is intended for non-release targets
|
||||
@@ -90,7 +91,7 @@ namespace Multiplayer
|
||||
AZ::Data::AssetData* assetDatum = AZ::Utils::LoadObjectFromStream<AZ::Data::AssetData>(m_byteStream, nullptr);
|
||||
if (!assetDatum)
|
||||
{
|
||||
AZLOG_ERROR("EditorServerInit packet contains no asset data. Asset: %s", assetHint.c_str());
|
||||
AZLOG_ERROR("EditorServerLevelData packet contains no asset data. Asset: %s", assetHint.c_str())
|
||||
return false;
|
||||
}
|
||||
assetSize = m_byteStream.GetCurPos() - assetSize;
|
||||
@@ -127,8 +128,12 @@ namespace Multiplayer
|
||||
INetworkInterface* networkInterface = AZ::Interface<INetworking>::Get()->RetrieveNetworkInterface(AZ::Name(MpNetworkInterfaceName));
|
||||
|
||||
uint16_t sv_port = DefaultServerPort;
|
||||
AZ_Warning("MultiplayerEditorConnection", console->GetCvarValue("sv_port", sv_port) == AZ::GetValueResult::Success,
|
||||
"MultiplayerEditorConnection::HandleRequest for EditorServerInit failed! Could not find the sv_port cvar; we won't be able to listen on the correct port for incoming network messages!")
|
||||
if (console->GetCvarValue("sv_port", sv_port) != AZ::GetValueResult::Success)
|
||||
{
|
||||
AZ_Assert(false,
|
||||
"MultiplayerEditorConnection::HandleRequest for EditorServerLevelData failed! Could not find the sv_port cvar; we won't be able to listen on the correct port for incoming network messages! Please update this code to use a valid cvar!")
|
||||
}
|
||||
|
||||
networkInterface->Listen(sv_port);
|
||||
|
||||
AZLOG_INFO("Editor Server completed asset receive, responding to Editor...");
|
||||
@@ -141,9 +146,9 @@ namespace Multiplayer
|
||||
bool MultiplayerEditorConnection::HandleRequest(
|
||||
[[maybe_unused]] AzNetworking::IConnection* connection,
|
||||
[[maybe_unused]] const AzNetworking::IPacketHeader& packetHeader,
|
||||
[[maybe_unused]] MultiplayerEditorPackets::EditorServerReadyForInit& packet)
|
||||
[[maybe_unused]] MultiplayerEditorPackets::EditorServerReadyForLevelData& packet)
|
||||
{
|
||||
MultiplayerEditorServerRequestBus::Broadcast(&MultiplayerEditorServerRequestBus::Events::SendEditorServerInitPacket, connection);
|
||||
MultiplayerEditorServerRequestBus::Broadcast(&MultiplayerEditorServerRequestBus::Events::SendEditorServerLevelDataPacket, connection);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -160,15 +165,19 @@ namespace Multiplayer
|
||||
AZ::CVarFixedString editorsv_serveraddr = AZ::CVarFixedString(LocalHost);
|
||||
uint16_t sv_port = DefaultServerEditorPort;
|
||||
|
||||
AZ_Warning(
|
||||
"MultiplayerEditorConnection", console->GetCvarValue("sv_port", sv_port) == AZ::GetValueResult::Success,
|
||||
"MultiplayerEditorConnection::HandleRequest for EditorServerReady failed! Could not find the sv_port cvar; we may not be able to "
|
||||
"connect to the correct port for incoming network messages!")
|
||||
if (console->GetCvarValue("sv_port", sv_port) != AZ::GetValueResult::Success)
|
||||
{
|
||||
AZ_Assert(false,
|
||||
"MultiplayerEditorConnection::HandleRequest for EditorServerReady failed! Could not find the sv_port cvar; we may not be able to "
|
||||
"connect to the correct port for incoming network messages! Please update this code to use a valid cvar!")
|
||||
}
|
||||
|
||||
AZ_Warning(
|
||||
"MultiplayerEditorConnection", console->GetCvarValue("editorsv_serveraddr", editorsv_serveraddr) == AZ::GetValueResult::Success,
|
||||
"MultiplayerEditorConnection::HandleRequest for EditorServerReady failed! Could not find the editorsv_serveraddr cvar; we may not be able to "
|
||||
"connect to the correct port for incoming network messages!")
|
||||
if (console->GetCvarValue("editorsv_serveraddr", editorsv_serveraddr) != AZ::GetValueResult::Success)
|
||||
{
|
||||
AZ_Assert(false,
|
||||
"MultiplayerEditorConnection::HandleRequest for EditorServerReady failed! Could not find the editorsv_serveraddr cvar; we may not be able to "
|
||||
"connect to the correct port for incoming network messages! Please update this code to use a valid cvar!")
|
||||
}
|
||||
|
||||
// Connect the Editor to the editor server for Multiplayer simulation
|
||||
AZ::Interface<IMultiplayer>::Get()->Connect(editorsv_serveraddr.c_str(), sv_port);
|
||||
@@ -195,26 +204,5 @@ namespace Multiplayer
|
||||
{
|
||||
return MultiplayerEditorPackets::DispatchPacket(connection, packetHeader, serializer, *this);
|
||||
}
|
||||
|
||||
void MultiplayerEditorConnection::OnPacketLost([[maybe_unused]] IConnection* connection, [[maybe_unused]] PacketId packetId)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void MultiplayerEditorConnection::OnDisconnect([[maybe_unused]] AzNetworking::IConnection* connection, [[maybe_unused]] DisconnectReason reason, [[maybe_unused]] TerminationEndpoint endpoint)
|
||||
{
|
||||
const auto console = AZ::Interface<AZ::IConsole>::Get();
|
||||
bool editorsv_launch = false;
|
||||
AZ_Warning(
|
||||
"MultiplayerEditorConnection", console->GetCvarValue("editorsv_launch", editorsv_launch) == AZ::GetValueResult::Success,
|
||||
"MultiplayerEditorConnection::OnDisconnect failed! Could not find the editorsv_launch cvar.")
|
||||
|
||||
if (editorsv_isDedicated && editorsv_launch && m_networkEditorInterface->GetConnectionSet().GetConnectionCount() == 1)
|
||||
{
|
||||
if (m_networkEditorInterface->GetPort() != 0)
|
||||
{
|
||||
m_networkEditorInterface->StopListening();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
|
||||
#include <Source/AutoGen/MultiplayerEditor.AutoPacketDispatcher.h>
|
||||
|
||||
#include <AzCore/Component/Component.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#include <AzCore/Console/IConsole.h>
|
||||
#include <AzCore/Console/ILogger.h>
|
||||
#include <AzCore/IO/ByteContainerStream.h>
|
||||
@@ -33,8 +31,8 @@ namespace Multiplayer
|
||||
MultiplayerEditorConnection();
|
||||
~MultiplayerEditorConnection() = default;
|
||||
|
||||
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerEditorPackets::EditorServerReadyForInit& packet);
|
||||
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerEditorPackets::EditorServerInit& packet);
|
||||
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerEditorPackets::EditorServerReadyForLevelData& packet);
|
||||
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerEditorPackets::EditorServerLevelData& packet);
|
||||
bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerEditorPackets::EditorServerReady& packet);
|
||||
|
||||
//! IConnectionListener interface
|
||||
@@ -42,8 +40,8 @@ namespace Multiplayer
|
||||
AzNetworking::ConnectResult ValidateConnect(const AzNetworking::IpAddress& remoteAddress, const AzNetworking::IPacketHeader& packetHeader, AzNetworking::ISerializer& serializer) override;
|
||||
void OnConnect(AzNetworking::IConnection* connection) override;
|
||||
AzNetworking::PacketDispatchResult OnPacketReceived(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, AzNetworking::ISerializer& serializer) override;
|
||||
void OnPacketLost(AzNetworking::IConnection* connection, AzNetworking::PacketId packetId) override;
|
||||
void OnDisconnect(AzNetworking::IConnection* connection, AzNetworking::DisconnectReason reason, AzNetworking::TerminationEndpoint endpoint) override;
|
||||
void OnPacketLost([[maybe_unused]]AzNetworking::IConnection* connection, [[maybe_unused]]AzNetworking::PacketId packetId) override {}
|
||||
void OnDisconnect([[maybe_unused]]AzNetworking::IConnection* connection, [[maybe_unused]]AzNetworking::DisconnectReason reason, [[maybe_unused]]AzNetworking::TerminationEndpoint endpoint) override {}
|
||||
//! @}
|
||||
|
||||
private:
|
||||
|
||||
@@ -273,7 +273,7 @@ namespace Multiplayer
|
||||
}
|
||||
|
||||
// Begin listening for MPEditor packets before we launch the editor-server.
|
||||
// The editor-server will send us (the editor) an "EditorServerReadyForInit" packet to let us know it's ready to receive data.
|
||||
// The editor-server will send us (the editor) an "EditorServerReadyForLevelData" packet to let us know it's ready to receive data.
|
||||
INetworkInterface* editorNetworkInterface =
|
||||
AZ::Interface<INetworking>::Get()->RetrieveNetworkInterface(AZ::Name(MpEditorInterfaceName));
|
||||
AZ_Assert(editorNetworkInterface, "MP Editor Network Interface was unregistered before Editor could connect.");
|
||||
@@ -285,7 +285,7 @@ namespace Multiplayer
|
||||
else
|
||||
{
|
||||
// Editorsv_launch=false, so we're expecting an editor-server already exists.
|
||||
// Connect to the editor-server and then send the EditorServerInit packet.
|
||||
// Connect to the editor-server and then send the EditorServerLevelData packet.
|
||||
INetworkInterface* editorNetworkInterface = AZ::Interface<INetworking>::Get()->RetrieveNetworkInterface(AZ::Name(MpEditorInterfaceName));
|
||||
AZ_Assert(editorNetworkInterface, "MP Editor Network Interface was unregistered before Editor could connect.")
|
||||
|
||||
@@ -295,14 +295,14 @@ namespace Multiplayer
|
||||
{
|
||||
AZ_Warning(
|
||||
"MultiplayerEditor", false,
|
||||
"Editor multiplayer game-mode failed! Could not connect to an editor-server. editorsv_launch is false so we're assuming you're running your own editor-server at editorsv_serveraddr(%s) on editorsv_port(%i)."
|
||||
"Editor multiplayer game-mode failed! Could not connect to an editor-server. editorsv_launch is false so we're assuming you're running your own editor-server at editorsv_serveraddr(%s) on editorsv_port(%i). "
|
||||
"Either set editorsv_launch=true so the editor launches an editor-server for you, or launch your own editor-server by hand before entering game-mode. Remember editor-servers must use editorsv_isDedicated=true.",
|
||||
remoteAddress.c_str(),
|
||||
static_cast < uint16_t>(editorsv_port))
|
||||
return;
|
||||
}
|
||||
|
||||
SendEditorServerInitPacket(editorNetworkInterface->GetConnectionSet().GetConnection(m_editorConnId));
|
||||
SendEditorServerLevelDataPacket(editorNetworkInterface->GetConnectionSet().GetConnection(m_editorConnId));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -319,7 +319,7 @@ namespace Multiplayer
|
||||
AZ::Interface<IMultiplayer>::Get()->SendReadyForEntityUpdates(true);
|
||||
}
|
||||
|
||||
void MultiplayerEditorSystemComponent::SendEditorServerInitPacket(AzNetworking::IConnection* connection)
|
||||
void MultiplayerEditorSystemComponent::SendEditorServerLevelDataPacket(AzNetworking::IConnection* connection)
|
||||
{
|
||||
const auto prefabEditorEntityOwnershipInterface = AZ::Interface<AzToolsFramework::PrefabEditorEntityOwnershipInterface>::Get();
|
||||
if (!prefabEditorEntityOwnershipInterface)
|
||||
@@ -349,13 +349,13 @@ namespace Multiplayer
|
||||
// Spawnable library needs to be rebuilt since now we have newly registered in-memory spawnable assets
|
||||
AZ::Interface<INetworkSpawnableLibrary>::Get()->BuildSpawnablesList();
|
||||
|
||||
// Read the buffer into EditorServerInit packets until we've flushed the whole thing
|
||||
// Read the buffer into EditorServerLevelData packets until we've flushed the whole thing
|
||||
byteStream.Seek(0, AZ::IO::GenericStream::SeekMode::ST_SEEK_BEGIN);
|
||||
|
||||
while (byteStream.GetCurPos() < byteStream.GetLength())
|
||||
{
|
||||
MultiplayerEditorPackets::EditorServerInit editorServerInitPacket;
|
||||
auto& outBuffer = editorServerInitPacket.ModifyAssetData();
|
||||
MultiplayerEditorPackets::EditorServerLevelData editorServerLevelDataPacket;
|
||||
auto& outBuffer = editorServerLevelDataPacket.ModifyAssetData();
|
||||
|
||||
// Size the packet's buffer appropriately
|
||||
size_t readSize = outBuffer.GetCapacity();
|
||||
@@ -371,10 +371,10 @@ namespace Multiplayer
|
||||
// If we've run out of buffer, mark that we're done
|
||||
if (byteStream.GetCurPos() == byteStream.GetLength())
|
||||
{
|
||||
editorServerInitPacket.SetLastUpdate(true);
|
||||
editorServerLevelDataPacket.SetLastUpdate(true);
|
||||
}
|
||||
|
||||
connection->SendReliablePacket(editorServerInitPacket);
|
||||
connection->SendReliablePacket(editorServerLevelDataPacket);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ namespace Multiplayer
|
||||
|
||||
//! MultiplayerEditorServerRequestBus::Handler
|
||||
//! @{
|
||||
void SendEditorServerInitPacket(AzNetworking::IConnection* connection) override;
|
||||
void SendEditorServerLevelDataPacket(AzNetworking::IConnection* connection) override;
|
||||
//! @}
|
||||
|
||||
IEditor* m_editor = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user