Ported the local prediction player controller component
This commit is contained in:
+16
-18
@@ -14,14 +14,14 @@
|
||||
#include <Source/NetworkEntity/EntityReplication/EntityReplicator.h>
|
||||
#include <Source/NetworkEntity/EntityReplication/PropertyPublisher.h>
|
||||
#include <Source/NetworkEntity/EntityReplication/PropertySubscriber.h>
|
||||
#include <Source/ReplicationWindows/IReplicationWindow.h>
|
||||
#include <Source/EntityDomains/IEntityDomain.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityUpdateMessage.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityRpcMessage.h>
|
||||
#include <Source/NetworkEntity/INetworkEntityManager.h>
|
||||
#include <Source/Components/NetBindComponent.h>
|
||||
#include <Source/AutoGen/Multiplayer.AutoPackets.h>
|
||||
#include <Include/IEntityDomain.h>
|
||||
#include <Include/IMultiplayer.h>
|
||||
#include <Include/INetworkEntityManager.h>
|
||||
#include <Include/IReplicationWindow.h>
|
||||
#include <AzNetworking/ConnectionLayer/IConnection.h>
|
||||
#include <AzNetworking/ConnectionLayer/IConnectionListener.h>
|
||||
#include <AzNetworking/PacketLayer/IPacketHeader.h>
|
||||
@@ -93,10 +93,10 @@ namespace Multiplayer
|
||||
}
|
||||
}
|
||||
|
||||
void EntityReplicationManager::SendUpdates(AZ::TimeMs serverGameTimeMs)
|
||||
void EntityReplicationManager::SendUpdates(AZ::TimeMs hostTimeMs)
|
||||
{
|
||||
m_frameTimeMs = AZ::GetElapsedTimeMs();
|
||||
SendEntityUpdates(serverGameTimeMs);
|
||||
SendEntityUpdates(hostTimeMs);
|
||||
|
||||
SendEntityRpcs(m_deferredRpcMessagesReliable, true);
|
||||
SendEntityRpcs(m_deferredRpcMessagesUnreliable, false);
|
||||
@@ -118,7 +118,7 @@ namespace Multiplayer
|
||||
|
||||
void EntityReplicationManager::SendEntityUpdatesPacketHelper
|
||||
(
|
||||
AZ::TimeMs serverGameTimeMs,
|
||||
AZ::TimeMs hostTimeMs,
|
||||
EntityReplicatorList& toSendList,
|
||||
uint32_t maxPayloadSize,
|
||||
AzNetworking::IConnection& connection
|
||||
@@ -127,7 +127,8 @@ namespace Multiplayer
|
||||
uint32_t pendingPacketSize = 0;
|
||||
EntityReplicatorList replicatorUpdatedList;
|
||||
MultiplayerPackets::EntityUpdates entityUpdatePacket;
|
||||
entityUpdatePacket.SetHostTimeMs(serverGameTimeMs);
|
||||
entityUpdatePacket.SetHostTimeMs(hostTimeMs);
|
||||
entityUpdatePacket.SetHostFrameId(InvalidHostFrameId);
|
||||
// Serialize everything
|
||||
while (!toSendList.empty())
|
||||
{
|
||||
@@ -249,7 +250,7 @@ namespace Multiplayer
|
||||
return toSendList;
|
||||
}
|
||||
|
||||
void EntityReplicationManager::SendEntityUpdates(AZ::TimeMs serverGameTimeMs)
|
||||
void EntityReplicationManager::SendEntityUpdates(AZ::TimeMs hostTimeMs)
|
||||
{
|
||||
EntityReplicatorList toSendList = GenerateEntityUpdateList();
|
||||
|
||||
@@ -264,7 +265,7 @@ namespace Multiplayer
|
||||
// While our to send list is not empty, build up another packet to send
|
||||
do
|
||||
{
|
||||
SendEntityUpdatesPacketHelper(serverGameTimeMs, toSendList, m_maxPayloadSize, m_connection);
|
||||
SendEntityUpdatesPacketHelper(hostTimeMs, toSendList, m_maxPayloadSize, m_connection);
|
||||
} while (!toSendList.empty());
|
||||
}
|
||||
|
||||
@@ -747,7 +748,7 @@ namespace Multiplayer
|
||||
|
||||
bool EntityReplicationManager::HandleEntityUpdateMessage
|
||||
(
|
||||
[[maybe_unused]] AzNetworking::IConnection* connection,
|
||||
[[maybe_unused]] AzNetworking::IConnection* invokingConnection,
|
||||
const AzNetworking::IPacketHeader& packetHeader,
|
||||
const NetworkEntityUpdateMessage& updateMessage
|
||||
)
|
||||
@@ -803,7 +804,7 @@ namespace Multiplayer
|
||||
return handled;
|
||||
}
|
||||
|
||||
bool EntityReplicationManager::HandleEntityRpcMessage([[maybe_unused]] AzNetworking::IConnection* connection, NetworkEntityRpcMessage& message)
|
||||
bool EntityReplicationManager::HandleEntityRpcMessage(AzNetworking::IConnection* invokingConnection, NetworkEntityRpcMessage& message)
|
||||
{
|
||||
EntityReplicator* entityReplicator = GetEntityReplicator(message.GetEntityId());
|
||||
const bool isReplicatorValid = (entityReplicator != nullptr) && !entityReplicator->IsMarkedForRemoval();
|
||||
@@ -815,7 +816,7 @@ namespace Multiplayer
|
||||
}
|
||||
else
|
||||
{
|
||||
return entityReplicator->HandleRpcMessage(message);
|
||||
return entityReplicator->HandleRpcMessage(invokingConnection, message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -833,8 +834,7 @@ namespace Multiplayer
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
return entityReplicator->HandleRpcMessage(message);
|
||||
return entityReplicator->HandleRpcMessage(nullptr, message);
|
||||
}
|
||||
|
||||
AZ::TimeMs EntityReplicationManager::GetResendTimeoutTimeMs() const
|
||||
@@ -877,7 +877,6 @@ 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())
|
||||
{
|
||||
@@ -887,7 +886,6 @@ namespace Multiplayer
|
||||
}
|
||||
m_entityRpcMap.erase(entityRpcsIter);
|
||||
}
|
||||
|
||||
return AzNetworking::TimeoutResult::Delete;
|
||||
}
|
||||
|
||||
@@ -1089,7 +1087,7 @@ namespace Multiplayer
|
||||
|
||||
if (m_updateMode == EntityReplicationManager::Mode::LocalServerToRemoteServer)
|
||||
{
|
||||
netBindComponent->NotifyMigration(GetRemoteHostId(), GetConnection().GetConnectionId());
|
||||
netBindComponent->NotifyServerMigration(GetRemoteHostId(), GetConnection().GetConnectionId());
|
||||
}
|
||||
|
||||
bool didSucceed = true;
|
||||
@@ -1127,7 +1125,7 @@ namespace Multiplayer
|
||||
}
|
||||
}
|
||||
|
||||
bool EntityReplicationManager::HandleMessage([[maybe_unused]] AzNetworking::IConnection* connection, MultiplayerPackets::EntityMigration& message)
|
||||
bool EntityReplicationManager::HandleMessage([[maybe_unused]] AzNetworking::IConnection* invokingConnection, MultiplayerPackets::EntityMigration& message)
|
||||
{
|
||||
EntityReplicator* replicator = GetEntityReplicator(message.GetEntityId());
|
||||
{
|
||||
|
||||
+13
-17
@@ -13,11 +13,11 @@
|
||||
#pragma once
|
||||
|
||||
#include <Source/NetworkEntity/EntityReplication/EntityReplicator.h>
|
||||
#include <Source/NetworkEntity/INetworkEntityManager.h>
|
||||
#include <Source/ReplicationWindows/IReplicationWindow.h>
|
||||
#include <Source/EntityDomains/IEntityDomain.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityHandle.h>
|
||||
#include <Source/Components/NetBindComponent.h>
|
||||
#include <Include/INetworkEntityManager.h>
|
||||
#include <Include/IReplicationWindow.h>
|
||||
#include <Include/IEntityDomain.h>
|
||||
#include <Include/NetworkEntityHandle.h>
|
||||
#include <AzNetworking/DataStructures/TimeoutQueue.h>
|
||||
#include <AzNetworking/PacketLayer/IPacketHeader.h>
|
||||
#include <AzCore/std/containers/map.h>
|
||||
@@ -59,7 +59,7 @@ namespace Multiplayer
|
||||
HostId GetRemoteHostId() const;
|
||||
|
||||
void ActivatePendingEntities();
|
||||
void SendUpdates(AZ::TimeMs serverGameTimeMs);
|
||||
void SendUpdates(AZ::TimeMs hostTimeMs);
|
||||
void Clear(bool forMigration);
|
||||
|
||||
bool SetEntityRebasing(NetworkEntityHandle& entityHandle);
|
||||
@@ -82,10 +82,10 @@ namespace Multiplayer
|
||||
|
||||
void AddAutonomousEntityReplicatorCreatedHandle(AZ::Event<NetEntityId>::Handler& handler);
|
||||
|
||||
bool HandleMessage(AzNetworking::IConnection* connection, MultiplayerPackets::EntityMigration& message);
|
||||
bool HandleMessage(AzNetworking::IConnection* invokingConnection, MultiplayerPackets::EntityMigration& message);
|
||||
bool HandleEntityDeleteMessage(EntityReplicator* entityReplicator, const AzNetworking::IPacketHeader& packetHeader, const NetworkEntityUpdateMessage& updateMessage);
|
||||
bool HandleEntityUpdateMessage(AzNetworking::IConnection* connection, const AzNetworking::IPacketHeader& packetHeader, const NetworkEntityUpdateMessage& updateMessage);
|
||||
bool HandleEntityRpcMessage(AzNetworking::IConnection* connection, NetworkEntityRpcMessage& message);
|
||||
bool HandleEntityUpdateMessage(AzNetworking::IConnection* invokingConnection, const AzNetworking::IPacketHeader& packetHeader, const NetworkEntityUpdateMessage& updateMessage);
|
||||
bool HandleEntityRpcMessage(AzNetworking::IConnection* invokingConnection, NetworkEntityRpcMessage& message);
|
||||
|
||||
AZ::TimeMs GetResendTimeoutTimeMs() const;
|
||||
|
||||
@@ -118,9 +118,9 @@ namespace Multiplayer
|
||||
using EntityReplicatorList = AZStd::deque<EntityReplicator*>;
|
||||
EntityReplicatorList GenerateEntityUpdateList();
|
||||
|
||||
void SendEntityUpdatesPacketHelper(AZ::TimeMs serverGameTimeMs, EntityReplicatorList& toSendList, uint32_t maxPayloadSize, AzNetworking::IConnection& connection);
|
||||
void SendEntityUpdatesPacketHelper(AZ::TimeMs hostTimeMs, EntityReplicatorList& toSendList, uint32_t maxPayloadSize, AzNetworking::IConnection& connection);
|
||||
|
||||
void SendEntityUpdates(AZ::TimeMs serverGameTimeMs);
|
||||
void SendEntityUpdates(AZ::TimeMs hostTimeMs);
|
||||
void SendEntityRpcs(RpcMessages& deferredRpcs, bool reliable);
|
||||
|
||||
void MigrateEntityInternal(NetEntityId entityId);
|
||||
@@ -155,31 +155,27 @@ namespace Multiplayer
|
||||
OrphanedEntityRpcs(EntityReplicationManager& replicationManager);
|
||||
void Update();
|
||||
bool DispatchOrphanedRpcs(EntityReplicator& entityReplicator);
|
||||
void AddOrphanedRpc(NetEntityId entityId, NetworkEntityRpcMessage& entityPrcMessage);
|
||||
void AddOrphanedRpc(NetEntityId entityId, NetworkEntityRpcMessage& entityRpcMessage);
|
||||
AZStd::size_t Size() const { return m_entityRpcMap.size(); }
|
||||
private:
|
||||
AzNetworking::TimeoutResult HandleTimeout(AzNetworking::TimeoutQueue::TimeoutItem& item) override;
|
||||
|
||||
struct OrphanedRpcs
|
||||
{
|
||||
OrphanedRpcs() = default;
|
||||
OrphanedRpcs(OrphanedRpcs&& rhs)
|
||||
{
|
||||
m_rpcMessages.swap(rhs.m_rpcMessages);
|
||||
m_timeoutId = rhs.m_timeoutId;
|
||||
rhs.m_timeoutId = AzNetworking::TimeoutId{ 0 };
|
||||
m_rpcMessages.swap(rhs.m_rpcMessages);
|
||||
}
|
||||
|
||||
AzNetworking::TimeoutId m_timeoutId = AzNetworking::TimeoutId{ 0 };
|
||||
RpcMessages m_rpcMessages;
|
||||
AzNetworking::TimeoutId m_timeoutId = AzNetworking::TimeoutId{ 0 };
|
||||
};
|
||||
|
||||
typedef AZStd::unordered_map<NetEntityId, OrphanedRpcs> EntityRpcMap;
|
||||
EntityRpcMap m_entityRpcMap;
|
||||
AzNetworking::TimeoutQueue m_timeoutQueue;
|
||||
EntityReplicationManager& m_replicationManager;
|
||||
};
|
||||
|
||||
OrphanedEntityRpcs m_orphanedEntityRpcs;
|
||||
EntityReplicatorMap m_entityReplicatorMap;
|
||||
|
||||
|
||||
@@ -628,7 +628,7 @@ namespace Multiplayer
|
||||
return result;
|
||||
}
|
||||
|
||||
bool EntityReplicator::HandleRpcMessage(NetworkEntityRpcMessage& entityRpcMessage)
|
||||
bool EntityReplicator::HandleRpcMessage(AzNetworking::IConnection* invokingConnection, NetworkEntityRpcMessage& entityRpcMessage)
|
||||
{
|
||||
// Received rpc metrics, log rpc received, time spent, number of bytes, and the componentId/rpcId for bandwidth metrics
|
||||
MultiplayerStats& stats = AZ::Interface<IMultiplayer>::Get()->GetStats();
|
||||
@@ -676,7 +676,7 @@ namespace Multiplayer
|
||||
switch (result)
|
||||
{
|
||||
case RpcValidationResult::HandleRpc:
|
||||
return m_netBindComponent->HandleRpcMessage(GetRemoteNetworkRole(), entityRpcMessage);
|
||||
return m_netBindComponent->HandleRpcMessage(invokingConnection, GetRemoteNetworkRole(), entityRpcMessage);
|
||||
case RpcValidationResult::DropRpc:
|
||||
return true;
|
||||
case RpcValidationResult::DropRpcAndDisconnect:
|
||||
@@ -703,7 +703,7 @@ namespace Multiplayer
|
||||
break;
|
||||
}
|
||||
|
||||
AZ_Assert(false, "Unhandled ERpcValidationResult %d", result);
|
||||
AZ_Assert(false, "Unhandled RpcValidationResult %d", result);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,8 +75,8 @@ namespace Multiplayer
|
||||
const PropertyPublisher* GetPropertyPublisher() const;
|
||||
PropertySubscriber* GetPropertySubscriber();
|
||||
|
||||
// Handlers for messages
|
||||
bool HandleRpcMessage(NetworkEntityRpcMessage& entityRpcMessage);
|
||||
// Handlers for Rpc messages
|
||||
bool HandleRpcMessage(AzNetworking::IConnection* invokingConnection, NetworkEntityRpcMessage& entityRpcMessage);
|
||||
|
||||
//! AZ::EntityBus overrides
|
||||
//! @{
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||
* its licensors.
|
||||
*
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||
* distribution (the "License"). All use of this software is governed by the License,
|
||||
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Source/NetworkEntity/INetworkEntityManager.h>
|
||||
|
||||
namespace Multiplayer
|
||||
{
|
||||
//! @class INetworkEntityDomain
|
||||
//! @brief A class that determines if an entity should belong to a particular EntityManager.
|
||||
class INetworkEntityDomain
|
||||
{
|
||||
public:
|
||||
using EntitiesNotInDomain = AZStd::unordered_set<NetEntityId>;
|
||||
|
||||
virtual ~INetworkEntityDomain() = default;
|
||||
|
||||
//! Enable Entity Domain Exit Tracking for entities on the server.
|
||||
//! @param ownedEntitySet
|
||||
virtual void ActivateTracking(const INetworkEntityManager::OwnedEntitySet& ownedEntitySet) = 0;
|
||||
|
||||
//! Return the set of entities not in this domain.
|
||||
//! @param outEntitiesNotInDomain
|
||||
virtual void RetrieveEntitiesNotInDomain(EntitiesNotInDomain& outEntitiesNotInDomain) const = 0;
|
||||
|
||||
//! Returns whether or not an entity should be owned by an entity manager.
|
||||
//! @param entityHandle the handle of the entity to check for inclusion in the domain
|
||||
//! @return false if this entity should not belong to the entity manger, true if it could be owned by the entity manager
|
||||
virtual bool IsInDomain(const ConstNetworkEntityHandle& entityHandle) const = 0;
|
||||
};
|
||||
}
|
||||
@@ -1,158 +0,0 @@
|
||||
/*
|
||||
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||
* its licensors.
|
||||
*
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||
* distribution (the "License"). All use of this software is governed by the License,
|
||||
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Include/MultiplayerTypes.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityHandle.h>
|
||||
#include <AzCore/Component/Entity.h>
|
||||
#include <AzCore/EBus/Event.h>
|
||||
#include <AzCore/Asset/AssetCommon.h>
|
||||
|
||||
namespace Multiplayer
|
||||
{
|
||||
class NetworkEntityTracker;
|
||||
class NetworkEntityAuthorityTracker;
|
||||
class NetworkEntityRpcMessage;
|
||||
class MultiplayerComponentRegistry;
|
||||
|
||||
using EntityExitDomainEvent = AZ::Event<const ConstNetworkEntityHandle&>;
|
||||
using ControllersActivatedEvent = AZ::Event<const ConstNetworkEntityHandle&, EntityIsMigrating>;
|
||||
using ControllersDeactivatedEvent = AZ::Event<const ConstNetworkEntityHandle&, EntityIsMigrating>;
|
||||
|
||||
//! @class INetworkEntityManager
|
||||
//! @brief The interface for managing all networked entities.
|
||||
class INetworkEntityManager
|
||||
{
|
||||
public:
|
||||
AZ_RTTI(INetworkEntityManager, "{109759DE-9492-439C-A0B1-AE46E6FD029C}");
|
||||
|
||||
using OwnedEntitySet = AZStd::unordered_set<ConstNetworkEntityHandle>;
|
||||
using EntityList = AZStd::vector<NetworkEntityHandle>;
|
||||
|
||||
virtual ~INetworkEntityManager() = default;
|
||||
|
||||
//! Returns the NetworkEntityTracker for this INetworkEntityManager instance.
|
||||
//! @return the NetworkEntityTracker for this INetworkEntityManager instance
|
||||
virtual NetworkEntityTracker* GetNetworkEntityTracker() = 0;
|
||||
|
||||
//! Returns the NetworkEntityAuthorityTracker for this INetworkEntityManager instance.
|
||||
//! @return the NetworkEntityAuthorityTracker for this INetworkEntityManager instance
|
||||
virtual NetworkEntityAuthorityTracker* GetNetworkEntityAuthorityTracker() = 0;
|
||||
|
||||
//! Returns the MultiplayerComponentRegistry for this INetworkEntityManager instance.
|
||||
//! @return the MultiplayerComponentRegistry for this INetworkEntityManager instance
|
||||
virtual MultiplayerComponentRegistry* GetMultiplayerComponentRegistry() = 0;
|
||||
|
||||
//! Returns the HostId for this INetworkEntityManager instance.
|
||||
//! @return the HostId for this INetworkEntityManager instance
|
||||
virtual HostId GetHostId() const = 0;
|
||||
|
||||
//! Creates new entities of the given archetype
|
||||
//! @param prefabEntryId the name of the spawnable to spawn
|
||||
virtual EntityList CreateEntitiesImmediate(
|
||||
const PrefabEntityId& prefabEntryId, NetEntityId netEntityId, NetEntityRole netEntityRole, AutoActivate autoActivate,
|
||||
const AZ::Transform& transform) = 0;
|
||||
|
||||
//! Returns an ConstEntityPtr for the provided entityId.
|
||||
//! @param netEntityId the netEntityId to get an ConstEntityPtr for
|
||||
//! @return the requested ConstEntityPtr
|
||||
virtual ConstNetworkEntityHandle GetEntity(NetEntityId netEntityId) const = 0;
|
||||
|
||||
//! Returns the total number of entities tracked by this INetworkEntityManager instance.
|
||||
//! @return the total number of entities tracked by this INetworkEntityManager instance
|
||||
virtual uint32_t GetEntityCount() const = 0;
|
||||
|
||||
//! Adds the provided entity to the internal entity map identified by the provided netEntityId.
|
||||
//! @param netEntityId the identifier to use for the added entity
|
||||
//! @param entity the entity to add to the internal entity map
|
||||
//! @return a NetworkEntityHandle for the newly added entity
|
||||
virtual NetworkEntityHandle AddEntityToEntityMap(NetEntityId netEntityId, AZ::Entity* entity) = 0;
|
||||
|
||||
//! Marks the specified entity for removal and deletion.
|
||||
//! @param entityHandle the entity to remove and delete
|
||||
virtual void MarkForRemoval(const ConstNetworkEntityHandle& entityHandle) = 0;
|
||||
|
||||
//! Returns true if the indicated entity is marked for removal.
|
||||
//! @param entityHandle the entity to test if marked for removal
|
||||
//! @return boolean true if the specified entity is marked for removal, false otherwise
|
||||
virtual bool IsMarkedForRemoval(const ConstNetworkEntityHandle& entityHandle) const = 0;
|
||||
|
||||
//! Unmarks the specified entity so it will no longer be removed and deleted.
|
||||
//! @param entityHandle the entity to unmark for removal and deletion
|
||||
virtual void ClearEntityFromRemovalList(const ConstNetworkEntityHandle& entityHandle) = 0;
|
||||
|
||||
//! Clears out and deletes all entities registered with the entity manager.
|
||||
virtual void ClearAllEntities() = 0;
|
||||
|
||||
//! Adds an event handler to be invoked when we notify which entities have been marked dirty.
|
||||
//! @param entityMarkedDirtyHandle event handler for the dirtied entity
|
||||
virtual void AddEntityMarkedDirtyHandler(AZ::Event<>::Handler& entityMarkedDirtyHandle) = 0;
|
||||
|
||||
//! Adds an event handler to be invoked when we notify entities to send their change notifications.
|
||||
//! @param entityNotifyChangesHandle event handler for the dirtied entity
|
||||
virtual void AddEntityNotifyChangesHandler(AZ::Event<>::Handler& entityNotifyChangesHandle) = 0;
|
||||
|
||||
//! Adds an event handler to be invoked when we notify entities to send their change notifications.
|
||||
//! @param entityNotifyChangesHandle event handler for the dirtied entity
|
||||
virtual void AddEntityExitDomainHandler(EntityExitDomainEvent::Handler& entityExitDomainHandler) = 0;
|
||||
|
||||
//! Adds an event handler to be invoked when an entities controllers have activated
|
||||
//! @param controllersActivatedHandler event handler for the entity
|
||||
virtual void AddControllersActivatedHandler(ControllersActivatedEvent::Handler& controllersActivatedHandler) = 0;
|
||||
|
||||
//! Adds an event handler to be invoked when an entities controllers have been deactivated
|
||||
//! @param controllersDeactivatedHandler event handler for the entity
|
||||
virtual void AddControllersDeactivatedHandler(ControllersDeactivatedEvent::Handler& controllersDeactivatedHandler) = 0;
|
||||
|
||||
//! Notifies entities that they should process their dirty state.
|
||||
virtual void NotifyEntitiesDirtied() = 0;
|
||||
|
||||
//! Notifies entities that they should process change notifications.
|
||||
virtual void NotifyEntitiesChanged() = 0;
|
||||
|
||||
//! Notifies that an entities controllers have activated.
|
||||
//! @param entityHandle handle to the entity whose controllers have activated
|
||||
//! @param entityIsMigrating true if the entity is activating after a migration
|
||||
virtual void NotifyControllersActivated(const ConstNetworkEntityHandle& entityHandle, EntityIsMigrating entityIsMigrating) = 0;
|
||||
|
||||
//! Notifies that an entities controllers have been deactivated.
|
||||
//! @param entityHandle handle to the entity whose controllers have been deactivated
|
||||
//! @param entityIsMigrating true if the entity is deactivating due to a migration
|
||||
virtual void NotifyControllersDeactivated(const ConstNetworkEntityHandle& entityHandle, EntityIsMigrating entityIsMigrating) = 0;
|
||||
|
||||
//! Handle a local rpc message.
|
||||
//! @param entityRpcMessage the local rpc message to handle
|
||||
virtual void HandleLocalRpcMessage(NetworkEntityRpcMessage& message) = 0;
|
||||
};
|
||||
|
||||
// Convenience helpers
|
||||
inline INetworkEntityManager* GetNetworkEntityManager()
|
||||
{
|
||||
return AZ::Interface<INetworkEntityManager>::Get();
|
||||
}
|
||||
|
||||
inline NetworkEntityTracker* GetNetworkEntityTracker()
|
||||
{
|
||||
return GetNetworkEntityManager()->GetNetworkEntityTracker();
|
||||
}
|
||||
|
||||
inline NetworkEntityAuthorityTracker* GetNetworkEntityAuthorityTracker()
|
||||
{
|
||||
return GetNetworkEntityManager()->GetNetworkEntityAuthorityTracker();
|
||||
}
|
||||
|
||||
inline MultiplayerComponentRegistry* GetMultiplayerComponentRegistry()
|
||||
{
|
||||
return GetNetworkEntityManager()->GetMultiplayerComponentRegistry();
|
||||
}
|
||||
}
|
||||
@@ -11,8 +11,8 @@
|
||||
*/
|
||||
|
||||
#include <Source/NetworkEntity/NetworkEntityAuthorityTracker.h>
|
||||
#include <Source/NetworkEntity/INetworkEntityManager.h>
|
||||
#include <Source/Components/NetBindComponent.h>
|
||||
#include <Include/INetworkEntityManager.h>
|
||||
#include <AzCore/Console/IConsole.h>
|
||||
#include <AzCore/Console/ILogger.h>
|
||||
#include <AzNetworking/Utilities/NetworkCommon.h>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <Source/NetworkEntity/NetworkEntityHandle.h>
|
||||
#include <Include/NetworkEntityHandle.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityTracker.h>
|
||||
#include <Source/Components/NetBindComponent.h>
|
||||
#include <Source/Components/MultiplayerController.h>
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
/*
|
||||
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||
* its licensors.
|
||||
*
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||
* distribution (the "License"). All use of this software is governed by the License,
|
||||
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/Component/Entity.h>
|
||||
#include <Include/MultiplayerTypes.h>
|
||||
|
||||
namespace Multiplayer
|
||||
{
|
||||
class MultiplayerController;
|
||||
class NetworkEntityTracker;
|
||||
class NetBindComponent;
|
||||
|
||||
//! @class ConstNetworkEntityHandle
|
||||
//! @brief This class provides a wrapping around handle ids.
|
||||
//! It is optimized to avoid using the hashmap lookup unless the hashmap has had an item removed.
|
||||
class ConstNetworkEntityHandle
|
||||
{
|
||||
public:
|
||||
|
||||
//! Constructs a nullptr handle.
|
||||
ConstNetworkEntityHandle() = default;
|
||||
|
||||
//! Constructs a ConstNetworkEntityHandle given an entity, an entity tracker
|
||||
//! @param entity pointer to the entity to construct a ConstNetworkEntityHandle for
|
||||
//! @param entityTracker pointer to the entity tracker that tracks the entity
|
||||
ConstNetworkEntityHandle(AZ::Entity* entity, const NetworkEntityTracker* entityTracker);
|
||||
|
||||
//! Constructs a ConstNetworkEntityHandle given an entity, a networkEntityId, and an entity tracker
|
||||
//! @param entity pointer to the entity to construct a ConstNetworkEntityHandle for
|
||||
//! @param netEntityId the networkEntityId of the entity
|
||||
//! @param entityTracker pointer to the entity tracker that tracks the entity
|
||||
ConstNetworkEntityHandle(AZ::Entity* entity, NetEntityId netEntityId, const NetworkEntityTracker* entityTracker);
|
||||
|
||||
//! Constructs a ConstNetworkEntityHandle given an entity, a networked entityId, an entity tracker, and a dirty version
|
||||
//! @param netBindComponent pointer to the entities NetBindComponent
|
||||
//! @param entityTracker pointer to the entity tracker that tracks the entity
|
||||
ConstNetworkEntityHandle(NetBindComponent* netBindComponent, const NetworkEntityTracker* entityTracker);
|
||||
|
||||
ConstNetworkEntityHandle(const ConstNetworkEntityHandle&) = default;
|
||||
|
||||
//! Access the AZ::Entity if it safely exists, nullptr or false is returned if the entity does not exist.
|
||||
//! @{
|
||||
bool Exists() const;
|
||||
AZ::Entity* GetEntity();
|
||||
const AZ::Entity* GetEntity() const;
|
||||
//! @}
|
||||
|
||||
//! Operators providing pointer semantics.
|
||||
//! @{
|
||||
bool operator ==(const ConstNetworkEntityHandle& rhs) const;
|
||||
bool operator !=(const ConstNetworkEntityHandle& rhs) const;
|
||||
friend bool operator ==(const ConstNetworkEntityHandle& lhs, AZStd::nullptr_t);
|
||||
friend bool operator ==(AZStd::nullptr_t, const ConstNetworkEntityHandle& rhs);
|
||||
friend bool operator !=(const ConstNetworkEntityHandle& lhs, AZStd::nullptr_t);
|
||||
friend bool operator !=(AZStd::nullptr_t, const ConstNetworkEntityHandle& rhs);
|
||||
friend bool operator ==(const ConstNetworkEntityHandle& lhs, const AZ::Entity* rhs);
|
||||
friend bool operator ==(const AZ::Entity* lhs, const ConstNetworkEntityHandle& rhs);
|
||||
friend bool operator !=(const ConstNetworkEntityHandle& lhs, const AZ::Entity* rhs);
|
||||
friend bool operator !=(const AZ::Entity* lhs, const ConstNetworkEntityHandle& rhs);
|
||||
//! @}
|
||||
|
||||
bool operator <(const ConstNetworkEntityHandle& rhs) const;
|
||||
|
||||
explicit operator bool() const;
|
||||
|
||||
//! Resets the handle to a nullptr state.
|
||||
void Reset();
|
||||
void Reset(const ConstNetworkEntityHandle& handle);
|
||||
|
||||
//! Returns the networkEntityId of the entity this handle points to.
|
||||
//! @return the networkEntityId of the entity this handle points to
|
||||
NetEntityId GetNetEntityId() const;
|
||||
|
||||
//! Returns the cached netBindComponent for this entity, or nullptr if it doesn't exist.
|
||||
//! @return the cached netBindComponent for this entity, or nullptr if it doesn't exist
|
||||
NetBindComponent* GetNetBindComponent() const;
|
||||
|
||||
//! Returns a specific component on of entity given a typeId.
|
||||
//! @param typeId the typeId of the component to find and return
|
||||
//! @return pointer to the requested component, or nullptr if it doesn't exist on the entity
|
||||
const AZ::Component* FindComponent(const AZ::TypeId& typeId) const;
|
||||
|
||||
//! Returns a specific component on of entity by class type.
|
||||
//! @return pointer to the requested component, or nullptr if it doesn't exist on the entity
|
||||
template <typename Component>
|
||||
const Component* FindComponent() const;
|
||||
|
||||
//! Helper function for sorting EntityHandles by netEntityId.
|
||||
static bool Compare(const ConstNetworkEntityHandle& lhs, const ConstNetworkEntityHandle& rhs);
|
||||
|
||||
protected:
|
||||
|
||||
mutable uint32_t m_changeDirty = 0; // Optimization so we don't need to recheck the hashmap
|
||||
mutable AZ::Entity* m_entity = nullptr;
|
||||
mutable NetBindComponent* m_netBindComponent = nullptr;
|
||||
const NetworkEntityTracker* m_networkEntityTracker = nullptr;
|
||||
NetEntityId m_netEntityId = InvalidNetEntityId;
|
||||
};
|
||||
|
||||
class NetworkEntityHandle
|
||||
: public ConstNetworkEntityHandle
|
||||
{
|
||||
public:
|
||||
|
||||
using ConstNetworkEntityHandle::ConstNetworkEntityHandle;
|
||||
|
||||
//! Initializes the underlying entity if possible.
|
||||
void Init();
|
||||
|
||||
//! Activates the underlying entity if possible.
|
||||
void Activate();
|
||||
|
||||
//! Deactivates the underlying entity if possible.
|
||||
void Deactivate();
|
||||
|
||||
//! Gets the BaseController from the first component on an Entity with the supplied typeId AND which inherits from Multiplayer::BaseComponent
|
||||
MultiplayerController* FindController(const AZ::TypeId& typeId);
|
||||
|
||||
template <typename Controller>
|
||||
Controller* FindController();
|
||||
|
||||
using ConstNetworkEntityHandle::FindComponent;
|
||||
AZ::Component* FindComponent(const AZ::TypeId& typeId);
|
||||
|
||||
template <typename ComponentType>
|
||||
ComponentType* FindComponent();
|
||||
};
|
||||
}
|
||||
|
||||
#include "Source/NetworkEntity/NetworkEntityHandle.inl"
|
||||
@@ -1,138 +0,0 @@
|
||||
/*
|
||||
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
||||
* its licensors.
|
||||
*
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this
|
||||
* distribution (the "License"). All use of this software is governed by the License,
|
||||
* or, if provided, by the license below or the license accompanying this file. Do not
|
||||
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Multiplayer
|
||||
{
|
||||
inline bool operator ==(const ConstNetworkEntityHandle& lhs, AZStd::nullptr_t)
|
||||
{
|
||||
return !lhs.Exists();
|
||||
}
|
||||
|
||||
inline bool operator ==(AZStd::nullptr_t, const ConstNetworkEntityHandle& rhs)
|
||||
{
|
||||
return !rhs.Exists();
|
||||
}
|
||||
|
||||
inline bool operator !=(const ConstNetworkEntityHandle& lhs, AZStd::nullptr_t)
|
||||
{
|
||||
return lhs.Exists();
|
||||
}
|
||||
|
||||
inline bool operator !=(AZStd::nullptr_t, const ConstNetworkEntityHandle& rhs)
|
||||
{
|
||||
return rhs.Exists();
|
||||
}
|
||||
|
||||
inline bool operator==(const ConstNetworkEntityHandle& lhs, const AZ::Entity* rhs)
|
||||
{
|
||||
return lhs.m_entity == rhs;
|
||||
}
|
||||
|
||||
inline bool operator==(const AZ::Entity* lhs, const ConstNetworkEntityHandle& rhs)
|
||||
{
|
||||
return operator==(rhs, lhs);
|
||||
}
|
||||
|
||||
inline bool operator!=(const ConstNetworkEntityHandle& lhs, const AZ::Entity* rhs)
|
||||
{
|
||||
return lhs.m_entity != rhs;
|
||||
}
|
||||
|
||||
inline bool operator!=(const AZ::Entity* lhs, const ConstNetworkEntityHandle& rhs)
|
||||
{
|
||||
return operator!=(rhs, lhs);
|
||||
}
|
||||
|
||||
inline NetEntityId ConstNetworkEntityHandle::GetNetEntityId() const
|
||||
{
|
||||
return m_netEntityId;
|
||||
}
|
||||
|
||||
template <class ComponentType>
|
||||
inline const ComponentType* ConstNetworkEntityHandle::FindComponent() const
|
||||
{
|
||||
if (const AZ::Entity* entity{ GetEntity() })
|
||||
{
|
||||
return entity->template FindComponent<ComponentType>();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
inline bool ConstNetworkEntityHandle::Compare(const ConstNetworkEntityHandle& lhs, const ConstNetworkEntityHandle& rhs)
|
||||
{
|
||||
return lhs.m_netEntityId < rhs.m_netEntityId;
|
||||
}
|
||||
|
||||
inline void NetworkEntityHandle::Init()
|
||||
{
|
||||
if (AZ::Entity* entity{ GetEntity() })
|
||||
{
|
||||
entity->Init();
|
||||
}
|
||||
}
|
||||
|
||||
inline void NetworkEntityHandle::Activate()
|
||||
{
|
||||
if (AZ::Entity* entity{ GetEntity() })
|
||||
{
|
||||
entity->Activate();
|
||||
}
|
||||
}
|
||||
|
||||
inline void NetworkEntityHandle::Deactivate()
|
||||
{
|
||||
if (AZ::Entity* entity{ GetEntity() })
|
||||
{
|
||||
entity->Deactivate();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename ControllerType>
|
||||
inline ControllerType* NetworkEntityHandle::FindController()
|
||||
{
|
||||
return static_cast<ControllerType*>(FindController(ControllerType::ComponentType::RTTI_Type()));
|
||||
}
|
||||
|
||||
template <typename ComponentType>
|
||||
inline ComponentType* NetworkEntityHandle::FindComponent()
|
||||
{
|
||||
if (AZ::Entity* entity{ GetEntity() })
|
||||
{
|
||||
return entity->template FindComponent<ComponentType>();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
//! AZStd::hash support.
|
||||
namespace AZStd
|
||||
{
|
||||
template <>
|
||||
class hash<Multiplayer::NetworkEntityHandle>
|
||||
{
|
||||
public:
|
||||
size_t operator()(const Multiplayer::NetworkEntityHandle &rhs) const
|
||||
{
|
||||
return hash<Multiplayer::NetEntityId>()(rhs.GetNetEntityId());
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
class hash<Multiplayer::ConstNetworkEntityHandle>
|
||||
{
|
||||
public:
|
||||
size_t operator()(const Multiplayer::ConstNetworkEntityHandle &rhs) const
|
||||
{
|
||||
return hash<Multiplayer::NetEntityId>()(rhs.GetNetEntityId());
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -212,7 +212,7 @@ namespace Multiplayer
|
||||
{
|
||||
NetBindComponent* netBindComponent = entity->FindComponent<NetBindComponent>();
|
||||
AZ_Assert(netBindComponent != nullptr, "Attempting to send an RPC to an entity with no NetBindComponent");
|
||||
netBindComponent->HandleRpcMessage(NetEntityRole::Server, rpcMessage);
|
||||
netBindComponent->HandleRpcMessage(nullptr, NetEntityRole::Server, rpcMessage);
|
||||
}
|
||||
}
|
||||
m_localDeferredRpcMessages.clear();
|
||||
|
||||
@@ -15,11 +15,11 @@
|
||||
#include <AzCore/EBus/ScheduledEvent.h>
|
||||
#include <AzCore/Component/ComponentApplicationBus.h>
|
||||
#include <AzFramework/Spawnable/RootSpawnableInterface.h>
|
||||
#include <Source/NetworkEntity/INetworkEntityManager.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityAuthorityTracker.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityTracker.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityRpcMessage.h>
|
||||
#include <Source/EntityDomains/IEntityDomain.h>
|
||||
#include <Include/IEntityDomain.h>
|
||||
#include <Include/INetworkEntityManager.h>
|
||||
#include <Source/NetworkEntity/NetworkSpawnableLibrary.h>
|
||||
#include <Source/Components/MultiplayerComponentRegistry.h>
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
*/
|
||||
|
||||
#include <Source/NetworkEntity/NetworkEntityTracker.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityHandle.h>
|
||||
#include <Include/NetworkEntityHandle.h>
|
||||
#include <AzCore/Console/IConsole.h>
|
||||
#include <AzCore/Console/ILogger.h>
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <Include/MultiplayerTypes.h>
|
||||
#include <Source/NetworkEntity/NetworkEntityHandle.h>
|
||||
#include <Include/NetworkEntityHandle.h>
|
||||
#include <AzCore/std/containers/unordered_map.h>
|
||||
#include <AzCore/Component/Entity.h>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user