Merge branch 'dev' into stellar-remnants

This commit is contained in:
Noah Pilarski 2022-08-25 20:18:23 -04:00
commit 73730b2499
19 changed files with 212 additions and 82 deletions

Binary file not shown.

View File

@ -85,19 +85,7 @@ namespace NewHorizons.Builder.Atmosphere
fluidCLFV._layer = 5; fluidCLFV._layer = 5;
fluidCLFV._priority = 1; fluidCLFV._priority = 1;
fluidCLFV._density = 1.2f; fluidCLFV._density = 1.2f;
fluidCLFV._fluidType = atmo.clouds.fluidType.ConvertToOW(FluidVolume.Type.CLOUD);
var fluidType = FluidVolume.Type.CLOUD;
try
{
fluidType = (FluidVolume.Type)Enum.Parse(typeof(FluidVolume.Type), Enum.GetName(typeof(CloudFluidType), atmo.clouds.fluidType).ToUpper());
}
catch (Exception ex)
{
Logger.LogError($"Couldn't parse fluid volume type [{atmo.clouds.fluidType}]:\n{ex}");
}
fluidCLFV._fluidType = fluidType;
fluidCLFV._allowShipAutoroll = true; fluidCLFV._allowShipAutoroll = true;
fluidCLFV._disableOnStart = false; fluidCLFV._disableOnStart = false;

View File

@ -224,7 +224,7 @@ namespace NewHorizons.Builder.Body
} }
} }
internal static GameObject AddColouredSphere(GameObject rootObj, float size, VariableSizeModule.TimeValuePair[] curve, Color color) internal static GameObject AddColouredSphere(GameObject rootObj, float size, TimeValuePair[] curve, Color color)
{ {
GameObject sphereGO = GameObject.CreatePrimitive(PrimitiveType.Sphere); GameObject sphereGO = GameObject.CreatePrimitive(PrimitiveType.Sphere);
sphereGO.transform.name = "ProxySphere"; sphereGO.transform.name = "ProxySphere";
@ -242,7 +242,7 @@ namespace NewHorizons.Builder.Body
return sphereGO; return sphereGO;
} }
internal static SizeController AddSizeController(GameObject go, VariableSizeModule.TimeValuePair[] curve, float size) internal static SizeController AddSizeController(GameObject go, TimeValuePair[] curve, float size)
{ {
var sizeController = go.AddComponent<SizeController>(); var sizeController = go.AddComponent<SizeController>();
sizeController.SetScaleCurve(curve); sizeController.SetScaleCurve(curve);

View File

@ -7,7 +7,6 @@ using System.Collections.Generic;
using NewHorizons.External.Modules; using NewHorizons.External.Modules;
using UnityEngine; using UnityEngine;
using Logger = NewHorizons.Utility.Logger; using Logger = NewHorizons.Utility.Logger;
using NewHorizons.External.Modules.VariableSize;
namespace NewHorizons.Builder.Body namespace NewHorizons.Builder.Body
{ {
@ -46,20 +45,11 @@ namespace NewHorizons.Builder.Body
trigger._shape = ringShape; trigger._shape = ringShape;
var sfv = ringVolume.AddComponent<RingFluidVolume>(); var sfv = ringVolume.AddComponent<RingFluidVolume>();
var fluidType = FluidVolume.Type.NONE; sfv._fluidType = ring.fluidType.ConvertToOW();
try
{
fluidType = (FluidVolume.Type)Enum.Parse(typeof(FluidVolume.Type), Enum.GetName(typeof(CloudFluidType), ring.fluidType).ToUpper());
}
catch (Exception ex)
{
Logger.LogError($"Couldn't parse fluid volume type [{ring.fluidType}]:\n{ex}");
}
sfv._fluidType = fluidType;
sfv._density = 5f; sfv._density = 5f;
if (ringGO.TryGetComponent<RingOpacityController>(out var ringOC)) ringOC.SetRingFluidVolume(sfv);
ringVolume.SetActive(true); ringVolume.SetActive(true);
@ -127,10 +117,17 @@ namespace NewHorizons.Builder.Body
rot._localAxis = Vector3.down; rot._localAxis = Vector3.down;
} }
if (ring.curve != null) if (ring.scaleCurve != null)
{ {
var levelController = ringGO.AddComponent<SizeController>(); var levelController = ringGO.AddComponent<SizeController>();
levelController.SetScaleCurve(ring.curve); levelController.SetScaleCurve(ring.scaleCurve);
}
if (ring.opacityCurve != null)
{
var ringOC = ringGO.AddComponent<RingOpacityController>();
ringOC.SetOpacityCurve(ring.opacityCurve);
ringOC.SetMeshRenderer(ringMR);
} }
return ringGO; return ringGO;

View File

@ -95,7 +95,7 @@ namespace NewHorizons.Builder.Body
} }
public static GameObject MakeBlackHole(GameObject planetGO, Sector sector, Vector3 localPosition, float size, public static GameObject MakeBlackHole(GameObject planetGO, Sector sector, Vector3 localPosition, float size,
bool hasDestructionVolume, string targetSolarSystem, VariableSizeModule.TimeValuePair[] curve = null, bool makeAudio = true) bool hasDestructionVolume, string targetSolarSystem = null, TimeValuePair[] curve = null, bool makeAudio = true)
{ {
var blackHole = new GameObject("BlackHole"); var blackHole = new GameObject("BlackHole");
blackHole.SetActive(false); blackHole.SetActive(false);
@ -181,7 +181,7 @@ namespace NewHorizons.Builder.Body
} }
public static GameObject MakeWhiteHole(GameObject planetGO, Sector sector, OWRigidbody OWRB, Vector3 localPosition, float size, public static GameObject MakeWhiteHole(GameObject planetGO, Sector sector, OWRigidbody OWRB, Vector3 localPosition, float size,
VariableSizeModule.TimeValuePair[] curve, bool makeZeroGVolume = true) TimeValuePair[] curve, bool makeZeroGVolume = true)
{ {
var whiteHole = new GameObject("WhiteHole"); var whiteHole = new GameObject("WhiteHole");
whiteHole.SetActive(false); whiteHole.SetActive(false);

View File

@ -208,6 +208,8 @@ namespace NewHorizons.Builder.Props
component._nomaiTexts[i] = wallText; component._nomaiTexts[i] = wallText;
} }
if (info.disableWall) whiteboard.FindChild("Props_NOM_Whiteboard_Shared").SetActive(false);
whiteboard.SetActive(true); whiteboard.SetActive(true);
} }
@ -251,6 +253,14 @@ namespace NewHorizons.Builder.Props
component._visualSector = sector; component._visualSector = sector;
component._dataPointID = info.reveals; component._dataPointID = info.reveals;
if (info.disableStructure)
{
platform.FindChild("Structure_NOM_RemoteViewer").SetActive(false);
platform.FindChild("RemoteViewer_FadeGeo").SetActive(false);
}
if (info.disablePool) platform.FindChild("RemoteViewer_Pool").SetActive(false);
platform.SetActive(true); platform.SetActive(true);
} }

