Merge branch 'dev' into steamworks

This commit is contained in:
Mister_Nebula 2022-01-18 10:36:20 +00:00
commit df7bfef8b3
85 changed files with 252 additions and 307 deletions

View File

@ -68,6 +68,7 @@ namespace Mirror.Weaver
return false;
}
/*
if (netBehaviourSubclass.HasGenericParameters)
{
Log.Error($"{netBehaviourSubclass.Name} cannot have generic parameters", netBehaviourSubclass);
@ -76,6 +77,7 @@ namespace Mirror.Weaver
// maybe return false here in the future.
return true;
}
*/
MarkAsProcessed(netBehaviourSubclass);
// deconstruct tuple and set fields

View File

@ -10,7 +10,7 @@ namespace QSB.Anglerfish
public static readonly List<AnglerfishController> Anglers = new();
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
Anglers.Clear();
Anglers.AddRange(QSBWorldSync.GetUnityObjects<AnglerfishController>());

View File

@ -49,7 +49,7 @@ namespace QSB.Anglerfish.Patches
[HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.UpdateState))]
public static bool UpdateState(AnglerfishController __instance)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}
@ -155,7 +155,7 @@ namespace QSB.Anglerfish.Patches
[HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.UpdateMovement))]
public static bool UpdateMovement(AnglerfishController __instance)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}

View File

@ -9,7 +9,7 @@ namespace QSB.Anglerfish.TransformSync
{
public class AnglerTransformSync : UnsectoredRigidbodySync
{
protected override bool IsReady => WorldObjectManager.AllObjectsAdded;
protected override bool IsReady => QSBWorldSync.AllObjectsAdded;
protected override bool UseInterpolation => false;
protected override bool OnlyApplyOnDeserialize => true;

View File

@ -8,7 +8,7 @@ namespace QSB.Animation.NPC
// im assuming this is used in the eye as well
public override WorldObjectType WorldObjectType => WorldObjectType.Both;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
QSBWorldSync.Init<QSBCharacterAnimController, CharacterAnimController>();
QSBWorldSync.Init<QSBTravelerController, TravelerController>();

View File

@ -24,7 +24,7 @@ namespace QSB.Animation.NPC.Patches
public static bool AnimatorIKReplacement(
CharacterAnimController __instance)
{
if (!WorldObjectManager.AllObjectsReady || ConversationManager.Instance == null)
if (!QSBWorldSync.AllObjectsReady || ConversationManager.Instance == null)
{
return true;
}
@ -151,7 +151,7 @@ namespace QSB.Animation.NPC.Patches
[HarmonyPatch(typeof(KidRockController), nameof(KidRockController.Update))]
public static bool UpdateReplacement(KidRockController __instance)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}

View File

@ -30,7 +30,7 @@ namespace QSB.Animation.Player.Messages
Name = reader.ReadString();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -27,7 +27,7 @@ namespace QSB.Animation.Player.Messages
PlayerId = reader.Read<uint>();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -86,7 +86,7 @@ namespace QSB.Animation.Player.Thrusters
private void OnRenderObject()
{
if (!QSBCore.ShowLinesInDebug || !WorldObjectManager.AllObjectsReady)
if (!QSBCore.ShowLinesInDebug || !QSBWorldSync.AllObjectsReady)
{
return;
}

View File

@ -30,7 +30,7 @@ namespace QSB.AuthoritySync
NetId = reader.ReadUInt();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveLocal() => OnReceiveRemote();
public override void OnReceiveRemote() => NetworkServer.spawned[NetId].UpdateAuthQueue(From, Value);
}

View File

@ -7,7 +7,7 @@ namespace QSB.CampfireSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.Both;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
=> QSBWorldSync.Init<QSBCampfire, Campfire>();
}
}

View File

@ -37,7 +37,7 @@ namespace QSB.ConversationSync
_boxPrefab.GetComponent<Text>().color = Color.white;
}
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
=> QSBWorldSync.Init<QSBRemoteDialogueTrigger, RemoteDialogueTrigger>();
public uint GetPlayerTalkingToTree(CharacterDialogueTree tree)

View File

@ -33,7 +33,7 @@ namespace QSB.ConversationSync.Messages
Message = reader.ReadString();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -35,7 +35,7 @@ namespace QSB.ConversationSync.Messages
Value = reader.Read<bool>();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -8,6 +8,6 @@ namespace QSB.EchoesOfTheEye.AirlockSync
// is this used in the prisoner sequence in the eye?
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
protected override void RebuildWorldObjects(OWScene scene) => QSBWorldSync.Init<QSBGhostAirlock, GhostAirlock>();
public override void BuildWorldObjects(OWScene scene) => QSBWorldSync.Init<QSBGhostAirlock, GhostAirlock>();
}
}

View File

@ -8,6 +8,6 @@ namespace QSB.EchoesOfTheEye.LightSensorSync
// see AirlockManager question
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
protected override void RebuildWorldObjects(OWScene scene) => QSBWorldSync.Init<QSBSingleLightSensor, SingleLightSensor>();
public override void BuildWorldObjects(OWScene scene) => QSBWorldSync.Init<QSBSingleLightSensor, SingleLightSensor>();
}
}

View File

@ -7,7 +7,7 @@ namespace QSB.ElevatorSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
=> QSBWorldSync.Init<QSBElevator, Elevator>();
}
}

View File

