Compare commits

...

6 Commits

Author SHA1 Message Date
xen-42
bd5b3b94bd
Prop Sector Paths (#1117)
## Minor features

- Added `sectorPath` to most props to allow specifying a sector other
than the planet's root sector for the purposes of culling and other
sector behavior. The special value `"auto"` finds the first sector in
the prop's parent hierarchy.
2025-11-29 19:07:05 -05:00
Joshua Thome
453049bc1a
Merge branch 'dev' into hawkbar-sector-paths 2025-11-27 11:05:06 -06:00
Joshua Thome
5a90360b43 Merge branch 'hawkbar-sector-paths' of https://github.com/Outer-Wilds-New-Horizons/new-horizons into hawkbar-sector-paths 2025-08-11 19:10:00 -05:00
Joshua Thome
edde8eecb2 Tidying up some awkward patterns 2025-08-11 19:09:51 -05:00
Ben C
0b220b5abd Updated Schemas 2025-08-11 20:51:13 +00:00
Joshua Thome
bb390c5715 Add sectorPath and update all builders to accommodate sector ref 2025-08-11 15:50:11 -05:00
64 changed files with 630 additions and 215 deletions

View File

@ -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();

View File

@ -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);
}
}

View File

@ -145,7 +145,8 @@ namespace NewHorizons.Builder.Body
var sphereCollider = blackHoleVolume.GetComponent<SphereCollider>();
// Shouldn't ever be null but doesn't hurt ig
var loadRadius = sphereCollider == null ? 100f : sphereCollider.radius + 50f;
var streamingVolume = VolumeBuilder.Make<StreamingWarpVolume>(blackHoleVolume.GetAttachedOWRigidbody().gameObject, blackHoleVolume.GetComponentInParent<Sector>(),
var blackHoleSector = blackHoleVolume.GetComponentInParent<Sector>();
var streamingVolume = VolumeBuilder.Make<StreamingWarpVolume>(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);

View File

@ -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<SpawnPoint>();
@ -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<SpawnPoint>();

View File

@ -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<AudioSource>();

View File

@ -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<Collider>(true))
{
collider.enabled = true;
@ -428,6 +428,7 @@ namespace NewHorizons.Builder.Props
var signalConfigCopy = JsonConvert.DeserializeObject<SignalInfo>(JsonConvert.SerializeObject(signalConfig));
signalConfigCopy.parentPath = null;
signalConfigCopy.isRelativeToParent = false;
signalConfigCopy.sectorPath = null;
var signalGO = SignalBuilder.Make(go, sector, signalConfigCopy, mod);
signalGO.GetComponent<AudioSignal>()._identificationDistance = 0;

View File

@ -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<DetailInfo, GameObject> _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
/// <summary>
/// Create a detail using an asset bundle or a path in the scene hierarchy of the item to copy.
/// </summary>
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);
}
}
/// <summary>
/// Create a detail using a prefab.
/// </summary>
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));
}
}

View File

