diff --git a/QSB/Anglerfish/AnglerManager.cs b/QSB/Anglerfish/AnglerManager.cs index 2631868c..af4ae71c 100644 --- a/QSB/Anglerfish/AnglerManager.cs +++ b/QSB/Anglerfish/AnglerManager.cs @@ -14,7 +14,7 @@ namespace QSB.Anglerfish { Anglers.Clear(); Anglers.AddRange(QSBWorldSync.GetUnityObjects()); - QSBWorldSync.Init(Anglers); + QSBWorldSync.Init(Anglers, this); } } } diff --git a/QSB/Animation/NPC/CharacterAnimManager.cs b/QSB/Animation/NPC/CharacterAnimManager.cs index 0d4f0ebc..c9d3d9a9 100644 --- a/QSB/Animation/NPC/CharacterAnimManager.cs +++ b/QSB/Animation/NPC/CharacterAnimManager.cs @@ -10,12 +10,12 @@ namespace QSB.Animation.NPC protected override void RebuildWorldObjects(OWScene scene) { - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); //MOVE : this is the wrong place to put this... move it to Conversations? QSBWorldSync.OldDialogueTrees.Clear(); diff --git a/QSB/CampfireSync/CampfireManager.cs b/QSB/CampfireSync/CampfireManager.cs index 20678239..201f37ea 100644 --- a/QSB/CampfireSync/CampfireManager.cs +++ b/QSB/CampfireSync/CampfireManager.cs @@ -8,6 +8,6 @@ namespace QSB.CampfireSync public override WorldObjectType WorldObjectType => WorldObjectType.Both; protected override void RebuildWorldObjects(OWScene scene) - => QSBWorldSync.Init(); + => QSBWorldSync.Init(this); } } diff --git a/QSB/ConversationSync/ConversationManager.cs b/QSB/ConversationSync/ConversationManager.cs index 820f81dc..1c27f947 100644 --- a/QSB/ConversationSync/ConversationManager.cs +++ b/QSB/ConversationSync/ConversationManager.cs @@ -38,7 +38,7 @@ namespace QSB.ConversationSync } protected override void RebuildWorldObjects(OWScene scene) - => QSBWorldSync.Init(); + => QSBWorldSync.Init(this); public uint GetPlayerTalkingToTree(CharacterDialogueTree tree) { diff --git a/QSB/EchoesOfTheEye/AirlockSync/AirlockManager.cs b/QSB/EchoesOfTheEye/AirlockSync/AirlockManager.cs index 4b7f9083..85ba26ce 100644 --- a/QSB/EchoesOfTheEye/AirlockSync/AirlockManager.cs +++ b/QSB/EchoesOfTheEye/AirlockSync/AirlockManager.cs @@ -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(); + protected override void RebuildWorldObjects(OWScene scene) => QSBWorldSync.Init(this); } } diff --git a/QSB/EchoesOfTheEye/LightSensorSync/LightSensorManager.cs b/QSB/EchoesOfTheEye/LightSensorSync/LightSensorManager.cs index 06b6ecfd..29eaf56f 100644 --- a/QSB/EchoesOfTheEye/LightSensorSync/LightSensorManager.cs +++ b/QSB/EchoesOfTheEye/LightSensorSync/LightSensorManager.cs @@ -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(); + protected override void RebuildWorldObjects(OWScene scene) => QSBWorldSync.Init(this); } } diff --git a/QSB/ElevatorSync/ElevatorManager.cs b/QSB/ElevatorSync/ElevatorManager.cs index 8c2bc15f..ffbff37f 100644 --- a/QSB/ElevatorSync/ElevatorManager.cs +++ b/QSB/ElevatorSync/ElevatorManager.cs @@ -8,6 +8,6 @@ namespace QSB.ElevatorSync public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; protected override void RebuildWorldObjects(OWScene scene) - => QSBWorldSync.Init(); + => QSBWorldSync.Init(this); } } \ No newline at end of file diff --git a/QSB/EyeOfTheUniverse/InstrumentSync/QuantumInstrumentManager.cs b/QSB/EyeOfTheUniverse/InstrumentSync/QuantumInstrumentManager.cs index 5f382b3a..82ab8279 100644 --- a/QSB/EyeOfTheUniverse/InstrumentSync/QuantumInstrumentManager.cs +++ b/QSB/EyeOfTheUniverse/InstrumentSync/QuantumInstrumentManager.cs @@ -8,6 +8,6 @@ namespace QSB.EyeOfTheUniverse.InstrumentSync public override WorldObjectType WorldObjectType => WorldObjectType.Eye; protected override void RebuildWorldObjects(OWScene scene) - => QSBWorldSync.Init(); + => QSBWorldSync.Init(this); } } diff --git a/QSB/GeyserSync/GeyserManager.cs b/QSB/GeyserSync/GeyserManager.cs index 5a8bbfdd..ab0455ee 100644 --- a/QSB/GeyserSync/GeyserManager.cs +++ b/QSB/GeyserSync/GeyserManager.cs @@ -8,6 +8,6 @@ namespace QSB.GeyserSync public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; protected override void RebuildWorldObjects(OWScene scene) - => QSBWorldSync.Init(); + => QSBWorldSync.Init(this); } } \ No newline at end of file diff --git a/QSB/ItemSync/ItemManager.cs b/QSB/ItemSync/ItemManager.cs index 8f4e1253..7896564d 100644 --- a/QSB/ItemSync/ItemManager.cs +++ b/QSB/ItemSync/ItemManager.cs @@ -15,20 +15,20 @@ namespace QSB.ItemSync DebugLog.DebugWrite("Rebuilding OWItems...", MessageType.Info); // Items - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); // Sockets - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); } } } diff --git a/QSB/JellyfishSync/JellyfishManager.cs b/QSB/JellyfishSync/JellyfishManager.cs index 4ad7f964..3d16ac09 100644 --- a/QSB/JellyfishSync/JellyfishManager.cs +++ b/QSB/JellyfishSync/JellyfishManager.cs @@ -14,7 +14,7 @@ namespace QSB.JellyfishSync { Jellyfish.Clear(); Jellyfish.AddRange(QSBWorldSync.GetUnityObjects()); - QSBWorldSync.Init(Jellyfish); + QSBWorldSync.Init(Jellyfish, this); } } } diff --git a/QSB/MeteorSync/MeteorManager.cs b/QSB/MeteorSync/MeteorManager.cs index 53c914a1..2fff9c44 100644 --- a/QSB/MeteorSync/MeteorManager.cs +++ b/QSB/MeteorSync/MeteorManager.cs @@ -18,9 +18,9 @@ namespace QSB.MeteorSync { FinishDelayedReady(); WhiteHoleVolume = QSBWorldSync.GetUnityObjects().First(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); }); } } diff --git a/QSB/OrbSync/OrbManager.cs b/QSB/OrbSync/OrbManager.cs index 3a652bc9..67b48b86 100644 --- a/QSB/OrbSync/OrbManager.cs +++ b/QSB/OrbSync/OrbManager.cs @@ -14,7 +14,7 @@ namespace QSB.OrbSync { Orbs.Clear(); Orbs.AddRange(QSBWorldSync.GetUnityObjects()); - QSBWorldSync.Init(Orbs); + QSBWorldSync.Init(Orbs, this); } } } diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index b05ae6b4..30ac6f3f 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -47,7 +47,7 @@ namespace QSB public static bool DebugMode => DebugSettings.DebugMode; public static bool ShowLinesInDebug => DebugMode && DebugSettings.DrawLines; public static bool ShowQuantumVisibilityObjects => DebugMode && DebugSettings.ShowQuantumVisibilityObjects; - public static bool ShowQuantumDebugBoxes => DebugMode && DebugSettings.ShowQuantumDebugBoxes; + public static bool ShowDebugLabels => DebugMode && DebugSettings.ShowDebugLabels; public static bool AvoidTimeSync => DebugMode && DebugSettings.AvoidTimeSync; public static bool SkipTitleScreen => DebugMode && DebugSettings.SkipTitleScreen; public static AssetBundle NetworkAssetBundle { get; internal set; } @@ -114,8 +114,6 @@ namespace QSB gameObject.AddComponent(type); } - DebugBoxManager.Init(); - Helper.HarmonyHelper.EmptyMethod("Update"); QSBPatchManager.OnPatchType += OnPatchType; diff --git a/QSB/QuantumSync/Messages/MultiStateChangeMessage.cs b/QSB/QuantumSync/Messages/MultiStateChangeMessage.cs index 481e4736..a50510bb 100644 --- a/QSB/QuantumSync/Messages/MultiStateChangeMessage.cs +++ b/QSB/QuantumSync/Messages/MultiStateChangeMessage.cs @@ -24,16 +24,6 @@ namespace QSB.QuantumSync.Messages StateIndex = reader.ReadInt32(); } - public override void OnReceiveLocal() - { - if (!QSBCore.ShowQuantumDebugBoxes) - { - return; - } - - WorldObject.DebugBoxText.text = StateIndex.ToString(); - } - public override void OnReceiveRemote() { if (WorldObject.ControllingPlayer != From) diff --git a/QSB/QuantumSync/QuantumManager.cs b/QSB/QuantumSync/QuantumManager.cs index 42ff464f..025224cb 100644 --- a/QSB/QuantumSync/QuantumManager.cs +++ b/QSB/QuantumSync/QuantumManager.cs @@ -33,13 +33,13 @@ namespace QSB.QuantumSync protected override void RebuildWorldObjects(OWScene scene) { DebugLog.DebugWrite("Rebuilding quantum objects...", MessageType.Info); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); if (scene == OWScene.SolarSystem) { Shrine = QSBWorldSync.GetUnityObjects().First(); @@ -64,7 +64,7 @@ namespace QSB.QuantumSync public void OnRenderObject() { - if (!WorldObjectManager.AllObjectsReady || !QSBCore.ShowLinesInDebug) + if (!AllObjectsReady || !QSBCore.ShowLinesInDebug) { return; } diff --git a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs index b18912fd..9bb20388 100644 --- a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs @@ -1,33 +1,18 @@ using QSB.Utility; using QSB.WorldSync; +using System; using System.Collections.Generic; using System.Linq; -using UnityEngine.UI; namespace QSB.QuantumSync.WorldObjects { internal class QSBMultiStateQuantumObject : QSBQuantumObject { public List QuantumStates { get; private set; } - public Text DebugBoxText; public int CurrentState => AttachedObject._stateIndex; - public override void OnRemoval() - { - base.OnRemoval(); - if (DebugBoxText != null) - { - UnityEngine.Object.Destroy(DebugBoxText.gameObject); - } - } - public override void Init() { - if (QSBCore.ShowQuantumDebugBoxes) - { - DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, $"Multistate\r\nid:{ObjectId}\r\nstate:{CurrentState}").GetComponent(); - } - base.Init(); StartDelayedReady(); @@ -44,6 +29,9 @@ namespace QSB.QuantumSync.WorldObjects }); } + public override string ReturnLabel() + => $"{LogName}{Environment.NewLine}StateIndex:{AttachedObject._stateIndex}"; + public void ChangeState(int newStateIndex) { if (CurrentState != -1) @@ -53,10 +41,6 @@ namespace QSB.QuantumSync.WorldObjects QuantumStates[newStateIndex].SetVisible(true); AttachedObject._stateIndex = newStateIndex; - if (QSBCore.ShowQuantumDebugBoxes) - { - DebugBoxText.text = $"Multistate\r\nid:{ObjectId}\r\nstate:{CurrentState}"; - } } } } diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index d4a4c28b..f13c2bf1 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -25,6 +25,8 @@ namespace QSB.QuantumSync.WorldObjects } } + public override bool ShouldDisplayLabel() => ControllingPlayer != 0; + public override void Init() { var debugBundle = QSBCore.DebugAssetBundle; diff --git a/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs index 4669bf54..f1b270ee 100644 --- a/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs @@ -2,31 +2,30 @@ using QSB.Player; using QSB.Utility; using QSB.WorldSync; +using System; using UnityEngine; -using UnityEngine.UI; namespace QSB.QuantumSync.WorldObjects { internal class QSBSocketedQuantumObject : QSBQuantumObject { - public Text DebugBoxText; - public override void Init() { base.Init(); AttachedObject._randomYRotation = false; - if (QSBCore.ShowQuantumDebugBoxes) - { - DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, $"Socketed\r\nid:{ObjectId}").GetComponent(); - } } - public override void OnRemoval() + public override string ReturnLabel() { - base.OnRemoval(); - if (DebugBoxText != null) + var socket = AttachedObject.GetCurrentSocket(); + if (socket != null) { - Object.Destroy(DebugBoxText.gameObject); + var socketObj = QSBWorldSync.GetWorldObject(socket); + return $"{LogName}{Environment.NewLine}SocketId:{socketObj.ObjectId}"; + } + else + { + return $"{LogName}{Environment.NewLine}SocketId:NULL"; } } diff --git a/QSB/SectorSync/QSBSectorManager.cs b/QSB/SectorSync/QSBSectorManager.cs index c12401cf..80bf4730 100644 --- a/QSB/SectorSync/QSBSectorManager.cs +++ b/QSB/SectorSync/QSBSectorManager.cs @@ -89,7 +89,7 @@ namespace QSB.SectorSync } } - QSBWorldSync.Init(); + QSBWorldSync.Init(this); IsReady = QSBWorldSync.GetWorldObjects().Any(); } diff --git a/QSB/ShipSync/ShipManager.cs b/QSB/ShipSync/ShipManager.cs index f0da6569..d2ca7aa8 100644 --- a/QSB/ShipSync/ShipManager.cs +++ b/QSB/ShipSync/ShipManager.cs @@ -91,8 +91,8 @@ namespace QSB.ShipSync Instantiate(QSBNetworkManager.Instance.ShipPrefab).SpawnWithServerAuthority(); } - QSBWorldSync.Init(); - QSBWorldSync.Init(); + QSBWorldSync.Init(this); + QSBWorldSync.Init(this); } public void AddPlayerToShip(PlayerInfo player) diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 2de19ff7..14d2cf43 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -104,7 +104,6 @@ namespace QSB.Syncs protected virtual float DistanceLeeway { get; } = 5f; private float _previousDistance; protected const float SmoothTime = 0.1f; - protected const int MaxLabelSize = 15; private Vector3 _positionSmoothVelocity; private Quaternion _rotationSmoothVelocity; protected bool _isInitialized; @@ -298,37 +297,10 @@ namespace QSB.Syncs void OnGUI() { - GUIStyle guiStyle = new(); - guiStyle.normal.textColor = Color.white; - GUI.contentColor = Color.white; - - if (Locator.GetPlayerCamera() == null) + if (AttachedObject != null) { - return; + DebugGUI.DrawLabel(AttachedObject.transform, LogName); } - - if (AttachedObject == null) - { - return; - } - - var screenPosition = Locator.GetPlayerCamera().WorldToScreenPoint(AttachedObject.transform.position); - var distance = screenPosition.z; - var mappedFontSize = distance.Map(0, 250, MaxLabelSize, 0, true); - guiStyle.fontSize = (int)mappedFontSize; - - if ((int)mappedFontSize <= 0) - { - return; - } - - if ((int)mappedFontSize >= MaxLabelSize) - { - return; - } - - // WorldToScreenPoint's (0,0) is at screen bottom left, GUI's (0,0) is at screen top left. grrrr - GUI.Label(new Rect(screenPosition.x, Screen.height - screenPosition.y, 100f, 20f), LogName, guiStyle); } } } diff --git a/QSB/Tools/ProbeLauncherTool/ProbeLauncherManager.cs b/QSB/Tools/ProbeLauncherTool/ProbeLauncherManager.cs index eed8efa9..db7a02a0 100644 --- a/QSB/Tools/ProbeLauncherTool/ProbeLauncherManager.cs +++ b/QSB/Tools/ProbeLauncherTool/ProbeLauncherManager.cs @@ -8,6 +8,6 @@ namespace QSB.Tools.ProbeLauncherTool public override WorldObjectType WorldObjectType => WorldObjectType.Both; protected override void RebuildWorldObjects(OWScene scene) - => QSBWorldSync.Init(typeof(PlayerProbeLauncher)); + => QSBWorldSync.Init(this, typeof(PlayerProbeLauncher)); } } \ No newline at end of file diff --git a/QSB/Tools/TranslatorTool/TranslationSync/SpiralManager.cs b/QSB/Tools/TranslatorTool/TranslationSync/SpiralManager.cs index bdd13508..62019dc9 100644 --- a/QSB/Tools/TranslatorTool/TranslationSync/SpiralManager.cs +++ b/QSB/Tools/TranslatorTool/TranslationSync/SpiralManager.cs @@ -14,7 +14,7 @@ namespace QSB.Tools.TranslatorTool.TranslationSync QSBCore.UnityEvents.RunWhen(() => LateInitializerManager.isDoneInitializing, () => { FinishDelayedReady(); - QSBWorldSync.Init(typeof(GhostWallText)); + QSBWorldSync.Init(this, typeof(GhostWallText)); }); } } diff --git a/QSB/TornadoSync/TornadoManager.cs b/QSB/TornadoSync/TornadoManager.cs index 85b865c8..09b94387 100644 --- a/QSB/TornadoSync/TornadoManager.cs +++ b/QSB/TornadoSync/TornadoManager.cs @@ -12,7 +12,7 @@ namespace QSB.TornadoSync protected override void RebuildWorldObjects(OWScene scene) { - QSBWorldSync.Init(); + QSBWorldSync.Init(this); if (!QSBCore.IsHost) { diff --git a/QSB/Utility/DebugBoxManager.cs b/QSB/Utility/DebugBoxManager.cs deleted file mode 100644 index 53df477e..00000000 --- a/QSB/Utility/DebugBoxManager.cs +++ /dev/null @@ -1,36 +0,0 @@ -using OWML.Common; -using UnityEngine; -using UnityEngine.UI; - -namespace QSB.Utility -{ - public static class DebugBoxManager - { - private static GameObject _boxPrefab; - - public static void Init() - { - _boxPrefab = QSBCore.ConversationAssetBundle.LoadAsset("assets/Prefabs/dialoguebubble.prefab"); - var font = (Font)Resources.Load(@"fonts\english - latin\spacemono-bold"); - if (font == null) - { - DebugLog.ToConsole("Error - Font is null!", MessageType.Error); - } - - _boxPrefab.GetComponent().font = font; - _boxPrefab.GetComponent().color = Color.white; - } - - public static GameObject CreateBox(Transform parent, float vertOffset, string text) - { - var newBox = Object.Instantiate(_boxPrefab); - newBox.SetActive(false); - newBox.transform.SetParent(parent); - newBox.transform.localPosition = new Vector3(0, vertOffset, 0); - newBox.transform.rotation = parent.rotation; - newBox.GetComponent().text = text; - newBox.SetActive(true); - return newBox; - } - } -} \ No newline at end of file diff --git a/QSB/Utility/DebugGUI.cs b/QSB/Utility/DebugGUI.cs index 2d81d19e..2325df8a 100644 --- a/QSB/Utility/DebugGUI.cs +++ b/QSB/Utility/DebugGUI.cs @@ -24,12 +24,16 @@ namespace QSB.Utility private float column3Offset = 10f; private const float Column4 = Column3 + FixedWidth; private float column4Offset = 10f; + private const int MaxLabelSize = 15; + private const float MaxLabelDistance = 250; - private GUIStyle guiStyle = new() + private GUIStyle guiGUIStyle = new() { fontSize = 9 }; + private static GUIStyle labelGUIStyle = new(); + private void WriteLine(int collumnID, string text) { var currentOffset = 0f; @@ -58,14 +62,14 @@ namespace QSB.Utility break; } - GUI.Label(new Rect(x, currentOffset, FixedWidth, 20f), text, guiStyle); + GUI.Label(new Rect(x, currentOffset, FixedWidth, 20f), text, guiGUIStyle); } private void WriteLine(int collumnID, string text, Color color) { - guiStyle.normal.textColor = color; + guiGUIStyle.normal.textColor = color; WriteLine(collumnID, text); - guiStyle.normal.textColor = Color.white; + guiGUIStyle.normal.textColor = Color.white; } public void OnGUI() @@ -75,7 +79,7 @@ namespace QSB.Utility return; } - guiStyle.normal.textColor = Color.white; + guiGUIStyle.normal.textColor = Color.white; GUI.contentColor = Color.white; column1Offset = 10f; @@ -256,5 +260,84 @@ namespace QSB.Utility } #endregion } + + public static void DrawLabel(Transform obj, string label) + { + if (!QSBCore.ShowDebugLabels) + { + return; + } + + var camera = Locator.GetPlayerCamera(); + + if (camera == null) + { + return; + } + + if (obj == null) + { + return; + } + + labelGUIStyle.normal.textColor = Color.white; + GUI.contentColor = Color.white; + + var cheapDistance = (camera.transform.position - obj.transform.position).sqrMagnitude; + + if (cheapDistance < 0) + { + return; + } + + if (cheapDistance > MaxLabelDistance * MaxLabelDistance) + { + return; + } + + var screenPosition = camera.WorldToScreenPoint(obj.position); + var distance = screenPosition.z; + + if (distance < 0) + { + return; + } + + if (distance > MaxLabelDistance) + { + return; + } + + if (screenPosition.x < 0 || screenPosition.x > Screen.width) + { + return; + } + + if (screenPosition.y < 0 || screenPosition.y > Screen.height) + { + return; + } + + var mappedFontSize = distance.Map(0, MaxLabelDistance, MaxLabelSize, 0, true); + + if ((int)mappedFontSize <= 0) + { + return; + } + + if ((int)mappedFontSize >= MaxLabelSize) + { + return; + } + + labelGUIStyle.fontSize = (int)mappedFontSize; + + var rect = GUILayoutUtility.GetRect(new GUIContent(label), labelGUIStyle); + rect.x = screenPosition.x; + rect.y = Screen.height - screenPosition.y; + + // WorldToScreenPoint's (0,0) is at screen bottom left, GUI's (0,0) is at screen top left. grrrr + GUI.Label(rect, label, labelGUIStyle); + } } } diff --git a/QSB/Utility/DebugSettings.cs b/QSB/Utility/DebugSettings.cs index 690b4051..8517043d 100644 --- a/QSB/Utility/DebugSettings.cs +++ b/QSB/Utility/DebugSettings.cs @@ -13,8 +13,8 @@ namespace QSB.Utility [JsonProperty("showQuantumVisibilityObjects")] public bool ShowQuantumVisibilityObjects { get; set; } = false; - [JsonProperty("showQuantumDebugBoxes")] - public bool ShowQuantumDebugBoxes { get; set; } = false; + [JsonProperty("showDebugLabels")] + public bool ShowDebugLabels { get; set; } = false; [JsonProperty("avoidTimeSync")] public bool AvoidTimeSync { get; set; } = false; diff --git a/QSB/WorldSync/IWorldObject.cs b/QSB/WorldSync/IWorldObject.cs index ba993075..0ca04d6f 100644 --- a/QSB/WorldSync/IWorldObject.cs +++ b/QSB/WorldSync/IWorldObject.cs @@ -5,9 +5,12 @@ namespace QSB.WorldSync public interface IWorldObject { int ObjectId { get; } + WorldObjectManager Manager { get; } string Name { get; } void OnRemoval(); MonoBehaviour ReturnObject(); + bool ShouldDisplayLabel(); + string ReturnLabel(); } } diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index dbfad045..a63e2f19 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -82,6 +82,7 @@ namespace QSB.WorldSync try { item.OnRemoval(); + item.Manager.UnregisterWorldObject(item); } catch (Exception e) { @@ -98,23 +99,23 @@ namespace QSB.WorldSync => Resources.FindObjectsOfTypeAll() .Where(x => x.gameObject.scene.name != null); - public static void Init() + public static void Init(WorldObjectManager owner) where TWorldObject : WorldObject, new() where TUnityObject : MonoBehaviour { var list = GetUnityObjects(); - Init(list); + Init(list, owner); } - public static void Init(params Type[] typesToExclude) + public static void Init(WorldObjectManager owner, params Type[] typesToExclude) where TWorldObject : WorldObject, new() where TUnityObject : MonoBehaviour { var list = GetUnityObjects().Where(x => !typesToExclude.Contains(x.GetType())); - Init(list); + Init(list, owner); } - public static void Init(IEnumerable listToInitFrom) + public static void Init(IEnumerable listToInitFrom, WorldObjectManager owner) where TWorldObject : WorldObject, new() where TUnityObject : MonoBehaviour { @@ -124,12 +125,14 @@ namespace QSB.WorldSync var obj = new TWorldObject { AttachedObject = item, - ObjectId = WorldObjects.Count + ObjectId = WorldObjects.Count, + Manager = owner }; obj.Init(); WorldObjects.Add(obj); WorldObjectsToUnityObjects.Add(item, obj); + owner.RegisterWorldObject(obj); } } diff --git a/QSB/WorldSync/WorldObject.cs b/QSB/WorldSync/WorldObject.cs index 42a5c3b0..e020642a 100644 --- a/QSB/WorldSync/WorldObject.cs +++ b/QSB/WorldSync/WorldObject.cs @@ -8,12 +8,15 @@ namespace QSB.WorldSync { public int ObjectId { get; init; } public T AttachedObject { get; init; } + public WorldObjectManager Manager { get; init; } public string Name => AttachedObject == null ? "" : AttachedObject.name; public string LogName => $"{QSBPlayerManager.LocalPlayerId}.{ObjectId}:{GetType().Name}"; public virtual void Init() { } public virtual void OnRemoval() { } public MonoBehaviour ReturnObject() => AttachedObject; + public virtual bool ShouldDisplayLabel() => true; + public virtual string ReturnLabel() => LogName; /// indicates that this won't become ready immediately protected void StartDelayedReady() => WorldObjectManager._numObjectsReadying++; diff --git a/QSB/WorldSync/WorldObjectManager.cs b/QSB/WorldSync/WorldObjectManager.cs index f0e6c0f3..9fbe1ff5 100644 --- a/QSB/WorldSync/WorldObjectManager.cs +++ b/QSB/WorldSync/WorldObjectManager.cs @@ -33,6 +33,8 @@ namespace QSB.WorldSync /// public abstract WorldObjectType WorldObjectType { get; } + private List _worldObjects = new List(); + public virtual void Awake() { QSBSceneManager.OnSceneLoaded += OnSceneLoaded; @@ -57,6 +59,9 @@ namespace QSB.WorldSync AllObjectsReady = false; } + public void RegisterWorldObject(IWorldObject obj) => _worldObjects.Add(obj); + public void UnregisterWorldObject(IWorldObject obj) => _worldObjects.Remove(obj); + public static void Rebuild(OWScene scene) { if (!QSBNetworkManager.Instance.IsReady) @@ -126,5 +131,18 @@ namespace QSB.WorldSync /// indicates that this is now ready protected void FinishDelayedReady() => _numManagersReadying--; + + private void OnGUI() + { + if (!QSBCore.ShowDebugLabels) + { + return; + } + + foreach (var obj in _worldObjects) + { + DebugGUI.DrawLabel(obj.ReturnObject().transform, obj.ReturnLabel()); + } + } } } diff --git a/QSB/ZeroGCaveSync/ZeroGCaveManager.cs b/QSB/ZeroGCaveSync/ZeroGCaveManager.cs index 206ccc74..a317fd3a 100644 --- a/QSB/ZeroGCaveSync/ZeroGCaveManager.cs +++ b/QSB/ZeroGCaveSync/ZeroGCaveManager.cs @@ -8,6 +8,6 @@ namespace QSB.ZeroGCaveSync public override WorldObjectType WorldObjectType => WorldObjectType.SolarSystem; protected override void RebuildWorldObjects(OWScene scene) - => QSBWorldSync.Init(); + => QSBWorldSync.Init(this); } }