@ -19,7 +19,7 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages
private EyeStateMessage(EyeState state) => Value = state;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveLocal()
{

View File

@ -50,7 +50,7 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages
_onDuration = reader.Read<float>();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -8,7 +8,7 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages
internal class EyeCloneSeenMessage : QSBMessage
{
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -34,7 +34,7 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages
}
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -6,7 +6,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap.Messages
{
internal class ZoomOutMessage : QSBMessage
{
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -7,7 +7,7 @@ namespace QSB.EyeOfTheUniverse.InstrumentSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.Eye;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
=> QSBWorldSync.Init<QSBQuantumInstrument, QuantumInstrument>();
}
}

View File

@ -7,7 +7,7 @@ namespace QSB.GeyserSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
=> QSBWorldSync.Init<QSBGeyser, GeyserController>();
}
}

View File

@ -10,9 +10,9 @@ namespace QSB.ItemSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.Both;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
DebugLog.DebugWrite("Rebuilding OWItems...", MessageType.Info);
DebugLog.DebugWrite("Building OWItems...", MessageType.Info);
// Items
QSBWorldSync.Init<QSBScrollItem, ScrollItem>();

View File

@ -34,7 +34,7 @@ namespace QSB.ItemSync.Messages
ItemId = reader.Read<int>();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -26,7 +26,7 @@ namespace QSB.ItemSync.WorldObjects.Items
}
StartDelayedReady();
QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsAdded, () =>
QSBCore.UnityEvents.RunWhen(() => QSBWorldSync.AllObjectsAdded, () =>
{
FinishDelayedReady();

View File

@ -10,7 +10,7 @@ namespace QSB.JellyfishSync
public static readonly List<JellyfishController> Jellyfish = new();
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
Jellyfish.Clear();
Jellyfish.AddRange(QSBWorldSync.GetUnityObjects<JellyfishController>());

View File

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

View File

@ -11,7 +11,7 @@ namespace QSB.JellyfishSync.TransformSync
{
public class JellyfishTransformSync : UnsectoredRigidbodySync
{
protected override bool IsReady => WorldObjectManager.AllObjectsAdded;
protected override bool IsReady => QSBWorldSync.AllObjectsAdded;
protected override bool UseInterpolation => false;
protected override bool OnlyApplyOnDeserialize => true;

View File

@ -33,7 +33,7 @@ namespace QSB.LogSync.Messages
ShowNotification = reader.Read<bool>();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveLocal()
{
@ -50,7 +50,7 @@ namespace QSB.LogSync.Messages
QSBWorldSync.AddFactReveal(FactId, SaveGame);
}
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return;
}

View File

@ -31,7 +31,7 @@ namespace QSB.Messaging
{
get
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return false;
}

View File

@ -10,7 +10,7 @@ namespace QSB.MeteorSync
public static WhiteHoleVolume WhiteHoleVolume;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
// wait for all late initializers (which includes meteor launchers) to finish
StartDelayedReady();

View File

@ -21,7 +21,7 @@ namespace QSB.MeteorSync.Patches
[HarmonyPatch(typeof(MeteorLauncher), nameof(MeteorLauncher.FixedUpdate))]
public static bool FixedUpdate(MeteorLauncher __instance)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}
@ -319,7 +319,7 @@ namespace QSB.MeteorSync.Patches
return true;
}
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}

View File

@ -10,7 +10,7 @@ namespace QSB.OrbSync
public static readonly List<NomaiInterfaceOrb> Orbs = new();
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
Orbs.Clear();
Orbs.AddRange(QSBWorldSync.GetUnityObjects<NomaiInterfaceOrb>());

View File

@ -17,7 +17,7 @@ namespace QSB.OrbSync.Patches
[HarmonyPatch(nameof(NomaiInterfaceOrb.StartDragFromPosition))]
public static void StartDragFromPosition(NomaiInterfaceOrb __instance)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return;
}
@ -35,7 +35,7 @@ namespace QSB.OrbSync.Patches
[HarmonyPatch(nameof(NomaiInterfaceOrb.CancelDrag))]
public static bool CancelDrag(NomaiInterfaceOrb __instance)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}
@ -59,7 +59,7 @@ namespace QSB.OrbSync.Patches
[HarmonyPatch(nameof(NomaiInterfaceOrb.CheckSlotCollision))]
public static bool CheckSlotCollision(NomaiInterfaceOrb __instance)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}

View File

