NOTE: CommonResources is now marked as an incompatible mod.

## Minor features
- Added `solarSystemVolume` and `creditsVolume` to the `Volumes` module.
Lets you change star system without setting up a black hole, and allows
going straight to the fast, final, or kazoo credits scenes.

## Improvements
- Ghost matter from detail props and from HazardVolumes now should be
deactivated when going underwater.
- Improved support for Discord Rich Presence
- Water, sand, and lava will appear on title screen planets

## Bug fixes
- Fixed funnels not working when the planet had no primary
This commit is contained in:
Will Corby 2023-01-23 10:14:54 -08:00 committed by GitHub
commit bb2dcb42f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 381 additions and 37 deletions

View File

@ -4,6 +4,7 @@ using NewHorizons.Utility;
using UnityEngine; using UnityEngine;
using Logger = NewHorizons.Utility.Logger; using Logger = NewHorizons.Utility.Logger;
using NewHorizons.External.Modules.VariableSize; using NewHorizons.External.Modules.VariableSize;
using NewHorizons.Components.Orbital;
namespace NewHorizons.Builder.Body namespace NewHorizons.Builder.Body
{ {
@ -34,7 +35,7 @@ namespace NewHorizons.Builder.Body
if (_lavaMaterial == null) _lavaMaterial = new Material(SearchUtilities.Find("VolcanicMoon_Body/MoltenCore_VM/LavaSphere").GetComponent<MeshRenderer>().sharedMaterial).DontDestroyOnLoad(); if (_lavaMaterial == null) _lavaMaterial = new Material(SearchUtilities.Find("VolcanicMoon_Body/MoltenCore_VM/LavaSphere").GetComponent<MeshRenderer>().sharedMaterial).DontDestroyOnLoad();
} }
public static void Make(GameObject planetGO, ConstantForceDetector detector, OWRigidbody rigidbody, FunnelModule module) public static void Make(GameObject planetGO, Sector sector, OWRigidbody rigidbody, FunnelModule module)
{ {
InitPrefabs(); InitPrefabs();
@ -55,7 +56,7 @@ namespace NewHorizons.Builder.Body
var detectorGO = new GameObject("Detector_Funnel"); var detectorGO = new GameObject("Detector_Funnel");
detectorGO.transform.parent = funnelGO.transform; detectorGO.transform.parent = funnelGO.transform;
var funnelDetector = detectorGO.AddComponent<ConstantForceDetector>(); var funnelDetector = detectorGO.AddComponent<ConstantForceDetector>();
funnelDetector._inheritDetector = detector; funnelDetector._inheritDetector = planetGO.GetComponentInChildren<ConstantForceDetector>();
funnelDetector._detectableFields = new ForceVolume[0]; funnelDetector._detectableFields = new ForceVolume[0];
detectorGO.AddComponent<ForceApplier>(); detectorGO.AddComponent<ForceApplier>();
@ -165,7 +166,10 @@ namespace NewHorizons.Builder.Body
break; break;
} }
var sector = planetGO.GetComponent<AstroObject>().GetPrimaryBody().GetRootSector(); // We take the sector of the binary focal point if it exists for this funnel (like with the twins)
var primaryBody = planetGO.GetComponent<AstroObject>().GetPrimaryBody();
if (primaryBody?.GetComponent<BinaryFocalPoint>() != null) sector = primaryBody.GetRootSector();
proxyGO.GetComponent<SectorProxy>().SetSector(sector); proxyGO.GetComponent<SectorProxy>().SetSector(sector);
geoGO.GetComponent<SectorCullGroup>().SetSector(sector); geoGO.GetComponent<SectorCullGroup>().SetSector(sector);
volumesGO.GetComponent<SectorCollisionGroup>().SetSector(sector); volumesGO.GetComponent<SectorCollisionGroup>().SetSector(sector);

View File

