* Update PropModule.cs

* Debugging FluidDetector AddVolume

* Catch exceptions if they don't have the DLC

* Update PropBuildManager.cs

* Added the ability to make custom sky boxes

* Move config reset to `ResetConfigs` in Main.cs

* Bump version

Co-authored-by: Nick <nicholasconnors@hotmail.ca>
This commit is contained in:
Ben C 2022-05-06 22:46:21 -04:00 committed by GitHub
parent e3070b2b20
commit e19e486f9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 257 additions and 71 deletions

View File

@ -50,7 +50,6 @@ namespace NewHorizons.Builder.Props
_ghostArcPrefabs = new List<GameObject>(); _ghostArcPrefabs = new List<GameObject>();
foreach (var existingArc in existingGhostArcs) foreach (var existingArc in existingGhostArcs)
{ {
Logger.Log("Found ghost");
var arc = existingArc.InstantiateInactive(); var arc = existingArc.InstantiateInactive();
arc.name = "Arc"; arc.name = "Arc";
_ghostArcPrefabs.Add(arc); _ghostArcPrefabs.Add(arc);
@ -313,7 +312,7 @@ namespace NewHorizons.Builder.Props
{ {
arc = _childArcPrefabs[Random.Range(0, _childArcPrefabs.Count())].InstantiateInactive(); arc = _childArcPrefabs[Random.Range(0, _childArcPrefabs.Count())].InstantiateInactive();
} }
else if(type == "stranger") else if(type == "stranger" && _ghostArcPrefabs.Count() > 0) // It could be empty if they dont have the DLC
{ {
arc = _ghostArcPrefabs[Random.Range(0, _ghostArcPrefabs.Count())].InstantiateInactive(); arc = _ghostArcPrefabs[Random.Range(0, _ghostArcPrefabs.Count())].InstantiateInactive();
} }

View File

@ -28,7 +28,12 @@ namespace NewHorizons.Builder.Props
{ {
if (_slideReelPrefab == null) if (_slideReelPrefab == null)
{ {
_slideReelPrefab = GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone1/Sector_SlideBurningRoom_Zone1/Interactables_SlideBurningRoom_Zone1/Prefab_IP_SecretAlcove/RotationPivot/SlideReelSocket/Prefab_IP_Reel_1_LibraryPath").gameObject.InstantiateInactive(); _slideReelPrefab = GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone1/Sector_SlideBurningRoom_Zone1/Interactables_SlideBurningRoom_Zone1/Prefab_IP_SecretAlcove/RotationPivot/SlideReelSocket/Prefab_IP_Reel_1_LibraryPath")?.gameObject?.InstantiateInactive();
if (_slideReelPrefab == null)
{
Logger.LogWarning($"Tried to make a slide reel but couldn't. Do you have the DLC installed?");
return;
}
_slideReelPrefab.name = "Prefab_IP_Reel"; _slideReelPrefab.name = "Prefab_IP_Reel";
} }
@ -101,7 +106,12 @@ namespace NewHorizons.Builder.Props
{ {
if (_autoPrefab == null) if (_autoPrefab == null)
{ {
_autoPrefab = GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone4/Sector_BlightedShore/Sector_JammingControlRoom_Zone4/Interactables_JammingControlRoom_Zone4/AutoProjector_SignalJammer/Prefab_IP_AutoProjector_SignalJammer").gameObject.InstantiateInactive(); _autoPrefab = GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone4/Sector_BlightedShore/Sector_JammingControlRoom_Zone4/Interactables_JammingControlRoom_Zone4/AutoProjector_SignalJammer/Prefab_IP_AutoProjector_SignalJammer")?.gameObject?.InstantiateInactive();
if (_autoPrefab == null)
{
Logger.LogWarning($"Tried to make a auto projector but couldn't. Do you have the DLC installed?");
return;
}
_autoPrefab.name = "Prefab_IP_AutoProjector"; _autoPrefab.name = "Prefab_IP_AutoProjector";
} }

View File

@ -21,79 +21,157 @@ namespace NewHorizons.Builder.Props
public static void Make(GameObject go, Sector sector, OWRigidbody planetBody, IPlanetConfig config, IModBehaviour mod, string uniqueModName) public static void Make(GameObject go, Sector sector, OWRigidbody planetBody, IPlanetConfig config, IModBehaviour mod, string uniqueModName)
{ {
if (config.Props.Scatter != null) if (config.Props.Scatter != null)
{
try
{ {
ScatterBuilder.Make(go, sector, config, mod, uniqueModName); ScatterBuilder.Make(go, sector, config, mod, uniqueModName);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make planet scatter for [{go.name}] : {ex.Message}, {ex.StackTrace}");
}
}
if (config.Props.Details != null) if (config.Props.Details != null)
{ {
foreach (var detail in config.Props.Details) foreach (var detail in config.Props.Details)
{
try
{ {
DetailBuilder.Make(go, sector, config, mod, uniqueModName, detail); DetailBuilder.Make(go, sector, config, mod, uniqueModName, detail);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make planet detail [{detail.path}] for [{go.name}] : {ex.Message}, {ex.StackTrace}");
}
}
} }
if (config.Props.Geysers != null) if (config.Props.Geysers != null)
{ {
foreach (var geyserInfo in config.Props.Geysers) foreach (var geyserInfo in config.Props.Geysers)
{
try
{ {
GeyserBuilder.Make(go, sector, geyserInfo); GeyserBuilder.Make(go, sector, geyserInfo);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make geyser for [{go.name}] : {ex.Message}, {ex.StackTrace}");
} }
if(config.Props.Rafts != null) }
}
if (Main.HasDLC && config.Props.Rafts != null)
{ {
foreach (var raftInfo in config.Props.Rafts) foreach (var raftInfo in config.Props.Rafts)
{
try
{ {
RaftBuilder.Make(go, sector, raftInfo, planetBody); RaftBuilder.Make(go, sector, raftInfo, planetBody);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make raft for [{go.name}] : {ex.Message}, {ex.StackTrace}");
}
}
} }
if (config.Props.Tornados != null) if (config.Props.Tornados != null)
{ {
foreach (var tornadoInfo in config.Props.Tornados) foreach (var tornadoInfo in config.Props.Tornados)
{
try
{ {
TornadoBuilder.Make(go, sector, tornadoInfo, config.Atmosphere?.Cloud != null); TornadoBuilder.Make(go, sector, tornadoInfo, config.Atmosphere?.Cloud != null);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make tornado for [{go.name}] : {ex.Message}, {ex.StackTrace}");
}
}
} }
if (config.Props.Volcanoes != null) if (config.Props.Volcanoes != null)
{ {
foreach (var volcanoInfo in config.Props.Volcanoes) foreach (var volcanoInfo in config.Props.Volcanoes)
{
try
{ {
VolcanoBuilder.Make(go, sector, volcanoInfo); VolcanoBuilder.Make(go, sector, volcanoInfo);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make volcano for [{go.name}] : {ex.Message}, {ex.StackTrace}");
}
}
} }
// Reminder that dialogue has to be built after props if they're going to be using CharacterAnimController stuff // Reminder that dialogue has to be built after props if they're going to be using CharacterAnimController stuff
if (config.Props.Dialogue != null) if (config.Props.Dialogue != null)
{ {
foreach (var dialogueInfo in config.Props.Dialogue) foreach (var dialogueInfo in config.Props.Dialogue)
{
try
{ {
DialogueBuilder.Make(go, sector, dialogueInfo, mod); DialogueBuilder.Make(go, sector, dialogueInfo, mod);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make dialogue [{dialogueInfo.xmlFile}] for [{go.name}] : {ex.Message}, {ex.StackTrace}");
}
}
} }
if (config.Props.Reveal != null) if (config.Props.Reveal != null)
{ {
foreach (var revealInfo in config.Props.Reveal) foreach (var revealInfo in config.Props.Reveal)
{
try
{ {
RevealBuilder.Make(go, sector, revealInfo, mod); RevealBuilder.Make(go, sector, revealInfo, mod);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make reveal location [{revealInfo.reveals}] for [{go.name}] : {ex.Message}, {ex.StackTrace}");
}
}
} }
if (config.Props.EntryLocation != null) if (config.Props.EntryLocation != null)
{ {
foreach (var entryLocationInfo in config.Props.EntryLocation) foreach (var entryLocationInfo in config.Props.EntryLocation)
{
try
{ {
EntryLocationBuilder.Make(go, sector, entryLocationInfo, mod); EntryLocationBuilder.Make(go, sector, entryLocationInfo, mod);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make entry location [{entryLocationInfo.id}] for [{go.name}] : {ex.Message}, {ex.StackTrace}");
}
}
} }
if (config.Props.NomaiText != null) if (config.Props.NomaiText != null)
{ {
foreach (var nomaiTextInfo in config.Props.NomaiText) foreach (var nomaiTextInfo in config.Props.NomaiText)
{
try
{ {
NomaiTextBuilder.Make(go, sector, nomaiTextInfo, mod); NomaiTextBuilder.Make(go, sector, nomaiTextInfo, mod);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make text [{nomaiTextInfo.xmlFile}] for [{go.name}] : {ex.Message}, {ex.StackTrace}");
} }
if(config.Props.SlideShows != null)
}
}
if (Main.HasDLC && config.Props.SlideShows != null)
{ {
foreach (var slideReelInfo in config.Props.SlideShows) foreach (var slideReelInfo in config.Props.SlideShows)
{
try
{ {
ProjectionBuilder.Make(go, sector, slideReelInfo, mod); ProjectionBuilder.Make(go, sector, slideReelInfo, mod);
} }
catch (Exception ex)
{
Logger.LogError($"Couldn't make slide reel for [{go.name}] : {ex.Message}, {ex.StackTrace}");
}
}
} }
} }

View File

@ -22,7 +22,12 @@ namespace NewHorizons.Builder.Props
{ {
if(_prefab == null) if(_prefab == null)
{ {
_prefab = GameObject.FindObjectOfType<RaftController>().gameObject.InstantiateInactive(); _prefab = GameObject.FindObjectOfType<RaftController>()?.gameObject?.InstantiateInactive();
if (_prefab == null)
{
Logger.LogWarning($"Tried to make a raft but couldn't. Do you have the DLC installed?");
return;
}
_prefab.name = "Raft_Body_Prefab"; _prefab.name = "Raft_Body_Prefab";
} }

View File

@ -1,12 +1,63 @@
using System; using System;
using System.Collections.Generic; using NewHorizons.External.Configs;
using System.Linq; using NewHorizons.Utility;
using System.Text; using OWML.Common;
using System.Threading.Tasks; using UnityEngine;
using Logger = NewHorizons.Utility.Logger;
using Object = System.Object;
namespace NewHorizons.Builder.StarSystem namespace NewHorizons.Builder.StarSystem
{ {
class SkyboxBuilder internal class SkyboxBuilder
{ {
public static Material LoadMaterial(string assetBundle, string path, string uniqueModName, IModBehaviour mod)
{
string key = uniqueModName + "." + assetBundle;
AssetBundle bundle;
Material cubemap;
try
{
if (Main.AssetBundles.ContainsKey(key)) bundle = Main.AssetBundles[key];
else
{
bundle = mod.ModHelper.Assets.LoadBundle(assetBundle);
Main.AssetBundles[key] = bundle;
}
}
catch (Exception e)
{
Logger.LogError($"Couldn't load AssetBundle {assetBundle} : {e.Message}");
return null;
}
try
{
cubemap = bundle.LoadAsset<Material>(path);
}
catch (Exception e)
{
Logger.Log($"Couldn't load asset {path} from AssetBundle {assetBundle} : {e.Message}");
return null;
}
return cubemap;
}
public static void Make(StarSystemConfig.SkyboxConfig info, IModBehaviour mod)
{
Logger.Log("Building Skybox");
Material skyBoxMaterial = LoadMaterial(info.assetBundle, info.path, mod.ModHelper.Manifest.UniqueName, mod);
RenderSettings.skybox = skyBoxMaterial;
DynamicGI.UpdateEnvironment();
Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() =>
{
foreach (var camera in Resources.FindObjectsOfTypeAll<OWCamera>())
{
camera.clearFlags = CameraClearFlags.Skybox;
}
});
}
} }
} }

View File

@ -14,6 +14,7 @@ namespace NewHorizons.External.Configs
public bool destroyStockPlanets = true; public bool destroyStockPlanets = true;
public string factRequiredForWarp; public string factRequiredForWarp;
public NomaiCoordinates coords; public NomaiCoordinates coords;
public SkyboxConfig skybox;
public class NomaiCoordinates public class NomaiCoordinates
{ {
@ -22,6 +23,14 @@ namespace NewHorizons.External.Configs
public int[] z; public int[] z;
} }
public class SkyboxConfig
{
public string assetBundle = null;
public string path = null;
public bool destroyStarField = false;
}
public StarSystemConfig(Dictionary<string, object> dict) : base(dict) { } public StarSystemConfig(Dictionary<string, object> dict) : base(dict) { }
} }
} }

View File

@ -59,7 +59,7 @@ namespace NewHorizons.External
{ {
public MVector3 position; public MVector3 position;
public float elevation; public float elevation;
public float height; public float height = 30;
public MColor tint; public MColor tint;
public bool downwards; public bool downwards;
public float wanderRate; public float wanderRate;

View File

@ -5,7 +5,10 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using NewHorizons.Builder.StarSystem;
using UnityEngine; using UnityEngine;
using Logger = NewHorizons.Utility.Logger;
using Object = UnityEngine.Object;
namespace NewHorizons.Handlers namespace NewHorizons.Handlers
{ {
@ -17,23 +20,15 @@ namespace NewHorizons.Handlers
var skybox = GameObject.Find("Skybox/Starfield"); var skybox = GameObject.Find("Skybox/Starfield");
/* if (system.Config.skybox?.destroyStarField ?? false)
skybox.GetComponent<MeshRenderer>().material.shader = Shader.Find("Standard"); {
*/ Object.Destroy(skybox);
}
/* if (system.Config.skybox?.assetBundle != null && system.Config.skybox?.path != null)
var sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); {
GameObject.Destroy(sphere.GetComponent<SphereCollider>()); SkyboxBuilder.Make(system.Config.skybox, system.Mod);
}
sphere.transform.parent = skybox.transform;
sphere.transform.localPosition = Vector3.zero;
var meshFilter = sphere.GetComponent<MeshFilter>();
meshFilter.mesh.triangles = meshFilter.mesh.triangles.Reverse().ToArray();
var meshRenderer = sphere.GetComponent<MeshRenderer>();
meshRenderer.material.color = Color.green;
*/
} }
} }

View File

@ -69,6 +69,8 @@ namespace NewHorizons
// For warping to the eye system // For warping to the eye system
private GameObject _ship; private GameObject _ship;
public static bool HasDLC { get => EntitlementsManager.IsDlcOwned() == EntitlementsManager.AsyncOwnershipStatus.Owned; }
public override object GetApi() public override object GetApi()
{ {
return new NewHorizonsApi(); return new NewHorizonsApi();
@ -95,6 +97,30 @@ namespace NewHorizons
_wasConfigured = true; _wasConfigured = true;
} }
public static void ResetConfigs(bool resetTranslation = true)
{
BodyDict.Clear();
SystemDict.Clear();
BodyDict["SolarSystem"] = new List<NewHorizonsBody>();
BodyDict["EyeOfTheUniverse"] = new List<NewHorizonsBody>(); // Keep this empty tho fr
SystemDict["SolarSystem"] = new NewHorizonsSystem("SolarSystem", new StarSystemConfig(null), Instance)
{
Config =
{
destroyStockPlanets = false
}
};
foreach (AssetBundle bundle in AssetBundles.Values)
{
bundle.Unload(true);
}
AssetBundles.Clear();
if (!resetTranslation) return;
TranslationHandler.ClearTables();
TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage());
}
public void Start() public void Start()
{ {
// Patches // Patches
@ -111,11 +137,7 @@ namespace NewHorizons
GlobalMessenger.AddListener("WakeUp", new Callback(OnWakeUp)); GlobalMessenger.AddListener("WakeUp", new Callback(OnWakeUp));
ShaderBundle = Main.Instance.ModHelper.Assets.LoadBundle("AssetBundle/shader"); ShaderBundle = Main.Instance.ModHelper.Assets.LoadBundle("AssetBundle/shader");
BodyDict["SolarSystem"] = new List<NewHorizonsBody>(); ResetConfigs(resetTranslation: false);
BodyDict["EyeOfTheUniverse"] = new List<NewHorizonsBody>(); // Keep this empty tho fr
SystemDict["SolarSystem"] = new NewHorizonsSystem("SolarSystem", new StarSystemConfig(null), this);
SystemDict["SolarSystem"].Config.destroyStockPlanets = false;
Logger.Log("Begin load of config files...", Logger.LogType.Log); Logger.Log("Begin load of config files...", Logger.LogType.Log);

View File

@ -111,5 +111,14 @@ 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}]");
}
*/
} }
} }

View File

@ -31,21 +31,10 @@ namespace NewHorizons.Utility
private static void ReloadConfigs() private static void ReloadConfigs()
{ {
Main.BodyDict.Clear();
Main.SystemDict.Clear();
Main.BodyDict["SolarSystem"] = new List<NewHorizonsBody>();
Main.SystemDict["SolarSystem"] = new NewHorizonsSystem("SolarSystem", new StarSystemConfig(null), Main.Instance);
foreach (AssetBundle bundle in Main.AssetBundles.Values)
{
bundle.Unload(true);
}
Main.AssetBundles.Clear();
TranslationHandler.ClearTables();
TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage());
Logger.Log("Begin reload of config files...", Logger.LogType.Log); Logger.Log("Begin reload of config files...", Logger.LogType.Log);
Main.ResetConfigs();
try try
{ {
foreach (IModBehaviour mountedAddon in Main.MountedAddons) foreach (IModBehaviour mountedAddon in Main.MountedAddons)

View File

@ -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": "0.13.0", "version": "0.13.1",
"owmlVersion": "2.1.0", "owmlVersion": "2.1.0",
"dependencies": [ "PacificEngine.OW_CommonResources" ], "dependencies": [ "PacificEngine.OW_CommonResources" ],
"conflicts": [ "Raicuparta.QuantumSpaceBuddies", "Vesper.AutoResume" ], "conflicts": [ "Raicuparta.QuantumSpaceBuddies", "Vesper.AutoResume" ],

View File

@ -19,6 +19,25 @@
"destroyStockPlanets": { "destroyStockPlanets": {
"type": "bool", "type": "bool",
"description": "Do you want a clean slate for this star system? Or will it be a modified version of the original." "description": "Do you want a clean slate for this star system? Or will it be a modified version of the original."
},
"skybox": {
"type": "object",
"description": "Options for the skybox of your system",
"properties": {
"destroyStarField": {
"type": "boolean",
"description": "Whether to destroy the star field around the player (always set to true if `assetBundle` and `path` is set)",
"default": false
},
"assetBundle": {
"type": "string",
"description": "Path to the Unity asset bundle to load the skybox material from"
},
"path": {
"type": "string",
"description": "Path to the material within the asset bundle specified by `assetBundle` to use for the skybox"
}
}
} }
} }
} }