diff --git a/Code/Framework/AzNetworking/AzNetworking/AutoGen/AutoPacketDispatcher_Inline.jinja b/Code/Framework/AzNetworking/AzNetworking/AutoGen/AutoPacketDispatcher_Inline.jinja index c6f1a23402..145f15bb19 100644 --- a/Code/Framework/AzNetworking/AzNetworking/AutoGen/AutoPacketDispatcher_Inline.jinja +++ b/Code/Framework/AzNetworking/AzNetworking/AutoGen/AutoPacketDispatcher_Inline.jinja @@ -6,16 +6,25 @@ namespace {{ xml.attrib['Name'] }} { switch (aznumeric_cast(packetHeader.GetPacketType())) { +{% set packet_ns = namespace(handshake=false) %} +{% for Packet in xml.iter('Packet') %} +{% if ('HandshakePacket' in Packet.attrib) and (Packet.attrib['HandshakePacket']|booleanTrue == true) %} +{% set packet_ns.handshake = True %} +{% endif %} +{% endfor %} + {% for Packet in xml.iter('Packet') %} case aznumeric_cast({{ Packet.attrib['Name'] }}::Type): { AZLOG(Debug_DispatchPackets, "Received packet %s", "{{ Packet.attrib['Name'] }}"); -{% if ('HandshakePacket' not in Packet.attrib) or (Packet.attrib['HandshakePacket'] == 'false') %} - if (!handler.IsHandshakeComplete()) +{% if packet_ns.handshake %} +{% if ('HandshakePacket' not in Packet.attrib) or (Packet.attrib['HandshakePacket'] == 'false') %} + if (!handler.IsHandshakeComplete(connection)) { return AzNetworking::PacketDispatchResult::Skipped; } -{% endif %} +{% endif %} +{% endif %} {{ Packet.attrib['Name'] }} packet; if (!serializer.Serialize(packet, "Packet")) diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/ConnectionData/IConnectionData.h b/Gems/Multiplayer/Code/Include/Multiplayer/ConnectionData/IConnectionData.h index c3e251ea5e..e6c07ee847 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/ConnectionData/IConnectionData.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/ConnectionData/IConnectionData.h @@ -49,5 +49,13 @@ namespace Multiplayer //! Sets the state of connection whether update messages can be sent or not. //! @param canSendUpdates the state value virtual void SetCanSendUpdates(bool canSendUpdates) = 0; + + //! Fetches the state of connection whether handshake logic has completed + //! @return true if handshake has completed + virtual bool DidHandshake() const = 0; + + //! Sets the state of connection whether handshake logic has completed + //! @param didHandshake if handshake logic has completed + virtual void SetDidHandshake(bool didHandshake) = 0; }; } diff --git a/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.h b/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.h index 77df604b49..55510a2098 100644 --- a/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.h +++ b/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.h @@ -33,6 +33,8 @@ namespace Multiplayer void Update() override; bool CanSendUpdates() const override; void SetCanSendUpdates(bool canSendUpdates) override; + bool DidHandshake() const override; + void SetDidHandshake(bool didHandshake) override; //! @} const AZStd::string& GetProviderTicket() const; @@ -43,6 +45,7 @@ namespace Multiplayer AZStd::string m_providerTicket; AzNetworking::IConnection* m_connection = nullptr; bool m_canSendUpdates = true; + bool m_didHandshake = false; }; } diff --git a/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.inl b/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.inl index 9d6a3ca744..8874fbbabc 100644 --- a/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.inl +++ b/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.inl @@ -27,4 +27,14 @@ namespace Multiplayer { m_providerTicket = ticket; } + + inline bool ClientToServerConnectionData::DidHandshake() const + { + return m_didHandshake; + } + + inline void ClientToServerConnectionData::SetDidHandshake(bool didHandshake) + { + m_didHandshake = didHandshake; + } } diff --git a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.h b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.h index 8dcf08c480..1b4ee2cc04 100644 --- a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.h +++ b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.h @@ -33,6 +33,8 @@ namespace Multiplayer void Update() override; bool CanSendUpdates() const override; void SetCanSendUpdates(bool canSendUpdates) override; + bool DidHandshake() const override; + void SetDidHandshake(bool didHandshake) override; //! @} NetworkEntityHandle GetPrimaryPlayerEntity(); @@ -52,6 +54,7 @@ namespace Multiplayer AZStd::string m_providerTicket; AzNetworking::IConnection* m_connection = nullptr; bool m_canSendUpdates = false; + bool m_didHandshake = false; }; } diff --git a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.inl b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.inl index 53ba51f36a..e4348fe539 100644 --- a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.inl +++ b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.inl @@ -38,4 +38,14 @@ namespace Multiplayer { m_providerTicket = ticket; } + + inline bool ServerToClientConnectionData::DidHandshake() const + { + return m_didHandshake; + } + + inline void ServerToClientConnectionData::SetDidHandshake(bool didHandshake) + { + m_didHandshake = didHandshake; + } } diff --git a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorConnection.h b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorConnection.h index ca815d5c48..b93c830cd0 100644 --- a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorConnection.h +++ b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorConnection.h @@ -33,7 +33,6 @@ namespace Multiplayer MultiplayerEditorConnection(); ~MultiplayerEditorConnection() = default; - bool IsHandshakeComplete() const { return true; }; bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerEditorPackets::EditorServerInit& packet); bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerEditorPackets::EditorServerReady& packet); diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp index b7dde3b9e7..37e87ace84 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp @@ -446,9 +446,9 @@ namespace Multiplayer MultiplayerPackets::SyncConsole m_syncPacket; }; - bool MultiplayerSystemComponent::IsHandshakeComplete() const + bool MultiplayerSystemComponent::IsHandshakeComplete(AzNetworking::IConnection* connection) const { - return m_didHandshake; + return reinterpret_cast(connection->GetUserData())->DidHandshake(); } bool MultiplayerSystemComponent::HandleRequest @@ -475,7 +475,7 @@ namespace Multiplayer if (connection->SendReliablePacket(MultiplayerPackets::Accept(sv_map))) { - m_didHandshake = true; + reinterpret_cast(connection->GetUserData())->SetDidHandshake(true); // Sync our console ConsoleReplicator consoleReplicator(connection); @@ -492,7 +492,7 @@ namespace Multiplayer [[maybe_unused]] MultiplayerPackets::Accept& packet ) { - m_didHandshake = true; + reinterpret_cast(connection->GetUserData())->SetDidHandshake(true); AZ::CVarFixedString commandString = "sv_map " + packet.GetMap(); AZ::Interface::Get()->PerformCommand(commandString.c_str()); AZ::CVarFixedString loadLevelString = "LoadLevel " + packet.GetMap(); diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h index 262168b536..316ddd41d5 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h @@ -76,7 +76,7 @@ namespace Multiplayer int GetTickOrder() override; //! @} - bool IsHandshakeComplete() const; + bool IsHandshakeComplete(AzNetworking::IConnection* connection) const; bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::Connect& packet); bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::Accept& packet); bool HandleRequest(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, MultiplayerPackets::ReadyForEntityUpdates& packet); @@ -171,7 +171,6 @@ namespace Multiplayer double m_serverSendAccumulator = 0.0; float m_renderBlendFactor = 0.0f; float m_tickFactor = 0.0f; - bool m_didHandshake = false; bool m_spawnNetboundEntities = true; #if !defined(AZ_RELEASE_BUILD) diff --git a/Gems/Multiplayer/Code/Tests/NetworkTransformTests.cpp b/Gems/Multiplayer/Code/Tests/NetworkTransformTests.cpp index 94cb94e000..359c8003a4 100644 --- a/Gems/Multiplayer/Code/Tests/NetworkTransformTests.cpp +++ b/Gems/Multiplayer/Code/Tests/NetworkTransformTests.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include namespace Multiplayer {