make BuildWorldObjects async, truly

This commit is contained in:
JohnCorby 2022-01-28 21:05:04 -08:00
parent bf93713d96
commit cb3b851ecf
3 changed files with 13 additions and 18 deletions

View File

@ -208,7 +208,7 @@ namespace QSB
if (QSBSceneManager.IsInUniverse)
{
QSBWorldSync.BuildWorldObjects(QSBSceneManager.CurrentScene);
QSBWorldSync.BuildWorldObjects(QSBSceneManager.CurrentScene).Forget();
}
var specificType = QSBCore.IsHost ? QSBPatchTypes.OnServerClientConnect : QSBPatchTypes.OnNonServerClientConnect;

View File

@ -28,7 +28,7 @@ namespace QSB
if (QSBCore.IsInMultiplayer && universe)
{
// So objects have time to be deleted, made, whatever
QSBCore.UnityEvents.FireOnNextUpdate(() => QSBWorldSync.BuildWorldObjects(newScene));
QSBCore.UnityEvents.FireOnNextUpdate(() => QSBWorldSync.BuildWorldObjects(newScene).Forget());
}
OnSceneLoaded?.SafeInvoke(oldScene, newScene, universe);

View File

@ -27,27 +27,22 @@ namespace QSB.WorldSync
/// </summary>
public static bool AllObjectsReady { get; private set; }
public static void BuildWorldObjects(OWScene scene)
{
if (PlayerTransformSync.LocalInstance == null)
{
DebugLog.ToConsole($"Warning - Tried to build WorldObjects when LocalPlayer is not ready! Building when ready...", MessageType.Warning);
QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance, () => BuildWorldObjects(scene));
return;
}
GameInit();
DoBuild(scene).Forget();
}
private static CancellationTokenSource _cts;
private static readonly List<UniTask> _managerTasks = new();
private static readonly List<UniTask> _objectTasks = new();
private static async UniTaskVoid DoBuild(OWScene scene)
public static async UniTaskVoid BuildWorldObjects(OWScene scene)
{
_cts = new CancellationTokenSource();
if (!PlayerTransformSync.LocalInstance)
{
DebugLog.ToConsole("Warning - Tried to build WorldObjects when LocalPlayer is not ready! Building when ready...", MessageType.Warning);
await UniTask.WaitUntil(() => PlayerTransformSync.LocalInstance, cancellationToken: _cts.Token);
}
GameInit();
foreach (var manager in Managers)
{
switch (manager.WorldObjectType)
@ -183,7 +178,7 @@ namespace QSB.WorldSync
public static TWorldObject GetWorldObject<TWorldObject>(this MonoBehaviour unityObject)
where TWorldObject : IWorldObject
{
if (unityObject == null)
if (!unityObject)
{
DebugLog.ToConsole($"Error - Trying to run GetWorldFromUnity with a null unity object! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:NULL, Stacktrace:\r\n{Environment.StackTrace}", MessageType.Error);
return default;