Merge branch 'dev' into titlescreen-popups

This commit is contained in:
Nick 2022-09-05 00:44:53 -04:00
commit d65bb15aa5
25 changed files with 666 additions and 108 deletions

Binary file not shown.

View File

@ -1,14 +1,16 @@
ManifestFileVersion: 0 ManifestFileVersion: 0
CRC: 1014555239 CRC: 2022446871
Hashes: Hashes:
AssetFileHash: AssetFileHash:
serializedVersion: 2 serializedVersion: 2
Hash: 45fa3430ee7bea1e8384e57927fc0f76 Hash: 083882699617744b8fc49234bb8cb795
TypeTreeHash: TypeTreeHash:
serializedVersion: 2 serializedVersion: 2
Hash: 55d48f4ad9c3b13330b9eb5ee5686477 Hash: 10a6a558690295dadb3dd990eda0821a
HashAppended: 0 HashAppended: 0
ClassTypes: ClassTypes:
- Class: 21
Script: {instanceID: 0}
- Class: 48 - Class: 48
Script: {instanceID: 0} Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: [] SerializeReferenceClassIdentifiers: []
@ -18,6 +20,7 @@ Assets:
- Assets/Shaders/SphereTextureWrapperNormal.shader - Assets/Shaders/SphereTextureWrapperNormal.shader
- Assets/Shaders/UnlitRing1Pixel.shader - Assets/Shaders/UnlitRing1Pixel.shader
- Assets/Shaders/UnlitTransparent.shader - Assets/Shaders/UnlitTransparent.shader
- Assets/Resources/TransparentCloud.mat
- Assets/Shaders/StandardCullOFF.shader - Assets/Shaders/StandardCullOFF.shader
- Assets/Shaders/Ring1Pixel.shader - Assets/Shaders/Ring1Pixel.shader
Dependencies: [] Dependencies: []

View File

@ -59,7 +59,7 @@ namespace NewHorizons.Builder.Atmosphere
} }
} }
material.SetFloat(InnerRadius, atmosphereModule.clouds != null ? atmosphereModule.size : surfaceSize); material.SetFloat(InnerRadius, (atmosphereModule.clouds != null && atmosphereModule.clouds.cloudsPrefab != CloudPrefabType.Transparent) ? atmosphereModule.size : surfaceSize);
material.SetFloat(OuterRadius, atmosphereModule.size * 1.2f); material.SetFloat(OuterRadius, atmosphereModule.size * 1.2f);
if (atmosphereModule.atmosphereTint != null) material.SetColor(SkyColor, atmosphereModule.atmosphereTint.ToColor()); if (atmosphereModule.atmosphereTint != null) material.SetColor(SkyColor, atmosphereModule.atmosphereTint.ToColor());

View File

@ -11,6 +11,7 @@ namespace NewHorizons.Builder.Atmosphere
{ {
private static Material[] _gdCloudMaterials; private static Material[] _gdCloudMaterials;
private static Material[] _qmCloudMaterials; private static Material[] _qmCloudMaterials;
private static Material _transparentCloud;
private static GameObject _lightningPrefab; private static GameObject _lightningPrefab;
private static Texture2D _colorRamp; private static Texture2D _colorRamp;
private static readonly int Color = Shader.PropertyToID("_Color"); private static readonly int Color = Shader.PropertyToID("_Color");
@ -18,6 +19,7 @@ namespace NewHorizons.Builder.Atmosphere
private static readonly int MainTex = Shader.PropertyToID("_MainTex"); private static readonly int MainTex = Shader.PropertyToID("_MainTex");
private static readonly int RampTex = Shader.PropertyToID("_RampTex"); private static readonly int RampTex = Shader.PropertyToID("_RampTex");
private static readonly int CapTex = Shader.PropertyToID("_CapTex"); private static readonly int CapTex = Shader.PropertyToID("_CapTex");
private static readonly int Smoothness = Shader.PropertyToID("_Glossiness");
public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, bool cloaked, IModBehaviour mod) public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, bool cloaked, IModBehaviour mod)
{ {
@ -28,7 +30,15 @@ namespace NewHorizons.Builder.Atmosphere
cloudsMainGO.SetActive(false); cloudsMainGO.SetActive(false);
cloudsMainGO.transform.parent = sector?.transform ?? planetGO.transform; cloudsMainGO.transform.parent = sector?.transform ?? planetGO.transform;
MakeTopClouds(cloudsMainGO, atmo, mod); if (atmo.clouds.cloudsPrefab != CloudPrefabType.Transparent) MakeTopClouds(cloudsMainGO, atmo, mod);
else
{
MakeTransparentClouds(cloudsMainGO, atmo, mod);
if (atmo.clouds.hasLightning) MakeLightning(cloudsMainGO, sector, atmo);
cloudsMainGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero);
cloudsMainGO.SetActive(true);
return;
}
GameObject cloudsBottomGO = new GameObject("BottomClouds"); GameObject cloudsBottomGO = new GameObject("BottomClouds");
cloudsBottomGO.SetActive(false); cloudsBottomGO.SetActive(false);
@ -114,7 +124,7 @@ namespace NewHorizons.Builder.Atmosphere
lightning.transform.localPosition = Vector3.zero; lightning.transform.localPosition = Vector3.zero;
var lightningGenerator = lightning.GetComponent<CloudLightningGenerator>(); var lightningGenerator = lightning.GetComponent<CloudLightningGenerator>();
lightningGenerator._altitude = (atmo.clouds.outerCloudRadius + atmo.clouds.innerCloudRadius) / 2f; lightningGenerator._altitude = atmo.clouds.cloudsPrefab != CloudPrefabType.Transparent ? (atmo.clouds.outerCloudRadius + atmo.clouds.innerCloudRadius) / 2f : atmo.clouds.outerCloudRadius;
if (noAudio) if (noAudio)
{ {
lightningGenerator._audioPrefab = null; lightningGenerator._audioPrefab = null;
@ -177,7 +187,7 @@ namespace NewHorizons.Builder.Atmosphere
var material = new Material(Shader.Find("Standard")); var material = new Material(Shader.Find("Standard"));
if (atmo.clouds.unlit) material.renderQueue = 3000; if (atmo.clouds.unlit) material.renderQueue = 3000;
material.name = atmo.clouds.unlit ? "BasicCloud" : "BasicShadowCloud"; material.name = atmo.clouds.unlit ? "BasicCloud" : "BasicShadowCloud";
material.SetFloat(279, 0f); // smoothness material.SetFloat(Smoothness, 0f);
tempArray[0] = material; tempArray[0] = material;
} }
else else
@ -218,5 +228,65 @@ namespace NewHorizons.Builder.Atmosphere
return cloudsTopGO; return cloudsTopGO;
} }
public static GameObject MakeTransparentClouds(GameObject rootObject, AtmosphereModule atmo, IModBehaviour mod, bool isProxy = false)
{
Texture2D image;
try
{
image = ImageUtilities.GetTexture(mod, atmo.clouds.texturePath);
}
catch (Exception e)
{
Logger.LogError($"Couldn't load Cloud texture for [{atmo.clouds.texturePath}]:\n{e}");
return null;
}
GameObject cloudsTransparentGO = new GameObject("TransparentClouds");
cloudsTransparentGO.SetActive(false);
cloudsTransparentGO.transform.parent = rootObject.transform;
cloudsTransparentGO.transform.localScale = Vector3.one * atmo.clouds.outerCloudRadius;
MeshFilter filter = cloudsTransparentGO.AddComponent<MeshFilter>();
filter.mesh = SearchUtilities.Find("CloudsTopLayer_GD").GetComponent<MeshFilter>().mesh;
MeshRenderer renderer = cloudsTransparentGO.AddComponent<MeshRenderer>();
if (_transparentCloud == null) _transparentCloud = Main.NHAssetBundle.LoadAsset<Material>("Assets/Resources/TransparentCloud.mat");
var material = new Material(_transparentCloud);
material.name = "TransparentClouds_" + image.name;
material.SetTexture(MainTex, image);
renderer.sharedMaterial = material;
if (!isProxy)
{
GameObject tcrqcGO = new GameObject("TransparentCloudRenderQueueController");
tcrqcGO.transform.SetParent(cloudsTransparentGO.transform, false);
tcrqcGO.layer = LayerMask.NameToLayer("BasicEffectVolume");
var shape = tcrqcGO.AddComponent<SphereShape>();
shape.radius = 1;
var owTriggerVolume = tcrqcGO.AddComponent<OWTriggerVolume>();
owTriggerVolume._shape = shape;
TransparentCloudRenderQueueController tcrqc = tcrqcGO.AddComponent<TransparentCloudRenderQueueController>();
tcrqc.renderer = renderer;
}
if (atmo.clouds.rotationSpeed != 0f)
{
var rt = cloudsTransparentGO.AddComponent<RotateTransform>();
rt._localAxis = Vector3.up;
rt._degreesPerSecond = atmo.clouds.rotationSpeed;
rt._randomizeRotationRate = false;
}
cloudsTransparentGO.transform.localPosition = Vector3.zero;
cloudsTransparentGO.SetActive(true);
return cloudsTransparentGO;
}
} }
} }

