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.WorldSync;
using System.Collections.Generic;
using System.Threading;
namespace QSB.Anglerfish
{
@ -11,7 +13,7 @@ namespace QSB.Anglerfish
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.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.TransformSync;
using QSB.Messaging;
using QSB.WorldSync;
using System.Threading;
using UnityEngine;
namespace QSB.Anglerfish.WorldObjects
@ -17,15 +19,14 @@ namespace QSB.Anglerfish.WorldObjects
private Vector3 _lastTargetPosition;
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
if (QSBCore.IsHost)
{
NetworkServer.Spawn(Object.Instantiate(QSBNetworkManager.singleton.AnglerPrefab));
}
StartDelayedReady();
QSBCore.UnityEvents.RunWhen(() => TransformSync, FinishDelayedReady);
await UniTask.WaitUntil(() => TransformSync, cancellationToken: cancellationToken);
}
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 System.Threading;
namespace QSB.Animation.NPC
{
@ -8,7 +10,7 @@ namespace QSB.Animation.NPC
// im assuming this is used in the eye as well
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<QSBTravelerController, TravelerController>();

View File

@ -1,5 +1,7 @@
using QSB.CampfireSync.WorldObjects;
using Cysharp.Threading.Tasks;
using QSB.CampfireSync.WorldObjects;
using QSB.WorldSync;
using System.Threading;
namespace QSB.CampfireSync
{
@ -7,7 +9,7 @@ namespace QSB.CampfireSync
{
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>();
}
}

View File

@ -1,4 +1,5 @@
using OWML.Common;
using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.ConversationSync.Messages;
using QSB.ConversationSync.WorldObjects;
using QSB.Messaging;
@ -7,6 +8,7 @@ using QSB.Utility;
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
@ -37,7 +39,7 @@ namespace QSB.ConversationSync
_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>();
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 System.Threading;
namespace QSB.EchoesOfTheEye.AirlockSync
{
@ -8,6 +10,6 @@ namespace QSB.EchoesOfTheEye.AirlockSync
// is this used in the prisoner sequence in the eye?
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 System.Threading;
namespace QSB.EchoesOfTheEye.LightSensorSync
{
@ -8,6 +10,6 @@ namespace QSB.EchoesOfTheEye.LightSensorSync
// see AirlockManager question
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 System.Threading;
namespace QSB.ElevatorSync
{
@ -7,7 +9,7 @@ namespace QSB.ElevatorSync
{
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>();
}
}

View File

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

View File

@ -1,5 +1,7 @@
using QSB.EyeOfTheUniverse.InstrumentSync.WorldObjects;
using Cysharp.Threading.Tasks;
using QSB.EyeOfTheUniverse.InstrumentSync.WorldObjects;
using QSB.WorldSync;
using System.Threading;
namespace QSB.EyeOfTheUniverse.InstrumentSync
{
@ -7,7 +9,7 @@ namespace QSB.EyeOfTheUniverse.InstrumentSync
{
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>();
}
}

View File

@ -1,5 +1,7 @@
using QSB.GeyserSync.WorldObjects;
using Cysharp.Threading.Tasks;
using QSB.GeyserSync.WorldObjects;
using QSB.WorldSync;
using System.Threading;
namespace QSB.GeyserSync
{
@ -7,7 +9,7 @@ namespace QSB.GeyserSync
{
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>();
}
}

View File

@ -1,12 +1,14 @@
using QSB.GeyserSync.Messages;
using Cysharp.Threading.Tasks;
using QSB.GeyserSync.Messages;
using QSB.Messaging;
using QSB.WorldSync;
using System.Threading;
namespace QSB.GeyserSync.WorldObjects
{
public class QSBGeyser : WorldObject<GeyserController>
{
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
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.Sockets;
using QSB.Utility;
using QSB.WorldSync;
using System.Threading;
namespace QSB.ItemSync
{
@ -10,7 +12,7 @@ namespace QSB.ItemSync
{
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);

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.SectorSync.WorldObjects;
using QSB.Utility;
using QSB.WorldSync;
using System.Threading;
using UnityEngine;
namespace QSB.ItemSync.WorldObjects.Items
@ -16,7 +18,7 @@ namespace QSB.ItemSync.WorldObjects.Items
private Quaternion InitialRotation { get; set; }
private QSBSector InitialSector { get; set; }
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
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.WorldSync;
using System.Collections.Generic;
using System.Threading;
namespace QSB.JellyfishSync
{
@ -11,7 +13,7 @@ namespace QSB.JellyfishSync
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.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.TransformSync;
using QSB.Messaging;
using QSB.WorldSync;
using System.Threading;
using UnityEngine;
namespace QSB.JellyfishSync.WorldObjects
@ -13,7 +15,7 @@ namespace QSB.JellyfishSync.WorldObjects
public JellyfishTransformSync TransformSync;
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
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 System.Linq;
using System.Threading;
namespace QSB.MeteorSync
{
@ -10,7 +12,7 @@ namespace QSB.MeteorSync
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
StartDelayedReady();

View File

@ -1,13 +1,15 @@
using QSB.Messaging;
using Cysharp.Threading.Tasks;
using QSB.Messaging;
using QSB.MeteorSync.Messages;
using QSB.WorldSync;
using System.Threading;
using UnityEngine;
namespace QSB.MeteorSync.WorldObjects
{
public class QSBFragment : WorldObject<FragmentIntegrity>
{
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
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.WorldSync;
using System.Collections.Generic;
using System.Threading;
namespace QSB.OrbSync
{
@ -11,7 +13,7 @@ namespace QSB.OrbSync
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.AddRange(QSBWorldSync.GetUnityObjects<NomaiInterfaceOrb>().SortDeterministic());

View File

@ -1,9 +1,11 @@
using Mirror;
using Cysharp.Threading.Tasks;
using Mirror;
using QSB.Messaging;
using QSB.OrbSync.Messages;
using QSB.OrbSync.TransformSync;
using QSB.Utility;
using QSB.WorldSync;
using System.Threading;
using UnityEngine;
namespace QSB.OrbSync.WorldObjects
@ -14,7 +16,7 @@ namespace QSB.OrbSync.WorldObjects
public NomaiOrbTransformSync TransformSync;
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
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
{
@ -6,7 +8,7 @@ namespace QSB.PoolSync
{
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>())
{

View File

@ -1,4 +1,5 @@
using OWML.Common;
using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.Messaging;
using QSB.Player;
using QSB.QuantumSync.Messages;
@ -8,6 +9,7 @@ using QSB.WorldSync;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using UnityEngine;
namespace QSB.QuantumSync
@ -20,7 +22,7 @@ namespace QSB.QuantumSync
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);
QSBWorldSync.Init<QSBQuantumState, QuantumState>();

View File

@ -1,8 +1,10 @@
using QSB.Utility;
using Cysharp.Threading.Tasks;
using QSB.Utility;
using QSB.WorldSync;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace QSB.QuantumSync.WorldObjects
{
@ -11,9 +13,9 @@ namespace QSB.QuantumSync.WorldObjects
public List<QSBQuantumState> QuantumStates { get; private set; }
public int CurrentState => AttachedObject._stateIndex;
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
base.Init();
base.Init(cancellationToken);
StartDelayedReady();
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.Player;
using QSB.QuantumSync.Messages;
@ -6,6 +7,7 @@ using QSB.Utility;
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using UnityEngine;
namespace QSB.QuantumSync.WorldObjects
@ -35,7 +37,7 @@ namespace QSB.QuantumSync.WorldObjects
}
}
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
StartDelayedReady();
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.Utility;
using QSB.WorldSync;
using System;
using System.Threading;
using UnityEngine;
namespace QSB.QuantumSync.WorldObjects
{
internal class QSBSocketedQuantumObject : QSBQuantumObject<SocketedQuantumObject>
{
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
base.Init();
base.Init(cancellationToken);
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.Syncs.Sectored;
using QSB.Utility;
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using UnityEngine;
namespace QSB.SectorSync
@ -68,7 +70,7 @@ namespace QSB.SectorSync
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);
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.WorldSync;
using System;
using System.Linq;
using System.Threading;
using UnityEngine;
namespace QSB.SectorSync.WorldObjects
@ -27,7 +29,7 @@ namespace QSB.SectorSync.WorldObjects
public bool IsFakeSector => AttachedObject is FakeSector;
public FakeSector FakeSector => (FakeSector)AttachedObject;
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
if (IsFakeSector)
{

View File

@ -1,4 +1,5 @@
using Mirror;
using Cysharp.Threading.Tasks;
using Mirror;
using OWML.Common;
using QSB.Player;
using QSB.ShipSync.TransformSync;
@ -7,6 +8,7 @@ using QSB.Utility;
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using UnityEngine;
namespace QSB.ShipSync
@ -43,7 +45,7 @@ namespace QSB.ShipSync
public void Start()
=> Instance = this;
public override void BuildWorldObjects(OWScene scene)
public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken)
{
var shipTransform = GameObject.Find("Ship_Body");
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 System.Linq;
using System.Threading;
namespace QSB.Tools.ProbeLauncherTool
{
@ -8,7 +10,7 @@ namespace QSB.Tools.ProbeLauncherTool
{
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));
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.WorldSync;
using System.Threading;
namespace QSB.Tools.ProbeLauncherTool.WorldObjects
{
internal class QSBProbeLauncher : WorldObject<ProbeLauncher>
{
public override void Init() =>
public override async UniTask Init(CancellationToken cancellationToken) =>
AttachedObject.OnLaunchProbe += OnLaunchProbe;
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 System.Threading;
namespace QSB.Tools.TranslatorTool.TranslationSync
{
@ -7,7 +9,7 @@ namespace QSB.Tools.TranslatorTool.TranslationSync
{
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
StartDelayedReady();

View File

@ -1,8 +1,10 @@
using Mirror;
using Cysharp.Threading.Tasks;
using Mirror;
using QSB.TornadoSync.TransformSync;
using QSB.TornadoSync.WorldObjects;
using QSB.Utility;
using QSB.WorldSync;
using System.Threading;
namespace QSB.TornadoSync
{
@ -10,7 +12,7 @@ namespace QSB.TornadoSync
{
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>();

View File

@ -1,5 +1,7 @@
using QSB.TriggerSync.WorldObjects;
using Cysharp.Threading.Tasks;
using QSB.TriggerSync.WorldObjects;
using QSB.WorldSync;
using System.Threading;
namespace QSB.TriggerSync
{
@ -7,7 +9,7 @@ namespace QSB.TriggerSync
{
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<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 override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
base.Init();
await base.Init(cancellationToken);
AttachedObject.OnEntry -= TriggerOwner.OnZoneEntry;
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;
namespace QSB.TriggerSync.WorldObjects
@ -7,9 +9,9 @@ namespace QSB.TriggerSync.WorldObjects
{
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.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
{
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.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 override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
base.Init();
base.Init(cancellationToken);
AttachedObject.OnEntry -= TriggerOwner.OnEnterWatchVolume;
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.TriggerSync.Messages;
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using UnityEngine;
namespace QSB.TriggerSync.WorldObjects
@ -25,7 +27,7 @@ namespace QSB.TriggerSync.WorldObjects
protected virtual string CompareTag => "PlayerDetector";
public override void Init()
public override async UniTask Init(CancellationToken cancellationToken)
{
AttachedObject.OnEntry += OnEnterEvent;
AttachedObject.OnExit += OnExitEvent;

View File

@ -1,13 +1,15 @@
using QSB.Player;
using Cysharp.Threading.Tasks;
using QSB.Player;
using System.Threading;
using UnityEngine;
namespace QSB.TriggerSync.WorldObjects
{
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;
}

View File

@ -1,4 +1,5 @@
using Mirror;
using Cysharp.Threading.Tasks;
using Mirror;
using OWML.Common;
using System;
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
}
}

View File

@ -1,4 +1,5 @@
using OWML.Common;
using Cysharp.Threading.Tasks;
using OWML.Common;
using QSB.ConversationSync.Patches;
using QSB.LogSync;
using QSB.Messaging;
@ -8,6 +9,7 @@ using QSB.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using UnityEngine;
namespace QSB.WorldSync
@ -36,11 +38,16 @@ namespace QSB.WorldSync
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)
{
switch (manager.WorldObjectType)
@ -51,39 +58,40 @@ namespace QSB.WorldSync
continue;
}
DebugLog.DebugWrite($"Building {manager}", MessageType.Info);
manager.Try("building world objects", () => manager.BuildWorldObjects(scene));
var task = UniTask.Create(async () =>
{
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;
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();
}
});
});
new RequestInitialStatesMessage().Send();
}
}
internal static uint _numManagersReadying;
internal static uint _numObjectsReadying;
public static void RemoveWorldObjects()
{
GameReset();
_cts?.Cancel();
_cts?.Dispose();
_managerTasks.Clear();
_objectTasks.Clear();
AllObjectsAdded = false;
AllObjectsReady = false;
_numManagersReadying = 0;
_numObjectsReadying = 0;
foreach (var item in WorldObjects)
{
@ -232,7 +240,8 @@ namespace QSB.WorldSync
ObjectId = WorldObjects.Count
};
obj.Init();
var task = obj.Try("initing", async () => await obj.Init(_cts.Token));
_objectTasks.Add(task);
WorldObjects.Add(obj);
UnityObjectsToWorldObjects.Add(item, obj);
}
@ -258,7 +267,8 @@ namespace QSB.WorldSync
TriggerOwner = owner
};
obj.Init();
var task = obj.Try("initing", async () => await obj.Init(_cts.Token));
_objectTasks.Add(task);
WorldObjects.Add(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
{
@ -11,18 +13,12 @@ namespace QSB.WorldSync
public string Name => AttachedObject ? AttachedObject.name : "<NullObject!>";
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 bool ShouldDisplayDebug() => QSBWorldSync.AllObjectsReady && AttachedObject && AttachedObject.gameObject.activeInHierarchy;
public virtual string ReturnLabel() => ToString();
public virtual void DisplayLines() { }
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
{
@ -16,16 +18,10 @@ namespace QSB.WorldSync
/// </summary>
public abstract WorldObjectType WorldObjectType { get; }
public abstract void BuildWorldObjects(OWScene scene);
public abstract UniTask BuildWorldObjects(OWScene scene, CancellationToken cancellationToken);
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;
}
}

View File

@ -1,5 +1,7 @@
using QSB.WorldSync;
using Cysharp.Threading.Tasks;
using QSB.WorldSync;
using QSB.ZeroGCaveSync.WorldObjects;
using System.Threading;
namespace QSB.ZeroGCaveSync
{
@ -7,7 +9,7 @@ namespace QSB.ZeroGCaveSync
{
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>();
}
}