## Bug fixes
- Log an error when trying to orbit a body that doesn't have a gravity
volume.
- QuantumGroups of type "states" no longer ignore probe snapshots taken
of them (resolves #598)
- Unnamed Mystery is now playable again (oops sorry cigtu)
This commit is contained in:
Will Corby 2023-09-07 20:29:45 -07:00 committed by GitHub
commit 939d427774
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 77 additions and 58 deletions

View File

@ -42,6 +42,11 @@ namespace NewHorizons.Builder.Body
case StellarRemnantType.NeutronStar: case StellarRemnantType.NeutronStar:
MakeNeutronStar(go, sector, mod, star.Config.Star); MakeNeutronStar(go, sector, mod, star.Config.Star);
break;
case StellarRemnantType.Pulsar:
MakeNeutronStar(go, sector, mod, star.Config.Star);
// TODO: add jets, up rotation speed (use a RotateTransform on the star instead of changing sidereal period)
break; break;
case StellarRemnantType.BlackHole: case StellarRemnantType.BlackHole:
MakeBlackhole(go, sector, star.Config.Star); MakeBlackhole(go, sector, star.Config.Star);
@ -141,6 +146,8 @@ namespace NewHorizons.Builder.Body
return MakeWhiteDwarf(planet, null, mod, progenitor, proxy); return MakeWhiteDwarf(planet, null, mod, progenitor, proxy);
case StellarRemnantType.NeutronStar: case StellarRemnantType.NeutronStar:
return MakeNeutronStar(planet, null, mod, progenitor, proxy); return MakeNeutronStar(planet, null, mod, progenitor, proxy);
case StellarRemnantType.Pulsar:
return MakeNeutronStar(planet, null, mod, progenitor, proxy);
case StellarRemnantType.BlackHole: case StellarRemnantType.BlackHole:
return MakeBlackhole(planet, null, progenitor, proxy); return MakeBlackhole(planet, null, progenitor, proxy);
default: default:

View File

@ -143,13 +143,15 @@ namespace NewHorizons.Builder.General
// It's a planet // It's a planet
if (binaryFocalPoint.Primary != null && binaryFocalPoint.Secondary != null) if (binaryFocalPoint.Primary != null && binaryFocalPoint.Secondary != null)
{ {
forceDetector._detectableFields = new ForceVolume[] { parentGravityVolume }; if (!parentGravityVolume) NHLogger.LogError($"{astroObject?.name} trying to orbit {primaryBody?.name}, which has no gravity volume!");
forceDetector._detectableFields = parentGravityVolume ? new ForceVolume[] { parentGravityVolume } : new ForceVolume[0];
} }
} }
} }
else else
{ {
forceDetector._detectableFields = new ForceVolume[] { parentGravityVolume }; if (!parentGravityVolume) NHLogger.LogError($"{astroObject?.name} trying to orbit {primaryBody?.name}, which has no gravity volume!");
forceDetector._detectableFields = parentGravityVolume ? new ForceVolume[] { parentGravityVolume } : new ForceVolume[0];
} }
} }
@ -164,7 +166,7 @@ namespace NewHorizons.Builder.General
var primaryGV = primary.GetGravityVolume(); var primaryGV = primary.GetGravityVolume();
var secondaryGV = secondary.GetGravityVolume(); var secondaryGV = secondary.GetGravityVolume();
if (primaryGV._falloffType != secondaryGV._falloffType) if (primaryGV && secondaryGV && primaryGV._falloffType != secondaryGV._falloffType)
{ {
NHLogger.LogError($"Binaries must have the same gravity falloff! {primaryGV._falloffType} != {secondaryGV._falloffType}"); NHLogger.LogError($"Binaries must have the same gravity falloff! {primaryGV._falloffType} != {secondaryGV._falloffType}");
return; return;
@ -173,12 +175,14 @@ namespace NewHorizons.Builder.General
var pointForceDetector = point.GetAttachedOWRigidbody().GetAttachedForceDetector(); var pointForceDetector = point.GetAttachedOWRigidbody().GetAttachedForceDetector();
// Set detectable fields // Set detectable fields
primaryCFD._detectableFields = new ForceVolume[] { secondaryGV }; if (!secondaryGV) NHLogger.LogError($"{point.PrimaryName} trying to orbit {point.SecondaryName}, which has no gravity volume!");
primaryCFD._detectableFields = secondaryGV ? new ForceVolume[] { secondaryGV } : new ForceVolume[0];
primaryCFD._inheritDetector = pointForceDetector; primaryCFD._inheritDetector = pointForceDetector;
primaryCFD._activeInheritedDetector = pointForceDetector; primaryCFD._activeInheritedDetector = pointForceDetector;
primaryCFD._inheritElement0 = false; primaryCFD._inheritElement0 = false;
secondaryCFD._detectableFields = new ForceVolume[] { primaryGV }; if (!primaryGV) NHLogger.LogError($"{point.SecondaryName} trying to orbit {point.PrimaryName}, which has no gravity volume!");
secondaryCFD._detectableFields = primaryGV ? new ForceVolume[] { primaryGV } : new ForceVolume[0];
secondaryCFD._inheritDetector = pointForceDetector; secondaryCFD._inheritDetector = pointForceDetector;
secondaryCFD._activeInheritedDetector = pointForceDetector; secondaryCFD._activeInheritedDetector = pointForceDetector;
secondaryCFD._inheritElement0 = false; secondaryCFD._inheritElement0 = false;

View File

@ -382,8 +382,9 @@ namespace NewHorizons.Builder.Props
else if (component is NomaiInterfaceOrb orb) else if (component is NomaiInterfaceOrb orb)
{ {
// detect planet gravity // detect planet gravity
// somehow Intervention has GetAttachedOWRigidbody as null sometimes, idk why
var gravityVolume = planetGO.GetAttachedOWRigidbody()?.GetAttachedGravityVolume(); var gravityVolume = planetGO.GetAttachedOWRigidbody()?.GetAttachedGravityVolume();
orb.GetComponent<ConstantForceDetector>()._detectableFields = gravityVolume ? new ForceVolume[] { gravityVolume } : new ForceVolume[] { }; orb.GetComponent<ConstantForceDetector>()._detectableFields = gravityVolume ? new ForceVolume[] { gravityVolume } : new ForceVolume[0];
} }
else if (component is VisionTorchItem torchItem) else if (component is VisionTorchItem torchItem)

View File

@ -11,11 +11,11 @@ namespace NewHorizons.Builder.Props
{ {
public static GameObject MakeFromExisting(GameObject go, public static GameObject MakeFromExisting(GameObject go,
GameObject planetGO, Sector sector, GeneralPointPropInfo info, GameObject planetGO, Sector sector, GeneralPointPropInfo info,
MVector3 defaultPosition = null, string defaultParentPath = null, Transform parentOverride = null) MVector3 defaultPosition = null, string defaultParentPath = null, Transform defaultParent = null)
{ {
if (info == null) return go; if (info == null) return go;
go.transform.parent = parentOverride ?? sector?.transform ?? planetGO?.transform; go.transform.parent = defaultParent ?? sector?.transform ?? planetGO?.transform;
if (info is GeneralSolarSystemPropInfo solarSystemInfo && !string.IsNullOrEmpty(solarSystemInfo.parentBody)) if (info is GeneralSolarSystemPropInfo solarSystemInfo && !string.IsNullOrEmpty(solarSystemInfo.parentBody))
{ {
@ -87,20 +87,20 @@ namespace NewHorizons.Builder.Props
public static GameObject MakeNew(string defaultName, public static GameObject MakeNew(string defaultName,
GameObject planetGO, Sector sector, GeneralPointPropInfo info, GameObject planetGO, Sector sector, GeneralPointPropInfo info,
MVector3 defaultPosition = null, string defaultParentPath = null, Transform parentOverride = null) MVector3 defaultPosition = null, string defaultParentPath = null, Transform defaultParent = null)
{ {
var go = new GameObject(defaultName); var go = new GameObject(defaultName);
go.SetActive(false); go.SetActive(false);
return MakeFromExisting(go, planetGO, sector, info, defaultPosition, defaultParentPath, parentOverride); return MakeFromExisting(go, planetGO, sector, info, defaultPosition, defaultParentPath, defaultParent);
} }
public static GameObject MakeFromPrefab(GameObject prefab, string defaultName, public static GameObject MakeFromPrefab(GameObject prefab, string defaultName,
GameObject planetGO, Sector sector, GeneralPointPropInfo info, GameObject planetGO, Sector sector, GeneralPointPropInfo info,
MVector3 defaultPosition = null, string defaultParentPath = null, Transform parentOverride = null) MVector3 defaultPosition = null, string defaultParentPath = null, Transform defaultParent = null)
{ {
var go = prefab.InstantiateInactive(); var go = prefab.InstantiateInactive();
go.name = defaultName; go.name = defaultName;
return MakeFromExisting(go, planetGO, sector, info, defaultPosition, defaultParentPath, parentOverride); return MakeFromExisting(go, planetGO, sector, info, defaultPosition, defaultParentPath, defaultParent);
} }
} }
} }

View File

@ -137,7 +137,10 @@ namespace NewHorizons.Builder.Props
orbBody._lastVelocity = velocity; orbBody._lastVelocity = velocity;
orbBody._currentVelocity = velocity; orbBody._currentVelocity = velocity;
orb.GetComponent<ConstantForceDetector>()._detectableFields = new ForceVolume[] { planetGO.GetComponentInChildren<GravityVolume>() }; // detect planet gravity
// somehow Intervention has GetAttachedOWRigidbody as null sometimes, idk why
var gravityVolume = planetGO.GetAttachedOWRigidbody()?.GetAttachedGravityVolume();
orb.GetComponent<ConstantForceDetector>()._detectableFields = gravityVolume ? new ForceVolume[] { gravityVolume } : new ForceVolume[0];
Delay.RunWhenAndInNUpdates(() => Delay.RunWhenAndInNUpdates(() =>
{ {

View File

@ -214,7 +214,7 @@ namespace NewHorizons.Builder.Props
// The number of slides is unlimited, 15 is only for texturing the actual slide reel item. This is not a slide reel item // The number of slides is unlimited, 15 is only for texturing the actual slide reel item. This is not a slide reel item
var slides = info.slides; var slides = info.slides;
var slidesCount = slides.Length; var slidesCount = slides.Length;
var slideCollection = new SlideCollection(slidesCount); var slideCollection = new SlideCollection(slidesCount); // TODO: uh I think that info.slides[i].playTimeDuration is not being read here... note to self for when I implement support for that: 0.7 is what to default to if playTimeDuration turns out to be 0
var imageLoader = AddAsyncLoader(g, mod, info.slides, ref slideCollection); var imageLoader = AddAsyncLoader(g, mod, info.slides, ref slideCollection);
imageLoader.imageLoadedEvent.AddListener((Texture2D tex, int index) => { slideCollection.slides[index]._image = tex; }); imageLoader.imageLoadedEvent.AddListener((Texture2D tex, int index) => { slideCollection.slides[index]._image = tex; });

View File

@ -8,17 +8,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
// BUGS THAT REQUIRE REWRITING MOBIUS CODE
// 1) FIXED! - MultiStateQuantumObjects don't check to see if the new state would be visible before choosing it
// 2) FIXED? no longer supporting shuffle - QuantumShuffleObjects don't respect rotation, they set rotation to 0 on collapse
// 3) - MultiStateQuantumObjects don't get locked by pictures
// New features to support
// 1) multiState._prerequisiteObjects
// 2) Socket groups that have an equal number of props and sockets
// 3) Nice to have: socket groups that specify a filledSocketObject and an emptySocketObject (eg the archway in the giant's deep tower)
namespace NewHorizons.Builder.Props namespace NewHorizons.Builder.Props
{ {
public static class QuantumBuilder public static class QuantumBuilder
@ -34,6 +23,8 @@ namespace NewHorizons.Builder.Props
} }
} }
// TODO: Socket groups that have an equal number of props and sockets
// Nice to have: socket groups that specify a filledSocketObject and an emptySocketObject (eg the archway in the giant's deep tower)
public static void MakeSocketGroup(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) public static void MakeSocketGroup(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup)
{ {
var groupRoot = new GameObject("Quantum Sockets - " + quantumGroup.id); var groupRoot = new GameObject("Quantum Sockets - " + quantumGroup.id);
@ -46,10 +37,10 @@ namespace NewHorizons.Builder.Props
{ {
var socketInfo = quantumGroup.sockets[i]; var socketInfo = quantumGroup.sockets[i];
var socket = GeneralPropBuilder.MakeNew("Socket " + i, go, sector, socketInfo, parentOverride: groupRoot.transform); var socket = GeneralPropBuilder.MakeNew("Socket " + i, go, sector, socketInfo, defaultParent: groupRoot.transform);
sockets[i] = socket.AddComponent<QuantumSocket>(); sockets[i] = socket.AddComponent<QuantumSocket>();
sockets[i]._lightSources = new Light[0]; sockets[i]._lightSources = new Light[0]; // TODO: make this customizable?
socket.SetActive(true); socket.SetActive(true);
} }
@ -70,6 +61,12 @@ namespace NewHorizons.Builder.Props
public static void MakeStateGroup(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) public static void MakeStateGroup(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup)
{ {
// NOTE: States groups need special consideration that socket groups don't
// this is because the base class QuantumObject (and this is important) IGNORES PICTURES TAKEN FROM OVER 100 METERS AWAY
// why does this affect states and not sockets? Well because sockets put the QuantumObject component (QuantumSocketedObject) on the actual props themselves
// while states put the QuantumObject component (NHMultiStateQuantumObject) on the parent, which is located at the center of the planet
// this means that the distance measured by QuantumObject is not accurate, since it's not measuring from the active prop, but from the center of the planet
var groupRoot = new GameObject("Quantum States - " + quantumGroup.id); var groupRoot = new GameObject("Quantum States - " + quantumGroup.id);
groupRoot.transform.parent = sector?.transform ?? go.transform; groupRoot.transform.parent = sector?.transform ?? go.transform;
groupRoot.transform.localPosition = Vector3.zero; groupRoot.transform.localPosition = Vector3.zero;
@ -110,8 +107,10 @@ namespace NewHorizons.Builder.Props
multiState._loop = quantumGroup.loop; multiState._loop = quantumGroup.loop;
multiState._sequential = quantumGroup.sequential; multiState._sequential = quantumGroup.sequential;
multiState._states = states.ToArray(); multiState._states = states.ToArray();
multiState._prerequisiteObjects = new MultiStateQuantumObject[0]; // TODO: support this multiState._prerequisiteObjects = new MultiStateQuantumObject[0]; // TODO: _prerequisiteObjects
multiState._initialState = 0; multiState._initialState = 0;
// snapshot events arent listened to outside of the sector, so fortunately this isnt really infinite
multiState._maxSnapshotLockRange = Mathf.Infinity; // TODO: maybe expose this at some point if it breaks a puzzle or something
groupRoot.SetActive(true); groupRoot.SetActive(true);
} }
@ -126,7 +125,7 @@ namespace NewHorizons.Builder.Props
var shuffle = shuffleParent.AddComponent<QuantumShuffleObject>(); var shuffle = shuffleParent.AddComponent<QuantumShuffleObject>();
shuffle._shuffledObjects = propsInGroup.Select(p => p.transform).ToArray(); shuffle._shuffledObjects = propsInGroup.Select(p => p.transform).ToArray();
shuffle.Awake(); // this doesn't get called on its own for some reason shuffle.Awake(); // this doesn't get called on its own for some reason. what? how?
AddBoundsVisibility(shuffleParent); AddBoundsVisibility(shuffleParent);
shuffleParent.SetActive(true); shuffleParent.SetActive(true);
@ -165,6 +164,7 @@ namespace NewHorizons.Builder.Props
} }
} }
// BUG: ignores skinned guys. this coincidentally makes it work without BoxShapeFixer
public static Bounds GetBoundsOfSelfAndChildMeshes(GameObject g) public static Bounds GetBoundsOfSelfAndChildMeshes(GameObject g)
{ {
var meshFilters = g.GetComponentsInChildren<MeshFilter>(); var meshFilters = g.GetComponentsInChildren<MeshFilter>();
@ -200,6 +200,13 @@ namespace NewHorizons.Builder.Props
} }
} }
/// <summary>
/// for some reason mesh bounds are wrong unless we wait a bit
/// so this script contiously checks everything until it is correct
///
/// this actually only seems to be a problem with skinned renderers. normal ones work fine
/// TODO: at some point narrow this down to just skinned, instead of doing everything and checking every frame
/// </summary>
public class BoxShapeFixer : MonoBehaviour public class BoxShapeFixer : MonoBehaviour
{ {
public BoxShape shape; public BoxShape shape;

View File

@ -4,9 +4,12 @@ using UnityEngine;
namespace NewHorizons.Components.Quantum namespace NewHorizons.Components.Quantum
{ {
/// <summary>
/// exists because MultiStateQuantumObject only checks visibility on the current state,
/// whereas this one also checks on each new state, in case they are bigger
/// </summary>
public class NHMultiStateQuantumObject : MultiStateQuantumObject public class NHMultiStateQuantumObject : MultiStateQuantumObject
{ {
public override bool ChangeQuantumState(bool skipInstantVisibilityCheck) public override bool ChangeQuantumState(bool skipInstantVisibilityCheck)
{ {
for (int i = 0; i < _prerequisiteObjects.Length; i++) for (int i = 0; i < _prerequisiteObjects.Length; i++)
@ -43,15 +46,9 @@ namespace NewHorizons.Components.Quantum
else else
{ {
// TODO: perform this roll for number of states, each time adding the selected state to the end of a list and removing it from the source list // Iterate over list of possible states to find a valid state to collapse to
// this gets us a randomly ordered list that respects states' probability // current state is excluded, and states are randomly ordered using a weighted random roll to prioritize states with higher probability
// then we can sequentially attempt collapsing to them, checking at each state whether the new state is invalid due to the player being able to see it, according to this: // NOTE: they aren't actually pre-sorted into this random order, this random ordering is done on the fly using RollState
//
// if (!((!IsPlayerEntangled()) ? (CheckIllumination() ? CheckVisibilityInstantly() : CheckPointInside(Locator.GetPlayerCamera().transform.position)) : CheckIllumination()))
// {
// return true; // this is a valid state
// }
//
List<int> indices = new List<int>(); List<int> indices = new List<int>();
for (var i = 0; i < _states.Length; i++) if (i != stateIndex) indices.Add(i); for (var i = 0; i < _states.Length; i++) if (i != stateIndex) indices.Add(i);
@ -94,17 +91,15 @@ namespace NewHorizons.Components.Quantum
{ {
var isPlayerEntangled = IsPlayerEntangled(); var isPlayerEntangled = IsPlayerEntangled();
var illumination = CheckIllumination(); var illumination = CheckIllumination();
// faster than full CheckVisibility
var visibility = CheckVisibilityInstantly(); var visibility = CheckVisibilityInstantly();
var playerInside = CheckPointInside(Locator.GetPlayerCamera().transform.position); var playerInside = CheckPointInside(Locator.GetPlayerCamera().transform.position);
// does not check probe, but thats okay
var isVisible = var notEntangledCheck = illumination ? visibility : playerInside;
isPlayerEntangled var isVisible = isPlayerEntangled ? illumination : notEntangledCheck;
? illumination // I think this is what the above two lines simplify to but I don't want to test this:
: // illumination ? visibility || isPlayerEntangled : playerInside
illumination
? visibility
: playerInside
;
return !isVisible; return !isVisible;
} }

View File

@ -154,6 +154,7 @@ namespace NewHorizons.External.Modules.VariableSize
[EnumMember(Value = @"default")] Default, [EnumMember(Value = @"default")] Default,
[EnumMember(Value = @"whiteDwarf")] WhiteDwarf, [EnumMember(Value = @"whiteDwarf")] WhiteDwarf,
[EnumMember(Value = @"neutronStar")] NeutronStar, [EnumMember(Value = @"neutronStar")] NeutronStar,
[EnumMember(Value = @"pulsar")] Pulsar,
[EnumMember(Value = @"blackHole")] BlackHole, [EnumMember(Value = @"blackHole")] BlackHole,
[EnumMember(Value = @"custom")] Custom [EnumMember(Value = @"custom")] Custom
} }

View File

@ -169,7 +169,7 @@ namespace NewHorizons.Handlers
var attachWarpExitToVessel = system.Config.Vessel?.warpExit?.attachToVessel ?? false; var attachWarpExitToVessel = system.Config.Vessel?.warpExit?.attachToVessel ?? false;
var warpExitParent = vesselWarpController._targetWarpPlatform.transform.parent; var warpExitParent = vesselWarpController._targetWarpPlatform.transform.parent;
var warpExit = GeneralPropBuilder.MakeFromExisting(vesselWarpController._targetWarpPlatform.gameObject, planetGO, null, system.Config.Vessel?.warpExit, parentOverride: attachWarpExitToVessel ? warpExitParent : null); var warpExit = GeneralPropBuilder.MakeFromExisting(vesselWarpController._targetWarpPlatform.gameObject, planetGO, null, system.Config.Vessel?.warpExit, defaultParent: attachWarpExitToVessel ? warpExitParent : null);
if (attachWarpExitToVessel) if (attachWarpExitToVessel)
{ {
warpExit.transform.parent = warpExitParent; warpExit.transform.parent = warpExitParent;

View File

@ -15,9 +15,8 @@
<DebugType>none</DebugType> <DebugType>none</DebugType>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="HarmonyX" Version="2.10.1" />
<PackageReference Include="OuterWildsGameLibs" Version="1.1.13.457" /> <PackageReference Include="OuterWildsGameLibs" Version="1.1.13.457" />
<PackageReference Include="OWML" Version="2.9.3" /> <PackageReference Include="OWML" Version="2.9.7" />
<Reference Include="../Lib/System.ComponentModel.Annotations.dll" /> <Reference Include="../Lib/System.ComponentModel.Annotations.dll" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -1,7 +1,7 @@
using HarmonyLib; using HarmonyLib;
using NewHorizons.Utility.OWML; using NewHorizons.Utility.OWML;
namespace NewHorizons.Patches.PlayerPatches namespace NewHorizons.Patches.DetectorPatches
{ {
[HarmonyPatch(typeof(HazardDetector))] [HarmonyPatch(typeof(HazardDetector))]
public static class PlayerHazardDetectorPatches public static class PlayerHazardDetectorPatches

View File

@ -2047,13 +2047,11 @@
"description": "", "description": "",
"x-enumNames": [ "x-enumNames": [
"Sockets", "Sockets",
"States", "States"
"FailedValidation"
], ],
"enum": [ "enum": [
"sockets", "sockets",
"states", "states"
"FailedValidation"
] ]
}, },
"QuantumSocketInfo": { "QuantumSocketInfo": {
@ -3509,6 +3507,7 @@
"Default", "Default",
"WhiteDwarf", "WhiteDwarf",
"NeutronStar", "NeutronStar",
"Pulsar",
"BlackHole", "BlackHole",
"Custom" "Custom"
], ],
@ -3516,6 +3515,7 @@
"default", "default",
"whiteDwarf", "whiteDwarf",
"neutronStar", "neutronStar",
"pulsar",
"blackHole", "blackHole",
"custom" "custom"
] ]

View File

@ -4,8 +4,8 @@
"author": "xen, Bwc9876, clay, MegaPiggy, John, Trifid, Hawkbar, Book", "author": "xen, Bwc9876, clay, MegaPiggy, John, Trifid, Hawkbar, Book",
"name": "New Horizons", "name": "New Horizons",
"uniqueName": "xen.NewHorizons", "uniqueName": "xen.NewHorizons",
"version": "1.16.3", "version": "1.16.4",
"owmlVersion": "2.9.3", "owmlVersion": "2.9.7",
"dependencies": [ "JohnCorby.VanillaFix", "_nebula.MenuFramework", "xen.CommonCameraUtility", "dgarro.CustomShipLogModes" ], "dependencies": [ "JohnCorby.VanillaFix", "_nebula.MenuFramework", "xen.CommonCameraUtility", "dgarro.CustomShipLogModes" ],
"conflicts": [ "Raicuparta.QuantumSpaceBuddies", "PacificEngine.OW_CommonResources" ], "conflicts": [ "Raicuparta.QuantumSpaceBuddies", "PacificEngine.OW_CommonResources" ],
"pathsToPreserve": [ "planets", "systems", "translations" ] "pathsToPreserve": [ "planets", "systems", "translations" ]

View File

@ -86,6 +86,8 @@ public static class SchemaExporter
schema.Definitions["NomaiTextType"].EnumerationNames.Remove("Cairn"); schema.Definitions["NomaiTextType"].EnumerationNames.Remove("Cairn");
schema.Definitions["NomaiTextType"].Enumeration.Remove("cairnVariant"); schema.Definitions["NomaiTextType"].Enumeration.Remove("cairnVariant");
schema.Definitions["NomaiTextType"].EnumerationNames.Remove("CairnVariant"); schema.Definitions["NomaiTextType"].EnumerationNames.Remove("CairnVariant");
schema.Definitions["QuantumGroupType"].Enumeration.Remove("FailedValidation");
schema.Definitions["QuantumGroupType"].EnumerationNames.Remove("FailedValidation");
break; break;
case "Star System Schema": case "Star System Schema":
schema.Definitions["NomaiCoordinates"].Properties["x"].UniqueItems = true; schema.Definitions["NomaiCoordinates"].Properties["x"].UniqueItems = true;