From f4b05940e32791c5dc5e9872168352e87000e6c1 Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 31 Aug 2022 18:31:26 -0400 Subject: [PATCH 01/32] Fibonacci deadass thought his sequence counted rabbits --- NewHorizons/Builder/Props/ScatterBuilder.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index 26af9d33..2024d3ae 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -25,7 +25,7 @@ namespace NewHorizons.Builder.Props // Works up to planets with 575 radius before capping var numPoints = Math.Min((int)(area * 10), 41666666); - var points = RandomUtility.FibonacciSphere(numPoints); + //var points = RandomUtility.FibonacciSphere(numPoints); Texture2D heightMapTexture = null; if (heightMap != null) @@ -57,11 +57,7 @@ namespace NewHorizons.Builder.Props else prefab = SearchUtilities.Find(propInfo.path); for (int i = 0; i < propInfo.count; i++) { - // Failsafe - if (points.Count == 0) break; - - var randomInd = (int)Random.Range(0, points.Count - 1); - var point = points[randomInd]; + var point = Random.insideUnitSphere; var height = radius; if (heightMapTexture != null) @@ -105,9 +101,6 @@ namespace NewHorizons.Builder.Props // Rotate around normal prop.transform.localRotation *= Quaternion.AngleAxis(Random.Range(0, 360), Vector3.up); - - points.QuickRemoveAt(randomInd); - if (points.Count == 0) return; } } } From e73c48e5fc17aafcb0142d9bf8a636f0ef9a1b20 Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 31 Aug 2022 19:00:27 -0400 Subject: [PATCH 02/32] Only run detail builder once --- NewHorizons/Builder/Props/ScatterBuilder.cs | 27 +++++++++------------ 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index 2024d3ae..e5d14c8a 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -19,14 +19,6 @@ namespace NewHorizons.Builder.Props { var heightMap = config.HeightMap; - var area = 4f * Mathf.PI * radius * radius; - - // To not use more than 0.5GB of RAM while doing this - // Works up to planets with 575 radius before capping - var numPoints = Math.Min((int)(area * 10), 41666666); - - //var points = RandomUtility.FibonacciSphere(numPoints); - Texture2D heightMapTexture = null; if (heightMap != null) { @@ -55,6 +47,14 @@ namespace NewHorizons.Builder.Props GameObject prefab; if (propInfo.assetBundle != null) prefab = AssetBundleUtilities.LoadPrefab(propInfo.assetBundle, propInfo.path, mod); else prefab = SearchUtilities.Find(propInfo.path); + + // Run all the make detail stuff on it early and just copy it over and over instead + var detailInfo = new PropModule.DetailInfo() + { + scale = propInfo.scale + }; + prefab = DetailBuilder.Make(go, sector, prefab, detailInfo); + for (int i = 0; i < propInfo.count; i++) { var point = Random.insideUnitSphere; @@ -88,13 +88,10 @@ namespace NewHorizons.Builder.Props point = Quaternion.Euler(90, 0, 0) * point; } - var detailInfo = new PropModule.DetailInfo() - { - position = point.normalized * height, - scale = propInfo.scale, - alignToNormal = true - }; - var prop = DetailBuilder.Make(go, sector, prefab, detailInfo); + var prop = prefab.InstantiateInactive(); + prop.transform.localPosition = go.transform.TransformPoint(point); + var up = go.transform.InverseTransformPoint(prop.transform.position).normalized; + prop.transform.rotation = Quaternion.FromToRotation(Vector3.up, up); if (propInfo.offset != null) prop.transform.localPosition += prop.transform.TransformVector(propInfo.offset); if (propInfo.rotation != null) prop.transform.rotation *= Quaternion.Euler(propInfo.rotation); From 3f6a0f04f55b25966060c4c96f9cbf597c5f16fd Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 31 Aug 2022 19:04:36 -0400 Subject: [PATCH 03/32] Set active dingus --- NewHorizons/Builder/Props/ScatterBuilder.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index e5d14c8a..57efa403 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -98,6 +98,8 @@ namespace NewHorizons.Builder.Props // Rotate around normal prop.transform.localRotation *= Quaternion.AngleAxis(Random.Range(0, 360), Vector3.up); + + prop.SetActive(true); } } } From fb85ecdb35ba5b50093d2dbdd1df92e2021baa4e Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 31 Aug 2022 19:07:44 -0400 Subject: [PATCH 04/32] Set parent dingus --- NewHorizons/Builder/Props/ScatterBuilder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index 57efa403..571d48db 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -89,6 +89,7 @@ namespace NewHorizons.Builder.Props } var prop = prefab.InstantiateInactive(); + prop.transform.SetParent(sector?.transform ?? go.transform); prop.transform.localPosition = go.transform.TransformPoint(point); var up = go.transform.InverseTransformPoint(prop.transform.position).normalized; prop.transform.rotation = Quaternion.FromToRotation(Vector3.up, up); From 93ef061b4b64c0ca201112822bf8c47a07e89524 Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 31 Aug 2022 19:09:05 -0400 Subject: [PATCH 05/32] Destroy prefab --- NewHorizons/Builder/Props/ScatterBuilder.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index 571d48db..49a4e1c9 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -102,6 +102,8 @@ namespace NewHorizons.Builder.Props prop.SetActive(true); } + + GameObject.Destroy(prefab); } } } From 422489f8de5fd82cfd6754856f4d96d2a9eed64a Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 31 Aug 2022 19:16:40 -0400 Subject: [PATCH 06/32] Forgot to multiply by height --- NewHorizons/Builder/Props/ScatterBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index 49a4e1c9..f1cb00d5 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -90,7 +90,7 @@ namespace NewHorizons.Builder.Props var prop = prefab.InstantiateInactive(); prop.transform.SetParent(sector?.transform ?? go.transform); - prop.transform.localPosition = go.transform.TransformPoint(point); + prop.transform.localPosition = go.transform.TransformPoint(point * height); var up = go.transform.InverseTransformPoint(prop.transform.position).normalized; prop.transform.rotation = Quaternion.FromToRotation(Vector3.up, up); From 9039c00908e1cecfff8b2db645b46d26a8b2f6ea Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 31 Aug 2022 22:57:50 -0400 Subject: [PATCH 07/32] Add preventOverlap option for better performance, fixed heights --- NewHorizons/Builder/Props/ScatterBuilder.cs | 30 ++++++++++++++++++++- NewHorizons/External/Modules/PropModule.cs | 5 ++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index f1cb00d5..bcbc4899 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -3,6 +3,8 @@ using NewHorizons.External.Modules; using NewHorizons.Utility; using OWML.Common; using System; +using System.Collections.Generic; +using System.Linq; using UnityEngine; using Object = UnityEngine.Object; using Random = UnityEngine.Random; @@ -19,6 +21,21 @@ namespace NewHorizons.Builder.Props { var heightMap = config.HeightMap; + var makeFibonacciSphere = scatterInfo.Any(x => x.preventOverlap); + + List points = new(); + + if (makeFibonacciSphere) + { + var area = 4f * Mathf.PI * radius * radius; + + // To not use more than 0.5GB of RAM while doing this + // Works up to planets with 575 radius before capping + var numPoints = Math.Min((int)(area * 10), 41666666); + + points = RandomUtility.FibonacciSphere(numPoints); + } + Texture2D heightMapTexture = null; if (heightMap != null) { @@ -57,7 +74,18 @@ namespace NewHorizons.Builder.Props for (int i = 0; i < propInfo.count; i++) { - var point = Random.insideUnitSphere; + Vector3 point; + if (propInfo.preventOverlap) + { + if (points.Count == 0) break; + var randomInd = (int)Random.Range(0, points.Count - 1); + point = points[randomInd]; + points.QuickRemoveAt(randomInd); + } + else + { + point = Random.onUnitSphere; + } var height = radius; if (heightMapTexture != null) diff --git a/NewHorizons/External/Modules/PropModule.cs b/NewHorizons/External/Modules/PropModule.cs index 932b1bc0..1a7c6473 100644 --- a/NewHorizons/External/Modules/PropModule.cs +++ b/NewHorizons/External/Modules/PropModule.cs @@ -139,6 +139,11 @@ namespace NewHorizons.External.Modules /// The highest height that these objects will be placed at (only relevant if there's a heightmap) /// public float? maxHeight; + + /// + /// Should we try to prevent overlap between the scattered details? True by default. If it's affecting load times turn it off. + /// + [DefaultValue(true)] public bool preventOverlap = true; } [JsonObject] From 2967565653ba27a4637f2d4a81405047f72719f5 Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 31 Aug 2022 22:59:31 -0400 Subject: [PATCH 08/32] Remove redundant cast --- NewHorizons/Builder/Props/ScatterBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index bcbc4899..b8aac0e0 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -78,7 +78,7 @@ namespace NewHorizons.Builder.Props if (propInfo.preventOverlap) { if (points.Count == 0) break; - var randomInd = (int)Random.Range(0, points.Count - 1); + var randomInd = Random.Range(0, points.Count - 1); point = points[randomInd]; points.QuickRemoveAt(randomInd); } From b987e7833b698f737a373e466f00c464fef74c72 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Sep 2022 03:01:34 +0000 Subject: [PATCH 09/32] Updated Schemas --- NewHorizons/Schemas/body_schema.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index 7ea40e04..328e550a 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -1389,6 +1389,11 @@ ], "description": "The highest height that these objects will be placed at (only relevant if there's a heightmap)", "format": "float" + }, + "preventOverlap": { + "type": "boolean", + "description": "Should we try to prevent overlap between the scattered details? True by default. If it's affecting load times turn it off.", + "default": true } } }, From e5b652ba22babd2b42d6c396ba5d3d617443cf99 Mon Sep 17 00:00:00 2001 From: Nick Date: Sat, 10 Sep 2022 20:00:09 -0400 Subject: [PATCH 10/32] Allow overriding far clip plane --- .../External/Configs/StarSystemConfig.cs | 5 ++++ NewHorizons/Patches/OWCameraPatch.cs | 27 +++++-------------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/NewHorizons/External/Configs/StarSystemConfig.cs b/NewHorizons/External/Configs/StarSystemConfig.cs index ce311174..5d3963aa 100644 --- a/NewHorizons/External/Configs/StarSystemConfig.cs +++ b/NewHorizons/External/Configs/StarSystemConfig.cs @@ -14,6 +14,11 @@ namespace NewHorizons.External.Configs [JsonObject] public class StarSystemConfig { + /// + /// An override value for the far clip plane. Allows you to see farther. + /// + public float farClipPlaneOverride; + /// /// Whether this system can be warped to via the warp drive. If you set factRequiredForWarp, this will be true. /// diff --git a/NewHorizons/Patches/OWCameraPatch.cs b/NewHorizons/Patches/OWCameraPatch.cs index 863b56bd..ccdafafc 100644 --- a/NewHorizons/Patches/OWCameraPatch.cs +++ b/NewHorizons/Patches/OWCameraPatch.cs @@ -1,4 +1,4 @@ -using HarmonyLib; +using HarmonyLib; namespace NewHorizons.Patches { [HarmonyPatch] @@ -8,25 +8,12 @@ namespace NewHorizons.Patches [HarmonyPatch(typeof(OWCamera), nameof(OWCamera.Awake))] public static void OnOWCameraAwake(OWCamera __instance) { - // var oldDist = __instance.farClipPlane; - // var newDist = __instance.farClipPlane * 10f; - // if (__instance.useFarCamera) Mathf.Clamp(newDist, oldDist, 50000f); - // else newDist = Mathf.Clamp(newDist, oldDist, 10000000f); - // __instance.farClipPlane = newDist; - // __instance.farCameraDistance = newDist; - // __instance.mainCamera.farClipPlane = newDist; + if (Main.SystemDict.TryGetValue(Main.Instance.CurrentStarSystem, out var system) && system?.Config?.farClipPlaneOverride != 0f) + { + __instance.farClipPlane = system.Config.farClipPlaneOverride; + __instance.farCameraDistance = system.Config.farClipPlaneOverride; + __instance.mainCamera.farClipPlane = system.Config.farClipPlaneOverride; + } } - - // [HarmonyPrefix] - // [HarmonyPatch(typeof(OWCamera), nameof(OWCamera.RebuildSkybox))] - // public static bool OnOWCameraRebuildSkybox(OWCamera __instance) - // { - // __instance._skyboxCommandBuffer = new CommandBuffer(); - // __instance._skyboxCommandBuffer.name = "Skybox"; - // var camera = __instance._useFarCamera && !SystemInfo.usesReversedZBuffer ? __instance._farCamera : __instance._mainCamera; - // CameraEvent evt = CameraEvent.BeforeSkybox; - // camera.AddCommandBuffer(evt, __instance._skyboxCommandBuffer); - // return false; - // } } } From 7c54d20d63cda45965388e51eb85f61cf44ea24d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 11 Sep 2022 00:02:09 +0000 Subject: [PATCH 11/32] Updated Schemas --- NewHorizons/Schemas/star_system_schema.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NewHorizons/Schemas/star_system_schema.json b/NewHorizons/Schemas/star_system_schema.json index 032fb8f1..f1f8785e 100644 --- a/NewHorizons/Schemas/star_system_schema.json +++ b/NewHorizons/Schemas/star_system_schema.json @@ -5,6 +5,11 @@ "description": "Configuration for a specific star system", "additionalProperties": false, "properties": { + "farClipPlaneOverride": { + "type": "number", + "description": "An override value for the far clip plane. Allows you to see farther.", + "format": "float" + }, "canEnterViaWarpDrive": { "type": "boolean", "description": "Whether this system can be warped to via the warp drive. If you set factRequiredForWarp, this will be true.", From a31c62ba37f26d28285b9e91d140f664e3c90678 Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Sat, 3 Sep 2022 23:00:00 -0400 Subject: [PATCH 12/32] Fix credits --- NewHorizons/Handlers/CreditsHandler.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/NewHorizons/Handlers/CreditsHandler.cs b/NewHorizons/Handlers/CreditsHandler.cs index 9d7e7405..f71a73ef 100644 --- a/NewHorizons/Handlers/CreditsHandler.cs +++ b/NewHorizons/Handlers/CreditsHandler.cs @@ -39,7 +39,7 @@ namespace NewHorizons.Handlers private static void AddCreditsSection(string sectionName, string[] entries, ref XmlDocument xml) { - var finalCredits = xml.SelectSingleNode("Credits/section"); + var finalCredits = xml.SelectSingleNode("Credits/section[@name='CreditsFinal']"); /* * Looks bad, would need more customization, complicated, messes up music timing, wont do for now @@ -134,11 +134,8 @@ namespace NewHorizons.Handlers { var rootSection = MakeNode(doc, "section", new Dictionary() { - { "platform", "All" }, - { "type", "Scroll" }, - { "scrollDuration", "214" }, - { "spacing", "12" }, - { "width", "1590" } + { "name", "Custom" }, + { "credits-type", "Final Fast Krazy" } }); var titleLayout = MakeNode(doc, "layout", new Dictionary() From 5aba437596a96a1ed563b38f0e40091c08837f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dami=C3=A1n=20Garro?= Date: Tue, 13 Sep 2022 19:30:23 -0300 Subject: [PATCH 13/32] Fix race conditions with slide textures loading --- .../Builder/Props/ProjectionBuilder.cs | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/NewHorizons/Builder/Props/ProjectionBuilder.cs b/NewHorizons/Builder/Props/ProjectionBuilder.cs index f6cb399d..58edb896 100644 --- a/NewHorizons/Builder/Props/ProjectionBuilder.cs +++ b/NewHorizons/Builder/Props/ProjectionBuilder.cs @@ -4,8 +4,8 @@ using NewHorizons.Utility; using OWML.Common; using System; using System.Collections.Generic; +using System.Threading; using UnityEngine; -using static NewHorizons.External.Modules.PropModule; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.Props { @@ -113,24 +113,22 @@ namespace NewHorizons.Builder.Props slideCollection.slides[index]._image = ImageUtilities.Invert(tex); // Track the first 15 to put on the slide reel object - if (index < 15) + if (index < textures.Length) { textures[index] = tex; - displaySlidesLoaded++; // threading moment - } + if (Interlocked.Increment(ref displaySlidesLoaded) == textures.Length) + { + // all textures required to build the reel's textures have been loaded + var slidesBack = slideReelObj.transform.Find("Props_IP_SlideReel_7/Slides_Back").GetComponent(); + var slidesFront = slideReelObj.transform.Find("Props_IP_SlideReel_7/Slides_Front").GetComponent(); - if (displaySlidesLoaded >= textures.Length) - { - // all textures required to build the reel's textures have been loaded - var slidesBack = slideReelObj.transform.Find("Props_IP_SlideReel_7/Slides_Back").GetComponent(); - var slidesFront = slideReelObj.transform.Find("Props_IP_SlideReel_7/Slides_Front").GetComponent(); - - // Now put together the textures into a 4x4 thing for the materials - var reelTexture = ImageUtilities.MakeReelTexture(textures); - slidesBack.material.mainTexture = reelTexture; - slidesBack.material.SetTexture(EmissionMap, reelTexture); - slidesFront.material.mainTexture = reelTexture; - slidesFront.material.SetTexture(EmissionMap, reelTexture); + // Now put together the textures into a 4x4 thing for the materials + var reelTexture = ImageUtilities.MakeReelTexture(textures); + slidesBack.material.mainTexture = reelTexture; + slidesBack.material.SetTexture(EmissionMap, reelTexture); + slidesFront.material.mainTexture = reelTexture; + slidesFront.material.SetTexture(EmissionMap, reelTexture); + } } } ); @@ -352,9 +350,8 @@ namespace NewHorizons.Builder.Props (Texture2D tex, int index) => { slideCollection.slides[index]._image = tex; - displaySlidesLoaded++; // threading moment - if (displaySlidesLoaded >= slides.Length) + if (Interlocked.Increment(ref displaySlidesLoaded) == slides.Length) { mindSlideProjector.enabled = true; visionBeamEffect.SetActive(true); From d3e44d0e690e2540352c50d0cc8491aacbf7f0b7 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Sep 2022 19:06:50 -0400 Subject: [PATCH 14/32] Add locks to async image loading, count how many have loaded, fix error log --- .../Builder/Props/ProjectionBuilder.cs | 8 +- NewHorizons/Utility/ImageUtilities.cs | 83 ++++++++++++------- 2 files changed, 58 insertions(+), 33 deletions(-) diff --git a/NewHorizons/Builder/Props/ProjectionBuilder.cs b/NewHorizons/Builder/Props/ProjectionBuilder.cs index f6cb399d..fc14a3f0 100644 --- a/NewHorizons/Builder/Props/ProjectionBuilder.cs +++ b/NewHorizons/Builder/Props/ProjectionBuilder.cs @@ -95,7 +95,7 @@ namespace NewHorizons.Builder.Props var slide = new Slide(); var slideInfo = info.slides[i]; - imageLoader.pathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); + imageLoader.PathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); AddModules(slideInfo, ref slide, mod); @@ -197,7 +197,7 @@ namespace NewHorizons.Builder.Props var slide = new Slide(); var slideInfo = info.slides[i]; - imageLoader.pathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); + imageLoader.PathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); AddModules(slideInfo, ref slide, mod); @@ -263,7 +263,7 @@ namespace NewHorizons.Builder.Props var slide = new Slide(); var slideInfo = slides[i]; - imageLoader.pathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); + imageLoader.PathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); AddModules(slideInfo, ref slide, mod); @@ -336,7 +336,7 @@ namespace NewHorizons.Builder.Props var slide = new Slide(); var slideInfo = slides[i]; - imageLoader.pathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); + imageLoader.PathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); AddModules(slideInfo, ref slide, mod); diff --git a/NewHorizons/Utility/ImageUtilities.cs b/NewHorizons/Utility/ImageUtilities.cs index e875341f..fa8cd7d2 100644 --- a/NewHorizons/Utility/ImageUtilities.cs +++ b/NewHorizons/Utility/ImageUtilities.cs @@ -3,10 +3,10 @@ using System; using System.Collections; using System.Collections.Generic; using System.IO; +using System.Linq; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; -using UnityEngine.UIElements; namespace NewHorizons.Utility { @@ -128,7 +128,7 @@ namespace NewHorizons.Utility var texture = (new Texture2D(size * 4, size * 4, TextureFormat.ARGB32, false)); texture.name = "SlideReelAtlas"; - Color[] fillPixels = new Color[size * size * 4 * 4]; + var fillPixels = new Color[size * size * 4 * 4]; for (int xIndex = 0; xIndex < 4; xIndex++) { for (int yIndex = 0; yIndex < 4; yIndex++) @@ -276,8 +276,8 @@ namespace NewHorizons.Utility { var tex = (new Texture2D(1, 1, TextureFormat.ARGB32, false)); tex.name = "Clear"; - Color fillColor = Color.clear; - Color[] fillPixels = new Color[tex.width * tex.height]; + var fillColor = Color.clear; + var fillPixels = new Color[tex.width * tex.height]; for (int i = 0; i < fillPixels.Length; i++) { fillPixels[i] = fillColor; @@ -296,7 +296,7 @@ namespace NewHorizons.Utility { var tex = (new Texture2D(width, height, TextureFormat.ARGB32, false)); tex.name = src.name + "CanvasScaled"; - Color[] fillPixels = new Color[tex.width * tex.height]; + var fillPixels = new Color[tex.width * tex.height]; for (int i = 0; i < tex.width; i++) { for (int j = 0; j < tex.height; j++) @@ -339,14 +339,14 @@ namespace NewHorizons.Utility } public static Texture2D MakeSolidColorTexture(int width, int height, Color color) { - Color[] pixels = new Color[width*height]; + var pixels = new Color[width*height]; for(int i = 0; i < pixels.Length; i++) { pixels[i] = color; } - Texture2D newTexture = new Texture2D(width, height); + var newTexture = new Texture2D(width, height); newTexture.SetPixels(pixels); newTexture.Apply(); return newTexture; @@ -364,10 +364,15 @@ namespace NewHorizons.Utility // Modified from https://stackoverflow.com/a/69141085/9643841 public class AsyncImageLoader : MonoBehaviour { - public List pathsToLoad = new List(); + public List PathsToLoad { get; private set; } = new (); public class ImageLoadedEvent : UnityEvent { } - public ImageLoadedEvent imageLoadedEvent = new ImageLoadedEvent(); + public ImageLoadedEvent imageLoadedEvent = new (); + + private readonly object _lockObj = new(); + + public bool FinishedLoading { get; private set; } + private int _loadedCount = 0; // TODO: set up an optional “StartLoading” and “StartUnloading” condition on AsyncTextureLoader, // and make use of that for at least for projector stuff (require player to be in the same sector as the slides @@ -375,39 +380,59 @@ namespace NewHorizons.Utility void Start() { - for (int i = 0; i < pathsToLoad.Count; i++) + imageLoadedEvent.AddListener(OnImageLoaded); + for (int i = 0; i < PathsToLoad.Count; i++) { - StartCoroutine(DownloadTexture(pathsToLoad[i], i)); + StartCoroutine(DownloadTexture(PathsToLoad[i], i)); + } + } + + private void OnImageLoaded(Texture texture, int index) + { + lock (_lockObj) + { + _loadedCount++; + + if (_loadedCount >= PathsToLoad.Count) + { + Logger.LogVerbose($"Finished loading all textures for {gameObject.name} (one was {PathsToLoad.FirstOrDefault()}"); + FinishedLoading = true; + } } } IEnumerator DownloadTexture(string url, int index) { - if (_loadedTextures.ContainsKey(url)) + lock(_loadedTextures) { - Logger.LogVerbose($"Already loaded image at path: {url}"); - var texture = _loadedTextures[url]; - imageLoadedEvent.Invoke(texture, index); - yield break; + if (_loadedTextures.ContainsKey(url)) + { + Logger.LogVerbose($"Already loaded image {index}:{url}"); + var texture = _loadedTextures[url]; + imageLoadedEvent?.Invoke(texture, index); + yield break; + } } - using (UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(url)) + using UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(url); + + yield return uwr.SendWebRequest(); + + var hasError = uwr.error != null && uwr.error != ""; + + if (hasError) { - yield return uwr.SendWebRequest(); + Logger.LogError($"Failed to load {index}:{url} - {uwr.error}"); + } + else + { + var texture = DownloadHandlerTexture.GetContent(uwr); - var hasError = uwr.error != null && uwr.error != ""; - - if (hasError) // (uwr.result != UnityWebRequest.Result.Success) + lock(_loadedTextures) { - Debug.Log(uwr.error); - } - else - { - var texture = DownloadHandlerTexture.GetContent(uwr); - if (_loadedTextures.ContainsKey(url)) { - Logger.LogVerbose($"Already loaded image at path: {url}"); + Logger.LogVerbose($"Already loaded image {index}:{url}"); Destroy(texture); texture = _loadedTextures[url]; } @@ -416,7 +441,7 @@ namespace NewHorizons.Utility _loadedTextures.Add(url, texture); } - imageLoadedEvent.Invoke(texture, index); + imageLoadedEvent?.Invoke(texture, index); } } } From 13b714ac889a626872fd6420be6cf9ece40b7bd8 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Sep 2022 19:12:43 -0400 Subject: [PATCH 15/32] Default to black frame if no path supplied for slide --- NewHorizons/Utility/ImageUtilities.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NewHorizons/Utility/ImageUtilities.cs b/NewHorizons/Utility/ImageUtilities.cs index fa8cd7d2..536eeb66 100644 --- a/NewHorizons/Utility/ImageUtilities.cs +++ b/NewHorizons/Utility/ImageUtilities.cs @@ -403,6 +403,12 @@ namespace NewHorizons.Utility IEnumerator DownloadTexture(string url, int index) { + if (string.IsNullOrEmpty(url)) + { + imageLoadedEvent?.Invoke(Texture2D.blackTexture, index); + yield break; + } + lock(_loadedTextures) { if (_loadedTextures.ContainsKey(url)) From 7c183d73335686f2dd77ffdffa0969b355a97d0d Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Sep 2022 19:53:58 -0400 Subject: [PATCH 16/32] Fix up black images --- .../Builder/Props/ProjectionBuilder.cs | 81 ++++++++----------- NewHorizons/Utility/ImageUtilities.cs | 14 ++-- 2 files changed, 37 insertions(+), 58 deletions(-) diff --git a/NewHorizons/Builder/Props/ProjectionBuilder.cs b/NewHorizons/Builder/Props/ProjectionBuilder.cs index fc14a3f0..0f001728 100644 --- a/NewHorizons/Builder/Props/ProjectionBuilder.cs +++ b/NewHorizons/Builder/Props/ProjectionBuilder.cs @@ -2,8 +2,10 @@ using NewHorizons.External.Modules; using NewHorizons.Handlers; using NewHorizons.Utility; using OWML.Common; +using OWML.Common.Menus; using System; using System.Collections.Generic; +using System.IO; using UnityEngine; using static NewHorizons.External.Modules.PropModule; using Logger = NewHorizons.Utility.Logger; @@ -89,19 +91,8 @@ namespace NewHorizons.Builder.Props // The base game ones only have 15 slides max var textures = new Texture2D[slidesCount >= 15 ? 15 : slidesCount]; - var imageLoader = slideReelObj.AddComponent(); - for (int i = 0; i < slidesCount; i++) - { - var slide = new Slide(); - var slideInfo = info.slides[i]; + var imageLoader = AddAsyncLoader(slideReelObj, mod, info.slides, ref slideCollection); - imageLoader.PathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); - - AddModules(slideInfo, ref slide, mod); - - slideCollection.slides[i] = slide; - } - // this variable just lets us track how many of the first 15 slides have been loaded. // this way as soon as the last one is loaded (due to async loading, this may be // slide 7, or slide 3, or whatever), we can build the slide reel texture. This allows us @@ -191,18 +182,7 @@ namespace NewHorizons.Builder.Props int slidesCount = info.slides.Length; var slideCollection = new SlideCollection(slidesCount); - var imageLoader = projectorObj.AddComponent(); - for (int i = 0; i < slidesCount; i++) - { - var slide = new Slide(); - var slideInfo = info.slides[i]; - - imageLoader.PathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); - - AddModules(slideInfo, ref slide, mod); - - slideCollection.slides[i] = slide; - } + var imageLoader = AddAsyncLoader(projectorObj, mod, info.slides, ref slideCollection); imageLoader.imageLoadedEvent.AddListener((Texture2D tex, int index) => { slideCollection.slides[index]._image = ImageUtilities.Invert(tex); }); slideCollectionContainer.slideCollection = slideCollection; @@ -256,19 +236,7 @@ namespace NewHorizons.Builder.Props var slidesCount = slides.Length; var slideCollection = new SlideCollection(slidesCount); - - var imageLoader = g.AddComponent(); - for (int i = 0; i < slidesCount; i++) - { - var slide = new Slide(); - var slideInfo = slides[i]; - - imageLoader.PathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); - - AddModules(slideInfo, ref slide, mod); - - slideCollection.slides[i] = slide; - } + var imageLoader = AddAsyncLoader(g, mod, info.slides, ref slideCollection); imageLoader.imageLoadedEvent.AddListener((Texture2D tex, int index) => { slideCollection.slides[index]._image = tex; }); // attach a component to store all the data for the slides that play when a vision torch scans this target @@ -330,19 +298,8 @@ namespace NewHorizons.Builder.Props var slidesCount = slides.Length; var slideCollection = new SlideCollection(slidesCount); - var imageLoader = standingTorch.AddComponent(); - for (int i = 0; i < slidesCount; i++) - { - var slide = new Slide(); - var slideInfo = slides[i]; + var imageLoader = AddAsyncLoader(standingTorch, mod, slides, ref slideCollection); - imageLoader.PathsToLoad.Add(mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath); - - AddModules(slideInfo, ref slide, mod); - - slideCollection.slides[i] = slide; - } - // This variable just lets us track how many of the slides have been loaded. // This way as soon as the last one is loaded (due to async loading, this may be // slide 7, or slide 3, or whatever), we can enable the vision torch. This allows us @@ -378,6 +335,32 @@ namespace NewHorizons.Builder.Props return standingTorch; } + private static ImageUtilities.AsyncImageLoader AddAsyncLoader(GameObject gameObject, IModBehaviour mod, SlideInfo[] slides, ref SlideCollection slideCollection) + { + var imageLoader = gameObject.AddComponent(); + for (int i = 0; i < slides.Length; i++) + { + var slide = new Slide(); + var slideInfo = slides[i]; + + if (string.IsNullOrEmpty(slideInfo.imagePath)) + { + imageLoader.imageLoadedEvent?.Invoke(Texture2D.blackTexture, i); + } + else + { + // Don't use Path.Combine here else you break the Vision + imageLoader.PathsToLoad.Add((i, mod.ModHelper.Manifest.ModFolderPath + slideInfo.imagePath)); + } + + AddModules(slideInfo, ref slide, mod); + + slideCollection.slides[i] = slide; + } + + return imageLoader; + } + private static void AddModules(PropModule.SlideInfo slideInfo, ref Slide slide, IModBehaviour mod) { var modules = new List(); diff --git a/NewHorizons/Utility/ImageUtilities.cs b/NewHorizons/Utility/ImageUtilities.cs index 536eeb66..1f6ae9d8 100644 --- a/NewHorizons/Utility/ImageUtilities.cs +++ b/NewHorizons/Utility/ImageUtilities.cs @@ -1,9 +1,11 @@ using OWML.Common; +using OWML.ModHelper; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Security.Policy; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; @@ -364,7 +366,7 @@ namespace NewHorizons.Utility // Modified from https://stackoverflow.com/a/69141085/9643841 public class AsyncImageLoader : MonoBehaviour { - public List PathsToLoad { get; private set; } = new (); + public List<(int index, string path)> PathsToLoad { get; private set; } = new (); public class ImageLoadedEvent : UnityEvent { } public ImageLoadedEvent imageLoadedEvent = new (); @@ -381,9 +383,9 @@ namespace NewHorizons.Utility void Start() { imageLoadedEvent.AddListener(OnImageLoaded); - for (int i = 0; i < PathsToLoad.Count; i++) + foreach (var (index, path) in PathsToLoad) { - StartCoroutine(DownloadTexture(PathsToLoad[i], i)); + StartCoroutine(DownloadTexture(path, index)); } } @@ -403,12 +405,6 @@ namespace NewHorizons.Utility IEnumerator DownloadTexture(string url, int index) { - if (string.IsNullOrEmpty(url)) - { - imageLoadedEvent?.Invoke(Texture2D.blackTexture, index); - yield break; - } - lock(_loadedTextures) { if (_loadedTextures.ContainsKey(url)) From 86957f2116b11b5dc233c5b075277d8079870e90 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Sep 2022 20:00:08 -0400 Subject: [PATCH 17/32] Ok john --- NewHorizons/Patches/MapControllerPatches.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NewHorizons/Patches/MapControllerPatches.cs b/NewHorizons/Patches/MapControllerPatches.cs index dd53f603..3c13673e 100644 --- a/NewHorizons/Patches/MapControllerPatches.cs +++ b/NewHorizons/Patches/MapControllerPatches.cs @@ -1,4 +1,5 @@ using HarmonyLib; +using UnityEngine; using UnityEngine.SceneManagement; namespace NewHorizons.Patches @@ -10,11 +11,11 @@ namespace NewHorizons.Patches [HarmonyPatch(typeof(MapController), nameof(MapController.Awake))] public static void MapController_Awake(MapController __instance) { - __instance._maxPanDistance = Main.FurthestOrbit * 1.5f; + __instance._maxPanDistance = Mathf.Max(__instance._maxPanDistance, Main.FurthestOrbit * 1.5f); __instance._maxZoomDistance *= 6f; __instance._minPitchAngle = -90f; __instance._zoomSpeed *= 4f; - __instance._mapCamera.farClipPlane = Main.FurthestOrbit * 10f; + __instance._mapCamera.farClipPlane = Mathf.Max(__instance._mapCamera.farClipPlane, Main.FurthestOrbit * 10f); } [HarmonyPostfix] From e074d2ecb1451857642f0f9953337e40ea659d11 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Sep 2022 20:18:02 -0400 Subject: [PATCH 18/32] Fix bad merge --- NewHorizons/Builder/Props/ProjectionBuilder.cs | 4 ++-- NewHorizons/Utility/ImageUtilities.cs | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/NewHorizons/Builder/Props/ProjectionBuilder.cs b/NewHorizons/Builder/Props/ProjectionBuilder.cs index cbd607d2..e80d451d 100644 --- a/NewHorizons/Builder/Props/ProjectionBuilder.cs +++ b/NewHorizons/Builder/Props/ProjectionBuilder.cs @@ -2,13 +2,13 @@ using NewHorizons.External.Modules; using NewHorizons.Handlers; using NewHorizons.Utility; using OWML.Common; -using OWML.Common.Menus; using System; using System.Collections.Generic; using System.Threading; -using System.IO; using UnityEngine; +using static NewHorizons.External.Modules.PropModule; using Logger = NewHorizons.Utility.Logger; + namespace NewHorizons.Builder.Props { public static class ProjectionBuilder diff --git a/NewHorizons/Utility/ImageUtilities.cs b/NewHorizons/Utility/ImageUtilities.cs index 1f6ae9d8..cf884938 100644 --- a/NewHorizons/Utility/ImageUtilities.cs +++ b/NewHorizons/Utility/ImageUtilities.cs @@ -1,11 +1,9 @@ using OWML.Common; -using OWML.ModHelper; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Security.Policy; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; From 7bcddf4261c9a1b0fcc6df6bd06367efb90f6741 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Sep 2022 21:58:31 -0400 Subject: [PATCH 19/32] Fix collision issue --- NewHorizons/Builder/Props/DetailBuilder.cs | 102 ++++++++++++++------ NewHorizons/Builder/Props/ScatterBuilder.cs | 6 +- 2 files changed, 77 insertions(+), 31 deletions(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index ae7a63f7..f49c8289 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -5,8 +5,10 @@ using NewHorizons.Utility; using OWML.Common; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using UnityEngine; +using Component = UnityEngine.Component; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.Props { @@ -71,6 +73,9 @@ namespace NewHorizons.Builder.Props var isTorch = prop.GetComponent() != null; + // Fix a bunch of stuff when done loading + var fixes = new List(); + foreach (var component in prop.GetComponentsInChildren(true)) { if (sector == null) @@ -80,6 +85,16 @@ namespace NewHorizons.Builder.Props else FixSectoredComponent(component, sector, isTorch); FixComponent(component, go, prefab.name); + + if (DetailFixer.fixes.Keys.Any(x => x.IsAssignableFrom(component.GetType()))) + { + fixes.Add(component); + } + } + + if (fixes.Count > 0) + { + prop.AddComponent().SetFixes(fixes); } prop.transform.position = detail.position == null ? go.transform.position : go.transform.TransformPoint(detail.position); @@ -277,44 +292,75 @@ namespace NewHorizons.Builder.Props torchItem.mindProjectorTrigger.enabled = true; torchItem.mindSlideProjector._mindProjectorImageEffect = SearchUtilities.Find("Player_Body/PlayerCamera").GetComponent(); } + } - // Fix a bunch of stuff when done loading - Delay.RunWhen(() => Main.IsSystemReady, () => + /// + /// Performs fixes that have to be done after the system loads + /// Has to be done this way to ensure that scatter works + /// + private class DetailFixer : MonoBehaviour + { + public static Dictionary> fixes = new() { - try + [typeof(AnglerfishAnimController)] = (x) => { - if (component == null) return; - if (component is Animator animator) animator.enabled = true; - else if (component is Collider collider) collider.enabled = true; - else if (component is Renderer renderer) renderer.enabled = true; - else if (component is Shape shape) shape.enabled = true; - else if (component is SectorCullGroup sectorCullGroup) + var angler = x as AnglerfishAnimController; + + Logger.LogVerbose("Enabling anglerfish animation"); + // Remove any reference to its angler + if (angler._anglerfishController) { - sectorCullGroup._inMapView = false; - sectorCullGroup._isFastForwarding = false; - sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false); + angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; + angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn; + angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; + angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; } - // If it's not a moving anglerfish make sure the anim controller is regular - else if (component is AnglerfishAnimController angler && angler.GetComponentInParent() == null) + angler.enabled = true; + angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); + }, + [typeof(SectorCullGroup)] = (x) => + { + var sectorCullGroup = x as SectorCullGroup; + sectorCullGroup._inMapView = false; + sectorCullGroup._isFastForwarding = false; + sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false); + }, + [typeof(Shape)] = (x) => (x as Shape).enabled = true, + [typeof(Renderer)] = (x) => (x as Renderer).enabled = true, + [typeof(Collider)] = (x) => (x as Collider).enabled = true, + [typeof(Animator)] = (x) => (x as Animator).enabled = true + }; + + // Have to be public to be copied by Instantiate + public Component[] componentsToFix; + + public void SetFixes(List fixes) + { + // Components must be in a list for unity to properly deep copy + componentsToFix = fixes.ToArray(); + } + + public void Start() + { + for (int i = 0; i < componentsToFix.Length; i++) + { + var component = componentsToFix[i]; + + try { - Logger.LogVerbose("Enabling anglerfish animation"); - // Remove any reference to its angler - if (angler._anglerfishController) + if (component != null) { - angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; - angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn; - angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; - angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; + var key = fixes.Keys.FirstOrDefault(x => x.IsAssignableFrom(component.GetType())); + var fix = fixes[key]; + fix(component); } - angler.enabled = true; - angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); + } + catch (Exception) + { + Logger.LogWarning($"Failed to fix component {component} on {gameObject.name}"); } } - catch (Exception e) - { - Logger.LogWarning($"Exception when modifying component [{component.GetType().Name}] on [{planetGO.name}] for prop [{prefab}]:\n{e}"); - } - }); + } } } } \ No newline at end of file diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index b8aac0e0..2deea2c8 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -70,7 +70,7 @@ namespace NewHorizons.Builder.Props { scale = propInfo.scale }; - prefab = DetailBuilder.Make(go, sector, prefab, detailInfo); + var scatterPrefab = DetailBuilder.Make(go, sector, prefab, detailInfo); for (int i = 0; i < propInfo.count; i++) { @@ -116,7 +116,7 @@ namespace NewHorizons.Builder.Props point = Quaternion.Euler(90, 0, 0) * point; } - var prop = prefab.InstantiateInactive(); + var prop = scatterPrefab.InstantiateInactive(); prop.transform.SetParent(sector?.transform ?? go.transform); prop.transform.localPosition = go.transform.TransformPoint(point * height); var up = go.transform.InverseTransformPoint(prop.transform.position).normalized; @@ -131,7 +131,7 @@ namespace NewHorizons.Builder.Props prop.SetActive(true); } - GameObject.Destroy(prefab); + GameObject.Destroy(scatterPrefab); } } } From 2cabbc27b193e0fb0e13054bc146a415e6ea48a0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Sep 2022 02:03:22 +0000 Subject: [PATCH 20/32] Updated Schemas --- NewHorizons/Schemas/body_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index 2d1984c0..a3d243d1 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -1399,7 +1399,7 @@ "type": "boolean", "description": "Should we try to prevent overlap between the scattered details? True by default. If it's affecting load times turn it off.", "default": true - }, + }, "keepLoaded": { "type": "boolean", "description": "Should this detail stay loaded even if you're outside the sector (good for very large props)" From d509e11379ad04c14417c059323764f079644ff5 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Sep 2022 23:03:59 -0400 Subject: [PATCH 21/32] Use CommonCameraUtility to fix projection pool remote cameras --- .../CommonCameraHandler.cs | 16 +++++++++++++ .../CommonCameraUtility/ICommonCameraAPI.cs | 13 ++++++++++ .../CameraPatches/NomaiRemoteCameraPatches.cs | 24 +++++++++++++++++++ NewHorizons/manifest.json | 2 +- 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 NewHorizons/OtherMods/CommonCameraUtility/CommonCameraHandler.cs create mode 100644 NewHorizons/OtherMods/CommonCameraUtility/ICommonCameraAPI.cs create mode 100644 NewHorizons/Patches/CameraPatches/NomaiRemoteCameraPatches.cs diff --git a/NewHorizons/OtherMods/CommonCameraUtility/CommonCameraHandler.cs b/NewHorizons/OtherMods/CommonCameraUtility/CommonCameraHandler.cs new file mode 100644 index 00000000..2aab1526 --- /dev/null +++ b/NewHorizons/OtherMods/CommonCameraUtility/CommonCameraHandler.cs @@ -0,0 +1,16 @@ +using NewHorizons.OtherMods.MenuFramework; + +namespace NewHorizons.OtherMods.CommonCameraUtility +{ + public static class CommonCameraHandler + { + private static ICommonCameraAPI _cameraAPI; + + static CommonCameraHandler() + { + _cameraAPI = Main.Instance.ModHelper.Interaction.TryGetModApi("xen.CommonCameraUtility"); + } + + public static void RegisterCustomCamera(OWCamera camera) => _cameraAPI.RegisterCustomCamera(camera); + } +} diff --git a/NewHorizons/OtherMods/CommonCameraUtility/ICommonCameraAPI.cs b/NewHorizons/OtherMods/CommonCameraUtility/ICommonCameraAPI.cs new file mode 100644 index 00000000..bd49375b --- /dev/null +++ b/NewHorizons/OtherMods/CommonCameraUtility/ICommonCameraAPI.cs @@ -0,0 +1,13 @@ +using UnityEngine; +using UnityEngine.Events; + +namespace NewHorizons.OtherMods.CommonCameraUtility +{ + public interface ICommonCameraAPI + { + void RegisterCustomCamera(OWCamera OWCamera); + (OWCamera, Camera) CreateCustomCamera(string name); + UnityEvent EquipTool(); + UnityEvent UnequipTool(); + } +} diff --git a/NewHorizons/Patches/CameraPatches/NomaiRemoteCameraPatches.cs b/NewHorizons/Patches/CameraPatches/NomaiRemoteCameraPatches.cs new file mode 100644 index 00000000..29719c0e --- /dev/null +++ b/NewHorizons/Patches/CameraPatches/NomaiRemoteCameraPatches.cs @@ -0,0 +1,24 @@ +using HarmonyLib; +using NewHorizons.OtherMods.CommonCameraUtility; +using UnityEngine; + +namespace NewHorizons.Patches.CameraPatches +{ + [HarmonyPatch] + public static class NomaiRemoteCameraPatches + { + [HarmonyPostfix] + [HarmonyPatch(typeof(NomaiRemoteCamera), nameof(NomaiRemoteCamera.Awake))] + public static void NomaiRemoteCamera_Awake(NomaiRemoteCamera __instance) + { + // Ensures that if the player is visible from the remote camera they look normal + CommonCameraHandler.RegisterCustomCamera(__instance._camera); + + // These layers were left on because it doesnt come up in base game (Dreamworld is inactive, player is far away) + __instance._camera.mainCamera.cullingMask &= ~(1 << LayerMask.NameToLayer("DreamSimulation")); + __instance._camera.mainCamera.cullingMask &= ~(1 < Date: Tue, 13 Sep 2022 23:04:11 -0400 Subject: [PATCH 22/32] Reorganize camera patches --- NewHorizons/Patches/{ => CameraPatches}/OWCameraPatch.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename NewHorizons/Patches/{ => CameraPatches}/OWCameraPatch.cs (93%) diff --git a/NewHorizons/Patches/OWCameraPatch.cs b/NewHorizons/Patches/CameraPatches/OWCameraPatch.cs similarity index 93% rename from NewHorizons/Patches/OWCameraPatch.cs rename to NewHorizons/Patches/CameraPatches/OWCameraPatch.cs index ccdafafc..db9251c1 100644 --- a/NewHorizons/Patches/OWCameraPatch.cs +++ b/NewHorizons/Patches/CameraPatches/OWCameraPatch.cs @@ -1,5 +1,6 @@ using HarmonyLib; -namespace NewHorizons.Patches + +namespace NewHorizons.Patches.CameraPatches { [HarmonyPatch] public static class OWCameraPatch From 0b2be0cfcce1a4c39e6c8339833d941f627d48c5 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Sep 2022 23:05:36 -0400 Subject: [PATCH 23/32] Revert "Reorganize camera patches" This reverts commit 461cdd6349b64932e8ffe2df87bc0bd7426bd5de. --- NewHorizons/Patches/{CameraPatches => }/OWCameraPatch.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename NewHorizons/Patches/{CameraPatches => }/OWCameraPatch.cs (93%) diff --git a/NewHorizons/Patches/CameraPatches/OWCameraPatch.cs b/NewHorizons/Patches/OWCameraPatch.cs similarity index 93% rename from NewHorizons/Patches/CameraPatches/OWCameraPatch.cs rename to NewHorizons/Patches/OWCameraPatch.cs index db9251c1..ccdafafc 100644 --- a/NewHorizons/Patches/CameraPatches/OWCameraPatch.cs +++ b/NewHorizons/Patches/OWCameraPatch.cs @@ -1,6 +1,5 @@ using HarmonyLib; - -namespace NewHorizons.Patches.CameraPatches +namespace NewHorizons.Patches { [HarmonyPatch] public static class OWCameraPatch From 829fedb6a3c02befe556271d9ada804fba15d9e5 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Sep 2022 23:05:41 -0400 Subject: [PATCH 24/32] Revert "Use CommonCameraUtility to fix projection pool remote cameras" This reverts commit d509e11379ad04c14417c059323764f079644ff5. --- .../CommonCameraHandler.cs | 16 ------------- .../CommonCameraUtility/ICommonCameraAPI.cs | 13 ---------- .../CameraPatches/NomaiRemoteCameraPatches.cs | 24 ------------------- NewHorizons/manifest.json | 2 +- 4 files changed, 1 insertion(+), 54 deletions(-) delete mode 100644 NewHorizons/OtherMods/CommonCameraUtility/CommonCameraHandler.cs delete mode 100644 NewHorizons/OtherMods/CommonCameraUtility/ICommonCameraAPI.cs delete mode 100644 NewHorizons/Patches/CameraPatches/NomaiRemoteCameraPatches.cs diff --git a/NewHorizons/OtherMods/CommonCameraUtility/CommonCameraHandler.cs b/NewHorizons/OtherMods/CommonCameraUtility/CommonCameraHandler.cs deleted file mode 100644 index 2aab1526..00000000 --- a/NewHorizons/OtherMods/CommonCameraUtility/CommonCameraHandler.cs +++ /dev/null @@ -1,16 +0,0 @@ -using NewHorizons.OtherMods.MenuFramework; - -namespace NewHorizons.OtherMods.CommonCameraUtility -{ - public static class CommonCameraHandler - { - private static ICommonCameraAPI _cameraAPI; - - static CommonCameraHandler() - { - _cameraAPI = Main.Instance.ModHelper.Interaction.TryGetModApi("xen.CommonCameraUtility"); - } - - public static void RegisterCustomCamera(OWCamera camera) => _cameraAPI.RegisterCustomCamera(camera); - } -} diff --git a/NewHorizons/OtherMods/CommonCameraUtility/ICommonCameraAPI.cs b/NewHorizons/OtherMods/CommonCameraUtility/ICommonCameraAPI.cs deleted file mode 100644 index bd49375b..00000000 --- a/NewHorizons/OtherMods/CommonCameraUtility/ICommonCameraAPI.cs +++ /dev/null @@ -1,13 +0,0 @@ -using UnityEngine; -using UnityEngine.Events; - -namespace NewHorizons.OtherMods.CommonCameraUtility -{ - public interface ICommonCameraAPI - { - void RegisterCustomCamera(OWCamera OWCamera); - (OWCamera, Camera) CreateCustomCamera(string name); - UnityEvent EquipTool(); - UnityEvent UnequipTool(); - } -} diff --git a/NewHorizons/Patches/CameraPatches/NomaiRemoteCameraPatches.cs b/NewHorizons/Patches/CameraPatches/NomaiRemoteCameraPatches.cs deleted file mode 100644 index 29719c0e..00000000 --- a/NewHorizons/Patches/CameraPatches/NomaiRemoteCameraPatches.cs +++ /dev/null @@ -1,24 +0,0 @@ -using HarmonyLib; -using NewHorizons.OtherMods.CommonCameraUtility; -using UnityEngine; - -namespace NewHorizons.Patches.CameraPatches -{ - [HarmonyPatch] - public static class NomaiRemoteCameraPatches - { - [HarmonyPostfix] - [HarmonyPatch(typeof(NomaiRemoteCamera), nameof(NomaiRemoteCamera.Awake))] - public static void NomaiRemoteCamera_Awake(NomaiRemoteCamera __instance) - { - // Ensures that if the player is visible from the remote camera they look normal - CommonCameraHandler.RegisterCustomCamera(__instance._camera); - - // These layers were left on because it doesnt come up in base game (Dreamworld is inactive, player is far away) - __instance._camera.mainCamera.cullingMask &= ~(1 << LayerMask.NameToLayer("DreamSimulation")); - __instance._camera.mainCamera.cullingMask &= ~(1 < Date: Tue, 13 Sep 2022 21:11:12 -0700 Subject: [PATCH 25/32] use da thing thankies rider --- NewHorizons/Builder/Props/DetailBuilder.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 74b19515..fb4ae2df 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -87,7 +87,7 @@ namespace NewHorizons.Builder.Props FixComponent(component, go, prefab.name); - if (DetailFixer.fixes.Keys.Any(x => x.IsAssignableFrom(component.GetType()))) + if (DetailFixer.fixes.Keys.Any(x => x.IsInstanceOfType(component))) { fixes.Add(component); } @@ -352,7 +352,7 @@ namespace NewHorizons.Builder.Props { if (component != null) { - var key = fixes.Keys.FirstOrDefault(x => x.IsAssignableFrom(component.GetType())); + var key = fixes.Keys.FirstOrDefault(x => x.IsInstanceOfType(component)); var fix = fixes[key]; fix(component); } From 5ff9f09684953187680a7e5ec71a2c85d3957c95 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 14 Sep 2022 16:34:10 -0700 Subject: [PATCH 26/32] revert da thingy --- NewHorizons/Builder/Props/DetailBuilder.cs | 104 ++++++--------------- 1 file changed, 28 insertions(+), 76 deletions(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index fb4ae2df..ae7a63f7 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -1,4 +1,3 @@ -using NewHorizons.Builder.General; using NewHorizons.External.Configs; using NewHorizons.External.Modules; using NewHorizons.Handlers; @@ -6,10 +5,8 @@ using NewHorizons.Utility; using OWML.Common; using System; using System.Collections.Generic; -using System.ComponentModel; using System.Linq; using UnityEngine; -using Component = UnityEngine.Component; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.Props { @@ -74,9 +71,6 @@ namespace NewHorizons.Builder.Props var isTorch = prop.GetComponent() != null; - // Fix a bunch of stuff when done loading - var fixes = new List(); - foreach (var component in prop.GetComponentsInChildren(true)) { if (sector == null) @@ -86,16 +80,6 @@ namespace NewHorizons.Builder.Props else FixSectoredComponent(component, sector, isTorch); FixComponent(component, go, prefab.name); - - if (DetailFixer.fixes.Keys.Any(x => x.IsInstanceOfType(component))) - { - fixes.Add(component); - } - } - - if (fixes.Count > 0) - { - prop.AddComponent().SetFixes(fixes); } prop.transform.position = detail.position == null ? go.transform.position : go.transform.TransformPoint(detail.position); @@ -116,7 +100,6 @@ namespace NewHorizons.Builder.Props prop.transform.localScale = detail.scale != 0 ? Vector3.one * detail.scale : prefab.transform.localScale; - if (!detail.keepLoaded) GroupsBuilder.Make(prop, sector); prop.SetActive(true); if (prop == null) return null; @@ -294,75 +277,44 @@ namespace NewHorizons.Builder.Props torchItem.mindProjectorTrigger.enabled = true; torchItem.mindSlideProjector._mindProjectorImageEffect = SearchUtilities.Find("Player_Body/PlayerCamera").GetComponent(); } - } - /// - /// Performs fixes that have to be done after the system loads - /// Has to be done this way to ensure that scatter works - /// - private class DetailFixer : MonoBehaviour - { - public static Dictionary> fixes = new() + // Fix a bunch of stuff when done loading + Delay.RunWhen(() => Main.IsSystemReady, () => { - [typeof(AnglerfishAnimController)] = (x) => + try { - var angler = x as AnglerfishAnimController; - - Logger.LogVerbose("Enabling anglerfish animation"); - // Remove any reference to its angler - if (angler._anglerfishController) + if (component == null) return; + if (component is Animator animator) animator.enabled = true; + else if (component is Collider collider) collider.enabled = true; + else if (component is Renderer renderer) renderer.enabled = true; + else if (component is Shape shape) shape.enabled = true; + else if (component is SectorCullGroup sectorCullGroup) { - angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; - angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn; - angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; - angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; + sectorCullGroup._inMapView = false; + sectorCullGroup._isFastForwarding = false; + sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false); } - angler.enabled = true; - angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); - }, - [typeof(SectorCullGroup)] = (x) => - { - var sectorCullGroup = x as SectorCullGroup; - sectorCullGroup._inMapView = false; - sectorCullGroup._isFastForwarding = false; - sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false); - }, - [typeof(Shape)] = (x) => (x as Shape).enabled = true, - [typeof(Renderer)] = (x) => (x as Renderer).enabled = true, - [typeof(Collider)] = (x) => (x as Collider).enabled = true, - [typeof(Animator)] = (x) => (x as Animator).enabled = true - }; - - // Have to be public to be copied by Instantiate - public Component[] componentsToFix; - - public void SetFixes(List fixes) - { - // Components must be in a list for unity to properly deep copy - componentsToFix = fixes.ToArray(); - } - - public void Start() - { - for (int i = 0; i < componentsToFix.Length; i++) - { - var component = componentsToFix[i]; - - try + // If it's not a moving anglerfish make sure the anim controller is regular + else if (component is AnglerfishAnimController angler && angler.GetComponentInParent() == null) { - if (component != null) + Logger.LogVerbose("Enabling anglerfish animation"); + // Remove any reference to its angler + if (angler._anglerfishController) { - var key = fixes.Keys.FirstOrDefault(x => x.IsInstanceOfType(component)); - var fix = fixes[key]; - fix(component); + angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; + angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn; + angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; + angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; } - } - catch (Exception) - { - Logger.LogWarning($"Failed to fix component {component} on {gameObject.name}"); + angler.enabled = true; + angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); } } - } + catch (Exception e) + { + Logger.LogWarning($"Exception when modifying component [{component.GetType().Name}] on [{planetGO.name}] for prop [{prefab}]:\n{e}"); + } + }); } } } \ No newline at end of file From 8ec41b58d592c2fe90dd4de34b1c44c5a1d9aa58 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 14 Sep 2022 16:59:48 -0700 Subject: [PATCH 27/32] remove the delay (things still work lol) --- NewHorizons/Builder/Props/DetailBuilder.cs | 62 ++++++++++------------ 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index ae7a63f7..209ca540 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -226,7 +226,7 @@ namespace NewHorizons.Builder.Props { // Fix other components // I forget why this is here - if (component is GhostIK || component is GhostEffects) + if (component is GhostIK or GhostEffects) { Component.DestroyImmediate(component); return; @@ -278,43 +278,35 @@ namespace NewHorizons.Builder.Props torchItem.mindSlideProjector._mindProjectorImageEffect = SearchUtilities.Find("Player_Body/PlayerCamera").GetComponent(); } - // Fix a bunch of stuff when done loading - Delay.RunWhen(() => Main.IsSystemReady, () => + if (component is Animator animator) animator.enabled = true; + if (component is Collider collider) collider.enabled = true; + if (component is Renderer renderer) renderer.enabled = true; + if (component is Shape shape) shape.enabled = true; + + // fixes sector cull group deactivating renderers on map view enter and fast foward + // TODO: does this actually worK? what? how? + if (component is SectorCullGroup sectorCullGroup) { - try + sectorCullGroup._inMapView = false; + sectorCullGroup._isFastForwarding = false; + sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false); + } + + // If it's not a moving anglerfish make sure the anim controller is regular + if (component is AnglerfishAnimController angler2 && angler2.GetComponentInParent() == null) + { + Logger.LogVerbose("Enabling anglerfish animation"); + // Remove any reference to its angler + if (angler2._anglerfishController) { - if (component == null) return; - if (component is Animator animator) animator.enabled = true; - else if (component is Collider collider) collider.enabled = true; - else if (component is Renderer renderer) renderer.enabled = true; - else if (component is Shape shape) shape.enabled = true; - else if (component is SectorCullGroup sectorCullGroup) - { - sectorCullGroup._inMapView = false; - sectorCullGroup._isFastForwarding = false; - sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false); - } - // If it's not a moving anglerfish make sure the anim controller is regular - else if (component is AnglerfishAnimController angler && angler.GetComponentInParent() == null) - { - Logger.LogVerbose("Enabling anglerfish animation"); - // Remove any reference to its angler - if (angler._anglerfishController) - { - angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; - angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn; - angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; - angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; - } - angler.enabled = true; - angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); - } + angler2._anglerfishController.OnChangeAnglerState -= angler2.OnChangeAnglerState; + angler2._anglerfishController.OnAnglerTurn -= angler2.OnAnglerTurn; + angler2._anglerfishController.OnAnglerSuspended -= angler2.OnAnglerSuspended; + angler2._anglerfishController.OnAnglerUnsuspended -= angler2.OnAnglerUnsuspended; } - catch (Exception e) - { - Logger.LogWarning($"Exception when modifying component [{component.GetType().Name}] on [{planetGO.name}] for prop [{prefab}]:\n{e}"); - } - }); + angler2.enabled = true; + angler2.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); + } } } } \ No newline at end of file From 436cfa317520fce55e408472293bd982b83e3866 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 14 Sep 2022 17:04:53 -0700 Subject: [PATCH 28/32] remove unused parameter --- NewHorizons/Builder/Props/DetailBuilder.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 209ca540..0066a85d 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -79,7 +79,7 @@ namespace NewHorizons.Builder.Props } else FixSectoredComponent(component, sector, isTorch); - FixComponent(component, go, prefab.name); + FixComponent(component, go); } prop.transform.position = detail.position == null ? go.transform.position : go.transform.TransformPoint(detail.position); @@ -222,7 +222,7 @@ namespace NewHorizons.Builder.Props return false; } - private static void FixComponent(Component component, GameObject planetGO, string prefab) + private static void FixComponent(Component component, GameObject planetGO) { // Fix other components // I forget why this is here From cce97acddc326299881adfd4da8525e30125cbf1 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 14 Sep 2022 17:38:16 -0700 Subject: [PATCH 29/32] angler fixer yay --- NewHorizons/Builder/Props/DetailBuilder.cs | 36 ++++++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 0066a85d..016e5f61 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -284,7 +284,7 @@ namespace NewHorizons.Builder.Props if (component is Shape shape) shape.enabled = true; // fixes sector cull group deactivating renderers on map view enter and fast foward - // TODO: does this actually worK? what? how? + // TODO: does this actually work? what? how? if (component is SectorCullGroup sectorCullGroup) { sectorCullGroup._inMapView = false; @@ -293,19 +293,35 @@ namespace NewHorizons.Builder.Props } // If it's not a moving anglerfish make sure the anim controller is regular - if (component is AnglerfishAnimController angler2 && angler2.GetComponentInParent() == null) + if (component is AnglerfishAnimController && component.GetComponentInParent() == null) + component.gameObject.AddComponent(); + } + + /// + /// needs to happen later to remove the funny angler anim events yippee. + /// + /// cant do delay cuz it needs to work with scatter (which does copy detail thing). + /// + [RequireComponent(typeof(AnglerfishAnimController))] + private class AnglerAnimFixer : MonoBehaviour + { + private void Start() { - Logger.LogVerbose("Enabling anglerfish animation"); + var angler = GetComponent(); + + Logger.LogVerbose("Fixing anglerfish animation"); // Remove any reference to its angler - if (angler2._anglerfishController) + if (angler._anglerfishController) { - angler2._anglerfishController.OnChangeAnglerState -= angler2.OnChangeAnglerState; - angler2._anglerfishController.OnAnglerTurn -= angler2.OnAnglerTurn; - angler2._anglerfishController.OnAnglerSuspended -= angler2.OnAnglerSuspended; - angler2._anglerfishController.OnAnglerUnsuspended -= angler2.OnAnglerUnsuspended; + angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; + angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn; + angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; + angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; } - angler2.enabled = true; - angler2.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); + angler.enabled = true; + angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); + + Destroy(this); } } } From 2f49b61dd20ca840e7e8c09258ac85d8e9a7ffe6 Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 14 Sep 2022 20:48:55 -0400 Subject: [PATCH 30/32] Remove stupid usings wtf are these --- NewHorizons/OtherMods/MenuFramework/MenuHandler.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/NewHorizons/OtherMods/MenuFramework/MenuHandler.cs b/NewHorizons/OtherMods/MenuFramework/MenuHandler.cs index 45682279..bb88e7b4 100644 --- a/NewHorizons/OtherMods/MenuFramework/MenuHandler.cs +++ b/NewHorizons/OtherMods/MenuFramework/MenuHandler.cs @@ -4,9 +4,7 @@ using NewHorizons.Utility; using OWML.Common; using System.Collections.Generic; using System.Linq; -using System.Net.Mail; using UnityEngine; -using static UnityEngine.InputSystem.InputRemoting; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.OtherMods.MenuFramework From d71b016c8a9d4726f2cf38b4d797b9bffb774252 Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 14 Sep 2022 20:51:07 -0400 Subject: [PATCH 31/32] Explained why the fixer is needed --- NewHorizons/Builder/Props/DetailBuilder.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 016e5f61..660956b6 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -298,9 +298,9 @@ namespace NewHorizons.Builder.Props } /// - /// needs to happen later to remove the funny angler anim events yippee. - /// - /// cant do delay cuz it needs to work with scatter (which does copy detail thing). + /// Has to happen after AnglerfishAnimController awake to remove the events it has set up. + /// Otherwise results in the anglerfish 1) having its animations controlled by an actual fish 2) randomly having different animations on solarsystem load + /// Can't do delay because it needs to work with scatter (copies a prefab made using MakeDetail). /// [RequireComponent(typeof(AnglerfishAnimController))] private class AnglerAnimFixer : MonoBehaviour @@ -310,7 +310,8 @@ namespace NewHorizons.Builder.Props var angler = GetComponent(); Logger.LogVerbose("Fixing anglerfish animation"); - // Remove any reference to its angler + + // Remove any event reference to its angler if (angler._anglerfishController) { angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; From 27386e1730cb0bc20b4fd19142f01b8acbfa0143 Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 14 Sep 2022 21:08:28 -0400 Subject: [PATCH 32/32] Fix reload configs breaking NH translations --- NewHorizons/Main.cs | 13 ++++++++----- NewHorizons/Utility/DebugUtilities/DebugReload.cs | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index b86c8d65..678852bb 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -121,7 +121,7 @@ namespace NewHorizons _wasConfigured = true; } - public static void ResetConfigs(bool resetTranslation = true) + public void ResetConfigs(bool resetTranslation = true) { BodyDict.Clear(); SystemDict.Clear(); @@ -160,9 +160,13 @@ namespace NewHorizons } }; - if (!resetTranslation) return; - TranslationHandler.ClearTables(); - TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage()); + if (resetTranslation) + { + TranslationHandler.ClearTables(); + TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage()); + } + + LoadTranslations(Instance.ModHelper.Manifest.ModFolderPath + "Assets/", this); } public void Awake() @@ -212,7 +216,6 @@ namespace NewHorizons OnStarSystemLoaded.AddListener(RichPresenceHandler.OnStarSystemLoaded); OnChangeStarSystem.AddListener(RichPresenceHandler.OnChangeStarSystem); - LoadTranslations(ModHelper.Manifest.ModFolderPath + "Assets/", this); LoadAddonManifest("Assets/addon-manifest.json", this); } diff --git a/NewHorizons/Utility/DebugUtilities/DebugReload.cs b/NewHorizons/Utility/DebugUtilities/DebugReload.cs index b8a513c9..1bb6e639 100644 --- a/NewHorizons/Utility/DebugUtilities/DebugReload.cs +++ b/NewHorizons/Utility/DebugUtilities/DebugReload.cs @@ -31,7 +31,7 @@ namespace NewHorizons.Utility.DebugUtilities { Logger.Log("Begin reload of config files..."); - Main.ResetConfigs(); + Main.Instance.ResetConfigs(); try {