Further fixes to get client migrations functional, plus a bug fix from the netBindComponent lookup optimization
Signed-off-by: kberg-amzn <karlberg@amazon.com>
This commit is contained in:
+10
-8
@@ -386,17 +386,18 @@ namespace Multiplayer
|
||||
if (changedRemoteRole || changedLocalRole)
|
||||
{
|
||||
const uint32_t intEntityId = static_cast<uint32_t>(netBindComponent->GetNetEntityId());
|
||||
const char* entityName = entityReplicator->GetEntityHandle().GetEntity()->GetName().c_str();
|
||||
if (changedLocalRole)
|
||||
{
|
||||
const char* oldRoleString = GetEnumString(entityReplicator->GetRemoteNetworkRole());
|
||||
const char* newRoleString = GetEnumString(remoteNetworkRole);
|
||||
AZLOG(NET_ReplicatorRoles, "Replicator %u changed local role, old role = %s, new role = %s", intEntityId, oldRoleString, newRoleString);
|
||||
AZLOG(NET_ReplicatorRoles, "Replicator %s(%u) changed local role, old role = %s, new role = %s", entityName, intEntityId, oldRoleString, newRoleString);
|
||||
}
|
||||
if (changedRemoteRole)
|
||||
{
|
||||
const char* oldRoleString = GetEnumString(entityReplicator->GetBoundLocalNetworkRole());
|
||||
const char* newRoleString = GetEnumString(netBindComponent->GetNetEntityRole());
|
||||
AZLOG(NET_ReplicatorRoles, "Replicator %u changed remote role, old role = %s, new role = %s", intEntityId, oldRoleString, newRoleString);
|
||||
AZLOG(NET_ReplicatorRoles, "Replicator %s(%u) changed remote role, old role = %s, new role = %s", entityName, intEntityId, oldRoleString, newRoleString);
|
||||
}
|
||||
|
||||
// If we changed roles, we need to reset everything
|
||||
@@ -605,9 +606,9 @@ namespace Multiplayer
|
||||
NetBindComponent* netBindComponent = replicatorEntity.GetNetBindComponent();
|
||||
AZ_Assert(netBindComponent != nullptr, "No NetBindComponent");
|
||||
|
||||
if (createEntity)
|
||||
if (netBindComponent->GetOwningConnectionId() != invokingConnection->GetConnectionId())
|
||||
{
|
||||
// Always set our invoking connectionId for any newly created entities, since this connection now 'owns' them from a rewind perspective
|
||||
// Always ensure our owning connectionId is correct for correct rewind behaviour
|
||||
netBindComponent->SetOwningConnectionId(invokingConnection->GetConnectionId());
|
||||
}
|
||||
|
||||
@@ -617,10 +618,11 @@ namespace Multiplayer
|
||||
AZ_Assert(localNetworkRole != NetEntityRole::Authority, "UpdateMessage trying to set local role to Authority, this should only happen via migration");
|
||||
AZLOG_INFO
|
||||
(
|
||||
"EntityReplicationManager: Changing network role on entity %u, old role %u new role %u",
|
||||
"EntityReplicationManager: Changing network role on entity %s(%u), old role %s new role %s",
|
||||
replicatorEntity.GetEntity()->GetName().c_str(),
|
||||
aznumeric_cast<uint32_t>(netEntityId),
|
||||
aznumeric_cast<uint32_t>(netBindComponent->GetNetEntityRole()),
|
||||
aznumeric_cast<uint32_t>(localNetworkRole)
|
||||
GetEnumString(netBindComponent->GetNetEntityRole()),
|
||||
GetEnumString(localNetworkRole)
|
||||
);
|
||||
|
||||
if (NetworkRoleHasController(localNetworkRole))
|
||||
@@ -1135,7 +1137,7 @@ namespace Multiplayer
|
||||
|
||||
if (m_updateMode == EntityReplicationManager::Mode::LocalServerToRemoteServer)
|
||||
{
|
||||
netBindComponent->NotifyServerMigration(GetRemoteHostId(), GetMigrateHostId(), GetConnection().GetConnectionId());
|
||||
netBindComponent->NotifyServerMigration(GetRemoteHostId());
|
||||
}
|
||||
|
||||
bool didSucceed = true;
|
||||
|
||||
@@ -18,22 +18,14 @@ namespace Multiplayer
|
||||
{
|
||||
ConstNetworkEntityHandle::ConstNetworkEntityHandle(AZ::Entity* entity, const NetworkEntityTracker* networkEntityTracker)
|
||||
: m_entity(entity)
|
||||
, m_networkEntityTracker(networkEntityTracker)
|
||||
, m_networkEntityTracker((networkEntityTracker != nullptr) ? networkEntityTracker : GetNetworkEntityTracker())
|
||||
{
|
||||
if (m_networkEntityTracker == nullptr)
|
||||
{
|
||||
m_networkEntityTracker = GetNetworkEntityTracker();
|
||||
}
|
||||
|
||||
if (m_networkEntityTracker)
|
||||
{
|
||||
m_changeDirty = m_networkEntityTracker->GetChangeDirty(m_entity);
|
||||
}
|
||||
AZ_Assert(m_networkEntityTracker, "NetworkEntityTracker is not valid");
|
||||
m_changeDirty = m_networkEntityTracker->GetChangeDirty(m_entity);
|
||||
|
||||
if (entity)
|
||||
{
|
||||
AZ_Assert(networkEntityTracker, "NetworkEntityTracker is not valid");
|
||||
m_netBindComponent = networkEntityTracker->GetNetBindComponent(entity);
|
||||
m_netBindComponent = m_networkEntityTracker->GetNetBindComponent(entity);
|
||||
if (m_netBindComponent != nullptr)
|
||||
{
|
||||
m_netEntityId = m_netBindComponent->GetNetEntityId();
|
||||
|
||||
@@ -46,6 +46,20 @@ namespace Multiplayer
|
||||
void NetworkEntityManager::Initialize(const HostId& hostId, AZStd::unique_ptr<IEntityDomain> entityDomain)
|
||||
{
|
||||
m_hostId = hostId;
|
||||
|
||||
// Configure our vended NetEntityIds so that no two hosts generate the same NetEntityId
|
||||
{
|
||||
// Needs more thought
|
||||
const uint64_t addrPortion = hostId.GetAddress(AzNetworking::ByteOrder::Host);
|
||||
const uint64_t portPortion = hostId.GetPort(AzNetworking::ByteOrder::Host);
|
||||
const uint64_t hostIdentifier = (portPortion << 32) | addrPortion;
|
||||
const AZ::HashValue32 hostHash = AZ::TypeHash32(hostIdentifier);
|
||||
|
||||
NetEntityId hostEntityIdOffset = static_cast<NetEntityId>(hostHash) << 32;
|
||||
m_nextEntityId &= NetEntityId{ 0x0000000000000000FFFFFFFFFFFFFFFF };
|
||||
m_nextEntityId |= hostEntityIdOffset;
|
||||
}
|
||||
|
||||
m_entityDomain = AZStd::move(entityDomain);
|
||||
m_updateEntityDomainEvent.Enqueue(net_EntityDomainUpdateMs, true);
|
||||
m_entityDomain->ActivateTracking(m_ownedEntities);
|
||||
|
||||
Reference in New Issue
Block a user