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); }