Made generic API methods

This commit is contained in:
Ben C 2022-10-18 08:56:24 -04:00
parent ac423de88b
commit 728f8d7ffe
4 changed files with 123 additions and 84 deletions

View File

@ -54,11 +54,21 @@ namespace NewHorizons
/// </summary> /// </summary>
object QueryBody(Type outType, string bodyName, string path); object QueryBody(Type outType, string bodyName, string path);
///<summary>
/// Uses JSONPath to query a body
/// </summary>
T QueryBody<T>(string bodyName, string path);
/// <summary> /// <summary>
/// Uses JSONPath to query a system /// Uses JSONPath to query the current star system
/// </summary> /// </summary>
object QuerySystem(Type outType, string path); object QuerySystem(Type outType, string path);
///<summary>
/// Uses JSONPath to query the current star system
///</summary>
T QuerySystem<T>(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.
/// </summary> /// </summary>

View File

@ -129,6 +129,16 @@ namespace NewHorizons
: QueryJson(outType, Path.Combine(planet.Mod.ModHelper.Manifest.ModFolderPath, planet.RelativePath), jsonPath); : QueryJson(outType, Path.Combine(planet.Mod.ModHelper.Manifest.ModFolderPath, planet.RelativePath), jsonPath);
} }
public T QueryBody<T>(string bodyName, string jsonPath)
{
var data = QueryBody(typeof(T), bodyName, jsonPath);
if (data is T result) {
return result;
} else {
return default(T);
}
}
public object QuerySystem(Type outType, string jsonPath) public object QuerySystem(Type outType, string jsonPath)
{ {
var system = Main.SystemDict[Main.Instance.CurrentStarSystem]; var system = Main.SystemDict[Main.Instance.CurrentStarSystem];
@ -137,6 +147,15 @@ namespace NewHorizons
: QueryJson(outType, Path.Combine(system.Mod.ModHelper.Manifest.ModFolderPath, system.RelativePath), jsonPath); : QueryJson(outType, Path.Combine(system.Mod.ModHelper.Manifest.ModFolderPath, system.RelativePath), jsonPath);
} }
public T QuerySystem<T>(string jsonPath) {
var data = QuerySystem(typeof(T), jsonPath);
if (data is T result) {
return result;
} else {
return default(T);
}
}
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,
float scale, bool alignWithNormal) float scale, bool alignWithNormal)
{ {

View File

@ -9,7 +9,7 @@ First create the following interface in your mod:
```cs ```cs
public interface INewHorizons public interface INewHorizons
{ {
[Obsolete("Create(Dictionary<string, object> config) is deprecated, please use LoadConfigs(IModBehaviour mod) instead")] [Obsolete("Create(Dictionary<string, object> config) is deprecated, please use LoadConfigs(IModBehaviour mod) instead")]
void Create(Dictionary<string, object> config); void Create(Dictionary<string, object> config);
@ -56,11 +56,21 @@ public interface INewHorizons
/// </summary> /// </summary>
object QueryBody(Type outType, string bodyName, string path); object QueryBody(Type outType, string bodyName, string path);
///<summary>
/// Uses JSONPath to query a body
/// </summary>
T QueryBody<T>(string bodyName, string path);
/// <summary> /// <summary>
/// Uses JSONPath to query a system /// Uses JSONPath to query the current star system
/// </summary> /// </summary>
object QuerySystem(Type outType, string path); object QuerySystem(Type outType, string path);
///<summary>
/// Uses JSONPath to query the current star system
///</summary>
T QuerySystem<T>(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.
/// </summary> /// </summary>
@ -101,7 +111,7 @@ public interface INewHorizons
(CharacterDialogueTree, RemoteDialogueTrigger) SpawnDialogue(IModBehaviour mod, GameObject root, string xmlFile, float radius = 1f, (CharacterDialogueTree, RemoteDialogueTrigger) SpawnDialogue(IModBehaviour mod, GameObject root, string xmlFile, float radius = 1f,
float range = 1f, string blockAfterPersistentCondition = null, float lookAtRadius = 1f, string pathToAnimController = null, float range = 1f, string blockAfterPersistentCondition = null, float lookAtRadius = 1f, string pathToAnimController = null,
float remoteTriggerRadius = 0f); float remoteTriggerRadius = 0f);
} }
``` ```
In your main `ModBehaviour` class you can get the NewHorizons API like so: In your main `ModBehaviour` class you can get the NewHorizons API like so:

View File

@ -52,9 +52,9 @@ Then, use the `QueryBody` method:
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.QueryBody(typeof(MyCoolExtensionData), "$.extras.myCoolExtensionData", name); var data = api.QueryBody<MyCoolExtensionData>("$.extras.myCoolExtensionData", name);
// Makes sure the module is valid and not null // Makes sure the module is not null
if (potentialData is MyCoolExtensionData data) { if (data != null) {
ModHelper.Console.WriteLine($"myCoolExtensionProperty for {name} is {data.myCoolExtensionProperty}!"); ModHelper.Console.WriteLine($"myCoolExtensionProperty for {name} is {data.myCoolExtensionProperty}!");
} }
}); });
@ -69,6 +69,6 @@ Extending systems is the exact same as extending planets, except you use the `Qu
You can also use the `QueryBody` method to get values of the config outside your extension object You can also use the `QueryBody` method to get values of the config outside your extension object
```csharp ```csharp
var primaryBody = api.QueryBody(typeof(string), "Wetrock", "$.Orbit.primaryBody"); var primaryBody = api.QueryBody<string>("Wetrock", "$.Orbit.primaryBody");
ModHelper.Console.WriteLine($"Primary of {bodyName} is {primaryBody ?? "NULL"}!"); ModHelper.Console.WriteLine($"Primary of {bodyName} is {primaryBody ?? "NULL"}!");
``` ```