From bb390c57151da1fd8c14ea59fc0ab5555c7eefed Mon Sep 17 00:00:00 2001 From: Joshua Thome Date: Mon, 11 Aug 2025 15:50:11 -0500 Subject: [PATCH] Add sectorPath and update all builders to accommodate sector ref --- .../Builder/Body/BrambleDimensionBuilder.cs | 2 +- NewHorizons/Builder/Body/ProxyBuilder.cs | 3 +- .../Builder/Body/SingularityBuilder.cs | 5 +- .../Builder/General/SpawnPointBuilder.cs | 6 ++- .../Props/Audio/GeneralAudioBuilder.cs | 2 +- .../Builder/Props/BrambleNodeBuilder.cs | 3 +- NewHorizons/Builder/Props/DetailBuilder.cs | 30 +++++++---- NewHorizons/Builder/Props/DialogueBuilder.cs | 10 ++-- .../Props/EchoesOfTheEye/AlarmTotemBuilder.cs | 2 +- .../DreamArrivalPointBuilder.cs | 2 +- .../EchoesOfTheEye/DreamCampfireBuilder.cs | 2 +- .../EchoesOfTheEye/DreamCandleBuilder.cs | 2 +- .../EchoesOfTheEye/GrappleTotemBuilder.cs | 2 +- .../Props/EchoesOfTheEye/PortholeBuilder.cs | 16 ++++-- .../EchoesOfTheEye/ProjectionTotemBuilder.cs | 2 +- .../Props/EchoesOfTheEye/RaftBuilder.cs | 2 +- .../Props/EchoesOfTheEye/RaftDockBuilder.cs | 2 +- .../Builder/Props/EyeOfTheUniverseBuilder.cs | 21 +++++--- .../Builder/Props/GeneralPropBuilder.cs | 54 ++++++++++++++++--- NewHorizons/Builder/Props/GeyserBuilder.cs | 2 +- .../Builder/Props/GravityCannonBuilder.cs | 5 +- NewHorizons/Builder/Props/ItemBuilder.cs | 3 +- .../Builder/Props/ProjectionBuilder.cs | 8 +-- NewHorizons/Builder/Props/QuantumBuilder.cs | 15 ++++-- NewHorizons/Builder/Props/RemoteBuilder.cs | 6 +-- NewHorizons/Builder/Props/ScatterBuilder.cs | 4 +- NewHorizons/Builder/Props/ShuttleBuilder.cs | 2 +- NewHorizons/Builder/Props/TornadoBuilder.cs | 2 +- .../TranslatorText/TranslatorTextBuilder.cs | 16 +++--- NewHorizons/Builder/Props/VolcanoBuilder.cs | 2 +- NewHorizons/Builder/Props/WarpPadBuilder.cs | 7 +-- .../Builder/ShipLog/EntryLocationBuilder.cs | 2 +- NewHorizons/Builder/ShipLog/RevealBuilder.cs | 2 +- .../Builder/Volumes/AudioVolumeBuilder.cs | 4 +- .../Volumes/ChangeStarSystemVolumeBuilder.cs | 2 +- .../Volumes/ConditionTriggerVolumeBuilder.cs | 2 +- .../Builder/Volumes/CreditsVolumeBuilder.cs | 2 +- .../Volumes/DayNightAudioVolumeBuilder.cs | 4 +- .../Builder/Volumes/FluidVolumeBuilder.cs | 6 +-- .../Builder/Volumes/ForceVolumeBuilder.cs | 2 +- .../Builder/Volumes/HazardVolumeBuilder.cs | 10 ++-- .../Volumes/InteractionVolumeBuilder.cs | 2 +- .../Volumes/NotificationVolumeBuilder.cs | 2 +- .../Builder/Volumes/OxygenVolumeBuilder.cs | 2 +- .../Builder/Volumes/PriorityVolumeBuilder.cs | 17 ++++-- .../Builder/Volumes/RepairVolumeBuilder.cs | 2 +- .../Rulesets/PlayerImpactRulesetBuilder.cs | 2 +- .../Volumes/Rulesets/ProbeRulesetBuilder.cs | 2 +- .../Volumes/Rulesets/ThrustRulesetBuilder.cs | 2 +- .../Volumes/SpeedLimiterVolumeBuilder.cs | 2 +- .../Builder/Volumes/SpeedTrapVolumeBuilder.cs | 2 +- .../Builder/Volumes/VanishVolumeBuilder.cs | 2 +- .../VisorFrostEffectVolumeBuilder.cs | 2 +- .../VisorRainEffectVolumeBuilder.cs | 2 +- NewHorizons/Builder/Volumes/VolumeBuilder.cs | 24 +++++++-- .../Builder/Volumes/ZeroGVolumeBuilder.cs | 2 +- .../External/Modules/GeneralPropInfo.cs | 7 ++- NewHorizons/Handlers/HeldItemHandler.cs | 3 +- NewHorizons/Handlers/TitleSceneHandler.cs | 6 ++- NewHorizons/Handlers/VesselWarpHandler.cs | 9 ++-- NewHorizons/NewHorizonsApi.cs | 2 +- 61 files changed, 242 insertions(+), 128 deletions(-) diff --git a/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs b/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs index c0319e79..ff2389a1 100644 --- a/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs +++ b/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs @@ -105,7 +105,7 @@ namespace NewHorizons.Builder.Body default: geometryPrefab = _hubGeometry; break; } - var geometry = DetailBuilder.Make(go, sector, mod, geometryPrefab, new DetailInfo()); + var geometry = DetailBuilder.Make(go, ref sector, mod, geometryPrefab, new DetailInfo()); var exitWarps = _exitWarps.InstantiateInactive(); var repelVolume = _repelVolume.InstantiateInactive(); diff --git a/NewHorizons/Builder/Body/ProxyBuilder.cs b/NewHorizons/Builder/Body/ProxyBuilder.cs index 943726eb..589b1af9 100644 --- a/NewHorizons/Builder/Body/ProxyBuilder.cs +++ b/NewHorizons/Builder/Body/ProxyBuilder.cs @@ -211,7 +211,8 @@ namespace NewHorizons.Builder.Body foreach (var detailInfo in body.Config.Props.proxyDetails) { // Thought about switching these to SimplifiedDetailInfo but we use AlignRadial with these so we can't - DetailBuilder.Make(proxy, null, body.Mod, detailInfo); + Sector sector = null; + DetailBuilder.Make(proxy, ref sector, body.Mod, detailInfo); } } diff --git a/NewHorizons/Builder/Body/SingularityBuilder.cs b/NewHorizons/Builder/Body/SingularityBuilder.cs index f7d303ef..6e9e1319 100644 --- a/NewHorizons/Builder/Body/SingularityBuilder.cs +++ b/NewHorizons/Builder/Body/SingularityBuilder.cs @@ -145,7 +145,8 @@ namespace NewHorizons.Builder.Body var sphereCollider = blackHoleVolume.GetComponent(); // Shouldn't ever be null but doesn't hurt ig var loadRadius = sphereCollider == null ? 100f : sphereCollider.radius + 50f; - var streamingVolume = VolumeBuilder.Make(blackHoleVolume.GetAttachedOWRigidbody().gameObject, blackHoleVolume.GetComponentInParent(), + var blackHoleSector = blackHoleVolume.GetComponentInParent(); + var streamingVolume = VolumeBuilder.Make(blackHoleVolume.GetAttachedOWRigidbody().gameObject, ref blackHoleSector, new External.Modules.Volumes.VolumeInfos.VolumeInfo() { radius = loadRadius }); streamingVolume.streamingGroup = streamingGroup; streamingVolume.transform.parent = blackHoleVolume.transform; @@ -174,7 +175,7 @@ namespace NewHorizons.Builder.Body rename = rename, }; - var singularity = GeneralPropBuilder.MakeNew(polarity ? "BlackHole" : "WhiteHole", planetGO, sector, info); + var singularity = GeneralPropBuilder.MakeNew(polarity ? "BlackHole" : "WhiteHole", planetGO, ref sector, info); var singularityRenderer = MakeSingularityGraphics(singularity, polarity, horizon, distort, renderQueue); diff --git a/NewHorizons/Builder/General/SpawnPointBuilder.cs b/NewHorizons/Builder/General/SpawnPointBuilder.cs index a5e8700d..0d3dc752 100644 --- a/NewHorizons/Builder/General/SpawnPointBuilder.cs +++ b/NewHorizons/Builder/General/SpawnPointBuilder.cs @@ -39,7 +39,8 @@ namespace NewHorizons.Builder.General { foreach (var point in module.playerSpawnPoints) { - GameObject spawnGO = GeneralPropBuilder.MakeNew("PlayerSpawnPoint", planetGO, null, point); + Sector spawnSector = null; + GameObject spawnGO = GeneralPropBuilder.MakeNew("PlayerSpawnPoint", planetGO, ref spawnSector, point); spawnGO.layer = Layer.PlayerSafetyCollider; playerSpawn = spawnGO.AddComponent(); @@ -78,7 +79,8 @@ namespace NewHorizons.Builder.General { foreach (var point in module.shipSpawnPoints) { - var spawnGO = GeneralPropBuilder.MakeNew("ShipSpawnPoint", planetGO, null, point); + Sector spawnSector = null; + var spawnGO = GeneralPropBuilder.MakeNew("ShipSpawnPoint", planetGO, ref spawnSector, point); spawnGO.layer = Layer.PlayerSafetyCollider; var shipSpawn = spawnGO.AddComponent(); diff --git a/NewHorizons/Builder/Props/Audio/GeneralAudioBuilder.cs b/NewHorizons/Builder/Props/Audio/GeneralAudioBuilder.cs index 88eeb206..de175f04 100644 --- a/NewHorizons/Builder/Props/Audio/GeneralAudioBuilder.cs +++ b/NewHorizons/Builder/Props/Audio/GeneralAudioBuilder.cs @@ -19,7 +19,7 @@ namespace NewHorizons.Builder.Props.Audio public static OWAudioSource Make(GameObject planetGO, Sector sector, BaseAudioInfo info, IModBehaviour mod) { - var signalGO = GeneralPropBuilder.MakeNew($"{(string.IsNullOrEmpty(info.rename) ? "AudioSource" : info.rename)}", planetGO, sector, info); + var signalGO = GeneralPropBuilder.MakeNew($"{(string.IsNullOrEmpty(info.rename) ? "AudioSource" : info.rename)}", planetGO, ref sector, info); signalGO.layer = Layer.AdvancedEffectVolume; var source = signalGO.AddComponent(); diff --git a/NewHorizons/Builder/Props/BrambleNodeBuilder.cs b/NewHorizons/Builder/Props/BrambleNodeBuilder.cs index 5633ff06..08b1b9ac 100644 --- a/NewHorizons/Builder/Props/BrambleNodeBuilder.cs +++ b/NewHorizons/Builder/Props/BrambleNodeBuilder.cs @@ -194,7 +194,7 @@ namespace NewHorizons.Builder.Props var prefab = config.isSeed ? _brambleSeedPrefab : _brambleNodePrefab; // Spawn the bramble node - var brambleNode = GeneralPropBuilder.MakeFromPrefab(prefab, config.name ?? "Bramble Node to " + config.linksTo, go, sector, config); + var brambleNode = GeneralPropBuilder.MakeFromPrefab(prefab, config.name ?? "Bramble Node to " + config.linksTo, go, ref sector, config); foreach (var collider in brambleNode.GetComponentsInChildren(true)) { collider.enabled = true; @@ -428,6 +428,7 @@ namespace NewHorizons.Builder.Props var signalConfigCopy = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(signalConfig)); signalConfigCopy.parentPath = null; signalConfigCopy.isRelativeToParent = false; + signalConfigCopy.sectorPath = null; var signalGO = SignalBuilder.Make(go, sector, signalConfigCopy, mod); signalGO.GetComponent()._identificationDistance = 0; diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 82a22d05..a89edcca 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -19,7 +19,7 @@ namespace NewHorizons.Builder.Props { public static class DetailBuilder { - private static readonly Dictionary<(Sector, string), (GameObject prefab, bool isItem)> _fixedPrefabCache = new(); + private static readonly Dictionary<(Sector, string, string), (GameObject prefab, bool isItem)> _fixedPrefabCache = new(); private static GameObject _emptyPrefab; private static readonly Dictionary _detailInfoToGameObject = new(); @@ -46,12 +46,20 @@ namespace NewHorizons.Builder.Props // In particular, Outer Wives needs this method signature [Obsolete] public static GameObject Make(GameObject go, Sector sector, GameObject prefab, DetailInfo detail) - => Make(go, sector, mod: null, prefab, detail); + => Make(go, ref sector, mod: null, prefab, detail); // Dreamstalker needed this one [Obsolete] public static GameObject Make(GameObject go, Sector sector, DetailInfo detail) - => Make(go, sector, mod: null, detail); + => Make(go, ref sector, mod: null, detail); + + // Changed to ref sector + [Obsolete] + public static GameObject Make(GameObject go, Sector sector, IModBehaviour mod, GameObject prefab, DetailInfo detail) + => Make(go, ref sector, mod, prefab, detail); + // Intentionally not marking this one Obsolete because it's only used by PropBuildManager and would clutter that code + public static GameObject Make(GameObject planetGO, Sector sector, IModBehaviour mod, DetailInfo info) + => Make(planetGO, ref sector, mod, info); #endregion private static void SceneManager_sceneUnloaded(Scene scene) @@ -68,7 +76,7 @@ namespace NewHorizons.Builder.Props /// /// Create a detail using an asset bundle or a path in the scene hierarchy of the item to copy. /// - public static GameObject Make(GameObject planetGO, Sector sector, IModBehaviour mod, DetailInfo info) + public static GameObject Make(GameObject planetGO, ref Sector sector, IModBehaviour mod, DetailInfo info) { if (sector == null) info.keepLoaded = true; @@ -77,7 +85,7 @@ namespace NewHorizons.Builder.Props // Shouldn't happen if (mod == null) return null; - return Make(planetGO, sector, mod, AssetBundleUtilities.LoadPrefab(info.assetBundle, info.path, mod), info); + return Make(planetGO, ref sector, mod, AssetBundleUtilities.LoadPrefab(info.assetBundle, info.path, mod), info); } if (_emptyPrefab == null) _emptyPrefab = new GameObject("Empty"); @@ -92,14 +100,14 @@ namespace NewHorizons.Builder.Props } else { - return Make(planetGO, sector, mod, prefab, info); + return Make(planetGO, ref sector, mod, prefab, info); } } /// /// Create a detail using a prefab. /// - public static GameObject Make(GameObject go, Sector sector, IModBehaviour mod, GameObject prefab, DetailInfo detail) + public static GameObject Make(GameObject go, ref Sector sector, IModBehaviour mod, GameObject prefab, DetailInfo detail) { if (prefab == null) return null; @@ -111,14 +119,14 @@ namespace NewHorizons.Builder.Props bool isFromAssetBundle = !string.IsNullOrEmpty(detail.assetBundle); // We save copies with all their components fixed, good if the user is placing the same detail more than once - if (detail?.path != null && _fixedPrefabCache.TryGetValue((sector, detail.path), out var storedPrefab)) + if (detail?.path != null && _fixedPrefabCache.TryGetValue((sector, detail.path, detail.sectorPath), out var storedPrefab)) { - prop = GeneralPropBuilder.MakeFromPrefab(storedPrefab.prefab, prefab.name, go, sector, detail); + prop = GeneralPropBuilder.MakeFromPrefab(storedPrefab.prefab, prefab.name, go, ref sector, detail); isItem = storedPrefab.isItem; } else { - prop = GeneralPropBuilder.MakeFromPrefab(prefab, prefab.name, go, sector, detail); + prop = GeneralPropBuilder.MakeFromPrefab(prefab, prefab.name, go, ref sector, detail); StreamingHandler.SetUpStreaming(prop, detail.keepLoaded ? null : sector); @@ -194,7 +202,7 @@ namespace NewHorizons.Builder.Props if (detail.path != null) { // We put these in DontDestroyOnLoad so that QSB will ignore them and so they don't clutter up the scene. - _fixedPrefabCache.Add((sector, detail.path), (prop.InstantiateInactive().DontDestroyOnLoad(), isItem)); + _fixedPrefabCache.Add((sector, detail.path, detail.sectorPath), (prop.InstantiateInactive().DontDestroyOnLoad(), isItem)); } } diff --git a/NewHorizons/Builder/Props/DialogueBuilder.cs b/NewHorizons/Builder/Props/DialogueBuilder.cs index 0878cd87..1393da03 100644 --- a/NewHorizons/Builder/Props/DialogueBuilder.cs +++ b/NewHorizons/Builder/Props/DialogueBuilder.cs @@ -246,7 +246,7 @@ namespace NewHorizons.Builder.Props private static RemoteDialogueTrigger MakeRemoteDialogueTrigger(GameObject planetGO, Sector sector, DialogueInfo info, CharacterDialogueTree dialogue) { - var conversationTrigger = GeneralPropBuilder.MakeNew("ConversationTrigger", planetGO, sector, info.remoteTrigger, defaultPosition: info.position, defaultParentPath: info.pathToAnimController); + var conversationTrigger = GeneralPropBuilder.MakeNew("ConversationTrigger", planetGO, ref sector, info.remoteTrigger, defaultPosition: info.position, defaultParentPath: info.pathToAnimController); var remoteDialogueTrigger = conversationTrigger.AddComponent(); var sphereCollider = conversationTrigger.AddComponent(); @@ -277,7 +277,7 @@ namespace NewHorizons.Builder.Props private static CharacterDialogueTree MakeConversationZone(GameObject planetGO, Sector sector, DialogueInfo info, string xml, string dialogueName) { - var conversationZone = GeneralPropBuilder.MakeNew("ConversationZone", planetGO, sector, info, defaultParentPath: info.pathToAnimController); + var conversationZone = GeneralPropBuilder.MakeNew("ConversationZone", planetGO, ref sector, info, defaultParentPath: info.pathToAnimController); conversationZone.layer = Layer.Interactible; @@ -345,7 +345,8 @@ namespace NewHorizons.Builder.Props { if (info.attentionPoint != null) { - var ptGo = GeneralPropBuilder.MakeNew("AttentionPoint", go, sector, info.attentionPoint, defaultParent: dialogue.transform); + var pointSector = sector; + var ptGo = GeneralPropBuilder.MakeNew("AttentionPoint", go, ref pointSector, info.attentionPoint, defaultParent: dialogue.transform); dialogue._attentionPoint = ptGo.transform; dialogue._attentionPointOffset = info.attentionPoint.offset ?? Vector3.zero; ptGo.SetActive(true); @@ -354,7 +355,8 @@ namespace NewHorizons.Builder.Props { foreach (var pointInfo in info.swappedAttentionPoints) { - var ptGo = GeneralPropBuilder.MakeNew($"AttentionPoint_{pointInfo.dialogueNode}_{pointInfo.dialoguePage}", go, sector, pointInfo, defaultParent: dialogue.transform); + var pointSector = sector; + var ptGo = GeneralPropBuilder.MakeNew($"AttentionPoint_{pointInfo.dialogueNode}_{pointInfo.dialoguePage}", go, ref pointSector, pointInfo, defaultParent: dialogue.transform); var swapper = ptGo.AddComponent(); swapper._dialogueTree = dialogue; swapper._attentionPoint = ptGo.transform; diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/AlarmTotemBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/AlarmTotemBuilder.cs index 46144b6b..a3d9fcfc 100644 --- a/NewHorizons/Builder/Props/EchoesOfTheEye/AlarmTotemBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/AlarmTotemBuilder.cs @@ -42,7 +42,7 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye if (_prefab == null || sector == null) return null; - var totemObj = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + var totemObj = DetailBuilder.Make(planetGO, ref sector, mod, _prefab, new DetailInfo(info)); var alarmTotem = totemObj.GetComponent(); alarmTotem._sightAngle = info.sightAngle; diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/DreamArrivalPointBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/DreamArrivalPointBuilder.cs index c2a5d261..c40ab28e 100644 --- a/NewHorizons/Builder/Props/EchoesOfTheEye/DreamArrivalPointBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/DreamArrivalPointBuilder.cs @@ -48,7 +48,7 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye if (_prefab == null || sector == null) return null; - var arrivalPointObj = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + var arrivalPointObj = DetailBuilder.Make(planetGO, ref sector, mod, _prefab, new DetailInfo(info)); StreamingHandler.SetUpStreaming(arrivalPointObj, sector); diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCampfireBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCampfireBuilder.cs index 8d05f73e..27178a97 100644 --- a/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCampfireBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCampfireBuilder.cs @@ -44,7 +44,7 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye if (_prefab == null || sector == null) return null; - var campfireObj = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + var campfireObj = DetailBuilder.Make(planetGO, ref sector, mod, _prefab, new DetailInfo(info)); var campfire = campfireObj.GetComponentInChildren(); campfire._dreamArrivalLocation = DreamHandler.GetDreamArrivalLocation(info.id); diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCandleBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCandleBuilder.cs index 5b648899..ec8decdf 100644 --- a/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCandleBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCandleBuilder.cs @@ -60,7 +60,7 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye if (prefab == null || sector == null) return null; - var candleObj = DetailBuilder.Make(planetGO, sector, mod, prefab, new DetailInfo(info)); + var candleObj = DetailBuilder.Make(planetGO, ref sector, mod, prefab, new DetailInfo(info)); var dreamCandle = candleObj.GetComponent(); diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/GrappleTotemBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/GrappleTotemBuilder.cs index 9a25dd12..5ce464a0 100644 --- a/NewHorizons/Builder/Props/EchoesOfTheEye/GrappleTotemBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/GrappleTotemBuilder.cs @@ -44,7 +44,7 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye if (_prefab == null || sector == null) return null; - var totemObj = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + var totemObj = DetailBuilder.Make(planetGO, ref sector, mod, _prefab, new DetailInfo(info)); var zoomPoint = totemObj.GetComponentInChildren(); zoomPoint._minActivationDistance = info.minDistance; diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/PortholeBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/PortholeBuilder.cs index b466e272..1d82b893 100644 --- a/NewHorizons/Builder/Props/EchoesOfTheEye/PortholeBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/PortholeBuilder.cs @@ -57,13 +57,15 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye if (_mainPrefab == null || _simPrefab == null || sector == null) return null; - var portholeObj = DetailBuilder.Make(planetGO, sector, mod, _mainPrefab, new DetailInfo(info)); + var portholeSector = sector; + var portholeObj = DetailBuilder.Make(planetGO, ref portholeSector, mod, _mainPrefab, new DetailInfo(info)); portholeObj.name = "Prefab_Porthole"; - var simObj = DetailBuilder.Make(planetGO, sector, mod, _simPrefab, new DetailInfo(info)); + var simSector = sector; + var simObj = DetailBuilder.Make(planetGO, ref simSector, mod, _simPrefab, new DetailInfo(info)); simObj.transform.parent = portholeObj.transform; - var parentObj = GeneralPropBuilder.MakeNew("Porthole", planetGO, sector, info); + var parentObj = GeneralPropBuilder.MakeNew("Porthole", planetGO, ref sector, info); parentObj.SetActive(true); portholeObj.transform.SetParent(parentObj.transform, true); portholeObj.transform.localPosition = new Vector3(0f, -4f, 8f); @@ -81,10 +83,14 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye // Reposition the peephole camera later, after all planets are built, in case the target point is on a different astro body. Delay.FireInNUpdates(() => { - var cameraObj = GeneralPropBuilder.MakeFromExisting(peephole._peepholeCamera.gameObject, planetGO, sector, info.target); + var viewingSector = sector; + if (string.IsNullOrEmpty(info.target.sectorPath)) + { + info.target.sectorPath = "auto"; + } + var cameraObj = GeneralPropBuilder.MakeFromExisting(peephole._peepholeCamera.gameObject, planetGO, ref viewingSector, info.target); cameraObj.transform.Rotate(Vector3.up, 180f, Space.Self); cameraObj.transform.position += cameraObj.transform.up; - var viewingSector = cameraObj.GetComponentInParent(); peephole._viewingSector = viewingSector; }, 2); diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/ProjectionTotemBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/ProjectionTotemBuilder.cs index 6b70b567..4965f335 100644 --- a/NewHorizons/Builder/Props/EchoesOfTheEye/ProjectionTotemBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/ProjectionTotemBuilder.cs @@ -44,7 +44,7 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye if (_prefab == null || sector == null) return null; - var totemObj = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + var totemObj = DetailBuilder.Make(planetGO, ref sector, mod, _prefab, new DetailInfo(info)); var projector = totemObj.GetComponent(); diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/RaftBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/RaftBuilder.cs index 2ae3435f..ba916f61 100644 --- a/NewHorizons/Builder/Props/EchoesOfTheEye/RaftBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/RaftBuilder.cs @@ -119,7 +119,7 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye if (_prefab == null || _cleanPrefab == null || sector == null) return null; - GameObject raftObject = GeneralPropBuilder.MakeFromPrefab(info.pristine ? _cleanPrefab : _prefab, "Raft_Body", planetGO, sector, info); + GameObject raftObject = GeneralPropBuilder.MakeFromPrefab(info.pristine ? _cleanPrefab : _prefab, "Raft_Body", planetGO, ref sector, info); StreamingHandler.SetUpStreaming(raftObject, sector); diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/RaftDockBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/RaftDockBuilder.cs index b8cc22fa..aac878be 100644 --- a/NewHorizons/Builder/Props/EchoesOfTheEye/RaftDockBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/RaftDockBuilder.cs @@ -45,7 +45,7 @@ namespace NewHorizons.Builder.Props.EchoesOfTheEye if (_prefab == null || sector == null) return null; - var dockObject = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + var dockObject = DetailBuilder.Make(planetGO, ref sector, mod, _prefab, new DetailInfo(info)); //var raftDock = dockObject.GetComponent(); diff --git a/NewHorizons/Builder/Props/EyeOfTheUniverseBuilder.cs b/NewHorizons/Builder/Props/EyeOfTheUniverseBuilder.cs index f3db82e9..e3f68197 100644 --- a/NewHorizons/Builder/Props/EyeOfTheUniverseBuilder.cs +++ b/NewHorizons/Builder/Props/EyeOfTheUniverseBuilder.cs @@ -16,6 +16,8 @@ namespace NewHorizons.Builder.Props { public static TravelerEyeController MakeEyeTraveler(GameObject planetGO, Sector sector, EyeTravelerInfo info, NewHorizonsBody nhBody) { + var planetSector = sector; + var travelerData = EyeSceneHandler.CreateEyeTravelerData(info.id); travelerData.info = info; travelerData.requirementsMet = true; @@ -35,7 +37,7 @@ namespace NewHorizons.Builder.Props return null; } - var go = DetailBuilder.Make(planetGO, sector, nhBody.Mod, info); + var go = DetailBuilder.Make(planetGO, ref sector, nhBody.Mod, info); var travelerController = go.GetAddComponent(); if (!string.IsNullOrEmpty(info.startPlayingCondition)) @@ -57,7 +59,8 @@ namespace NewHorizons.Builder.Props { info.dialogue.isRelativeToParent = true; } - GeneralPropBuilder.MakeFromExisting(dialogueTree.gameObject, planetGO, sector, info.dialogue, defaultParent: go.transform); + var dialogueSector = planetSector; + GeneralPropBuilder.MakeFromExisting(dialogueTree.gameObject, planetGO, ref dialogueSector, info.dialogue, defaultParent: go.transform); if (travelerController._dialogueTree != null) { @@ -96,7 +99,8 @@ namespace NewHorizons.Builder.Props { info.signal.isRelativeToParent = true; } - GeneralPropBuilder.MakeFromExisting(signalGO, planetGO, sector, info.signal, defaultParent: go.transform); + var signalSector = planetSector; + GeneralPropBuilder.MakeFromExisting(signalGO, planetGO, ref signalSector, info.signal, defaultParent: go.transform); var signal = signalGO.GetComponent(); travelerController._signal = signal; @@ -136,6 +140,8 @@ namespace NewHorizons.Builder.Props public static QuantumInstrument MakeQuantumInstrument(GameObject planetGO, Sector sector, QuantumInstrumentInfo info, NewHorizonsBody nhBody) { + var planetSector = sector; + var travelerData = EyeSceneHandler.GetEyeTravelerData(info.id); if (travelerData != null && !travelerData.requirementsMet) @@ -143,7 +149,7 @@ namespace NewHorizons.Builder.Props return null; } - var go = DetailBuilder.Make(planetGO, sector, nhBody.Mod, info); + var go = DetailBuilder.Make(planetGO, ref sector, nhBody.Mod, info); go.layer = Layer.Interactible; if (info.interactRadius > 0f) { @@ -190,12 +196,13 @@ namespace NewHorizons.Builder.Props if (!string.IsNullOrEmpty(info.signal.audio)) { - var signalGO = SignalBuilder.Make(planetGO, sector, info.signal, nhBody.Mod); + var signalSector = planetSector; + var signalGO = SignalBuilder.Make(planetGO, signalSector, info.signal, nhBody.Mod); if (info.signal.position == null && info.signal.parentPath == null) { info.signal.isRelativeToParent = true; } - GeneralPropBuilder.MakeFromExisting(signalGO, planetGO, sector, info.signal, defaultParent: go.transform); + GeneralPropBuilder.MakeFromExisting(signalGO, planetGO, ref signalSector, info.signal, defaultParent: go.transform); } else { @@ -214,7 +221,7 @@ namespace NewHorizons.Builder.Props return null; } - var go = DetailBuilder.Make(planetGO, sector, nhBody.Mod, info); + var go = DetailBuilder.Make(planetGO, ref sector, nhBody.Mod, info); var instrumentZone = go.AddComponent(); diff --git a/NewHorizons/Builder/Props/GeneralPropBuilder.cs b/NewHorizons/Builder/Props/GeneralPropBuilder.cs index 9b709bae..0593c4e0 100644 --- a/NewHorizons/Builder/Props/GeneralPropBuilder.cs +++ b/NewHorizons/Builder/Props/GeneralPropBuilder.cs @@ -3,14 +3,28 @@ using NewHorizons.External.SerializableData; using NewHorizons.Utility; using NewHorizons.Utility.OuterWilds; using NewHorizons.Utility.OWML; +using System; using UnityEngine; namespace NewHorizons.Builder.Props { public static class GeneralPropBuilder { + #region obsolete + // Changed to ref sector + [Obsolete] + public static GameObject MakeFromExisting(GameObject go, GameObject planetGO, Sector sector, GeneralPointPropInfo info, MVector3 defaultPosition = null, string defaultParentPath = null, Transform defaultParent = null) + => MakeFromExisting(go, planetGO, ref sector, info, defaultPosition, defaultParentPath, defaultParent); + [Obsolete] + public static GameObject MakeNew(string defaultName, GameObject planetGO, Sector sector, GeneralPointPropInfo info, MVector3 defaultPosition = null, string defaultParentPath = null, Transform defaultParent = null) + => MakeNew(defaultName, planetGO, ref sector, info, defaultPosition, defaultParentPath, defaultParent); + [Obsolete] + public static GameObject MakeFromPrefab(GameObject prefab, string defaultName, GameObject planetGO, Sector sector, GeneralPointPropInfo info, MVector3 defaultPosition = null, string defaultParentPath = null, Transform defaultParent = null) + => MakeFromPrefab(prefab, defaultName, planetGO, ref sector, info, defaultPosition, defaultParentPath, defaultParent); + #endregion + public static GameObject MakeFromExisting(GameObject go, - GameObject planetGO, Sector sector, GeneralPointPropInfo info, + GameObject planetGO, ref Sector sector, GeneralPointPropInfo info, MVector3 defaultPosition = null, string defaultParentPath = null, Transform defaultParent = null) { if (info == null) return go; @@ -46,7 +60,6 @@ namespace NewHorizons.Builder.Props if (newParent != null) { go.transform.parent = newParent; - sector = newParent.GetComponentInParent(); } else { @@ -82,25 +95,54 @@ namespace NewHorizons.Builder.Props var up = (go.transform.position - planetGO.transform.position).normalized; go.transform.rotation = Quaternion.FromToRotation(Vector3.up, up) * rot; } + + sector = GetPropSector(go, planetGO, sector, info); + return go; } public static GameObject MakeNew(string defaultName, - GameObject planetGO, Sector sector, GeneralPointPropInfo info, + GameObject planetGO, ref Sector sector, GeneralPointPropInfo info, MVector3 defaultPosition = null, string defaultParentPath = null, Transform defaultParent = null) { var go = new GameObject(defaultName); go.SetActive(false); - return MakeFromExisting(go, planetGO, sector, info, defaultPosition, defaultParentPath, defaultParent); + return MakeFromExisting(go, planetGO, ref sector, info, defaultPosition, defaultParentPath, defaultParent); } public static GameObject MakeFromPrefab(GameObject prefab, string defaultName, - GameObject planetGO, Sector sector, GeneralPointPropInfo info, + GameObject planetGO, ref Sector sector, GeneralPointPropInfo info, MVector3 defaultPosition = null, string defaultParentPath = null, Transform defaultParent = null) { var go = prefab.InstantiateInactive(); go.name = defaultName; - return MakeFromExisting(go, planetGO, sector, info, defaultPosition, defaultParentPath, defaultParent); + return MakeFromExisting(go, planetGO, ref sector, info, defaultPosition, defaultParentPath, defaultParent); + } + + static Sector GetPropSector(GameObject go, GameObject planetGO, Sector sector, BasePropInfo info) + { + if (string.IsNullOrEmpty(info.sectorPath)) + { + return sector; + } + else if (info.sectorPath == "auto") + { + return go.GetComponentInParent(); + } + else + { + var newSectorObj = planetGO.transform.Find(info.sectorPath); + if (newSectorObj != null) + { + var newSector = newSectorObj.GetComponent(); + if (newSector != null) + { + return newSector; + } + } + NHLogger.LogError($"Cannot find sector at path: {planetGO.name}/{info.sectorPath}"); + return sector; + } } } } diff --git a/NewHorizons/Builder/Props/GeyserBuilder.cs b/NewHorizons/Builder/Props/GeyserBuilder.cs index 8a60e8f7..5f512105 100644 --- a/NewHorizons/Builder/Props/GeyserBuilder.cs +++ b/NewHorizons/Builder/Props/GeyserBuilder.cs @@ -18,7 +18,7 @@ namespace NewHorizons.Builder.Props { InitPrefab(); - var geyserGO = GeneralPropBuilder.MakeFromPrefab(_geyserPrefab, "Geyser", planetGO, sector, info); + var geyserGO = GeneralPropBuilder.MakeFromPrefab(_geyserPrefab, "Geyser", planetGO, ref sector, info); geyserGO.transform.position += geyserGO.transform.up * info.offset; diff --git a/NewHorizons/Builder/Props/GravityCannonBuilder.cs b/NewHorizons/Builder/Props/GravityCannonBuilder.cs index 16978d4c..d289156e 100644 --- a/NewHorizons/Builder/Props/GravityCannonBuilder.cs +++ b/NewHorizons/Builder/Props/GravityCannonBuilder.cs @@ -66,7 +66,8 @@ namespace NewHorizons.Builder.Props if (_interfacePrefab == null || planetGO == null || sector == null || _detailedPlatformPrefab == null || _platformPrefab == null) return null; var detailInfo = new DetailInfo(info.controls) { keepLoaded = true }; - var gravityCannonObject = DetailBuilder.Make(planetGO, sector, mod, _interfacePrefab, detailInfo); + var cannonSector = sector; + var gravityCannonObject = DetailBuilder.Make(planetGO, ref cannonSector, mod, _interfacePrefab, detailInfo); gravityCannonObject.SetActive(false); var gravityCannonController = gravityCannonObject.GetComponent(); @@ -122,7 +123,7 @@ namespace NewHorizons.Builder.Props private static GameObject CreatePlatform(GameObject planetGO, Sector sector, IModBehaviour mod, GravityCannonController gravityCannonController, GravityCannonInfo platformInfo) { - var platform = DetailBuilder.Make(planetGO, sector, mod, platformInfo.detailed ? _detailedPlatformPrefab : _platformPrefab, new DetailInfo(platformInfo) { keepLoaded = true }); + var platform = DetailBuilder.Make(planetGO, ref sector, mod, platformInfo.detailed ? _detailedPlatformPrefab : _platformPrefab, new DetailInfo(platformInfo) { keepLoaded = true }); gravityCannonController._forceVolume = platform.FindChild("ForceVolume").GetComponent(); gravityCannonController._platformTrigger = platform.FindChild("PlatformTrigger").GetComponent(); diff --git a/NewHorizons/Builder/Props/ItemBuilder.cs b/NewHorizons/Builder/Props/ItemBuilder.cs index 15b3bc27..0f5e0b03 100644 --- a/NewHorizons/Builder/Props/ItemBuilder.cs +++ b/NewHorizons/Builder/Props/ItemBuilder.cs @@ -147,7 +147,8 @@ namespace NewHorizons.Builder.Props } if (socket._socketTransform == null) { - var socketGO = GeneralPropBuilder.MakeNew("Socket", planetGO, sector, info, defaultParent: go.transform); + var socketSector = sector; + var socketGO = GeneralPropBuilder.MakeNew("Socket", planetGO, ref socketSector, info, defaultParent: go.transform); socketGO.SetActive(true); socket._socketTransform = socketGO.transform; } diff --git a/NewHorizons/Builder/Props/ProjectionBuilder.cs b/NewHorizons/Builder/Props/ProjectionBuilder.cs index 8639d3c7..2b51bb58 100644 --- a/NewHorizons/Builder/Props/ProjectionBuilder.cs +++ b/NewHorizons/Builder/Props/ProjectionBuilder.cs @@ -148,7 +148,7 @@ namespace NewHorizons.Builder.Props if (prefab == null) return null; - var slideReelObj = GeneralPropBuilder.MakeFromPrefab(prefab, $"Prefab_IP_Reel_{GetSlideReelName(info.reelModel, info.reelCondition)}_{mod.ModHelper.Manifest.Name}", planetGO, sector, info); + var slideReelObj = GeneralPropBuilder.MakeFromPrefab(prefab, $"Prefab_IP_Reel_{GetSlideReelName(info.reelModel, info.reelCondition)}_{mod.ModHelper.Manifest.Name}", planetGO, ref sector, info); var slideReel = slideReelObj.GetComponent(); slideReel.SetSector(sector); @@ -358,7 +358,7 @@ namespace NewHorizons.Builder.Props if (_autoPrefab == null) return null; - var projectorObj = GeneralPropBuilder.MakeFromPrefab(_autoPrefab, $"Prefab_IP_AutoProjector_{mod.ModHelper.Manifest.Name}", planetGO, sector, info); + var projectorObj = GeneralPropBuilder.MakeFromPrefab(_autoPrefab, $"Prefab_IP_AutoProjector_{mod.ModHelper.Manifest.Name}", planetGO, ref sector, info); var autoProjector = projectorObj.GetComponent(); autoProjector._sector = sector; @@ -421,7 +421,7 @@ namespace NewHorizons.Builder.Props if (_visionTorchDetectorPrefab == null) return null; // spawn a trigger for the vision torch - var visionTorchTargetGO = DetailBuilder.Make(planetGO, sector, mod, _visionTorchDetectorPrefab, new DetailInfo(info) { scale = 2, rename = !string.IsNullOrEmpty(info.rename) ? info.rename : "VisionStaffDetector" }); + var visionTorchTargetGO = DetailBuilder.Make(planetGO, ref sector, mod, _visionTorchDetectorPrefab, new DetailInfo(info) { scale = 2, rename = !string.IsNullOrEmpty(info.rename) ? info.rename : "VisionStaffDetector" }); if (visionTorchTargetGO == null) { @@ -466,7 +466,7 @@ namespace NewHorizons.Builder.Props // Spawn the torch itself var prefab = info.reelCondition == ProjectionInfo.SlideReelCondition.Pristine ? _standingVisionTorchCleanPrefab : _standingVisionTorchPrefab; - var standingTorch = DetailBuilder.Make(planetGO, sector, mod, prefab, new DetailInfo(info)); + var standingTorch = DetailBuilder.Make(planetGO, ref sector, mod, prefab, new DetailInfo(info)); if (standingTorch == null) { diff --git a/NewHorizons/Builder/Props/QuantumBuilder.cs b/NewHorizons/Builder/Props/QuantumBuilder.cs index 1a5bc8ab..f9967632 100644 --- a/NewHorizons/Builder/Props/QuantumBuilder.cs +++ b/NewHorizons/Builder/Props/QuantumBuilder.cs @@ -41,9 +41,13 @@ namespace NewHorizons.Builder.Props public static void MakeQuantumLightning(GameObject planetGO, Sector sector, IModBehaviour mod, LightningQuantumInfo quantumGroup) { - (GameObject go, DetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.Make(planetGO, sector, mod, x), x)).ToArray(); + (GameObject go, DetailInfo detail)[] propsInGroup = quantumGroup.details.Select(info => { + var propSector = sector; + var prop = DetailBuilder.Make(planetGO, ref propSector, mod, info); + return (prop, info); + }).ToArray(); - var lightning = DetailBuilder.Make(planetGO, sector, Main.Instance, AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset("Prefab_EYE_QuantumLightningObject"), new DetailInfo(quantumGroup)); + var lightning = DetailBuilder.Make(planetGO, ref sector, Main.Instance, AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset("Prefab_EYE_QuantumLightningObject"), new DetailInfo(quantumGroup)); AssetBundleUtilities.ReplaceShaders(lightning); foreach (var (go, _) in propsInGroup) @@ -95,7 +99,7 @@ namespace NewHorizons.Builder.Props { var socketInfo = quantumGroup.sockets[i]; - var socket = GeneralPropBuilder.MakeNew("Socket " + i, planetGO, sector, socketInfo, defaultParent: groupRoot.transform); + var socket = GeneralPropBuilder.MakeNew("Socket " + i, planetGO, ref sector, socketInfo, defaultParent: groupRoot.transform); sockets[i] = socket.AddComponent(); sockets[i]._lightSources = new Light[0]; // TODO: make this customizable? @@ -126,8 +130,9 @@ namespace NewHorizons.Builder.Props // Can't have 4 objects in 4 slots // Instead we have a duplicate of the final object for each slot, which appears when that slot is "empty" for (int i = 0; i < sockets.Length; i++) - { - var emptySocketObject = DetailBuilder.Make(planetGO, sector, mod, new DetailInfo(specialInfo)); + { + var socketSector = sector; + var emptySocketObject = DetailBuilder.Make(planetGO, ref socketSector, mod, new DetailInfo(specialInfo)); var socket = sockets[i]; socket._emptySocketObject = emptySocketObject; emptySocketObject.SetActive(socket._quantumObject == null); diff --git a/NewHorizons/Builder/Props/RemoteBuilder.cs b/NewHorizons/Builder/Props/RemoteBuilder.cs index 1d9ee2ef..40af4893 100644 --- a/NewHorizons/Builder/Props/RemoteBuilder.cs +++ b/NewHorizons/Builder/Props/RemoteBuilder.cs @@ -204,7 +204,7 @@ namespace NewHorizons.Builder.Props { InitPrefabs(); var mod = nhBody.Mod; - var whiteboard = DetailBuilder.Make(go, sector, mod, _whiteboardPrefab, new DetailInfo(info)); + var whiteboard = DetailBuilder.Make(go, ref sector, mod, _whiteboardPrefab, new DetailInfo(info)); whiteboard.SetActive(false); var decalMat = new Material(_decalMaterial); @@ -245,7 +245,7 @@ namespace NewHorizons.Builder.Props public static void MakePlatform(GameObject go, Sector sector, NomaiRemoteCameraPlatform.ID id, Texture2D decal, RemotePlatformInfo info, IModBehaviour mod) { InitPrefabs(); - var platform = DetailBuilder.Make(go, sector, mod, _remoteCameraPlatformPrefab, new DetailInfo(info)); + var platform = DetailBuilder.Make(go, ref sector, mod, _remoteCameraPlatformPrefab, new DetailInfo(info)); platform.SetActive(false); var decalMat = new Material(_decalMaterial); @@ -272,7 +272,7 @@ namespace NewHorizons.Builder.Props public static void MakeStone(GameObject go, Sector sector, NomaiRemoteCameraPlatform.ID id, Texture2D decal, ProjectionStoneInfo info, IModBehaviour mod) { InitPrefabs(); - var shareStone = GeneralPropBuilder.MakeFromPrefab(_shareStonePrefab, "ShareStone_" + id.ToString(), go, sector, info); + var shareStone = GeneralPropBuilder.MakeFromPrefab(_shareStonePrefab, "ShareStone_" + id.ToString(), go, ref sector, info); shareStone.GetComponent()._connectedPlatform = id; diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index 862f0629..bb004ae0 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -76,9 +76,9 @@ namespace NewHorizons.Builder.Props { scale = propInfo.scale, stretch = propInfo.stretch, - keepLoaded = propInfo.keepLoaded + keepLoaded = propInfo.keepLoaded, }; - var scatterPrefab = DetailBuilder.Make(go, sector, mod, prefab, detailInfo); + var scatterPrefab = DetailBuilder.Make(go, ref sector, mod, prefab, detailInfo); for (int i = 0; i < propInfo.count; i++) { diff --git a/NewHorizons/Builder/Props/ShuttleBuilder.cs b/NewHorizons/Builder/Props/ShuttleBuilder.cs index 469be74d..5efe32a3 100644 --- a/NewHorizons/Builder/Props/ShuttleBuilder.cs +++ b/NewHorizons/Builder/Props/ShuttleBuilder.cs @@ -76,7 +76,7 @@ namespace NewHorizons.Builder.Props if (_prefab == null || planetGO == null || sector == null) return null; var detailInfo = new DetailInfo(info) { keepLoaded = true }; - var shuttleObject = DetailBuilder.Make(planetGO, sector, mod, _prefab, detailInfo); + var shuttleObject = DetailBuilder.Make(planetGO, ref sector, mod, _prefab, detailInfo); shuttleObject.SetActive(false); StreamingHandler.SetUpStreaming(shuttleObject, sector); diff --git a/NewHorizons/Builder/Props/TornadoBuilder.cs b/NewHorizons/Builder/Props/TornadoBuilder.cs index 098bf466..5b9bbb78 100644 --- a/NewHorizons/Builder/Props/TornadoBuilder.cs +++ b/NewHorizons/Builder/Props/TornadoBuilder.cs @@ -101,7 +101,7 @@ namespace NewHorizons.Builder.Props private static void MakeTornado(GameObject planetGO, Sector sector, TornadoInfo info, Vector3 position, bool downwards) { var prefab = downwards ? _downPrefab.InstantiateInactive() : _upPrefab.InstantiateInactive(); - var tornadoGO = GeneralPropBuilder.MakeFromPrefab(prefab, downwards ? "Tornado_Down" : "Tornado_Up", planetGO, sector, info, defaultPosition: position); + var tornadoGO = GeneralPropBuilder.MakeFromPrefab(prefab, downwards ? "Tornado_Down" : "Tornado_Up", planetGO, ref sector, info, defaultPosition: position); // Add the sound thing before changing the scale var soundGO = _soundPrefab.InstantiateInactive(); diff --git a/NewHorizons/Builder/Props/TranslatorText/TranslatorTextBuilder.cs b/NewHorizons/Builder/Props/TranslatorText/TranslatorTextBuilder.cs index f5cf3b2b..9e211345 100644 --- a/NewHorizons/Builder/Props/TranslatorText/TranslatorTextBuilder.cs +++ b/NewHorizons/Builder/Props/TranslatorText/TranslatorTextBuilder.cs @@ -146,7 +146,7 @@ namespace NewHorizons.Builder.Props.TranslatorText case NomaiTextType.Wall: { var nomaiWallTextObj = MakeWallText(planetGO, sector, info, xmlContent, nhBody).gameObject; - nomaiWallTextObj = GeneralPropBuilder.MakeFromExisting(nomaiWallTextObj, planetGO, sector, info); + nomaiWallTextObj = GeneralPropBuilder.MakeFromExisting(nomaiWallTextObj, planetGO, ref sector, info); if (info.normal != null) { @@ -169,7 +169,7 @@ namespace NewHorizons.Builder.Props.TranslatorText } case NomaiTextType.Scroll: { - var customScroll = GeneralPropBuilder.MakeFromPrefab(_scrollPrefab, _scrollPrefab.name, planetGO, sector, info); + var customScroll = GeneralPropBuilder.MakeFromPrefab(_scrollPrefab, _scrollPrefab.name, planetGO, ref sector, info); var nomaiWallText = MakeWallText(planetGO, sector, info, xmlContent, nhBody); nomaiWallText.transform.parent = customScroll.transform; @@ -221,7 +221,7 @@ namespace NewHorizons.Builder.Props.TranslatorText } case NomaiTextType.Computer: { - var computerObject = GeneralPropBuilder.MakeFromPrefab(ComputerPrefab, ComputerPrefab.name, planetGO, sector, info); + var computerObject = GeneralPropBuilder.MakeFromPrefab(ComputerPrefab, ComputerPrefab.name, planetGO, ref sector, info); var computer = computerObject.GetComponent(); computer.SetSector(sector); @@ -242,7 +242,7 @@ namespace NewHorizons.Builder.Props.TranslatorText } case NomaiTextType.PreCrashComputer: { - var computerObject = DetailBuilder.Make(planetGO, sector, nhBody.Mod, PreCrashComputerPrefab, new DetailInfo(info)); + var computerObject = DetailBuilder.Make(planetGO, ref sector, nhBody.Mod, PreCrashComputerPrefab, new DetailInfo(info)); computerObject.SetActive(false); var computer = computerObject.GetComponent(); @@ -284,7 +284,7 @@ namespace NewHorizons.Builder.Props.TranslatorText case NomaiTextType.CairnEmberTwin: { var cairnPrefab = info.type == NomaiTextType.CairnTimberHearth ? _cairnTHPrefab : (info.type == NomaiTextType.CairnEmberTwin ? _cairnCTPrefab : _cairnBHPrefab); - var cairnObject = GeneralPropBuilder.MakeFromPrefab(cairnPrefab, cairnPrefab.name, planetGO, sector, info); + var cairnObject = GeneralPropBuilder.MakeFromPrefab(cairnPrefab, cairnPrefab.name, planetGO, ref sector, info); // Idk do we have to set it active before finding things? cairnObject.SetActive(true); @@ -323,7 +323,7 @@ namespace NewHorizons.Builder.Props.TranslatorText case NomaiTextType.Recorder: { var prefab = (info.type == NomaiTextType.PreCrashRecorder ? _preCrashRecorderPrefab : _recorderPrefab); - var recorderObject = DetailBuilder.Make(planetGO, sector, nhBody.Mod, prefab, new DetailInfo(info)); + var recorderObject = DetailBuilder.Make(planetGO, ref sector, nhBody.Mod, prefab, new DetailInfo(info)); recorderObject.SetActive(false); var nomaiText = recorderObject.GetComponentInChildren(); @@ -343,7 +343,7 @@ namespace NewHorizons.Builder.Props.TranslatorText } case NomaiTextType.Trailmarker: { - var trailmarkerObject = GeneralPropBuilder.MakeFromPrefab(_trailmarkerPrefab, _trailmarkerPrefab.name, planetGO, sector, info); + var trailmarkerObject = GeneralPropBuilder.MakeFromPrefab(_trailmarkerPrefab, _trailmarkerPrefab.name, planetGO, ref sector, info); // shrink because that is what mobius does on all trailmarkers or else they are the size of the player trailmarkerObject.transform.localScale = Vector3.one * 0.75f; @@ -373,7 +373,7 @@ namespace NewHorizons.Builder.Props.TranslatorText path = "BrittleHollow_Body/Sector_BH/Sector_NorthHemisphere/Sector_NorthPole/Sector_HangingCity/Sector_HangingCity_District2/Interactables_HangingCity_District2/VisibleFrom_HangingCity/Props_NOM_Whiteboard (1)", rename = info.rename ?? "Props_NOM_Whiteboard", }; - var whiteboardObject = DetailBuilder.Make(planetGO, sector, nhBody.Mod, whiteboardInfo); + var whiteboardObject = DetailBuilder.Make(planetGO, ref sector, nhBody.Mod, whiteboardInfo); // Spawn a scroll and insert it into the whiteboard, but only if text is provided if (!string.IsNullOrEmpty(info.xmlFile)) diff --git a/NewHorizons/Builder/Props/VolcanoBuilder.cs b/NewHorizons/Builder/Props/VolcanoBuilder.cs index 7d8910f2..90bf800a 100644 --- a/NewHorizons/Builder/Props/VolcanoBuilder.cs +++ b/NewHorizons/Builder/Props/VolcanoBuilder.cs @@ -45,7 +45,7 @@ namespace NewHorizons.Builder.Props { InitPrefab(); - var launcherGO = GeneralPropBuilder.MakeFromPrefab(_meteorLauncherPrefab, "MeteorLauncher", planetGO, sector, info); + var launcherGO = GeneralPropBuilder.MakeFromPrefab(_meteorLauncherPrefab, "MeteorLauncher", planetGO, ref sector, info); var meteorLauncher = launcherGO.GetComponent(); meteorLauncher._audioSector = sector; diff --git a/NewHorizons/Builder/Props/WarpPadBuilder.cs b/NewHorizons/Builder/Props/WarpPadBuilder.cs index 84bc31c2..6f853611 100644 --- a/NewHorizons/Builder/Props/WarpPadBuilder.cs +++ b/NewHorizons/Builder/Props/WarpPadBuilder.cs @@ -93,7 +93,8 @@ namespace NewHorizons.Builder.Props public static void Make(GameObject planetGO, Sector sector, IModBehaviour mod, NomaiWarpReceiverInfo info) { var detailInfo = new DetailInfo(info); - var receiverObject = DetailBuilder.Make(planetGO, sector, mod, info.detailed ? _detailedReceiverPrefab : _receiverPrefab, detailInfo); + var receiverSector = sector; + var receiverObject = DetailBuilder.Make(planetGO, ref receiverSector, mod, info.detailed ? _detailedReceiverPrefab : _receiverPrefab, detailInfo); NHLogger.Log($"Position is {detailInfo.position} was {info.position}"); @@ -132,7 +133,7 @@ namespace NewHorizons.Builder.Props public static void Make(GameObject planetGO, Sector sector, IModBehaviour mod, NomaiWarpTransmitterInfo info) { - var transmitterObject = DetailBuilder.Make(planetGO, sector, mod, _transmitterPrefab, new DetailInfo(info)); + var transmitterObject = DetailBuilder.Make(planetGO, ref sector, mod, _transmitterPrefab, new DetailInfo(info)); var transmitter = transmitterObject.GetComponentInChildren(); transmitter._frequency = GetFrequency(info.frequency); @@ -151,7 +152,7 @@ namespace NewHorizons.Builder.Props private static void CreateComputer(GameObject planetGO, Sector sector, IModBehaviour mod, GeneralPropInfo computerInfo, NomaiWarpReceiver receiver) { - var computerObject = DetailBuilder.Make(planetGO, sector, mod, TranslatorTextBuilder.ComputerPrefab, new DetailInfo(computerInfo)); + var computerObject = DetailBuilder.Make(planetGO, ref sector, mod, TranslatorTextBuilder.ComputerPrefab, new DetailInfo(computerInfo)); var computer = computerObject.GetComponentInChildren(); computer.SetSector(sector); diff --git a/NewHorizons/Builder/ShipLog/EntryLocationBuilder.cs b/NewHorizons/Builder/ShipLog/EntryLocationBuilder.cs index e9a70da8..190bfc8a 100644 --- a/NewHorizons/Builder/ShipLog/EntryLocationBuilder.cs +++ b/NewHorizons/Builder/ShipLog/EntryLocationBuilder.cs @@ -11,7 +11,7 @@ namespace NewHorizons.Builder.ShipLog private static readonly List _locationsToInitialize = new List(); public static void Make(GameObject go, Sector sector, EntryLocationInfo info, IModBehaviour mod) { - GameObject entryLocationGameObject = GeneralPropBuilder.MakeNew("Entry Location (" + info.id + ")", go, sector, info); + GameObject entryLocationGameObject = GeneralPropBuilder.MakeNew("Entry Location (" + info.id + ")", go, ref sector, info); ShipLogEntryLocation newLocation = entryLocationGameObject.AddComponent(); newLocation._entryID = info.id; diff --git a/NewHorizons/Builder/ShipLog/RevealBuilder.cs b/NewHorizons/Builder/ShipLog/RevealBuilder.cs index 41b5b4af..355fec2d 100644 --- a/NewHorizons/Builder/ShipLog/RevealBuilder.cs +++ b/NewHorizons/Builder/ShipLog/RevealBuilder.cs @@ -12,7 +12,7 @@ namespace NewHorizons.Builder.ShipLog { public static void Make(GameObject go, Sector sector, RevealVolumeInfo info, IModBehaviour mod) { - var newRevealGO = GeneralPropBuilder.MakeNew("Reveal Volume (" + info.revealOn + ")", go, sector, info); + var newRevealGO = GeneralPropBuilder.MakeNew("Reveal Volume (" + info.revealOn + ")", go, ref sector, info); switch (info.revealOn) { case RevealVolumeInfo.RevealVolumeType.Enter: diff --git a/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs b/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs index 0c209154..54c9af71 100644 --- a/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs @@ -12,7 +12,7 @@ namespace NewHorizons.Builder.Volumes { public static AudioVolume Make(GameObject planetGO, Sector sector, AudioVolumeInfo info, IModBehaviour mod) { - var go = GeneralPropBuilder.MakeNew("AudioVolume", planetGO, sector, info); + var go = GeneralPropBuilder.MakeNew("AudioVolume", planetGO, ref sector, info); go.layer = Layer.AdvancedEffectVolume; var audioSource = go.AddComponent(); @@ -25,7 +25,7 @@ namespace NewHorizons.Builder.Volumes owAudioSource.SetTrack(info.track.ConvertToOW()); AudioUtilities.SetAudioClip(owAudioSource, info.audio, mod); - var audioVolume = PriorityVolumeBuilder.MakeExisting(go, planetGO, sector, info); + var audioVolume = PriorityVolumeBuilder.MakeExisting(go, planetGO, ref sector, info); audioVolume._layer = info.layer; audioVolume.SetPriority(info.priority); diff --git a/NewHorizons/Builder/Volumes/ChangeStarSystemVolumeBuilder.cs b/NewHorizons/Builder/Volumes/ChangeStarSystemVolumeBuilder.cs index 54eddc3d..16bcda9d 100644 --- a/NewHorizons/Builder/Volumes/ChangeStarSystemVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/ChangeStarSystemVolumeBuilder.cs @@ -8,7 +8,7 @@ namespace NewHorizons.Builder.Volumes { public static WarpVolume Make(GameObject planetGO, Sector sector, ChangeStarSystemVolumeInfo info) { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume.TargetSolarSystem = info.targetStarSystem; volume.TargetSpawnID = info.spawnPointID; diff --git a/NewHorizons/Builder/Volumes/ConditionTriggerVolumeBuilder.cs b/NewHorizons/Builder/Volumes/ConditionTriggerVolumeBuilder.cs index 2f9f270a..53815ce7 100644 --- a/NewHorizons/Builder/Volumes/ConditionTriggerVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/ConditionTriggerVolumeBuilder.cs @@ -8,7 +8,7 @@ namespace NewHorizons.Builder.Volumes { public static ConditionTriggerVolume Make(GameObject planetGO, Sector sector, ConditionTriggerVolumeInfo info) { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume.Condition = info.condition; volume.Persistent = info.persistent; diff --git a/NewHorizons/Builder/Volumes/CreditsVolumeBuilder.cs b/NewHorizons/Builder/Volumes/CreditsVolumeBuilder.cs index cd55f9da..1e80f435 100644 --- a/NewHorizons/Builder/Volumes/CreditsVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/CreditsVolumeBuilder.cs @@ -10,7 +10,7 @@ namespace NewHorizons.Builder.Volumes { public static LoadCreditsVolume Make(GameObject planetGO, Sector sector, LoadCreditsVolumeInfo info, IModBehaviour mod) { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume.gameOver = info.gameOver; volume.deathType = info.deathType == null ? null : EnumUtils.Parse(info.deathType.ToString(), DeathType.Default); diff --git a/NewHorizons/Builder/Volumes/DayNightAudioVolumeBuilder.cs b/NewHorizons/Builder/Volumes/DayNightAudioVolumeBuilder.cs index 875bba75..983aa1f1 100644 --- a/NewHorizons/Builder/Volumes/DayNightAudioVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/DayNightAudioVolumeBuilder.cs @@ -12,10 +12,10 @@ namespace NewHorizons.Builder.Volumes { public static NHDayNightAudioVolume Make(GameObject planetGO, Sector sector, DayNightAudioVolumeInfo info, IModBehaviour mod) { - var go = GeneralPropBuilder.MakeNew("DayNightAudioVolume", planetGO, sector, info); + var go = GeneralPropBuilder.MakeNew("DayNightAudioVolume", planetGO, ref sector, info); go.layer = Layer.AdvancedEffectVolume; - var audioVolume = PriorityVolumeBuilder.MakeExisting(go, planetGO, sector, info); + var audioVolume = PriorityVolumeBuilder.MakeExisting(go, planetGO, ref sector, info); audioVolume.sunName = info.sun; audioVolume.dayWindow = info.dayWindow; diff --git a/NewHorizons/Builder/Volumes/FluidVolumeBuilder.cs b/NewHorizons/Builder/Volumes/FluidVolumeBuilder.cs index 70b6d399..f7236dbd 100644 --- a/NewHorizons/Builder/Volumes/FluidVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/FluidVolumeBuilder.cs @@ -15,15 +15,15 @@ namespace NewHorizons.Builder.Volumes { case FluidVolume.Type.PLASMA: case FluidVolume.Type.WATER: - var radialVolume = PriorityVolumeBuilder.Make(planetGO, sector, info); + var radialVolume = PriorityVolumeBuilder.Make(planetGO, ref sector, info); radialVolume._radius = info.radius; volume = radialVolume; break; case FluidVolume.Type.CLOUD: - volume = PriorityVolumeBuilder.Make(planetGO, sector, info); + volume = PriorityVolumeBuilder.Make(planetGO, ref sector, info); break; default: - var sphericalVolume = PriorityVolumeBuilder.Make(planetGO, sector, info); + var sphericalVolume = PriorityVolumeBuilder.Make(planetGO, ref sector, info); sphericalVolume.radius = info.radius; volume = sphericalVolume; break; diff --git a/NewHorizons/Builder/Volumes/ForceVolumeBuilder.cs b/NewHorizons/Builder/Volumes/ForceVolumeBuilder.cs index ebc5c360..6682f934 100644 --- a/NewHorizons/Builder/Volumes/ForceVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/ForceVolumeBuilder.cs @@ -100,7 +100,7 @@ namespace NewHorizons.Builder.Volumes public static TVolume Make(GameObject planetGO, Sector sector, ForceVolumeInfo info) where TVolume : ForceVolume { - var forceVolume = PriorityVolumeBuilder.Make(planetGO, sector, info); + var forceVolume = PriorityVolumeBuilder.Make(planetGO, ref sector, info); forceVolume._alignmentPriority = info.alignmentPriority; forceVolume._inheritable = info.inheritable; diff --git a/NewHorizons/Builder/Volumes/HazardVolumeBuilder.cs b/NewHorizons/Builder/Volumes/HazardVolumeBuilder.cs index 1d5fe013..c0c6c3d3 100644 --- a/NewHorizons/Builder/Volumes/HazardVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/HazardVolumeBuilder.cs @@ -13,7 +13,7 @@ namespace NewHorizons.Builder.Volumes { public static HazardVolume Make(GameObject planetGO, Sector sector, OWRigidbody owrb, HazardVolumeInfo info, IModBehaviour mod) { - var go = GeneralPropBuilder.MakeNew("HazardVolume", planetGO, sector, info); + var go = GeneralPropBuilder.MakeNew("HazardVolume", planetGO, ref sector, info); var volume = MakeExisting(go, planetGO, sector, owrb, info); @@ -27,15 +27,15 @@ namespace NewHorizons.Builder.Volumes HazardVolume hazardVolume = null; if (info.type == HazardVolumeInfo.HazardType.RIVERHEAT) { - hazardVolume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); + hazardVolume = VolumeBuilder.MakeExisting(go, planetGO, ref sector, info); } else if (info.type == HazardVolumeInfo.HazardType.HEAT) { - hazardVolume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); + hazardVolume = VolumeBuilder.MakeExisting(go, planetGO, ref sector, info); } else if (info.type == HazardVolumeInfo.HazardType.DARKMATTER) { - hazardVolume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); + hazardVolume = VolumeBuilder.MakeExisting(go, planetGO, ref sector, info); var visorFrostEffectVolume = go.AddComponent(); visorFrostEffectVolume._frostRate = 0.5f; visorFrostEffectVolume._maxFrost = 0.91f; @@ -63,7 +63,7 @@ namespace NewHorizons.Builder.Volumes } else if (info.type == HazardVolumeInfo.HazardType.ELECTRICITY) { - var electricityVolume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); + var electricityVolume = VolumeBuilder.MakeExisting(go, planetGO, ref sector, info); electricityVolume._shockAudioPool = new OWAudioSource[0]; hazardVolume = electricityVolume; } diff --git a/NewHorizons/Builder/Volumes/InteractionVolumeBuilder.cs b/NewHorizons/Builder/Volumes/InteractionVolumeBuilder.cs index 2f5c0122..e70489aa 100644 --- a/NewHorizons/Builder/Volumes/InteractionVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/InteractionVolumeBuilder.cs @@ -20,7 +20,7 @@ namespace NewHorizons.Builder.Volumes info.shape.useShape = false; } - var receiver = VolumeBuilder.Make(planetGO, sector, info); + var receiver = VolumeBuilder.Make(planetGO, ref sector, info); receiver.gameObject.layer = Layer.Interactible; receiver._interactRange = info.range; diff --git a/NewHorizons/Builder/Volumes/NotificationVolumeBuilder.cs b/NewHorizons/Builder/Volumes/NotificationVolumeBuilder.cs index bf4bbe3f..331146b1 100644 --- a/NewHorizons/Builder/Volumes/NotificationVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/NotificationVolumeBuilder.cs @@ -11,7 +11,7 @@ namespace NewHorizons.Builder.Volumes { public static NHNotificationVolume Make(GameObject planetGO, Sector sector, NotificationVolumeInfo info, IModBehaviour mod) { - var notificationVolume = VolumeBuilder.Make(planetGO, sector, info); + var notificationVolume = VolumeBuilder.Make(planetGO, ref sector, info); // Preserving name for backwards compatibility notificationVolume.gameObject.name = string.IsNullOrEmpty(info.rename) ? "NotificationVolume" : info.rename; diff --git a/NewHorizons/Builder/Volumes/OxygenVolumeBuilder.cs b/NewHorizons/Builder/Volumes/OxygenVolumeBuilder.cs index bcd1aa77..aeb7c40d 100644 --- a/NewHorizons/Builder/Volumes/OxygenVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/OxygenVolumeBuilder.cs @@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes { public static OxygenVolume Make(GameObject planetGO, Sector sector, OxygenVolumeInfo info) { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume._treeVolume = info.treeVolume; volume._playRefillAudio = info.playRefillAudio; diff --git a/NewHorizons/Builder/Volumes/PriorityVolumeBuilder.cs b/NewHorizons/Builder/Volumes/PriorityVolumeBuilder.cs index fc76910f..ac968553 100644 --- a/NewHorizons/Builder/Volumes/PriorityVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/PriorityVolumeBuilder.cs @@ -1,13 +1,24 @@ using NewHorizons.External.Modules.Volumes.VolumeInfos; +using System; using UnityEngine; namespace NewHorizons.Builder.Volumes { public static class PriorityVolumeBuilder { + #region obsolete + // Changed to ref sector + [Obsolete] public static TVolume MakeExisting(GameObject go, GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume + => MakeExisting(go, planetGO, ref sector, info); + [Obsolete] + public static TVolume Make(GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume + => Make(planetGO, ref sector, info); + #endregion + + public static TVolume MakeExisting(GameObject go, GameObject planetGO, ref Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume { - var volume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); + var volume = VolumeBuilder.MakeExisting(go, planetGO, ref sector, info); volume._layer = info.layer; volume.SetPriority(info.priority); @@ -16,9 +27,9 @@ namespace NewHorizons.Builder.Volumes } - public static TVolume Make(GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume + public static TVolume Make(GameObject planetGO, ref Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume._layer = info.layer; volume.SetPriority(info.priority); diff --git a/NewHorizons/Builder/Volumes/RepairVolumeBuilder.cs b/NewHorizons/Builder/Volumes/RepairVolumeBuilder.cs index 7f51dc2c..a89c3c67 100644 --- a/NewHorizons/Builder/Volumes/RepairVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/RepairVolumeBuilder.cs @@ -17,7 +17,7 @@ namespace NewHorizons.Builder.Volumes { // Repair receivers aren't technically volumes (no OWTriggerVolume) so we don't use the VolumeBuilder - var go = GeneralPropBuilder.MakeNew("RepairVolume", planetGO, sector, info); + var go = GeneralPropBuilder.MakeNew("RepairVolume", planetGO, ref sector, info); if (info.shape != null) { diff --git a/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs b/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs index 988e9da8..a7c6bbcf 100644 --- a/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs +++ b/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs @@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.Rulesets { public static PlayerImpactRuleset Make(GameObject planetGO, Sector sector, RulesetModule.PlayerImpactRulesetInfo info) { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume.minImpactSpeed = info.minImpactSpeed; volume.maxImpactSpeed = info.maxImpactSpeed; diff --git a/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs b/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs index b0768324..0f1c9eca 100644 --- a/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs +++ b/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs @@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.Rulesets { public static ProbeRuleset Make(GameObject planetGO, Sector sector, RulesetModule.ProbeRulesetInfo info) { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume._overrideProbeSpeed = info.overrideProbeSpeed; volume._probeSpeedOverride = info.probeSpeed; diff --git a/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs b/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs index 5e158ecd..4dd7bb85 100644 --- a/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs +++ b/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs @@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.Rulesets { public static ThrustRuleset Make(GameObject planetGO, Sector sector, RulesetModule.ThrustRulesetInfo info) { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume._thrustLimit = info.thrustLimit; volume._nerfJetpackBooster = info.nerfJetpackBooster; diff --git a/NewHorizons/Builder/Volumes/SpeedLimiterVolumeBuilder.cs b/NewHorizons/Builder/Volumes/SpeedLimiterVolumeBuilder.cs index 0bd94b87..20ac0b00 100644 --- a/NewHorizons/Builder/Volumes/SpeedLimiterVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/SpeedLimiterVolumeBuilder.cs @@ -8,7 +8,7 @@ namespace NewHorizons.Builder.Volumes { public static SpeedLimiterVolume Make(GameObject planetGO, Sector sector, SpeedLimiterVolumeInfo info) { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume.maxSpeed = info.maxSpeed; volume.stoppingDistance = info.stoppingDistance; diff --git a/NewHorizons/Builder/Volumes/SpeedTrapVolumeBuilder.cs b/NewHorizons/Builder/Volumes/SpeedTrapVolumeBuilder.cs index 1b9319ed..080f2d1c 100644 --- a/NewHorizons/Builder/Volumes/SpeedTrapVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/SpeedTrapVolumeBuilder.cs @@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes { public static SpeedTrapVolume Make(GameObject planetGO, Sector sector, SpeedTrapVolumeInfo info) { - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); volume._speedLimit = info.speedLimit; volume._acceleration = info.acceleration; diff --git a/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs b/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs index cca70c4a..8296d9c0 100644 --- a/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs @@ -18,7 +18,7 @@ namespace NewHorizons.Builder.Volumes info.shape ??= new(); info.shape.useShape = false; - var volume = VolumeBuilder.Make(planetGO, sector, info); + var volume = VolumeBuilder.Make(planetGO, ref sector, info); var collider = volume.gameObject.GetComponent(); volume._collider = collider; diff --git a/NewHorizons/Builder/Volumes/VisorEffects/VisorFrostEffectVolumeBuilder.cs b/NewHorizons/Builder/Volumes/VisorEffects/VisorFrostEffectVolumeBuilder.cs index c33886e2..89057fde 100644 --- a/NewHorizons/Builder/Volumes/VisorEffects/VisorFrostEffectVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/VisorEffects/VisorFrostEffectVolumeBuilder.cs @@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.VisorEffects { public static VisorFrostEffectVolume Make(GameObject planetGO, Sector sector, VisorEffectModule.FrostEffectVolumeInfo info) { - var volume = PriorityVolumeBuilder.Make(planetGO, sector, info); + var volume = PriorityVolumeBuilder.Make(planetGO, ref sector, info); volume._frostRate = info.frostRate; volume._maxFrost = info.maxFrost; diff --git a/NewHorizons/Builder/Volumes/VisorEffects/VisorRainEffectVolumeBuilder.cs b/NewHorizons/Builder/Volumes/VisorEffects/VisorRainEffectVolumeBuilder.cs index 6f7c9c01..a78fd9a7 100644 --- a/NewHorizons/Builder/Volumes/VisorEffects/VisorRainEffectVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/VisorEffects/VisorRainEffectVolumeBuilder.cs @@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.VisorEffects { public static VisorRainEffectVolume Make(GameObject planetGO, Sector sector, VisorEffectModule.RainEffectVolumeInfo info) { - var volume = PriorityVolumeBuilder.Make(planetGO, sector, info); + var volume = PriorityVolumeBuilder.Make(planetGO, ref sector, info); volume._rainDirection = VisorRainEffectVolume.RainDirection.Radial; volume._dropletRate = info.dropletRate; diff --git a/NewHorizons/Builder/Volumes/VolumeBuilder.cs b/NewHorizons/Builder/Volumes/VolumeBuilder.cs index d9d28607..275a6e6f 100644 --- a/NewHorizons/Builder/Volumes/VolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/VolumeBuilder.cs @@ -2,13 +2,27 @@ using NewHorizons.Builder.Props; using NewHorizons.External.Modules.Volumes.VolumeInfos; using NewHorizons.Utility.OuterWilds; using NewHorizons.Utility.OWML; +using System; using UnityEngine; namespace NewHorizons.Builder.Volumes { public static class VolumeBuilder { + #region obsolete + // Changed to ref sector + [Obsolete] public static TVolume MakeExisting(GameObject go, GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour + => MakeExisting(go, planetGO, ref sector, info); + [Obsolete] + public static TVolume Make(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour + => Make(planetGO, ref sector, info); + // Intentionally not marking this one Obsolete because it's only used by VolumesBuildManager and would clutter that code + public static TVolume MakeAndEnable(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour + => MakeAndEnable(planetGO, ref sector, info); + #endregion + + public static TVolume MakeExisting(GameObject go, GameObject planetGO, ref Sector sector, VolumeInfo info) where TVolume : MonoBehaviour { // Backwards compat for the two possible radii settings // Both radii default to 1 @@ -45,15 +59,15 @@ namespace NewHorizons.Builder.Volumes return volume; } - public static TVolume Make(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour // Could be BaseVolume but I need to create vanilla volumes too. + public static TVolume Make(GameObject planetGO, ref Sector sector, VolumeInfo info) where TVolume : MonoBehaviour // Could be BaseVolume but I need to create vanilla volumes too. { - var go = GeneralPropBuilder.MakeNew(typeof(TVolume).Name, planetGO, sector, info); - return MakeExisting(go, planetGO, sector, info); + var go = GeneralPropBuilder.MakeNew(typeof(TVolume).Name, planetGO, ref sector, info); + return MakeExisting(go, planetGO, ref sector, info); } - public static TVolume MakeAndEnable(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour + public static TVolume MakeAndEnable(GameObject planetGO, ref Sector sector, VolumeInfo info) where TVolume : MonoBehaviour { - var volume = Make(planetGO, sector, info); + var volume = Make(planetGO, ref sector, info); volume.gameObject.SetActive(true); return volume; } diff --git a/NewHorizons/Builder/Volumes/ZeroGVolumeBuilder.cs b/NewHorizons/Builder/Volumes/ZeroGVolumeBuilder.cs index 70ecc7e1..562ed902 100644 --- a/NewHorizons/Builder/Volumes/ZeroGVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/ZeroGVolumeBuilder.cs @@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes { public static ZeroGVolume Make(GameObject planetGO, Sector sector, PriorityVolumeInfo info) { - var volume = PriorityVolumeBuilder.Make(planetGO, sector, info); + var volume = PriorityVolumeBuilder.Make(planetGO, ref sector, info); volume._inheritable = true; diff --git a/NewHorizons/External/Modules/GeneralPropInfo.cs b/NewHorizons/External/Modules/GeneralPropInfo.cs index ebe39ac1..fd6836cd 100644 --- a/NewHorizons/External/Modules/GeneralPropInfo.cs +++ b/NewHorizons/External/Modules/GeneralPropInfo.cs @@ -8,10 +8,15 @@ namespace NewHorizons.External.Modules public abstract class BasePropInfo { /// - /// The relative path from the planet to the parent of this object. Optional (will default to the root sector). + /// The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector). /// public string parentPath; + /// + /// The relative path from the planet to the sector that this object will be linked to. The special value "auto" will use the most specific sector in the parent path. Optional (will default to the planet's root sector). + /// + public string sectorPath; + /// /// An optional rename of this object /// diff --git a/NewHorizons/Handlers/HeldItemHandler.cs b/NewHorizons/Handlers/HeldItemHandler.cs index 5ff7e5bb..8aa693d2 100644 --- a/NewHorizons/Handlers/HeldItemHandler.cs +++ b/NewHorizons/Handlers/HeldItemHandler.cs @@ -68,7 +68,8 @@ public static class HeldItemHandler var tempParent = new GameObject(); tempParent.transform.position = new Vector3(100000, 0, 0); - var newObject = DetailBuilder.Make(tempParent, tempParent.AddComponent(), null, go, new DetailInfo() { keepLoaded = true }); + var sector = tempParent.AddComponent(); + var newObject = DetailBuilder.Make(tempParent, ref sector, null, go, new DetailInfo() { keepLoaded = true }); newObject.SetActive(false); newObject.transform.parent = null; newObject.name = go.name; diff --git a/NewHorizons/Handlers/TitleSceneHandler.cs b/NewHorizons/Handlers/TitleSceneHandler.cs index 7183675f..125c438c 100644 --- a/NewHorizons/Handlers/TitleSceneHandler.cs +++ b/NewHorizons/Handlers/TitleSceneHandler.cs @@ -184,7 +184,8 @@ namespace NewHorizons.Handlers { foreach (var simplifiedDetail in config.Background.details) { - DetailBuilder.Make(background, background.GetComponentInParent(), mod, new DetailInfo(simplifiedDetail)); + var sector = background.GetComponentInParent(); + DetailBuilder.Make(background, ref sector, mod, new DetailInfo(simplifiedDetail)); } } @@ -203,7 +204,8 @@ namespace NewHorizons.Handlers { foreach (var simplifiedDetail in config.MenuPlanet.details) { - DetailBuilder.Make(menuPlanet, menuPlanet.GetComponentInParent(), mod, new DetailInfo(simplifiedDetail)); + var sector = menuPlanet.GetComponentInParent(); + DetailBuilder.Make(menuPlanet, ref sector, mod, new DetailInfo(simplifiedDetail)); } } diff --git a/NewHorizons/Handlers/VesselWarpHandler.cs b/NewHorizons/Handlers/VesselWarpHandler.cs index 87f8d1ad..8f1b1554 100644 --- a/NewHorizons/Handlers/VesselWarpHandler.cs +++ b/NewHorizons/Handlers/VesselWarpHandler.cs @@ -150,12 +150,14 @@ namespace NewHorizons.Handlers if (VesselPrefab == null) return null; NHLogger.LogVerbose("Creating Vessel"); - var vesselObject = GeneralPropBuilder.MakeFromPrefab(VesselPrefab, VesselPrefab.name, null, null, system.Config.Vessel?.vesselSpawn); + Sector sector = null; + var vesselObject = GeneralPropBuilder.MakeFromPrefab(VesselPrefab, VesselPrefab.name, null, ref sector, system.Config.Vessel?.vesselSpawn); VesselObject = vesselObject; + sector = vesselObject.GetComponentInChildren(true); var vesselAO = vesselObject.AddComponent(); vesselAO._owRigidbody = vesselObject.GetComponent(); - vesselAO._rootSector = vesselObject.GetComponentInChildren(true); + vesselAO._rootSector = sector; vesselAO._customName = "Vessel"; vesselAO._name = AstroObject.Name.CustomString; vesselAO._type = AstroObject.Type.SpaceStation; @@ -248,7 +250,8 @@ namespace NewHorizons.Handlers var attachWarpExitToVessel = system.Config.Vessel?.warpExit?.attachToVessel ?? false; var warpExitParent = vesselWarpController._targetWarpPlatform.transform.parent; - var warpExit = GeneralPropBuilder.MakeFromExisting(vesselWarpController._targetWarpPlatform.gameObject, planetGO, null, system.Config.Vessel?.warpExit, defaultParent: attachWarpExitToVessel ? warpExitParent : null); + Sector warpExitSector = null; + var warpExit = GeneralPropBuilder.MakeFromExisting(vesselWarpController._targetWarpPlatform.gameObject, planetGO, ref warpExitSector, system.Config.Vessel?.warpExit, defaultParent: attachWarpExitToVessel ? warpExitParent : null); if (attachWarpExitToVessel) { warpExit.transform.parent = warpExitParent; diff --git a/NewHorizons/NewHorizonsApi.cs b/NewHorizons/NewHorizonsApi.cs index e62d0bdb..f849cf45 100644 --- a/NewHorizons/NewHorizonsApi.cs +++ b/NewHorizons/NewHorizonsApi.cs @@ -209,7 +209,7 @@ namespace NewHorizons scale = scale, alignRadial = alignRadial }; - return DetailBuilder.Make(planet, sector, mod, prefab, detailInfo); + return DetailBuilder.Make(planet, ref sector, mod, prefab, detailInfo); } public AudioSignal SpawnSignal(IModBehaviour mod, GameObject root, string audio, string name, string frequency,