Merge remote-tracking branch 'origin/master' into dotnet7

This commit is contained in:
Wojtek Figat
2023-02-13 10:05:51 +01:00
52 changed files with 1020 additions and 212 deletions

View File

@@ -164,6 +164,7 @@ void ENetDriver::Disconnect(const NetworkConnection& connection)
bool ENetDriver::PopEvent(NetworkEvent* eventPtr)
{
ASSERT(_host);
ENetEvent event;
const int result = enet_host_service(_host, &event, 0);
if (result < 0)

View File

@@ -191,6 +191,7 @@ bool StartPeer()
if (!NetworkManager::Peer)
{
LOG(Error, "Failed to create Network Peer at {0}:{1}", networkConfig.Address, networkConfig.Port);
NetworkManager::State = NetworkConnectionState::Offline;
return true;
}
NetworkManager::Frame = 0;
@@ -243,7 +244,10 @@ bool NetworkManager::StartServer()
LOG(Info, "Starting network manager as server");
Mode = NetworkManagerMode::Server;
if (StartPeer())
{
Mode = NetworkManagerMode::Offline;
return true;
}
if (!Peer->Listen())
{
Stop();
@@ -265,7 +269,10 @@ bool NetworkManager::StartClient()
LOG(Info, "Starting network manager as client");
Mode = NetworkManagerMode::Client;
if (StartPeer())
{
Mode = NetworkManagerMode::Offline;
return true;
}
if (!Peer->Connect())
{
Stop();
@@ -286,9 +293,15 @@ bool NetworkManager::StartHost()
LOG(Info, "Starting network manager as host");
Mode = NetworkManagerMode::Host;
if (StartPeer())
{
Mode = NetworkManagerMode::Offline;
return true;
}
if (!Peer->Listen())
{
Mode = NetworkManagerMode::Offline;
return true;
}
LocalClientId = ServerClientId;
NextClientId = ServerClientId + 1;
LocalClient = New<NetworkClient>(LocalClientId, NetworkConnection{ 0 });

View File

@@ -140,6 +140,12 @@ public:
return State == NetworkConnectionState::Connected;
}
// Returns true if network is online or disconnected.
API_PROPERTY() FORCE_INLINE static bool IsOffline()
{
return State == NetworkConnectionState::Offline || State == NetworkConnectionState::Disconnected;
}
/// <summary>
/// Gets the network client for a given connection. Returns null if failed to find it.
/// </summary>

View File

@@ -663,7 +663,7 @@ bool NetworkReplicator::InvokeSerializer(const ScriptingTypeHandle& typeHandle,
void NetworkReplicator::AddObject(ScriptingObject* obj, ScriptingObject* parent)
{
if (!obj || NetworkManager::State == NetworkConnectionState::Offline)
if (!obj || NetworkManager::IsOffline())
return;
ScopeLock lock(ObjectsLock);
if (Objects.Contains(obj))
@@ -695,7 +695,7 @@ void NetworkReplicator::AddObject(ScriptingObject* obj, ScriptingObject* parent)
void NetworkReplicator::RemoveObject(ScriptingObject* obj)
{
if (!obj || NetworkManager::State == NetworkConnectionState::Offline)
if (!obj || NetworkManager::IsOffline())
return;
ScopeLock lock(ObjectsLock);
const auto it = Objects.Find(obj->GetID());
@@ -715,7 +715,7 @@ void NetworkReplicator::SpawnObject(ScriptingObject* obj)
void NetworkReplicator::SpawnObject(ScriptingObject* obj, const DataContainer<uint32>& clientIds)
{
if (!obj || NetworkManager::State == NetworkConnectionState::Offline)
if (!obj || NetworkManager::IsOffline())
return;
ScopeLock lock(ObjectsLock);
const auto it = Objects.Find(obj->GetID());
@@ -730,7 +730,7 @@ void NetworkReplicator::SpawnObject(ScriptingObject* obj, const DataContainer<ui
void NetworkReplicator::DespawnObject(ScriptingObject* obj)
{
if (!obj || NetworkManager::State == NetworkConnectionState::Offline)
if (!obj || NetworkManager::IsOffline())
return;
ScopeLock lock(ObjectsLock);
const auto it = Objects.Find(obj->GetID());
@@ -887,7 +887,7 @@ NetworkStream* NetworkReplicator::BeginInvokeRPC()
void NetworkReplicator::EndInvokeRPC(ScriptingObject* obj, const ScriptingTypeHandle& type, const StringAnsiView& name, NetworkStream* argsStream)
{
const NetworkRpcInfo* info = NetworkRpcInfo::RPCsTable.TryGet(NetworkRpcName(type, name));
if (!info || !obj)
if (!info || !obj || NetworkManager::IsOffline())
return;
ObjectsLock.Lock();
auto& rpc = RpcQueue.AddOne();
@@ -1023,15 +1023,6 @@ void NetworkInternal::NetworkReplicatorUpdate()
NewClients.Clear();
}
// Collect clients for replication (from server)
BuildCachedTargets(NetworkManager::Clients);
if (!isClient && CachedTargets.Count() == 0)
{
// Early exit if server has nobody to send data to
Scripting::ObjectsLookupIdMapping.Set(nullptr);
return;
}
// Despawn
if (DespawnQueue.Count() != 0)
{
@@ -1474,6 +1465,10 @@ void NetworkInternal::OnNetworkMessageObjectSpawn(NetworkEvent& event, NetworkCl
if (!obj->IsRegistered())
obj->RegisterObject();
const NetworkReplicatedObject* parent = ResolveObject(msgDataItem.ParentId);
if (!parent && msgDataItem.ParentId.IsValid())
{
NETWORK_REPLICATOR_LOG(Error, "[NetworkReplicator] Failed to find object {} as parent to spawned object", msgDataItem.ParentId.ToString());
}
// Add object to the list
NetworkReplicatedObject item;

View File

@@ -407,6 +407,23 @@ namespace FlaxEngine.Networking
return new Quaternion(ReadSingle(), ReadSingle(), ReadSingle(), ReadSingle());
}
/// <summary>
/// Writes data of type <see cref="Ray"/> into the message.
/// </summary>
public void WriteRay(Ray value)
{
WriteVector3(value.Position);
WriteVector3(value.Direction);
}
/// <summary>
/// Reads and returns data of type <see cref="Ray"/> from the message.
/// </summary>
public Ray ReadRay()
{
return new Ray(ReadVector3(), ReadVector3());
}
/// <summary>
/// Writes data of type <see cref="Boolean"/> into the message.
/// </summary>