Skip to content

Commit

Permalink
fix: fixing syncDirection for syncObjects in host mode
Browse files Browse the repository at this point in the history
  • Loading branch information
James-Frowen committed Oct 14, 2023
1 parent 6a6e870 commit ec45074
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 12 deletions.
6 changes: 3 additions & 3 deletions Assets/Mirage/Runtime/NetworkBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ protected internal void InitSyncObject(ISyncObject syncObject)

private void SyncObject_OnChange()
{
if (SyncSettings.ShouldSyncFrom(Identity))
if (SyncSettings.ShouldSyncFrom(Identity, true))
{
_anySyncObjectDirty = true;
Identity.SyncVarSender.AddDirtyObject(Identity);
Expand All @@ -284,7 +284,7 @@ private void SyncObject_OnChange()
/// </summary>
public void UpdateSyncObjectShouldSync()
{
var shouldSync = SyncSettings.ShouldSyncFrom(Identity);
var shouldSync = SyncSettings.ShouldSyncFrom(Identity, true);

if (logger.LogEnabled()) logger.Log($"Settings SyncObject sync on to {shouldSync} for {this}");
for (var i = 0; i < syncObjects.Count; i++)
Expand All @@ -310,7 +310,7 @@ public void SetDirtyBit(ulong bitMask)

_syncVarDirtyBits |= bitMask;

if (SyncSettings.ShouldSyncFrom(Identity))
if (SyncSettings.ShouldSyncFrom(Identity, false))
Identity.SyncVarSender.AddDirtyObject(Identity);
}

Expand Down
2 changes: 1 addition & 1 deletion Assets/Mirage/Runtime/NetworkIdentity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -690,7 +690,7 @@ private void OnSerialize(int i, NetworkBehaviour comp, NetworkWriter writer, boo
continue;

// check if we should be writing this components
if (!comp.SyncSettings.ShouldSyncFrom(this))
if (!comp.SyncSettings.ShouldSyncFrom(this, false))
continue;

if (logger.LogEnabled()) logger.Log($"OnSerializeAllSafely: '{name}', component '{comp.GetType()}', initial state: '{initialState}'");
Expand Down
17 changes: 13 additions & 4 deletions Assets/Mirage/Runtime/SyncSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public static void UpdateTime(float interval, SyncTiming timing, ref float nextS
}
}

public bool ShouldSyncFrom(NetworkIdentity identity)
public bool ShouldSyncFrom(NetworkIdentity identity, bool syncInHostMode)
{
if ((From & SyncFrom.Server) != 0 && identity.IsServer)
{
Expand All @@ -65,8 +65,13 @@ public bool ShouldSyncFrom(NetworkIdentity identity)

// dont need to check SyncTo.Owner, it is only case left here

// if to.owner, only sync if not host
return !identity.IsClient; // not host
// note: need syncInHostMode check for syncobjcets, so that it wont set ReadOnly flag
if (syncInHostMode)
return true;
else
// dont sync for host
// if to.owner, only sync if not host
return !identity.IsClient; // not host
}

if ((From & SyncFrom.Owner) != 0 && identity.HasAuthority)
Expand All @@ -75,7 +80,11 @@ public bool ShouldSyncFrom(NetworkIdentity identity)

// if from owner, must be to server
if ((To & SyncTo.Server) != 0)
{ // true if not host OR to ObserversOnly
{
if (syncInHostMode)
return true;

// true if not host OR to ObserversOnly
return !identity.IsServer || (To & SyncTo.ObserversOnly) != 0;
}
}
Expand Down
96 changes: 96 additions & 0 deletions Assets/Tests/Runtime/Syncing/SyncDirectionObject_Host.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using System.Collections;
using NUnit.Framework;
using UnityEngine.TestTools;

namespace Mirage.Tests.Runtime.Syncing
{
public class SyncDirectionObjectFromServer_Host : SyncDirectionTestBase_Host<MockPlayerWithList>
{
private const int listValue = 5;

[UnityTest]
public IEnumerator ToOwner()
{
SetDirection(SyncFrom.Server, SyncTo.Owner);

hostComponent.guild = guild;
hostComponent.MySyncList.Add(listValue);

// wait for sync
yield return null;
yield return null;

Assert.That(hostComponent.guild.name, Is.EqualTo(guild.name));
Assert.That(hostComponent.MySyncList.Count, Is.EqualTo(1));
Assert.That(hostComponent.MySyncList[0], Is.EqualTo(listValue));

Assert.That(ObserverComponent.guild.name, Is.Null.Or.Empty);
Assert.That(ObserverComponent.MySyncList.Count, Is.Zero);
}

[UnityTest]
public IEnumerator ToObserver()
{
SetDirection(SyncFrom.Server, SyncTo.ObserversOnly);

hostComponent.guild = guild;
hostComponent.MySyncList.Add(listValue);

// wait for sync
yield return null;
yield return null;

// host mode, so should still be set
Assert.That(hostComponent.guild.name, Is.EqualTo(guild.name));
Assert.That(hostComponent.MySyncList.Count, Is.EqualTo(1));
Assert.That(hostComponent.MySyncList[0], Is.EqualTo(listValue));

Assert.That(ObserverComponent.guild.name, Is.EqualTo(guild.name));
Assert.That(ObserverComponent.MySyncList.Count, Is.EqualTo(1));
Assert.That(ObserverComponent.MySyncList[0], Is.EqualTo(listValue));
}

[UnityTest]
public IEnumerator ToOwnerAndObserver()
{
SetDirection(SyncFrom.Server, SyncTo.OwnerAndObservers);

hostComponent.guild = guild;
hostComponent.MySyncList.Add(listValue);

// wait for sync
yield return null;
yield return null;

Assert.That(hostComponent.guild.name, Is.EqualTo(guild.name));
Assert.That(hostComponent.MySyncList.Count, Is.EqualTo(1));
Assert.That(hostComponent.MySyncList[0], Is.EqualTo(listValue));

Assert.That(ObserverComponent.guild.name, Is.EqualTo(guild.name));
Assert.That(ObserverComponent.MySyncList.Count, Is.EqualTo(1));
Assert.That(ObserverComponent.MySyncList[0], Is.EqualTo(listValue));
}

[UnityTest]
public IEnumerator CanAddInStartServer()
{
var clone = InstantiateForTest(_characterPrefab);
var component = clone.GetComponent<MockPlayerWithList>();
clone.OnStartServer.AddListener(() =>
{
component.MySyncList.Add(listValue);
});

serverObjectManager.Spawn(clone);

// wait for sync
yield return null;
yield return null;

var clientObj = _remoteClients[0].Get(component);

Assert.That(clientObj.MySyncList.Count, Is.EqualTo(1));
Assert.That(clientObj.MySyncList[0], Is.EqualTo(listValue));
}
}
}
11 changes: 11 additions & 0 deletions Assets/Tests/Runtime/Syncing/SyncDirectionObject_Host.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 9 additions & 4 deletions Assets/Tests/Runtime/Syncing/SyncDirectionSyncVarsTest_Host.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@
namespace Mirage.Tests.Runtime.Syncing
{
// todo find way to avoid having a full copy of this class
public class SyncDirectionTestBase_Host : HostSetup<MockPlayer>
public class SyncDirectionTestBase_Host : SyncDirectionTestBase_Host<MockPlayer>
{

}
public class SyncDirectionTestBase_Host<T> : HostSetup<T> where T : MockPlayer
{
protected static readonly MockPlayer.Guild guild = new MockPlayer.Guild("Fun");
protected static readonly MockPlayer.Guild guild2 = new MockPlayer.Guild("Other");
Expand All @@ -24,11 +28,11 @@ public class SyncDirectionTestBase_Host : HostSetup<MockPlayer>


/// <summary>Object on client0 that hostOwns</summary>
protected MockPlayer ObserverComponent => _remoteClients[0].Get(hostComponent);
protected T ObserverComponent => _remoteClients[0].Get(hostComponent);

/// <summary>Objcet that server controls</summary>
protected NetworkIdentity HostExtraIdentity { get; private set; }
protected MockPlayer HostExtraComponent { get; private set; }
protected T HostExtraComponent { get; private set; }

protected void ResetCounters()
{
Expand All @@ -49,7 +53,7 @@ protected override async UniTask LateSetup()
await AddClient();

HostExtraIdentity = InstantiateForTest(_characterPrefab);
HostExtraComponent = HostExtraIdentity.GetComponent<MockPlayer>();
HostExtraComponent = HostExtraIdentity.GetComponent<T>();
serverObjectManager.Spawn(HostExtraIdentity);

await UniTask.Yield();
Expand All @@ -65,6 +69,7 @@ protected static void SetDirection(NetworkBehaviour behaviour, SyncFrom from, Sy
behaviour.SyncSettings.From = from;
behaviour.SyncSettings.To = to;
behaviour._nextSyncTime = Time.time;
behaviour.UpdateSyncObjectShouldSync();
}
protected void SetDirection(SyncFrom from, SyncTo to)
{
Expand Down

0 comments on commit ec45074

Please sign in to comment.