View File

@ -2,6 +2,7 @@ using NewHorizons.Components;
using NewHorizons.External.Modules; using NewHorizons.External.Modules;
using NewHorizons.Handlers; using NewHorizons.Handlers;
using NewHorizons.Utility; using NewHorizons.Utility;
using System;
using UnityEngine; using UnityEngine;
using Logger = NewHorizons.Utility.Logger; using Logger = NewHorizons.Utility.Logger;
using Random = UnityEngine.Random; using Random = UnityEngine.Random;
@ -143,15 +144,9 @@ namespace NewHorizons.Builder.Props
tornadoGO.GetComponentInChildren<CapsuleShape>().enabled = true; tornadoGO.GetComponentInChildren<CapsuleShape>().enabled = true;
// Resize it so the force volume goes all the way up // Resize it so the force volume goes all the way up
switch (downwards) var fluidGO = tornadoGO.transform.Find(downwards ? "MockDownTornado_FluidCenter" : "MockUpTornado_FluidCenter");
{ fluidGO.GetComponent<TornadoFluidVolume>()._fluidType = info.fluidType.ConvertToOW(FluidVolume.Type.CLOUD);
case true: fluidGO.localScale = new Vector3(1, 2f, 1);
tornadoGO.transform.Find("MockDownTornado_FluidCenter").localScale = new Vector3(1, 2f, 1);
break;
default:
tornadoGO.transform.Find("MockUpTornado_FluidCenter").localScale = new Vector3(1, 2f, 1);
break;
}
if (info.tint != null) if (info.tint != null)
{ {
@ -176,6 +171,7 @@ namespace NewHorizons.Builder.Props
hurricaneGO.transform.rotation = Quaternion.FromToRotation(Vector3.up, sector.transform.TransformDirection(position.normalized)); hurricaneGO.transform.rotation = Quaternion.FromToRotation(Vector3.up, sector.transform.TransformDirection(position.normalized));
var fluidVolume = hurricaneGO.GetComponentInChildren<HurricaneFluidVolume>(); var fluidVolume = hurricaneGO.GetComponentInChildren<HurricaneFluidVolume>();
fluidVolume._fluidType = info.fluidType.ConvertToOW(FluidVolume.Type.CLOUD);
fluidVolume._density = 8; fluidVolume._density = 8;
var effects = hurricaneGO.transform.Find("Effects_GD_Hurricane").gameObject; var effects = hurricaneGO.transform.Find("Effects_GD_Hurricane").gameObject;

View File

@ -17,5 +17,7 @@ namespace NewHorizons.Components
fluidDetector.AddVolume(this); fluidDetector.AddVolume(this);
} }
public override bool IsSpherical() => false;
} }
} }

