Added Support for Systems

This commit is contained in:
Ben C 2022-08-29 17:25:42 -04:00
parent 202eb808aa
commit 6722ff7ad4
No known key found for this signature in database
GPG Key ID: 7F8F04504B670474
5 changed files with 152 additions and 121 deletions

View File

@ -50,9 +50,14 @@ namespace NewHorizons
UnityEvent<string> GetBodyLoadedEvent(); UnityEvent<string> GetBodyLoadedEvent();
/// <summary> /// <summary>
/// Gets an object in the `extras` object of a config, returns null if the key doesn't exist /// Gets an object in the `extras` object of a body config, returns null if the key doesn't exist
/// </summary> /// </summary>
object GetExtraModule(Type moduleType, string extrasModuleName, string planetName); object GetExtraModuleForBody(Type moduleType, string extrasModuleName, string planetName);
/// <summary>
/// Gets an object in the `extras` object of a system config, returns null if the key doesn't exist
/// </summary>
object GetExtraModuleForSystem(Type moduleType, string extrasModuleName, string systemName);
/// <summary> /// <summary>
/// Allows you to overwrite the default system. This is where the player is respawned after dying. /// Allows you to overwrite the default system. This is where the player is respawned after dying.

View File

@ -127,7 +127,7 @@ namespace NewHorizons
BodyDict["SolarSystem"] = new List<NewHorizonsBody>(); BodyDict["SolarSystem"] = new List<NewHorizonsBody>();
BodyDict["EyeOfTheUniverse"] = new List<NewHorizonsBody>(); // Keep this empty tho fr BodyDict["EyeOfTheUniverse"] = new List<NewHorizonsBody>(); // Keep this empty tho fr
SystemDict["SolarSystem"] = new NewHorizonsSystem("SolarSystem", new StarSystemConfig(), Instance) SystemDict["SolarSystem"] = new NewHorizonsSystem("SolarSystem", new StarSystemConfig(), "", Instance)
{ {
Config = Config =
{ {
@ -143,7 +143,7 @@ namespace NewHorizons
} }
} }
}; };
SystemDict["EyeOfTheUniverse"] = new NewHorizonsSystem("EyeOfTheUniverse", new StarSystemConfig(), Instance) SystemDict["EyeOfTheUniverse"] = new NewHorizonsSystem("EyeOfTheUniverse", new StarSystemConfig(), "", Instance)
{ {
Config = Config =
{ {
@ -517,7 +517,7 @@ namespace NewHorizons
} }
else else
{ {
SystemDict[name] = new NewHorizonsSystem(name, starSystemConfig, mod); SystemDict[name] = new NewHorizonsSystem(name, starSystemConfig, relativePath, mod);
} }
} }
} }
@ -618,7 +618,7 @@ namespace NewHorizons
starSystemConfig.Migrate(); starSystemConfig.Migrate();
starSystemConfig.FixCoordinates(); starSystemConfig.FixCoordinates();
var system = new NewHorizonsSystem(config.starSystem, starSystemConfig, mod); var system = new NewHorizonsSystem(config.starSystem, starSystemConfig, "", mod);
SystemDict.Add(config.starSystem, system); SystemDict.Add(config.starSystem, system);

View File

