fixed merge conflict with dev
49
NewHorizons/AchievementsPlus/AchievementHandler.cs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
using NewHorizons.Utility;
|
||||||
|
using OWML.ModHelper;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace NewHorizons.AchievementsPlus
|
||||||
|
{
|
||||||
|
public static class AchievementHandler
|
||||||
|
{
|
||||||
|
private static bool _enabled;
|
||||||
|
private static IAchievements API;
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
API = Main.Instance.ModHelper.Interaction.TryGetModApi<IAchievements>("xen.AchievementTracker");
|
||||||
|
|
||||||
|
if (API == null)
|
||||||
|
{
|
||||||
|
Logger.Log("Achievements+ isn't installed");
|
||||||
|
_enabled = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_enabled = true;
|
||||||
|
|
||||||
|
// Register base NH achievements
|
||||||
|
NH.WarpDriveAchievement.Init();
|
||||||
|
NH.MultipleSystemAchievement.Init();
|
||||||
|
NH.EatenOutsideBrambleAchievement.Init();
|
||||||
|
NH.NewFrequencyAchievement.Init();
|
||||||
|
NH.ProbeLostAchievement.Init();
|
||||||
|
|
||||||
|
API.RegisterTranslationsFromFiles(Main.Instance, "Assets/translations");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Earn(string unique_id)
|
||||||
|
{
|
||||||
|
if (!_enabled) return;
|
||||||
|
|
||||||
|
API.EarnAchievement(unique_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Register(string unique_id, bool secret, ModBehaviour mod)
|
||||||
|
{
|
||||||
|
if (!_enabled) return;
|
||||||
|
|
||||||
|
API.RegisterAchievement(unique_id, secret, mod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
12
NewHorizons/AchievementsPlus/IAchievements.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
using OWML.ModHelper;
|
||||||
|
|
||||||
|
namespace NewHorizons.AchievementsPlus
|
||||||
|
{
|
||||||
|
public interface IAchievements
|
||||||
|
{
|
||||||
|
void RegisterAchievement(string uniqueID, bool secret, ModBehaviour mod);
|
||||||
|
void RegisterTranslation(string uniqueID, TextTranslation.Language language, string name, string description);
|
||||||
|
void RegisterTranslationsFromFiles(ModBehaviour mod, string folderPath);
|
||||||
|
void EarnAchievement(string uniqueID);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NewHorizons.AchievementsPlus.NH
|
||||||
|
{
|
||||||
|
public static class EatenOutsideBrambleAchievement
|
||||||
|
{
|
||||||
|
public static readonly string UNIQUE_ID = "NH_EATEN_OUTSIDE_BRAMBLE";
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
AchievementHandler.Register(UNIQUE_ID, false, Main.Instance);
|
||||||
|
GlobalMessenger<DeathType>.AddListener("PlayerDeath", OnPlayerDeath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnPlayerDeath(DeathType death)
|
||||||
|
{
|
||||||
|
if (death == DeathType.Digestion && !PlayerState.InBrambleDimension()) AchievementHandler.Earn(UNIQUE_ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
40
NewHorizons/AchievementsPlus/NH/MultipleSystemAchievement.cs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NewHorizons.AchievementsPlus.NH
|
||||||
|
{
|
||||||
|
public static class MultipleSystemAchievement
|
||||||
|
{
|
||||||
|
public static readonly string UNIQUE_ID = "NH_MULTIPLE_SYSTEM";
|
||||||
|
|
||||||
|
private static List<string> _uniqueSystems = new List<string>();
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
AchievementHandler.Register(UNIQUE_ID, false, Main.Instance);
|
||||||
|
Main.Instance.OnChangeStarSystem.AddListener(OnChangeStarSystem);
|
||||||
|
GlobalMessenger<DeathType>.AddListener("PlayerDeath", OnPlayerDeath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnPlayerDeath(DeathType _)
|
||||||
|
{
|
||||||
|
if (Main.Instance.IsChangingStarSystem) return;
|
||||||
|
|
||||||
|
_uniqueSystems.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnChangeStarSystem(string system)
|
||||||
|
{
|
||||||
|
if (_uniqueSystems.Contains(system)) return;
|
||||||
|
_uniqueSystems.Add(system);
|
||||||
|
if(_uniqueSystems.Count > 5)
|
||||||
|
{
|
||||||
|
AchievementHandler.Earn(UNIQUE_ID);
|
||||||
|
_uniqueSystems.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
23
NewHorizons/AchievementsPlus/NH/NewFrequencyAchievement.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NewHorizons.AchievementsPlus.NH
|
||||||
|
{
|
||||||
|
public static class NewFrequencyAchievement
|
||||||
|
{
|
||||||
|
public static readonly string UNIQUE_ID = "NH_NEW_FREQ";
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
AchievementHandler.Register(UNIQUE_ID, false, Main.Instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Earn()
|
||||||
|
{
|
||||||
|
AchievementHandler.Earn(UNIQUE_ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
23
NewHorizons/AchievementsPlus/NH/ProbeLostAchievement.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NewHorizons.AchievementsPlus.NH
|
||||||
|
{
|
||||||
|
public static class ProbeLostAchievement
|
||||||
|
{
|
||||||
|
public static readonly string UNIQUE_ID = "NH_PROBE_LOST";
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
AchievementHandler.Register(UNIQUE_ID, false, Main.Instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Earn()
|
||||||
|
{
|
||||||
|
AchievementHandler.Earn(UNIQUE_ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
24
NewHorizons/AchievementsPlus/NH/WarpDriveAchievement.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NewHorizons.AchievementsPlus.NH
|
||||||
|
{
|
||||||
|
public static class WarpDriveAchievement
|
||||||
|
{
|
||||||
|
public static readonly string UNIQUE_ID = "NH_WARP_DRIVE";
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
AchievementHandler.Register(UNIQUE_ID, false, Main.Instance);
|
||||||
|
Main.Instance.OnChangeStarSystem.AddListener(OnChangeStarSystem);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void OnChangeStarSystem(string system)
|
||||||
|
{
|
||||||
|
if (Main.Instance.IsWarping) AchievementHandler.Earn(UNIQUE_ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 127 KiB |
@ -8,7 +8,7 @@
|
|||||||
"position":{"x": -0.3071011, "y": 2.741472, "z": -4.005298},
|
"position":{"x": -0.3071011, "y": 2.741472, "z": -4.005298},
|
||||||
"radius": 0,
|
"radius": 0,
|
||||||
"remoteTriggerRadius": 1,
|
"remoteTriggerRadius": 1,
|
||||||
"xmlFile":"AssetBundle/WarpDriveDialogue.xml",
|
"xmlFile":"Assets/WarpDriveDialogue.xml",
|
||||||
"remoteTriggerPosition": {"x": -0.05656214, "y": 0.5362684, "z": 0.5467669},
|
"remoteTriggerPosition": {"x": -0.05656214, "y": 0.5362684, "z": 0.5467669},
|
||||||
"blockAfterPersistentCondition" : "KnowsAboutWarpDrive"
|
"blockAfterPersistentCondition" : "KnowsAboutWarpDrive"
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 370 KiB After Width: | Height: | Size: 370 KiB |
|
Before Width: | Height: | Size: 179 B After Width: | Height: | Size: 179 B |
|
Before Width: | Height: | Size: 180 B After Width: | Height: | Size: 180 B |
|
Before Width: | Height: | Size: 233 B After Width: | Height: | Size: 233 B |
|
Before Width: | Height: | Size: 3.8 MiB After Width: | Height: | Size: 3.8 MiB |
|
Before Width: | Height: | Size: 3.3 MiB After Width: | Height: | Size: 3.3 MiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 2.4 MiB After Width: | Height: | Size: 2.4 MiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 4.4 MiB After Width: | Height: | Size: 4.4 MiB |
|
Before Width: | Height: | Size: 3.3 MiB After Width: | Height: | Size: 3.3 MiB |
@ -14,5 +14,27 @@
|
|||||||
"FREQ_UNKNOWN" : "???",
|
"FREQ_UNKNOWN" : "???",
|
||||||
"ENGAGE_WARP_PROMPT" : "Engage Warp To {0}",
|
"ENGAGE_WARP_PROMPT" : "Engage Warp To {0}",
|
||||||
"WARP_LOCKED" : "AUTOPILOT LOCKED TO:\n{0}"
|
"WARP_LOCKED" : "AUTOPILOT LOCKED TO:\n{0}"
|
||||||
}
|
},
|
||||||
|
"AchievementTranslations": {
|
||||||
|
"NH_EATEN_OUTSIDE_BRAMBLE" : {
|
||||||
|
"Name": "Containment Breach",
|
||||||
|
"Description": "Get eaten outside of Dark Bramble"
|
||||||
|
},
|
||||||
|
"NH_MULTIPLE_SYSTEM" : {
|
||||||
|
"Name": "Traveller",
|
||||||
|
"Description": "Visit 5 unique star systems in a row."
|
||||||
|
},
|
||||||
|
"NH_NEW_FREQ" : {
|
||||||
|
"Name": "Anomalous Frequencies",
|
||||||
|
"Description": "Discover a new frequency."
|
||||||
|
},
|
||||||
|
"NH_PROBE_LOST" : {
|
||||||
|
"Name": "Connection Lost",
|
||||||
|
"Description": "Lose your little scout."
|
||||||
|
},
|
||||||
|
"NH_WARP_DRIVE": {
|
||||||
|
"Name": "Lore Inaccurate",
|
||||||
|
"Description": "Use your ship's warp drive."
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -1,227 +1,227 @@
|
|||||||
using NewHorizons.External.Modules;
|
using NewHorizons.External.Modules;
|
||||||
using NewHorizons.Utility;
|
using NewHorizons.Utility;
|
||||||
using OWML.Common;
|
using OWML.Common;
|
||||||
using System;
|
using System;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Logger = NewHorizons.Utility.Logger;
|
using Logger = NewHorizons.Utility.Logger;
|
||||||
namespace NewHorizons.Builder.Atmosphere
|
namespace NewHorizons.Builder.Atmosphere
|
||||||
{
|
{
|
||||||
public static class CloudsBuilder
|
public static class CloudsBuilder
|
||||||
{
|
{
|
||||||
private static Shader _sphereShader = null;
|
private static Shader _sphereShader = null;
|
||||||
private static Material[] _gdCloudMaterials;
|
private static Material[] _gdCloudMaterials;
|
||||||
private static Material[] _qmCloudMaterials;
|
private static Material[] _qmCloudMaterials;
|
||||||
private static GameObject _lightningPrefab;
|
private static GameObject _lightningPrefab;
|
||||||
private static Texture2D _colorRamp;
|
private static Texture2D _colorRamp;
|
||||||
private static readonly int Color1 = Shader.PropertyToID("_Color");
|
private static readonly int Color1 = Shader.PropertyToID("_Color");
|
||||||
private static readonly int TintColor = Shader.PropertyToID("_TintColor");
|
private static readonly int TintColor = Shader.PropertyToID("_TintColor");
|
||||||
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 ColorRamp = Shader.PropertyToID("_ColorRamp");
|
private static readonly int ColorRamp = Shader.PropertyToID("_ColorRamp");
|
||||||
|
|
||||||
public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, IModBehaviour mod)
|
public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, IModBehaviour mod)
|
||||||
{
|
{
|
||||||
if (_lightningPrefab == null) _lightningPrefab = SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Clouds_GD/LightningGenerator_GD");
|
if (_lightningPrefab == null) _lightningPrefab = SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Clouds_GD/LightningGenerator_GD");
|
||||||
if (_colorRamp == null) _colorRamp = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/textures/Clouds_Bottom_ramp.png");
|
if (_colorRamp == null) _colorRamp = ImageUtilities.GetTexture(Main.Instance, "Assets/textures/Clouds_Bottom_ramp.png");
|
||||||
|
|
||||||
GameObject cloudsMainGO = new GameObject("Clouds");
|
GameObject cloudsMainGO = new GameObject("Clouds");
|
||||||
cloudsMainGO.SetActive(false);
|
cloudsMainGO.SetActive(false);
|
||||||
cloudsMainGO.transform.parent = sector?.transform ?? planetGO.transform;
|
cloudsMainGO.transform.parent = sector?.transform ?? planetGO.transform;
|
||||||
|
|
||||||
MakeTopClouds(cloudsMainGO, atmo, mod);
|
MakeTopClouds(cloudsMainGO, atmo, mod);
|
||||||
|
|
||||||
GameObject cloudsBottomGO = new GameObject("BottomClouds");
|
GameObject cloudsBottomGO = new GameObject("BottomClouds");
|
||||||
cloudsBottomGO.SetActive(false);
|
cloudsBottomGO.SetActive(false);
|
||||||
cloudsBottomGO.transform.parent = cloudsMainGO.transform;
|
cloudsBottomGO.transform.parent = cloudsMainGO.transform;
|
||||||
cloudsBottomGO.transform.localScale = Vector3.one * atmo.clouds.innerCloudRadius;
|
cloudsBottomGO.transform.localScale = Vector3.one * atmo.clouds.innerCloudRadius;
|
||||||
|
|
||||||
TessellatedSphereRenderer bottomTSR = cloudsBottomGO.AddComponent<TessellatedSphereRenderer>();
|
TessellatedSphereRenderer bottomTSR = cloudsBottomGO.AddComponent<TessellatedSphereRenderer>();
|
||||||
bottomTSR.tessellationMeshGroup = SearchUtilities.Find("CloudsBottomLayer_QM").GetComponent<TessellatedSphereRenderer>().tessellationMeshGroup;
|
bottomTSR.tessellationMeshGroup = SearchUtilities.Find("CloudsBottomLayer_QM").GetComponent<TessellatedSphereRenderer>().tessellationMeshGroup;
|
||||||
var bottomTSRMaterials = SearchUtilities.Find("CloudsBottomLayer_QM").GetComponent<TessellatedSphereRenderer>().sharedMaterials;
|
var bottomTSRMaterials = SearchUtilities.Find("CloudsBottomLayer_QM").GetComponent<TessellatedSphereRenderer>().sharedMaterials;
|
||||||
|
|
||||||
// If they set a colour apply it to all the materials else keep the default QM one
|
// If they set a colour apply it to all the materials else keep the default QM one
|
||||||
if (atmo.clouds.tint != null)
|
if (atmo.clouds.tint != null)
|
||||||
{
|
{
|
||||||
var bottomColor = atmo.clouds.tint.ToColor();
|
var bottomColor = atmo.clouds.tint.ToColor();
|
||||||
|
|
||||||
var bottomTSRTempArray = new Material[2];
|
var bottomTSRTempArray = new Material[2];
|
||||||
|
|
||||||
bottomTSRTempArray[0] = new Material(bottomTSRMaterials[0]);
|
bottomTSRTempArray[0] = new Material(bottomTSRMaterials[0]);
|
||||||
bottomTSRTempArray[0].SetColor(Color1, bottomColor);
|
bottomTSRTempArray[0].SetColor(Color1, bottomColor);
|
||||||
bottomTSRTempArray[0].SetColor(TintColor, bottomColor);
|
bottomTSRTempArray[0].SetColor(TintColor, bottomColor);
|
||||||
bottomTSRTempArray[0].SetTexture(ColorRamp, ImageUtilities.TintImage(_colorRamp, bottomColor));
|
bottomTSRTempArray[0].SetTexture(ColorRamp, ImageUtilities.TintImage(_colorRamp, bottomColor));
|
||||||
|
|
||||||
bottomTSRTempArray[1] = new Material(bottomTSRMaterials[1]);
|
bottomTSRTempArray[1] = new Material(bottomTSRMaterials[1]);
|
||||||
|
|
||||||
bottomTSR.sharedMaterials = bottomTSRTempArray;
|
bottomTSR.sharedMaterials = bottomTSRTempArray;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bottomTSR.sharedMaterials = bottomTSRMaterials;
|
bottomTSR.sharedMaterials = bottomTSRMaterials;
|
||||||
}
|
}
|
||||||
|
|
||||||
bottomTSR.maxLOD = 6;
|
bottomTSR.maxLOD = 6;
|
||||||
bottomTSR.LODBias = 0;
|
bottomTSR.LODBias = 0;
|
||||||
bottomTSR.LODRadius = 1f;
|
bottomTSR.LODRadius = 1f;
|
||||||
|
|
||||||
TessSphereSectorToggle bottomTSST = cloudsBottomGO.AddComponent<TessSphereSectorToggle>();
|
TessSphereSectorToggle bottomTSST = cloudsBottomGO.AddComponent<TessSphereSectorToggle>();
|
||||||
bottomTSST._sector = sector;
|
bottomTSST._sector = sector;
|
||||||
|
|
||||||
GameObject cloudsFluidGO = new GameObject("CloudsFluid");
|
GameObject cloudsFluidGO = new GameObject("CloudsFluid");
|
||||||
cloudsFluidGO.SetActive(false);
|
cloudsFluidGO.SetActive(false);
|
||||||
cloudsFluidGO.layer = 17;
|
cloudsFluidGO.layer = 17;
|
||||||
cloudsFluidGO.transform.parent = cloudsMainGO.transform;
|
cloudsFluidGO.transform.parent = cloudsMainGO.transform;
|
||||||
|
|
||||||
SphereCollider fluidSC = cloudsFluidGO.AddComponent<SphereCollider>();
|
SphereCollider fluidSC = cloudsFluidGO.AddComponent<SphereCollider>();
|
||||||
fluidSC.isTrigger = true;
|
fluidSC.isTrigger = true;
|
||||||
fluidSC.radius = atmo.size;
|
fluidSC.radius = atmo.size;
|
||||||
|
|
||||||
OWShellCollider fluidOWSC = cloudsFluidGO.AddComponent<OWShellCollider>();
|
OWShellCollider fluidOWSC = cloudsFluidGO.AddComponent<OWShellCollider>();
|
||||||
fluidOWSC._innerRadius = atmo.size * 0.9f;
|
fluidOWSC._innerRadius = atmo.size * 0.9f;
|
||||||
|
|
||||||
CloudLayerFluidVolume fluidCLFV = cloudsFluidGO.AddComponent<CloudLayerFluidVolume>();
|
CloudLayerFluidVolume fluidCLFV = cloudsFluidGO.AddComponent<CloudLayerFluidVolume>();
|
||||||
fluidCLFV._layer = 5;
|
fluidCLFV._layer = 5;
|
||||||
fluidCLFV._priority = 1;
|
fluidCLFV._priority = 1;
|
||||||
fluidCLFV._density = 1.2f;
|
fluidCLFV._density = 1.2f;
|
||||||
|
|
||||||
var fluidType = FluidVolume.Type.CLOUD;
|
var fluidType = FluidVolume.Type.CLOUD;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
fluidType = (FluidVolume.Type)Enum.Parse(typeof(FluidVolume.Type), Enum.GetName(typeof(CloudFluidType), atmo.clouds.fluidType).ToUpper());
|
fluidType = (FluidVolume.Type)Enum.Parse(typeof(FluidVolume.Type), Enum.GetName(typeof(CloudFluidType), atmo.clouds.fluidType).ToUpper());
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError($"Couldn't parse fluid volume type [{atmo.clouds.fluidType}]: {ex.Message}, {ex.StackTrace}");
|
Logger.LogError($"Couldn't parse fluid volume type [{atmo.clouds.fluidType}]: {ex.Message}, {ex.StackTrace}");
|
||||||
}
|
}
|
||||||
|
|
||||||
fluidCLFV._fluidType = fluidType;
|
fluidCLFV._fluidType = fluidType;
|
||||||
fluidCLFV._allowShipAutoroll = true;
|
fluidCLFV._allowShipAutoroll = true;
|
||||||
fluidCLFV._disableOnStart = false;
|
fluidCLFV._disableOnStart = false;
|
||||||
|
|
||||||
// Fix the rotations once the rest is done
|
// Fix the rotations once the rest is done
|
||||||
cloudsMainGO.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(0, 0, 0));
|
cloudsMainGO.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(0, 0, 0));
|
||||||
// For the base shader it has to be rotated idk
|
// For the base shader it has to be rotated idk
|
||||||
if (atmo.clouds.cloudsPrefab == CloudPrefabType.Basic) cloudsMainGO.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(90, 0, 0));
|
if (atmo.clouds.cloudsPrefab == CloudPrefabType.Basic) cloudsMainGO.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(90, 0, 0));
|
||||||
|
|
||||||
// Lightning
|
// Lightning
|
||||||
if (atmo.clouds.hasLightning)
|
if (atmo.clouds.hasLightning)
|
||||||
{
|
{
|
||||||
var lightning = _lightningPrefab.InstantiateInactive();
|
var lightning = _lightningPrefab.InstantiateInactive();
|
||||||
lightning.transform.parent = cloudsMainGO.transform;
|
lightning.transform.parent = cloudsMainGO.transform;
|
||||||
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.outerCloudRadius + atmo.clouds.innerCloudRadius) / 2f;
|
||||||
lightningGenerator._audioSector = sector;
|
lightningGenerator._audioSector = sector;
|
||||||
if (atmo.clouds.lightningGradient != null)
|
if (atmo.clouds.lightningGradient != null)
|
||||||
{
|
{
|
||||||
var gradient = new GradientColorKey[atmo.clouds.lightningGradient.Length];
|
var gradient = new GradientColorKey[atmo.clouds.lightningGradient.Length];
|
||||||
|
|
||||||
for(int i = 0; i < atmo.clouds.lightningGradient.Length; i++)
|
for(int i = 0; i < atmo.clouds.lightningGradient.Length; i++)
|
||||||
{
|
{
|
||||||
var pair = atmo.clouds.lightningGradient[i];
|
var pair = atmo.clouds.lightningGradient[i];
|
||||||
gradient[i] = new GradientColorKey(pair.tint.ToColor(), pair.time);
|
gradient[i] = new GradientColorKey(pair.tint.ToColor(), pair.time);
|
||||||
}
|
}
|
||||||
|
|
||||||
lightningGenerator._lightColor.colorKeys = gradient;
|
lightningGenerator._lightColor.colorKeys = gradient;
|
||||||
}
|
}
|
||||||
lightning.SetActive(true);
|
lightning.SetActive(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
cloudsMainGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero);
|
cloudsMainGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero);
|
||||||
cloudsBottomGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero);
|
cloudsBottomGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero);
|
||||||
cloudsFluidGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero);
|
cloudsFluidGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero);
|
||||||
|
|
||||||
cloudsBottomGO.SetActive(true);
|
cloudsBottomGO.SetActive(true);
|
||||||
cloudsFluidGO.SetActive(true);
|
cloudsFluidGO.SetActive(true);
|
||||||
cloudsMainGO.SetActive(true);
|
cloudsMainGO.SetActive(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static GameObject MakeTopClouds(GameObject rootObject, AtmosphereModule atmo, IModBehaviour mod)
|
public static GameObject MakeTopClouds(GameObject rootObject, AtmosphereModule atmo, IModBehaviour mod)
|
||||||
{
|
{
|
||||||
Color cloudTint = atmo.clouds.tint?.ToColor() ?? Color.white;
|
Color cloudTint = atmo.clouds.tint?.ToColor() ?? Color.white;
|
||||||
|
|
||||||
Texture2D image, cap, ramp;
|
Texture2D image, cap, ramp;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
image = ImageUtilities.GetTexture(mod, atmo.clouds.texturePath);
|
image = ImageUtilities.GetTexture(mod, atmo.clouds.texturePath);
|
||||||
|
|
||||||
if (atmo.clouds.capPath == null) cap = ImageUtilities.ClearTexture(128, 128);
|
if (atmo.clouds.capPath == null) cap = ImageUtilities.ClearTexture(128, 128);
|
||||||
else cap = ImageUtilities.GetTexture(mod, atmo.clouds.capPath);
|
else cap = ImageUtilities.GetTexture(mod, atmo.clouds.capPath);
|
||||||
if (atmo.clouds.rampPath == null) ramp = ImageUtilities.CanvasScaled(image, 1, image.height);
|
if (atmo.clouds.rampPath == null) ramp = ImageUtilities.CanvasScaled(image, 1, image.height);
|
||||||
else ramp = ImageUtilities.GetTexture(mod, atmo.clouds.rampPath);
|
else ramp = ImageUtilities.GetTexture(mod, atmo.clouds.rampPath);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Logger.LogError($"Couldn't load Cloud textures for [{rootObject.name}], {e.Message}, {e.StackTrace}");
|
Logger.LogError($"Couldn't load Cloud textures for [{rootObject.name}], {e.Message}, {e.StackTrace}");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
GameObject cloudsTopGO = new GameObject("TopClouds");
|
GameObject cloudsTopGO = new GameObject("TopClouds");
|
||||||
cloudsTopGO.SetActive(false);
|
cloudsTopGO.SetActive(false);
|
||||||
cloudsTopGO.transform.parent = rootObject.transform;
|
cloudsTopGO.transform.parent = rootObject.transform;
|
||||||
cloudsTopGO.transform.localScale = Vector3.one * atmo.clouds.outerCloudRadius;
|
cloudsTopGO.transform.localScale = Vector3.one * atmo.clouds.outerCloudRadius;
|
||||||
|
|
||||||
MeshFilter topMF = cloudsTopGO.AddComponent<MeshFilter>();
|
MeshFilter topMF = cloudsTopGO.AddComponent<MeshFilter>();
|
||||||
topMF.mesh = SearchUtilities.Find("CloudsTopLayer_GD").GetComponent<MeshFilter>().mesh;
|
topMF.mesh = SearchUtilities.Find("CloudsTopLayer_GD").GetComponent<MeshFilter>().mesh;
|
||||||
|
|
||||||
MeshRenderer topMR = cloudsTopGO.AddComponent<MeshRenderer>();
|
MeshRenderer topMR = cloudsTopGO.AddComponent<MeshRenderer>();
|
||||||
|
|
||||||
if (_sphereShader == null) _sphereShader = Main.NHAssetBundle.LoadAsset<Shader>("Assets/Shaders/SphereTextureWrapper.shader");
|
if (_sphereShader == null) _sphereShader = Main.NHAssetBundle.LoadAsset<Shader>("Assets/Shaders/SphereTextureWrapper.shader");
|
||||||
if (_gdCloudMaterials == null) _gdCloudMaterials = SearchUtilities.Find("CloudsTopLayer_GD").GetComponent<MeshRenderer>().sharedMaterials;
|
if (_gdCloudMaterials == null) _gdCloudMaterials = SearchUtilities.Find("CloudsTopLayer_GD").GetComponent<MeshRenderer>().sharedMaterials;
|
||||||
if (_qmCloudMaterials == null) _qmCloudMaterials = SearchUtilities.Find("CloudsTopLayer_QM").GetComponent<MeshRenderer>().sharedMaterials;
|
if (_qmCloudMaterials == null) _qmCloudMaterials = SearchUtilities.Find("CloudsTopLayer_QM").GetComponent<MeshRenderer>().sharedMaterials;
|
||||||
Material[] prefabMaterials = atmo.clouds.cloudsPrefab == CloudPrefabType.GiantsDeep ? _gdCloudMaterials : _qmCloudMaterials;
|
Material[] prefabMaterials = atmo.clouds.cloudsPrefab == CloudPrefabType.GiantsDeep ? _gdCloudMaterials : _qmCloudMaterials;
|
||||||
var tempArray = new Material[2];
|
var tempArray = new Material[2];
|
||||||
|
|
||||||
if (atmo.clouds.cloudsPrefab == CloudPrefabType.Basic)
|
if (atmo.clouds.cloudsPrefab == CloudPrefabType.Basic)
|
||||||
{
|
{
|
||||||
var material = new Material(_sphereShader);
|
var material = new Material(_sphereShader);
|
||||||
if (atmo.clouds.unlit) material.renderQueue = 2550;
|
if (atmo.clouds.unlit) material.renderQueue = 2550;
|
||||||
material.name = atmo.clouds.unlit ? "BasicCloud" : "BasicShadowCloud";
|
material.name = atmo.clouds.unlit ? "BasicCloud" : "BasicShadowCloud";
|
||||||
|
|
||||||
tempArray[0] = material;
|
tempArray[0] = material;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var material = new Material(prefabMaterials[0]);
|
var material = new Material(prefabMaterials[0]);
|
||||||
if (atmo.clouds.unlit) material.renderQueue = 2550;
|
if (atmo.clouds.unlit) material.renderQueue = 2550;
|
||||||
material.name = atmo.clouds.unlit ? "AdvancedCloud" : "AdvancedShadowCloud";
|
material.name = atmo.clouds.unlit ? "AdvancedCloud" : "AdvancedShadowCloud";
|
||||||
tempArray[0] = material;
|
tempArray[0] = material;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the stencil material for the fog under the clouds
|
// This is the stencil material for the fog under the clouds
|
||||||
tempArray[1] = new Material(prefabMaterials[1]);
|
tempArray[1] = new Material(prefabMaterials[1]);
|
||||||
topMR.sharedMaterials = tempArray;
|
topMR.sharedMaterials = tempArray;
|
||||||
|
|
||||||
foreach (var material in topMR.sharedMaterials)
|
foreach (var material in topMR.sharedMaterials)
|
||||||
{
|
{
|
||||||
material.SetColor(Color1, cloudTint);
|
material.SetColor(Color1, cloudTint);
|
||||||
material.SetColor(TintColor, cloudTint);
|
material.SetColor(TintColor, cloudTint);
|
||||||
|
|
||||||
material.SetTexture(MainTex, image);
|
material.SetTexture(MainTex, image);
|
||||||
material.SetTexture(RampTex, ramp);
|
material.SetTexture(RampTex, ramp);
|
||||||
material.SetTexture(CapTex, cap);
|
material.SetTexture(CapTex, cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atmo.clouds.unlit)
|
if (atmo.clouds.unlit)
|
||||||
{
|
{
|
||||||
cloudsTopGO.layer = LayerMask.NameToLayer("IgnoreSun");
|
cloudsTopGO.layer = LayerMask.NameToLayer("IgnoreSun");
|
||||||
}
|
}
|
||||||
|
|
||||||
RotateTransform topRT = cloudsTopGO.AddComponent<RotateTransform>();
|
RotateTransform topRT = cloudsTopGO.AddComponent<RotateTransform>();
|
||||||
// Idk why but the axis is weird
|
// Idk why but the axis is weird
|
||||||
topRT._localAxis = atmo.clouds.cloudsPrefab == CloudPrefabType.Basic ? Vector3.forward : Vector3.up;
|
topRT._localAxis = atmo.clouds.cloudsPrefab == CloudPrefabType.Basic ? Vector3.forward : Vector3.up;
|
||||||
topRT._degreesPerSecond = 10;
|
topRT._degreesPerSecond = 10;
|
||||||
topRT._randomizeRotationRate = false;
|
topRT._randomizeRotationRate = false;
|
||||||
|
|
||||||
cloudsTopGO.transform.localPosition = Vector3.zero;
|
cloudsTopGO.transform.localPosition = Vector3.zero;
|
||||||
|
|
||||||
cloudsTopGO.SetActive(true);
|
cloudsTopGO.SetActive(true);
|
||||||
|
|
||||||
return cloudsTopGO;
|
return cloudsTopGO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,7 @@ namespace NewHorizons.Builder.Atmosphere
|
|||||||
|
|
||||||
public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo)
|
public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo)
|
||||||
{
|
{
|
||||||
if (_ramp == null) _ramp = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/textures/FogColorRamp.png");
|
if (_ramp == null) _ramp = ImageUtilities.GetTexture(Main.Instance, "Assets/textures/FogColorRamp.png");
|
||||||
|
|
||||||
GameObject fogGO = new GameObject("FogSphere");
|
GameObject fogGO = new GameObject("FogSphere");
|
||||||
fogGO.SetActive(false);
|
fogGO.SetActive(false);
|
||||||
|
|||||||
@ -12,16 +12,26 @@ namespace NewHorizons.Builder.Body
|
|||||||
var radius = module.radius;
|
var radius = module.radius;
|
||||||
|
|
||||||
AudioClip clip = null;
|
AudioClip clip = null;
|
||||||
if (module.audioClip != null) clip = SearchUtilities.FindResourceOfTypeAndName<AudioClip>(module.audioClip);
|
if (!string.IsNullOrEmpty(module.audioClip))
|
||||||
else if (module.audioFilePath != null)
|
{
|
||||||
|
clip = SearchUtilities.FindResourceOfTypeAndName<AudioClip>(module.audioClip);
|
||||||
|
|
||||||
|
if (clip == null)
|
||||||
|
{
|
||||||
|
Utility.Logger.LogError($"Couldn't get audio from clip [{module.audioClip}]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(module.audioFilePath))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
clip = AudioUtilities.LoadAudio(mod.ModHelper.Manifest.ModFolderPath + "/" + module.audioFilePath);
|
clip = AudioUtilities.LoadAudio(mod.ModHelper.Manifest.ModFolderPath + "/" + module.audioFilePath);
|
||||||
}
|
}
|
||||||
catch (System.Exception e)
|
catch { }
|
||||||
|
|
||||||
|
if (clip == null)
|
||||||
{
|
{
|
||||||
Utility.Logger.LogError($"Couldn't load audio file {module.audioFilePath} : {e.Message}");
|
Utility.Logger.LogError($"Couldn't get audio from file [{module.audioFilePath}]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -177,7 +177,7 @@ namespace NewHorizons.Builder.Body
|
|||||||
|
|
||||||
public static GameObject MakeStarGraphics(GameObject rootObject, Sector sector, StarModule starModule)
|
public static GameObject MakeStarGraphics(GameObject rootObject, Sector sector, StarModule starModule)
|
||||||
{
|
{
|
||||||
if (_colorOverTime == null) _colorOverTime = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/textures/StarColorOverTime.png");
|
if (_colorOverTime == null) _colorOverTime = ImageUtilities.GetTexture(Main.Instance, "Assets/textures/StarColorOverTime.png");
|
||||||
|
|
||||||
var starGO = new GameObject("Star");
|
var starGO = new GameObject("Star");
|
||||||
starGO.transform.parent = sector?.transform ?? rootObject.transform;
|
starGO.transform.parent = sector?.transform ?? rootObject.transform;
|
||||||
@ -253,7 +253,7 @@ namespace NewHorizons.Builder.Body
|
|||||||
var colour = starModule.supernovaTint.ToColor();
|
var colour = starModule.supernovaTint.ToColor();
|
||||||
|
|
||||||
var supernovaMaterial = new Material(supernova._supernovaMaterial);
|
var supernovaMaterial = new Material(supernova._supernovaMaterial);
|
||||||
var ramp = ImageUtilities.LerpGreyscaleImage(ImageUtilities.GetTexture(Main.Instance, "AssetBundle/textures/Effects_SUN_Supernova_d.png"), Color.white, colour);
|
var ramp = ImageUtilities.LerpGreyscaleImage(ImageUtilities.GetTexture(Main.Instance, "Assets/textures/Effects_SUN_Supernova_d.png"), Color.white, colour);
|
||||||
supernovaMaterial.SetTexture(ColorRamp, ramp);
|
supernovaMaterial.SetTexture(ColorRamp, ramp);
|
||||||
supernova._supernovaMaterial = supernovaMaterial;
|
supernova._supernovaMaterial = supernovaMaterial;
|
||||||
|
|
||||||
|
|||||||
@ -18,7 +18,7 @@ namespace NewHorizons.Builder.General
|
|||||||
// To let you actually orbit things the way you would expect we cap this at 4x the diameter if its not a star or black hole (this is what giants deep has)
|
// To let you actually orbit things the way you would expect we cap this at 4x the diameter if its not a star or black hole (this is what giants deep has)
|
||||||
if (config.Star == null && config.Singularity == null) gravityRadius = Mathf.Min(gravityRadius, 4 * config.Base.surfaceSize);
|
if (config.Star == null && config.Singularity == null) gravityRadius = Mathf.Min(gravityRadius, 4 * config.Base.surfaceSize);
|
||||||
else gravityRadius = Mathf.Min(gravityRadius, 15 * config.Base.surfaceSize);
|
else gravityRadius = Mathf.Min(gravityRadius, 15 * config.Base.surfaceSize);
|
||||||
if (config.Base.sphereOfInfluence != 0f) gravityRadius = config.Base.sphereOfInfluence;
|
if (config.Base.soiOverride != 0f) gravityRadius = config.Base.soiOverride;
|
||||||
|
|
||||||
var gravityGO = new GameObject("GravityWell");
|
var gravityGO = new GameObject("GravityWell");
|
||||||
gravityGO.transform.parent = planetGO.transform;
|
gravityGO.transform.parent = planetGO.transform;
|
||||||
|
|||||||
@ -15,6 +15,7 @@ namespace NewHorizons.Builder.General
|
|||||||
|
|
||||||
var SC = rfGO.AddComponent<SphereCollider>();
|
var SC = rfGO.AddComponent<SphereCollider>();
|
||||||
SC.isTrigger = true;
|
SC.isTrigger = true;
|
||||||
|
// This radius ends up being set by min and max collider radius on the RFV but we set it anyway because why fix what aint broke
|
||||||
SC.radius = sphereOfInfluence * 2;
|
SC.radius = sphereOfInfluence * 2;
|
||||||
|
|
||||||
var RFV = rfGO.AddComponent<ReferenceFrameVolume>();
|
var RFV = rfGO.AddComponent<ReferenceFrameVolume>();
|
||||||
@ -23,7 +24,8 @@ namespace NewHorizons.Builder.General
|
|||||||
|
|
||||||
var RV = new ReferenceFrame(owrb);
|
var RV = new ReferenceFrame(owrb);
|
||||||
RV._minSuitTargetDistance = minTargetDistance;
|
RV._minSuitTargetDistance = minTargetDistance;
|
||||||
RV._maxTargetDistance = 0;
|
// The game raycasts to 100km, but if the target is farther than this max distance it ignores it
|
||||||
|
RV._maxTargetDistance = module.maxTargetDistance;
|
||||||
RV._autopilotArrivalDistance = 2.0f * sphereOfInfluence;
|
RV._autopilotArrivalDistance = 2.0f * sphereOfInfluence;
|
||||||
RV._autoAlignmentDistance = sphereOfInfluence * 1.5f;
|
RV._autoAlignmentDistance = sphereOfInfluence * 1.5f;
|
||||||
|
|
||||||
@ -35,7 +37,7 @@ namespace NewHorizons.Builder.General
|
|||||||
|
|
||||||
RFV._referenceFrame = RV;
|
RFV._referenceFrame = RV;
|
||||||
RFV._minColliderRadius = minTargetDistance;
|
RFV._minColliderRadius = minTargetDistance;
|
||||||
RFV._maxColliderRadius = module.maxTargetDistance > -1 ? module.maxTargetDistance : sphereOfInfluence * 2f;
|
RFV._maxColliderRadius = module.targetColliderRadius > 0 ? module.targetColliderRadius : sphereOfInfluence * 2f;
|
||||||
RFV._isPrimaryVolume = true;
|
RFV._isPrimaryVolume = true;
|
||||||
RFV._isCloseRangeVolume = false;
|
RFV._isCloseRangeVolume = false;
|
||||||
|
|
||||||
|
|||||||
@ -57,7 +57,7 @@ namespace NewHorizons.Builder.Orbital
|
|||||||
|
|
||||||
// Other stuff to make the fake barycenter not interact with anything in any way
|
// Other stuff to make the fake barycenter not interact with anything in any way
|
||||||
fakeMassConfig.name = config.name + "_FakeBarycenterMass";
|
fakeMassConfig.name = config.name + "_FakeBarycenterMass";
|
||||||
fakeMassConfig.Base.sphereOfInfluence = 0;
|
fakeMassConfig.Base.soiOverride = 0;
|
||||||
fakeMassConfig.Base.hasMapMarker = false;
|
fakeMassConfig.Base.hasMapMarker = false;
|
||||||
fakeMassConfig.ReferenceFrame.hideInMap = true;
|
fakeMassConfig.ReferenceFrame.hideInMap = true;
|
||||||
|
|
||||||
|
|||||||
@ -153,17 +153,14 @@ namespace NewHorizons.Builder.Props
|
|||||||
var name = StringToSignalName(info.name);
|
var name = StringToSignalName(info.name);
|
||||||
|
|
||||||
AudioClip clip = null;
|
AudioClip clip = null;
|
||||||
if (info.audioClip != null) clip = SearchUtilities.FindResourceOfTypeAndName<AudioClip>(info.audioClip);
|
if (!string.IsNullOrEmpty(info.audioClip)) clip = SearchUtilities.FindResourceOfTypeAndName<AudioClip>(info.audioClip);
|
||||||
else if (info.audioFilePath != null)
|
else if (!string.IsNullOrEmpty(info.audioFilePath))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
clip = AudioUtilities.LoadAudio(mod.ModHelper.Manifest.ModFolderPath + "/" + info.audioFilePath);
|
clip = AudioUtilities.LoadAudio(mod.ModHelper.Manifest.ModFolderPath + "/" + info.audioFilePath);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch { }
|
||||||
{
|
|
||||||
Logger.LogError($"Couldn't load audio file {info.audioFilePath} : {e.Message}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clip == null)
|
if (clip == null)
|
||||||
|
|||||||
@ -55,11 +55,11 @@ namespace NewHorizons.Builder.Props
|
|||||||
}
|
}
|
||||||
if (_mainTexture == null)
|
if (_mainTexture == null)
|
||||||
{
|
{
|
||||||
_mainTexture = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/textures/Tornado_BH_Cyclone_02_d.png");
|
_mainTexture = ImageUtilities.GetTexture(Main.Instance, "Assets/textures/Tornado_BH_Cyclone_02_d.png");
|
||||||
}
|
}
|
||||||
if (_detailTexture == null)
|
if (_detailTexture == null)
|
||||||
{
|
{
|
||||||
_detailTexture = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/textures/Tornado_BH_CycloneDetail_d.png");
|
_detailTexture = ImageUtilities.GetTexture(Main.Instance, "Assets/textures/Tornado_BH_CycloneDetail_d.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 position;
|
Vector3 position;
|
||||||
@ -109,16 +109,20 @@ namespace NewHorizons.Builder.Props
|
|||||||
var audioSpreadController = soundGO.GetComponentInChildren<AudioSpreadController>();
|
var audioSpreadController = soundGO.GetComponentInChildren<AudioSpreadController>();
|
||||||
audioSpreadController.SetSector(sector);
|
audioSpreadController.SetSector(sector);
|
||||||
|
|
||||||
var audioSource = audioRail._audioTransform.GetComponent<AudioSource>();
|
var audioSource = audioRail._audioTransform.GetComponent<OWAudioSource>();
|
||||||
audioSource.playOnAwake = true;
|
audioSource.playOnAwake = true;
|
||||||
|
|
||||||
var scale = info.height == 0 ? 1 : info.height / 10f;
|
var scale = info.height == 0 ? 1 : info.height / 10f;
|
||||||
tornadoGO.transform.localScale = Vector3.one * scale;
|
tornadoGO.transform.localScale = Vector3.one * scale;
|
||||||
|
|
||||||
// Resize the distance it can be heard from to match roughly with the size
|
// Resize the distance it can be heard from to match roughly with the size
|
||||||
var maxDistance = info.audioDistance == 0 ? 10 * scale : info.audioDistance;
|
var maxDistance = info.audioDistance;
|
||||||
audioSource.maxDistance = maxDistance;
|
if (maxDistance <= 0) maxDistance = scale * 10f;
|
||||||
audioSource.minDistance = maxDistance / 10f;
|
Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() =>
|
||||||
|
{
|
||||||
|
audioSource.maxDistance = maxDistance;
|
||||||
|
audioSource.minDistance = maxDistance / 10f;
|
||||||
|
});
|
||||||
|
|
||||||
var controller = tornadoGO.GetComponent<TornadoController>();
|
var controller = tornadoGO.GetComponent<TornadoController>();
|
||||||
controller.SetSector(sector);
|
controller.SetSector(sector);
|
||||||
|
|||||||
@ -506,9 +506,9 @@ namespace NewHorizons.Builder.ShipLog
|
|||||||
{
|
{
|
||||||
Texture2D texture;
|
Texture2D texture;
|
||||||
|
|
||||||
if (body.Config.Star != null) texture = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/DefaultMapModeStar.png");
|
if (body.Config.Star != null) texture = ImageUtilities.GetTexture(Main.Instance, "Assets/DefaultMapModeStar.png");
|
||||||
else if (body.Config.Atmosphere != null) texture = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/DefaultMapModNoAtmo.png");
|
else if (body.Config.Atmosphere != null) texture = ImageUtilities.GetTexture(Main.Instance, "Assets/DefaultMapModNoAtmo.png");
|
||||||
else texture = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/DefaultMapModePlanet.png");
|
else texture = ImageUtilities.GetTexture(Main.Instance, "Assets/DefaultMapModePlanet.png");
|
||||||
|
|
||||||
var color = GetDominantPlanetColor(body);
|
var color = GetDominantPlanetColor(body);
|
||||||
var darkColor = new Color(color.r / 3f, color.g / 3f, color.b / 3f);
|
var darkColor = new Color(color.r / 3f, color.g / 3f, color.b / 3f);
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
namespace NewHorizons.Components
|
using NewHorizons.AchievementsPlus.NH;
|
||||||
|
|
||||||
|
namespace NewHorizons.Components
|
||||||
{
|
{
|
||||||
public class BlackHoleDestructionVolume : DestructionVolume
|
public class BlackHoleDestructionVolume : DestructionVolume
|
||||||
{
|
{
|
||||||
@ -14,6 +16,7 @@
|
|||||||
if (requiredComponent.IsLaunched())
|
if (requiredComponent.IsLaunched())
|
||||||
{
|
{
|
||||||
UnityEngine.Object.Destroy(requiredComponent.gameObject);
|
UnityEngine.Object.Destroy(requiredComponent.gameObject);
|
||||||
|
ProbeLostAchievement.Earn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -128,7 +128,7 @@ namespace NewHorizons.Components
|
|||||||
{
|
{
|
||||||
if (uniqueID.Equals("SolarSystem"))
|
if (uniqueID.Equals("SolarSystem"))
|
||||||
{
|
{
|
||||||
texture = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/hearthian system.png");
|
texture = ImageUtilities.GetTexture(Main.Instance, "Assets/hearthian system.png");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
7
NewHorizons/External/Configs/PlanetConfig.cs
vendored
@ -238,16 +238,17 @@ namespace NewHorizons.External.Configs
|
|||||||
Atmosphere.useAtmosphereShader = true;
|
Atmosphere.useAtmosphereShader = true;
|
||||||
|
|
||||||
// useBasicCloudShader is obsolete
|
// useBasicCloudShader is obsolete
|
||||||
if (Atmosphere.clouds != null && Atmosphere.clouds.useBasicCloudShader)
|
if (Atmosphere.clouds != null && Atmosphere.clouds.useBasicCloudShader)
|
||||||
Atmosphere.clouds.cloudsPrefab = CloudPrefabType.Basic;
|
Atmosphere.clouds.cloudsPrefab = CloudPrefabType.Basic;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Props?.tornados != null)
|
if (Props?.tornados != null)
|
||||||
foreach (var tornado in Props.tornados)
|
foreach (var tornado in Props.tornados)
|
||||||
if (tornado.downwards)
|
if (tornado.downwards)
|
||||||
tornado.type = PropModule.TornadoInfo.TornadoType.Downwards;
|
tornado.type = PropModule.TornadoInfo.TornadoType.Downwards;
|
||||||
|
|
||||||
|
if (Base.sphereOfInfluence != 0f) Base.soiOverride = Base.sphereOfInfluence;
|
||||||
|
|
||||||
|
|
||||||
// for each quantum group, verify the following:
|
// for each quantum group, verify the following:
|
||||||
// this group's id should be unique
|
// this group's id should be unique
|
||||||
// if type == sockets, group.sockets should not be null or empty
|
// if type == sockets, group.sockets should not be null or empty
|
||||||
|
|||||||
5
NewHorizons/External/Modules/BaseModule.cs
vendored
@ -69,7 +69,7 @@ namespace NewHorizons.External.Modules
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// An override for the radius of the planet's gravitational sphere of influence. Optional
|
/// An override for the radius of the planet's gravitational sphere of influence. Optional
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float sphereOfInfluence;
|
public float soiOverride;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The acceleration due to gravity felt as the surfaceSize. Timber Hearth has 12 for reference
|
/// The acceleration due to gravity felt as the surfaceSize. Timber Hearth has 12 for reference
|
||||||
@ -112,6 +112,9 @@ namespace NewHorizons.External.Modules
|
|||||||
[Obsolete("CloakRadius is deprecated, please use CloakModule instead")]
|
[Obsolete("CloakRadius is deprecated, please use CloakModule instead")]
|
||||||
public float cloakRadius;
|
public float cloakRadius;
|
||||||
|
|
||||||
|
[Obsolete("SphereOfInfluence is deprecated, please use soiOverride instead")]
|
||||||
|
public float sphereOfInfluence;
|
||||||
|
|
||||||
#endregion Obsolete
|
#endregion Obsolete
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
4
NewHorizons/External/Modules/PropModule.cs
vendored
@ -81,7 +81,7 @@ namespace NewHorizons.External.Modules
|
|||||||
public class ScatterInfo
|
public class ScatterInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Relative filepath to an asset-bundle"
|
/// Relative filepath to an asset-bundle
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string assetBundle;
|
public string assetBundle;
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ namespace NewHorizons.External.Modules
|
|||||||
public bool alignToNormal;
|
public bool alignToNormal;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Relative filepath to an asset-bundle to load the prefab defined in `path` from/
|
/// Relative filepath to an asset-bundle to load the prefab defined in `path` from
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string assetBundle;
|
public string assetBundle;
|
||||||
|
|
||||||
|
|||||||
@ -16,7 +16,7 @@ namespace NewHorizons.External.Modules
|
|||||||
public bool hideInMap;
|
public bool hideInMap;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Radius of the brackets that show up when you target this. Defaults to the sphereOfInfluence.
|
/// Radius of the brackets that show up when you target this. Defaults to the sphere of influence.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DefaultValue(-1)] public float bracketRadius = -1;
|
[DefaultValue(-1)] public float bracketRadius = -1;
|
||||||
|
|
||||||
@ -26,8 +26,13 @@ namespace NewHorizons.External.Modules
|
|||||||
public bool targetWhenClose;
|
public bool targetWhenClose;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The maximum distance that the reference frame can be targeted from. Defaults to double the sphereOfInfluence.
|
/// The maximum distance that the reference frame can be targeted from. Defaults to 100km and cannot be greater than that.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DefaultValue(-1)] public float maxTargetDistance = -1;
|
public float maxTargetDistance; // If it's less than or equal to zero the game makes it 100km
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The radius of the sphere around the planet which you can click on to target it. Defaults to twice the sphere of influence.
|
||||||
|
/// </summary>
|
||||||
|
public float targetColliderRadius;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -365,7 +365,7 @@ namespace NewHorizons.Handlers
|
|||||||
{
|
{
|
||||||
var atmoSize = body.Config.Atmosphere != null ? body.Config.Atmosphere.size : 0f;
|
var atmoSize = body.Config.Atmosphere != null ? body.Config.Atmosphere.size : 0f;
|
||||||
float sphereOfInfluence = Mathf.Max(Mathf.Max(atmoSize, 50), body.Config.Base.surfaceSize * 2f);
|
float sphereOfInfluence = Mathf.Max(Mathf.Max(atmoSize, 50), body.Config.Base.surfaceSize * 2f);
|
||||||
var overrideSOI = body.Config.Base.sphereOfInfluence;
|
var overrideSOI = body.Config.Base.soiOverride;
|
||||||
if (overrideSOI != 0) sphereOfInfluence = overrideSOI;
|
if (overrideSOI != 0) sphereOfInfluence = overrideSOI;
|
||||||
return sphereOfInfluence;
|
return sphereOfInfluence;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@ using NewHorizons.Builder.StarSystem;
|
|||||||
using NewHorizons.Components;
|
using NewHorizons.Components;
|
||||||
using NewHorizons.Utility;
|
using NewHorizons.Utility;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using Logger = NewHorizons.Utility.Logger;
|
||||||
using Object = UnityEngine.Object;
|
using Object = UnityEngine.Object;
|
||||||
namespace NewHorizons.Handlers
|
namespace NewHorizons.Handlers
|
||||||
{
|
{
|
||||||
@ -28,27 +29,40 @@ namespace NewHorizons.Handlers
|
|||||||
}
|
}
|
||||||
|
|
||||||
AudioClip clip = null;
|
AudioClip clip = null;
|
||||||
if (system.Config.travelAudioClip != null) clip = SearchUtilities.FindResourceOfTypeAndName<AudioClip>(system.Config.travelAudioClip);
|
if (!string.IsNullOrEmpty(system.Config.travelAudioClip))
|
||||||
else if (system.Config.travelAudioFilePath != null)
|
{
|
||||||
|
clip = SearchUtilities.FindResourceOfTypeAndName<AudioClip>(system.Config.travelAudioClip);
|
||||||
|
|
||||||
|
if (clip == null)
|
||||||
|
{
|
||||||
|
Logger.LogError($"Couldn't get audio from clip [{system.Config.travelAudioClip}]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(system.Config.travelAudioFilePath))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
clip = AudioUtilities.LoadAudio(system.Mod.ModHelper.Manifest.ModFolderPath + "/" + system.Config.travelAudioFilePath);
|
clip = AudioUtilities.LoadAudio(system.Mod.ModHelper.Manifest.ModFolderPath + "/" + system.Config.travelAudioFilePath);
|
||||||
}
|
}
|
||||||
catch (System.Exception e)
|
catch { }
|
||||||
|
|
||||||
|
if (clip == null)
|
||||||
{
|
{
|
||||||
Utility.Logger.LogError($"Couldn't load audio file {system.Config.travelAudioFilePath} : {e.Message}");
|
Logger.LogError($"Couldn't get audio from file [{system.Config.travelAudioFilePath}]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clip != null)
|
if (clip != null)
|
||||||
{
|
{
|
||||||
var travelSource = Locator.GetGlobalMusicController()._travelSource;
|
Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() =>
|
||||||
travelSource._audioLibraryClip = AudioType.None;
|
{
|
||||||
travelSource._clipArrayIndex = 0;
|
var travelSource = Locator.GetGlobalMusicController()._travelSource;
|
||||||
travelSource._clipArrayLength = 0;
|
travelSource._audioLibraryClip = AudioType.None;
|
||||||
travelSource._clipSelectionOnPlay = OWAudioSource.ClipSelectionOnPlay.MANUAL;
|
travelSource._clipArrayIndex = 0;
|
||||||
travelSource.clip = clip;
|
travelSource._clipArrayLength = 0;
|
||||||
|
travelSource._clipSelectionOnPlay = OWAudioSource.ClipSelectionOnPlay.MANUAL;
|
||||||
|
travelSource.clip = clip;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
NewHorizons/Icons/New Horizons.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
@ -47,11 +47,12 @@ namespace NewHorizons
|
|||||||
public bool IsWarping { get; private set; } = false;
|
public bool IsWarping { get; private set; } = false;
|
||||||
public bool WearingSuit { get; private set; } = false;
|
public bool WearingSuit { get; private set; } = false;
|
||||||
|
|
||||||
|
public bool IsChangingStarSystem { get; private set; } = false;
|
||||||
|
|
||||||
public static bool HasWarpDrive { get; private set; } = false;
|
public static bool HasWarpDrive { get; private set; } = false;
|
||||||
|
|
||||||
private string _defaultStarSystem = "SolarSystem";
|
private string _defaultStarSystem = "SolarSystem";
|
||||||
private string _currentStarSystem = "SolarSystem";
|
private string _currentStarSystem = "SolarSystem";
|
||||||
private bool _isChangingStarSystem = false;
|
|
||||||
private bool _firstLoad = true;
|
private bool _firstLoad = true;
|
||||||
private ShipWarpController _shipWarpController;
|
private ShipWarpController _shipWarpController;
|
||||||
|
|
||||||
@ -130,8 +131,9 @@ namespace NewHorizons
|
|||||||
|
|
||||||
Instance = this;
|
Instance = this;
|
||||||
GlobalMessenger<DeathType>.AddListener("PlayerDeath", OnDeath);
|
GlobalMessenger<DeathType>.AddListener("PlayerDeath", OnDeath);
|
||||||
|
|
||||||
GlobalMessenger.AddListener("WakeUp", OnWakeUp);
|
GlobalMessenger.AddListener("WakeUp", OnWakeUp);
|
||||||
NHAssetBundle = ModHelper.Assets.LoadBundle("AssetBundle/xen.newhorizons");
|
NHAssetBundle = ModHelper.Assets.LoadBundle("Assets/xen.newhorizons");
|
||||||
|
|
||||||
ResetConfigs(resetTranslation: false);
|
ResetConfigs(resetTranslation: false);
|
||||||
|
|
||||||
@ -149,6 +151,8 @@ namespace NewHorizons
|
|||||||
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => OnSceneLoaded(SceneManager.GetActiveScene(), LoadSceneMode.Single));
|
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => OnSceneLoaded(SceneManager.GetActiveScene(), LoadSceneMode.Single));
|
||||||
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => _firstLoad = false);
|
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => _firstLoad = false);
|
||||||
Instance.ModHelper.Menus.PauseMenu.OnInit += DebugReload.InitializePauseMenu;
|
Instance.ModHelper.Menus.PauseMenu.OnInit += DebugReload.InitializePauseMenu;
|
||||||
|
|
||||||
|
AchievementsPlus.AchievementHandler.Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnDestroy()
|
public void OnDestroy()
|
||||||
@ -186,7 +190,7 @@ namespace NewHorizons
|
|||||||
Logger.Log($"Scene Loaded: {scene.name} {mode}");
|
Logger.Log($"Scene Loaded: {scene.name} {mode}");
|
||||||
|
|
||||||
// Set time loop stuff if its enabled and if we're warping to a new place
|
// Set time loop stuff if its enabled and if we're warping to a new place
|
||||||
if (_isChangingStarSystem && (SystemDict[_currentStarSystem].Config.enableTimeLoop || _currentStarSystem == "SolarSystem") && SecondsLeftInLoop > 0f)
|
if (IsChangingStarSystem && (SystemDict[_currentStarSystem].Config.enableTimeLoop || _currentStarSystem == "SolarSystem") && SecondsLeftInLoop > 0f)
|
||||||
{
|
{
|
||||||
TimeLoop.SetSecondsRemaining(SecondsLeftInLoop);
|
TimeLoop.SetSecondsRemaining(SecondsLeftInLoop);
|
||||||
// Prevent the OPC from firing
|
// Prevent the OPC from firing
|
||||||
@ -207,7 +211,7 @@ namespace NewHorizons
|
|||||||
// Reset this
|
// Reset this
|
||||||
SecondsLeftInLoop = -1;
|
SecondsLeftInLoop = -1;
|
||||||
|
|
||||||
_isChangingStarSystem = false;
|
IsChangingStarSystem = false;
|
||||||
|
|
||||||
if (scene.name == "TitleScreen" && _useCustomTitleScreen)
|
if (scene.name == "TitleScreen" && _useCustomTitleScreen)
|
||||||
{
|
{
|
||||||
@ -243,7 +247,7 @@ namespace NewHorizons
|
|||||||
OWAssetHandler.Init();
|
OWAssetHandler.Init();
|
||||||
PlanetCreationHandler.Init(BodyDict[CurrentStarSystem]);
|
PlanetCreationHandler.Init(BodyDict[CurrentStarSystem]);
|
||||||
SystemCreationHandler.LoadSystem(SystemDict[CurrentStarSystem]);
|
SystemCreationHandler.LoadSystem(SystemDict[CurrentStarSystem]);
|
||||||
LoadTranslations(ModHelper.Manifest.ModFolderPath + "AssetBundle/", this);
|
LoadTranslations(ModHelper.Manifest.ModFolderPath + "Assets/", this);
|
||||||
|
|
||||||
// Warp drive
|
// Warp drive
|
||||||
StarChartHandler.Init(SystemDict.Values.ToArray());
|
StarChartHandler.Init(SystemDict.Values.ToArray());
|
||||||
@ -295,7 +299,7 @@ namespace NewHorizons
|
|||||||
public void EnableWarpDrive()
|
public void EnableWarpDrive()
|
||||||
{
|
{
|
||||||
Logger.Log("Setting up warp drive");
|
Logger.Log("Setting up warp drive");
|
||||||
PlanetCreationHandler.LoadBody(LoadConfig(this, "AssetBundle/WarpDriveConfig.json"));
|
PlanetCreationHandler.LoadBody(LoadConfig(this, "Assets/WarpDriveConfig.json"));
|
||||||
HasWarpDrive = true;
|
HasWarpDrive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,14 +436,14 @@ namespace NewHorizons
|
|||||||
#region Change star system
|
#region Change star system
|
||||||
public void ChangeCurrentStarSystem(string newStarSystem, bool warp = false)
|
public void ChangeCurrentStarSystem(string newStarSystem, bool warp = false)
|
||||||
{
|
{
|
||||||
if (_isChangingStarSystem) return;
|
if (IsChangingStarSystem) return;
|
||||||
|
|
||||||
|
IsWarping = warp;
|
||||||
OnChangeStarSystem?.Invoke(newStarSystem);
|
OnChangeStarSystem?.Invoke(newStarSystem);
|
||||||
|
|
||||||
Logger.Log($"Warping to {newStarSystem}");
|
Logger.Log($"Warping to {newStarSystem}");
|
||||||
if (warp && _shipWarpController) _shipWarpController.WarpOut();
|
if (warp && _shipWarpController) _shipWarpController.WarpOut();
|
||||||
_isChangingStarSystem = true;
|
IsChangingStarSystem = true;
|
||||||
IsWarping = warp;
|
|
||||||
WearingSuit = PlayerState.IsWearingSuit();
|
WearingSuit = PlayerState.IsWearingSuit();
|
||||||
|
|
||||||
// We kill them so they don't move as much
|
// We kill them so they don't move as much
|
||||||
@ -468,7 +472,7 @@ namespace NewHorizons
|
|||||||
void OnDeath(DeathType _)
|
void OnDeath(DeathType _)
|
||||||
{
|
{
|
||||||
// We reset the solar system on death (unless we just killed the player)
|
// We reset the solar system on death (unless we just killed the player)
|
||||||
if (!_isChangingStarSystem)
|
if (!IsChangingStarSystem)
|
||||||
{
|
{
|
||||||
// If the override is a valid system then we go there
|
// If the override is a valid system then we go there
|
||||||
if (SystemDict.Keys.Contains(_defaultSystemOverride))
|
if (SystemDict.Keys.Contains(_defaultSystemOverride))
|
||||||
|
|||||||
@ -16,7 +16,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="HarmonyX" Version="2.10.0" />
|
<PackageReference Include="HarmonyX" Version="2.10.0" />
|
||||||
<PackageReference Include="OWML" Version="2.3.3" />
|
<PackageReference Include="OWML" Version="2.5.2" />
|
||||||
<PackageReference Include="OuterWildsGameLibs" Version="1.1.12.168" />
|
<PackageReference Include="OuterWildsGameLibs" Version="1.1.12.168" />
|
||||||
<Reference Include="../Lib/System.ComponentModel.Annotations.dll" />
|
<Reference Include="../Lib/System.ComponentModel.Annotations.dll" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@ -30,7 +30,10 @@
|
|||||||
<None Include="manifest.json">
|
<None Include="manifest.json">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
<None Include="AssetBundle\**">
|
<None Include="Assets\**">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="Icons\**">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
|
using NewHorizons.AchievementsPlus.NH;
|
||||||
using NewHorizons.Builder.Props;
|
using NewHorizons.Builder.Props;
|
||||||
using NewHorizons.External;
|
using NewHorizons.External;
|
||||||
using NewHorizons.Handlers;
|
using NewHorizons.Handlers;
|
||||||
@ -31,6 +32,7 @@ namespace NewHorizons.Patches
|
|||||||
if (freqString != null && freqString != "")
|
if (freqString != null && freqString != "")
|
||||||
{
|
{
|
||||||
NewHorizonsData.LearnFrequency(freqString);
|
NewHorizonsData.LearnFrequency(freqString);
|
||||||
|
NewFrequencyAchievement.Earn();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
using NewHorizons.Components;
|
using NewHorizons.Components;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
namespace NewHorizons.Patches
|
namespace NewHorizons.Patches
|
||||||
@ -104,14 +104,5 @@ namespace NewHorizons.Patches
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For debugging
|
|
||||||
[HarmonyPrefix]
|
|
||||||
[HarmonyPatch(typeof(FluidDetector), nameof(FluidDetector.AddVolume), new Type[] { typeof(EffectVolume) })]
|
|
||||||
public static void FluidDetector_AddVolume(FluidDetector __instance, EffectVolume eVol)
|
|
||||||
{
|
|
||||||
Logger.Log($"[{__instance}] : AddVolume [{eVol}]");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -436,7 +436,7 @@
|
|||||||
"description": "Do we show the minimap when walking around this planet?",
|
"description": "Do we show the minimap when walking around this planet?",
|
||||||
"default": true
|
"default": true
|
||||||
},
|
},
|
||||||
"sphereOfInfluence": {
|
"soiOverride": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"description": "An override for the radius of the planet's gravitational sphere of influence. Optional",
|
"description": "An override for the radius of the planet's gravitational sphere of influence. Optional",
|
||||||
"format": "float"
|
"format": "float"
|
||||||
@ -821,7 +821,7 @@
|
|||||||
},
|
},
|
||||||
"assetBundle": {
|
"assetBundle": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "Relative filepath to an asset-bundle to load the prefab defined in `path` from/"
|
"description": "Relative filepath to an asset-bundle to load the prefab defined in `path` from"
|
||||||
},
|
},
|
||||||
"path": {
|
"path": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@ -1096,7 +1096,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"assetBundle": {
|
"assetBundle": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "Relative filepath to an asset-bundle\""
|
"description": "Relative filepath to an asset-bundle"
|
||||||
},
|
},
|
||||||
"count": {
|
"count": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
@ -1354,7 +1354,7 @@
|
|||||||
},
|
},
|
||||||
"bracketRadius": {
|
"bracketRadius": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"description": "Radius of the brackets that show up when you target this. Defaults to the sphereOfInfluence.",
|
"description": "Radius of the brackets that show up when you target this. Defaults to the sphere of influence.",
|
||||||
"format": "float",
|
"format": "float",
|
||||||
"default": -1
|
"default": -1
|
||||||
},
|
},
|
||||||
@ -1364,9 +1364,13 @@
|
|||||||
},
|
},
|
||||||
"maxTargetDistance": {
|
"maxTargetDistance": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"description": "The maximum distance that the reference frame can be targeted from. Defaults to double the sphereOfInfluence.",
|
"description": "The maximum distance that the reference frame can be targeted from. Defaults to 100km and cannot be greater than that.",
|
||||||
"format": "float",
|
"format": "float"
|
||||||
"default": -1
|
},
|
||||||
|
"targetColliderRadius": {
|
||||||
|
"type": "number",
|
||||||
|
"description": "The radius of the sphere around the planet which you can click on to target it. Defaults to twice the sphere of influence.",
|
||||||
|
"format": "float"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
"author": "xen, Bwc9876, & Book",
|
"author": "xen, Bwc9876, & Book",
|
||||||
"name": "New Horizons",
|
"name": "New Horizons",
|
||||||
"uniqueName": "xen.NewHorizons",
|
"uniqueName": "xen.NewHorizons",
|
||||||
"version": "1.2.5",
|
"version": "1.3.0",
|
||||||
"owmlVersion": "2.3.3",
|
"owmlVersion": "2.3.3",
|
||||||
"conflicts": [ "Raicuparta.QuantumSpaceBuddies", "Vesper.AutoResume", "PacificEngine.OW_Randomizer" ],
|
"conflicts": [ "Raicuparta.QuantumSpaceBuddies", "Vesper.AutoResume", "PacificEngine.OW_Randomizer" ],
|
||||||
"pathsToPreserve": [ "planets", "systems", "translations" ]
|
"pathsToPreserve": [ "planets", "systems", "translations" ]
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
<PackageReference Include="NJsonSchema" Version="10.7.1" />
|
<PackageReference Include="NJsonSchema" Version="10.7.2" />
|
||||||
<PackageReference Include="OuterWildsGameLibs" Version="1.1.12.168" IncludeAssets="compile" />
|
<PackageReference Include="OuterWildsGameLibs" Version="1.1.12.168" IncludeAssets="compile" />
|
||||||
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
|
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
58
docs/Pipfile.lock
generated
@ -30,7 +30,7 @@
|
|||||||
"sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30",
|
"sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30",
|
||||||
"sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"
|
"sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_full_version >= '3.6.0'",
|
||||||
"version": "==4.11.1"
|
"version": "==4.11.1"
|
||||||
},
|
},
|
||||||
"certifi": {
|
"certifi": {
|
||||||
@ -38,7 +38,7 @@
|
|||||||
"sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7",
|
"sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7",
|
||||||
"sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"
|
"sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_full_version >= '3.6.0'",
|
||||||
"version": "==2022.5.18.1"
|
"version": "==2022.5.18.1"
|
||||||
},
|
},
|
||||||
"charset-normalizer": {
|
"charset-normalizer": {
|
||||||
@ -46,7 +46,7 @@
|
|||||||
"sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597",
|
"sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597",
|
||||||
"sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"
|
"sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3'",
|
"markers": "python_version >= '3.5'",
|
||||||
"version": "==2.0.12"
|
"version": "==2.0.12"
|
||||||
},
|
},
|
||||||
"click": {
|
"click": {
|
||||||
@ -70,16 +70,16 @@
|
|||||||
"sha256:bc285b5f892094c3a53d558858a88553dd6a61a11ab1a8128a0e554385dcc5dd",
|
"sha256:bc285b5f892094c3a53d558858a88553dd6a61a11ab1a8128a0e554385dcc5dd",
|
||||||
"sha256:c2c11bc8214fbf709ffc369d11446ff6945254a7f09128154a7620613d8fda90"
|
"sha256:c2c11bc8214fbf709ffc369d11446ff6945254a7f09128154a7620613d8fda90"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_full_version >= '3.6.0'",
|
||||||
"version": "==0.5.7"
|
"version": "==0.5.7"
|
||||||
},
|
},
|
||||||
"elementpath": {
|
"elementpath": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:07f2a34bac7a2a909d745da1cb3c7b8cd43ca1d7d1134546db41ffb997bcb11c",
|
"sha256:5ef1d51e8daa670f007914ff0f78ca7b2ecaa47e0ea0c5c699a29e6bc5f50385",
|
||||||
"sha256:25368810a76a5d9e464c0e721a12645409fc8c113ffde9e01d88557b4a7663d3"
|
"sha256:b8aeb6f27dddc10fb9201b62090628a846cbae8577f3544cb1075fa38d0817f6"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==2.5.2"
|
"version": "==2.5.3"
|
||||||
},
|
},
|
||||||
"htmlmin": {
|
"htmlmin": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@ -92,7 +92,7 @@
|
|||||||
"sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
|
"sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
|
||||||
"sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
|
"sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3'",
|
"markers": "python_version >= '3.5'",
|
||||||
"version": "==3.3"
|
"version": "==3.3"
|
||||||
},
|
},
|
||||||
"jinja2": {
|
"jinja2": {
|
||||||
@ -120,11 +120,11 @@
|
|||||||
},
|
},
|
||||||
"jsonschema": {
|
"jsonschema": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:71b5e39324422543546572954ce71c67728922c104902cb7ce252e522235b33f",
|
"sha256:1c92d2db1900b668201f1797887d66453ab1fbfea51df8e4b46236689c427baf",
|
||||||
"sha256:7c6d882619340c3347a1bf7315e147e6d3dae439033ae6383d6acb908c101dfc"
|
"sha256:9d6397ba4a6c0bf0300736057f649e3e12ecbc07d3e81a0dacb72de4e9801957"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==4.5.1"
|
"version": "==4.6.0"
|
||||||
},
|
},
|
||||||
"libsass": {
|
"libsass": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@ -146,7 +146,7 @@
|
|||||||
"sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874",
|
"sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874",
|
||||||
"sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"
|
"sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_full_version >= '3.6.0'",
|
||||||
"version": "==3.3.7"
|
"version": "==3.3.7"
|
||||||
},
|
},
|
||||||
"markdown2": {
|
"markdown2": {
|
||||||
@ -205,11 +205,11 @@
|
|||||||
},
|
},
|
||||||
"marshmallow": {
|
"marshmallow": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:2aaaab4f01ef4f5a011a21319af9fce17ab13bf28a026d1252adab0e035648d5",
|
"sha256:53a1e0ee69f79e1f3e80d17393b25cfc917eda52f859e8183b4af72c3390c1f1",
|
||||||
"sha256:ff79885ed43b579782f48c251d262e062bce49c65c52412458769a4fb57ac30f"
|
"sha256:a762c1d8b2bcb0e5c8e964850d03f9f3bffd6a12b626f3c14b9d6b1841999af5"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==3.15.0"
|
"version": "==3.16.0"
|
||||||
},
|
},
|
||||||
"marshmallow-enum": {
|
"marshmallow-enum": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@ -220,11 +220,11 @@
|
|||||||
},
|
},
|
||||||
"menagerie-docs": {
|
"menagerie-docs": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:5f02204f4c8a6a3eee947ee4c91266159b567fd8e22d69be43531ef2e4a99f6a",
|
"sha256:689f21de2b7c5b87457d7081e549ada2e5fcc39437b13f8e2158ac5be9864757",
|
||||||
"sha256:ad69a97a65a73ad3f2be0f28638b74d1a6af68a5ce00c7b9726a9e0e89bb3d82"
|
"sha256:a6375d949f53f2fd918efb11bbea6ecd3fa1913a2610be417511db62361d775f"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==0.1.8"
|
"version": "==0.1.9"
|
||||||
},
|
},
|
||||||
"mypy-extensions": {
|
"mypy-extensions": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@ -246,7 +246,7 @@
|
|||||||
"sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
|
"sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
|
||||||
"sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
|
"sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_full_version >= '3.6.0'",
|
||||||
"version": "==21.3"
|
"version": "==21.3"
|
||||||
},
|
},
|
||||||
"pillow": {
|
"pillow": {
|
||||||
@ -298,7 +298,7 @@
|
|||||||
"sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb",
|
"sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb",
|
||||||
"sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"
|
"sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_full_version >= '3.6.0'",
|
||||||
"version": "==2.12.0"
|
"version": "==2.12.0"
|
||||||
},
|
},
|
||||||
"pyparsing": {
|
"pyparsing": {
|
||||||
@ -379,7 +379,7 @@
|
|||||||
"sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174",
|
"sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174",
|
||||||
"sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"
|
"sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_full_version >= '3.6.0'",
|
||||||
"version": "==6.0"
|
"version": "==6.0"
|
||||||
},
|
},
|
||||||
"rcssmin": {
|
"rcssmin": {
|
||||||
@ -409,11 +409,11 @@
|
|||||||
},
|
},
|
||||||
"requests": {
|
"requests": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61",
|
"sha256:bc7861137fbce630f17b03d3ad02ad0bf978c844f3536d0edda6499dafce2b6f",
|
||||||
"sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"
|
"sha256:d568723a7ebd25875d8d1eaf5dfa068cd2fc8194b2e483d7b1f7c81918dbec6b"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
|
"markers": "python_version >= '3.7' and python_version < '4.0'",
|
||||||
"version": "==2.27.1"
|
"version": "==2.28.0"
|
||||||
},
|
},
|
||||||
"rjsmin": {
|
"rjsmin": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@ -453,7 +453,7 @@
|
|||||||
"sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759",
|
"sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759",
|
||||||
"sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"
|
"sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_full_version >= '3.6.0'",
|
||||||
"version": "==2.3.2.post1"
|
"version": "==2.3.2.post1"
|
||||||
},
|
},
|
||||||
"typing-extensions": {
|
"typing-extensions": {
|
||||||
@ -482,11 +482,11 @@
|
|||||||
},
|
},
|
||||||
"xmlschema": {
|
"xmlschema": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:319f5e3e77beb6ab3b4166f699d9dafd59141487bd1a07675fd01af6483211a4",
|
"sha256:0706c84de20686c940fa07e2b88425cff1471c89544a49e9365b9636236ccd2f",
|
||||||
"sha256:8ed246d97e7ab0393cf435ca98c8da6a0d2ab2f4e81949e149d8b2c97ec89357"
|
"sha256:e6f8d1d44f8d95d8693698154d57c4a0557825483ccbedaca78eca2cd98ba6e7"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==1.11.0"
|
"version": "==1.11.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,7 @@ public interface INewHorizons
|
|||||||
|
|
||||||
UnityEvent<string> GetStarSystemLoadedEvent();
|
UnityEvent<string> GetStarSystemLoadedEvent();
|
||||||
|
|
||||||
GameObject SpawnObject(GameObject planet, Sector sector, string propToCopyPath, Vector3 position, Vector3 eulerAngles, float scale, bool alignWithNormal)
|
GameObject SpawnObject(GameObject planet, Sector sector, string propToCopyPath, Vector3 position, Vector3 eulerAngles, float scale, bool alignWithNormal);
|
||||||
|
|
||||||
string[] GetInstalledAddons();
|
string[] GetInstalledAddons();
|
||||||
}
|
}
|
||||||
|
|||||||