View File

@ -0,0 +1,51 @@
using NewHorizons.External.Modules.VariableSize;
using NewHorizons.Utility;
using UnityEngine;
namespace NewHorizons.Components
{
public class RingOpacityController : MonoBehaviour
{
private static readonly int Alpha = Shader.PropertyToID("_Alpha");
public AnimationCurve opacityCurve { get; protected set; }
public float CurrentOpacity { get; protected set; }
private MeshRenderer _meshRenderer;
private RingFluidVolume _ringFluidVolume;
protected void FixedUpdate()
{
if (opacityCurve != null)
{
CurrentOpacity = opacityCurve.Evaluate(TimeLoop.GetMinutesElapsed());
}
else
{
CurrentOpacity = 1;
}
if (_ringFluidVolume != null)
{
if (Mathf.Approximately(CurrentOpacity, 0) && _ringFluidVolume.IsVolumeActive()) _ringFluidVolume.SetVolumeActivation(false);
else if (!_ringFluidVolume.IsVolumeActive()) _ringFluidVolume.SetVolumeActivation(true);
}
if (_meshRenderer == null) return;
_meshRenderer.material.SetFloat(Alpha, CurrentOpacity);
}
public void SetOpacityCurve(TimeValuePair[] curve)
{
opacityCurve = new AnimationCurve();
foreach (var pair in curve)
{
opacityCurve.AddKey(new Keyframe(pair.time, pair.value));
}
}
public void SetMeshRenderer(MeshRenderer meshRenderer) => _meshRenderer = meshRenderer;
public void SetRingFluidVolume(RingFluidVolume ringFluidVolume) => _ringFluidVolume = ringFluidVolume;
}
}

View File

@ -1,4 +1,5 @@
using NewHorizons.External.Modules.VariableSize; using NewHorizons.External.Modules.VariableSize;
using NewHorizons.Utility;
using UnityEngine; using UnityEngine;
namespace NewHorizons.Components.SizeControllers namespace NewHorizons.Components.SizeControllers
{ {
@ -22,7 +23,7 @@ namespace NewHorizons.Components.SizeControllers
base.transform.localScale = Vector3.one * CurrentScale; base.transform.localScale = Vector3.one * CurrentScale;
} }
public void SetScaleCurve(VariableSizeModule.TimeValuePair[] curve) public void SetScaleCurve(TimeValuePair[] curve)
{ {
scaleCurve = new AnimationCurve(); scaleCurve = new AnimationCurve();
foreach (var pair in curve) foreach (var pair in curve)

View File

@ -379,6 +379,12 @@ namespace NewHorizons.External.Configs
if (!string.IsNullOrEmpty(Cloak.audioClip)) Cloak.audio = Cloak.audioClip; if (!string.IsNullOrEmpty(Cloak.audioClip)) Cloak.audio = Cloak.audioClip;
if (!string.IsNullOrEmpty(Cloak.audioFilePath)) Cloak.audio = Cloak.audioFilePath; if (!string.IsNullOrEmpty(Cloak.audioFilePath)) Cloak.audio = Cloak.audioFilePath;
} }
// Rings are no longer variable size module
if (Ring != null)
{
if (Ring.curve != null) Ring.scaleCurve = Ring.curve;
}
} }
} }
} }

