3
0

MultiplayerDebug.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/Math/MathStringConversions.h>
  10. #include <Multiplayer/IMultiplayerDebug.h>
  11. namespace Multiplayer
  12. {
  13. template<class T>
  14. class MultiplayerAuditingDatum : public IMultiplayerAuditingDatum
  15. {
  16. public:
  17. MultiplayerAuditingDatum(AZStd::string datumName)
  18. : m_name(datumName){};
  19. MultiplayerAuditingDatum(AZStd::string datumName, T client, T server)
  20. : m_name(datumName)
  21. , m_clientServerValue(client, server){};
  22. virtual ~MultiplayerAuditingDatum() = default;
  23. IMultiplayerAuditingDatum& operator=(const IMultiplayerAuditingDatum& rhs) override;
  24. const AZStd::string& GetName() const override;
  25. AZStd::pair<AZStd::string, AZStd::string> GetClientServerValues() const override;
  26. AZStd::unique_ptr<IMultiplayerAuditingDatum> Clone() override;
  27. private:
  28. AZStd::string m_name;
  29. AZStd::pair<T, T> m_clientServerValue;
  30. };
  31. template<>
  32. class MultiplayerAuditingDatum<bool> : public IMultiplayerAuditingDatum
  33. {
  34. public:
  35. MultiplayerAuditingDatum(AZStd::string datumName)
  36. : m_name(datumName){};
  37. MultiplayerAuditingDatum(AZStd::string datumName, bool client, bool server)
  38. : m_name(datumName)
  39. , m_clientServerValue(client, server){};
  40. virtual ~MultiplayerAuditingDatum() = default;
  41. IMultiplayerAuditingDatum& operator=(const IMultiplayerAuditingDatum& rhs) override;
  42. const AZStd::string& GetName() const override;
  43. AZStd::pair<AZStd::string, AZStd::string> GetClientServerValues() const override;
  44. AZStd::unique_ptr<IMultiplayerAuditingDatum> Clone() override;
  45. private:
  46. AZStd::string m_name;
  47. AZStd::pair<bool, bool> m_clientServerValue;
  48. };
  49. template<>
  50. class MultiplayerAuditingDatum<AZStd::string> : public IMultiplayerAuditingDatum
  51. {
  52. public:
  53. MultiplayerAuditingDatum(AZStd::string datumName)
  54. : m_name(datumName){};
  55. MultiplayerAuditingDatum(AZStd::string datumName, AZStd::string client, AZStd::string server)
  56. : m_name(datumName)
  57. , m_clientServerValue(client, server){};
  58. virtual ~MultiplayerAuditingDatum() = default;
  59. IMultiplayerAuditingDatum& operator=(const IMultiplayerAuditingDatum& rhs) override;
  60. const AZStd::string& GetName() const override;
  61. AZStd::pair<AZStd::string, AZStd::string> GetClientServerValues() const override;
  62. AZStd::unique_ptr<IMultiplayerAuditingDatum> Clone() override;
  63. private:
  64. AZStd::string m_name;
  65. AZStd::pair<AZStd::string, AZStd::string> m_clientServerValue;
  66. };
  67. //! Adds an audit trail entry detailing the local value of a rewindable and its last known server value against a given NetworkInput
  68. //! @param INPUT The network input to audit
  69. //! @param REWINDABLE The RewindableObject to audit
  70. //! @param VALUE_TYPE The underlying type of the RewindableObject
  71. #define AZ_MPAUDIT_INPUT_REWINDABLE(INPUT, REWINDABLE, VALUE_TYPE) \
  72. if (AZ::Interface<Multiplayer::IMultiplayerDebug>::Get()) \
  73. { \
  74. Multiplayer::MultiplayerAuditingElement detail; \
  75. detail.m_name = INPUT.GetOwnerName().empty() ? "null owner" : INPUT.GetOwnerName(); \
  76. detail.m_elements.push_back(AZStd::make_unique<Multiplayer::MultiplayerAuditingDatum<VALUE_TYPE>>( \
  77. #REWINDABLE, REWINDABLE.Get(), REWINDABLE.GetLastSerializedValue())); \
  78. AZ::Interface<Multiplayer::IMultiplayerDebug>::Get()->AddAuditEntry( \
  79. Multiplayer::AuditCategory::Event, INPUT.GetClientInputId(), INPUT.GetHostFrameId(), \
  80. AZStd::string::format("%s rewindable: %s", INPUT.GetOwnerName().c_str(), #REWINDABLE), { AZStd::move(detail) }); \
  81. }
  82. //! Adds an audit trail entry detailing the value of a given variable against a given NetworkInput
  83. //! @param INPUT The network input to audit
  84. //! @param VALUE The variable to audit
  85. //! @param VALUE_TYPE The type of the variable
  86. #define AZ_MPAUDIT_INPUT_VALUE(INPUT, VALUE, VALUE_TYPE) \
  87. if (AZ::Interface<Multiplayer::IMultiplayerDebug>::Get()) \
  88. { \
  89. Multiplayer::MultiplayerAuditingElement detail; \
  90. detail.m_name = INPUT.GetOwnerName().empty() ? "null owner" : INPUT.GetOwnerName(); \
  91. detail.m_elements.push_back(AZStd::make_unique<Multiplayer::MultiplayerAuditingDatum<VALUE_TYPE>>(#VALUE, VALUE, VALUE)); \
  92. AZ::Interface<Multiplayer::IMultiplayerDebug>::Get()->AddAuditEntry( \
  93. Multiplayer::AuditCategory::Event, INPUT.GetClientInputId(), INPUT.GetHostFrameId(), \
  94. AZStd::string::format("%s: %s", INPUT.GetOwnerName().c_str(), #VALUE), { AZStd::move(detail) }); \
  95. }
  96. //! Adds an audit trail entry detailing the value of a given variable
  97. //! @param VALUE The variable to audit
  98. //! @param VALUE_TYPE The type of the variable
  99. #define AZ_MPAUDIT_VALUE(VALUE, VALUE_TYPE) \
  100. if (AZ::Interface<Multiplayer::IMultiplayerDebug>::Get()) \
  101. { \
  102. Multiplayer::MultiplayerAuditingElement detail; \
  103. detail.m_name = AZStd::string::format("%s", #VALUE); \
  104. detail.m_elements.push_back(AZStd::make_unique<Multiplayer::MultiplayerAuditingDatum<VALUE_TYPE>>(#VALUE, VALUE, VALUE)); \
  105. AZ::Interface<Multiplayer::IMultiplayerDebug>::Get()->AddAuditEntry( \
  106. Multiplayer::AuditCategory::Event, Multiplayer::ClientInputId(0), Multiplayer::HostFrameId(0), \
  107. detail.m_name, { AZStd::move(detail) }); \
  108. }
  109. }
  110. #include <Multiplayer/MultiplayerDebug.inl>