View File

@ -21,7 +21,6 @@ namespace NewHorizons.Builder.Atmosphere
SCG._waitForStreaming = false; SCG._waitForStreaming = false;
var minHeight = surfaceSize; var minHeight = surfaceSize;
var maxHeight = config.Atmosphere.size;
if (config.HeightMap?.minHeight != null) if (config.HeightMap?.minHeight != null)
{ {
if (config.Water?.size >= config.HeightMap.minHeight) minHeight = config.Water.size; // use sea level if its higher if (config.Water?.size >= config.HeightMap.minHeight) minHeight = config.Water.size; // use sea level if its higher
@ -30,6 +29,9 @@ namespace NewHorizons.Builder.Atmosphere
else if (config.Water?.size != null) minHeight = config.Water.size; else if (config.Water?.size != null) minHeight = config.Water.size;
else if (config.Lava?.size != null) minHeight = config.Lava.size; else if (config.Lava?.size != null) minHeight = config.Lava.size;
var maxHeight = config.Atmosphere.size;
if (config.Atmosphere.clouds?.outerCloudRadius != null) maxHeight = config.Atmosphere.clouds.outerCloudRadius;
if (config.Atmosphere.hasRain) if (config.Atmosphere.hasRain)
{ {
var rainGO = GameObject.Instantiate(SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Sector_GDInterior/Effects_GDInterior/Effects_GD_Rain"), effectsGO.transform); var rainGO = GameObject.Instantiate(SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Sector_GDInterior/Effects_GDInterior/Effects_GD_Rain"), effectsGO.transform);

View File

@ -111,7 +111,8 @@ namespace NewHorizons.Builder.Body
if (body.Config.Atmosphere.clouds != null) if (body.Config.Atmosphere.clouds != null)
{ {
topClouds = CloudsBuilder.MakeTopClouds(proxy, body.Config.Atmosphere, body.Mod).GetComponent<MeshRenderer>(); if (body.Config.Atmosphere.clouds.cloudsPrefab != External.Modules.CloudPrefabType.Transparent) topClouds = CloudsBuilder.MakeTopClouds(proxy, body.Config.Atmosphere, body.Mod).GetComponent<MeshRenderer>();
else topClouds = CloudsBuilder.MakeTransparentClouds(proxy, body.Config.Atmosphere, body.Mod, true).GetAddComponent<MeshRenderer>();
if (body.Config.Atmosphere.clouds.hasLightning) lightningGenerator = CloudsBuilder.MakeLightning(proxy, null, body.Config.Atmosphere, true); if (body.Config.Atmosphere.clouds.hasLightning) lightningGenerator = CloudsBuilder.MakeLightning(proxy, null, body.Config.Atmosphere, true);

View File

@ -41,7 +41,22 @@ namespace NewHorizons.Builder.ShipLog
GameObject revealTriggerVolume = new GameObject("Reveal Volume (" + info.revealOn + ")"); GameObject revealTriggerVolume = new GameObject("Reveal Volume (" + info.revealOn + ")");
revealTriggerVolume.SetActive(false); revealTriggerVolume.SetActive(false);
revealTriggerVolume.transform.parent = sector?.transform ?? planetGO.transform; revealTriggerVolume.transform.parent = sector?.transform ?? planetGO.transform;
if (!string.IsNullOrEmpty(info.parentPath))
{
var newParent = planetGO.transform.Find(info.parentPath);
if (newParent != null)
{
revealTriggerVolume.transform.parent = newParent;
}
else
{
Logger.LogWarning($"Cannot find parent object at path: {planetGO.name}/{info.parentPath}");
}
}
revealTriggerVolume.transform.position = planetGO.transform.TransformPoint(info.position ?? Vector3.zero); revealTriggerVolume.transform.position = planetGO.transform.TransformPoint(info.position ?? Vector3.zero);
return revealTriggerVolume; return revealTriggerVolume;
} }

View File

@ -19,6 +19,20 @@ namespace NewHorizons.Builder.Volumes
go.SetActive(false); go.SetActive(false);
go.transform.parent = sector?.transform ?? planetGO.transform; go.transform.parent = sector?.transform ?? planetGO.transform;
if (!string.IsNullOrEmpty(info.parentPath))
{
var newParent = planetGO.transform.Find(info.parentPath);
if (newParent != null)
{
go.transform.parent = newParent;
}
else
{
Logger.LogWarning($"Cannot find parent object at path: {planetGO.name}/{info.parentPath}");
}
}
go.transform.position = planetGO.transform.TransformPoint(info.position != null ? (Vector3)info.position : Vector3.zero); go.transform.position = planetGO.transform.TransformPoint(info.position != null ? (Vector3)info.position : Vector3.zero);
go.layer = LayerMask.NameToLayer("AdvancedEffectVolume"); go.layer = LayerMask.NameToLayer("AdvancedEffectVolume");

View File

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
using Logger = NewHorizons.Utility.Logger;
namespace NewHorizons.Builder.Volumes namespace NewHorizons.Builder.Volumes
{ {
@ -16,6 +17,20 @@ namespace NewHorizons.Builder.Volumes
go.SetActive(false); go.SetActive(false);
go.transform.parent = sector?.transform ?? planetGO.transform; go.transform.parent = sector?.transform ?? planetGO.transform;
if (!string.IsNullOrEmpty(info.parentPath))
{
var newParent = planetGO.transform.Find(info.parentPath);
if (newParent != null)
{
go.transform.parent = newParent;
}
else
{
Logger.LogWarning($"Cannot find parent object at path: {planetGO.name}/{info.parentPath}");
}
}
go.transform.position = planetGO.transform.TransformPoint(info.position != null ? (Vector3)info.position : Vector3.zero); go.transform.position = planetGO.transform.TransformPoint(info.position != null ? (Vector3)info.position : Vector3.zero);
go.layer = LayerMask.NameToLayer("BasicEffectVolume"); go.layer = LayerMask.NameToLayer("BasicEffectVolume");

View File

@ -21,6 +21,20 @@ namespace NewHorizons.Builder.Volumes
go.SetActive(false); go.SetActive(false);
go.transform.parent = sector?.transform ?? planetGO.transform; go.transform.parent = sector?.transform ?? planetGO.transform;
if (!string.IsNullOrEmpty(info.parentPath))
{
var newParent = planetGO.transform.Find(info.parentPath);
if (newParent != null)
{
go.transform.parent = newParent;
}
else
{
Logger.LogWarning($"Cannot find parent object at path: {planetGO.name}/{info.parentPath}");
}
}
go.transform.position = planetGO.transform.TransformPoint(info.position != null ? (Vector3)info.position : Vector3.zero); go.transform.position = planetGO.transform.TransformPoint(info.position != null ? (Vector3)info.position : Vector3.zero);
go.layer = LayerMask.NameToLayer("BasicEffectVolume"); go.layer = LayerMask.NameToLayer("BasicEffectVolume");

View File

@ -0,0 +1,46 @@
using NewHorizons.Components;
using NewHorizons.External.Modules;
using UnityEngine;
using Logger = NewHorizons.Utility.Logger;
namespace NewHorizons.Builder.Volumes
{
public static class VolumeBuilder
{
public static TVolume Make<TVolume>(GameObject planetGO, Sector sector, VolumesModule.VolumeInfo info) where TVolume : MonoBehaviour //Could be BaseVolume but I need to create vanilla volumes too.
{
var go = new GameObject(typeof(TVolume).Name);
go.SetActive(false);
go.transform.parent = sector?.transform ?? planetGO.transform;
if (!string.IsNullOrEmpty(info.parentPath))
{
var newParent = planetGO.transform.Find(info.parentPath);
if (newParent != null)
{
go.transform.parent = newParent;
}
else
{
Logger.LogWarning($"Cannot find parent object at path: {planetGO.name}/{info.parentPath}");
}
}
go.transform.position = planetGO.transform.TransformPoint(info.position != null ? (Vector3)info.position : Vector3.zero);
go.layer = LayerMask.NameToLayer("BasicEffectVolume");
var shape = go.AddComponent<SphereShape>();
shape.radius = info.radius;
var owTriggerVolume = go.AddComponent<OWTriggerVolume>();
owTriggerVolume._shape = shape;
var volume = go.AddComponent<TVolume>();
go.SetActive(true);
return volume;
}
}
}

View File

@ -1,6 +1,7 @@
using NewHorizons.Builder.Body; using NewHorizons.Builder.Body;
using NewHorizons.Builder.ShipLog; using NewHorizons.Builder.ShipLog;
using NewHorizons.Builder.Volumes; using NewHorizons.Builder.Volumes;
using NewHorizons.Components;
using NewHorizons.External.Configs; using NewHorizons.External.Configs;
using OWML.Common; using OWML.Common;
using System; using System;
@ -49,6 +50,34 @@ namespace NewHorizons.Builder.Volumes
HazardVolumeBuilder.Make(go, sector, planetBody, hazardVolume, mod); HazardVolumeBuilder.Make(go, sector, planetBody, hazardVolume, mod);
} }
} }
if (config.Volumes.mapRestrictionVolumes != null)
{
foreach (var mapRestrictionVolume in config.Volumes.mapRestrictionVolumes)
{
VolumeBuilder.Make<MapRestrictionVolume>(go, sector, mapRestrictionVolume);
}
}
if (config.Volumes.interferenceVolumes != null)
{
foreach (var interferenceVolume in config.Volumes.interferenceVolumes)
{
VolumeBuilder.Make<Components.InterferenceVolume>(go, sector, interferenceVolume);
}
}
if (config.Volumes.reverbVolumes != null)
{
foreach (var reverbVolume in config.Volumes.reverbVolumes)
{
VolumeBuilder.Make<ReverbTriggerVolume>(go, sector, reverbVolume);
}
}
if (config.Volumes.insulatingVolumes != null)
{
foreach (var insulatingVolume in config.Volumes.insulatingVolumes)
{
VolumeBuilder.Make<InsulatingVolume>(go, sector, insulatingVolume);
}
}
} }
} }
} }