@ -203,7 +203,7 @@ namespace NewHorizons.Builder.Body
if (hasDestructionVolume) destructionVolumeGO.AddComponent<BlackHoleDestructionVolume>(); if (hasDestructionVolume) destructionVolumeGO.AddComponent<BlackHoleDestructionVolume>();
else if (targetStarSystem != null) else if (targetStarSystem != null)
{ {
var wormholeVolume = destructionVolumeGO.AddComponent<ChangeStarSystemVolume>(); var wormholeVolume = destructionVolumeGO.AddComponent<BlackHoleWarpVolume>();
wormholeVolume.TargetSolarSystem = targetStarSystem; wormholeVolume.TargetSolarSystem = targetStarSystem;
} }
} }

View File

@ -39,7 +39,7 @@ namespace NewHorizons.Builder.Body
if (_oceanAmbientLight == null) _oceanAmbientLight = SearchUtilities.Find("Ocean_GD").GetComponent<OceanLODController>()._ambientLight.gameObject.InstantiateInactive().Rename("OceanAmbientLight").DontDestroyOnLoad(); if (_oceanAmbientLight == null) _oceanAmbientLight = SearchUtilities.Find("Ocean_GD").GetComponent<OceanLODController>()._ambientLight.gameObject.InstantiateInactive().Rename("OceanAmbientLight").DontDestroyOnLoad();
} }
public static void Make(GameObject planetGO, Sector sector, OWRigidbody rb, WaterModule module) public static RadialFluidVolume Make(GameObject planetGO, Sector sector, OWRigidbody rb, WaterModule module)
{ {
InitPrefabs(); InitPrefabs();
@ -148,6 +148,8 @@ namespace NewHorizons.Builder.Body
waterGO.transform.position = planetGO.transform.position; waterGO.transform.position = planetGO.transform.position;
waterGO.SetActive(true); waterGO.SetActive(true);
return fluidVolume;
} }
} }
} }

View File

@ -312,6 +312,14 @@ namespace NewHorizons.Builder.Props
if (probeVisuals != null) probeVisuals.gameObject.SetActive(true); if (probeVisuals != null) probeVisuals.gameObject.SetActive(true);
} }
if (component is DarkMatterSubmergeController submergeController)
{
var water = planetGO.GetComponentsInChildren<RadialFluidVolume>().FirstOrDefault(x => x._fluidType == FluidVolume.Type.WATER);
// dont use SetDetectableFluid here because Awake hasn't been called yet
if (submergeController._fluidDetector)
submergeController._fluidDetector._onlyDetectableFluid = water;
}
// Fix anglerfish speed on orbiting planets // Fix anglerfish speed on orbiting planets
if (component is AnglerfishController angler) if (component is AnglerfishController angler)
{ {

View File

@ -0,0 +1,18 @@
using NewHorizons.Components.Volumes;
using NewHorizons.External.Modules;
using UnityEngine;
namespace NewHorizons.Builder.Volumes
{
internal static class ChangeStarSystemVolumeBuilder
{
public static WarpVolume Make(GameObject planetGO, Sector sector, VolumesModule.ChangeStarSystemVolumeInfo info)
{
var volume = VolumeBuilder.Make<WarpVolume>(planetGO, sector, info);
volume.TargetSolarSystem = info.targetStarSystem;
return volume;
}
}
}

View File

@ -0,0 +1,18 @@
using NewHorizons.Components.Volumes;
using NewHorizons.External.Modules;
using UnityEngine;
namespace NewHorizons.Builder.Volumes
{
internal static class CreditsVolumeBuilder
{
public static LoadCreditsVolume Make(GameObject planetGO, Sector sector, VolumesModule.LoadCreditsVolumeInfo info)
{
var volume = VolumeBuilder.Make<LoadCreditsVolume>(planetGO, sector, info);
volume.creditsType = info.creditsType;
return volume;
}
}
}

View File

@ -62,6 +62,24 @@ namespace NewHorizons.Builder.Volumes
var visorFrostEffectVolume = go.AddComponent<VisorFrostEffectVolume>(); var visorFrostEffectVolume = go.AddComponent<VisorFrostEffectVolume>();
visorFrostEffectVolume._frostRate = 0.5f; visorFrostEffectVolume._frostRate = 0.5f;
visorFrostEffectVolume._maxFrost = 0.91f; visorFrostEffectVolume._maxFrost = 0.91f;
var water = planetGO.GetComponentsInChildren<RadialFluidVolume>().FirstOrDefault(x => x._fluidType == FluidVolume.Type.WATER);
if (water != null)
{
var submerge = go.AddComponent<DarkMatterSubmergeController>();
submerge._activeWhenSubmerged = false;
submerge._effectVolumes = new EffectVolume[] { hazardVolume, visorFrostEffectVolume };
// THERE ARE NO RENDERERS??? RUH ROH!!!
var detectorGO = new GameObject("ConstantFluidDetector");
detectorGO.transform.parent = go.transform;
detectorGO.transform.localPosition = Vector3.zero;
detectorGO.layer = LayerMask.NameToLayer("BasicDetector");
var detector = detectorGO.AddComponent<ConstantFluidDetector>();
detector.SetDetectableFluid(water);
submerge._fluidDetector = detector;
}
} }
else if (info.type == VolumesModule.HazardVolumeInfo.HazardType.ELECTRICITY) else if (info.type == VolumesModule.HazardVolumeInfo.HazardType.ELECTRICITY)
{ {

View File

@ -192,6 +192,20 @@ namespace NewHorizons.Builder.Volumes
VolumeBuilder.Make<LightlessLightSourceVolume>(go, sector, lightSourceVolume); VolumeBuilder.Make<LightlessLightSourceVolume>(go, sector, lightSourceVolume);
} }
} }
if (config.Volumes.solarSystemVolume != null)
{
foreach (var solarSystemVolume in config.Volumes.solarSystemVolume)
{
ChangeStarSystemVolumeBuilder.Make(go, sector, solarSystemVolume);
}
}
if (config.Volumes.creditsVolume != null)
{
foreach (var creditsVolume in config.Volumes.creditsVolume)
{
CreditsVolumeBuilder.Make(go, sector, creditsVolume);
}
}
} }
} }
} }