@ -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<RemoteDialogueTrigger>();
var sphereCollider = conversationTrigger.AddComponent<SphereCollider>();
@ -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,28 +345,38 @@ namespace NewHorizons.Builder.Props
{
if (info.attentionPoint != null)
{
var ptGo = GeneralPropBuilder.MakeNew("AttentionPoint", go, sector, info.attentionPoint, defaultParent: dialogue.transform);
dialogue._attentionPoint = ptGo.transform;
dialogue._attentionPointOffset = info.attentionPoint.offset ?? Vector3.zero;
ptGo.SetActive(true);
MakeAttentionPoint(go, sector, dialogue, info.attentionPoint);
}
if (info.swappedAttentionPoints != null && info.swappedAttentionPoints.Length > 0)
{
foreach (var pointInfo in info.swappedAttentionPoints)
{
var ptGo = GeneralPropBuilder.MakeNew($"AttentionPoint_{pointInfo.dialogueNode}_{pointInfo.dialoguePage}", go, sector, pointInfo, defaultParent: dialogue.transform);
var swapper = ptGo.AddComponent<DialogueAttentionPointSwapper>();
swapper._dialogueTree = dialogue;
swapper._attentionPoint = ptGo.transform;
swapper._attentionPointOffset = pointInfo.offset ?? Vector3.zero;
swapper._nodeName = pointInfo.dialogueNode;
swapper._dialoguePage = pointInfo.dialoguePage;
swapper._lookEasing = pointInfo.lookEasing;
ptGo.SetActive(true);
MakeSwappedAttentionPoint(go, sector, dialogue, pointInfo);
}
}
}
private static void MakeAttentionPoint(GameObject go, Sector sector, CharacterDialogueTree dialogue, AttentionPointInfo info)
{
var ptGo = GeneralPropBuilder.MakeNew("AttentionPoint", go, ref sector, info, defaultParent: dialogue.transform);
dialogue._attentionPoint = ptGo.transform;
dialogue._attentionPointOffset = info.offset ?? Vector3.zero;
ptGo.SetActive(true);
}
private static void MakeSwappedAttentionPoint(GameObject go, Sector sector, CharacterDialogueTree dialogue, SwappedAttentionPointInfo info)
{
var ptGo = GeneralPropBuilder.MakeNew($"AttentionPoint_{info.dialogueNode}_{info.dialoguePage}", go, ref sector, info, defaultParent: dialogue.transform);
var swapper = ptGo.AddComponent<DialogueAttentionPointSwapper>();
swapper._dialogueTree = dialogue;
swapper._attentionPoint = ptGo.transform;
swapper._attentionPointOffset = info.offset ?? Vector3.zero;
swapper._nodeName = info.dialogueNode;
swapper._dialoguePage = info.dialoguePage;
swapper._lookEasing = info.lookEasing;
ptGo.SetActive(true);
}
private static void MakePlayerTrackingZone(GameObject go, CharacterDialogueTree dialogue, DialogueInfo info)
{
var character = go.transform.Find(info.pathToAnimController);

View File

@ -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>();
alarmTotem._sightAngle = info.sightAngle;

View File

@ -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);

View File

@ -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<DreamCampfire>();
campfire._dreamArrivalLocation = DreamHandler.GetDreamArrivalLocation(info.id);

View File

@ -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<DreamCandle>();

View File

@ -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<LanternZoomPoint>();
zoomPoint._minActivationDistance = info.minDistance;

View File

@ -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<Sector>();
peephole._viewingSector = viewingSector;
}, 2);

View File

@ -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<DreamObjectProjector>();

View File

@ -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);

View File

@ -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<RaftDock>();

View File

@ -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<TravelerEyeController>();
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<AudioSignal>();
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<InstrumentZone>();

View File

@ -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<Sector>();
}
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<Sector>();
}
else
{
var newSectorObj = planetGO.transform.Find(info.sectorPath);
if (newSectorObj != null)
{
var newSector = newSectorObj.GetComponent<Sector>();
if (newSector != null)
{
return newSector;
}
}
NHLogger.LogError($"Cannot find sector at path: {planetGO.name}/{info.sectorPath}");
return sector;
}
}
}
}

View File

@ -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;

View File

@ -65,8 +65,10 @@ namespace NewHorizons.Builder.Props
if (_interfacePrefab == null || planetGO == null || sector == null || _detailedPlatformPrefab == null || _platformPrefab == null) return null;
var planetSector = sector;
var detailInfo = new DetailInfo(info.controls) { keepLoaded = true };
var gravityCannonObject = DetailBuilder.Make(planetGO, sector, mod, _interfacePrefab, detailInfo);
var gravityCannonObject = DetailBuilder.Make(planetGO, ref sector, mod, _interfacePrefab, detailInfo);
gravityCannonObject.SetActive(false);
var gravityCannonController = gravityCannonObject.GetComponent<GravityCannonController>();
@ -77,14 +79,14 @@ namespace NewHorizons.Builder.Props
gravityCannonController._retrieveShipLogFact = info.retrieveReveal ?? string.Empty;
gravityCannonController._launchShipLogFact = info.launchReveal ?? string.Empty;
CreatePlatform(planetGO, sector, mod, gravityCannonController, info);
CreatePlatform(planetGO, planetSector, mod, gravityCannonController, info);
if (info.computer != null)
{
// Do it next update so that the shuttle has been made
Delay.FireOnNextUpdate(() =>
{
gravityCannonController._nomaiComputer = CreateComputer(planetGO, sector, info.computer, id);
gravityCannonController._nomaiComputer = CreateComputer(planetGO, planetSector, info.computer, id);
});
}
else
@ -122,7 +124,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<DirectionalForceVolume>();
gravityCannonController._platformTrigger = platform.FindChild("PlatformTrigger").GetComponent<OWTriggerVolume>();