@ -11,7 +11,7 @@ namespace QSB.OrbSync.TransformSync
{
public class NomaiOrbTransformSync : UnsectoredTransformSync
{
protected override bool IsReady => WorldObjectManager.AllObjectsAdded;
protected override bool IsReady => QSBWorldSync.AllObjectsAdded;
protected override bool UseInterpolation => true;
protected override float DistanceLeeway => 1f;

View File

@ -47,7 +47,7 @@ namespace QSB.Player.Messages
ObjectId = reader.Read<int>();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveLocal() => OnReceiveRemote();

View File

@ -5,7 +5,7 @@ namespace QSB.Player.Messages
{
internal class LaunchCodesMessage : QSBMessage
{
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -12,7 +12,7 @@ namespace QSB.Player.Messages
public PlayerEntangledMessage(int objectId) => ObjectId = objectId;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveLocal()
{

View File

@ -94,12 +94,6 @@ namespace QSB.Player.Messages
var player = QSBPlayerManager.GetPlayer(QSBPlayerManager.LocalPlayerId);
player.Name = PlayerName;
DebugLog.ToAll($"Connected to server as {player.Name}.", MessageType.Info);
if (QSBSceneManager.IsInUniverse)
{
player.IsReady = true;
new PlayerReadyMessage(true).Send();
}
}
}
}

View File

@ -68,7 +68,7 @@ namespace QSB.Player.Messages
new ServerStateMessage(ServerStateManager.Instance.GetServerState()) { To = From }.Send();
new PlayerInformationMessage { To = From }.Send();
if (WorldObjectManager.AllObjectsReady)
if (QSBWorldSync.AllObjectsReady)
{
SendWorldObjectInfo();
}
@ -79,7 +79,7 @@ namespace QSB.Player.Messages
new PlayerInformationMessage { To = From }.Send();
}
if (WorldObjectManager.AllObjectsReady)
if (QSBWorldSync.AllObjectsReady)
{
SendAuthorityObjectInfo();
}

View File

@ -20,11 +20,6 @@ namespace QSB.Player.Patches
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(PauseMenuManager), nameof(PauseMenuManager.OnExitToMainMenu))]
public static void PauseMenuManager_OnExitToMainMenu()
=> QSBPlayerManager.LocalPlayer.IsReady = false;
[HarmonyPrefix]
[HarmonyPatch(typeof(PlayerData), nameof(PlayerData.LearnLaunchCodes))]
public static bool LearnLaunchCodes()

View File

@ -17,7 +17,7 @@ namespace QSB.Player
return;
}
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return;
}

View File

@ -27,7 +27,7 @@ namespace QSB.Player
return localInstance.Player;
}
}
public static uint LocalPlayerId => LocalPlayer.PlayerId;
public static uint LocalPlayerId => LocalPlayer?.PlayerId ?? uint.MaxValue;
/// <summary>
/// called right after player is added

View File

@ -6,7 +6,7 @@ namespace QSB.PoolSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
foreach (var streaming in QSBWorldSync.GetUnityObjects<NomaiRemoteCameraStreaming>())
{
@ -23,5 +23,23 @@ namespace QSB.PoolSync
platform.gameObject.AddComponent<CustomNomaiRemoteCameraPlatform>();
}
}
public override void UnbuildWorldObjects()
{
foreach (var platform in QSBWorldSync.GetUnityObjects<CustomNomaiRemoteCameraPlatform>())
{
Destroy(platform);
}
foreach (var camera in QSBWorldSync.GetUnityObjects<CustomNomaiRemoteCamera>())
{
Destroy(camera);
}
foreach (var streaming in QSBWorldSync.GetUnityObjects<CustomNomaiRemoteCameraStreaming>())
{
Destroy(streaming);
}
}
}
}

View File

@ -111,12 +111,9 @@ namespace QSB
gameObject.AddComponent<MaskManager>();
// WorldObject managers
foreach (var type in typeof(WorldObjectManager).GetDerivedTypes())
{
gameObject.AddComponent(type);
}
Helper.HarmonyHelper.EmptyMethod<ModCommandListener>("Update");
QSBWorldSync.Managers = typeof(WorldObjectManager).GetDerivedTypes()
.Select(x => (WorldObjectManager)gameObject.AddComponent(x))
.ToArray();
QSBPatchManager.OnPatchType += OnPatchType;
QSBPatchManager.OnUnpatchType += OnUnpatchType;

View File

@ -33,11 +33,9 @@ namespace QSB
{
public new static QSBNetworkManager singleton => (QSBNetworkManager)NetworkManager.singleton;
public event Action OnNetworkManagerReady;
public event Action OnClientConnected;
public event Action<string> OnClientDisconnected;
public bool IsReady { get; private set; }
public GameObject OrbPrefab { get; private set; }
public GameObject ShipPrefab { get; private set; }
public GameObject AnglerPrefab { get; private set; }
@ -199,17 +197,13 @@ namespace QSB
if (QSBSceneManager.IsInUniverse)
{
WorldObjectManager.Rebuild(QSBSceneManager.CurrentScene);
QSBWorldSync.Init();
QSBWorldSync.BuildWorldObjects(QSBSceneManager.CurrentScene);
}
var specificType = QSBCore.IsHost ? QSBPatchTypes.OnServerClientConnect : QSBPatchTypes.OnNonServerClientConnect;
QSBPatchManager.DoPatchType(specificType);
QSBPatchManager.DoPatchType(QSBPatchTypes.OnClientConnect);
OnNetworkManagerReady?.SafeInvoke();
IsReady = true;
QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance,
() => new PlayerJoinMessage(PlayerName).Send());
@ -231,8 +225,7 @@ namespace QSB
Destroy(GetComponent<ClientStateManager>());
QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove());
RemoveWorldObjects();
QSBWorldSync.Reset();
QSBWorldSync.RemoveWorldObjects();
if (WakeUpSync.LocalInstance != null)
{
@ -246,7 +239,6 @@ namespace QSB
QSBPatchManager.DoUnpatchType(QSBPatchTypes.OnClientConnect);
}
IsReady = false;
_everConnected = false;
}
@ -311,26 +303,5 @@ namespace QSB
base.OnStopServer();
}
private static void RemoveWorldObjects()
{
QSBWorldSync.RemoveWorldObjects();
foreach (var platform in QSBWorldSync.GetUnityObjects<CustomNomaiRemoteCameraPlatform>())
{
Destroy(platform);
}
foreach (var camera in QSBWorldSync.GetUnityObjects<CustomNomaiRemoteCamera>())
{
Destroy(camera);
}
foreach (var streaming in QSBWorldSync.GetUnityObjects<CustomNomaiRemoteCameraStreaming>())
{
Destroy(streaming);
}
WorldObjectManager.SetNotReady();
}
}
}

