make BuildWorldObjects async

This commit is contained in:
JohnCorby 2022-01-28 20:49:07 -08:00
parent 961e12d2f3
commit 2f99dec87f
44 changed files with 235 additions and 145 deletions

View File

@ -1,7 +1,9 @@
using QSB.Anglerfish.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.Anglerfish.WorldObjects;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
namespace QSB.Anglerfish namespace QSB.Anglerfish
{ {
@ -11,7 +13,7 @@ namespace QSB.Anglerfish
public static readonly List<AnglerfishController> Anglers = new(); public static readonly List<AnglerfishController> Anglers = new();
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
Anglers.Clear(); Anglers.Clear();
Anglers.AddRange(QSBWorldSync.GetUnityObjects<AnglerfishController>().SortDeterministic()); Anglers.AddRange(QSBWorldSync.GetUnityObjects<AnglerfishController>().SortDeterministic());

View File

@ -1,8 +1,10 @@
using Mirror; using Cysharp.Threading.Tasks;
using Mirror;
using QSB.Anglerfish.Messages; using QSB.Anglerfish.Messages;
using QSB.Anglerfish.TransformSync; using QSB.Anglerfish.TransformSync;
using QSB.Messaging; using QSB.Messaging;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.Anglerfish.WorldObjects namespace QSB.Anglerfish.WorldObjects
@ -17,15 +19,14 @@ namespace QSB.Anglerfish.WorldObjects
private Vector3 _lastTargetPosition; private Vector3 _lastTargetPosition;
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
if (QSBCore.IsHost) if (QSBCore.IsHost)
{ {
NetworkServer.Spawn(Object.Instantiate(QSBNetworkManager.singleton.AnglerPrefab)); NetworkServer.Spawn(Object.Instantiate(QSBNetworkManager.singleton.AnglerPrefab));
} }
StartDelayedReady(); await UniTask.WaitUntil(() => TransformSync, cancellationToken: cancellationToken);
QSBCore.UnityEvents.RunWhen(() => TransformSync, FinishDelayedReady);
} }
public override void OnRemoval() public override void OnRemoval()

View File

@ -1,5 +1,7 @@
using QSB.Animation.NPC.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.Animation.NPC.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.Animation.NPC namespace QSB.Animation.NPC
{ {
@ -8,7 +10,7 @@ namespace QSB.Animation.NPC
// im assuming this is used in the eye as well // im assuming this is used in the eye as well
public override WorldObjectType WorldObjectType => WorldObjectType.Both; public override WorldObjectType WorldObjectType => WorldObjectType.Both;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
QSBWorldSync.Init<QSBCharacterAnimController, CharacterAnimController>(); QSBWorldSync.Init<QSBCharacterAnimController, CharacterAnimController>();
QSBWorldSync.Init<QSBTravelerController, TravelerController>(); QSBWorldSync.Init<QSBTravelerController, TravelerController>();

View File

@ -1,5 +1,7 @@
using QSB.CampfireSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.CampfireSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.CampfireSync namespace QSB.CampfireSync
{ {
@ -7,7 +9,7 @@ namespace QSB.CampfireSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.Both; public override WorldObjectType WorldObjectType => WorldObjectType.Both;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
=> QSBWorldSync.Init<QSBCampfire, Campfire>(); => QSBWorldSync.Init<QSBCampfire, Campfire>();
} }
} }

View File

@ -1,4 +1,5 @@
using OWML.Common; using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.ConversationSync.Messages; using QSB.ConversationSync.Messages;
using QSB.ConversationSync.WorldObjects; using QSB.ConversationSync.WorldObjects;
using QSB.Messaging; using QSB.Messaging;
@ -7,6 +8,7 @@ using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
@ -37,7 +39,7 @@ namespace QSB.ConversationSync
_boxPrefab.GetComponent<Text>().color = Color.white; _boxPrefab.GetComponent<Text>().color = Color.white;
} }
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
=> QSBWorldSync.Init<QSBRemoteDialogueTrigger, RemoteDialogueTrigger>(); => QSBWorldSync.Init<QSBRemoteDialogueTrigger, RemoteDialogueTrigger>();
public uint GetPlayerTalkingToTree(CharacterDialogueTree tree) public uint GetPlayerTalkingToTree(CharacterDialogueTree tree)

View File

