NetworkEntityHandle.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. #include <Multiplayer/NetworkEntity/NetworkEntityHandle.h>
  9. #include <Multiplayer/Components/MultiplayerController.h>
  10. #include <Multiplayer/Components/MultiplayerComponent.h>
  11. #include <Multiplayer/Components/NetBindComponent.h>
  12. #include <Source/NetworkEntity/NetworkEntityTracker.h>
  13. #include <AzCore/Console/IConsole.h>
  14. #include <AzCore/Console/ILogger.h>
  15. namespace Multiplayer
  16. {
  17. ConstNetworkEntityHandle::ConstNetworkEntityHandle(AZ::Entity* entity, const NetworkEntityTracker* networkEntityTracker)
  18. : m_entity(entity)
  19. , m_networkEntityTracker((networkEntityTracker != nullptr) ? networkEntityTracker : GetNetworkEntityTracker())
  20. {
  21. AZ_Assert(m_networkEntityTracker, "NetworkEntityTracker is not valid");
  22. m_changeDirty = m_networkEntityTracker->GetChangeDirty(m_entity);
  23. if (entity)
  24. {
  25. m_netBindComponent = m_networkEntityTracker->GetNetBindComponent(entity);
  26. if (m_netBindComponent != nullptr)
  27. {
  28. m_netEntityId = m_netBindComponent->GetNetEntityId();
  29. }
  30. else
  31. {
  32. *this = ConstNetworkEntityHandle();
  33. }
  34. }
  35. }
  36. bool ConstNetworkEntityHandle::Exists() const
  37. {
  38. if (!m_networkEntityTracker)
  39. {
  40. return false;
  41. }
  42. const uint32_t changeDirty = m_networkEntityTracker->GetChangeDirty(m_entity);
  43. if (m_changeDirty != changeDirty)
  44. {
  45. // Make sure to get change dirty with updated m_entity
  46. m_changeDirty = changeDirty;
  47. AZ::Entity* newEntity = m_networkEntityTracker->GetRaw(m_netEntityId);
  48. if (newEntity != m_entity)
  49. {
  50. // If the entity pointer has changed, update our entity pointer and reset our netBindComponent pointer
  51. m_entity = newEntity;
  52. m_netBindComponent = nullptr;
  53. }
  54. }
  55. return m_entity != nullptr;
  56. }
  57. AZ::Entity* ConstNetworkEntityHandle::GetEntity()
  58. {
  59. if (!Exists())
  60. {
  61. return nullptr;
  62. }
  63. return m_entity;
  64. }
  65. const AZ::Entity* ConstNetworkEntityHandle::GetEntity() const
  66. {
  67. if (!Exists())
  68. {
  69. return nullptr;
  70. }
  71. return m_entity;
  72. }
  73. ConstNetworkEntityHandle::operator bool() const
  74. {
  75. return Exists();
  76. }
  77. bool ConstNetworkEntityHandle::operator==(const ConstNetworkEntityHandle &b) const
  78. {
  79. return m_netEntityId == b.m_netEntityId;
  80. }
  81. bool ConstNetworkEntityHandle::operator!=(const ConstNetworkEntityHandle &b) const
  82. {
  83. return m_netEntityId != b.m_netEntityId;
  84. }
  85. bool ConstNetworkEntityHandle::operator<(const ConstNetworkEntityHandle &b) const
  86. {
  87. return m_netEntityId < b.m_netEntityId;
  88. }
  89. void ConstNetworkEntityHandle::Reset()
  90. {
  91. m_entity = nullptr;
  92. m_netBindComponent = nullptr;
  93. m_netEntityId = InvalidNetEntityId;
  94. }
  95. void ConstNetworkEntityHandle::Reset(const ConstNetworkEntityHandle& handle)
  96. {
  97. m_changeDirty = handle.m_changeDirty;
  98. m_entity = handle.m_entity;
  99. m_netBindComponent = handle.m_netBindComponent;
  100. m_networkEntityTracker = handle.m_networkEntityTracker;
  101. m_netEntityId = handle.m_netEntityId;
  102. }
  103. NetBindComponent* ConstNetworkEntityHandle::GetNetBindComponent() const
  104. {
  105. if (!Exists())
  106. {
  107. return nullptr;
  108. }
  109. if (m_netBindComponent == nullptr)
  110. {
  111. m_netBindComponent = m_networkEntityTracker->GetNetBindComponent(m_entity);
  112. }
  113. return m_netBindComponent;
  114. }
  115. const AZ::Component* ConstNetworkEntityHandle::FindComponent(const AZ::TypeId& typeId) const
  116. {
  117. if (const AZ::Entity* entity{ GetEntity() })
  118. {
  119. return entity->FindComponent(typeId);
  120. }
  121. return nullptr;
  122. }
  123. MultiplayerController* NetworkEntityHandle::FindController(const AZ::TypeId& typeId)
  124. {
  125. if (AZ::Entity* entity{ GetEntity() })
  126. {
  127. MultiplayerComponent* component = azrtti_cast<MultiplayerComponent*>(entity->FindComponent(typeId));
  128. if (component != nullptr)
  129. {
  130. return component->GetController();
  131. }
  132. }
  133. return nullptr;
  134. }
  135. AZ::Component* NetworkEntityHandle::FindComponent(const AZ::TypeId& typeId)
  136. {
  137. return const_cast<AZ::Component*>(const_cast<const ConstNetworkEntityHandle*>(static_cast<ConstNetworkEntityHandle*>(this))->FindComponent(typeId));
  138. }
  139. }