View File

@ -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;
}

View File

@ -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<SlideReelItem>();
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<AutoSlideProjector>();
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)
{

View File

@ -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<GameObject>("Prefab_EYE_QuantumLightningObject"), new DetailInfo(quantumGroup));
var lightning = DetailBuilder.Make(planetGO, ref sector, Main.Instance, AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset<GameObject>("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<QuantumSocket>();
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);

View File

@ -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<SharedStone>()._connectedPlatform = id;

View File

@ -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++)
{

View File

@ -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);

View File

@ -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();

View File

@ -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<NomaiComputer>();
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<NomaiVesselComputer>();
@ -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<NomaiText>();
@ -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))

View File

@ -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>();
meteorLauncher._audioSector = sector;

View File

@ -92,8 +92,9 @@ namespace NewHorizons.Builder.Props
public static void Make(GameObject planetGO, Sector sector, IModBehaviour mod, NomaiWarpReceiverInfo info)
{
var planetSector = sector;
var detailInfo = new DetailInfo(info);
var receiverObject = DetailBuilder.Make(planetGO, sector, mod, info.detailed ? _detailedReceiverPrefab : _receiverPrefab, detailInfo);
var receiverObject = DetailBuilder.Make(planetGO, ref sector, mod, info.detailed ? _detailedReceiverPrefab : _receiverPrefab, detailInfo);
NHLogger.Log($"Position is {detailInfo.position} was {info.position}");
@ -126,13 +127,13 @@ namespace NewHorizons.Builder.Props
if (info.computer != null)
{
CreateComputer(planetGO, sector, mod, info.computer, receiver);
CreateComputer(planetGO, planetSector, mod, info.computer, receiver);
}
}
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<NomaiWarpTransmitter>();
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<NomaiComputer>();
computer.SetSector(sector);

View File

@ -11,7 +11,7 @@ namespace NewHorizons.Builder.ShipLog
private static readonly List<ShipLogEntryLocation> _locationsToInitialize = new List<ShipLogEntryLocation>();
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<ShipLogEntryLocation>();
newLocation._entryID = info.id;

View File

@ -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:

View File

@ -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<AudioSource>();
@ -25,7 +25,7 @@ namespace NewHorizons.Builder.Volumes
owAudioSource.SetTrack(info.track.ConvertToOW());
AudioUtilities.SetAudioClip(owAudioSource, info.audio, mod);
var audioVolume = PriorityVolumeBuilder.MakeExisting<AudioVolume>(go, planetGO, sector, info);
var audioVolume = PriorityVolumeBuilder.MakeExisting<AudioVolume>(go, planetGO, ref sector, info);
audioVolume._layer = info.layer;
audioVolume.SetPriority(info.priority);

View File

