diff --git a/QSB/QuantumSync/Patches/QuantumPatches.cs b/QSB/QuantumSync/Patches/QuantumPatches.cs index ce0aaca5..aef42d5e 100644 --- a/QSB/QuantumSync/Patches/QuantumPatches.cs +++ b/QSB/QuantumSync/Patches/QuantumPatches.cs @@ -246,12 +246,12 @@ namespace QSB.QuantumSync.Patches if (____sector == null) { - __instance.GetType().GetMethod("CheckEnabled", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null); + __instance.CheckEnabled(); } if (____collapseOnStart) { - __instance.GetType().GetMethod("Collapse", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { true }); + __instance.Collapse(true); } return false; @@ -292,7 +292,13 @@ namespace QSB.QuantumSync.Patches var allMultiStates = QSBWorldSync.GetWorldObjects(); var stateObject = QSBWorldSync.GetWorldFromUnity(__instance); - var owner = allMultiStates.First(x => x.QuantumStates.Contains(stateObject)); + var owner = allMultiStates.FirstOrDefault(x => x.QuantumStates.Contains(stateObject)); + if (owner == default) + { + DebugLog.DebugWrite($"Error - Could not find QSBMultiStateQuantumObject for state {__instance.name}", MessageType.Error); + return; + } + if (owner.ControllingPlayer != QSBPlayerManager.LocalPlayerId) { return; diff --git a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs index ce6ec74c..021fa8ea 100644 --- a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs @@ -11,7 +11,7 @@ namespace QSB.QuantumSync.WorldObjects { public List QuantumStates { get; private set; } public Text DebugBoxText; - public int CurrentState => AttachedObject.GetValue("_stateIndex"); + public int CurrentState => AttachedObject._stateIndex; public override void OnRemoval() { @@ -26,15 +26,25 @@ namespace QSB.QuantumSync.WorldObjects { ObjectId = id; AttachedObject = attachedObject; - QuantumStates = AttachedObject.GetValue("_states").ToList().Select(x => QSBWorldSync.GetWorldFromUnity(x)).ToList(); + if (QSBCore.DebugMode) { - DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, CurrentState.ToString()).GetComponent(); + DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, $"Multistate\r\nid:{id}\r\nstate:{CurrentState}").GetComponent(); } base.Init(attachedObject, id); } + public override void PostInit() + { + QuantumStates = AttachedObject._states.ToList().Select(x => QSBWorldSync.GetWorldFromUnity(x)).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) { if (CurrentState != -1) @@ -43,10 +53,10 @@ namespace QSB.QuantumSync.WorldObjects } QuantumStates[newStateIndex].SetVisible(true); - AttachedObject.SetValue("_stateIndex", newStateIndex); + AttachedObject._stateIndex = newStateIndex; if (QSBCore.DebugMode) { - DebugBoxText.text = newStateIndex.ToString(); + DebugBoxText.text = $"Multistate\r\nid:{ObjectId}\r\nstate:{CurrentState}"; } } } diff --git a/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs index 57d18d4c..fe381047 100644 --- a/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs @@ -20,7 +20,7 @@ namespace QSB.QuantumSync.WorldObjects base.Init(quantumObject, id); if (QSBCore.DebugMode) { - DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, ObjectId.ToString()).GetComponent(); + DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, $"Socketed\r\nid:{ObjectId}").GetComponent(); } } diff --git a/QSB/WorldSync/IWorldObject.cs b/QSB/WorldSync/IWorldObject.cs index ba993075..37ce7d53 100644 --- a/QSB/WorldSync/IWorldObject.cs +++ b/QSB/WorldSync/IWorldObject.cs @@ -7,6 +7,7 @@ namespace QSB.WorldSync int ObjectId { get; } string Name { get; } + void PostInit(); void OnRemoval(); MonoBehaviour ReturnObject(); } diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index e26580be..a61f9fa5 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -45,23 +45,31 @@ namespace QSB.WorldSync if (unityObject == null) { - DebugLog.ToConsole($"Error - Trying to run GetWorldFromUnity with a null unity object! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{typeof(TUnityObject).Name}.", MessageType.Error); + DebugLog.ToConsole($"Error - Trying to run GetWorldFromUnity with a null unity object! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{typeof(TUnityObject).Name}", MessageType.Error); return default; } if (!QSBCore.IsInMultiplayer) { - DebugLog.ToConsole($"Warning - Trying to run GetWorldFromUnity while not in multiplayer!"); + DebugLog.ToConsole($"Warning - Trying to run GetWorldFromUnity while not in multiplayer! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{typeof(TUnityObject).Name}", MessageType.Warning); return default; } if (!WorldObjectsToUnityObjects.ContainsKey(unityObject)) { - DebugLog.ToConsole($"Error - WorldObjectsToUnityObjects does not contain \"{unityObject.name}\"! Called from {new StackTrace().GetFrame(1).GetMethod().Name}", MessageType.Error); + DebugLog.ToConsole($"Error - WorldObjectsToUnityObjects does not contain \"{unityObject.name}\"! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{typeof(TUnityObject).Name}", MessageType.Error); return default; } - return WorldObjectsToUnityObjects[unityObject] as TWorldObject; + var returnObject = WorldObjectsToUnityObjects[unityObject] as TWorldObject; + + if (returnObject == default || returnObject == null) + { + DebugLog.ToConsole($"Error - World object for unity object {unityObject.name} is null! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{typeof(TUnityObject).Name}", MessageType.Error); + return default; + } + + return returnObject; } public static int GetIdFromUnity(TUnityObject unityObject) @@ -121,6 +129,12 @@ namespace QSB.WorldSync { var worldObject = (TWorldObject)Activator.CreateInstance(typeof(TWorldObject)); WorldObjects.Add(worldObject); + if (worldObject == null) + { + // if this happens, god help you + DebugLog.ToConsole($"Error - CreateWorldObject is returning a null value! This is very bad!", MessageType.Error); + } + return worldObject; } diff --git a/QSB/WorldSync/WorldObject.cs b/QSB/WorldSync/WorldObject.cs index caaf7173..8c765d12 100644 --- a/QSB/WorldSync/WorldObject.cs +++ b/QSB/WorldSync/WorldObject.cs @@ -10,6 +10,7 @@ namespace QSB.WorldSync public string Name => AttachedObject == null ? "" : AttachedObject.name; public abstract void Init(T attachedObject, int id); + public virtual void PostInit() { } public virtual void OnRemoval() { } public MonoBehaviour ReturnObject() => AttachedObject; } diff --git a/QSB/WorldSync/WorldObjectManager.cs b/QSB/WorldSync/WorldObjectManager.cs index 7d2ac4a4..f5fbfb36 100644 --- a/QSB/WorldSync/WorldObjectManager.cs +++ b/QSB/WorldSync/WorldObjectManager.cs @@ -67,9 +67,19 @@ namespace QSB.WorldSync } } - QSBCore.UnityEvents.FireInNUpdates(() => AllReady = true, 1); + QSBCore.UnityEvents.FireInNUpdates(DoPostInit, 1); } + private static void DoPostInit() + { + AllReady = true; + var allWorldObjects = QSBWorldSync.GetWorldObjects(); + foreach (var worldObject in allWorldObjects) + { + worldObject.PostInit(); + } + } + protected abstract void RebuildWorldObjects(OWScene scene); } }