View File

@ -1,6 +1,6 @@
namespace NewHorizons.Components.Volumes namespace NewHorizons.Components.Volumes
{ {
public class ChangeStarSystemVolume : BlackHoleDestructionVolume public class BlackHoleWarpVolume : BlackHoleDestructionVolume
{ {
public string TargetSolarSystem { get; set; } public string TargetSolarSystem { get; set; }

View File

@ -0,0 +1,35 @@
using NewHorizons.External.Modules;
using UnityEngine;
namespace NewHorizons.Components.Volumes
{
internal class LoadCreditsVolume : BaseVolume
{
public VolumesModule.LoadCreditsVolumeInfo.CreditsType creditsType = VolumesModule.LoadCreditsVolumeInfo.CreditsType.Fast;
public override void OnTriggerVolumeEntry(GameObject hitObj)
{
if (hitObj.CompareTag("PlayerDetector"))
{
switch(creditsType)
{
case VolumesModule.LoadCreditsVolumeInfo.CreditsType.Fast:
LoadManager.LoadScene(OWScene.Credits_Fast, LoadManager.FadeType.ToBlack);
break;
case VolumesModule.LoadCreditsVolumeInfo.CreditsType.Final:
LoadManager.LoadScene(OWScene.Credits_Final, LoadManager.FadeType.ToBlack);
break;
case VolumesModule.LoadCreditsVolumeInfo.CreditsType.Kazoo:
TimelineObliterationController.s_hasRealityEnded = true;
LoadManager.LoadScene(OWScene.Credits_Fast, LoadManager.FadeType.ToBlack);
break;
}
}
}
public override void OnTriggerVolumeExit(GameObject hitObj)
{
}
}
}

View File

@ -0,0 +1,31 @@
using NewHorizons.External.Modules;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace NewHorizons.Components.Volumes
{
internal class WarpVolume : BaseVolume
{
public string TargetSolarSystem;
public override void OnTriggerVolumeEntry(GameObject hitObj)
{
if (hitObj.CompareTag("PlayerDetector"))
{
if (Main.Instance.CurrentStarSystem != TargetSolarSystem) // Otherwise it really breaks idk why
{
Main.Instance.ChangeCurrentStarSystem(TargetSolarSystem, PlayerState.AtFlightConsole());
}
}
}
public override void OnTriggerVolumeExit(GameObject hitObj)
{
}
}
}

View File

@ -106,6 +106,16 @@ namespace NewHorizons.External.Modules
/// </summary> /// </summary>
public PriorityVolumeInfo[] zeroGravityVolumes; public PriorityVolumeInfo[] zeroGravityVolumes;
/// <summary>
/// Entering this volume will load a new solar system.
/// </summary>
public ChangeStarSystemVolumeInfo[] solarSystemVolume;
/// <summary>
/// Enter this volume to be sent to the end credits scene
/// </summary>
public LoadCreditsVolumeInfo[] creditsVolume;
[JsonObject] [JsonObject]
public class VolumeInfo public class VolumeInfo
{ {
@ -136,6 +146,33 @@ namespace NewHorizons.External.Modules
public string rename; public string rename;
} }
[JsonObject]
public class ChangeStarSystemVolumeInfo : VolumeInfo
{
/// <summary>
/// The star system that entering this volume will send you to.
/// </summary>
[DefaultValue("SolarSystem")]
public string targetStarSystem;
}
[JsonObject]
public class LoadCreditsVolumeInfo : VolumeInfo
{
[JsonConverter(typeof(StringEnumConverter))]
public enum CreditsType
{
[EnumMember(Value = @"fast")] Fast = 0,
[EnumMember(Value = @"final")] Final = 1,
[EnumMember(Value = @"kazoo")] Kazoo = 2
}
[DefaultValue("fast")]
public CreditsType creditsType = CreditsType.Fast;
}
[JsonObject] [JsonObject]
public class PriorityVolumeInfo : VolumeInfo public class PriorityVolumeInfo : VolumeInfo
{ {

View File

@ -466,7 +466,7 @@ namespace NewHorizons.Handlers
}); });
} }
RichPresenceHandler.SetUpPlanet(body.Config.name, go, sector); RichPresenceHandler.SetUpPlanet(body.Config.name, go, sector, body.Config.Star != null, body.Config.Atmosphere != null);
Logger.LogVerbose($"Finished creating [{body.Config.name}]"); Logger.LogVerbose($"Finished creating [{body.Config.name}]");
@ -638,7 +638,7 @@ namespace NewHorizons.Handlers
if (body.Config.Funnel != null) if (body.Config.Funnel != null)
{ {
FunnelBuilder.Make(go, go.GetComponentInChildren<ConstantForceDetector>(), rb, body.Config.Funnel); FunnelBuilder.Make(go, sector, rb, body.Config.Funnel);
} }
// Has to go last probably // Has to go last probably

