Merge pull request #384 from misternebula/worldobject-delayed-ready

worldobject delayed ready
This commit is contained in:
Will Corby 2021-12-02 15:21:25 -08:00 committed by GitHub
commit 30501ed9e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
53 changed files with 174 additions and 138 deletions

View File

@ -26,7 +26,7 @@ namespace QSB.Anglerfish.Events
public override void OnReceiveRemote(bool isHost, AnglerChangeStateMessage message) public override void OnReceiveRemote(bool isHost, AnglerChangeStateMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -32,7 +32,7 @@ namespace QSB.Anglerfish.Patches
[HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.OnSectorOccupantsUpdated))] [HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.OnSectorOccupantsUpdated))]
public static bool OnSectorOccupantsUpdated(AnglerfishController __instance) public static bool OnSectorOccupantsUpdated(AnglerfishController __instance)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return true; return true;
} }
@ -77,7 +77,7 @@ namespace QSB.Anglerfish.Patches
[HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.UpdateState))] [HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.UpdateState))]
public static bool UpdateState(AnglerfishController __instance) public static bool UpdateState(AnglerfishController __instance)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return true; return true;
} }
@ -172,7 +172,7 @@ namespace QSB.Anglerfish.Patches
[HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.UpdateMovement))] [HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.UpdateMovement))]
public static bool UpdateMovement(AnglerfishController __instance) public static bool UpdateMovement(AnglerfishController __instance)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return true; return true;
} }

View File