View File

@ -0,0 +1,28 @@
using UnityEngine;
namespace NewHorizons.Components
{
[RequireComponent(typeof(OWTriggerVolume))]
public abstract class BaseVolume : MonoBehaviour
{
private OWTriggerVolume _triggerVolume;
public virtual void Awake()
{
_triggerVolume = this.GetRequiredComponent<OWTriggerVolume>();
_triggerVolume.OnEntry += OnTriggerVolumeEntry;
_triggerVolume.OnExit += OnTriggerVolumeExit;
}
public virtual void OnDestroy()
{
if (_triggerVolume == null) return;
_triggerVolume.OnEntry -= OnTriggerVolumeEntry;
_triggerVolume.OnExit -= OnTriggerVolumeExit;
}
public abstract void OnTriggerVolumeEntry(GameObject hitObj);
public abstract void OnTriggerVolumeExit(GameObject hitObj);
}
}

View File

@ -0,0 +1,54 @@
using NewHorizons.Handlers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace NewHorizons.Components
{
public class InterferenceVolume : BaseVolume
{
public override void OnTriggerVolumeEntry(GameObject hitObj)
{
if (hitObj.CompareTag("PlayerDetector"))
{
OnPlayerEnter();
}
else if (hitObj.CompareTag("ProbeDetector"))
{
OnProbeEnter();
}
else if (hitObj.CompareTag("ShipDetector"))
{
OnShipEnter();
}
}
public override void OnTriggerVolumeExit(GameObject hitObj)
{
if (hitObj.CompareTag("PlayerDetector"))
{
OnPlayerExit();
}
else if (hitObj.CompareTag("ProbeDetector"))
{
OnProbeExit();
}
else if (hitObj.CompareTag("ShipDetector"))
{
OnShipExit();
}
}
public void OnPlayerEnter() => InterferenceHandler.OnPlayerEnterInterferenceVolume(this);
public void OnPlayerExit() => InterferenceHandler.OnPlayerExitInterferenceVolume(this);
public void OnProbeEnter() => InterferenceHandler.OnProbeEnterInterferenceVolume(this);
public void OnProbeExit() => InterferenceHandler.OnProbeExitInterferenceVolume(this);
public void OnShipEnter() => InterferenceHandler.OnShipEnterInterferenceVolume(this);
public void OnShipExit() => InterferenceHandler.OnShipExitInterferenceVolume(this);
}
}

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace NewHorizons.Components
{
public class MapRestrictionVolume : BaseVolume
{
public override void OnTriggerVolumeEntry(GameObject hitObj)
{
if (hitObj.CompareTag("PlayerDetector"))
{
Locator.GetMapController()?.OnPlayerEnterMapRestriction();
}
}
public override void OnTriggerVolumeExit(GameObject hitObj)
{
if (hitObj.CompareTag("PlayerDetector"))
{
Locator.GetMapController()?.OnPlayerExitMapRestriction();
}
}
}
}