View File

@ -65,6 +65,7 @@ namespace NewHorizons.Handlers
var lightGO = new GameObject("Light"); var lightGO = new GameObject("Light");
lightGO.transform.parent = SearchUtilities.Find("Scene/Background").transform; lightGO.transform.parent = SearchUtilities.Find("Scene/Background").transform;
lightGO.transform.localPosition = new Vector3(-47.9203f, 145.7596f, 43.1802f); lightGO.transform.localPosition = new Vector3(-47.9203f, 145.7596f, 43.1802f);
lightGO.transform.localRotation = Quaternion.Euler(13.1412f, 122.8785f, 169.4302f);
var light = lightGO.AddComponent<Light>(); var light = lightGO.AddComponent<Light>();
light.type = LightType.Directional; light.type = LightType.Directional;
light.color = Color.white; light.color = Color.white;
@ -75,31 +76,86 @@ namespace NewHorizons.Handlers
private static GameObject LoadTitleScreenBody(NewHorizonsBody body) private static GameObject LoadTitleScreenBody(NewHorizonsBody body)
{ {
Logger.LogVerbose($"Displaying {body.Config.name} on the title screen"); Logger.LogVerbose($"Displaying {body.Config.name} on the title screen");
GameObject titleScreenGO = new GameObject(body.Config.name + "_TitleScreen"); var titleScreenGO = new GameObject(body.Config.name + "_TitleScreen");
HeightMapModule heightMap = new HeightMapModule();
var minSize = 15; var maxSize = -1f;
var maxSize = 30;
float size = minSize;
if (body.Config.HeightMap != null) if (body.Config.HeightMap != null)
{ {
size = Mathf.Clamp(body.Config.HeightMap.maxHeight / 10, minSize, maxSize); HeightMapBuilder.Make(titleScreenGO, null, body.Config.HeightMap, body.Mod, 30);
heightMap.textureMap = body.Config.HeightMap.textureMap; maxSize = Mathf.Max(maxSize, body.Config.HeightMap.maxHeight, body.Config.HeightMap.minHeight);
heightMap.heightMap = body.Config.HeightMap.heightMap;
heightMap.maxHeight = size;
heightMap.minHeight = body.Config.HeightMap.minHeight * size / body.Config.HeightMap.maxHeight;
heightMap.stretch = body.Config.HeightMap.stretch;
} }
if (body.Config.Atmosphere?.clouds?.texturePath != null && body.Config.Atmosphere?.clouds?.cloudsPrefab != CloudPrefabType.Transparent) 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); var cloudTextureMap = new HeightMapModule();
heightMap.maxHeight = heightMap.minHeight = size + 1; cloudTextureMap.maxHeight = cloudTextureMap.minHeight = body.Config.Atmosphere.size;
heightMap.textureMap = body.Config.Atmosphere.clouds.texturePath; cloudTextureMap.textureMap = body.Config.Atmosphere.clouds.texturePath;
HeightMapBuilder.Make(titleScreenGO, null, cloudTextureMap, body.Mod, 30);
maxSize = Mathf.Max(maxSize, cloudTextureMap.maxHeight);
}
else
{
if (body.Config.Water != null)
{
var waterGO = GameObject.CreatePrimitive(PrimitiveType.Sphere);
var size = 2f * Mathf.Max(body.Config.Water.size, body.Config.Water.size * body.Config.Water.curve?.FirstOrDefault()?.value ?? 0f);
waterGO.transform.localScale = Vector3.one * size;
var mr = waterGO.GetComponent<MeshRenderer>();
var colour = body.Config.Water.tint?.ToColor() ?? Color.blue;
mr.material.color = new Color(colour.r, colour.g, colour.b, 0.9f);
// Make it transparent!
mr.material.SetOverrideTag("RenderType", "Transparent");
mr.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
mr.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
mr.material.SetInt("_ZWrite", 0);
mr.material.DisableKeyword("_ALPHATEST_ON");
mr.material.DisableKeyword("_ALPHABLEND_ON");
mr.material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
mr.material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
waterGO.transform.parent = titleScreenGO.transform;
waterGO.transform.localPosition = Vector3.zero;
maxSize = Mathf.Max(maxSize, size);
}
if (body.Config.Lava != null)
{
var lavaGO = GameObject.CreatePrimitive(PrimitiveType.Sphere);
var size = 2f * Mathf.Max(body.Config.Lava.size, body.Config.Lava.size * body.Config.Lava.curve?.FirstOrDefault()?.value ?? 0f);
lavaGO.transform.localScale = Vector3.one * size;
var mr = lavaGO.GetComponent<MeshRenderer>();
mr.material.color = body.Config.Lava.tint?.ToColor() ?? Color.red;
mr.material.SetColor("_EmissionColor", mr.material.color * 2f);
lavaGO.transform.parent = titleScreenGO.transform;
lavaGO.transform.localPosition = Vector3.zero;
maxSize = Mathf.Max(maxSize, size);
}
if (body.Config.Sand != null)
{
var sandGO = GameObject.CreatePrimitive(PrimitiveType.Sphere);
var size = 2f * Mathf.Max(body.Config.Sand.size, body.Config.Sand.size * body.Config.Sand.curve?.FirstOrDefault()?.value ?? 0f);
sandGO.transform.localScale = Vector3.one * size;
var mr = sandGO.GetComponent<MeshRenderer>();
mr.material.color = body.Config.Sand.tint?.ToColor() ?? Color.yellow;
mr.material.SetFloat("_Glossiness", 0);
sandGO.transform.parent = titleScreenGO.transform;
sandGO.transform.localPosition = Vector3.zero;
maxSize = Mathf.Max(maxSize, size);
}
} }
HeightMapBuilder.Make(titleScreenGO, null, heightMap, body.Mod, 30); var pivot = GameObject.Instantiate(SearchUtilities.Find("Scene/Background/PlanetPivot"), SearchUtilities.Find("Scene/Background").transform);
GameObject pivot = GameObject.Instantiate(SearchUtilities.Find("Scene/Background/PlanetPivot"), SearchUtilities.Find("Scene/Background").transform);
pivot.GetComponent<RotateTransform>()._degreesPerSecond = 10f; pivot.GetComponent<RotateTransform>()._degreesPerSecond = 10f;
foreach (Transform child in pivot.transform) foreach (Transform child in pivot.transform)
{ {
@ -111,17 +167,15 @@ namespace NewHorizons.Handlers
{ {
foreach (var ring in body.Config.Rings) foreach (var ring in body.Config.Rings)
{ {
RingModule newRing = new RingModule(); RingBuilder.Make(titleScreenGO, null, ring, body.Mod);
newRing.innerRadius = size * 1.2f;
newRing.outerRadius = size * 2f; maxSize = Mathf.Max(maxSize, ring.outerRadius);
newRing.texture = ring.texture;
RingBuilder.Make(titleScreenGO, null, newRing, body.Mod);
} }
titleScreenGO.transform.localScale = Vector3.one * 0.8f;
} }
titleScreenGO.transform.parent = pivot.transform; titleScreenGO.transform.parent = pivot.transform;
titleScreenGO.transform.localPosition = Vector3.zero; titleScreenGO.transform.localPosition = Vector3.zero;
titleScreenGO.transform.localScale = Vector3.one * 30f / maxSize;
return titleScreenGO; return titleScreenGO;
} }

