added post-init event for world objects, fixes quantum state issue

This commit is contained in:
Mister_Nebula 2021-10-16 23:35:45 +01:00
parent 7c4372dca7
commit 50efe668d3
7 changed files with 56 additions and 14 deletions

View File

@ -246,12 +246,12 @@ namespace QSB.QuantumSync.Patches
if (____sector == null) if (____sector == null)
{ {
__instance.GetType().GetMethod("CheckEnabled", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null); __instance.CheckEnabled();
} }
if (____collapseOnStart) if (____collapseOnStart)
{ {
__instance.GetType().GetMethod("Collapse", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { true }); __instance.Collapse(true);
} }
return false; return false;
@ -292,7 +292,13 @@ namespace QSB.QuantumSync.Patches
var allMultiStates = QSBWorldSync.GetWorldObjects<QSBMultiStateQuantumObject>(); var allMultiStates = QSBWorldSync.GetWorldObjects<QSBMultiStateQuantumObject>();
var stateObject = QSBWorldSync.GetWorldFromUnity<QSBQuantumState, QuantumState>(__instance); var stateObject = QSBWorldSync.GetWorldFromUnity<QSBQuantumState, QuantumState>(__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) if (owner.ControllingPlayer != QSBPlayerManager.LocalPlayerId)
{ {
return; return;

View File

@ -11,7 +11,7 @@ namespace QSB.QuantumSync.WorldObjects
{ {
public List<QSBQuantumState> QuantumStates { get; private set; } public List<QSBQuantumState> QuantumStates { get; private set; }
public Text DebugBoxText; public Text DebugBoxText;
public int CurrentState => AttachedObject.GetValue<int>("_stateIndex"); public int CurrentState => AttachedObject._stateIndex;
public override void OnRemoval() public override void OnRemoval()
{ {
@ -26,15 +26,25 @@ namespace QSB.QuantumSync.WorldObjects
{ {
ObjectId = id; ObjectId = id;
AttachedObject = attachedObject; AttachedObject = attachedObject;
QuantumStates = AttachedObject.GetValue<QuantumState[]>("_states").ToList().Select(x => QSBWorldSync.GetWorldFromUnity<QSBQuantumState, QuantumState>(x)).ToList();
if (QSBCore.DebugMode) if (QSBCore.DebugMode)
{ {
DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, CurrentState.ToString()).GetComponent<Text>(); DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, $"Multistate\r\nid:{id}\r\nstate:{CurrentState}").GetComponent<Text>();
} }
base.Init(attachedObject, id); base.Init(attachedObject, id);
} }
public override void PostInit()
{
QuantumStates = AttachedObject._states.ToList().Select(x => QSBWorldSync.GetWorldFromUnity<QSBQuantumState, QuantumState>(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) public void ChangeState(int newStateIndex)
{ {
if (CurrentState != -1) if (CurrentState != -1)
@ -43,10 +53,10 @@ namespace QSB.QuantumSync.WorldObjects
} }
QuantumStates[newStateIndex].SetVisible(true); QuantumStates[newStateIndex].SetVisible(true);
AttachedObject.SetValue("_stateIndex", newStateIndex); AttachedObject._stateIndex = newStateIndex;
if (QSBCore.DebugMode) if (QSBCore.DebugMode)
{ {
DebugBoxText.text = newStateIndex.ToString(); DebugBoxText.text = $"Multistate\r\nid:{ObjectId}\r\nstate:{CurrentState}";
} }
} }
} }

View File

@ -20,7 +20,7 @@ namespace QSB.QuantumSync.WorldObjects
base.Init(quantumObject, id); base.Init(quantumObject, id);
if (QSBCore.DebugMode) if (QSBCore.DebugMode)
{ {
DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, ObjectId.ToString()).GetComponent<Text>(); DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, $"Socketed\r\nid:{ObjectId}").GetComponent<Text>();
} }
} }

View File

@ -7,6 +7,7 @@ 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

@ -45,23 +45,31 @@ namespace QSB.WorldSync
if (unityObject == null) 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; return default;
} }
if (!QSBCore.IsInMultiplayer) 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; return default;
} }
if (!WorldObjectsToUnityObjects.ContainsKey(unityObject)) 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 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<TWorldObject, TUnityObject>(TUnityObject unityObject) public static int GetIdFromUnity<TWorldObject, TUnityObject>(TUnityObject unityObject)
@ -121,6 +129,12 @@ namespace QSB.WorldSync
{ {
var worldObject = (TWorldObject)Activator.CreateInstance(typeof(TWorldObject)); var worldObject = (TWorldObject)Activator.CreateInstance(typeof(TWorldObject));
WorldObjects.Add(worldObject); 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; return worldObject;
} }

View File

@ -10,6 +10,7 @@ namespace QSB.WorldSync
public string Name => AttachedObject == null ? "<NullObject!>" : AttachedObject.name; public string Name => AttachedObject == null ? "<NullObject!>" : AttachedObject.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;
} }

View File

@ -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<IWorldObject>();
foreach (var worldObject in allWorldObjects)
{
worldObject.PostInit();
}
}
protected abstract void RebuildWorldObjects(OWScene scene); protected abstract void RebuildWorldObjects(OWScene scene);
} }
} }