View File

@ -23,15 +23,12 @@ namespace QSB
private static void OnCompleteSceneLoad(OWScene oldScene, OWScene newScene)
{
DebugLog.DebugWrite($"COMPLETE SCENE LOAD ({oldScene} -> {newScene})", MessageType.Info);
QSBWorldSync.RemoveWorldObjects();
var universe = InUniverse(newScene);
if (QSBCore.IsInMultiplayer && universe)
{
// So objects have time to be deleted, made, whatever
QSBCore.UnityEvents.FireOnNextUpdate(() =>
{
WorldObjectManager.Rebuild(newScene);
QSBWorldSync.Init();
});
QSBCore.UnityEvents.FireOnNextUpdate(() => QSBWorldSync.BuildWorldObjects(newScene));
}
OnSceneLoaded?.SafeInvoke(oldScene, newScene, universe);

View File

@ -35,7 +35,7 @@ namespace QSB.QuantumSync.Messages
OrbitAngle = reader.Read<int>();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -31,7 +31,7 @@ namespace QSB.QuantumSync.Patches
[HarmonyPatch(typeof(QuantumObject), nameof(QuantumObject.SetIsQuantum))]
public static void QuantumObject_SetIsQuantum(QuantumObject __instance)
{
if (WorldObjectManager.AllObjectsReady)
if (QSBWorldSync.AllObjectsReady)
{
__instance.GetWorldObject<IQSBQuantumObject>().SendMessage(new SetIsQuantumMessage(__instance.IsQuantum()));
}
@ -44,7 +44,7 @@ namespace QSB.QuantumSync.Patches
ref bool __result,
bool skipInstantVisibilityCheck)
{
if (WorldObjectManager.AllObjectsReady)
if (QSBWorldSync.AllObjectsReady)
{
var socketedWorldObject = __instance.GetWorldObject<QSBSocketedQuantumObject>();
if (socketedWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId)
@ -149,7 +149,7 @@ namespace QSB.QuantumSync.Patches
[HarmonyPatch(typeof(SocketedQuantumObject), nameof(SocketedQuantumObject.MoveToSocket))]
public static void SocketedQuantumObject_MoveToSocket(SocketedQuantumObject __instance, QuantumSocket socket)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return;
}
@ -186,7 +186,7 @@ namespace QSB.QuantumSync.Patches
ref bool __result)
{
QSBQuantumShuffleObject shuffleWorldObject = default;
if (WorldObjectManager.AllObjectsReady)
if (QSBWorldSync.AllObjectsReady)
{
shuffleWorldObject = __instance.GetWorldObject<QSBQuantumShuffleObject>();
if (shuffleWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId)
@ -210,7 +210,7 @@ namespace QSB.QuantumSync.Patches
__instance._shuffledObjects[j].localPosition = __instance._localPositions[__instance._indexList[j]];
}
if (WorldObjectManager.AllObjectsReady)
if (QSBWorldSync.AllObjectsReady)
{
shuffleWorldObject.SendMessage(new QuantumShuffleMessage(__instance._indexList.ToArray()));
__result = true;
@ -223,7 +223,7 @@ namespace QSB.QuantumSync.Patches
[HarmonyPatch(typeof(MultiStateQuantumObject), nameof(MultiStateQuantumObject.Start))]
public static bool MultiStateQuantumObject_Start(MultiStateQuantumObject __instance)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}
@ -259,7 +259,7 @@ namespace QSB.QuantumSync.Patches
[HarmonyPatch(typeof(MultiStateQuantumObject), nameof(MultiStateQuantumObject.ChangeQuantumState))]
public static bool MultiStateQuantumObject_ChangeQuantumState(MultiStateQuantumObject __instance)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}
@ -278,7 +278,7 @@ namespace QSB.QuantumSync.Patches
[HarmonyPatch(typeof(QuantumState), nameof(QuantumState.SetVisible))]
public static void QuantumState_SetVisible(QuantumState __instance, bool visible)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return;
}
@ -434,7 +434,7 @@ namespace QSB.QuantumSync.Patches
[HarmonyPatch(typeof(QuantumSkeletonTower), nameof(QuantumSkeletonTower.ChangeQuantumState))]
public static bool QuantumSkeletonTower_ChangeQuantumState(QuantumSkeletonTower __instance, ref bool __result)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}

View File

