using Cysharp.Threading.Tasks;
using Mirror;
using System.Threading;
using UnityEngine;
namespace QSB.Utility.LinkedWorldObject;
public static class Extensions
{
///
/// link a world object and a network behaviour
///
public static void LinkTo(this ILinkedWorldObject worldObject, ILinkedNetworkBehaviour networkBehaviour)
{
worldObject.SetNetworkBehaviour((NetworkBehaviour)networkBehaviour);
networkBehaviour.SetWorldObject(worldObject);
}
///
/// link a world object and network object, then spawn it.
/// (host only)
///
public static void SpawnLinked(this ILinkedWorldObject worldObject, GameObject prefab, bool spawnWithServerAuthority)
{
var go = Object.Instantiate(prefab);
var networkBehaviour = go.GetComponent();
worldObject.LinkTo(networkBehaviour);
if (spawnWithServerAuthority)
{
go.SpawnWithServerAuthority();
}
else
{
NetworkServer.Spawn(go);
}
}
///
/// wait for a world object to be linked.
/// (non host only)
///
public static async UniTask WaitForLink(this ILinkedWorldObject worldObject, CancellationToken ct) =>
await UniTask.WaitUntil(() => worldObject.NetworkBehaviour, cancellationToken: ct);
}