@ -1,5 +1,7 @@
using QSB.EchoesOfTheEye.AirlockSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.EchoesOfTheEye.AirlockSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.EchoesOfTheEye.AirlockSync namespace QSB.EchoesOfTheEye.AirlockSync
{ {
@ -8,6 +10,6 @@ namespace QSB.EchoesOfTheEye.AirlockSync
// is this used in the prisoner sequence in the eye? // is this used in the prisoner sequence in the eye?
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
public override void BuildWorldObjects(OWScene scene) => QSBWorldSync.Init<QSBGhostAirlock, GhostAirlock>(); public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken) => QSBWorldSync.Init<QSBGhostAirlock, GhostAirlock>();
} }
} }

View File

@ -1,5 +1,7 @@
using QSB.EchoesOfTheEye.LightSensorSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.EchoesOfTheEye.LightSensorSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.EchoesOfTheEye.LightSensorSync namespace QSB.EchoesOfTheEye.LightSensorSync
{ {
@ -8,6 +10,6 @@ namespace QSB.EchoesOfTheEye.LightSensorSync
// see AirlockManager question // see AirlockManager question
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
public override void BuildWorldObjects(OWScene scene) => QSBWorldSync.Init<QSBSingleLightSensor, SingleLightSensor>(); public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken) => QSBWorldSync.Init<QSBSingleLightSensor, SingleLightSensor>();
} }
} }

View File

@ -1,5 +1,7 @@
using QSB.ElevatorSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.ElevatorSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.ElevatorSync namespace QSB.ElevatorSync
{ {
@ -7,7 +9,7 @@ namespace QSB.ElevatorSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
=> QSBWorldSync.Init<QSBElevator, Elevator>(); => QSBWorldSync.Init<QSBElevator, Elevator>();
} }
} }

View File

@ -1,6 +1,8 @@
using QSB.ElevatorSync.Messages; using Cysharp.Threading.Tasks;
using QSB.ElevatorSync.Messages;
using QSB.Messaging; using QSB.Messaging;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.ElevatorSync.WorldObjects namespace QSB.ElevatorSync.WorldObjects
@ -9,21 +11,15 @@ namespace QSB.ElevatorSync.WorldObjects
{ {
private OWTriggerVolume _elevatorTrigger; private OWTriggerVolume _elevatorTrigger;
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
StartDelayedReady(); // BUG : This won't work for the log lift! need to make a different trigger for that
QSBCore.UnityEvents.RunWhen(() => AttachedObject._interactVolume, () =>
{
FinishDelayedReady();
// BUG : This won't work for the log lift! need to make a different trigger for that var boxShape = AttachedObject.gameObject.GetAddComponent<BoxShape>();
boxShape.center = new Vector3(0, 1.75f, 0.25f);
boxShape.size = new Vector3(3, 3.5f, 3);
var boxShape = AttachedObject.gameObject.GetAddComponent<BoxShape>(); _elevatorTrigger = AttachedObject.gameObject.GetAddComponent<OWTriggerVolume>();
boxShape.center = new Vector3(0, 1.75f, 0.25f);
boxShape.size = new Vector3(3, 3.5f, 3);
_elevatorTrigger = AttachedObject.gameObject.GetAddComponent<OWTriggerVolume>();
});
} }
public override void SendInitialState(uint to) public override void SendInitialState(uint to)
@ -88,4 +84,4 @@ namespace QSB.ElevatorSync.WorldObjects
); );
} }
} }
} }

View File

@ -1,5 +1,7 @@
using QSB.EyeOfTheUniverse.InstrumentSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.EyeOfTheUniverse.InstrumentSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.EyeOfTheUniverse.InstrumentSync namespace QSB.EyeOfTheUniverse.InstrumentSync
{ {
@ -7,7 +9,7 @@ namespace QSB.EyeOfTheUniverse.InstrumentSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.Eye; public override WorldObjectType WorldObjectType => WorldObjectType.Eye;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
=> QSBWorldSync.Init<QSBQuantumInstrument, QuantumInstrument>(); => QSBWorldSync.Init<QSBQuantumInstrument, QuantumInstrument>();
} }
} }

View File

@ -1,5 +1,7 @@
using QSB.GeyserSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.GeyserSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.GeyserSync namespace QSB.GeyserSync
{ {
@ -7,7 +9,7 @@ namespace QSB.GeyserSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
=> QSBWorldSync.Init<QSBGeyser, GeyserController>(); => QSBWorldSync.Init<QSBGeyser, GeyserController>();
} }
} }

View File