@ -101,23 +101,42 @@ namespace NewHorizons
} }
} }
public object GetExtraModule(Type moduleType, string extraModuleKey, string planetName) private object GetExtraModule(Type moduleType, string key, string path)
{ {
var planet = Main.BodyDict[Main.Instance.CurrentStarSystem].Find((b) => b.Config.name == planetName); if (path == "") return null;
if (planet == null) try
{ {
// Uh idk if we need this but ye it do be here etc. var jsonText = File.ReadAllText(path);
Logger.LogVerbose($"Attempting To Get Extras On Planet That Doesn't Exist! ({planetName})"); var jsonData = JObject.Parse(jsonText);
var possibleExtras = jsonData.Property("extras")?.Value;
if (possibleExtras is JObject extras)
{
return extras.Property(key)?.Value.ToObject(moduleType);
}
return null; return null;
} }
var jsonText = File.ReadAllText(planet.Mod.ModHelper.Manifest.ModFolderPath + planet.RelativePath); catch (FileNotFoundException)
var jsonData = JObject.Parse(jsonText);
var possibleExtras = jsonData.Property("extras")?.Value;
if (possibleExtras is JObject extras)
{ {
return extras.Property(extraModuleKey)?.Value.ToObject(moduleType); return null;
} }
return null; }
public object GetExtraModuleForBody(Type moduleType, string extraModuleKey, string planetName)
{
var planet = Main.BodyDict[Main.Instance.CurrentStarSystem].Find((b) => b.Config.name == planetName);
return planet == null
? null
: GetExtraModule(moduleType, extraModuleKey,
planet.Mod.ModHelper.Manifest.ModFolderPath + planet.RelativePath);
}
public object GetExtraModuleForSystem(Type moduleType, string extraModuleKey, string systemName)
{
var system = Main.SystemDict[Main.Instance.CurrentStarSystem];
return system == null
? null
: GetExtraModule(moduleType, extraModuleKey,
system.Mod.ModHelper.Manifest.ModFolderPath + system.RelativePath);
} }
public GameObject SpawnObject(GameObject planet, Sector sector, string propToCopyPath, Vector3 position, Vector3 eulerAngles, public GameObject SpawnObject(GameObject planet, Sector sector, string propToCopyPath, Vector3 position, Vector3 eulerAngles,

View File

@ -11,15 +11,17 @@ namespace NewHorizons.Utility
public class NewHorizonsSystem public class NewHorizonsSystem
{ {
public string UniqueID; public string UniqueID;
public string RelativePath;
public SpawnModule Spawn = null; public SpawnModule Spawn = null;
public SpawnPoint SpawnPoint = null; public SpawnPoint SpawnPoint = null;
public StarSystemConfig Config; public StarSystemConfig Config;
public IModBehaviour Mod; public IModBehaviour Mod;
public NewHorizonsSystem(string uniqueID, StarSystemConfig config, IModBehaviour mod) public NewHorizonsSystem(string uniqueID, StarSystemConfig config, string relativePath, IModBehaviour mod)
{ {
UniqueID = uniqueID; UniqueID = uniqueID;
Config = config; Config = config;
RelativePath = relativePath;
Mod = mod; Mod = mod;
} }
} }

View File

@ -1,104 +1,109 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using NewHorizons.External.Configs; using NewHorizons.External.Configs;
using NJsonSchema; using NJsonSchema;
using NJsonSchema.Generation; using NJsonSchema.Generation;
namespace SchemaExporter; namespace SchemaExporter;
public static class SchemaExporter public static class SchemaExporter
{ {
public static void Main(string[] args) public static void Main(string[] args)
{ {
const string folderName = "NewHorizons/Schemas"; const string folderName = "NewHorizons/Schemas";
Directory.CreateDirectory(folderName); Directory.CreateDirectory(folderName);
Console.WriteLine("Schema Generator: We're winning!"); Console.WriteLine("Schema Generator: We're winning!");
var settings = new JsonSchemaGeneratorSettings var settings = new JsonSchemaGeneratorSettings
{ {
IgnoreObsoleteProperties = true, IgnoreObsoleteProperties = true,
DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull, DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull,
FlattenInheritanceHierarchy = true, FlattenInheritanceHierarchy = true,
AllowReferencesWithProperties = true AllowReferencesWithProperties = true
}; };
var bodySchema = new Schema<PlanetConfig>("Celestial Body Schema", "Schema for a celestial body in New Horizons", $"{folderName}/body_schema", settings); var bodySchema = new Schema<PlanetConfig>("Celestial Body Schema", "Schema for a celestial body in New Horizons", $"{folderName}/body_schema", settings);
bodySchema.Output(); bodySchema.Output();
var systemSchema = var systemSchema =
new Schema<StarSystemConfig>("Star System Schema", "Schema for a star system in New Horizons", $"{folderName}/star_system_schema", settings); new Schema<StarSystemConfig>("Star System Schema", "Schema for a star system in New Horizons", $"{folderName}/star_system_schema", settings);
systemSchema.Output(); systemSchema.Output();
var addonSchema = new Schema<AddonConfig>("Addon Manifest Schema", var addonSchema = new Schema<AddonConfig>("Addon Manifest Schema",
"Schema for an addon manifest in New Horizons", $"{folderName}/addon_manifest_schema", settings); "Schema for an addon manifest in New Horizons", $"{folderName}/addon_manifest_schema", settings);
addonSchema.Output(); addonSchema.Output();
var translationSchema = var translationSchema =
new Schema<TranslationConfig>("Translation Schema", "Schema for a translation file in New Horizons", $"{folderName}/translation_schema", settings); new Schema<TranslationConfig>("Translation Schema", "Schema for a translation file in New Horizons", $"{folderName}/translation_schema", settings);
translationSchema.Output(); translationSchema.Output();
Console.WriteLine("Done!"); Console.WriteLine("Done!");
} }
private readonly struct Schema<T> private readonly struct Schema<T>
{ {
private readonly JsonSchemaGeneratorSettings _generatorSettings; private readonly JsonSchemaGeneratorSettings _generatorSettings;
private readonly string _title, _description; private readonly string _title, _description;
private readonly string _outFileName; private readonly string _outFileName;
public Schema(string schemaTitle, string schemaDescription, string fileName, JsonSchemaGeneratorSettings settings) public Schema(string schemaTitle, string schemaDescription, string fileName, JsonSchemaGeneratorSettings settings)
{ {
_title = schemaTitle; _title = schemaTitle;
_description = schemaDescription; _description = schemaDescription;
_outFileName = fileName; _outFileName = fileName;
_generatorSettings = settings; _generatorSettings = settings;
} }
public void Output() public void Output()
{ {
Console.WriteLine($"Outputting {_title}"); Console.WriteLine($"Outputting {_title}");
File.WriteAllText($"{_outFileName}.json", ToString()); File.WriteAllText($"{_outFileName}.json", ToString());
} }
public override string ToString() public override string ToString()
{ {
return GetJsonSchema().ToJson(); return GetJsonSchema().ToJson();
} }
private JsonSchema GetJsonSchema() private JsonSchema GetJsonSchema()
{ {
var schema = JsonSchema.FromType<T>(_generatorSettings); var schema = JsonSchema.FromType<T>(_generatorSettings);
schema.Title = _title; schema.Title = _title;
var schemaLinkProp = new JsonSchemaProperty var schemaLinkProp = new JsonSchemaProperty
{ {
Type = JsonObjectType.String, Type = JsonObjectType.String,
Description = "The schema to validate with" Description = "The schema to validate with"
}; };
schema.Properties.Add("$schema", schemaLinkProp); schema.Properties.Add("$schema", schemaLinkProp);
schema.ExtensionData ??= new Dictionary<string, object>(); schema.ExtensionData ??= new Dictionary<string, object>();
schema.ExtensionData.Add("$docs", new Dictionary<string, object> schema.ExtensionData.Add("$docs", new Dictionary<string, object>
{ {
{"title", _title}, {"title", _title},
{"description", _description} {"description", _description}
}); });
if (_title == "Celestial Body Schema") switch (_title)
{ {
schema.Definitions["OrbitModule"].Properties["semiMajorAxis"].Default = 5000f; case "Celestial Body Schema":
schema.Properties.Add("extras", new JsonSchemaProperty { schema.Definitions["OrbitModule"].Properties["semiMajorAxis"].Default = 5000f;
Type = JsonObjectType.Object, break;
Description = "Extra data that may be used by extension mods" case "Star System Schema":
}); schema.Definitions["NomaiCoordinates"].Properties["x"].UniqueItems = true;
} schema.Definitions["NomaiCoordinates"].Properties["y"].UniqueItems = true;
schema.Definitions["NomaiCoordinates"].Properties["z"].UniqueItems = true;
if (_title == "Star System Schema") break;
{ }
schema.Definitions["NomaiCoordinates"].Properties["x"].UniqueItems = true;
schema.Definitions["NomaiCoordinates"].Properties["y"].UniqueItems = true; if (_title is "Star System Schema" or "Celestial Body Schema")
schema.Definitions["NomaiCoordinates"].Properties["z"].UniqueItems = true; {
schema.Properties.Add("extras", new JsonSchemaProperty { schema.Properties.Add("extras", new JsonSchemaProperty {
Type = JsonObjectType.Object, Type = JsonObjectType.Object,
Description = "Extra data that may be used by extension mods" Description = "Extra data that may be used by extension mods",
}); AllowAdditionalProperties = true,
} AdditionalPropertiesSchema = new JsonSchema
{
return schema; Type = JsonObjectType.Object
} }
} });
}
return schema;
}
}
} }