View File

@ -9,6 +9,14 @@ namespace NewHorizons.OtherMods.OWRichPresence
public void SetTriggerActivation(bool active); public void SetTriggerActivation(bool active);
public GameObject CreateTrigger(GameObject parent, string message, string imageKey); public GameObject CreateTrigger(GameObject parent, string message, string imageKey);
public GameObject CreateTrigger(GameObject parent, Sector sector, string message, string imageKey); public GameObject CreateTrigger(GameObject parent, Sector sector, string message, string imageKey);
public GameObject CreateTrigger(GameObject parent, string message, string imageKey, string fallback);
public GameObject CreateTrigger(GameObject parent, Sector sector, string message, string imageKey, string fallback);
public void CreateTriggerVolume(OWTriggerVolume triggerVolume, string message, string imageKey);
public void CreateTriggerVolume(OWTriggerVolume triggerVolume, string message, string imageKey, string fallback);
public GameObject CreateTriggerVolume(GameObject parent, float radius, string message, string imageKey);
public GameObject CreateTriggerVolume(GameObject parent, float radius, string message, string imageKey, string fallback);
public GameObject CreateTriggerVolume(GameObject parent, Vector3 localPosition, float radius, string message, string imageKey);
public GameObject CreateTriggerVolume(GameObject parent, Vector3 localPosition, float radius, string message, string imageKey, string fallback);
public void SetCurrentRootPresence(string message, string imageKey); public void SetCurrentRootPresence(string message, string imageKey);
} }
} }