View File

@ -9,7 +9,7 @@ using Newtonsoft.Json.Converters;
namespace NewHorizons.External.Modules namespace NewHorizons.External.Modules
{ {
[JsonConverter(typeof(StringEnumConverter))] [JsonConverter(typeof(StringEnumConverter))]
public enum CloudFluidType public enum FluidType
{ {
[EnumMember(Value = @"none")] None = 0, [EnumMember(Value = @"none")] None = 0,
@ -126,7 +126,7 @@ namespace NewHorizons.External.Modules
/// <summary> /// <summary>
/// Fluid type for sounds/effects when colliding with this cloud. /// Fluid type for sounds/effects when colliding with this cloud.
/// </summary> /// </summary>
[DefaultValue("cloud")] public CloudFluidType fluidType = CloudFluidType.Cloud; [DefaultValue("cloud")] public FluidType fluidType = FluidType.Cloud;
/// <summary> /// <summary>
/// Add lightning to this planet like on Giant's Deep. /// Add lightning to this planet like on Giant's Deep.
@ -202,8 +202,8 @@ namespace NewHorizons.External.Modules
[Obsolete("CloudRamp is deprecated, please use CloudInfo instead")] [Obsolete("CloudRamp is deprecated, please use CloudInfo instead")]
public string cloudRamp; public string cloudRamp;
[Obsolete("CloudFluidType is deprecated, please use CloudInfo instead")] [Obsolete("FluidType is deprecated, please use CloudInfo instead")]
public CloudFluidType fluidType; public FluidType fluidType;
[Obsolete("UseBasicCloudShader is deprecated, please use CloudInfo instead")] [Obsolete("UseBasicCloudShader is deprecated, please use CloudInfo instead")]
public bool useBasicCloudShader; public bool useBasicCloudShader;

View File

@ -325,6 +325,11 @@ namespace NewHorizons.External.Modules
/// The maximum distance at which you'll hear the sounds of the cyclone. If not set it will scale relative to the size of the cyclone. /// The maximum distance at which you'll hear the sounds of the cyclone. If not set it will scale relative to the size of the cyclone.
/// </summary> /// </summary>
public float audioDistance; public float audioDistance;
/// <summary>
/// Fluid type for sounds/effects when colliding with this tornado.
/// </summary>
[DefaultValue("cloud")] public FluidType fluidType = FluidType.Cloud;
} }
[JsonObject] [JsonObject]
@ -893,6 +898,11 @@ namespace NewHorizons.External.Modules
/// </summary> /// </summary>
public string rename; public string rename;
/// <summary>
/// Disable the wall, leaving only the pedestal and text.
/// </summary>
public bool disableWall;
[JsonObject] [JsonObject]
public class SharedNomaiTextInfo public class SharedNomaiTextInfo
{ {
@ -955,6 +965,16 @@ namespace NewHorizons.External.Modules
/// A ship log fact to reveal when the platform is connected to. /// A ship log fact to reveal when the platform is connected to.
/// </summary> /// </summary>
[DefaultValue("")] public string reveals = ""; [DefaultValue("")] public string reveals = "";
/// <summary>
/// Disable the structure, leaving only the pedestal.
/// </summary>
public bool disableStructure;
/// <summary>
/// Disable the pool that rises when you place a stone.
/// </summary>
public bool disablePool;
} }
[JsonObject] [JsonObject]

View File

@ -1,15 +1,17 @@
using System.ComponentModel.DataAnnotations; using System;
using System.ComponentModel.DataAnnotations;
using NewHorizons.Utility;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace NewHorizons.External.Modules.VariableSize namespace NewHorizons.External.Modules
{ {
[JsonObject] [JsonObject]
public class RingModule : VariableSizeModule public class RingModule
{ {
/// <summary> /// <summary>
/// Fluid type for sounds/effects when colliding with this ring. /// Fluid type for sounds/effects when colliding with this ring.
/// </summary> /// </summary>
public CloudFluidType fluidType = CloudFluidType.None; public FluidType fluidType = FluidType.None;
/// <summary> /// <summary>
/// Angle between the rings and the equatorial plane of the planet. /// Angle between the rings and the equatorial plane of the planet.
@ -45,5 +47,20 @@ namespace NewHorizons.External.Modules.VariableSize
/// Should this ring be unlit? /// Should this ring be unlit?
/// </summary> /// </summary>
public bool unlit; public bool unlit;
#region Obsolete
[Obsolete("curve is deprecated, please use scaleCurve instead")]
public TimeValuePair[] curve;
#endregion
/// <summary>
/// Scale rings over time. Optional. Value between 0-1, time is in minutes.
/// </summary>
public TimeValuePair[] scaleCurve;
/// <summary>
/// Fade rings in/out over time. Optional. Value between 0-1, time is in minutes.
/// </summary>
public TimeValuePair[] opacityCurve;
} }
} }

View File

@ -1,3 +1,4 @@
using NewHorizons.Utility;
using Newtonsoft.Json; using Newtonsoft.Json;
using UnityEngine; using UnityEngine;
@ -7,22 +8,8 @@ namespace NewHorizons.External.Modules.VariableSize
public class VariableSizeModule public class VariableSizeModule
{ {
/// <summary> /// <summary>
/// Scale this module over time /// Scale this object over time
/// </summary> /// </summary>
public TimeValuePair[] curve; public TimeValuePair[] curve;
[JsonObject]
public class TimeValuePair
{
/// <summary>
/// A specific point in time
/// </summary>
public float time;
/// <summary>
/// The value for this point in time
/// </summary>
public float value;
}
} }
} }

