diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 86dcf826..f8c1380f 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -47,17 +47,6 @@ namespace NewHorizons.Builder.Props } } } - if (config.Props.scatter != null) - { - try - { - ScatterBuilder.Make(go, sector, config, mod); - } - catch (Exception ex) - { - NHLogger.LogError($"Couldn't make planet scatter for [{go.name}]:\n{ex}"); - } - } if (config.Props.details != null) { foreach (var detail in config.Props.details) @@ -72,6 +61,17 @@ namespace NewHorizons.Builder.Props } } } + if (config.Props.scatter != null) + { + try + { + ScatterBuilder.Make(go, sector, config, mod); + } + catch (Exception ex) + { + NHLogger.LogError($"Couldn't make planet scatter for [{go.name}]:\n{ex}"); + } + } if (config.Props.geysers != null) { foreach (var geyserInfo in config.Props.geysers) diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index e725bf8a..862f0629 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -3,6 +3,7 @@ using NewHorizons.External.Modules.Props; using NewHorizons.Utility; using NewHorizons.Utility.Files; using NewHorizons.Utility.Geometry; +using NewHorizons.Utility.OWML; using OWML.Common; using System; using System.Collections.Generic; @@ -120,10 +121,28 @@ namespace NewHorizons.Builder.Props } } + + var parent = sector?.transform ?? go.transform; + + if (go != null && !string.IsNullOrEmpty(propInfo.parentPath)) + { + var newParent = go.transform.Find(propInfo.parentPath); + if (newParent != null) + { + parent = newParent; + sector = newParent.GetComponentInParent(); + } + else + { + NHLogger.LogError($"Cannot find parent object at path: {go.name}/{propInfo.parentPath}"); + } + } + var prop = scatterPrefab.InstantiateInactive(); - prop.transform.SetParent(sector?.transform ?? go.transform); - prop.transform.localPosition = go.transform.TransformPoint(point * height); - var up = go.transform.InverseTransformPoint(prop.transform.position).normalized; + // Have to use SetParent method to work with tidally locked bodies #872 + prop.transform.SetParent(parent, false); + prop.transform.localPosition = point * height; + var up = (prop.transform.position - go.transform.position).normalized; prop.transform.rotation = Quaternion.FromToRotation(Vector3.up, up); if (propInfo.offset != null) prop.transform.localPosition += prop.transform.TransformVector(propInfo.offset); diff --git a/NewHorizons/External/Modules/Props/ScatterInfo.cs b/NewHorizons/External/Modules/Props/ScatterInfo.cs index b53cd4e8..a03b2003 100644 --- a/NewHorizons/External/Modules/Props/ScatterInfo.cs +++ b/NewHorizons/External/Modules/Props/ScatterInfo.cs @@ -66,5 +66,10 @@ namespace NewHorizons.External.Modules.Props /// Should this detail stay loaded even if you're outside the sector (good for very large props) /// public bool keepLoaded; + + /// + /// The relative path from the planet to the parent of this object. Optional (will default to the root sector). This parent should be at the position where you'd like to scatter (which would usually be zero). + /// + public string parentPath; } } diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index 3e9321e8..b679d7d3 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -2046,6 +2046,10 @@ "keepLoaded": { "type": "boolean", "description": "Should this detail stay loaded even if you're outside the sector (good for very large props)" + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector). This parent should be at the position where you'd like to scatter (which would usually be zero)." } } },