@ -1,12 +1,14 @@
using QSB.GeyserSync.Messages; using Cysharp.Threading.Tasks;
using QSB.GeyserSync.Messages;
using QSB.Messaging; using QSB.Messaging;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.GeyserSync.WorldObjects namespace QSB.GeyserSync.WorldObjects
{ {
public class QSBGeyser : WorldObject<GeyserController> public class QSBGeyser : WorldObject<GeyserController>
{ {
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
if (QSBCore.IsHost) if (QSBCore.IsHost)
{ {

View File

@ -1,8 +1,10 @@
using OWML.Common; using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.ItemSync.WorldObjects.Items; using QSB.ItemSync.WorldObjects.Items;
using QSB.ItemSync.WorldObjects.Sockets; using QSB.ItemSync.WorldObjects.Sockets;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.ItemSync namespace QSB.ItemSync
{ {
@ -10,7 +12,7 @@ namespace QSB.ItemSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.Both; public override WorldObjectType WorldObjectType => WorldObjectType.Both;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
DebugLog.DebugWrite("Building OWItems...", MessageType.Info); DebugLog.DebugWrite("Building OWItems...", MessageType.Info);

View File

@ -1,8 +1,10 @@
using QSB.ItemSync.WorldObjects.Sockets; using Cysharp.Threading.Tasks;
using QSB.ItemSync.WorldObjects.Sockets;
using QSB.Player; using QSB.Player;
using QSB.SectorSync.WorldObjects; using QSB.SectorSync.WorldObjects;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.ItemSync.WorldObjects.Items namespace QSB.ItemSync.WorldObjects.Items
@ -16,7 +18,7 @@ namespace QSB.ItemSync.WorldObjects.Items
private Quaternion InitialRotation { get; set; } private Quaternion InitialRotation { get; set; }
private QSBSector InitialSector { get; set; } private QSBSector InitialSector { get; set; }
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
if (AttachedObject == null) if (AttachedObject == null)
{ {

View File

@ -1,7 +1,9 @@
using QSB.JellyfishSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.JellyfishSync.WorldObjects;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
namespace QSB.JellyfishSync namespace QSB.JellyfishSync
{ {
@ -11,7 +13,7 @@ namespace QSB.JellyfishSync
public static readonly List<JellyfishController> Jellyfish = new(); public static readonly List<JellyfishController> Jellyfish = new();
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
Jellyfish.Clear(); Jellyfish.Clear();
Jellyfish.AddRange(QSBWorldSync.GetUnityObjects<JellyfishController>().SortDeterministic()); Jellyfish.AddRange(QSBWorldSync.GetUnityObjects<JellyfishController>().SortDeterministic());

View File

@ -1,8 +1,10 @@
using Mirror; using Cysharp.Threading.Tasks;
using Mirror;
using QSB.JellyfishSync.Messages; using QSB.JellyfishSync.Messages;
using QSB.JellyfishSync.TransformSync; using QSB.JellyfishSync.TransformSync;
using QSB.Messaging; using QSB.Messaging;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.JellyfishSync.WorldObjects namespace QSB.JellyfishSync.WorldObjects
@ -13,7 +15,7 @@ namespace QSB.JellyfishSync.WorldObjects
public JellyfishTransformSync TransformSync; public JellyfishTransformSync TransformSync;
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
if (QSBCore.IsHost) if (QSBCore.IsHost)
{ {

View File

@ -1,6 +1,8 @@
using QSB.MeteorSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.MeteorSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Linq; using System.Linq;
using System.Threading;
namespace QSB.MeteorSync namespace QSB.MeteorSync
{ {
@ -10,7 +12,7 @@ namespace QSB.MeteorSync
public static WhiteHoleVolume WhiteHoleVolume; public static WhiteHoleVolume WhiteHoleVolume;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
// wait for all late initializers (which includes meteor launchers) to finish // wait for all late initializers (which includes meteor launchers) to finish
StartDelayedReady(); StartDelayedReady();

View File

@ -1,13 +1,15 @@
using QSB.Messaging; using Cysharp.Threading.Tasks;
using QSB.Messaging;
using QSB.MeteorSync.Messages; using QSB.MeteorSync.Messages;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.MeteorSync.WorldObjects namespace QSB.MeteorSync.WorldObjects
{ {
public class QSBFragment : WorldObject<FragmentIntegrity> public class QSBFragment : WorldObject<FragmentIntegrity>
{ {
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
DetachableFragment = AttachedObject.GetComponent<DetachableFragment>(); DetachableFragment = AttachedObject.GetComponent<DetachableFragment>();

View File

@ -1,7 +1,9 @@
using QSB.OrbSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.OrbSync.WorldObjects;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
namespace QSB.OrbSync namespace QSB.OrbSync
{ {
@ -11,7 +13,7 @@ namespace QSB.OrbSync
public static readonly List<NomaiInterfaceOrb> Orbs = new(); public static readonly List<NomaiInterfaceOrb> Orbs = new();
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
Orbs.Clear(); Orbs.Clear();
Orbs.AddRange(QSBWorldSync.GetUnityObjects<NomaiInterfaceOrb>().SortDeterministic()); Orbs.AddRange(QSBWorldSync.GetUnityObjects<NomaiInterfaceOrb>().SortDeterministic());

View File

@ -1,9 +1,11 @@
using Mirror; using Cysharp.Threading.Tasks;
using Mirror;
using QSB.Messaging; using QSB.Messaging;
using QSB.OrbSync.Messages; using QSB.OrbSync.Messages;
using QSB.OrbSync.TransformSync; using QSB.OrbSync.TransformSync;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.OrbSync.WorldObjects namespace QSB.OrbSync.WorldObjects
@ -14,7 +16,7 @@ namespace QSB.OrbSync.WorldObjects
public NomaiOrbTransformSync TransformSync; public NomaiOrbTransformSync TransformSync;
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
if (QSBCore.IsHost) if (QSBCore.IsHost)
{ {

View File

@ -1,4 +1,6 @@
using QSB.WorldSync; using Cysharp.Threading.Tasks;
using QSB.WorldSync;
using System.Threading;
namespace QSB.PoolSync namespace QSB.PoolSync
{ {
@ -6,7 +8,7 @@ namespace QSB.PoolSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
foreach (var streaming in QSBWorldSync.GetUnityObjects<NomaiRemoteCameraStreaming>()) foreach (var streaming in QSBWorldSync.GetUnityObjects<NomaiRemoteCameraStreaming>())
{ {

View File

@ -1,4 +1,5 @@
using OWML.Common; using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
using QSB.QuantumSync.Messages; using QSB.QuantumSync.Messages;
@ -8,6 +9,7 @@ using QSB.WorldSync;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.QuantumSync namespace QSB.QuantumSync
@ -20,7 +22,7 @@ namespace QSB.QuantumSync
public void Awake() => QSBPlayerManager.OnRemovePlayer += PlayerLeave; public void Awake() => QSBPlayerManager.OnRemovePlayer += PlayerLeave;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
DebugLog.DebugWrite("Building quantum objects...", MessageType.Info); DebugLog.DebugWrite("Building quantum objects...", MessageType.Info);
QSBWorldSync.Init<QSBQuantumState, QuantumState>(); QSBWorldSync.Init<QSBQuantumState, QuantumState>();

View File

@ -1,8 +1,10 @@
using QSB.Utility; using Cysharp.Threading.Tasks;
using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
namespace QSB.QuantumSync.WorldObjects namespace QSB.QuantumSync.WorldObjects
{ {
@ -11,9 +13,9 @@ namespace QSB.QuantumSync.WorldObjects
public List<QSBQuantumState> QuantumStates { get; private set; } public List<QSBQuantumState> QuantumStates { get; private set; }
public int CurrentState => AttachedObject._stateIndex; public int CurrentState => AttachedObject._stateIndex;
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
base.Init(); base.Init(cancellationToken);
StartDelayedReady(); StartDelayedReady();
QSBCore.UnityEvents.RunWhen(() => QSBWorldSync.AllObjectsAdded, () => QSBCore.UnityEvents.RunWhen(() => QSBWorldSync.AllObjectsAdded, () =>

View File

@ -1,4 +1,5 @@
using OWML.Common; using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
using QSB.QuantumSync.Messages; using QSB.QuantumSync.Messages;
@ -6,6 +7,7 @@ using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.QuantumSync.WorldObjects namespace QSB.QuantumSync.WorldObjects
@ -35,7 +37,7 @@ namespace QSB.QuantumSync.WorldObjects
} }
} }
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
StartDelayedReady(); StartDelayedReady();
QSBCore.UnityEvents.FireInNUpdates(LateInit, 5); QSBCore.UnityEvents.FireInNUpdates(LateInit, 5);

View File

@ -1,17 +1,19 @@
using OWML.Common; using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System; using System;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.QuantumSync.WorldObjects namespace QSB.QuantumSync.WorldObjects
{ {
internal class QSBSocketedQuantumObject : QSBQuantumObject<SocketedQuantumObject> internal class QSBSocketedQuantumObject : QSBQuantumObject<SocketedQuantumObject>
{ {
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
base.Init(); base.Init(cancellationToken);
AttachedObject._randomYRotation = false; AttachedObject._randomYRotation = false;
} }

View File

@ -1,10 +1,12 @@
using OWML.Common; using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.SectorSync.WorldObjects; using QSB.SectorSync.WorldObjects;
using QSB.Syncs.Sectored; using QSB.Syncs.Sectored;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.SectorSync namespace QSB.SectorSync
@ -68,7 +70,7 @@ namespace QSB.SectorSync
DebugLog.DebugWrite("Sector Manager ready.", MessageType.Success); DebugLog.DebugWrite("Sector Manager ready.", MessageType.Success);
} }
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
DebugLog.DebugWrite("Building sectors...", MessageType.Info); DebugLog.DebugWrite("Building sectors...", MessageType.Info);
if (QSBSceneManager.CurrentScene == OWScene.SolarSystem) if (QSBSceneManager.CurrentScene == OWScene.SolarSystem)

View File

@ -1,8 +1,10 @@
using OWML.Common; using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System; using System;
using System.Linq; using System.Linq;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.SectorSync.WorldObjects namespace QSB.SectorSync.WorldObjects
@ -27,7 +29,7 @@ namespace QSB.SectorSync.WorldObjects
public bool IsFakeSector => AttachedObject is FakeSector; public bool IsFakeSector => AttachedObject is FakeSector;
public FakeSector FakeSector => (FakeSector)AttachedObject; public FakeSector FakeSector => (FakeSector)AttachedObject;
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
if (IsFakeSector) if (IsFakeSector)
{ {

View File

@ -1,4 +1,5 @@
using Mirror; using Cysharp.Threading.Tasks;
using Mirror;
using OWML.Common; using OWML.Common;
using QSB.Player; using QSB.Player;
using QSB.ShipSync.TransformSync; using QSB.ShipSync.TransformSync;
@ -7,6 +8,7 @@ using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.ShipSync namespace QSB.ShipSync
@ -43,7 +45,7 @@ namespace QSB.ShipSync
public void Start() public void Start()
=> Instance = this; => Instance = this;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
var shipTransform = GameObject.Find("Ship_Body"); var shipTransform = GameObject.Find("Ship_Body");
if (shipTransform == null) if (shipTransform == null)

View File

@ -1,6 +1,8 @@
using QSB.Tools.ProbeLauncherTool.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.Tools.ProbeLauncherTool.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Linq; using System.Linq;
using System.Threading;
namespace QSB.Tools.ProbeLauncherTool namespace QSB.Tools.ProbeLauncherTool
{ {
@ -8,7 +10,7 @@ namespace QSB.Tools.ProbeLauncherTool
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.Both; public override WorldObjectType WorldObjectType => WorldObjectType.Both;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
QSBWorldSync.Init<QSBProbeLauncher, ProbeLauncher>(typeof(PlayerProbeLauncher)); QSBWorldSync.Init<QSBProbeLauncher, ProbeLauncher>(typeof(PlayerProbeLauncher));
if (scene == OWScene.SolarSystem) if (scene == OWScene.SolarSystem)

View File

@ -1,12 +1,14 @@
using QSB.Messaging; using Cysharp.Threading.Tasks;
using QSB.Messaging;
using QSB.Tools.ProbeLauncherTool.Messages; using QSB.Tools.ProbeLauncherTool.Messages;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.Tools.ProbeLauncherTool.WorldObjects namespace QSB.Tools.ProbeLauncherTool.WorldObjects
{ {
internal class QSBProbeLauncher : WorldObject<ProbeLauncher> internal class QSBProbeLauncher : WorldObject<ProbeLauncher>
{ {
public override void Init() => public override async UniTask Init(CancellationToken cancellationToken) =>
AttachedObject.OnLaunchProbe += OnLaunchProbe; AttachedObject.OnLaunchProbe += OnLaunchProbe;
public override void OnRemoval() => public override void OnRemoval() =>

View File

@ -1,5 +1,7 @@
using QSB.Tools.TranslatorTool.TranslationSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.Tools.TranslatorTool.TranslationSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.Tools.TranslatorTool.TranslationSync namespace QSB.Tools.TranslatorTool.TranslationSync
{ {
@ -7,7 +9,7 @@ namespace QSB.Tools.TranslatorTool.TranslationSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.Both; public override WorldObjectType WorldObjectType => WorldObjectType.Both;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
// wait for all late initializers (which includes nomai text) to finish // wait for all late initializers (which includes nomai text) to finish
StartDelayedReady(); StartDelayedReady();

View File

@ -1,8 +1,10 @@
using Mirror; using Cysharp.Threading.Tasks;
using Mirror;
using QSB.TornadoSync.TransformSync; using QSB.TornadoSync.TransformSync;
using QSB.TornadoSync.WorldObjects; using QSB.TornadoSync.WorldObjects;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.TornadoSync namespace QSB.TornadoSync
{ {
@ -10,7 +12,7 @@ namespace QSB.TornadoSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
QSBWorldSync.Init<QSBTornado, TornadoController>(); QSBWorldSync.Init<QSBTornado, TornadoController>();

View File

@ -1,5 +1,7 @@
using QSB.TriggerSync.WorldObjects; using Cysharp.Threading.Tasks;
using QSB.TriggerSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
using System.Threading;
namespace QSB.TriggerSync namespace QSB.TriggerSync
{ {
@ -7,7 +9,7 @@ namespace QSB.TriggerSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.Both; public override WorldObjectType WorldObjectType => WorldObjectType.Both;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{ {
QSBWorldSync.Init<QSBCharacterTrigger, CharacterAnimController>(x => x.playerTrackingZone); QSBWorldSync.Init<QSBCharacterTrigger, CharacterAnimController>(x => x.playerTrackingZone);
QSBWorldSync.Init<QSBSolanumTrigger, NomaiConversationManager>(x => x._watchPlayerVolume); QSBWorldSync.Init<QSBSolanumTrigger, NomaiConversationManager>(x => x._watchPlayerVolume);

View File

@ -1,10 +1,13 @@
namespace QSB.TriggerSync.WorldObjects using Cysharp.Threading.Tasks;
using System.Threading;
namespace QSB.TriggerSync.WorldObjects
{ {
public class QSBCharacterTrigger : QSBTrigger<CharacterAnimController> public class QSBCharacterTrigger : QSBTrigger<CharacterAnimController>
{ {
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
base.Init(); await base.Init(cancellationToken);
AttachedObject.OnEntry -= TriggerOwner.OnZoneEntry; AttachedObject.OnEntry -= TriggerOwner.OnZoneEntry;
AttachedObject.OnExit -= TriggerOwner.OnZoneExit; AttachedObject.OnExit -= TriggerOwner.OnZoneExit;
} }

View File

@ -1,4 +1,6 @@
using QSB.Player; using Cysharp.Threading.Tasks;
using QSB.Player;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.TriggerSync.WorldObjects namespace QSB.TriggerSync.WorldObjects
@ -7,9 +9,9 @@ namespace QSB.TriggerSync.WorldObjects
{ {
protected override string CompareTag => "PlayerCameraDetector"; protected override string CompareTag => "PlayerCameraDetector";
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
base.Init(); base.Init(cancellationToken);
AttachedObject.OnEntry -= TriggerOwner.OnEnterFogSphere; AttachedObject.OnEntry -= TriggerOwner.OnEnterFogSphere;
AttachedObject.OnExit -= OnExitEvent; AttachedObject.OnExit -= OnExitEvent;
} }

View File

@ -1,12 +1,14 @@
using QSB.Player; using Cysharp.Threading.Tasks;
using QSB.Player;
using System.Threading;
namespace QSB.TriggerSync.WorldObjects namespace QSB.TriggerSync.WorldObjects
{ {
public class QSBMaskZoneTrigger : QSBTrigger<MaskZoneController> public class QSBMaskZoneTrigger : QSBTrigger<MaskZoneController>
{ {
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
base.Init(); base.Init(cancellationToken);
AttachedObject.OnEntry -= TriggerOwner.OnEnterMaskZone; AttachedObject.OnEntry -= TriggerOwner.OnEnterMaskZone;
AttachedObject.OnExit -= TriggerOwner.OnExitMaskZone; AttachedObject.OnExit -= TriggerOwner.OnExitMaskZone;
} }

View File

@ -1,10 +1,13 @@
namespace QSB.TriggerSync.WorldObjects using Cysharp.Threading.Tasks;
using System.Threading;
namespace QSB.TriggerSync.WorldObjects
{ {
public class QSBSolanumTrigger : QSBTrigger<NomaiConversationManager> public class QSBSolanumTrigger : QSBTrigger<NomaiConversationManager>
{ {
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
base.Init(); base.Init(cancellationToken);
AttachedObject.OnEntry -= TriggerOwner.OnEnterWatchVolume; AttachedObject.OnEntry -= TriggerOwner.OnEnterWatchVolume;
AttachedObject.OnExit -= TriggerOwner.OnExitWatchVolume; AttachedObject.OnExit -= TriggerOwner.OnExitWatchVolume;
} }

View File

@ -1,9 +1,11 @@
using QSB.Messaging; using Cysharp.Threading.Tasks;
using QSB.Messaging;
using QSB.Player; using QSB.Player;
using QSB.TriggerSync.Messages; using QSB.TriggerSync.Messages;
using QSB.WorldSync; using QSB.WorldSync;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.TriggerSync.WorldObjects namespace QSB.TriggerSync.WorldObjects
@ -25,7 +27,7 @@ namespace QSB.TriggerSync.WorldObjects
protected virtual string CompareTag => "PlayerDetector"; protected virtual string CompareTag => "PlayerDetector";
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
AttachedObject.OnEntry += OnEnterEvent; AttachedObject.OnEntry += OnEnterEvent;
AttachedObject.OnExit += OnExitEvent; AttachedObject.OnExit += OnExitEvent;

View File

@ -1,13 +1,15 @@
using QSB.Player; using Cysharp.Threading.Tasks;
using QSB.Player;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.TriggerSync.WorldObjects namespace QSB.TriggerSync.WorldObjects
{ {
public class QSBVesselCageTrigger : QSBTrigger<VesselWarpController> public class QSBVesselCageTrigger : QSBTrigger<VesselWarpController>
{ {
public override void Init() public override async UniTask Init(CancellationToken cancellationToken)
{ {
base.Init(); base.Init(cancellationToken);
AttachedObject.OnExit -= TriggerOwner.OnExitCageTrigger; AttachedObject.OnExit -= TriggerOwner.OnExitCageTrigger;
} }

View File

@ -1,4 +1,5 @@
using Mirror; using Cysharp.Threading.Tasks;
using Mirror;
using OWML.Common; using OWML.Common;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -125,6 +126,18 @@ namespace QSB.Utility
} }
} }
public static async UniTask Try(this object self, string description, Func<UniTask> func)
{
try
{
await func();
}
catch (Exception e)
{
DebugLog.ToConsole($"{self} - error {description} : {e}", MessageType.Error);
}
}
#endregion #endregion
} }
} }

View File

@ -1,4 +1,5 @@
using OWML.Common; using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.ConversationSync.Patches; using QSB.ConversationSync.Patches;
using QSB.LogSync; using QSB.LogSync;
using QSB.Messaging; using QSB.Messaging;
@ -8,6 +9,7 @@ using QSB.Utility;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using UnityEngine; using UnityEngine;
namespace QSB.WorldSync namespace QSB.WorldSync
@ -36,11 +38,16 @@ namespace QSB.WorldSync
GameInit(); GameInit();
DoBuild(scene); DoBuild(scene).Forget();
} }
private static void DoBuild(OWScene scene) 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)
{ {
_cts = new CancellationTokenSource();
foreach (var manager in Managers) foreach (var manager in Managers)
{ {
switch (manager.WorldObjectType) switch (manager.WorldObjectType)
@ -51,39 +58,40 @@ namespace QSB.WorldSync
continue; continue;
} }
DebugLog.DebugWrite($"Building {manager}", MessageType.Info); var task = UniTask.Create(async () =>
manager.Try("building world objects", () => manager.BuildWorldObjects(scene)); {
await manager.BuildWorldObjects(scene, _cts.Token);
DebugLog.DebugWrite($"Built {manager}", MessageType.Info);
});
_managerTasks.Add(task);
} }
QSBCore.UnityEvents.RunWhen(() => _numManagersReadying == 0, () => await _managerTasks;
AllObjectsAdded = true;
DebugLog.DebugWrite("World Objects added.", MessageType.Success);
await _objectTasks;
AllObjectsReady = true;
DebugLog.DebugWrite("World Objects ready.", MessageType.Success);
DeterministicManager.WorldObjectsReady();
if (!QSBCore.IsHost)
{ {
AllObjectsAdded = true; new RequestInitialStatesMessage().Send();
DebugLog.DebugWrite("World Objects added.", MessageType.Success); }
QSBCore.UnityEvents.RunWhen(() => _numObjectsReadying == 0, () =>
{
AllObjectsReady = true;
DebugLog.DebugWrite("World Objects ready.", MessageType.Success);
DeterministicManager.WorldObjectsReady();
if (!QSBCore.IsHost)
{
new RequestInitialStatesMessage().Send();
}
});
});
} }
internal static uint _numManagersReadying;
internal static uint _numObjectsReadying;
public static void RemoveWorldObjects() public static void RemoveWorldObjects()
{ {
GameReset(); GameReset();
_cts?.Cancel();
_cts?.Dispose();
_managerTasks.Clear();
_objectTasks.Clear();
AllObjectsAdded = false; AllObjectsAdded = false;
AllObjectsReady = false; AllObjectsReady = false;
_numManagersReadying = 0;
_numObjectsReadying = 0;
foreach (var item in WorldObjects) foreach (var item in WorldObjects)
{ {
@ -232,7 +240,8 @@ namespace QSB.WorldSync
ObjectId = WorldObjects.Count ObjectId = WorldObjects.Count
}; };
obj.Init(); var task = obj.Try("initing", async () => await obj.Init(_cts.Token));
_objectTasks.Add(task);
WorldObjects.Add(obj); WorldObjects.Add(obj);
UnityObjectsToWorldObjects.Add(item, obj); UnityObjectsToWorldObjects.Add(item, obj);
} }
@ -258,7 +267,8 @@ namespace QSB.WorldSync
TriggerOwner = owner TriggerOwner = owner
}; };
obj.Init(); var task = obj.Try("initing", async () => await obj.Init(_cts.Token));
_objectTasks.Add(task);
WorldObjects.Add(obj); WorldObjects.Add(obj);
UnityObjectsToWorldObjects.Add(item, obj); UnityObjectsToWorldObjects.Add(item, obj);
} }

View File

@ -1,4 +1,6 @@
using UnityEngine; using Cysharp.Threading.Tasks;
using System.Threading;
using UnityEngine;
namespace QSB.WorldSync namespace QSB.WorldSync
{ {
@ -11,18 +13,12 @@ namespace QSB.WorldSync
public string Name => AttachedObject ? AttachedObject.name : "<NullObject!>"; public string Name => AttachedObject ? AttachedObject.name : "<NullObject!>";
public override string ToString() => $"{ObjectId}:{GetType().Name} ({Name})"; public override string ToString() => $"{ObjectId}:{GetType().Name} ({Name})";
public virtual void Init() { } public virtual async UniTask Init(CancellationToken cancellationToken) { }
public virtual void OnRemoval() { } public virtual void OnRemoval() { }
public virtual bool ShouldDisplayDebug() => QSBWorldSync.AllObjectsReady && AttachedObject && AttachedObject.gameObject.activeInHierarchy; public virtual bool ShouldDisplayDebug() => QSBWorldSync.AllObjectsReady && AttachedObject && AttachedObject.gameObject.activeInHierarchy;
public virtual string ReturnLabel() => ToString(); public virtual string ReturnLabel() => ToString();
public virtual void DisplayLines() { } public virtual void DisplayLines() { }
public abstract void SendInitialState(uint to); public abstract void SendInitialState(uint to);
/// indicates that this won't become ready immediately
protected void StartDelayedReady() => QSBWorldSync._numObjectsReadying++;
/// indicates that this is now ready
protected void FinishDelayedReady() => QSBWorldSync._numObjectsReadying--;
} }
} }

View File

@ -1,4 +1,6 @@
using UnityEngine; using Cysharp.Threading.Tasks;
using System.Threading;
using UnityEngine;
namespace QSB.WorldSync namespace QSB.WorldSync
{ {
@ -16,16 +18,10 @@ namespace QSB.WorldSync
/// </summary> /// </summary>
public abstract WorldObjectType WorldObjectType { get; } public abstract WorldObjectType WorldObjectType { get; }
public abstract void BuildWorldObjects(OWScene scene); public abstract UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken);
public virtual void UnbuildWorldObjects() { } public virtual void UnbuildWorldObjects() { }
/// indicates that this won't become ready immediately
protected void StartDelayedReady() => QSBWorldSync._numManagersReadying++;
/// indicates that this is now ready
protected void FinishDelayedReady() => QSBWorldSync._numManagersReadying--;
public override string ToString() => GetType().Name; public override string ToString() => GetType().Name;
} }
} }

View File

@ -1,5 +1,7 @@
using QSB.WorldSync; using Cysharp.Threading.Tasks;
using QSB.WorldSync;
using QSB.ZeroGCaveSync.WorldObjects; using QSB.ZeroGCaveSync.WorldObjects;
using System.Threading;
namespace QSB.ZeroGCaveSync namespace QSB.ZeroGCaveSync
{ {
@ -7,7 +9,7 @@ namespace QSB.ZeroGCaveSync
{ {
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
public override void BuildWorldObjects(OWScene scene) public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
=> QSBWorldSync.Init<QSBSatelliteNode, SatelliteNode>(); => QSBWorldSync.Init<QSBSatelliteNode, SatelliteNode>();
} }
} }