View File

@ -5,7 +5,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
using Logger = NewHorizons.Utility.Logger; using Logger = NewHorizons.Utility.Logger;
using NewHorizons.External.Modules.VariableSize;
namespace NewHorizons.Handlers namespace NewHorizons.Handlers
{ {

View File

@ -335,7 +335,7 @@
"fluidType": { "fluidType": {
"description": "Fluid type for sounds/effects when colliding with this cloud.", "description": "Fluid type for sounds/effects when colliding with this cloud.",
"default": "cloud", "default": "cloud",
"$ref": "#/definitions/CloudFluidType" "$ref": "#/definitions/FluidType"
}, },
"hasLightning": { "hasLightning": {
"type": "boolean", "type": "boolean",
@ -396,7 +396,7 @@
"basic" "basic"
] ]
}, },
"CloudFluidType": { "FluidType": {
"type": "string", "type": "string",
"description": "", "description": "",
"x-enumNames": [ "x-enumNames": [
@ -665,7 +665,7 @@
"properties": { "properties": {
"curve": { "curve": {
"type": "array", "type": "array",
"description": "Scale this module over time", "description": "Scale this object over time",
"items": { "items": {
"$ref": "#/definitions/TimeValuePair" "$ref": "#/definitions/TimeValuePair"
} }
@ -769,7 +769,7 @@
"properties": { "properties": {
"curve": { "curve": {
"type": "array", "type": "array",
"description": "Scale this module over time", "description": "Scale this object over time",
"items": { "items": {
"$ref": "#/definitions/TimeValuePair" "$ref": "#/definitions/TimeValuePair"
} }
@ -1680,6 +1680,11 @@
"type": "number", "type": "number",
"description": "The maximum distance at which you'll hear the sounds of the cyclone. If not set it will scale relative to the size of the cyclone.", "description": "The maximum distance at which you'll hear the sounds of the cyclone. If not set it will scale relative to the size of the cyclone.",
"format": "float" "format": "float"
},
"fluidType": {
"description": "Fluid type for sounds/effects when colliding with this tornado.",
"default": "cloud",
"$ref": "#/definitions/FluidType"
} }
} }
}, },
@ -1750,7 +1755,7 @@
"properties": { "properties": {
"curve": { "curve": {
"type": "array", "type": "array",
"description": "Scale this module over time", "description": "Scale this object over time",
"items": { "items": {
"$ref": "#/definitions/TimeValuePair" "$ref": "#/definitions/TimeValuePair"
} }
@ -1978,6 +1983,10 @@
"rename": { "rename": {
"type": "string", "type": "string",
"description": "An optional rename of this object" "description": "An optional rename of this object"
},
"disableWall": {
"type": "boolean",
"description": "Disable the wall, leaving only the pedestal and text."
} }
} }
}, },
@ -2040,6 +2049,14 @@
"type": "string", "type": "string",
"description": "A ship log fact to reveal when the platform is connected to.", "description": "A ship log fact to reveal when the platform is connected to.",
"default": "" "default": ""
},
"disableStructure": {
"type": "boolean",
"description": "Disable the structure, leaving only the pedestal."
},
"disablePool": {
"type": "boolean",
"description": "Disable the pool that rises when you place a stone."
} }
} }
}, },
@ -2108,16 +2125,9 @@
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"curve": {
"type": "array",
"description": "Scale this module over time",
"items": {
"$ref": "#/definitions/TimeValuePair"
}
},
"fluidType": { "fluidType": {
"description": "Fluid type for sounds/effects when colliding with this ring.", "description": "Fluid type for sounds/effects when colliding with this ring.",
"$ref": "#/definitions/CloudFluidType" "$ref": "#/definitions/FluidType"
}, },
"inclination": { "inclination": {
"type": "number", "type": "number",
@ -2153,6 +2163,20 @@
"unlit": { "unlit": {
"type": "boolean", "type": "boolean",
"description": "Should this ring be unlit?" "description": "Should this ring be unlit?"
},
"scaleCurve": {
"type": "array",
"description": "Scale rings over time. Optional. Value between 0-1, time is in minutes.",
"items": {
"$ref": "#/definitions/TimeValuePair"
}
},
"opacityCurve": {
"type": "array",
"description": "Fade rings in/out over time. Optional. Value between 0-1, time is in minutes.",
"items": {
"$ref": "#/definitions/TimeValuePair"
}
} }
} }
}, },
@ -2162,7 +2186,7 @@
"properties": { "properties": {
"curve": { "curve": {
"type": "array", "type": "array",
"description": "Scale this module over time", "description": "Scale this object over time",
"items": { "items": {
"$ref": "#/definitions/TimeValuePair" "$ref": "#/definitions/TimeValuePair"
} }
@ -2334,7 +2358,7 @@
"properties": { "properties": {
"curve": { "curve": {
"type": "array", "type": "array",
"description": "Scale this module over time", "description": "Scale this object over time",
"items": { "items": {
"$ref": "#/definitions/TimeValuePair" "$ref": "#/definitions/TimeValuePair"
} }
@ -2468,7 +2492,7 @@
"properties": { "properties": {
"curve": { "curve": {
"type": "array", "type": "array",
"description": "Scale this module over time", "description": "Scale this object over time",
"items": { "items": {
"$ref": "#/definitions/TimeValuePair" "$ref": "#/definitions/TimeValuePair"
} }

View File

@ -1,4 +1,5 @@
using NewHorizons.External.Configs; using NewHorizons.External.Configs;
using NewHorizons.External.Modules;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -215,5 +216,18 @@ namespace NewHorizons.Utility
Utility.Logger.LogVerbose($"Coordinate Check for {system}: {xCorrect}, {yCorrect}, {zCorrect} [{string.Join("-", coordinates.x)}, {string.Join("-", coordinates.y)}, {string.Join("-", coordinates.z)}]"); Utility.Logger.LogVerbose($"Coordinate Check for {system}: {xCorrect}, {yCorrect}, {zCorrect} [{string.Join("-", coordinates.x)}, {string.Join("-", coordinates.y)}, {string.Join("-", coordinates.z)}]");
return xCorrect && yCorrect && zCorrect; return xCorrect && yCorrect && zCorrect;
} }
public static FluidVolume.Type ConvertToOW(this FluidType fluidType, FluidVolume.Type @default = FluidVolume.Type.NONE)
{
try
{
return (FluidVolume.Type)Enum.Parse(typeof(FluidVolume.Type), Enum.GetName(typeof(FluidType), fluidType).ToUpper());
}
catch (Exception ex)
{
Logger.LogError($"Couldn't parse fluid volume type [{fluidType}]:\n{ex}");
return @default;
}
}
} }
} }

View File

@ -0,0 +1,18 @@
using Newtonsoft.Json;
namespace NewHorizons.Utility
{
[JsonObject]
public class TimeValuePair
{
/// <summary>
/// A specific point in time
/// </summary>
public float time;
/// <summary>
/// The value for this point in time
/// </summary>
public float value;
}
}