View File

@ -38,7 +38,7 @@ namespace NewHorizons.OtherMods.OWRichPresence
} }
} }
public static void SetUpPlanet(string name, GameObject go, Sector sector) public static void SetUpPlanet(string name, GameObject go, Sector sector, bool isStar = false, bool hasAtmosphere = false)
{ {
if (!Enabled) return; if (!Enabled) return;
@ -47,7 +47,11 @@ namespace NewHorizons.OtherMods.OWRichPresence
var localizedName = TranslationHandler.GetTranslation(name, TranslationHandler.TextType.UI); var localizedName = TranslationHandler.GetTranslation(name, TranslationHandler.TextType.UI);
var message = TranslationHandler.GetTranslation("RICH_PRESENCE_EXPLORING", TranslationHandler.TextType.UI).Replace("{0}", localizedName); var message = TranslationHandler.GetTranslation("RICH_PRESENCE_EXPLORING", TranslationHandler.TextType.UI).Replace("{0}", localizedName);
API.CreateTrigger(go, sector, message, name.Replace(" ", "").Replace("'", "").Replace("-", "").ToLowerInvariant()); string fallbackKey = "defaultplanet";
if (isStar) fallbackKey = "defaultstar";
else if (hasAtmosphere) fallbackKey = "defaultplanetatmosphere";
API.CreateTrigger(go, sector, message, name.Replace(" ", "").Replace("'", "").Replace("-", "").ToLowerInvariant(), fallbackKey);
} }
public static void OnStarSystemLoaded(string name) public static void OnStarSystemLoaded(string name)
@ -59,7 +63,7 @@ namespace NewHorizons.OtherMods.OWRichPresence
var localizedName = ShipLogStarChartMode.UniqueIDToName(name); var localizedName = ShipLogStarChartMode.UniqueIDToName(name);
var message = TranslationHandler.GetTranslation("RICH_PRESENCE_EXPLORING", TranslationHandler.TextType.UI).Replace("{0}", localizedName); var message = TranslationHandler.GetTranslation("RICH_PRESENCE_EXPLORING", TranslationHandler.TextType.UI).Replace("{0}", localizedName);
API.SetCurrentRootPresence(message, "sun"); API.SetCurrentRootPresence(message, "newhorizons");
} }
public static void OnChangeStarSystem(string destination) public static void OnChangeStarSystem(string destination)

