2022-03-14 01:22:50 -07:00
|
|
|
|
using Cysharp.Threading.Tasks;
|
|
|
|
|
using Mirror;
|
2022-03-14 00:51:25 -07:00
|
|
|
|
using QSB.WorldSync;
|
2022-03-14 02:26:40 -07:00
|
|
|
|
using System.Linq;
|
2022-03-14 01:53:12 -07:00
|
|
|
|
using System.Threading;
|
2022-03-14 00:51:25 -07:00
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace QSB.Utility.LinkedWorldObject;
|
|
|
|
|
|
|
|
|
|
public static class Extensions
|
|
|
|
|
{
|
2022-03-14 01:22:50 -07:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// link a world object and network object, then spawn it.
|
|
|
|
|
/// (host only)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static void SpawnLinked(this ILinkedWorldObject<NetworkBehaviour> worldObject, GameObject prefab)
|
2022-03-14 00:51:25 -07:00
|
|
|
|
{
|
2022-03-14 01:53:12 -07:00
|
|
|
|
var go = Object.Instantiate(prefab);
|
2022-03-14 02:26:40 -07:00
|
|
|
|
var networkIdentity = go.GetComponent<NetworkIdentity>();
|
|
|
|
|
var networkBehaviour = networkIdentity.NetworkBehaviours.OfType<ILinkedNetworkBehaviour<IWorldObject>>().First();
|
2022-03-14 01:22:50 -07:00
|
|
|
|
|
|
|
|
|
worldObject.LinkTo((NetworkBehaviour)networkBehaviour);
|
2022-03-14 00:51:25 -07:00
|
|
|
|
networkBehaviour.LinkTo(worldObject);
|
2022-03-14 01:22:50 -07:00
|
|
|
|
|
2022-03-14 01:53:12 -07:00
|
|
|
|
NetworkServer.Spawn(go);
|
2022-03-14 00:51:25 -07:00
|
|
|
|
}
|
2022-03-14 01:22:50 -07:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// wait for a world object to be linked.
|
|
|
|
|
/// (non host only)
|
|
|
|
|
/// </summary>
|
2022-03-14 01:53:12 -07:00
|
|
|
|
public static async UniTask WaitForLink(this ILinkedWorldObject<NetworkBehaviour> worldObject, CancellationToken ct) =>
|
|
|
|
|
await UniTask.WaitUntil(() => worldObject.NetworkBehaviour, cancellationToken: ct);
|
2022-03-14 00:51:25 -07:00
|
|
|
|
}
|