@ -8,7 +8,7 @@ namespace NewHorizons.Builder.Volumes
{
public static WarpVolume Make(GameObject planetGO, Sector sector, ChangeStarSystemVolumeInfo info)
{
var volume = VolumeBuilder.Make<WarpVolume>(planetGO, sector, info);
var volume = VolumeBuilder.Make<WarpVolume>(planetGO, ref sector, info);
volume.TargetSolarSystem = info.targetStarSystem;
volume.TargetSpawnID = info.spawnPointID;

View File

@ -8,7 +8,7 @@ namespace NewHorizons.Builder.Volumes
{
public static ConditionTriggerVolume Make(GameObject planetGO, Sector sector, ConditionTriggerVolumeInfo info)
{
var volume = VolumeBuilder.Make<ConditionTriggerVolume>(planetGO, sector, info);
var volume = VolumeBuilder.Make<ConditionTriggerVolume>(planetGO, ref sector, info);
volume.Condition = info.condition;
volume.Persistent = info.persistent;

View File

@ -10,7 +10,7 @@ namespace NewHorizons.Builder.Volumes
{
public static LoadCreditsVolume Make(GameObject planetGO, Sector sector, LoadCreditsVolumeInfo info, IModBehaviour mod)
{
var volume = VolumeBuilder.Make<LoadCreditsVolume>(planetGO, sector, info);
var volume = VolumeBuilder.Make<LoadCreditsVolume>(planetGO, ref sector, info);
volume.gameOver = info.gameOver;
volume.deathType = info.deathType == null ? null : EnumUtils.Parse(info.deathType.ToString(), DeathType.Default);

View File

@ -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<NHDayNightAudioVolume>(go, planetGO, sector, info);
var audioVolume = PriorityVolumeBuilder.MakeExisting<NHDayNightAudioVolume>(go, planetGO, ref sector, info);
audioVolume.sunName = info.sun;
audioVolume.dayWindow = info.dayWindow;

View File

@ -15,15 +15,15 @@ namespace NewHorizons.Builder.Volumes
{
case FluidVolume.Type.PLASMA:
case FluidVolume.Type.WATER:
var radialVolume = PriorityVolumeBuilder.Make<RadialFluidVolume>(planetGO, sector, info);
var radialVolume = PriorityVolumeBuilder.Make<RadialFluidVolume>(planetGO, ref sector, info);
radialVolume._radius = info.radius;
volume = radialVolume;
break;
case FluidVolume.Type.CLOUD:
volume = PriorityVolumeBuilder.Make<CloudLayerFluidVolume>(planetGO, sector, info);
volume = PriorityVolumeBuilder.Make<CloudLayerFluidVolume>(planetGO, ref sector, info);
break;
default:
var sphericalVolume = PriorityVolumeBuilder.Make<SphericalFluidVolume>(planetGO, sector, info);
var sphericalVolume = PriorityVolumeBuilder.Make<SphericalFluidVolume>(planetGO, ref sector, info);
sphericalVolume.radius = info.radius;
volume = sphericalVolume;
break;

View File

@ -100,7 +100,7 @@ namespace NewHorizons.Builder.Volumes
public static TVolume Make<TVolume>(GameObject planetGO, Sector sector, ForceVolumeInfo info) where TVolume : ForceVolume
{
var forceVolume = PriorityVolumeBuilder.Make<TVolume>(planetGO, sector, info);
var forceVolume = PriorityVolumeBuilder.Make<TVolume>(planetGO, ref sector, info);
forceVolume._alignmentPriority = info.alignmentPriority;
forceVolume._inheritable = info.inheritable;

View File

@ -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<RiverHeatHazardVolume>(go, planetGO, sector, info);
hazardVolume = VolumeBuilder.MakeExisting<RiverHeatHazardVolume>(go, planetGO, ref sector, info);
}
else if (info.type == HazardVolumeInfo.HazardType.HEAT)
{
hazardVolume = VolumeBuilder.MakeExisting<HeatHazardVolume>(go, planetGO, sector, info);
hazardVolume = VolumeBuilder.MakeExisting<HeatHazardVolume>(go, planetGO, ref sector, info);
}
else if (info.type == HazardVolumeInfo.HazardType.DARKMATTER)
{
hazardVolume = VolumeBuilder.MakeExisting<DarkMatterVolume>(go, planetGO, sector, info);
hazardVolume = VolumeBuilder.MakeExisting<DarkMatterVolume>(go, planetGO, ref sector, info);
var visorFrostEffectVolume = go.AddComponent<VisorFrostEffectVolume>();
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<ElectricityVolume>(go, planetGO, sector, info);
var electricityVolume = VolumeBuilder.MakeExisting<ElectricityVolume>(go, planetGO, ref sector, info);
electricityVolume._shockAudioPool = new OWAudioSource[0];
hazardVolume = electricityVolume;
}

View File

@ -24,7 +24,7 @@ namespace NewHorizons.Builder.Volumes
info.shape ??= new();
info.shape.useShape = false;
var receiver = VolumeBuilder.Make<InteractReceiver>(planetGO, sector, info);
var receiver = VolumeBuilder.Make<InteractReceiver>(planetGO, ref sector, info);
receiver.gameObject.layer = Layer.Interactible;
receiver._interactRange = info.range;

View File

@ -11,7 +11,7 @@ namespace NewHorizons.Builder.Volumes
{
public static NHNotificationVolume Make(GameObject planetGO, Sector sector, NotificationVolumeInfo info, IModBehaviour mod)
{
var notificationVolume = VolumeBuilder.Make<NHNotificationVolume>(planetGO, sector, info);
var notificationVolume = VolumeBuilder.Make<NHNotificationVolume>(planetGO, ref sector, info);
// Preserving name for backwards compatibility
notificationVolume.gameObject.name = string.IsNullOrEmpty(info.rename) ? "NotificationVolume" : info.rename;

View File

@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes
{
public static OxygenVolume Make(GameObject planetGO, Sector sector, OxygenVolumeInfo info)
{
var volume = VolumeBuilder.Make<OxygenVolume>(planetGO, sector, info);
var volume = VolumeBuilder.Make<OxygenVolume>(planetGO, ref sector, info);
volume._treeVolume = info.treeVolume;
volume._playRefillAudio = info.playRefillAudio;

View File

@ -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<TVolume>(GameObject go, GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume
=> MakeExisting<TVolume>(go, planetGO, ref sector, info);
[Obsolete]
public static TVolume Make<TVolume>(GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume
=> Make<TVolume>(planetGO, ref sector, info);
#endregion
public static TVolume MakeExisting<TVolume>(GameObject go, GameObject planetGO, ref Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume
{
var volume = VolumeBuilder.MakeExisting<TVolume>(go, planetGO, sector, info);
var volume = VolumeBuilder.MakeExisting<TVolume>(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<TVolume>(GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume
public static TVolume Make<TVolume>(GameObject planetGO, ref Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume
{
var volume = VolumeBuilder.Make<TVolume>(planetGO, sector, info);
var volume = VolumeBuilder.Make<TVolume>(planetGO, ref sector, info);
volume._layer = info.layer;
volume.SetPriority(info.priority);

View File

@ -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)
{

View File

@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.Rulesets
{
public static PlayerImpactRuleset Make(GameObject planetGO, Sector sector, RulesetModule.PlayerImpactRulesetInfo info)
{
var volume = VolumeBuilder.Make<PlayerImpactRuleset>(planetGO, sector, info);
var volume = VolumeBuilder.Make<PlayerImpactRuleset>(planetGO, ref sector, info);
volume.minImpactSpeed = info.minImpactSpeed;
volume.maxImpactSpeed = info.maxImpactSpeed;

View File

@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.Rulesets
{
public static ProbeRuleset Make(GameObject planetGO, Sector sector, RulesetModule.ProbeRulesetInfo info)
{
var volume = VolumeBuilder.Make<ProbeRuleset>(planetGO, sector, info);
var volume = VolumeBuilder.Make<ProbeRuleset>(planetGO, ref sector, info);
volume._overrideProbeSpeed = info.overrideProbeSpeed;
volume._probeSpeedOverride = info.probeSpeed;

View File

@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.Rulesets
{
public static ThrustRuleset Make(GameObject planetGO, Sector sector, RulesetModule.ThrustRulesetInfo info)
{
var volume = VolumeBuilder.Make<ThrustRuleset>(planetGO, sector, info);
var volume = VolumeBuilder.Make<ThrustRuleset>(planetGO, ref sector, info);
volume._thrustLimit = info.thrustLimit;
volume._nerfJetpackBooster = info.nerfJetpackBooster;

View File

@ -8,7 +8,7 @@ namespace NewHorizons.Builder.Volumes
{
public static SpeedLimiterVolume Make(GameObject planetGO, Sector sector, SpeedLimiterVolumeInfo info)
{
var volume = VolumeBuilder.Make<SpeedLimiterVolume>(planetGO, sector, info);
var volume = VolumeBuilder.Make<SpeedLimiterVolume>(planetGO, ref sector, info);
volume.maxSpeed = info.maxSpeed;
volume.stoppingDistance = info.stoppingDistance;

View File

@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes
{
public static SpeedTrapVolume Make(GameObject planetGO, Sector sector, SpeedTrapVolumeInfo info)
{
var volume = VolumeBuilder.Make<SpeedTrapVolume>(planetGO, sector, info);
var volume = VolumeBuilder.Make<SpeedTrapVolume>(planetGO, ref sector, info);
volume._speedLimit = info.speedLimit;
volume._acceleration = info.acceleration;

View File

@ -18,7 +18,7 @@ namespace NewHorizons.Builder.Volumes
info.shape ??= new();
info.shape.useShape = false;
var volume = VolumeBuilder.Make<TVolume>(planetGO, sector, info);
var volume = VolumeBuilder.Make<TVolume>(planetGO, ref sector, info);
var collider = volume.gameObject.GetComponent<Collider>();
volume._collider = collider;

View File

@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.VisorEffects
{
public static VisorFrostEffectVolume Make(GameObject planetGO, Sector sector, VisorEffectModule.FrostEffectVolumeInfo info)
{
var volume = PriorityVolumeBuilder.Make<VisorFrostEffectVolume>(planetGO, sector, info);
var volume = PriorityVolumeBuilder.Make<VisorFrostEffectVolume>(planetGO, ref sector, info);
volume._frostRate = info.frostRate;
volume._maxFrost = info.maxFrost;

View File

@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes.VisorEffects
{
public static VisorRainEffectVolume Make(GameObject planetGO, Sector sector, VisorEffectModule.RainEffectVolumeInfo info)
{
var volume = PriorityVolumeBuilder.Make<VisorRainEffectVolume>(planetGO, sector, info);
var volume = PriorityVolumeBuilder.Make<VisorRainEffectVolume>(planetGO, ref sector, info);
volume._rainDirection = VisorRainEffectVolume.RainDirection.Radial;
volume._dropletRate = info.dropletRate;

View File

@ -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<TVolume>(GameObject go, GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour
=> MakeExisting<TVolume>(go, planetGO, ref sector, info);
[Obsolete]
public static TVolume Make<TVolume>(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour
=> Make<TVolume>(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<TVolume>(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour
=> MakeAndEnable<TVolume>(planetGO, ref sector, info);
#endregion
public static TVolume MakeExisting<TVolume>(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<TVolume>(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour // Could be BaseVolume but I need to create vanilla volumes too.
public static TVolume Make<TVolume>(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<TVolume>(go, planetGO, sector, info);
var go = GeneralPropBuilder.MakeNew(typeof(TVolume).Name, planetGO, ref sector, info);
return MakeExisting<TVolume>(go, planetGO, ref sector, info);
}
public static TVolume MakeAndEnable<TVolume>(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour
public static TVolume MakeAndEnable<TVolume>(GameObject planetGO, ref Sector sector, VolumeInfo info) where TVolume : MonoBehaviour
{
var volume = Make<TVolume>(planetGO, sector, info);
var volume = Make<TVolume>(planetGO, ref sector, info);
volume.gameObject.SetActive(true);
return volume;
}

View File

@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Volumes
{
public static ZeroGVolume Make(GameObject planetGO, Sector sector, PriorityVolumeInfo info)
{
var volume = PriorityVolumeBuilder.Make<ZeroGVolume>(planetGO, sector, info);
var volume = PriorityVolumeBuilder.Make<ZeroGVolume>(planetGO, ref sector, info);
volume._inheritable = true;

View File

@ -8,10 +8,15 @@ namespace NewHorizons.External.Modules
public abstract class BasePropInfo
{
/// <summary>
/// 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).
/// </summary>
public string parentPath;
/// <summary>
/// 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).
/// </summary>
public string sectorPath;
/// <summary>
/// An optional rename of this object
/// </summary>

View File

@ -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<Sector>(), null, go, new DetailInfo() { keepLoaded = true });
var sector = tempParent.AddComponent<Sector>();
var newObject = DetailBuilder.Make(tempParent, ref sector, null, go, new DetailInfo() { keepLoaded = true });
newObject.SetActive(false);
newObject.transform.parent = null;
newObject.name = go.name;

View File

@ -184,7 +184,8 @@ namespace NewHorizons.Handlers
{
foreach (var simplifiedDetail in config.Background.details)
{
DetailBuilder.Make(background, background.GetComponentInParent<Sector>(), mod, new DetailInfo(simplifiedDetail));
var sector = background.GetComponentInParent<Sector>();
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<Sector>(), mod, new DetailInfo(simplifiedDetail));
var sector = menuPlanet.GetComponentInParent<Sector>();
DetailBuilder.Make(menuPlanet, ref sector, mod, new DetailInfo(simplifiedDetail));
}
}

View File

@ -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<Sector>(true);
var vesselAO = vesselObject.AddComponent<EyeAstroObject>();
vesselAO._owRigidbody = vesselObject.GetComponent<OWRigidbody>();
vesselAO._rootSector = vesselObject.GetComponentInChildren<Sector>(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;

View File

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

View File

@ -802,7 +802,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -1046,7 +1050,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -1215,7 +1223,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -1313,7 +1325,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -1376,7 +1392,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -1450,7 +1470,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -1480,7 +1504,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -1517,7 +1545,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -1674,7 +1706,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -1790,7 +1826,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -2448,7 +2488,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -2520,7 +2564,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -2561,7 +2609,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -2640,7 +2692,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -2809,7 +2865,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -2856,7 +2916,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -2960,7 +3024,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3167,7 +3235,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3335,7 +3407,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3405,7 +3481,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3529,7 +3609,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3608,7 +3692,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3654,7 +3742,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3691,7 +3783,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3736,7 +3832,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3773,7 +3873,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3826,7 +3930,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3904,7 +4012,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3951,7 +4063,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -3995,7 +4111,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4134,7 +4254,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4177,7 +4301,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4246,7 +4374,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4286,7 +4418,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4323,7 +4459,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4364,7 +4504,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4421,7 +4565,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4470,7 +4618,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4524,7 +4676,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4557,7 +4713,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -4651,7 +4811,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -5018,7 +5182,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -5075,7 +5243,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -5607,7 +5779,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -5803,7 +5979,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -5883,7 +6063,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -5968,7 +6152,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6066,7 +6254,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6200,7 +6392,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6278,7 +6474,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6365,7 +6565,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6471,7 +6675,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6549,7 +6757,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6611,7 +6823,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6675,7 +6891,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6754,7 +6974,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6807,7 +7031,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6893,7 +7121,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -6965,7 +7197,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7042,7 +7278,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7180,7 +7420,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7235,7 +7479,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7300,7 +7548,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7359,7 +7611,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7414,7 +7670,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7507,7 +7767,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7576,7 +7840,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7631,7 +7899,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7686,7 +7958,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -7738,7 +8014,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",

View File

@ -311,7 +311,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",
@ -366,7 +370,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",

View File

@ -196,7 +196,11 @@
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
"description": "The relative path from the planet to the parent of this object. Optional (will default to the planet's root sector)."
},
"sectorPath": {
"type": "string",
"description": "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)."
},
"rename": {
"type": "string",