@ -9,7 +9,7 @@ namespace QSB.Anglerfish.TransformSync
{ {
public class AnglerTransformSync : UnsectoredRigidbodySync public class AnglerTransformSync : UnsectoredRigidbodySync
{ {
public override bool IsReady => QSBCore.WorldObjectsReady; public override bool IsReady => WorldObjectManager.AllAdded;
public override bool UseInterpolation => false; public override bool UseInterpolation => false;
private QSBAngler _qsbAngler; private QSBAngler _qsbAngler;
@ -47,7 +47,7 @@ namespace QSB.Anglerfish.TransformSync
{ {
base.DeserializeTransform(reader, initialState); base.DeserializeTransform(reader, initialState);
if (!QSBCore.WorldObjectsReady || HasAuthority) if (!WorldObjectManager.AllReady || HasAuthority)
{ {
return; return;
} }
@ -73,7 +73,7 @@ namespace QSB.Anglerfish.TransformSync
protected override void OnRenderObject() protected override void OnRenderObject()
{ {
if (!QSBCore.WorldObjectsReady if (!WorldObjectManager.AllReady
|| !QSBCore.ShowLinesInDebug || !QSBCore.ShowLinesInDebug
|| !IsReady || !IsReady
|| ReferenceTransform == null || ReferenceTransform == null

View File

@ -22,13 +22,21 @@ namespace QSB.Anglerfish.WorldObjects
if (QSBCore.IsHost) if (QSBCore.IsHost)
{ {
QNetworkServer.Spawn(Object.Instantiate(QSBNetworkManager.Instance.AnglerPrefab)); QNetworkServer.Spawn(Object.Instantiate(QSBNetworkManager.Instance.AnglerPrefab));
QSBCore.UnityEvents.RunWhen(() => TransformSync, () =>
TransformSync.NetIdentity.RegisterAuthQueue());
} }
// for when you host/connect mid-game StartDelayedReady();
QSBCore.UnityEvents.RunWhen(() => TransformSync, () => QSBCore.UnityEvents.RunWhen(() => TransformSync, () =>
TransformSync.NetIdentity.FireAuthQueue(!AttachedObject._anglerBody.IsSuspended())); {
FinishDelayedReady();
if (QSBCore.IsHost)
{
TransformSync.NetIdentity.RegisterAuthQueue();
}
// for when you host/connect mid-game
TransformSync.NetIdentity.FireAuthQueue(!AttachedObject._anglerBody.IsSuspended());
});
} }
public override void OnRemoval() public override void OnRemoval()

View File

@ -1,5 +1,6 @@
using QSB.Events; using QSB.Events;
using QSB.Player; using QSB.Player;
using QSB.WorldSync;
namespace QSB.Animation.Player.Events namespace QSB.Animation.Player.Events
{ {
@ -20,7 +21,7 @@ namespace QSB.Animation.Player.Events
public override void OnReceiveRemote(bool server, AnimationTriggerMessage message) public override void OnReceiveRemote(bool server, AnimationTriggerMessage message)
{ {
var animationSync = QSBPlayerManager.GetSyncObject<AnimationSync>(message.AttachedNetId); var animationSync = QSBPlayerManager.GetSyncObject<AnimationSync>(message.AttachedNetId);
if (!QSBCore.WorldObjectsReady || animationSync == null) if (!WorldObjectManager.AllReady || animationSync == null)
{ {
return; return;
} }

View File

@ -2,6 +2,7 @@
using QSB.Instruments; using QSB.Instruments;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
using QSB.WorldSync;
namespace QSB.Animation.Player.Events namespace QSB.Animation.Player.Events
{ {
@ -20,7 +21,7 @@ namespace QSB.Animation.Player.Events
public override void OnReceiveRemote(bool server, EnumMessage<AnimationType> message) public override void OnReceiveRemote(bool server, EnumMessage<AnimationType> message)
{ {
if (!QSBCore.WorldObjectsReady || !QSBPlayerManager.GetPlayer(message.AboutId).IsReady) if (!WorldObjectManager.AllReady || !QSBPlayerManager.GetPlayer(message.AboutId).IsReady)
{ {
return; return;
} }

View File

@ -1,6 +1,7 @@
using QSB.Events; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
using QSB.WorldSync;
namespace QSB.Animation.Player.Events namespace QSB.Animation.Player.Events
{ {
@ -32,7 +33,7 @@ namespace QSB.Animation.Player.Events
var player = QSBPlayerManager.GetPlayer(message.AboutId); var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.SuitedUp = message.ToggleValue; player.SuitedUp = message.ToggleValue;
if (!QSBCore.WorldObjectsReady || !player.IsReady) if (!WorldObjectManager.AllReady || !player.IsReady)
{ {
return; return;
} }

View File

@ -1,4 +1,5 @@
using QSB.Player; using QSB.Player;
using QSB.WorldSync;
using UnityEngine; using UnityEngine;
namespace QSB.Animation.Player.Thrusters namespace QSB.Animation.Player.Thrusters
@ -85,7 +86,7 @@ namespace QSB.Animation.Player.Thrusters
private void OnRenderObject() private void OnRenderObject()
{ {
if (!QSBCore.WorldObjectsReady || !QSBCore.ShowLinesInDebug) if (!WorldObjectManager.AllReady || !QSBCore.ShowLinesInDebug)
{ {
return; return;
} }

View File

@ -1,4 +1,5 @@
using QSB.Events; using QSB.Events;
using QSB.WorldSync;
using QuantumUNET.Components; using QuantumUNET.Components;
namespace QSB.AuthoritySync namespace QSB.AuthoritySync
@ -26,7 +27,7 @@ namespace QSB.AuthoritySync
private static void OnReceive(AuthorityQueueMessage message) private static void OnReceive(AuthorityQueueMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -22,7 +22,7 @@ namespace QSB.ConversationSync.Events
public override void OnReceiveRemote(bool server, ConversationMessage message) public override void OnReceiveRemote(bool server, ConversationMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -29,7 +29,7 @@ namespace QSB.ConversationSync.Events
return; return;
} }
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -21,7 +21,7 @@ namespace QSB.GeyserSync.Events
public override void OnReceiveRemote(bool isHost, BoolWorldObjectMessage message) public override void OnReceiveRemote(bool isHost, BoolWorldObjectMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -23,7 +23,7 @@ namespace QSB.JellyfishSync.Events
public override void OnReceiveRemote(bool isHost, BoolWorldObjectMessage message) public override void OnReceiveRemote(bool isHost, BoolWorldObjectMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -15,7 +15,7 @@ namespace QSB.JellyfishSync.Patches
[HarmonyPatch(typeof(JellyfishController), nameof(JellyfishController.OnSectorOccupantsUpdated))] [HarmonyPatch(typeof(JellyfishController), nameof(JellyfishController.OnSectorOccupantsUpdated))]
public static bool OnSectorOccupantsUpdated(JellyfishController __instance) public static bool OnSectorOccupantsUpdated(JellyfishController __instance)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return true; return true;
} }
@ -42,7 +42,7 @@ namespace QSB.JellyfishSync.Patches
[HarmonyPatch(typeof(JellyfishController), nameof(JellyfishController.FixedUpdate))] [HarmonyPatch(typeof(JellyfishController), nameof(JellyfishController.FixedUpdate))]
public static bool FixedUpdate(JellyfishController __instance) public static bool FixedUpdate(JellyfishController __instance)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return true; return true;
} }

View File

@ -11,7 +11,7 @@ namespace QSB.JellyfishSync.TransformSync
{ {
public class JellyfishTransformSync : UnsectoredRigidbodySync public class JellyfishTransformSync : UnsectoredRigidbodySync
{ {
public override bool IsReady => QSBCore.WorldObjectsReady; public override bool IsReady => WorldObjectManager.AllAdded;
public override bool UseInterpolation => false; public override bool UseInterpolation => false;
private QSBJellyfish _qsbJellyfish; private QSBJellyfish _qsbJellyfish;
@ -47,7 +47,7 @@ namespace QSB.JellyfishSync.TransformSync
{ {
base.SerializeTransform(writer, initialState); base.SerializeTransform(writer, initialState);
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
writer.Write(false); writer.Write(false);
return; return;
@ -63,7 +63,7 @@ namespace QSB.JellyfishSync.TransformSync
{ {
base.DeserializeTransform(reader, initialState); base.DeserializeTransform(reader, initialState);
if (!QSBCore.WorldObjectsReady || HasAuthority) if (!WorldObjectManager.AllReady || HasAuthority)
{ {
reader.ReadBoolean(); reader.ReadBoolean();
return; return;
@ -142,7 +142,7 @@ namespace QSB.JellyfishSync.TransformSync
protected override void OnRenderObject() protected override void OnRenderObject()
{ {
if (!QSBCore.WorldObjectsReady if (!WorldObjectManager.AllReady
|| !QSBCore.ShowLinesInDebug || !QSBCore.ShowLinesInDebug
|| !IsReady || !IsReady
|| ReferenceTransform == null || ReferenceTransform == null

View File

@ -20,13 +20,21 @@ namespace QSB.JellyfishSync.WorldObjects
if (QSBCore.IsHost) if (QSBCore.IsHost)
{ {
QNetworkServer.Spawn(Object.Instantiate(QSBNetworkManager.Instance.JellyfishPrefab)); QNetworkServer.Spawn(Object.Instantiate(QSBNetworkManager.Instance.JellyfishPrefab));
QSBCore.UnityEvents.RunWhen(() => TransformSync, () =>
TransformSync.NetIdentity.RegisterAuthQueue());
} }
// for when you host/connect mid-game StartDelayedReady();
QSBCore.UnityEvents.RunWhen(() => TransformSync, () => QSBCore.UnityEvents.RunWhen(() => TransformSync, () =>
TransformSync.NetIdentity.FireAuthQueue(!AttachedObject._jellyfishBody.IsSuspended())); {
FinishDelayedReady();
if (QSBCore.IsHost)
{
TransformSync.NetIdentity.RegisterAuthQueue();
}
// for when you host/connect mid-game
TransformSync.NetIdentity.FireAuthQueue(!AttachedObject._jellyfishBody.IsSuspended());
});
} }
public override void OnRemoval() public override void OnRemoval()

View File

@ -33,7 +33,7 @@ namespace QSB.LogSync.Events
QSBWorldSync.AddFactReveal(message.FactId, message.SaveGame, message.ShowNotification); QSBWorldSync.AddFactReveal(message.FactId, message.SaveGame, message.ShowNotification);
} }
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -23,7 +23,7 @@ namespace QSB.MeteorSync.Events
public override void OnReceiveRemote(bool isHost, FragmentDamageMessage message) public override void OnReceiveRemote(bool isHost, FragmentDamageMessage message)
{ {
if (!MeteorManager.Ready) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -48,7 +48,7 @@ namespace QSB.MeteorSync.Events
public override void OnReceiveRemote(bool isHost, FragmentResyncMessage msg) public override void OnReceiveRemote(bool isHost, FragmentResyncMessage msg)
{ {
if (!MeteorManager.Ready) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -24,7 +24,7 @@ namespace QSB.MeteorSync.Events
public override void OnReceiveRemote(bool isHost, MeteorLaunchMessage message) public override void OnReceiveRemote(bool isHost, MeteorLaunchMessage message)
{ {
if (!MeteorManager.Ready) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -22,7 +22,7 @@ namespace QSB.MeteorSync.Events
public override void OnReceiveRemote(bool isHost, WorldObjectMessage message) public override void OnReceiveRemote(bool isHost, WorldObjectMessage message)
{ {
if (!MeteorManager.Ready) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -22,7 +22,7 @@ namespace QSB.MeteorSync.Events
public override void OnReceiveRemote(bool isHost, WorldObjectMessage message) public override void OnReceiveRemote(bool isHost, WorldObjectMessage message)
{ {
if (!MeteorManager.Ready) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -6,21 +6,19 @@ namespace QSB.MeteorSync
{ {
public class MeteorManager : WorldObjectManager public class MeteorManager : WorldObjectManager
{ {
public static bool Ready => AllReady && _ready;
private static bool _ready;
public static WhiteHoleVolume WhiteHoleVolume; public static WhiteHoleVolume WhiteHoleVolume;
protected override void RebuildWorldObjects(OWScene scene) protected override void RebuildWorldObjects(OWScene scene)
{ {
_ready = false;
// wait for all late initializers (which includes meteor launchers) to finish // wait for all late initializers (which includes meteor launchers) to finish
StartDelayedReady();
QSBCore.UnityEvents.RunWhen(() => LateInitializerManager.s_lateInitializers.Count == 0, () => QSBCore.UnityEvents.RunWhen(() => LateInitializerManager.s_lateInitializers.Count == 0, () =>
{ {
FinishDelayedReady();
WhiteHoleVolume = QSBWorldSync.GetUnityObjects<WhiteHoleVolume>().First(); WhiteHoleVolume = QSBWorldSync.GetUnityObjects<WhiteHoleVolume>().First();
QSBWorldSync.Init<QSBMeteorLauncher, MeteorLauncher>(); QSBWorldSync.Init<QSBMeteorLauncher, MeteorLauncher>();
QSBWorldSync.Init<QSBMeteor, MeteorController>(); QSBWorldSync.Init<QSBMeteor, MeteorController>();
QSBWorldSync.Init<QSBFragment, FragmentIntegrity>(); QSBWorldSync.Init<QSBFragment, FragmentIntegrity>();
_ready = true;
}); });
} }
} }

View File

@ -148,7 +148,7 @@ namespace QSB.MeteorSync.Patches
{ {
return true; return true;
} }
if (!MeteorManager.Ready) if (!WorldObjectManager.AllReady)
{ {
return true; return true;
} }

View File

@ -15,7 +15,7 @@ namespace QSB.MeteorSync.Patches
[HarmonyPatch(typeof(MeteorLauncher), nameof(MeteorLauncher.FixedUpdate))] [HarmonyPatch(typeof(MeteorLauncher), nameof(MeteorLauncher.FixedUpdate))]
public static bool FixedUpdate(MeteorLauncher __instance) public static bool FixedUpdate(MeteorLauncher __instance)
{ {
if (!MeteorManager.Ready) if (!WorldObjectManager.AllReady)
{ {
return true; return true;
} }
@ -202,7 +202,7 @@ namespace QSB.MeteorSync.Patches
{ {
return true; return true;
} }
if (!MeteorManager.Ready) if (!WorldObjectManager.AllReady)
{ {
return true; return true;
} }

View File

@ -74,7 +74,7 @@ namespace QSB.OrbSync.TransformSync
protected override Component InitRemoteTransform() => GetTransform(); protected override Component InitRemoteTransform() => GetTransform();
protected override float DistanceLeeway => 1f; protected override float DistanceLeeway => 1f;
public override bool IsReady => QSBCore.WorldObjectsReady; public override bool IsReady => WorldObjectManager.AllReady;
public override bool UseInterpolation => false; public override bool UseInterpolation => false;
} }
} }

View File

@ -20,7 +20,7 @@ namespace QSB.OrbSync.WorldObjects
public void HandleEvent(bool state, int orbId) public void HandleEvent(bool state, int orbId)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -249,7 +249,7 @@ namespace QSB.Player.TransformSync
{ {
base.OnRenderObject(); base.OnRenderObject();
if (!QSBCore.WorldObjectsReady if (!WorldObjectManager.AllReady
|| !QSBCore.ShowLinesInDebug || !QSBCore.ShowLinesInDebug
|| !IsReady || !IsReady
|| ReferenceTransform == null) || ReferenceTransform == null)

View File

@ -72,7 +72,6 @@ namespace QSB
public static AssetBundle InstrumentAssetBundle { get; private set; } public static AssetBundle InstrumentAssetBundle { get; private set; }
public static AssetBundle ConversationAssetBundle { get; private set; } public static AssetBundle ConversationAssetBundle { get; private set; }
public static AssetBundle DebugAssetBundle { get; private set; } public static AssetBundle DebugAssetBundle { get; private set; }
public static bool WorldObjectsReady => WorldObjectManager.AllReady && IsInMultiplayer && PlayerTransformSync.LocalInstance != null;
public static bool IsHost => QNetworkServer.active; public static bool IsHost => QNetworkServer.active;
public static bool IsInMultiplayer => QNetworkManager.singleton.isNetworkActive; public static bool IsInMultiplayer => QNetworkManager.singleton.isNetworkActive;
public static string QSBVersion => Helper.Manifest.Version; public static string QSBVersion => Helper.Manifest.Version;

View File

@ -2,6 +2,7 @@
using QSB.Events; using QSB.Events;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using QSB.WorldSync;
using UnityEngine; using UnityEngine;
namespace QSB.QuantumSync.Events namespace QSB.QuantumSync.Events
@ -23,7 +24,7 @@ namespace QSB.QuantumSync.Events
public override void OnReceiveRemote(bool server, MoonStateChangeMessage message) public override void OnReceiveRemote(bool server, MoonStateChangeMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -33,7 +33,7 @@ namespace QSB.QuantumSync.Events
public override void OnReceiveRemote(bool server, MultiStateChangeMessage message) public override void OnReceiveRemote(bool server, MultiStateChangeMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -20,7 +20,7 @@ namespace QSB.QuantumSync.Events
public override void OnReceiveRemote(bool server, QuantumShuffleMessage message) public override void OnReceiveRemote(bool server, QuantumShuffleMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -24,7 +24,7 @@ namespace QSB.QuantumSync.Events
public override void OnReceiveRemote(bool server, SocketStateChangeMessage message) public override void OnReceiveRemote(bool server, SocketStateChangeMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -67,7 +67,7 @@ namespace QSB.QuantumSync
public void OnRenderObject() public void OnRenderObject()
{ {
if (!QSBCore.WorldObjectsReady || !QSBCore.ShowLinesInDebug) if (!WorldObjectManager.AllReady || !QSBCore.ShowLinesInDebug)
{ {
return; return;
} }

View File

@ -1,7 +1,7 @@
using QSB.Utility; using System.Collections.Generic;
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using QSB.Utility;
using QSB.WorldSync;
using UnityEngine.UI; using UnityEngine.UI;
namespace QSB.QuantumSync.WorldObjects namespace QSB.QuantumSync.WorldObjects
@ -32,16 +32,19 @@ namespace QSB.QuantumSync.WorldObjects
} }
base.Init(attachedObject, id); base.Init(attachedObject, id);
}
public override void PostInit() StartDelayedReady();
{ QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllAdded, () =>
QuantumStates = AttachedObject._states.ToList().Select(x => QSBWorldSync.GetWorldFromUnity<QSBQuantumState>(x)).ToList();
if (QuantumStates.Any(x => x == null))
{ {
DebugLog.ToConsole($"Error - {AttachedObject.name} has one or more null QSBQuantumStates assigned!", OWML.Common.MessageType.Error); FinishDelayedReady();
}
QuantumStates = AttachedObject._states.Select(QSBWorldSync.GetWorldFromUnity<QSBQuantumState>).ToList();
if (QuantumStates.Any(x => x == null))
{
DebugLog.ToConsole($"Error - {AttachedObject.name} has one or more null QSBQuantumStates assigned!", OWML.Common.MessageType.Error);
}
});
} }
public void ChangeState(int newStateIndex) public void ChangeState(int newStateIndex)

View File

@ -162,7 +162,7 @@ namespace QSB.QuantumSync.WorldObjects
DebugLog.DebugWrite($"{LogName}-{Name} enable", MessageType.Success); DebugLog.DebugWrite($"{LogName}-{Name} enable", MessageType.Success);
IsEnabled = true; IsEnabled = true;
if (!QSBCore.WorldObjectsReady && !QSBCore.IsHost) if (!WorldObjectManager.AllReady && !QSBCore.IsHost)
{ {
return; return;
} }
@ -193,7 +193,7 @@ namespace QSB.QuantumSync.WorldObjects
DebugLog.DebugWrite($"{LogName}-{Name} disable", MessageType.Error); DebugLog.DebugWrite($"{LogName}-{Name} disable", MessageType.Error);
IsEnabled = false; IsEnabled = false;
if (!QSBCore.WorldObjectsReady && !QSBCore.IsHost) if (!WorldObjectManager.AllReady && !QSBCore.IsHost)
{ {
return; return;
} }

View File

@ -42,7 +42,7 @@ namespace QSB.RoastingSync.Events
public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message) public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -24,7 +24,7 @@ namespace QSB.RoastingSync.Events
public override void OnReceiveRemote(bool server, EnumMessage<MarshmallowEventType> message) public override void OnReceiveRemote(bool server, EnumMessage<MarshmallowEventType> message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -4,6 +4,7 @@ using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.Utility; using QSB.Utility;
using System; using System;
using QSB.WorldSync;
using UnityEngine; using UnityEngine;
namespace QSB.ShipSync.Patches namespace QSB.ShipSync.Patches
@ -62,7 +63,7 @@ namespace QSB.ShipSync.Patches
public static bool InteractZone_UpdateInteractVolume(InteractZone __instance) public static bool InteractZone_UpdateInteractVolume(InteractZone __instance)
{ {
/* Angle for interaction with the ship hatch /* Angle for interaction with the ship hatch
* *
* \ 80° / - If in ship * \ 80° / - If in ship
* \ / * \ /
* \ / * \ /
@ -70,10 +71,10 @@ namespace QSB.ShipSync.Patches
* / \ * / \
* / \ * / \
* / 280° \ - If not in ship * / 280° \ - If not in ship
* *
*/ */
if (!QSBCore.WorldObjectsReady || __instance != ShipManager.Instance.HatchInteractZone) if (!WorldObjectManager.AllReady || __instance != ShipManager.Instance.HatchInteractZone)
{ {
return true; return true;
} }

View File

@ -138,7 +138,7 @@ namespace QSB.Syncs.Sectored
public override void DeserializeTransform(QNetworkReader reader, bool initialState) public override void DeserializeTransform(QNetworkReader reader, bool initialState)
{ {
int sectorId; int sectorId;
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
sectorId = reader.ReadInt32(); sectorId = reader.ReadInt32();
if (initialState && sectorId != -1) if (initialState && sectorId != -1)

View File

@ -1,5 +1,6 @@
using OWML.Common; using OWML.Common;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync;
using QuantumUNET.Transport; using QuantumUNET.Transport;
using UnityEngine; using UnityEngine;
@ -61,7 +62,7 @@ namespace QSB.Syncs.Sectored.Rigidbodies
{ {
base.DeserializeTransform(reader, initialState); base.DeserializeTransform(reader, initialState);
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
reader.ReadVector3(); reader.ReadVector3();
DeserializeRotation(reader); DeserializeRotation(reader);

View File

@ -1,5 +1,6 @@
using OWML.Common; using OWML.Common;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync;
using QuantumUNET.Transport; using QuantumUNET.Transport;
using UnityEngine; using UnityEngine;
@ -31,7 +32,7 @@ namespace QSB.Syncs.Sectored.Transforms
{ {
base.DeserializeTransform(reader, initialState); base.DeserializeTransform(reader, initialState);
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
reader.ReadVector3(); reader.ReadVector3();
DeserializeRotation(reader); DeserializeRotation(reader);

View File

@ -76,7 +76,7 @@ namespace QSB.Syncs
&& Player.IsReady && Player.IsReady
&& NetId.Value != uint.MaxValue && NetId.Value != uint.MaxValue
&& NetId.Value != 0U && NetId.Value != 0U
&& WorldObjectManager.AllReady; && WorldObjectManager.AllAdded;
public abstract bool IsReady { get; } public abstract bool IsReady { get; }
public abstract bool UseInterpolation { get; } public abstract bool UseInterpolation { get; }
public abstract bool IgnoreDisabledAttachedObject { get; } public abstract bool IgnoreDisabledAttachedObject { get; }
@ -298,7 +298,7 @@ namespace QSB.Syncs
protected virtual void OnRenderObject() protected virtual void OnRenderObject()
{ {
if (!QSBCore.WorldObjectsReady if (!WorldObjectManager.AllReady
|| !QSBCore.ShowLinesInDebug || !QSBCore.ShowLinesInDebug
|| !IsReady || !IsReady
|| ReferenceTransform == null) || ReferenceTransform == null)

View File

@ -1,4 +1,5 @@
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync;
using QuantumUNET.Transport; using QuantumUNET.Transport;
using UnityEngine; using UnityEngine;
@ -55,7 +56,7 @@ namespace QSB.Syncs.Unsectored.Rigidbodies
public override void DeserializeTransform(QNetworkReader reader, bool initialState) public override void DeserializeTransform(QNetworkReader reader, bool initialState)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
reader.ReadVector3(); reader.ReadVector3();
DeserializeRotation(reader); DeserializeRotation(reader);

View File

@ -1,5 +1,6 @@
using OWML.Common; using OWML.Common;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync;
using QuantumUNET.Transport; using QuantumUNET.Transport;
using UnityEngine; using UnityEngine;
@ -27,7 +28,7 @@ namespace QSB.Syncs.Unsectored.Transforms
public override void DeserializeTransform(QNetworkReader reader, bool initialState) public override void DeserializeTransform(QNetworkReader reader, bool initialState)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
reader.ReadVector3(); reader.ReadVector3();
DeserializeRotation(reader); DeserializeRotation(reader);

View File

@ -1,4 +1,5 @@
using UnityEngine; using QSB.WorldSync;
using UnityEngine;
namespace QSB.Tools.TranslatorTool namespace QSB.Tools.TranslatorTool
{ {
@ -76,7 +77,7 @@ namespace QSB.Tools.TranslatorTool
private void OnRenderObject() private void OnRenderObject()
{ {
if (!QSBCore.WorldObjectsReady || !QSBCore.ShowLinesInDebug) if (!WorldObjectManager.AllReady || !QSBCore.ShowLinesInDebug)
{ {
return; return;
} }

View File

@ -21,7 +21,7 @@ namespace QSB.Tools.TranslatorTool.TranslationSync.Events
public override void OnReceiveRemote(bool server, SetAsTranslatedMessage message) public override void OnReceiveRemote(bool server, SetAsTranslatedMessage message)
{ {
if (!QSBCore.WorldObjectsReady) if (!WorldObjectManager.AllReady)
{ {
return; return;
} }

View File

@ -1,4 +1,5 @@
using QSB.Player; using QSB.Player;
using QSB.WorldSync;
using UnityEngine; using UnityEngine;
namespace QSB.Utility namespace QSB.Utility
@ -61,7 +62,7 @@ namespace QSB.Utility
private void FixedUpdate() private void FixedUpdate()
{ {
if (!QSBCore.WorldObjectsReady || !_isReady) if (!WorldObjectManager.AllReady || !_isReady)
{ {
return; return;
} }

View File

@ -88,7 +88,7 @@ namespace QSB.Utility
#region Column1 - Server data #region Column1 - Server data
WriteLine(1, $"FPS : {Mathf.Round(1f / Time.smoothDeltaTime)}"); WriteLine(1, $"FPS : {Mathf.Round(1f / Time.smoothDeltaTime)}");
WriteLine(1, $"HasWokenUp : {QSBCore.WorldObjectsReady}"); WriteLine(1, $"HasWokenUp : {WorldObjectManager.AllReady}");
if (WakeUpSync.LocalInstance != null) if (WakeUpSync.LocalInstance != null)
{ {
WriteLine(1, $"Server State : {ServerStateManager.Instance.GetServerState()}"); WriteLine(1, $"Server State : {ServerStateManager.Instance.GetServerState()}");
@ -133,7 +133,7 @@ namespace QSB.Utility
WriteLine(2, $"Ready : {player.IsReady}"); WriteLine(2, $"Ready : {player.IsReady}");
WriteLine(2, $"Suited Up : {player.SuitedUp}"); WriteLine(2, $"Suited Up : {player.SuitedUp}");
if (player.IsReady && QSBCore.WorldObjectsReady) if (player.IsReady && WorldObjectManager.AllReady)
{ {
var networkTransform = player.TransformSync; var networkTransform = player.TransformSync;
var referenceSector = networkTransform.ReferenceSector; var referenceSector = networkTransform.ReferenceSector;

View File

@ -7,7 +7,6 @@ namespace QSB.WorldSync
int ObjectId { get; } int ObjectId { get; }
string Name { get; } string Name { get; }
void PostInit();
void OnRemoval(); void OnRemoval();
MonoBehaviour ReturnObject(); MonoBehaviour ReturnObject();
} }

View File

@ -1,20 +1,20 @@
using OWML.Common; using System;
using System.Collections.Generic;
using System.Linq;
using OWML.Common;
using QSB.OrbSync.TransformSync; using QSB.OrbSync.TransformSync;
using QSB.OrbSync.WorldObjects; using QSB.OrbSync.WorldObjects;
using QSB.Utility; using QSB.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine; using UnityEngine;
namespace QSB.WorldSync namespace QSB.WorldSync
{ {
public static class QSBWorldSync public static class QSBWorldSync
{ {
public static List<NomaiInterfaceOrb> OldOrbList { get; set; } = new List<NomaiInterfaceOrb>(); public static List<NomaiInterfaceOrb> OldOrbList { get; set; } = new();
public static List<CharacterDialogueTree> OldDialogueTrees { get; set; } = new List<CharacterDialogueTree>(); public static List<CharacterDialogueTree> OldDialogueTrees { get; set; } = new();
public static Dictionary<string, bool> DialogueConditions { get; } = new Dictionary<string, bool>(); public static Dictionary<string, bool> DialogueConditions { get; } = new();
public static List<FactReveal> ShipLogFacts { get; } = new List<FactReveal>(); public static List<FactReveal> ShipLogFacts { get; } = new();
private static readonly List<IWorldObject> WorldObjects = new(); private static readonly List<IWorldObject> WorldObjects = new();
private static readonly Dictionary<MonoBehaviour, IWorldObject> WorldObjectsToUnityObjects = new(); private static readonly Dictionary<MonoBehaviour, IWorldObject> WorldObjectsToUnityObjects = new();
@ -24,22 +24,18 @@ namespace QSB.WorldSync
public static TWorldObject GetWorldFromId<TWorldObject>(int id) public static TWorldObject GetWorldFromId<TWorldObject>(int id)
{ {
if (id < 0 || id >= GetWorldObjects<TWorldObject>().Count()) var worldObjects = GetWorldObjects<TWorldObject>().ToList();
if (id < 0 || id >= worldObjects.Count)
{ {
DebugLog.ToConsole($"Warning - Tried to find {typeof(TWorldObject).Name} id {id}. Count is {GetWorldObjects<TWorldObject>().Count()}.", MessageType.Warning); DebugLog.ToConsole($"Warning - Tried to find {typeof(TWorldObject).Name} id {id}. Count is {worldObjects.Count}.", MessageType.Warning);
return default; return default;
} }
return GetWorldObjects<TWorldObject>().ToList()[id]; return worldObjects[id];
} }
public static IWorldObject GetWorldFromUnity(MonoBehaviour unityObject) public static IWorldObject GetWorldFromUnity(MonoBehaviour unityObject)
{ {
if (!WorldObjectManager.AllReady)
{
return default;
}
if (unityObject == null) if (unityObject == null)
{ {
DebugLog.ToConsole($"Error - Trying to run GetWorldFromUnity with a null unity object! TUnityObject:NULL", MessageType.Error); DebugLog.ToConsole($"Error - Trying to run GetWorldFromUnity with a null unity object! TUnityObject:NULL", MessageType.Error);
@ -52,14 +48,12 @@ namespace QSB.WorldSync
return default; return default;
} }
if (!WorldObjectsToUnityObjects.ContainsKey(unityObject)) if (!WorldObjectsToUnityObjects.TryGetValue(unityObject, out var returnObject))
{ {
DebugLog.ToConsole($"Error - WorldObjectsToUnityObjects does not contain \"{unityObject.name}\"! TUnityObject:{unityObject.GetType().Name}", MessageType.Error); DebugLog.ToConsole($"Error - WorldObjectsToUnityObjects does not contain \"{unityObject.name}\"! TUnityObject:{unityObject.GetType().Name}", MessageType.Error);
return default; return default;
} }
var returnObject = WorldObjectsToUnityObjects[unityObject];
if (returnObject == null) if (returnObject == null)
{ {
DebugLog.ToConsole($"Error - World object for unity object {unityObject.name} is null! TUnityObject:{unityObject.GetType().Name}", MessageType.Error); DebugLog.ToConsole($"Error - World object for unity object {unityObject.name} is null! TUnityObject:{unityObject.GetType().Name}", MessageType.Error);
@ -72,11 +66,6 @@ namespace QSB.WorldSync
public static TWorldObject GetWorldFromUnity<TWorldObject>(MonoBehaviour unityObject) public static TWorldObject GetWorldFromUnity<TWorldObject>(MonoBehaviour unityObject)
where TWorldObject : IWorldObject where TWorldObject : IWorldObject
{ {
if (!WorldObjectManager.AllReady)
{
return default;
}
if (unityObject == null) if (unityObject == null)
{ {
DebugLog.ToConsole($"Error - Trying to run GetWorldFromUnity with a null unity object! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:NULL", MessageType.Error); DebugLog.ToConsole($"Error - Trying to run GetWorldFromUnity with a null unity object! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:NULL", MessageType.Error);
@ -89,21 +78,19 @@ namespace QSB.WorldSync
return default; return default;
} }
if (!WorldObjectsToUnityObjects.ContainsKey(unityObject)) if (!WorldObjectsToUnityObjects.TryGetValue(unityObject, out var returnObject))
{ {
DebugLog.ToConsole($"Error - WorldObjectsToUnityObjects does not contain \"{unityObject.name}\"! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{unityObject.GetType().Name}", MessageType.Error); DebugLog.ToConsole($"Error - WorldObjectsToUnityObjects does not contain \"{unityObject.name}\"! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{unityObject.GetType().Name}", MessageType.Error);
return default; return default;
} }
var returnObject = (TWorldObject)WorldObjectsToUnityObjects[unityObject];
if (returnObject == null) if (returnObject == null)
{ {
DebugLog.ToConsole($"Error - World object for unity object {unityObject.name} is null! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{unityObject.GetType().Name}", MessageType.Error); DebugLog.ToConsole($"Error - World object for unity object {unityObject.name} is null! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{unityObject.GetType().Name}", MessageType.Error);
return default; return default;
} }
return returnObject; return (TWorldObject)returnObject;
} }
public static int GetIdFromUnity<TWorldObject>(MonoBehaviour unityObject) public static int GetIdFromUnity<TWorldObject>(MonoBehaviour unityObject)
@ -115,7 +102,7 @@ namespace QSB.WorldSync
var index = GetWorldObjects<TTypeSubset>().ToList().IndexOf(typeSubset); var index = GetWorldObjects<TTypeSubset>().ToList().IndexOf(typeSubset);
if (index == -1) if (index == -1)
{ {
DebugLog.ToConsole($"Warning - {(typeSubset as IWorldObject).Name} doesn't exist in list of {typeof(TTypeSubset).Name} !", MessageType.Warning); DebugLog.ToConsole($"Warning - {((IWorldObject)typeSubset).Name} doesn't exist in list of {typeof(TTypeSubset).Name} !", MessageType.Warning);
} }
return index; return index;
@ -123,21 +110,16 @@ namespace QSB.WorldSync
public static void RemoveWorldObjects<TWorldObject>() public static void RemoveWorldObjects<TWorldObject>()
{ {
if (WorldObjects == null || WorldObjects.Count == 0) if (WorldObjects.Count == 0)
{ {
DebugLog.ToConsole($"Warning - Trying to remove WorldObjects of type {typeof(TWorldObject).Name}, but there are no WorldObjects!"); DebugLog.ToConsole($"Warning - Trying to remove WorldObjects of type {typeof(TWorldObject).Name}, but there are no WorldObjects!", MessageType.Warning);
return;
} }
var itemsToRemove = WorldObjects.Where(x => x is TWorldObject); var itemsToRemove = WorldObjects.Where(x => x is TWorldObject);
foreach (var item in itemsToRemove) foreach (var item in itemsToRemove)
{ {
if (item is null)
{
DebugLog.ToConsole($"Error - Trying to remove a null WorldObject of type {typeof(TWorldObject).Name}.", MessageType.Error);
continue;
}
try try
{ {
WorldObjectsToUnityObjects.Remove(item.ReturnObject()); WorldObjectsToUnityObjects.Remove(item.ReturnObject());

View File

@ -12,8 +12,13 @@ namespace QSB.WorldSync
public string LogName => $"{QSBPlayerManager.LocalPlayerId}.{ObjectId}:{GetType().Name}"; public string LogName => $"{QSBPlayerManager.LocalPlayerId}.{ObjectId}:{GetType().Name}";
public abstract void Init(T attachedObject, int id); public abstract void Init(T attachedObject, int id);
public virtual void PostInit() { }
public virtual void OnRemoval() { } public virtual void OnRemoval() { }
public MonoBehaviour ReturnObject() => AttachedObject; public MonoBehaviour ReturnObject() => AttachedObject;
/// indicates that this won't become ready immediately
protected void StartDelayedReady() => WorldObjectManager._numObjectsReadying++;
/// indicates that this is now ready
protected void FinishDelayedReady() => WorldObjectManager._numObjectsReadying--;
} }
} }

View File

@ -1,7 +1,8 @@
using QSB.Player; using System;
using QSB.Utility;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using OWML.Common;
using QSB.Player;
using QSB.Utility;
using UnityEngine; using UnityEngine;
namespace QSB.WorldSync namespace QSB.WorldSync
@ -10,7 +11,7 @@ namespace QSB.WorldSync
{ {
private static readonly List<WorldObjectManager> _managers = new(); private static readonly List<WorldObjectManager> _managers = new();
// BUG : this gets set to true even if the objects aren't technically ready (i.e. they wait for something else) public static bool AllAdded { get; private set; }
public static bool AllReady { get; private set; } public static bool AllReady { get; private set; }
public virtual void Awake() public virtual void Awake()
@ -25,9 +26,17 @@ namespace QSB.WorldSync
_managers.Remove(this); _managers.Remove(this);
} }
public static void SetNotReady() => AllReady = false; public static void SetNotReady()
{
AllAdded = false;
AllReady = false;
}
private void OnSceneLoaded(OWScene oldScene, OWScene newScene, bool inUniverse) => AllReady = false; private void OnSceneLoaded(OWScene oldScene, OWScene newScene, bool inUniverse)
{
AllAdded = false;
AllReady = false;
}
public static void Rebuild(OWScene scene) public static void Rebuild(OWScene scene)
{ {
@ -56,6 +65,10 @@ namespace QSB.WorldSync
private static void DoRebuild(OWScene scene) private static void DoRebuild(OWScene scene)
{ {
_numManagersReadying = 0;
_numObjectsReadying = 0;
AllAdded = false;
AllReady = false;
foreach (var manager in _managers) foreach (var manager in _managers)
{ {
try try
@ -68,19 +81,27 @@ namespace QSB.WorldSync
} }
} }
QSBCore.UnityEvents.FireInNUpdates(DoPostInit, 1); QSBCore.UnityEvents.RunWhen(() => _numManagersReadying == 0, () =>
}
private static void DoPostInit()
{
AllReady = true;
var allWorldObjects = QSBWorldSync.GetWorldObjects<IWorldObject>();
foreach (var worldObject in allWorldObjects)
{ {
worldObject.PostInit(); AllAdded = true;
} DebugLog.DebugWrite("World Objects added.", MessageType.Success);
QSBCore.UnityEvents.RunWhen(() => _numObjectsReadying == 0, () =>
{
AllReady = true;
DebugLog.DebugWrite("World Objects ready.", MessageType.Success);
});
});
} }
protected abstract void RebuildWorldObjects(OWScene scene); protected abstract void RebuildWorldObjects(OWScene scene);
private static uint _numManagersReadying;
internal static uint _numObjectsReadying;
/// indicates that this won't become ready immediately
protected void StartDelayedReady() => _numManagersReadying++;
/// indicates that this is now ready
protected void FinishDelayedReady() => _numManagersReadying--;
} }
} }