Merge from development
Signed-off-by: Sergey Pereslavtsev <pereslav@amazon.com>
This commit is contained in:
+14
-16
@@ -912,24 +912,22 @@ namespace Multiplayer
|
||||
;
|
||||
}
|
||||
|
||||
AzNetworking::TimeoutResult EntityReplicationManager::OrphanedEntityRpcs::HandleTimeout(AzNetworking::TimeoutQueue::TimeoutItem& item)
|
||||
{
|
||||
NetEntityId timedOutEntityId = aznumeric_cast<NetEntityId>(item.m_userData);
|
||||
auto entityRpcsIter = m_entityRpcMap.find(timedOutEntityId);
|
||||
if (entityRpcsIter != m_entityRpcMap.end())
|
||||
{
|
||||
for (NetworkEntityRpcMessage& rpcMessage : entityRpcsIter->second.m_rpcMessages)
|
||||
{
|
||||
m_replicationManager.DispatchOrphanedRpc(rpcMessage, nullptr);
|
||||
}
|
||||
m_entityRpcMap.erase(entityRpcsIter);
|
||||
}
|
||||
return AzNetworking::TimeoutResult::Delete;
|
||||
}
|
||||
|
||||
void EntityReplicationManager::OrphanedEntityRpcs::Update()
|
||||
{
|
||||
m_timeoutQueue.UpdateTimeouts(*this);
|
||||
m_timeoutQueue.UpdateTimeouts([this](AzNetworking::TimeoutQueue::TimeoutItem& item)
|
||||
{
|
||||
NetEntityId timedOutEntityId = aznumeric_cast<NetEntityId>(item.m_userData);
|
||||
auto entityRpcsIter = m_entityRpcMap.find(timedOutEntityId);
|
||||
if (entityRpcsIter != m_entityRpcMap.end())
|
||||
{
|
||||
for (NetworkEntityRpcMessage& rpcMessage : entityRpcsIter->second.m_rpcMessages)
|
||||
{
|
||||
m_replicationManager.DispatchOrphanedRpc(rpcMessage, nullptr);
|
||||
}
|
||||
m_entityRpcMap.erase(entityRpcsIter);
|
||||
}
|
||||
return AzNetworking::TimeoutResult::Delete;
|
||||
});
|
||||
}
|
||||
|
||||
bool EntityReplicationManager::OrphanedEntityRpcs::DispatchOrphanedRpcs(EntityReplicator& entityReplicator)
|
||||
|
||||
@@ -9,61 +9,53 @@
|
||||
#include <Source/NetworkEntity/NetworkEntityAuthorityTracker.h>
|
||||
#include <Multiplayer/Components/NetBindComponent.h>
|
||||
#include <Multiplayer/NetworkEntity/INetworkEntityManager.h>
|
||||
#include <Multiplayer/EntityDomains/IEntityDomain.h>
|
||||
#include <AzCore/Console/IConsole.h>
|
||||
#include <AzCore/Console/ILogger.h>
|
||||
#include <AzCore/EBus/IEventScheduler.h>
|
||||
#include <AzNetworking/Utilities/NetworkCommon.h>
|
||||
#include <AzNetworking/Serialization/NetworkOutputSerializer.h>
|
||||
|
||||
namespace Multiplayer
|
||||
{
|
||||
AZ_CVAR(AZ::TimeMs, net_EntityMigrationTimeoutMs, AZ::TimeMs{ 1000 }, nullptr, AZ::ConsoleFunctorFlags::Null, "Time to wait for a new authority to attach to an entity before we delete the entity");
|
||||
AZ_CVAR(AZ::TimeMs, net_DefaultEntityMigrationTimeoutMs, AZ::TimeMs{ 1000 }, nullptr, AZ::ConsoleFunctorFlags::Null, "Time to wait for a new authority to attach to an entity before we delete the entity");
|
||||
|
||||
NetworkEntityAuthorityTracker::NetworkEntityAuthorityTracker(INetworkEntityManager& networkEntityManager)
|
||||
: m_networkEntityManager(networkEntityManager)
|
||||
, m_timeoutTimeMs(net_DefaultEntityMigrationTimeoutMs)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void NetworkEntityAuthorityTracker::SetTimeoutTimeMs(AZ::TimeMs timeoutTimeMs)
|
||||
{
|
||||
m_timeoutTimeMs = timeoutTimeMs;
|
||||
}
|
||||
|
||||
bool NetworkEntityAuthorityTracker::AddEntityAuthorityManager(ConstNetworkEntityHandle entityHandle, const HostId& newOwner)
|
||||
{
|
||||
bool ret = false;
|
||||
auto timeoutData = m_timeoutDataMap.find(entityHandle.GetNetEntityId());
|
||||
if (timeoutData != m_timeoutDataMap.end())
|
||||
auto timeoutData = m_timedOutNetEntityIds.find(entityHandle.GetNetEntityId());
|
||||
if (timeoutData != m_timedOutNetEntityIds.end())
|
||||
{
|
||||
AZLOG
|
||||
(
|
||||
NET_AuthTracker,
|
||||
"AuthTracker: Removing timeout for networkEntityId %llu from %s, new owner is %s",
|
||||
"AuthTracker: Removing timeout for networkEntityId %llu, new owner is %s",
|
||||
aznumeric_cast<AZ::u64>(entityHandle.GetNetEntityId()),
|
||||
timeoutData->second.m_previousOwner.GetString().c_str(),
|
||||
newOwner.GetString().c_str()
|
||||
);
|
||||
m_timeoutDataMap.erase(timeoutData);
|
||||
m_timedOutNetEntityIds.erase(timeoutData);
|
||||
ret = true;
|
||||
}
|
||||
|
||||
auto iter = m_entityAuthorityMap.find(entityHandle.GetNetEntityId());
|
||||
if (iter != m_entityAuthorityMap.end())
|
||||
{
|
||||
AZLOG
|
||||
(
|
||||
NET_AuthTracker,
|
||||
"AuthTracker: Assigning networkEntityId %llu from %s to %s",
|
||||
aznumeric_cast<AZ::u64>(entityHandle.GetNetEntityId()),
|
||||
iter->second.back().GetString().c_str(),
|
||||
newOwner.GetString().c_str()
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
AZLOG
|
||||
(
|
||||
NET_AuthTracker,
|
||||
"AuthTracker: Assigning networkEntityId %llu to %s",
|
||||
aznumeric_cast<AZ::u64>(entityHandle.GetNetEntityId()),
|
||||
newOwner.GetString().c_str()
|
||||
);
|
||||
}
|
||||
AZLOG
|
||||
(
|
||||
NET_AuthTracker,
|
||||
"AuthTracker: Assigning networkEntityId %llu to %s",
|
||||
aznumeric_cast<AZ::u64>(entityHandle.GetNetEntityId()),
|
||||
newOwner.GetString().c_str()
|
||||
);
|
||||
|
||||
m_entityAuthorityMap[entityHandle.GetNetEntityId()].push_back(newOwner);
|
||||
return ret;
|
||||
@@ -103,14 +95,35 @@ namespace Multiplayer
|
||||
{
|
||||
AZ_Assert
|
||||
(
|
||||
(m_timeoutDataMap.find(entityHandle.GetNetEntityId()) == m_timeoutDataMap.end()) ||
|
||||
(m_timeoutDataMap[entityHandle.GetNetEntityId()].m_previousOwner == previousOwner),
|
||||
m_timedOutNetEntityIds.find(entityHandle.GetNetEntityId()) == m_timedOutNetEntityIds.end(),
|
||||
"Trying to add something twice to the timeout map, this is unexpected"
|
||||
);
|
||||
m_timeoutQueue.RegisterItem(aznumeric_cast<uint64_t>(entityHandle.GetNetEntityId()), net_EntityMigrationTimeoutMs);
|
||||
TimeoutData& timeoutData = m_timeoutDataMap[entityHandle.GetNetEntityId()];
|
||||
timeoutData.m_entityHandle = entityHandle;
|
||||
timeoutData.m_previousOwner = previousOwner;
|
||||
m_timedOutNetEntityIds.insert(entityHandle.GetNetEntityId());
|
||||
AZ::Interface<AZ::IEventScheduler>::Get()->AddCallback([this, netEntityId = entityHandle.GetNetEntityId()]
|
||||
{
|
||||
auto timeoutData = m_timedOutNetEntityIds.find(netEntityId);
|
||||
if (timeoutData != m_timedOutNetEntityIds.end())
|
||||
{
|
||||
m_timedOutNetEntityIds.erase(timeoutData);
|
||||
ConstNetworkEntityHandle entityHandle = m_networkEntityManager.GetEntity(netEntityId);
|
||||
if (auto entity = entityHandle.GetEntity())
|
||||
{
|
||||
NetEntityRole networkRole = NetEntityRole::InvalidRole;
|
||||
NetBindComponent* netBindComponent = entityHandle.GetNetBindComponent();
|
||||
if (netBindComponent != nullptr)
|
||||
{
|
||||
networkRole = netBindComponent->GetNetEntityRole();
|
||||
}
|
||||
if (networkRole != NetEntityRole::Authority)
|
||||
{
|
||||
m_networkEntityManager.GetEntityDomain()->HandleLossOfAuthoritativeReplicator(entityHandle);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
AZ::Name("Entity authority removal functor"),
|
||||
m_timeoutTimeMs
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -127,18 +140,6 @@ namespace Multiplayer
|
||||
}
|
||||
|
||||
HostId NetworkEntityAuthorityTracker::GetEntityAuthorityManager(ConstNetworkEntityHandle entityHandle) const
|
||||
{
|
||||
HostId hostId = GetEntityAuthorityManagerInternal(entityHandle);
|
||||
AZ_Assert(hostId != InvalidHostId, "Unable to determine manager for entity");
|
||||
return hostId;
|
||||
}
|
||||
|
||||
bool NetworkEntityAuthorityTracker::DoesEntityHaveOwner(ConstNetworkEntityHandle entityHandle) const
|
||||
{
|
||||
return InvalidHostId != GetEntityAuthorityManagerInternal(entityHandle);
|
||||
}
|
||||
|
||||
HostId NetworkEntityAuthorityTracker::GetEntityAuthorityManagerInternal(ConstNetworkEntityHandle entityHandle) const
|
||||
{
|
||||
if (auto localEnt = entityHandle.GetEntity())
|
||||
{
|
||||
@@ -167,52 +168,8 @@ namespace Multiplayer
|
||||
return InvalidHostId;
|
||||
}
|
||||
|
||||
NetworkEntityAuthorityTracker::TimeoutData::TimeoutData(ConstNetworkEntityHandle entityHandle, const HostId& previousOwner)
|
||||
: m_entityHandle(entityHandle)
|
||||
, m_previousOwner(previousOwner)
|
||||
bool NetworkEntityAuthorityTracker::DoesEntityHaveOwner(ConstNetworkEntityHandle entityHandle) const
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
NetworkEntityAuthorityTracker::NetworkEntityTimeoutFunctor::NetworkEntityTimeoutFunctor
|
||||
(
|
||||
NetworkEntityAuthorityTracker& networkEntityAuthorityTracker,
|
||||
INetworkEntityManager& networkEntityManager
|
||||
)
|
||||
: m_networkEntityAuthorityTracker(networkEntityAuthorityTracker)
|
||||
, m_networkEntityManager(networkEntityManager)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
AzNetworking::TimeoutResult NetworkEntityAuthorityTracker::NetworkEntityTimeoutFunctor::HandleTimeout(AzNetworking::TimeoutQueue::TimeoutItem& item)
|
||||
{
|
||||
const NetEntityId netEntityId = aznumeric_cast<NetEntityId>(item.m_userData);
|
||||
auto timeoutData = m_networkEntityAuthorityTracker.m_timeoutDataMap.find(netEntityId);
|
||||
if (timeoutData != m_networkEntityAuthorityTracker.m_timeoutDataMap.end())
|
||||
{
|
||||
m_networkEntityAuthorityTracker.m_timeoutDataMap.erase(timeoutData);
|
||||
ConstNetworkEntityHandle entityHandle = m_networkEntityManager.GetEntity(netEntityId);
|
||||
if (auto entity = entityHandle.GetEntity())
|
||||
{
|
||||
NetEntityRole networkRole = NetEntityRole::InvalidRole;
|
||||
NetBindComponent* netBindComponent = entityHandle.GetNetBindComponent();
|
||||
if (netBindComponent != nullptr)
|
||||
{
|
||||
networkRole = netBindComponent->GetNetEntityRole();
|
||||
}
|
||||
if (networkRole != NetEntityRole::Authority)
|
||||
{
|
||||
AZLOG_ERROR
|
||||
(
|
||||
"Timed out entity id %llu during migration previous owner %s, removing it",
|
||||
aznumeric_cast<AZ::u64>(entityHandle.GetNetEntityId()),
|
||||
timeoutData->second.m_previousOwner.GetString().c_str()
|
||||
);
|
||||
m_networkEntityManager.MarkForRemoval(entityHandle);
|
||||
}
|
||||
}
|
||||
}
|
||||
return AzNetworking::TimeoutResult::Delete;
|
||||
return InvalidHostId != GetEntityAuthorityManager(entityHandle);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <AzCore/std/containers/unordered_map.h>
|
||||
#include <AzNetworking/DataStructures/TimeoutQueue.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityTracker.h>
|
||||
#include <Multiplayer/NetworkEntity/INetworkEntityManager.h>
|
||||
|
||||
namespace Multiplayer
|
||||
{
|
||||
@@ -23,43 +24,21 @@ namespace Multiplayer
|
||||
public:
|
||||
NetworkEntityAuthorityTracker(INetworkEntityManager& networkEntityManager);
|
||||
|
||||
void SetTimeoutTimeMs(AZ::TimeMs timeoutTimeMs);
|
||||
bool DoesEntityHaveOwner(ConstNetworkEntityHandle entityHandle) const;
|
||||
bool AddEntityAuthorityManager(ConstNetworkEntityHandle entityHandle, const HostId& newOwner);
|
||||
void RemoveEntityAuthorityManager(ConstNetworkEntityHandle entityHandle, const HostId& previousOwner);
|
||||
HostId GetEntityAuthorityManager(ConstNetworkEntityHandle entityHandle) const;
|
||||
|
||||
private:
|
||||
|
||||
HostId GetEntityAuthorityManagerInternal(ConstNetworkEntityHandle entityHandle) const;
|
||||
|
||||
NetworkEntityAuthorityTracker& operator= (const NetworkEntityAuthorityTracker&) = delete;
|
||||
|
||||
struct TimeoutData final
|
||||
{
|
||||
TimeoutData() = default;
|
||||
TimeoutData(ConstNetworkEntityHandle entityHandle, const HostId& previousOwner);
|
||||
ConstNetworkEntityHandle m_entityHandle;
|
||||
HostId m_previousOwner = InvalidHostId;
|
||||
};
|
||||
|
||||
struct NetworkEntityTimeoutFunctor final
|
||||
: public AzNetworking::ITimeoutHandler
|
||||
{
|
||||
NetworkEntityTimeoutFunctor(NetworkEntityAuthorityTracker& networkEntityAuthorityTracker, INetworkEntityManager& m_networkEntityManager);
|
||||
AzNetworking::TimeoutResult HandleTimeout(AzNetworking::TimeoutQueue::TimeoutItem& item) override;
|
||||
private:
|
||||
AZ_DISABLE_COPY_MOVE(NetworkEntityTimeoutFunctor);
|
||||
NetworkEntityAuthorityTracker& m_networkEntityAuthorityTracker;
|
||||
INetworkEntityManager& m_networkEntityManager;
|
||||
};
|
||||
|
||||
using TimeoutDataMap = AZStd::unordered_map<NetEntityId, TimeoutData>;
|
||||
using EntityAuthorityMap = AZStd::unordered_map<NetEntityId, AZStd::vector<HostId>>;
|
||||
|
||||
TimeoutDataMap m_timeoutDataMap;
|
||||
NetEntityIdSet m_timedOutNetEntityIds;
|
||||
EntityAuthorityMap m_entityAuthorityMap;
|
||||
INetworkEntityManager& m_networkEntityManager;
|
||||
AzNetworking::TimeoutQueue m_timeoutQueue;
|
||||
|
||||
AZ::TimeMs m_timeoutTimeMs = AZ::TimeMs{ 0 };
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -28,12 +28,10 @@
|
||||
namespace Multiplayer
|
||||
{
|
||||
AZ_CVAR(bool, net_DebugCheckNetworkEntityManager, false, nullptr, AZ::ConsoleFunctorFlags::Null, "Enables extra debug checks inside the NetworkEntityManager");
|
||||
AZ_CVAR(AZ::TimeMs, net_EntityDomainUpdateMs, AZ::TimeMs{ 500 }, nullptr, AZ::ConsoleFunctorFlags::Null, "Frequency for updating the entity domain in ms");
|
||||
|
||||
NetworkEntityManager::NetworkEntityManager()
|
||||
: m_networkEntityAuthorityTracker(*this)
|
||||
, m_removeEntitiesEvent([this] { RemoveEntities(); }, AZ::Name("NetworkEntityManager remove entities event"))
|
||||
, m_updateEntityDomainEvent([this] { UpdateEntityDomain(); }, AZ::Name("NetworkEntityManager update entity domain event"))
|
||||
{
|
||||
AZ::Interface<INetworkEntityManager>::Register(this);
|
||||
AzFramework::RootSpawnableNotificationBus::Handler::BusConnect();
|
||||
@@ -63,8 +61,6 @@ namespace Multiplayer
|
||||
}
|
||||
|
||||
m_entityDomain = AZStd::move(entityDomain);
|
||||
m_updateEntityDomainEvent.Enqueue(net_EntityDomainUpdateMs, true);
|
||||
m_entityDomain->ActivateTracking(m_ownedEntities);
|
||||
}
|
||||
|
||||
bool NetworkEntityManager::IsInitialized() const
|
||||
@@ -231,6 +227,74 @@ namespace Multiplayer
|
||||
m_localDeferredRpcMessages.emplace_back(AZStd::move(message));
|
||||
}
|
||||
|
||||
void NetworkEntityManager::HandleEntitiesExitDomain(const NetEntityIdSet& entitiesNotInDomain)
|
||||
{
|
||||
for (NetEntityId exitingId : entitiesNotInDomain)
|
||||
{
|
||||
bool safeToExit = true;
|
||||
NetworkEntityHandle entityHandle = m_networkEntityTracker.Get(exitingId);
|
||||
|
||||
// We need special handling for the NetworkHierarchy as well, since related entities need to be migrated together
|
||||
NetworkHierarchyRootComponentController* hierarchyRootController = entityHandle.FindController<NetworkHierarchyRootComponentController>();
|
||||
NetworkHierarchyChildComponentController* hierarchyChildController = entityHandle.FindController<NetworkHierarchyChildComponentController>();
|
||||
|
||||
// Find the root entity
|
||||
AZ::Entity* hierarchyRootEntity = nullptr;
|
||||
if (hierarchyRootController)
|
||||
{
|
||||
hierarchyRootEntity = hierarchyRootController->GetParent().GetHierarchicalRoot();
|
||||
}
|
||||
else if (hierarchyChildController)
|
||||
{
|
||||
hierarchyRootEntity = hierarchyChildController->GetParent().GetHierarchicalRoot();
|
||||
}
|
||||
|
||||
if (hierarchyRootEntity)
|
||||
{
|
||||
NetEntityId rootNetId = GetNetEntityIdById(hierarchyRootEntity->GetId());
|
||||
ConstNetworkEntityHandle rootEntityHandle = GetEntity(rootNetId);
|
||||
|
||||
// Check if the root entity is still tracked by this authority
|
||||
if (rootEntityHandle.Exists() && rootEntityHandle.GetNetBindComponent()->HasController())
|
||||
{
|
||||
safeToExit = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Validate that we aren't already planning to remove this entity
|
||||
if (safeToExit)
|
||||
{
|
||||
for (auto remoteEntityId : m_removeList)
|
||||
{
|
||||
if (remoteEntityId == remoteEntityId)
|
||||
{
|
||||
safeToExit = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (safeToExit)
|
||||
{
|
||||
// Tell all the attached replicators for this entity that it's exited the domain
|
||||
m_entityExitDomainEvent.Signal(entityHandle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkEntityManager::ForceAssumeAuthority(const ConstNetworkEntityHandle& entityHandle)
|
||||
{
|
||||
NetBindComponent* netBindComponent = entityHandle.GetNetBindComponent();
|
||||
if (netBindComponent != nullptr)
|
||||
{
|
||||
netBindComponent->ConstructControllers();
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkEntityManager::SetMigrateTimeoutTimeMs(AZ::TimeMs timeoutTimeMs)
|
||||
{
|
||||
m_networkEntityAuthorityTracker.SetTimeoutTimeMs(timeoutTimeMs);
|
||||
}
|
||||
|
||||
void NetworkEntityManager::DebugDraw() const
|
||||
{
|
||||
AzFramework::DebugDisplayRequestBus::BusPtr debugDisplayBus;
|
||||
@@ -249,7 +313,7 @@ namespace Multiplayer
|
||||
}
|
||||
|
||||
entityBounds.Expand(AZ::Vector3(0.01f));
|
||||
if (netBindComponent->GetNetEntityRole() == NetEntityRole::Authority)
|
||||
if ((netBindComponent != nullptr) && netBindComponent->GetNetEntityRole() == NetEntityRole::Authority)
|
||||
{
|
||||
debugDisplay->SetColor(AZ::Colors::Black);
|
||||
debugDisplay->SetAlpha(0.5f);
|
||||
@@ -283,51 +347,11 @@ namespace Multiplayer
|
||||
m_localDeferredRpcMessages.clear();
|
||||
}
|
||||
|
||||
void NetworkEntityManager::UpdateEntityDomain()
|
||||
{
|
||||
if (m_entityDomain == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const IEntityDomain::EntitiesNotInDomain& entitiesNotInDomain = m_entityDomain->RetrieveEntitiesNotInDomain();
|
||||
for (NetEntityId exitingId : entitiesNotInDomain)
|
||||
{
|
||||
OnEntityExitDomain(exitingId, entitiesNotInDomain);
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkEntityManager::OnEntityExitDomain(NetEntityId entityId, const IEntityDomain::EntitiesNotInDomain& entitiesNotInDomain)
|
||||
{
|
||||
NetworkEntityHandle entityHandle = m_networkEntityTracker.Get(entityId);
|
||||
|
||||
bool safeToExit = IsHierarchySafeToExit(entityHandle, entitiesNotInDomain);
|
||||
|
||||
// Validate that we aren't already planning to remove this entity
|
||||
if (safeToExit)
|
||||
{
|
||||
for (auto remoteEntityId : m_removeList)
|
||||
{
|
||||
if (remoteEntityId == remoteEntityId)
|
||||
{
|
||||
safeToExit = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (safeToExit)
|
||||
{
|
||||
m_entityExitDomainEvent.Signal(entityHandle);
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkEntityManager::Reset()
|
||||
{
|
||||
m_multiplayerComponentRegistry.Reset();
|
||||
m_removeList.clear();
|
||||
m_entityDomain = nullptr;
|
||||
m_updateEntityDomainEvent.RemoveFromQueue();
|
||||
m_ownedEntities.clear();
|
||||
m_entityExitDomainEvent.DisconnectAllHandlers();
|
||||
m_onEntityMarkedDirty.DisconnectAllHandlers();
|
||||
m_onEntityNotifyChanges.DisconnectAllHandlers();
|
||||
|
||||
@@ -79,14 +79,13 @@ namespace Multiplayer
|
||||
void NotifyControllersActivated(const ConstNetworkEntityHandle& entityHandle, EntityIsMigrating entityIsMigrating) override;
|
||||
void NotifyControllersDeactivated(const ConstNetworkEntityHandle& entityHandle, EntityIsMigrating entityIsMigrating) override;
|
||||
void HandleLocalRpcMessage(NetworkEntityRpcMessage& message) override;
|
||||
void HandleEntitiesExitDomain(const NetEntityIdSet& entitiesNotInDomain) override;
|
||||
void ForceAssumeAuthority(const ConstNetworkEntityHandle& entityHandle) override;
|
||||
void SetMigrateTimeoutTimeMs(AZ::TimeMs timeoutTimeMs) override;
|
||||
void DebugDraw() const override;
|
||||
//! @}
|
||||
|
||||
void DispatchLocalDeferredRpcMessages();
|
||||
void UpdateEntityDomain();
|
||||
void OnEntityExitDomain(NetEntityId entityId, const IEntityDomain::EntitiesNotInDomain& entitiesNotInDomain);
|
||||
|
||||
bool IsHierarchySafeToExit(NetworkEntityHandle& entityHandle, const IEntityDomain::EntitiesNotInDomain& entitiesNotInDomain);
|
||||
|
||||
//! RootSpawnableNotificationBus
|
||||
//! @{
|
||||
@@ -108,9 +107,6 @@ namespace Multiplayer
|
||||
AZ::ScheduledEvent m_removeEntitiesEvent;
|
||||
AZStd::vector<NetEntityId> m_removeList;
|
||||
AZStd::unique_ptr<IEntityDomain> m_entityDomain;
|
||||
AZ::ScheduledEvent m_updateEntityDomainEvent;
|
||||
|
||||
OwnedEntitySet m_ownedEntities;
|
||||
|
||||
EntityExitDomainEvent m_entityExitDomainEvent;
|
||||
AZ::Event<> m_onEntityMarkedDirty;
|
||||
|
||||
Reference in New Issue
Block a user