View File

@ -2715,6 +2715,20 @@
"items": { "items": {
"$ref": "#/definitions/PriorityVolumeInfo" "$ref": "#/definitions/PriorityVolumeInfo"
} }
},
"solarSystemVolume": {
"type": "array",
"description": "Entering this volume will load a new solar system.",
"items": {
"$ref": "#/definitions/ChangeStarSystemVolumeInfo"
}
},
"creditsVolume": {
"type": "array",
"description": "Enter this volume to be sent to the end credits scene",
"items": {
"$ref": "#/definitions/LoadCreditsVolumeInfo"
}
} }
} }
}, },
@ -3728,6 +3742,85 @@
"default": 1 "default": 1
} }
} }
},
"ChangeStarSystemVolumeInfo": {
"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",
"default": 1.0
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
},
"isRelativeToParent": {
"type": "boolean",
"description": "Whether the positional coordinates are relative to parent instead of the root planet object."
},
"rename": {
"type": "string",
"description": "An optional rename of this volume."
},
"targetStarSystem": {
"type": "string",
"description": "The star system that entering this volume will send you to.",
"default": "SolarSystem"
}
}
},
"LoadCreditsVolumeInfo": {
"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",
"default": 1.0
},
"parentPath": {
"type": "string",
"description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)."
},
"isRelativeToParent": {
"type": "boolean",
"description": "Whether the positional coordinates are relative to parent instead of the root planet object."
},
"rename": {
"type": "string",
"description": "An optional rename of this volume."
},
"creditsType": {
"default": "fast",
"$ref": "#/definitions/CreditsType"
}
}
},
"CreditsType": {
"type": "string",
"description": "",
"x-enumNames": [
"Fast",
"Final",
"Kazoo"
],
"enum": [
"fast",
"final",
"kazoo"
]
} }
}, },
"$docs": { "$docs": {

View File

@ -4,9 +4,9 @@
"author": "xen, Bwc9876, clay, MegaPiggy, John, Trifid, Hawkbar, Book", "author": "xen, Bwc9876, clay, MegaPiggy, John, Trifid, Hawkbar, Book",
"name": "New Horizons", "name": "New Horizons",
"uniqueName": "xen.NewHorizons", "uniqueName": "xen.NewHorizons",
"version": "1.8.5", "version": "1.8.6",
"owmlVersion": "2.9.0", "owmlVersion": "2.9.0",
"dependencies": [ "JohnCorby.VanillaFix", "_nebula.MenuFramework", "xen.CommonCameraUtility", "dgarro.CustomShipLogModes" ], "dependencies": [ "JohnCorby.VanillaFix", "_nebula.MenuFramework", "xen.CommonCameraUtility", "dgarro.CustomShipLogModes" ],
"conflicts": [ "Raicuparta.QuantumSpaceBuddies", "PacificEngine.OW_Randomizer" ], "conflicts": [ "Raicuparta.QuantumSpaceBuddies", "PacificEngine.OW_CommonResources" ],
"pathsToPreserve": [ "planets", "systems", "translations" ] "pathsToPreserve": [ "planets", "systems", "translations" ]
} }