Converted to use AZ::Events for hiearchy notifications. Added unittests.

Signed-off-by: AMZN-Olex <5432499+AMZN-Olex@users.noreply.github.com>
This commit is contained in:
AMZN-Olex
2021-09-14 11:50:51 -04:00
parent 088511577b
commit fcd5b3f184
9 changed files with 131 additions and 37 deletions
@@ -98,6 +98,16 @@ namespace Multiplayer
return {};
}
void NetworkHierarchyChildComponent::BindNetworkHierarchyChangedEventHandler(NetworkHierarchyChangedEvent::Handler& handler)
{
handler.Connect(m_networkHierarchyChangedEvent);
}
void NetworkHierarchyChildComponent::BindNetworkHierarchyLeaveEventHandler(NetworkHierarchyLeaveEvent::Handler& handler)
{
handler.Connect(m_networkHierarchyLeaveEvent);
}
void NetworkHierarchyChildComponent::SetTopLevelHierarchyRootComponent(NetworkHierarchyRootComponent* hierarchyRoot)
{
m_hierarchyRootComponent = hierarchyRoot;
@@ -109,12 +119,13 @@ namespace Multiplayer
const NetEntityId netRootId = GetNetworkEntityManager()->GetNetEntityIdById(hierarchyRoot->GetEntityId());
controller->SetHierarchyRoot(netRootId);
NetworkHierarchyNotificationBus::Event(GetEntityId(), &NetworkHierarchyNotificationBus::Events::OnNetworkHierarchyUpdated, hierarchyRoot->GetEntityId());
m_networkHierarchyChangedEvent.Signal(hierarchyRoot->GetEntityId());
}
else
{
controller->SetHierarchyRoot(InvalidNetEntityId);
NetworkHierarchyNotificationBus::Event(GetEntityId(), &NetworkHierarchyNotificationBus::Events::OnNetworkHierarchyLeave);
m_networkHierarchyLeaveEvent.Signal();
}
}
}
@@ -125,10 +136,12 @@ namespace Multiplayer
if (rootHandle.Exists())
{
m_hierarchyRootComponent = rootHandle.FindComponent<NetworkHierarchyRootComponent>();
m_networkHierarchyChangedEvent.Signal(m_hierarchyRootComponent->GetEntityId());
}
else
{
m_hierarchyRootComponent = nullptr;
m_networkHierarchyLeaveEvent.Signal();
}
}
}
@@ -124,6 +124,16 @@ namespace Multiplayer
return GetEntity();
}
void NetworkHierarchyRootComponent::BindNetworkHierarchyChangedEventHandler(NetworkHierarchyChangedEvent::Handler& handler)
{
handler.Connect(m_networkHierarchyChangedEvent);
}
void NetworkHierarchyRootComponent::BindNetworkHierarchyLeaveEventHandler(NetworkHierarchyLeaveEvent::Handler& handler)
{
handler.Connect(m_networkHierarchyLeaveEvent);
}
void NetworkHierarchyRootComponent::OnParentChanged([[maybe_unused]] AZ::EntityId oldParent, AZ::EntityId newParent)
{
const AZ::EntityId entityBusId = *AZ::TransformNotificationBus::GetCurrentBusId();
@@ -168,6 +178,8 @@ namespace Multiplayer
uint32_t currentEntityCount = aznumeric_cast<uint32_t>(m_hierarchicalEntities.size());
RecursiveAttachHierarchicalEntities(GetEntityId(), currentEntityCount);
m_networkHierarchyChangedEvent.Signal(GetEntityId());
}
bool NetworkHierarchyRootComponent::RecursiveAttachHierarchicalEntities(AZ::EntityId underEntity, uint32_t& currentEntityCount)
@@ -255,6 +267,8 @@ namespace Multiplayer
}
}
}
m_networkHierarchyChangedEvent.Signal(GetEntityId());
}
void NetworkHierarchyRootComponent::SetTopLevelHierarchyRootEntity(AZ::Entity* hierarchyRoot)
@@ -97,15 +97,28 @@ namespace Multiplayer
void NetworkTransformComponent::OnParentIdChangedEvent([[maybe_unused]] NetEntityId newParent)
{
const ConstNetworkEntityHandle rootHandle = GetNetworkEntityManager()->GetEntity(newParent);
if (rootHandle.Exists())
if (newParent == InvalidNetEntityId)
{
const AZ::EntityId parentEntityId = rootHandle.GetEntity()->GetId();
if (AzFramework::TransformComponent* transformComponent = GetEntity()->FindComponent<AzFramework::TransformComponent>())
{
if (transformComponent->GetParentId() != parentEntityId)
if (transformComponent->GetParentId() != AZ::EntityId())
{
transformComponent->SetParent(parentEntityId);
transformComponent->SetParent(AZ::EntityId());
}
}
}
else
{
const ConstNetworkEntityHandle rootHandle = GetNetworkEntityManager()->GetEntity(newParent);
if (rootHandle.Exists())
{
const AZ::EntityId parentEntityId = rootHandle.GetEntity()->GetId();
if (AzFramework::TransformComponent* transformComponent = GetEntity()->FindComponent<AzFramework::TransformComponent>())
{
if (transformComponent->GetParentId() != parentEntityId)
{
transformComponent->SetParent(parentEntityId);
}
}
}
}
@@ -32,8 +32,6 @@
#include <AzFramework/Components/TransformComponent.h>
AZ_CVAR(bool, bg_debugHierarchyActivation, false, nullptr, AZ::ConsoleFunctorFlags::Null, "Helpful messages when debugging network hierarchy behavior");
namespace Multiplayer
{
EntityReplicator::EntityReplicator
@@ -441,22 +439,22 @@ namespace Multiplayer
const AZ::Entity* parentEntity = parentHandle.GetEntity();
if (parentEntity && parentEntity->GetState() == AZ::Entity::State::Active)
{
if (bg_debugHierarchyActivation)
{
AZLOG_DEBUG(
"Entity %s asking for activation - granted",
entity->GetName().c_str());
}
AZLOG
(
NET_HierarchyActivationInfo,
"Hierchical entity %s asking for activation - granted",
entity->GetName().c_str()
);
return true;
}
if (bg_debugHierarchyActivation)
{
AZLOG_DEBUG(
"Entity %s asking for activation - waiting on the parent %u",
entity->GetName().c_str(),
aznumeric_cast<uint32_t>(parentId));
}
AZLOG
(
NET_HierarchyActivationInfo,
"Hierchical entity %s asking for activation - waiting on the parent %u",
entity->GetName().c_str(),
aznumeric_cast<uint32_t>(parentId)
);
return false;
}
}