View File

@ -7,29 +7,13 @@ using UnityEngine;
namespace NewHorizons.Components namespace NewHorizons.Components
{ {
[RequireComponent(typeof(OWTriggerVolume))] public class NotificationVolume : BaseVolume
public class NotificationVolume : MonoBehaviour
{ {
private NotificationTarget _target = NotificationTarget.All; private NotificationTarget _target = NotificationTarget.All;
private bool _pin = false; private bool _pin = false;
private OWTriggerVolume _triggerVolume;
private NotificationData _entryNotification; private NotificationData _entryNotification;
private NotificationData _exitNotification; private NotificationData _exitNotification;
public void Awake()
{
_triggerVolume = this.GetRequiredComponent<OWTriggerVolume>();
_triggerVolume.OnEntry += OnTriggerVolumeEntry;
_triggerVolume.OnExit += OnTriggerVolumeExit;
}
public void OnDestroy()
{
if (_triggerVolume == null) return;
_triggerVolume.OnEntry -= OnTriggerVolumeEntry;
_triggerVolume.OnExit -= OnTriggerVolumeExit;
}
public void SetPinned(bool pin) => _pin = pin; public void SetPinned(bool pin) => _pin = pin;
public void SetTarget(External.Modules.VolumesModule.NotificationVolumeInfo.NotificationTarget target) => SetTarget(EnumUtils.Parse<NotificationTarget>(target.ToString(), NotificationTarget.All)); public void SetTarget(External.Modules.VolumesModule.NotificationVolumeInfo.NotificationTarget target) => SetTarget(EnumUtils.Parse<NotificationTarget>(target.ToString(), NotificationTarget.All));
@ -46,7 +30,7 @@ namespace NewHorizons.Components
_exitNotification = new NotificationData(_target, TranslationHandler.GetTranslation(displayMessage, TranslationHandler.TextType.UI), duration); _exitNotification = new NotificationData(_target, TranslationHandler.GetTranslation(displayMessage, TranslationHandler.TextType.UI), duration);
} }
public void OnTriggerVolumeEntry(GameObject hitObj) public override void OnTriggerVolumeEntry(GameObject hitObj)
{ {
if (_target == NotificationTarget.All) if (_target == NotificationTarget.All)
{ {
@ -71,7 +55,7 @@ namespace NewHorizons.Components
} }
} }
public void OnTriggerVolumeExit(GameObject hitObj) public override void OnTriggerVolumeExit(GameObject hitObj)
{ {
if (_target == NotificationTarget.All) if (_target == NotificationTarget.All)
{ {

View File

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace NewHorizons.Components
{
[RequireComponent(typeof(OWTriggerVolume))]
public class TransparentCloudRenderQueueController : MonoBehaviour
{
public int insideQueue = 3001;
public int outsideQueue = 2999;
private OWTriggerVolume _triggerVolume;
public Renderer renderer;
public void Awake()
{
_triggerVolume = this.GetRequiredComponent<OWTriggerVolume>();
if (_triggerVolume == null) return;
_triggerVolume.OnEntry += OnTriggerVolumeEntry;
_triggerVolume.OnExit += OnTriggerVolumeExit;
}
public void OnDestroy()
{
if (_triggerVolume == null) return;
_triggerVolume.OnEntry -= OnTriggerVolumeEntry;
_triggerVolume.OnExit -= OnTriggerVolumeExit;
}
public void OnTriggerVolumeEntry(GameObject hitObj)
{
if (hitObj.CompareTag("PlayerDetector")) SetQueueToInside();
}
public void OnTriggerVolumeExit(GameObject hitObj)
{
if (hitObj.CompareTag("PlayerDetector")) SetQueueToOutside();
}
public void SetQueueToInside()
{
if (renderer == null) return;
renderer.sharedMaterial.renderQueue = insideQueue;
}
public void SetQueueToOutside()
{
if (renderer == null) return;
renderer.sharedMaterial.renderQueue = outsideQueue;
}
}
}

View File

@ -30,6 +30,8 @@ namespace NewHorizons.External.Modules
[EnumMember(Value = @"quantumMoon")] QuantumMoon = 1, [EnumMember(Value = @"quantumMoon")] QuantumMoon = 1,
[EnumMember(Value = @"basic")] Basic = 2, [EnumMember(Value = @"basic")] Basic = 2,
[EnumMember(Value = @"transparent")] Transparent = 3,
} }
[JsonObject] [JsonObject]

View File

@ -15,27 +15,66 @@ namespace NewHorizons.External.Modules
public class VolumesModule public class VolumesModule
{ {
/// <summary> /// <summary>
/// Add audio volumes to this planet /// Add audio volumes to this planet.
/// </summary> /// </summary>
public AudioVolumeInfo[] audioVolumes; public AudioVolumeInfo[] audioVolumes;
/// <summary> /// <summary>
/// Add hazard volumes to this planet /// Add hazard volumes to this planet.
/// </summary> /// </summary>
public HazardVolumeInfo[] hazardVolumes; public HazardVolumeInfo[] hazardVolumes;
/// <summary> /// <summary>
/// Add notification volumes to this planet /// Add interference volumes to this planet.
/// </summary>
public VolumeInfo[] interferenceVolumes;
/// <summary>
/// Add insulating volumes to this planet. These will stop electricty hazard volumes from affecting you (just like the jellyfish).
/// </summary>
public VolumeInfo[] insulatingVolumes;
/// <summary>
/// Add map restriction volumes to this planet.
/// </summary>
public VolumeInfo[] mapRestrictionVolumes;
/// <summary>
/// Add notification volumes to this planet.
/// </summary> /// </summary>
public NotificationVolumeInfo[] notificationVolumes; public NotificationVolumeInfo[] notificationVolumes;
/// <summary> /// <summary>
/// Add triggers that reveal parts of the ship log on this planet /// Add triggers that reveal parts of the ship log on this planet.
/// </summary> /// </summary>
public RevealVolumeInfo[] revealVolumes; public RevealVolumeInfo[] revealVolumes;
/// <summary>
/// Add reverb volumes to this planet. Great for echoes in caves.
/// </summary>
public VolumeInfo[] reverbVolumes;
[JsonObject] [JsonObject]
public class RevealVolumeInfo public class VolumeInfo
{
/// <summary>
/// The location of this volume. Optional (will default to 0,0,0).
/// </summary>
public MVector3 position;
/// <summary>
/// The radius of this volume.
/// </summary>
public float radius = 1f;
/// <summary>
/// The relative path from the planet to the parent of this object. Optional (will default to the root sector).
/// </summary>
public string parentPath;
}
[JsonObject]
public class RevealVolumeInfo : VolumeInfo
{ {
[JsonConverter(typeof(StringEnumConverter))] [JsonConverter(typeof(StringEnumConverter))]
public enum RevealVolumeType public enum RevealVolumeType
@ -57,16 +96,6 @@ namespace NewHorizons.External.Modules
/// </summary> /// </summary>
public float maxDistance = -1f; // Snapshot & Observe Only public float maxDistance = -1f; // Snapshot & Observe Only
/// <summary>
/// The position to place this volume at
/// </summary>
public MVector3 position;
/// <summary>
/// The radius of this reveal volume
/// </summary>
public float radius = 1f;
/// <summary> /// <summary>
/// What needs to be done to the volume to unlock the facts /// What needs to be done to the volume to unlock the facts
/// </summary> /// </summary>
@ -84,18 +113,8 @@ namespace NewHorizons.External.Modules
} }
[JsonObject] [JsonObject]
public class AudioVolumeInfo public class AudioVolumeInfo : VolumeInfo
{ {
/// <summary>
/// The location of this audio volume. Optional (will default to 0,0,0).
/// </summary>
public MVector3 position;
/// <summary>
/// The radius of this audio volume
/// </summary>
public float radius;
/// <summary> /// <summary>
/// The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list. /// The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list.
/// </summary> /// </summary>
@ -113,23 +132,13 @@ namespace NewHorizons.External.Modules
} }
[JsonObject] [JsonObject]
public class NotificationVolumeInfo public class NotificationVolumeInfo : VolumeInfo
{ {
/// <summary> /// <summary>
/// What the notification will show for. /// What the notification will show for.
/// </summary> /// </summary>
[DefaultValue("all")] public NotificationTarget target = NotificationTarget.All; [DefaultValue("all")] public NotificationTarget target = NotificationTarget.All;
/// <summary>
/// The location of this notification volume. Optional (will default to 0,0,0).
/// </summary>
public MVector3 position;
/// <summary>
/// The radius of this notification volume.
/// </summary>
public float radius;
/// <summary> /// <summary>
/// The notification that will play when you enter this volume. /// The notification that will play when you enter this volume.
/// </summary> /// </summary>
@ -165,18 +174,8 @@ namespace NewHorizons.External.Modules
} }
[JsonObject] [JsonObject]
public class HazardVolumeInfo public class HazardVolumeInfo : VolumeInfo
{ {
/// <summary>
/// The location of this hazard volume. Optional (will default to 0,0,0).
/// </summary>
public MVector3 position;
/// <summary>
/// The radius of this hazard volume.
/// </summary>
public float radius;
/// <summary> /// <summary>
/// The type of hazard for this volume. /// The type of hazard for this volume.
/// </summary> /// </summary>
@ -202,7 +201,7 @@ namespace NewHorizons.External.Modules
{ {
[EnumMember(Value = @"none")] NONE = 0, [EnumMember(Value = @"none")] NONE = 0,
[EnumMember(Value = @"general")] GENERAL = 1, [EnumMember(Value = @"general")] GENERAL = 1,
[EnumMember(Value = @"darkMatter")] DARKMATTER = 2, [EnumMember(Value = @"ghostMatter")] DARKMATTER = 2,
[EnumMember(Value = @"heat")] HEAT = 4, [EnumMember(Value = @"heat")] HEAT = 4,
[EnumMember(Value = @"fire")] FIRE = 8, [EnumMember(Value = @"fire")] FIRE = 8,
[EnumMember(Value = @"sandfall")] SANDFALL = 16, [EnumMember(Value = @"sandfall")] SANDFALL = 16,

View File

@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewHorizons.Handlers
{
using InterferenceVolume = NewHorizons.Components.InterferenceVolume;
public static class InterferenceHandler
{
private static List<InterferenceVolume> _playerInterference;
private static List<InterferenceVolume> _probeInterference;
private static List<InterferenceVolume> _shipInterference;
public static void Init()
{
_playerInterference = new List<InterferenceVolume>();
_probeInterference = new List<InterferenceVolume>();
_shipInterference = new List<InterferenceVolume>();
}
public static bool PlayerHasInterference() => _playerInterference.Any(volume => volume != null);
public static bool ProbeHasInterference() => _probeInterference.Any(volume => volume != null);
public static bool ShipHasInterference() => _shipInterference.Any(volume => volume != null);
public static bool IsPlayerSameAsProbe()
{
_playerInterference.RemoveAll(volume => volume == null);
return _playerInterference.All(_probeInterference.Contains) && _playerInterference.Count == _probeInterference.Count;
}
public static bool IsPlayerSameAsShip()
{
_playerInterference.RemoveAll(volume => volume == null);
return _playerInterference.All(_shipInterference.Contains) && _playerInterference.Count == _shipInterference.Count;
}
public static void OnPlayerEnterInterferenceVolume(InterferenceVolume interferenceVolume)
{
_playerInterference.SafeAdd(interferenceVolume);
GlobalMessenger.FireEvent("RefreshHUDVisibility");
}
public static void OnPlayerExitInterferenceVolume(InterferenceVolume interferenceVolume)
{
_playerInterference.Remove(interferenceVolume);
GlobalMessenger.FireEvent("RefreshHUDVisibility");
}
public static void OnProbeEnterInterferenceVolume(InterferenceVolume interferenceVolume)
{
_probeInterference.SafeAdd(interferenceVolume);
GlobalMessenger.FireEvent("RefreshHUDVisibility");
}
public static void OnProbeExitInterferenceVolume(InterferenceVolume interferenceVolume)
{
_probeInterference.Remove(interferenceVolume);
GlobalMessenger.FireEvent("RefreshHUDVisibility");
}
public static void OnShipEnterInterferenceVolume(InterferenceVolume interferenceVolume)
{
_shipInterference.SafeAdd(interferenceVolume);
GlobalMessenger.FireEvent("RefreshHUDVisibility");
}
public static void OnShipExitInterferenceVolume(InterferenceVolume interferenceVolume)
{
_shipInterference.Remove(interferenceVolume);
GlobalMessenger.FireEvent("RefreshHUDVisibility");
}
}
}

View File

@ -590,7 +590,7 @@ namespace NewHorizons.Handlers
if (!string.IsNullOrEmpty(body.Config.Atmosphere?.clouds?.texturePath)) if (!string.IsNullOrEmpty(body.Config.Atmosphere?.clouds?.texturePath))
{ {
CloudsBuilder.Make(go, sector, body.Config.Atmosphere, willHaveCloak, body.Mod); CloudsBuilder.Make(go, sector, body.Config.Atmosphere, willHaveCloak, body.Mod);
SunOverrideBuilder.Make(go, sector, body.Config.Atmosphere, body.Config.Water, surfaceSize); if (body.Config.Atmosphere.clouds.cloudsPrefab != External.Modules.CloudPrefabType.Transparent) SunOverrideBuilder.Make(go, sector, body.Config.Atmosphere, body.Config.Water, surfaceSize);
} }
if (body.Config.Atmosphere.hasRain || body.Config.Atmosphere.hasSnow) if (body.Config.Atmosphere.hasRain || body.Config.Atmosphere.hasSnow)

View File

@ -89,7 +89,7 @@ namespace NewHorizons.Handlers
heightMap.minHeight = body.Config.HeightMap.minHeight * size / body.Config.HeightMap.maxHeight; heightMap.minHeight = body.Config.HeightMap.minHeight * size / body.Config.HeightMap.maxHeight;
heightMap.stretch = body.Config.HeightMap.stretch; heightMap.stretch = body.Config.HeightMap.stretch;
} }
if (body.Config.Atmosphere?.clouds?.texturePath != null) if (body.Config.Atmosphere?.clouds?.texturePath != null && body.Config.Atmosphere?.clouds?.cloudsPrefab != CloudPrefabType.Transparent)
{ {
// Hacky but whatever I just want a sphere // Hacky but whatever I just want a sphere
size = Mathf.Clamp(body.Config.Atmosphere.size / 10, minSize, maxSize); size = Mathf.Clamp(body.Config.Atmosphere.size / 10, minSize, maxSize);

View File

@ -315,6 +315,7 @@ namespace NewHorizons
AstroObjectLocator.Init(); AstroObjectLocator.Init();
StreamingHandler.Init(); StreamingHandler.Init();
AudioTypeHandler.Init(); AudioTypeHandler.Init();
InterferenceHandler.Init();
RemoteHandler.Init(); RemoteHandler.Init();
AtmosphereBuilder.Init(); AtmosphereBuilder.Init();
BrambleNodeBuilder.Init(BodyDict[CurrentStarSystem].Select(x => x.Config).Where(x => x.Bramble?.dimension != null).ToArray()); BrambleNodeBuilder.Init(BodyDict[CurrentStarSystem].Select(x => x.Config).Where(x => x.Bramble?.dimension != null).ToArray());

View File

@ -1,4 +1,5 @@
using HarmonyLib; using HarmonyLib;
using NewHorizons.Handlers;
namespace NewHorizons.Patches namespace NewHorizons.Patches
{ {
@ -9,6 +10,8 @@ namespace NewHorizons.Patches
[HarmonyPatch(typeof(HUDMarker), nameof(HUDMarker.Awake))] [HarmonyPatch(typeof(HUDMarker), nameof(HUDMarker.Awake))]
public static void HUDMarker_Awake(HUDMarker __instance) public static void HUDMarker_Awake(HUDMarker __instance)
{ {
GlobalMessenger.AddListener("RefreshHUDVisibility", __instance.RefreshOwnVisibility);
GlobalMessenger.AddListener("RefreshHUDVisibility", __instance.RefreshOwnVisibility);
GlobalMessenger.AddListener("PlayerEnterCloakField", __instance.OnPlayerEnterCloakField); GlobalMessenger.AddListener("PlayerEnterCloakField", __instance.OnPlayerEnterCloakField);
GlobalMessenger.AddListener("PlayerExitCloakField", __instance.OnPlayerExitCloakField); GlobalMessenger.AddListener("PlayerExitCloakField", __instance.OnPlayerExitCloakField);
} }
@ -17,6 +20,8 @@ namespace NewHorizons.Patches
[HarmonyPatch(typeof(HUDMarker), nameof(HUDMarker.OnDestroy))] [HarmonyPatch(typeof(HUDMarker), nameof(HUDMarker.OnDestroy))]
public static void HUDMarker_OnDestroy(HUDMarker __instance) public static void HUDMarker_OnDestroy(HUDMarker __instance)
{ {
GlobalMessenger.RemoveListener("RefreshHUDVisibility", __instance.RefreshOwnVisibility);
GlobalMessenger.RemoveListener("RefreshHUDVisibility", __instance.RefreshOwnVisibility);
GlobalMessenger.RemoveListener("PlayerEnterCloakField", __instance.OnPlayerEnterCloakField); GlobalMessenger.RemoveListener("PlayerEnterCloakField", __instance.OnPlayerEnterCloakField);
GlobalMessenger.RemoveListener("PlayerExitCloakField", __instance.OnPlayerExitCloakField); GlobalMessenger.RemoveListener("PlayerExitCloakField", __instance.OnPlayerExitCloakField);
} }
@ -53,11 +58,67 @@ namespace NewHorizons.Patches
GlobalMessenger.RemoveListener("ShipExitCloakField", __instance.RefreshOwnVisibility); GlobalMessenger.RemoveListener("ShipExitCloakField", __instance.RefreshOwnVisibility);
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(ProbeHUDMarker), nameof(ProbeHUDMarker.RefreshOwnVisibility))]
public static bool ProbeHUDMarker_RefreshOwnVisibility(ProbeHUDMarker __instance)
{
bool insideEYE = Locator.GetEyeStateManager() != null && Locator.GetEyeStateManager().IsInsideTheEye();
bool insideQM = __instance._quantumMoon != null && (__instance._quantumMoon.IsPlayerInside() || __instance._quantumMoon.IsProbeInside());
bool insideRW = Locator.GetRingWorldController() != null && Locator.GetRingWorldController().isPlayerInside == Locator.GetRingWorldController().isProbeInside;
bool insideIP = Locator.GetCloakFieldController() != null && Locator.GetCloakFieldController().isPlayerInsideCloak == Locator.GetCloakFieldController().isProbeInsideCloak;
bool insideCloak = Components.CloakSectorController.isPlayerInside == Components.CloakSectorController.isProbeInside;
bool sameInterference = InterferenceHandler.IsPlayerSameAsProbe();
bool isActive = __instance.gameObject.activeInHierarchy || __instance._isTLCDuplicate;
__instance._isVisible = isActive && !insideEYE && !insideQM && !__instance._translatorEquipped && !__instance._inConversation && __instance._launched && (__instance._isWearingHelmet || __instance._atFlightConsole) && insideRW && insideIP && insideCloak && sameInterference;
if (__instance._canvasMarker != null) __instance._canvasMarker.SetVisibility(__instance._isVisible);
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(ShipHUDMarker), nameof(ShipHUDMarker.RefreshOwnVisibility))]
public static bool ShipHUDMarker_RefreshOwnVisibility(ShipHUDMarker __instance)
{
bool insideEYE = Locator.GetEyeStateManager() != null && Locator.GetEyeStateManager().IsInsideTheEye();
bool insideQM = __instance._quantumMoon != null && (__instance._quantumMoon.IsPlayerInside() || __instance._quantumMoon.IsShipInside());
bool insideRW = Locator.GetRingWorldController() != null && Locator.GetRingWorldController().isPlayerInside;
bool insideIP = Locator.GetCloakFieldController() != null ? true : Locator.GetCloakFieldController().isPlayerInsideCloak == Locator.GetCloakFieldController().isShipInsideCloak;
bool insideCloak = Components.CloakSectorController.isPlayerInside == Components.CloakSectorController.isShipInside;
bool sameInterference = InterferenceHandler.IsPlayerSameAsShip();
__instance._isVisible = !insideEYE && !insideQM && !insideRW && !__instance._translatorEquipped && !__instance._inConversation && !__instance._shipDestroyed && !__instance._playerInShip && PlayerState.HasPlayerEnteredShip() && __instance._isWearingHelmet && insideIP && insideCloak && sameInterference;
if (__instance._canvasMarker != null) __instance._canvasMarker.SetVisibility(__instance._isVisible);
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(ShipLogEntryHUDMarker), nameof(ShipLogEntryHUDMarker.RefreshOwnVisibility))]
public static bool ShipLogEntryHUDMarker_RefreshOwnVisibility(ShipLogEntryHUDMarker __instance)
{
bool hasEntryLocation = ShipLogEntryHUDMarker.s_entryLocation != null;
bool insideEYE = Locator.GetEyeStateManager() != null && Locator.GetEyeStateManager().IsInsideTheEye();
bool insideQM = __instance._quantumMoon != null && __instance._quantumMoon.IsPlayerInside();
bool insideRW = Locator.GetRingWorldController() != null && Locator.GetRingWorldController().isPlayerInside && ShipLogEntryHUDMarker.s_entryLocationID == "IP_RING_WORLD";
bool insideIP = (hasEntryLocation && ShipLogEntryHUDMarker.s_entryLocation.IsWithinCloakField()) || !(Locator.GetCloakFieldController() != null && Locator.GetCloakFieldController().isPlayerInsideCloak);
bool insideCloak = (hasEntryLocation && ShipLogEntryHUDMarker.s_entryLocation.IsWithinCloakField()) || !Components.CloakSectorController.isPlayerInside;
__instance._isVisible = (!insideEYE && !insideQM && !insideRW && !__instance._translatorEquipped && !__instance._inConversation && hasEntryLocation && (__instance._isWearingHelmet || __instance._atFlightConsole) && insideIP && insideCloak);
if (__instance._canvasMarker != null) __instance._canvasMarker.SetVisibility(__instance._isVisible);
return false;
}
[HarmonyPostfix] [HarmonyPostfix]
[HarmonyPatch(typeof(ProbeCamera), nameof(ProbeCamera.HasInterference))] [HarmonyPatch(typeof(ProbeCamera), nameof(ProbeCamera.HasInterference))]
public static void ProbeCamera_HasInterference(ProbeCamera __instance, ref bool __result) public static void ProbeCamera_HasInterference(ProbeCamera __instance, ref bool __result)
{ {
__result = __result || Components.CloakSectorController.isPlayerInside != Components.CloakSectorController.isProbeInside; __result = __result || (__instance._id != ProbeCamera.ID.PreLaunch && (Components.CloakSectorController.isPlayerInside != Components.CloakSectorController.isProbeInside || !InterferenceHandler.IsPlayerSameAsProbe()));
} }
} }
} }

View File

@ -400,12 +400,14 @@
"x-enumNames": [ "x-enumNames": [
"GiantsDeep", "GiantsDeep",
"QuantumMoon", "QuantumMoon",
"Basic" "Basic",
"Transparent"
], ],
"enum": [ "enum": [
"giantsDeep", "giantsDeep",
"quantumMoon", "quantumMoon",
"basic" "basic",
"transparent"
] ]
}, },
"FluidType": { "FluidType": {
@ -2393,31 +2395,59 @@
"properties": { "properties": {
"audioVolumes": { "audioVolumes": {
"type": "array", "type": "array",
"description": "Add audio volumes to this planet", "description": "Add audio volumes to this planet.",
"items": { "items": {
"$ref": "#/definitions/AudioVolumeInfo" "$ref": "#/definitions/AudioVolumeInfo"
} }
}, },
"hazardVolumes": { "hazardVolumes": {
"type": "array", "type": "array",
"description": "Add hazard volumes to this planet", "description": "Add hazard volumes to this planet.",
"items": { "items": {
"$ref": "#/definitions/HazardVolumeInfo" "$ref": "#/definitions/HazardVolumeInfo"
} }
}, },
"interferenceVolumes": {
"type": "array",
"description": "Add interference volumes to this planet.",
"items": {
"$ref": "#/definitions/VolumeInfo"
}
},
"insulatingVolumes": {
"type": "array",
"description": "Add insulating volumes to this planet. These will stop electricty hazard volumes from affecting you (just like the jellyfish).",
"items": {
"$ref": "#/definitions/VolumeInfo"
}
},
"mapRestrictionVolumes": {
"type": "array",
"description": "Add map restriction volumes to this planet.",
"items": {
"$ref": "#/definitions/VolumeInfo"
}
},
"notificationVolumes": { "notificationVolumes": {
"type": "array", "type": "array",
"description": "Add notification volumes to this planet", "description": "Add notification volumes to this planet.",
"items": { "items": {
"$ref": "#/definitions/NotificationVolumeInfo" "$ref": "#/definitions/NotificationVolumeInfo"
} }
}, },
"revealVolumes": { "revealVolumes": {
"type": "array", "type": "array",
"description": "Add triggers that reveal parts of the ship log on this planet", "description": "Add triggers that reveal parts of the ship log on this planet.",
"items": { "items": {
"$ref": "#/definitions/RevealVolumeInfo" "$ref": "#/definitions/RevealVolumeInfo"
} }
},
"reverbVolumes": {
"type": "array",
"description": "Add reverb volumes to this planet. Great for echoes in caves.",
"items": {
"$ref": "#/definitions/VolumeInfo"
}
} }
} }
}, },
@ -2426,14 +2456,18 @@
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"position": { "position": {
"description": "The location of this audio volume. Optional (will default to 0,0,0).", "description": "The location of this volume. Optional (will default to 0,0,0).",
"$ref": "#/definitions/MVector3" "$ref": "#/definitions/MVector3"
}, },
"radius": { "radius": {
"type": "number", "type": "number",
"description": "The radius of this audio volume", "description": "The radius of this volume.",
"format": "float" "format": "float"
}, },
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
},
"audio": { "audio": {
"type": "string", "type": "string",
"description": "The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list." "description": "The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list."
@ -2495,14 +2529,18 @@
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"position": { "position": {
"description": "The location of this hazard volume. Optional (will default to 0,0,0).", "description": "The location of this volume. Optional (will default to 0,0,0).",
"$ref": "#/definitions/MVector3" "$ref": "#/definitions/MVector3"
}, },
"radius": { "radius": {
"type": "number", "type": "number",
"description": "The radius of this hazard volume.", "description": "The radius of this volume.",
"format": "float" "format": "float"
}, },
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
},
"type": { "type": {
"description": "The type of hazard for this volume.", "description": "The type of hazard for this volume.",
"default": "general", "default": "general",
@ -2542,7 +2580,7 @@
"enum": [ "enum": [
"none", "none",
"general", "general",
"darkMatter", "ghostMatter",
"heat", "heat",
"fire", "fire",
"sandfall", "sandfall",
@ -2564,24 +2602,47 @@
"electrical" "electrical"
] ]
}, },
"NotificationVolumeInfo": { "VolumeInfo": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"target": {
"description": "What the notification will show for.",
"default": "all",
"$ref": "#/definitions/NotificationTarget"
},
"position": { "position": {
"description": "The location of this notification volume. Optional (will default to 0,0,0).", "description": "The location of this volume. Optional (will default to 0,0,0).",
"$ref": "#/definitions/MVector3" "$ref": "#/definitions/MVector3"
}, },
"radius": { "radius": {
"type": "number", "type": "number",
"description": "The radius of this notification volume.", "description": "The radius of this volume.",
"format": "float" "format": "float"
}, },
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
}
}
},
"NotificationVolumeInfo": {
"type": "object",
"additionalProperties": false,
"properties": {
"position": {
"description": "The location of this volume. Optional (will default to 0,0,0).",
"$ref": "#/definitions/MVector3"
},
"radius": {
"type": "number",
"description": "The radius of this volume.",
"format": "float"
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
},
"target": {
"description": "What the notification will show for.",
"default": "all",
"$ref": "#/definitions/NotificationTarget"
},
"entryNotification": { "entryNotification": {
"description": "The notification that will play when you enter this volume.", "description": "The notification that will play when you enter this volume.",
"$ref": "#/definitions/NotificationInfo" "$ref": "#/definitions/NotificationInfo"
@ -2626,6 +2687,19 @@
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"position": {
"description": "The location of this volume. Optional (will default to 0,0,0).",
"$ref": "#/definitions/MVector3"
},
"radius": {
"type": "number",
"description": "The radius of this volume.",
"format": "float"
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
},
"maxAngle": { "maxAngle": {
"type": "number", "type": "number",
"description": "The max view angle (in degrees) the player can see the volume with to unlock the fact (`observe` only)", "description": "The max view angle (in degrees) the player can see the volume with to unlock the fact (`observe` only)",
@ -2636,15 +2710,6 @@
"description": "The max distance the user can be away from the volume to reveal the fact (`snapshot` and `observe` only)", "description": "The max distance the user can be away from the volume to reveal the fact (`snapshot` and `observe` only)",
"format": "float" "format": "float"
}, },
"position": {
"description": "The position to place this volume at",
"$ref": "#/definitions/MVector3"
},
"radius": {
"type": "number",
"description": "The radius of this reveal volume",
"format": "float"
},
"revealOn": { "revealOn": {
"description": "What needs to be done to the volume to unlock the facts", "description": "What needs to be done to the volume to unlock the facts",
"default": "enter", "default": "enter",