From 22f96ddea34f5a6bd83d54e1fc58bcae09565984 Mon Sep 17 00:00:00 2001 From: Ben C Date: Mon, 23 May 2022 18:39:19 -0400 Subject: [PATCH] Fixed casing on more modules --- .../Builder/Atmosphere/CloudsBuilder.cs | 2 +- .../Builder/Body/AsteroidBeltBuilder.cs | 6 +- .../Builder/General/AstroObjectBuilder.cs | 10 +- NewHorizons/Builder/General/MarkerBuilder.cs | 9 +- .../Builder/Orbital/InitialMotionBuilder.cs | 6 +- .../Builder/Orbital/OrbitlineBuilder.cs | 12 +- NewHorizons/Builder/Props/NomaiTextBuilder.cs | 2 +- NewHorizons/Builder/ShipLog/MapModeBuilder.cs | 2 +- NewHorizons/Components/QuantumPlanet.cs | 2 +- .../StarEvolutionController.cs | 9 +- NewHorizons/External/Configs/PlanetConfig.cs | 2 +- NewHorizons/External/Modules/OrbitModule.cs | 24 ++-- NewHorizons/Handlers/PlanetCreationHandler.cs | 18 +-- NewHorizons/Handlers/PlanetGraphHandler.cs | 8 +- NewHorizons/Main.cs | 28 +---- NewHorizons/NewHorizons.csproj | 111 +++++++++--------- NewHorizons/Utility/MGradient.cs | 10 +- NewHorizons/Utility/MVector2.cs | 19 ++- NewHorizons/Utility/MVector3.cs | 18 +-- SchemaExporter/SchemaExporter.cs | 1 - SchemaExporter/SchemaExporter.csproj | 3 +- .../System.ComponentModel.Annotations.dll | Bin 0 -> 81040 bytes 22 files changed, 153 insertions(+), 149 deletions(-) create mode 100644 System.ComponentModel.Annotations/System.ComponentModel.Annotations.dll diff --git a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs index 8ede367c..eca21992 100644 --- a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs @@ -117,7 +117,7 @@ namespace NewHorizons.Builder.Atmosphere for(int i = 0; i < atmo.clouds.lightningGradient.Length; i++) { var pair = atmo.clouds.lightningGradient[i]; - gradient[i] = new GradientColorKey(pair.Tint, pair.Time); + gradient[i] = new GradientColorKey(pair.tint, pair.time); } lightningGenerator._lightColor.colorKeys = gradient; diff --git a/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs b/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs index 7839ba51..64543600 100644 --- a/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs +++ b/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs @@ -40,13 +40,13 @@ namespace NewHorizons.Builder.Body config.Orbit = new OrbitModule() { - IsMoon = true, + isMoon = true, inclination = belt.inclination + Random.Range(-2f, 2f), longitudeOfAscendingNode = belt.longitudeOfAscendingNode, trueAnomaly = 360f * (i + Random.Range(-0.2f, 0.2f)) / (float)count, - PrimaryBody = bodyName, + primaryBody = bodyName, semiMajorAxis = Random.Range(belt.innerRadius, belt.outerRadius), - ShowOrbitLine = false + showOrbitLine = false }; config.ProcGen = belt.procGen; diff --git a/NewHorizons/Builder/General/AstroObjectBuilder.cs b/NewHorizons/Builder/General/AstroObjectBuilder.cs index 777a75e3..a2fecf27 100644 --- a/NewHorizons/Builder/General/AstroObjectBuilder.cs +++ b/NewHorizons/Builder/General/AstroObjectBuilder.cs @@ -14,7 +14,7 @@ namespace NewHorizons.Builder.General if (config.Orbit != null) astroObject.SetOrbitalParametersFromConfig(config.Orbit); var type = AstroObject.Type.Planet; - if (config.Orbit.IsMoon) type = AstroObject.Type.Moon; + if (config.Orbit.isMoon) type = AstroObject.Type.Moon; // else if (config.Base.IsSatellite) type = AstroObject.Type.Satellite; else if (config.Base.hasCometTail) type = AstroObject.Type.Comet; else if (config.Star != null) type = AstroObject.Type.Star; @@ -25,25 +25,25 @@ namespace NewHorizons.Builder.General astroObject._primaryBody = primaryBody; // Expand gravitational sphere of influence of the primary to encompass this body if needed - if (primaryBody?.gameObject?.GetComponent() != null && !config.Orbit.IsStatic) + if (primaryBody?.gameObject?.GetComponent() != null && !config.Orbit.isStatic) { var primarySphereOfInfluence = primaryBody.GetGravityVolume().gameObject.GetComponent(); if (primarySphereOfInfluence.radius < config.Orbit.semiMajorAxis) primarySphereOfInfluence.radius = config.Orbit.semiMajorAxis * 1.5f; } - if (config.Orbit.IsTidallyLocked) + if (config.Orbit.isTidallyLocked) { var alignment = body.AddComponent(); alignment.SetTargetBody(primaryBody?.GetAttachedOWRigidbody()); alignment._usePhysicsToRotate = true; - if (config.Orbit.AlignmentAxis == null) + if (config.Orbit.alignmentAxis == null) { alignment._localAlignmentAxis = new Vector3(0, -1, 0); } else { - alignment._localAlignmentAxis = config.Orbit.AlignmentAxis; + alignment._localAlignmentAxis = config.Orbit.alignmentAxis; } } diff --git a/NewHorizons/Builder/General/MarkerBuilder.cs b/NewHorizons/Builder/General/MarkerBuilder.cs index 726e6f16..bcb945a9 100644 --- a/NewHorizons/Builder/General/MarkerBuilder.cs +++ b/NewHorizons/Builder/General/MarkerBuilder.cs @@ -1,6 +1,11 @@ -using NewHorizons.External.Configs; +#region + +using NewHorizons.External.Configs; using NewHorizons.Handlers; using UnityEngine; + +#endregion + namespace NewHorizons.Builder.General { static class MarkerBuilder @@ -12,7 +17,7 @@ namespace NewHorizons.Builder.General var markerType = MapMarker.MarkerType.Planet; - if (config.Orbit.IsMoon) + if (config.Orbit.isMoon) { markerType = MapMarker.MarkerType.Moon; } diff --git a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs index d10b0e7f..bb3f95e9 100644 --- a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs +++ b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs @@ -19,11 +19,11 @@ namespace NewHorizons.Builder.Orbital initialMotion._orbitImpulseScalar = 0f; // Rotation - initialMotion._initAngularSpeed = orbit.SiderealPeriod == 0 ? 0f : 2f * Mathf.PI / (orbit.SiderealPeriod * 60f); - var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt, Vector3.right) * Vector3.up; + initialMotion._initAngularSpeed = orbit.siderealPeriod == 0 ? 0f : 2f * Mathf.PI / (orbit.siderealPeriod * 60f); + var rotationAxis = Quaternion.AngleAxis(orbit.axialTilt, Vector3.right) * Vector3.up; secondaryBody.transform.rotation = Quaternion.FromToRotation(Vector3.up, rotationAxis); - if (!orbit.IsStatic && primaryBody != null) + if (!orbit.isStatic && primaryBody != null) { SetInitialMotion(initialMotion, primaryBody, secondaryBody); } diff --git a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs index d6adef42..d86fc9e2 100644 --- a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs +++ b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs @@ -20,16 +20,16 @@ namespace NewHorizons.Builder.Orbital var lineRenderer = orbitGO.AddComponent(); - lineRenderer.material = new Material(config.Orbit.DottedOrbitLine ? _dottedLineMaterial : _lineMaterial); - lineRenderer.textureMode = config.Orbit.DottedOrbitLine ? LineTextureMode.RepeatPerSegment : LineTextureMode.Stretch; + lineRenderer.material = new Material(config.Orbit.dottedOrbitLine ? _dottedLineMaterial : _lineMaterial); + lineRenderer.textureMode = config.Orbit.dottedOrbitLine ? LineTextureMode.RepeatPerSegment : LineTextureMode.Stretch; - var width = config.Orbit.DottedOrbitLine ? 100 : 50; + var width = config.Orbit.dottedOrbitLine ? 100 : 50; lineRenderer.startWidth = width; lineRenderer.endWidth = width; lineRenderer.useWorldSpace = false; lineRenderer.loop = false; - var numVerts = config.Orbit.DottedOrbitLine ? 128 : 256; + var numVerts = config.Orbit.dottedOrbitLine ? 128 : 256; lineRenderer.positionCount = numVerts; var ecc = config.Orbit.eccentricity; @@ -37,7 +37,7 @@ namespace NewHorizons.Builder.Orbital var parentGravity = astroObject.GetPrimaryBody()?.GetGravityVolume(); OrbitLine orbitLine; - if (config.Orbit.TrackingOrbitLine || (new Gravity(parentGravity).Power == 1 && ecc != 0)) + if (config.Orbit.trackingOrbitLine || (new Gravity(parentGravity).Power == 1 && ecc != 0)) { orbitLine = orbitGO.AddComponent(); } @@ -57,7 +57,7 @@ namespace NewHorizons.Builder.Orbital } var color = Color.white; - if (config.Orbit.Tint != null) color = config.Orbit.Tint; + if (config.Orbit.tint != null) color = config.Orbit.tint; else if (config.Star != null) color = config.Star.tint; else if (config.Atmosphere?.clouds?.tint != null) color = config.Atmosphere.clouds.tint; else if (config.Singularity != null) color = new Color(1f, 0.5f, 1f); diff --git a/NewHorizons/Builder/Props/NomaiTextBuilder.cs b/NewHorizons/Builder/Props/NomaiTextBuilder.cs index 849838f9..b2cc2c44 100644 --- a/NewHorizons/Builder/Props/NomaiTextBuilder.cs +++ b/NewHorizons/Builder/Props/NomaiTextBuilder.cs @@ -333,7 +333,7 @@ namespace NewHorizons.Builder.Props { var a = info.arcInfo[i]; if (a.position == null) arc.transform.localPosition = Vector3.zero; - else arc.transform.localPosition = new Vector3(a.position.X, a.position.Y, 0); + else arc.transform.localPosition = new Vector3(a.position.x, a.position.y, 0); arc.transform.localRotation = Quaternion.Euler(0, 0, a.zRotation); } diff --git a/NewHorizons/Builder/ShipLog/MapModeBuilder.cs b/NewHorizons/Builder/ShipLog/MapModeBuilder.cs index 59439558..7b8102a1 100644 --- a/NewHorizons/Builder/ShipLog/MapModeBuilder.cs +++ b/NewHorizons/Builder/ShipLog/MapModeBuilder.cs @@ -388,7 +388,7 @@ namespace NewHorizons.Builder.ShipLog int newLevel = parent.level + 1; MapModeObject lastSibling = parent; - foreach (NewHorizonsBody body in searchList.Where(b => b.Config.Orbit.PrimaryBody == parent.mainBody.Config.name || b.Config.name == secondaryName)) + foreach (NewHorizonsBody body in searchList.Where(b => b.Config.Orbit.primaryBody == parent.mainBody.Config.name || b.Config.name == secondaryName)) { bool even = newLevel % 2 == 0; newX = even ? newX : newX + 1; diff --git a/NewHorizons/Components/QuantumPlanet.cs b/NewHorizons/Components/QuantumPlanet.cs index ff5f283b..68763c74 100644 --- a/NewHorizons/Components/QuantumPlanet.cs +++ b/NewHorizons/Components/QuantumPlanet.cs @@ -81,7 +81,7 @@ namespace NewHorizons.Components var newOrbit = newState.orbit ?? groundState.orbit; newOrbit.trueAnomaly = Random.Range(0f, 360f); - primaryBody = AstroObjectLocator.GetAstroObject(newOrbit.PrimaryBody); + primaryBody = AstroObjectLocator.GetAstroObject(newOrbit.primaryBody); var primaryGravity = new Gravity(primaryBody.GetGravityVolume()); var secondaryGravity = new Gravity(_astroObject.GetGravityVolume()); orbitalParams = newOrbit.GetOrbitalParameters(primaryGravity, secondaryGravity); diff --git a/NewHorizons/Components/SizeControllers/StarEvolutionController.cs b/NewHorizons/Components/SizeControllers/StarEvolutionController.cs index 84f7b87b..40da8bdb 100644 --- a/NewHorizons/Components/SizeControllers/StarEvolutionController.cs +++ b/NewHorizons/Components/SizeControllers/StarEvolutionController.cs @@ -45,6 +45,7 @@ namespace NewHorizons.Components.SizeControllers private StarEvolutionController _proxy; private float maxScale; + private static readonly int ColorRamp = Shader.PropertyToID("_ColorRamp"); void Awake() { @@ -55,10 +56,10 @@ namespace NewHorizons.Components.SizeControllers _endSurfaceMaterial = new Material(sun._endSurfaceMaterial); // Copy over the material that was set in star builder - _collapseStartSurfaceMaterial.SetTexture("_ColorRamp", supernova._surface.sharedMaterial.GetTexture("_ColorRamp")); - _collapseEndSurfaceMaterial.SetTexture("_ColorRamp", supernova._surface.sharedMaterial.GetTexture("_ColorRamp")); - _startSurfaceMaterial.SetTexture("_ColorRamp", supernova._surface.sharedMaterial.GetTexture("_ColorRamp")); - _endSurfaceMaterial.SetTexture("_ColorRamp", supernova._surface.sharedMaterial.GetTexture("_ColorRamp")); + _collapseStartSurfaceMaterial.SetTexture(ColorRamp, supernova._surface.sharedMaterial.GetTexture(ColorRamp)); + _collapseEndSurfaceMaterial.SetTexture(ColorRamp, supernova._surface.sharedMaterial.GetTexture(ColorRamp)); + _startSurfaceMaterial.SetTexture(ColorRamp, supernova._surface.sharedMaterial.GetTexture(ColorRamp)); + _endSurfaceMaterial.SetTexture(ColorRamp, supernova._surface.sharedMaterial.GetTexture(ColorRamp)); if (startColour == null) { diff --git a/NewHorizons/External/Configs/PlanetConfig.cs b/NewHorizons/External/Configs/PlanetConfig.cs index af1eac0c..f35c9616 100644 --- a/NewHorizons/External/Configs/PlanetConfig.cs +++ b/NewHorizons/External/Configs/PlanetConfig.cs @@ -160,7 +160,7 @@ namespace NewHorizons.External.Configs public void MigrateAndValidate() { // Validate - if (Base.centerOfSolarSystem) Orbit.IsStatic = true; + if (Base.centerOfSolarSystem) Orbit.isStatic = true; if (Atmosphere?.clouds?.lightningGradient != null) Atmosphere.clouds.hasLightning = true; // Backwards compatability diff --git a/NewHorizons/External/Modules/OrbitModule.cs b/NewHorizons/External/Modules/OrbitModule.cs index d9c06ced..7438b841 100644 --- a/NewHorizons/External/Modules/OrbitModule.cs +++ b/NewHorizons/External/Modules/OrbitModule.cs @@ -2,67 +2,69 @@ using System.ComponentModel.DataAnnotations; using NewHorizons.Components.Orbital; using NewHorizons.Utility; +using Newtonsoft.Json; namespace NewHorizons.External.Modules { + [JsonObject] public class OrbitModule : IOrbitalParameters { /// /// The name of the body this one will orbit around /// - public string PrimaryBody { get; set; } + public string primaryBody; /// /// Is this the moon of a planet? Used for determining when its name is shown on the map. /// - public bool IsMoon { get; set; } + public bool isMoon; /// /// The angle between the normal to the orbital plane and its axis of rotation. /// - public float AxialTilt { get; set; } + public float axialTilt; /// /// Rotation period in minutes. /// - public float SiderealPeriod { get; set; } + public float siderealPeriod; /// /// Should the body always have one side facing its primary? /// - public bool IsTidallyLocked { get; set; } + public bool isTidallyLocked; /// /// If it is tidally locked, this direction will face towards the primary. Ex: Interloper uses `0, -1, 0`. Most planets /// will want something like `-1, 0, 0`. /// - public MVector3 AlignmentAxis { get; set; } + public MVector3 alignmentAxis; /// /// Referring to the orbit line in the map screen. /// [DefaultValue(true)] - public bool ShowOrbitLine { get; set; } = true; + public bool showOrbitLine = true; /// /// Should the orbit line be dotted? /// - public bool DottedOrbitLine { get; set; } = false; + public bool dottedOrbitLine; /// /// Is the body meant to stay in one place without moving? /// - public bool IsStatic { get; set; } + public bool isStatic; /// /// Colour of the orbit-line in the map view. /// - public MColor Tint { get; set; } + public MColor tint; /// /// Should we just draw a line behind its orbit instead of the entire circle/ellipse? /// - public bool TrackingOrbitLine { get; set; } + public bool trackingOrbitLine; /// /// The semi-major axis of the ellipse that is the body's orbit. For a circular orbit this is the radius. diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index d9cd5e70..57ca2c3d 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -266,14 +266,14 @@ namespace NewHorizons.Handlers public static GameObject GenerateBody(NewHorizonsBody body, bool defaultPrimaryToSun = false) { AstroObject primaryBody; - if (body.Config.Orbit.PrimaryBody != null) + if (body.Config.Orbit.primaryBody != null) { - primaryBody = AstroObjectLocator.GetAstroObject(body.Config.Orbit.PrimaryBody); + primaryBody = AstroObjectLocator.GetAstroObject(body.Config.Orbit.primaryBody); if (primaryBody == null) { if (defaultPrimaryToSun) { - Logger.Log($"Couldn't find {body.Config.Orbit.PrimaryBody}, defaulting to Sun"); + Logger.Log($"Couldn't find {body.Config.Orbit.primaryBody}, defaulting to Sun"); primaryBody = AstroObjectLocator.GetAstroObject("Sun"); } else @@ -341,12 +341,12 @@ namespace NewHorizons.Handlers Main.SystemDict[body.Config.starSystem].SpawnPoint = SpawnPointBuilder.Make(go, body.Config.Spawn, owRigidBody); } - if (body.Config.Orbit.ShowOrbitLine && !body.Config.Orbit.IsStatic) + if (body.Config.Orbit.showOrbitLine && !body.Config.Orbit.isStatic) { - Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => OrbitlineBuilder.Make(body.Object, ao as NHAstroObject, body.Config.Orbit.IsMoon, body.Config)); + Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => OrbitlineBuilder.Make(body.Object, ao as NHAstroObject, body.Config.Orbit.isMoon, body.Config)); } - if (!body.Config.Orbit.IsStatic) + if (!body.Config.Orbit.isStatic) { DetectorBuilder.Make(go, owRigidBody, primaryBody, ao, body.Config); } @@ -507,10 +507,10 @@ namespace NewHorizons.Handlers // By default keep it with the same primary body else update to the new one var primary = ao._primaryBody; - if (!string.IsNullOrEmpty(body.Config.Orbit.PrimaryBody)) + if (!string.IsNullOrEmpty(body.Config.Orbit.primaryBody)) { // If we can't find the new one we want to try again later (return false) - primary = AstroObjectLocator.GetAstroObject(body.Config.Orbit.PrimaryBody); + primary = AstroObjectLocator.GetAstroObject(body.Config.Orbit.primaryBody); if (primary == null) return; } @@ -539,7 +539,7 @@ namespace NewHorizons.Handlers GameObject.Destroy(go.GetComponentInChildren().gameObject); var isMoon = newAO.GetAstroObjectType() == AstroObject.Type.Moon || newAO.GetAstroObjectType() == AstroObject.Type.Satellite; - if (body.Config.Orbit.ShowOrbitLine) OrbitlineBuilder.Make(go, newAO, isMoon, body.Config); + if (body.Config.Orbit.showOrbitLine) OrbitlineBuilder.Make(go, newAO, isMoon, body.Config); DetectorBuilder.SetDetector(primary, newAO, go.GetComponentInChildren()); diff --git a/NewHorizons/Handlers/PlanetGraphHandler.cs b/NewHorizons/Handlers/PlanetGraphHandler.cs index 28a7ffc1..0da5aabc 100644 --- a/NewHorizons/Handlers/PlanetGraphHandler.cs +++ b/NewHorizons/Handlers/PlanetGraphHandler.cs @@ -74,12 +74,12 @@ namespace NewHorizons.Handlers childBodies.Add(bodies[j]); } // If uh the primary body straight up matches the name - else if (bodies[j].Config.Orbit.PrimaryBody == bodies[i].Config.name) + else if (bodies[j].Config.Orbit.primaryBody == bodies[i].Config.name) { childBodies.Add(bodies[j]); } // If finding the astro object of the primary body matches the astro object but not null bc if its a new planet it'll always be null - else if (AstroObjectLocator.GetAstroObject(bodies[j].Config.Orbit.PrimaryBody) == astroObjects[i] && astroObjects[i] != null) + else if (AstroObjectLocator.GetAstroObject(bodies[j].Config.Orbit.primaryBody) == astroObjects[i] && astroObjects[i] != null) { childBodies.Add(bodies[j]); } @@ -119,7 +119,7 @@ namespace NewHorizons.Handlers private static bool DetermineIfChildOfFocal(NewHorizonsBody body, FocalPointNode node) { var name = body.Config.name.ToLower(); - var primary = (body.Config.Orbit?.PrimaryBody ?? "").ToLower(); + var primary = (body.Config.Orbit?.primaryBody ?? "").ToLower(); var primaryName = node.primary.body.Config.name.ToLower(); var secondaryName = node.secondary.body.Config.name.ToLower(); return name != primaryName && name != secondaryName && (primary == node.body.Config.name.ToLower() || primary == primaryName || primary == secondaryName); @@ -134,7 +134,7 @@ namespace NewHorizons.Handlers { body = body, children = bodies - .Where(b => string.Equals(b.Config.Orbit.PrimaryBody, body.Config.name, StringComparison.CurrentCultureIgnoreCase)) + .Where(b => string.Equals(b.Config.Orbit.primaryBody, body.Config.name, StringComparison.CurrentCultureIgnoreCase)) .Select(b => ConstructGraph(b, bodies)) }; } diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 6df9de2f..7b78b1e1 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -17,7 +17,7 @@ using UnityEngine.Events; using UnityEngine.SceneManagement; using Logger = NewHorizons.Utility.Logger; using NewHorizons.Utility.DebugUtilities; -using Newtonsoft.Json.Schema; +using Newtonsoft.Json; namespace NewHorizons { @@ -113,25 +113,8 @@ namespace NewHorizons TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage()); } - #region Assembly Stuff - - public static Assembly ResolveAssembly(object sender, ResolveEventArgs e) - { - Logger.LogError($"Couldn't resolve assembly: {e.Name} from {e.RequestingAssembly.FullName}... Trying to fix it."); - if (e.Name.Contains("Namotion.Reflection")) - return Assembly.LoadFrom("Namotion.Reflection.dll"); - else if (e.Name.Contains("Microsoft.CSharp")) - return Assembly.LoadFrom("Microsoft.CSharp.dll"); - else - return null; - } - - #endregion - public void Start() { - AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; - // Patches Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly()); @@ -385,11 +368,6 @@ namespace NewHorizons Logger.Log($"Registering {language} translation from {mod.ModHelper.Manifest.Name} from {relativeFile}"); var config = new TranslationConfig($"{folder}{relativeFile}"); - if (config == null) - { - Logger.Log($"Found {folder}{relativeFile} but couldn't load it"); - continue; - } foundFile = true; @@ -405,9 +383,11 @@ namespace NewHorizons try { var config = mod.ModHelper.Storage.Load(relativeDirectory); + // var config = JsonConvert.DeserializeObject(File.ReadAllText($"{mod.ModHelper.Manifest.ModFolderPath}/{relativeDirectory}")); + config.MigrateAndValidate(); - Logger.Log($"Loaded {config.name}"); + Logger.Log($"Loaded {config.name}"); if (!SystemDict.ContainsKey(config.starSystem)) { diff --git a/NewHorizons/NewHorizons.csproj b/NewHorizons/NewHorizons.csproj index 9627f0eb..eaceb333 100644 --- a/NewHorizons/NewHorizons.csproj +++ b/NewHorizons/NewHorizons.csproj @@ -1,55 +1,60 @@  - - {8A39F9E7-1A89-430C-9C3E-BDFB3B7E17DF} - net48 - Build - NewHorizons - NewHorizons - Copyright © 2020 - true - false - true - - - portable - 1701;1702;1591 - - - none - 1701;1702;1591 - - - - - - - - - - - Always - - - Always - - - Always - - - - - - - - True - True - Settings.settings - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - + + {8A39F9E7-1A89-430C-9C3E-BDFB3B7E17DF} + net48 + Build + NewHorizons + NewHorizons + Copyright © 2020 + true + false + true + None + + + portable + 1701;1702;1591 + + + none + 1701;1702;1591 + + + + + + + ../System.ComponentModel.Annotations/System.ComponentModel.Annotations.dll + + + + + Always + + + Always + + + Always + + + Always + + + + + + + + True + True + Settings.settings + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + \ No newline at end of file diff --git a/NewHorizons/Utility/MGradient.cs b/NewHorizons/Utility/MGradient.cs index 4848cdc4..dc4fe1ec 100644 --- a/NewHorizons/Utility/MGradient.cs +++ b/NewHorizons/Utility/MGradient.cs @@ -3,18 +3,20 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Newtonsoft.Json; namespace NewHorizons.Utility { + [JsonObject] public class MGradient { public MGradient(float time, MColor tint) { - Time = time; - Tint = tint; + this.time = time; + this.tint = tint; } - public float Time { get; } - public MColor Tint { get; } + public float time; + public MColor tint; } } diff --git a/NewHorizons/Utility/MVector2.cs b/NewHorizons/Utility/MVector2.cs index f8bc789a..1cc25605 100644 --- a/NewHorizons/Utility/MVector2.cs +++ b/NewHorizons/Utility/MVector2.cs @@ -1,16 +1,23 @@ -using UnityEngine; +#region + +using Newtonsoft.Json; +using UnityEngine; + +#endregion + namespace NewHorizons.Utility { + [JsonObject] public class MVector2 { public MVector2(float x, float y) { - X = x; - Y = y; + this.x = x; + this.y = y; } - public float X { get; } - public float Y { get; } + public float x; + public float y; public static implicit operator MVector2(Vector2 vec) { @@ -19,7 +26,7 @@ namespace NewHorizons.Utility public static implicit operator Vector2(MVector2 vec) { - return new Vector2(vec.X, vec.Y); + return new Vector2(vec.x, vec.y); } } } \ No newline at end of file diff --git a/NewHorizons/Utility/MVector3.cs b/NewHorizons/Utility/MVector3.cs index 60250a90..4a02f49c 100644 --- a/NewHorizons/Utility/MVector3.cs +++ b/NewHorizons/Utility/MVector3.cs @@ -1,18 +1,20 @@ -using UnityEngine; +using Newtonsoft.Json; +using UnityEngine; namespace NewHorizons.Utility { + [JsonObject] public class MVector3 { public MVector3(float x, float y, float z) { - X = x; - Y = y; - Z = z; + this.x = x; + this.y = y; + this.z = z; } - public float X { get; } - public float Y { get; } - public float Z { get; } + public float x; + public float y; + public float z; public static implicit operator MVector3(Vector3 vec) { @@ -21,7 +23,7 @@ namespace NewHorizons.Utility public static implicit operator Vector3(MVector3 vec) { - return new Vector3(vec.X, vec.Y, vec.Z); + return new Vector3(vec.x, vec.y, vec.z); } } } diff --git a/SchemaExporter/SchemaExporter.cs b/SchemaExporter/SchemaExporter.cs index e186007d..e0d64bd6 100644 --- a/SchemaExporter/SchemaExporter.cs +++ b/SchemaExporter/SchemaExporter.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Linq; using NewHorizons.External.Configs; using NJsonSchema; using NJsonSchema.Generation; diff --git a/SchemaExporter/SchemaExporter.csproj b/SchemaExporter/SchemaExporter.csproj index e46253cd..6c156b5f 100644 --- a/SchemaExporter/SchemaExporter.csproj +++ b/SchemaExporter/SchemaExporter.csproj @@ -7,6 +7,7 @@ true false false + None portable @@ -27,6 +28,6 @@ - + diff --git a/System.ComponentModel.Annotations/System.ComponentModel.Annotations.dll b/System.ComponentModel.Annotations/System.ComponentModel.Annotations.dll new file mode 100644 index 0000000000000000000000000000000000000000..18886b42db136716fbc2d6053cba1e928830c135 GIT binary patch literal 81040 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 Lb|ImJ(v1B-LsKKZ literal 0 HcmV?d00001