@ -19,7 +19,7 @@ namespace QSB.QuantumSync.Patches
[HarmonyPatch(typeof(EyeProxyQuantumMoon), nameof(EyeProxyQuantumMoon.ChangeQuantumState))]
public static bool EyeProxyQuantumMoon_ChangeQuantumState(EyeProxyQuantumMoon __instance, ref bool __result, bool skipInstantVisibilityCheck)
{
if (!WorldObjectManager.AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}

View File

@ -18,21 +18,11 @@ namespace QSB.QuantumSync
public static QuantumShrine Shrine { get; private set; }
public override void Awake()
{
base.Awake();
QSBPlayerManager.OnRemovePlayer += PlayerLeave;
}
public void Awake() => QSBPlayerManager.OnRemovePlayer += PlayerLeave;
public override void OnDestroy()
public override void BuildWorldObjects(OWScene scene)
{
base.OnDestroy();
QSBPlayerManager.OnRemovePlayer -= PlayerLeave;
}
protected override void RebuildWorldObjects(OWScene scene)
{
DebugLog.DebugWrite("Rebuilding quantum objects...", MessageType.Info);
DebugLog.DebugWrite("Building quantum objects...", MessageType.Info);
QSBWorldSync.Init<QSBQuantumState, QuantumState>();
QSBWorldSync.Init<QSBSocketedQuantumObject, SocketedQuantumObject>();
QSBWorldSync.Init<QSBMultiStateQuantumObject, MultiStateQuantumObject>();
@ -78,7 +68,7 @@ namespace QSB.QuantumSync
public static Tuple<bool, List<PlayerInfo>> IsVisibleUsingCameraFrustum(ShapeVisibilityTracker tracker, bool ignoreLocalCamera)
{
if (!AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return new Tuple<bool, List<PlayerInfo>>(false, new List<PlayerInfo>());
}
@ -123,7 +113,7 @@ namespace QSB.QuantumSync
public static IEnumerable<PlayerInfo> GetEntangledPlayers(QuantumObject obj)
{
if (!AllObjectsReady)
if (!QSBWorldSync.AllObjectsReady)
{
return Enumerable.Empty<PlayerInfo>();
}

View File

@ -16,7 +16,7 @@ namespace QSB.QuantumSync.WorldObjects
base.Init();
StartDelayedReady();
QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsAdded, () =>
QSBCore.UnityEvents.RunWhen(() => QSBWorldSync.AllObjectsAdded, () =>
{
FinishDelayedReady();

View File

@ -175,7 +175,7 @@ namespace QSB.QuantumSync.WorldObjects
}
IsEnabled = true;
if (!WorldObjectManager.AllObjectsReady && !QSBCore.IsHost)
if (!QSBWorldSync.AllObjectsReady && !QSBCore.IsHost)
{
return;
}
@ -205,7 +205,7 @@ namespace QSB.QuantumSync.WorldObjects
}
IsEnabled = false;
if (!WorldObjectManager.AllObjectsReady && !QSBCore.IsHost)
if (!QSBWorldSync.AllObjectsReady && !QSBCore.IsHost)
{
return;
}

View File

@ -48,7 +48,7 @@ namespace QSB.RoastingSync.Messages
ObjectId = reader.Read<int>();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -12,7 +12,7 @@ namespace QSB.RoastingSync.Messages
{
public MarshmallowEventMessage(MarshmallowMessageType type) => Value = type;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -36,7 +36,7 @@ namespace QSB.SectorSync
public void UpdateReferenceSectors()
{
if (!Instance.IsReady || !AllObjectsReady)
if (!Instance.IsReady || !QSBWorldSync.AllObjectsReady)
{
return;
}
@ -58,16 +58,15 @@ namespace QSB.SectorSync
}
}
public override void Awake()
public void Awake()
{
base.Awake();
Instance = this;
DebugLog.DebugWrite("Sector Manager ready.", MessageType.Success);
}
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
DebugLog.DebugWrite("Rebuilding sectors...", MessageType.Info);
DebugLog.DebugWrite("Building sectors...", MessageType.Info);
if (QSBSceneManager.CurrentScene == OWScene.SolarSystem)
{
var timeLoopRing = GameObject.Find("TimeLoopRing_Body");
@ -88,6 +87,9 @@ namespace QSB.SectorSync
IsReady = QSBWorldSync.GetWorldObjects<QSBSector>().Any();
}
public override void UnbuildWorldObjects() =>
IsReady = false;
private static void UpdateReferenceSector(BaseSectoredSync transformSync)
{
var closestSector = transformSync.SectorSync.GetClosestSector();

View File

@ -26,7 +26,7 @@ namespace QSB.ShipSync.Messages
public FlyShipMessage(bool flying) => Value = flying;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveLocal() => SetCurrentFlyer(From, Value);

View File

@ -5,7 +5,7 @@ namespace QSB.ShipSync.Messages
{
internal class FunnelEnableMessage : QSBMessage
{
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
=> ShipManager.Instance.ShipTractorBeam.ActivateTractorBeam();

View File

@ -7,7 +7,7 @@ namespace QSB.ShipSync.Messages
{
public HatchMessage(bool open) => Value = open;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -77,7 +77,7 @@ namespace QSB.ShipSync.Patches
*
*/
if (!WorldObjectManager.AllObjectsReady || __instance != ShipManager.Instance.HatchInteractZone)
if (!QSBWorldSync.AllObjectsReady || __instance != ShipManager.Instance.HatchInteractZone)
{
return true;
}

View File

@ -43,7 +43,7 @@ namespace QSB.ShipSync
public void Start()
=> Instance = this;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
var shipTransform = GameObject.Find("Ship_Body");
if (shipTransform == null)

View File

@ -35,7 +35,7 @@ namespace QSB.StatueSync.Messages
CameraDegrees = reader.Read<float>();
}
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveLocal()
{

View File

@ -1,6 +1,7 @@
using Mirror;
using OWML.Common;
using QSB.Player;
using QSB.Player.TransformSync;
using QSB.Utility;
using QSB.WorldSync;
using System;
@ -27,7 +28,8 @@ namespace QSB.Syncs
{
DebugLog.ToConsole("Error - trying to get SyncBase.Player before Start has been called! "
+ "this really should not be happening!\n"
+ $"{Environment.StackTrace}");
+ $"{Environment.StackTrace}",
MessageType.Error);
}
return _player;
@ -45,14 +47,14 @@ namespace QSB.Syncs
return false;
}
if (!WorldObjectManager.AllObjectsAdded)
if (!QSBWorldSync.AllObjectsAdded)
{
return false;
}
if (IsPlayerObject)
{
if (!Player.IsReady && !isLocalPlayer)
if (!Player.IsReady && this is not PlayerTransformSync)
{
return false;
}

View File

@ -6,7 +6,7 @@ namespace QSB.Tools.ProbeLauncherTool.Messages
{
internal class PlayerLaunchProbeMessage : QSBMessage
{
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -8,7 +8,7 @@ namespace QSB.Tools.ProbeLauncherTool.Messages
{
public PlayerRetrieveProbeMessage(bool playEffects) => Value = playEffects;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -7,7 +7,7 @@ namespace QSB.Tools.ProbeLauncherTool
{
public override WorldObjectType WorldObjectType => WorldObjectType.Both;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
=> QSBWorldSync.Init<QSBProbeLauncher, ProbeLauncher>(typeof(PlayerProbeLauncher));
}
}

View File

@ -8,7 +8,7 @@ namespace QSB.Tools.ProbeTool.Messages
{
public PlayerProbeEventMessage(ProbeEvent probeEvent) => Value = probeEvent;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -8,7 +8,7 @@ namespace QSB.Tools.ProbeTool.Messages
{
public ProbeStartRetrieveMessage(float duration) => Value = duration;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -7,7 +7,7 @@ namespace QSB.Tools.SignalscopeTool.FrequencySync.Messages
{
public IdentifyFrequencyMessage(SignalFrequency frequency) => Value = frequency;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -7,7 +7,7 @@ namespace QSB.Tools.SignalscopeTool.FrequencySync.Messages
{
public IdentifySignalMessage(SignalName name) => Value = name;
public override bool ShouldReceive => WorldObjectManager.AllObjectsReady;
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveRemote()
{

View File

@ -77,7 +77,7 @@ namespace QSB.Tools.TranslatorTool
private void OnRenderObject()
{
if (!QSBCore.ShowLinesInDebug || !WorldObjectManager.AllObjectsReady)
if (!QSBCore.ShowLinesInDebug || !QSBWorldSync.AllObjectsReady)
{
return;
}

View File

@ -7,7 +7,7 @@ namespace QSB.Tools.TranslatorTool.TranslationSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.Both;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
// wait for all late initializers (which includes nomai text) to finish
StartDelayedReady();

View File

@ -10,7 +10,7 @@ namespace QSB.TornadoSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
QSBWorldSync.Init<QSBTornado, TornadoController>();

View File

@ -13,7 +13,7 @@ namespace QSB.TornadoSync.TransformSync
{
public class OccasionalTransformSync : UnsectoredRigidbodySync
{
protected override bool IsReady => WorldObjectManager.AllObjectsReady
protected override bool IsReady => QSBWorldSync.AllObjectsReady
&& CenterOfTheUniverse.s_rigidbodies.IsInRange(_bodyIndex)
&& CenterOfTheUniverse.s_rigidbodies.IsInRange(_refBodyIndex);
protected override bool UseInterpolation => false;

View File

@ -7,7 +7,7 @@ namespace QSB.TriggerSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.Both;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
{
QSBWorldSync.Init<QSBCharacterTrigger, CharacterAnimController>(x => x.playerTrackingZone);
QSBWorldSync.Init<QSBSolanumTrigger, NomaiConversationManager>(x => x._watchPlayerVolume);

View File

@ -32,7 +32,7 @@ namespace QSB.TriggerSync.WorldObjects
QSBPlayerManager.OnRemovePlayer += OnPlayerLeave;
QSBCore.UnityEvents.RunWhen(() => WorldObjectManager.AllObjectsReady, () =>
QSBCore.UnityEvents.RunWhen(() => QSBWorldSync.AllObjectsReady, () =>
{
if (AttachedObject._trackedObjects != null && AttachedObject._trackedObjects.Any(x => x.CompareTag(CompareTag)))
{

View File

@ -62,7 +62,7 @@ namespace QSB.Utility
private void FixedUpdate()
{
if (!WorldObjectManager.AllObjectsReady || !_isReady)
if (!QSBWorldSync.AllObjectsReady || !_isReady)
{
return;
}

View File

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

View File

@ -1,4 +1,6 @@
using OWML.Common;
using Mirror;
using OWML.Common;
using QSB.Player.TransformSync;
using System.Diagnostics;
using System.Linq;
@ -7,7 +9,14 @@ namespace QSB.Utility
public static class DebugLog
{
public static void ToConsole(string message, MessageType type = MessageType.Message)
=> QSBCore.Helper.Console.WriteLine(message, type, GetCallingType(new StackTrace()));
{
if (NetworkClient.localPlayer != null)
{
message = $"[{NetworkClient.localPlayer.netId}] " + message;
}
QSBCore.Helper.Console.WriteLine(message, type, GetCallingType(new StackTrace()));
}
public static void ToHud(string message)
{

View File

@ -1,6 +1,7 @@
using OWML.Common;
using QSB.ConversationSync.Patches;
using QSB.LogSync;
using QSB.Player.TransformSync;
using QSB.TriggerSync.WorldObjects;
using QSB.Utility;
using System;
@ -12,17 +13,110 @@ namespace QSB.WorldSync
{
public static class QSBWorldSync
{
public static List<CharacterDialogueTree> OldDialogueTrees { get; private set; } = new();
public static WorldObjectManager[] Managers;
/// <summary>
/// Set when all WorldObjectManagers have called Init() on all their objects (AKA all the objects are created)
/// </summary>
public static bool AllObjectsAdded { get; private set; }
/// <summary>
/// Set when all WorldObjects have finished running Init()
/// </summary>
public static bool AllObjectsReady { get; private set; }
public static void BuildWorldObjects(OWScene scene)
{
GameInit();
if (PlayerTransformSync.LocalInstance == null)
{
DebugLog.ToConsole($"Warning - Tried to build WorldObjects when LocalPlayer is not ready! Building when ready...", MessageType.Warning);
QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance, () => BuildWorldObjects(scene));
return;
}
DoBuild(scene);
}
private static void DoBuild(OWScene scene)
{
foreach (var manager in Managers)
{
switch (manager.WorldObjectType)
{
case WorldObjectType.SolarSystem when QSBSceneManager.CurrentScene != OWScene.SolarSystem:
case WorldObjectType.Eye when QSBSceneManager.CurrentScene != OWScene.EyeOfTheUniverse:
DebugLog.DebugWrite($"skipping {manager.GetType().Name} as it is type {manager.WorldObjectType} and scene is {QSBSceneManager.CurrentScene}");
continue;
}
try
{
DebugLog.DebugWrite($"Building {manager.GetType().Name}", MessageType.Info);
manager.BuildWorldObjects(scene);
}
catch (Exception ex)
{
DebugLog.ToConsole($"Exception - Exception when trying to build WorldObjects of manager {manager.GetType().Name} : {ex.Message} Stacktrace :\r\n{ex.StackTrace}", MessageType.Error);
}
}
QSBCore.UnityEvents.RunWhen(() => _numManagersReadying == 0, () =>
{
AllObjectsAdded = true;
DebugLog.DebugWrite("World Objects added.", MessageType.Success);
QSBCore.UnityEvents.RunWhen(() => _numObjectsReadying == 0, () =>
{
AllObjectsReady = true;
DebugLog.DebugWrite("World Objects ready.", MessageType.Success);
});
});
}
internal static uint _numManagersReadying;
internal static uint _numObjectsReadying;
public static void RemoveWorldObjects()
{
GameReset();
AllObjectsAdded = false;
AllObjectsReady = false;
foreach (var item in WorldObjects)
{
try
{
item.OnRemoval();
}
catch (Exception e)
{
DebugLog.ToConsole($"Error - Exception in OnRemoval() for {item.GetType()}. Message : {e.Message}, Stack trace : {e.StackTrace}", MessageType.Error);
}
}
WorldObjects.Clear();
WorldObjectsToUnityObjects.Clear();
foreach (var manager in Managers)
{
manager.UnbuildWorldObjects();
}
}
// =======================================================================================================
public static List<CharacterDialogueTree> OldDialogueTrees { get; } = new();
public static Dictionary<string, bool> DialogueConditions { get; private set; } = new();
public static Dictionary<string, bool> PersistentConditions { get; private set; } = new();
public static List<FactReveal> ShipLogFacts { get; private set; } = new();
public static List<FactReveal> ShipLogFacts { get; } = new();
private static readonly List<IWorldObject> WorldObjects = new();
private static readonly Dictionary<MonoBehaviour, IWorldObject> WorldObjectsToUnityObjects = new();
public static void Init()
private static void GameInit()
{
DebugLog.DebugWrite($"Init QSBWorldSync", MessageType.Info);
DebugLog.DebugWrite($"GameInit QSBWorldSync", MessageType.Info);
OldDialogueTrees.Clear();
OldDialogueTrees.AddRange(GetUnityObjects<CharacterDialogueTree>());
@ -49,9 +143,9 @@ namespace QSB.WorldSync
}
}
public static void Reset()
private static void GameReset()
{
DebugLog.DebugWrite($"Reset QSBWorldSync", MessageType.Info);
DebugLog.DebugWrite($"GameReset QSBWorldSync", MessageType.Info);
OldDialogueTrees.Clear();
DialogueConditions.Clear();
@ -113,30 +207,6 @@ namespace QSB.WorldSync
return (TWorldObject)worldObject;
}
public static void RemoveWorldObjects()
{
if (WorldObjects.Count == 0)
{
DebugLog.ToConsole($"Warning - Trying to remove WorldObjects, but there are no WorldObjects!", MessageType.Warning);
return;
}
foreach (var item in WorldObjects)
{
try
{
item.OnRemoval();
}
catch (Exception e)
{
DebugLog.ToConsole($"Error - Exception in OnRemoval() for {item.GetType()}. Message : {e.Message}, Stack trace : {e.StackTrace}", MessageType.Error);
}
}
WorldObjects.Clear();
WorldObjectsToUnityObjects.Clear();
}
public static IEnumerable<TUnityObject> GetUnityObjects<TUnityObject>()
where TUnityObject : MonoBehaviour
=> Resources.FindObjectsOfTypeAll<TUnityObject>()

View File

@ -19,9 +19,9 @@ namespace QSB.WorldSync
public virtual void DisplayLines() { }
/// indicates that this won't become ready immediately
protected void StartDelayedReady() => WorldObjectManager._numObjectsReadying++;
protected void StartDelayedReady() => QSBWorldSync._numObjectsReadying++;
/// indicates that this is now ready
protected void FinishDelayedReady() => WorldObjectManager._numObjectsReadying--;
protected void FinishDelayedReady() => QSBWorldSync._numObjectsReadying--;
}
}

View File

@ -1,10 +1,4 @@
using OWML.Common;
using QSB.Player;
using QSB.Player.TransformSync;
using QSB.Utility;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine;
namespace QSB.WorldSync
{
@ -17,115 +11,19 @@ namespace QSB.WorldSync
public abstract class WorldObjectManager : MonoBehaviour
{
private static readonly List<WorldObjectManager> _managers = new();
/// <summary>
/// Set when all WorldObjectManagers have called Init() on all their objects (AKA all the objects are created)
/// </summary>
public static bool AllObjectsAdded { get; private set; }
/// <summary>
/// Set when all WorldObjects have finished running Init()
/// </summary>
public static bool AllObjectsReady { get; private set; }
/// <summary>
/// when the scene does not match the type, this manager will not build its world objects
/// </summary>
public abstract WorldObjectType WorldObjectType { get; }
public virtual void Awake()
{
QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
_managers.Add(this);
}
public abstract void BuildWorldObjects(OWScene scene);
public virtual void OnDestroy()
{
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
_managers.Remove(this);
}
public static void SetNotReady()
{
AllObjectsAdded = false;
AllObjectsReady = false;
}
private void OnSceneLoaded(OWScene oldScene, OWScene newScene, bool inUniverse)
{
AllObjectsAdded = false;
AllObjectsReady = false;
}
public static void Rebuild(OWScene scene)
{
if (!QSBNetworkManager.singleton.IsReady)
{
DebugLog.ToConsole($"Warning - Tried to rebuild WorldObjects when Network Manager not ready! Building when ready...", MessageType.Warning);
QSBCore.UnityEvents.RunWhen(() => QSBNetworkManager.singleton.IsReady, () => Rebuild(scene));
return;
}
if (PlayerTransformSync.LocalInstance == null)
{
DebugLog.ToConsole($"Warning - Tried to rebuild WorldObjects when LocalPlayer is not ready! Building when ready...", MessageType.Warning);
QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance, () => Rebuild(scene));
return;
}
DoRebuild(scene);
}
private static void DoRebuild(OWScene scene)
{
QSBWorldSync.RemoveWorldObjects();
_numManagersReadying = 0;
_numObjectsReadying = 0;
AllObjectsAdded = false;
AllObjectsReady = false;
foreach (var manager in _managers)
{
switch (manager.WorldObjectType)
{
case WorldObjectType.SolarSystem when QSBSceneManager.CurrentScene != OWScene.SolarSystem:
case WorldObjectType.Eye when QSBSceneManager.CurrentScene != OWScene.EyeOfTheUniverse:
DebugLog.DebugWrite($"skipping {manager.GetType().Name} as it is type {manager.WorldObjectType} and scene is {QSBSceneManager.CurrentScene}");
continue;
}
try
{
DebugLog.DebugWrite($"Rebuilding {manager.GetType().Name}", MessageType.Info);
manager.RebuildWorldObjects(scene);
}
catch (Exception ex)
{
DebugLog.ToConsole($"Exception - Exception when trying to rebuild WorldObjects of manager {manager.GetType().Name} : {ex.Message} Stacktrace :\r\n{ex.StackTrace}", MessageType.Error);
}
}
QSBCore.UnityEvents.RunWhen(() => _numManagersReadying == 0, () =>
{
AllObjectsAdded = true;
DebugLog.DebugWrite("World Objects added.", MessageType.Success);
QSBCore.UnityEvents.RunWhen(() => _numObjectsReadying == 0, () =>
{
AllObjectsReady = true;
DebugLog.DebugWrite("World Objects ready.", MessageType.Success);
});
});
}
protected abstract void RebuildWorldObjects(OWScene scene);
private static uint _numManagersReadying;
internal static uint _numObjectsReadying;
public virtual void UnbuildWorldObjects() { }
/// indicates that this won't become ready immediately
protected void StartDelayedReady() => _numManagersReadying++;
protected void StartDelayedReady() => QSBWorldSync._numManagersReadying++;
/// indicates that this is now ready
protected void FinishDelayedReady() => _numManagersReadying--;
protected void FinishDelayedReady() => QSBWorldSync._numManagersReadying--;
}
}

View File

@ -7,7 +7,7 @@ namespace QSB.ZeroGCaveSync
{
public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem;
protected override void RebuildWorldObjects(OWScene scene)
public override void BuildWorldObjects(OWScene scene)
=> QSBWorldSync.Init<QSBSatelliteNode, SatelliteNode>();
}
}