mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
What if I like changed it LOL!!!
This commit is contained in:
parent
1fcf21ff0e
commit
c31064c68e
@ -248,7 +248,16 @@ namespace NewHorizons.Handlers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
Main.Instance.OnPlanetLoaded?.Invoke(body.Config.name);
|
Main.Instance.OnPlanetLoaded?.Invoke(body.Config.name);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Logger.LogError($"Error in event handler for OnPlanetLoaded on body {body.Config.name}: {e.Message} : {e.StackTrace}");
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -50,14 +50,14 @@ namespace NewHorizons
|
|||||||
UnityEvent<string> GetBodyLoadedEvent();
|
UnityEvent<string> GetBodyLoadedEvent();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets an object in the `extras` object of a body config, returns null if the key doesn't exist
|
/// Uses JSONPath to query a body
|
||||||
/// </summary>
|
/// </summary>
|
||||||
object GetExtraModuleForBody(Type moduleType, string extrasModuleName, string planetName);
|
object QueryBody(Type outType, string bodyName, string path);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets an object in the `extras` object of a system config, returns null if the key doesn't exist
|
/// Uses JSONPath to query a system
|
||||||
/// </summary>
|
/// </summary>
|
||||||
object GetExtraModuleForSystem(Type moduleType, string extrasModuleName, string systemName);
|
object QuerySystem(Type outType, string path);
|
||||||
|
|
||||||
/// <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.
|
||||||
|
|||||||
@ -8,6 +8,8 @@ using System.Collections.Generic;
|
|||||||
using System.Data.SqlTypes;
|
using System.Data.SqlTypes;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Events;
|
using UnityEngine.Events;
|
||||||
@ -101,42 +103,40 @@ namespace NewHorizons
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private object GetExtraModule(Type moduleType, string key, string path)
|
private static object QueryJson(Type outType, string filePath, string jsonPath)
|
||||||
{
|
{
|
||||||
if (path == "") return null;
|
if (filePath == "") return null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var jsonText = File.ReadAllText(path);
|
var jsonText = File.ReadAllText(filePath);
|
||||||
var jsonData = JObject.Parse(jsonText);
|
var jsonData = JObject.Parse(jsonText);
|
||||||
var possibleExtras = jsonData.Property("extras")?.Value;
|
return jsonData.SelectToken(jsonPath)?.ToObject(outType);
|
||||||
if (possibleExtras is JObject extras)
|
|
||||||
{
|
|
||||||
return extras.Property(key)?.Value.ToObject(moduleType);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException)
|
catch (FileNotFoundException)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
catch (JsonException e)
|
||||||
|
{
|
||||||
|
Logger.LogError($"{e.Message} : {e.StackTrace}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public object GetExtraModuleForBody(Type moduleType, string extraModuleKey, string planetName)
|
public object QueryBody(Type outType, string bodyName, string jsonPath)
|
||||||
{
|
{
|
||||||
var planet = Main.BodyDict[Main.Instance.CurrentStarSystem].Find((b) => b.Config.name == planetName);
|
var planet = Main.BodyDict[Main.Instance.CurrentStarSystem].Find((b) => b.Config.name == bodyName);
|
||||||
return planet == null
|
return planet == null
|
||||||
? null
|
? null
|
||||||
: GetExtraModule(moduleType, extraModuleKey,
|
: QueryJson(outType, planet.Mod.ModHelper.Manifest.ModFolderPath + planet.RelativePath, jsonPath);
|
||||||
planet.Mod.ModHelper.Manifest.ModFolderPath + planet.RelativePath);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public object GetExtraModuleForSystem(Type moduleType, string extraModuleKey, string systemName)
|
public object QuerySystem(Type outType, string jsonPath)
|
||||||
{
|
{
|
||||||
var system = Main.SystemDict[Main.Instance.CurrentStarSystem];
|
var system = Main.SystemDict[Main.Instance.CurrentStarSystem];
|
||||||
return system == null
|
return system == null
|
||||||
? null
|
? null
|
||||||
: GetExtraModule(moduleType, extraModuleKey,
|
: QueryJson(outType, system.Mod.ModHelper.Manifest.ModFolderPath + system.RelativePath, jsonPath);
|
||||||
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,
|
||||||
|
|||||||
@ -52,14 +52,14 @@ public interface INewHorizons
|
|||||||
UnityEvent<string> GetBodyLoadedEvent();
|
UnityEvent<string> GetBodyLoadedEvent();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets an object in the `extras` object of a body config, returns null if the key doesn't exist
|
/// Uses JSONPath to query a body
|
||||||
/// </summary>
|
/// </summary>
|
||||||
object GetExtraModuleForBody(Type moduleType, string extrasModuleName, string planetName);
|
object QueryBody(Type outType, string bodyName, string path);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets an object in the `extras` object of a system config, returns null if the key doesn't exist
|
/// Uses JSONPath to query a system
|
||||||
/// </summary>
|
/// </summary>
|
||||||
object GetExtraModuleForSystem(Type moduleType, string extrasModuleName, string systemName);
|
object QuerySystem(Type outType, string path);
|
||||||
|
|
||||||
/// <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.
|
||||||
|
|||||||
@ -23,7 +23,7 @@ Addon developers will add a key to the `extras` object in the root of the config
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Your mod will then use the API's `GetExtraModuleForBody` method to obtain the `myCoolExtensionData` object.
|
Your mod will then use the API's `QueryBody` method to obtain the `myCoolExtensionData` object.
|
||||||
|
|
||||||
**It's up to the addon dev to list your mod as a dependency!**
|
**It's up to the addon dev to list your mod as a dependency!**
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ Your mod will then use the API's `GetExtraModuleForBody` method to obtain the `m
|
|||||||
|
|
||||||
You can extend all planets by hooking into the `OnBodyLoaded` event of the API:
|
You can extend all planets by hooking into the `OnBodyLoaded` event of the API:
|
||||||
|
|
||||||
```cs
|
```csharp
|
||||||
var api = ModHelper.Interactions.TryGetModApi<INewHorizons>("xen.NewHorizons");
|
var api = ModHelper.Interactions.TryGetModApi<INewHorizons>("xen.NewHorizons");
|
||||||
api.GetBodyLoadedEvent().AddListener((name) => {
|
api.GetBodyLoadedEvent().AddListener((name) => {
|
||||||
ModHelper.Console.WriteLine($"Body: {name} Loaded!");
|
ModHelper.Console.WriteLine($"Body: {name} Loaded!");
|
||||||
@ -40,19 +40,19 @@ api.GetBodyLoadedEvent().AddListener((name) => {
|
|||||||
|
|
||||||
In order to get your extra module, first define the module as a class:
|
In order to get your extra module, first define the module as a class:
|
||||||
|
|
||||||
```cs
|
```csharp
|
||||||
public class MyCoolExtensionData {
|
public class MyCoolExtensionData {
|
||||||
int myCoolExtensionProperty;
|
int myCoolExtensionProperty;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Then, use the `GetExtraModuleForBody` method:
|
Then, use the `QueryBody` method:
|
||||||
|
|
||||||
```cs
|
```csharp
|
||||||
var api = ModHelper.Interactions.TryGetModApi<INewHorizons>("xen.NewHorizons");
|
var api = ModHelper.Interactions.TryGetModApi<INewHorizons>("xen.NewHorizons");
|
||||||
api.GetBodyLoadedEvent().AddListener((name) => {
|
api.GetBodyLoadedEvent().AddListener((name) => {
|
||||||
ModHelper.Console.WriteLine($"Body: {name} Loaded!");
|
ModHelper.Console.WriteLine($"Body: {name} Loaded!");
|
||||||
var potentialData = api.GetExtraModuleForBody(typeof(MyCoolExtensionData), "myCoolExtensionData", name);
|
var potentialData = api.QueryBody(typeof(MyCoolExtensionData), "$.extras.myCoolExtensionData", name);
|
||||||
// Makes sure the module is valid and not null
|
// Makes sure the module is valid and not null
|
||||||
if (potentialData is MyCoolExtensionData data) {
|
if (potentialData is MyCoolExtensionData data) {
|
||||||
ModHelper.Console.WriteLine($"myCoolExtensionProperty for {name} is {data.myCoolExtensionProperty}!");
|
ModHelper.Console.WriteLine($"myCoolExtensionProperty for {name} is {data.myCoolExtensionProperty}!");
|
||||||
@ -62,4 +62,13 @@ api.GetBodyLoadedEvent().AddListener((name) => {
|
|||||||
|
|
||||||
## Extending Systems
|
## Extending Systems
|
||||||
|
|
||||||
Extending systems is the exact same as extending planets, except you use the `GetExtraModuleForSystem` method instead.
|
Extending systems is the exact same as extending planets, except you use the `QuerySystem` method instead.
|
||||||
|
|
||||||
|
## Accessing Other Values
|
||||||
|
|
||||||
|
You can also use the `QueryBody` method to get values of the config outside of your extension object
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var primaryBody = NHAPI.QueryBody(typeof(string), "Wetrock", "$.Orbit.primaryBody");
|
||||||
|
ModHelper.Console.WriteLine($"Primary of {bodyName} is {primaryBody ?? "NULL"}!");
|
||||||
|
```
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user