diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index acf37283..249ac6bb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -26,7 +26,7 @@ body: - Epic Games - Xbox Game Pass validations: - required: true + required: false - type: textarea id: mods attributes: @@ -34,7 +34,7 @@ body: description: Please define which mods you had enabled when the problem occurred. render: Markdown validations: - required: true + required: false - type: textarea id: logs attributes: diff --git a/NewHorizons/Builder/Atmosphere/AtmosphereBuilder.cs b/NewHorizons/Builder/Atmosphere/AtmosphereBuilder.cs index c60ae6a3..5260fbf7 100644 --- a/NewHorizons/Builder/Atmosphere/AtmosphereBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/AtmosphereBuilder.cs @@ -1,4 +1,5 @@ -using NewHorizons.External.Modules; +using NewHorizons.External.Modules; +using NewHorizons.Utility; using UnityEngine; namespace NewHorizons.Builder.Atmosphere { @@ -16,7 +17,7 @@ namespace NewHorizons.Builder.Atmosphere if (atmosphereModule.useAtmosphereShader) { - GameObject atmo = GameObject.Instantiate(GameObject.Find("TimberHearth_Body/Atmosphere_TH/AtmoSphere"), atmoGO.transform, true); + GameObject atmo = GameObject.Instantiate(SearchUtilities.Find("TimberHearth_Body/Atmosphere_TH/AtmoSphere"), atmoGO.transform, true); atmo.transform.position = planetGO.transform.TransformPoint(Vector3.zero); atmo.transform.localScale = Vector3.one * atmosphereModule.size * 1.2f; foreach (var meshRenderer in atmo.GetComponentsInChildren()) diff --git a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs index 8363f36a..ae0a3243 100644 --- a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs @@ -1,224 +1,227 @@ -using NewHorizons.External.Modules; -using NewHorizons.Utility; -using OWML.Common; -using System; -using UnityEngine; -using Logger = NewHorizons.Utility.Logger; -namespace NewHorizons.Builder.Atmosphere -{ - public static class CloudsBuilder - { - private static Shader _sphereShader = null; - private static Material[] _gdCloudMaterials; - private static GameObject _lightningPrefab; - private static Texture2D _colorRamp; - private static readonly int Color1 = Shader.PropertyToID("_Color"); - private static readonly int TintColor = Shader.PropertyToID("_TintColor"); - private static readonly int MainTex = Shader.PropertyToID("_MainTex"); - private static readonly int RampTex = Shader.PropertyToID("_RampTex"); - private static readonly int CapTex = Shader.PropertyToID("_CapTex"); - private static readonly int ColorRamp = Shader.PropertyToID("_ColorRamp"); - - public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, IModBehaviour mod) - { - if (_lightningPrefab == null) _lightningPrefab = GameObject.Find("GiantsDeep_Body/Sector_GD/Clouds_GD/LightningGenerator_GD"); - if (_colorRamp == null) _colorRamp = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/textures/Clouds_Bottom_ramp.png"); - - GameObject cloudsMainGO = new GameObject("Clouds"); - cloudsMainGO.SetActive(false); - cloudsMainGO.transform.parent = sector?.transform ?? planetGO.transform; - - MakeTopClouds(cloudsMainGO, atmo, mod); - - GameObject cloudsBottomGO = new GameObject("BottomClouds"); - cloudsBottomGO.SetActive(false); - cloudsBottomGO.transform.parent = cloudsMainGO.transform; - cloudsBottomGO.transform.localScale = Vector3.one * atmo.clouds.innerCloudRadius; - - TessellatedSphereRenderer bottomTSR = cloudsBottomGO.AddComponent(); - bottomTSR.tessellationMeshGroup = GameObject.Find("CloudsBottomLayer_QM").GetComponent().tessellationMeshGroup; - var bottomTSRMaterials = GameObject.Find("CloudsBottomLayer_QM").GetComponent().sharedMaterials; - - // If they set a colour apply it to all the materials else keep the default QM one - if (atmo.clouds.tint != null) - { - var bottomColor = atmo.clouds.tint.ToColor(); - - var bottomTSRTempArray = new Material[2]; - - bottomTSRTempArray[0] = new Material(bottomTSRMaterials[0]); - bottomTSRTempArray[0].SetColor(Color1, bottomColor); - bottomTSRTempArray[0].SetColor(TintColor, bottomColor); - bottomTSRTempArray[0].SetTexture(ColorRamp, ImageUtilities.TintImage(_colorRamp, bottomColor)); - - bottomTSRTempArray[1] = new Material(bottomTSRMaterials[1]); - - bottomTSR.sharedMaterials = bottomTSRTempArray; - } - else - { - bottomTSR.sharedMaterials = bottomTSRMaterials; - } - - bottomTSR.maxLOD = 6; - bottomTSR.LODBias = 0; - bottomTSR.LODRadius = 1f; - - TessSphereSectorToggle bottomTSST = cloudsBottomGO.AddComponent(); - bottomTSST._sector = sector; - - GameObject cloudsFluidGO = new GameObject("CloudsFluid"); - cloudsFluidGO.SetActive(false); - cloudsFluidGO.layer = 17; - cloudsFluidGO.transform.parent = cloudsMainGO.transform; - - SphereCollider fluidSC = cloudsFluidGO.AddComponent(); - fluidSC.isTrigger = true; - fluidSC.radius = atmo.size; - - OWShellCollider fluidOWSC = cloudsFluidGO.AddComponent(); - fluidOWSC._innerRadius = atmo.size * 0.9f; - - CloudLayerFluidVolume fluidCLFV = cloudsFluidGO.AddComponent(); - fluidCLFV._layer = 5; - fluidCLFV._priority = 1; - fluidCLFV._density = 1.2f; - - var fluidType = FluidVolume.Type.CLOUD; - - try - { - fluidType = (FluidVolume.Type)Enum.Parse(typeof(FluidVolume.Type), Enum.GetName(typeof(CloudFluidType), atmo.clouds.fluidType).ToUpper()); - } - catch (Exception ex) - { - Logger.LogError($"Couldn't parse fluid volume type [{atmo.clouds.fluidType}]: {ex.Message}, {ex.StackTrace}"); - } - - fluidCLFV._fluidType = fluidType; - fluidCLFV._allowShipAutoroll = true; - fluidCLFV._disableOnStart = false; - - // Fix the rotations once the rest is done - cloudsMainGO.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(0, 0, 0)); - // For the base shader it has to be rotated idk - if (atmo.clouds.useBasicCloudShader) cloudsMainGO.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(90, 0, 0)); - - // Lightning - if (atmo.clouds.hasLightning) - { - var lightning = _lightningPrefab.InstantiateInactive(); - lightning.transform.parent = cloudsMainGO.transform; - lightning.transform.localPosition = Vector3.zero; - - var lightningGenerator = lightning.GetComponent(); - lightningGenerator._altitude = (atmo.clouds.outerCloudRadius + atmo.clouds.innerCloudRadius) / 2f; - lightningGenerator._audioSector = sector; - if (atmo.clouds.lightningGradient != null) - { - var gradient = new GradientColorKey[atmo.clouds.lightningGradient.Length]; - - for(int i = 0; i < atmo.clouds.lightningGradient.Length; i++) - { - var pair = atmo.clouds.lightningGradient[i]; - gradient[i] = new GradientColorKey(pair.tint.ToColor(), pair.time); - } - - lightningGenerator._lightColor.colorKeys = gradient; - } - lightning.SetActive(true); - } - - cloudsMainGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero); - cloudsBottomGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero); - cloudsFluidGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero); - - cloudsBottomGO.SetActive(true); - cloudsFluidGO.SetActive(true); - cloudsMainGO.SetActive(true); - } - - public static GameObject MakeTopClouds(GameObject rootObject, AtmosphereModule atmo, IModBehaviour mod) - { - Color cloudTint = atmo.clouds.tint?.ToColor() ?? Color.white; - - Texture2D image, cap, ramp; - - try - { - image = ImageUtilities.GetTexture(mod, atmo.clouds.texturePath); - - if (atmo.clouds.capPath == null) cap = ImageUtilities.ClearTexture(128, 128); - else cap = ImageUtilities.GetTexture(mod, atmo.clouds.capPath); - if (atmo.clouds.rampPath == null) ramp = ImageUtilities.CanvasScaled(image, 1, image.height); - else ramp = ImageUtilities.GetTexture(mod, atmo.clouds.rampPath); - } - catch (Exception e) - { - Logger.LogError($"Couldn't load Cloud textures for [{rootObject.name}], {e.Message}, {e.StackTrace}"); - return null; - } - - GameObject cloudsTopGO = new GameObject("TopClouds"); - cloudsTopGO.SetActive(false); - cloudsTopGO.transform.parent = rootObject.transform; - cloudsTopGO.transform.localScale = Vector3.one * atmo.clouds.outerCloudRadius; - - MeshFilter topMF = cloudsTopGO.AddComponent(); - topMF.mesh = GameObject.Find("CloudsTopLayer_GD").GetComponent().mesh; - - MeshRenderer topMR = cloudsTopGO.AddComponent(); - - if (_sphereShader == null) _sphereShader = Main.NHAssetBundle.LoadAsset("Assets/Shaders/SphereTextureWrapper.shader"); - if (_gdCloudMaterials == null) _gdCloudMaterials = GameObject.Find("CloudsTopLayer_GD").GetComponent().sharedMaterials; - var tempArray = new Material[2]; - - if (atmo.clouds.useBasicCloudShader) - { - var material = new Material(_sphereShader); - if (atmo.clouds.unlit) material.renderQueue = 2550; - material.name = atmo.clouds.unlit ? "BasicCloud" : "BasicShadowCloud"; - - tempArray[0] = material; - } - else - { - var material = new Material(_gdCloudMaterials[0]); - if (atmo.clouds.unlit) material.renderQueue = 2550; - material.name = atmo.clouds.unlit ? "AdvancedCloud" : "AdvancedShadowCloud"; - tempArray[0] = material; - } - - // This is the stencil material for the fog under the clouds - tempArray[1] = new Material(_gdCloudMaterials[1]); - topMR.sharedMaterials = tempArray; - - foreach (var material in topMR.sharedMaterials) - { - material.SetColor(Color1, cloudTint); - material.SetColor(TintColor, cloudTint); - - material.SetTexture(MainTex, image); - material.SetTexture(RampTex, ramp); - material.SetTexture(CapTex, cap); - } - - if (atmo.clouds.unlit) - { - cloudsTopGO.layer = LayerMask.NameToLayer("IgnoreSun"); - } - - RotateTransform topRT = cloudsTopGO.AddComponent(); - // Idk why but the axis is weird - topRT._localAxis = atmo.clouds.useBasicCloudShader ? Vector3.forward : Vector3.up; - topRT._degreesPerSecond = 10; - topRT._randomizeRotationRate = false; - - cloudsTopGO.transform.localPosition = Vector3.zero; - - cloudsTopGO.SetActive(true); - - return cloudsTopGO; - } - } -} +using NewHorizons.External.Modules; +using NewHorizons.Utility; +using OWML.Common; +using System; +using UnityEngine; +using Logger = NewHorizons.Utility.Logger; +namespace NewHorizons.Builder.Atmosphere +{ + public static class CloudsBuilder + { + private static Shader _sphereShader = null; + private static Material[] _gdCloudMaterials; + private static Material[] _qmCloudMaterials; + private static GameObject _lightningPrefab; + private static Texture2D _colorRamp; + private static readonly int Color1 = Shader.PropertyToID("_Color"); + private static readonly int TintColor = Shader.PropertyToID("_TintColor"); + private static readonly int MainTex = Shader.PropertyToID("_MainTex"); + private static readonly int RampTex = Shader.PropertyToID("_RampTex"); + private static readonly int CapTex = Shader.PropertyToID("_CapTex"); + private static readonly int ColorRamp = Shader.PropertyToID("_ColorRamp"); + + 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 (_colorRamp == null) _colorRamp = ImageUtilities.GetTexture(Main.Instance, "AssetBundle/textures/Clouds_Bottom_ramp.png"); + + GameObject cloudsMainGO = new GameObject("Clouds"); + cloudsMainGO.SetActive(false); + cloudsMainGO.transform.parent = sector?.transform ?? planetGO.transform; + + MakeTopClouds(cloudsMainGO, atmo, mod); + + GameObject cloudsBottomGO = new GameObject("BottomClouds"); + cloudsBottomGO.SetActive(false); + cloudsBottomGO.transform.parent = cloudsMainGO.transform; + cloudsBottomGO.transform.localScale = Vector3.one * atmo.clouds.innerCloudRadius; + + TessellatedSphereRenderer bottomTSR = cloudsBottomGO.AddComponent(); + bottomTSR.tessellationMeshGroup = SearchUtilities.Find("CloudsBottomLayer_QM").GetComponent().tessellationMeshGroup; + var bottomTSRMaterials = SearchUtilities.Find("CloudsBottomLayer_QM").GetComponent().sharedMaterials; + + // If they set a colour apply it to all the materials else keep the default QM one + if (atmo.clouds.tint != null) + { + var bottomColor = atmo.clouds.tint.ToColor(); + + var bottomTSRTempArray = new Material[2]; + + bottomTSRTempArray[0] = new Material(bottomTSRMaterials[0]); + bottomTSRTempArray[0].SetColor(Color1, bottomColor); + bottomTSRTempArray[0].SetColor(TintColor, bottomColor); + bottomTSRTempArray[0].SetTexture(ColorRamp, ImageUtilities.TintImage(_colorRamp, bottomColor)); + + bottomTSRTempArray[1] = new Material(bottomTSRMaterials[1]); + + bottomTSR.sharedMaterials = bottomTSRTempArray; + } + else + { + bottomTSR.sharedMaterials = bottomTSRMaterials; + } + + bottomTSR.maxLOD = 6; + bottomTSR.LODBias = 0; + bottomTSR.LODRadius = 1f; + + TessSphereSectorToggle bottomTSST = cloudsBottomGO.AddComponent(); + bottomTSST._sector = sector; + + GameObject cloudsFluidGO = new GameObject("CloudsFluid"); + cloudsFluidGO.SetActive(false); + cloudsFluidGO.layer = 17; + cloudsFluidGO.transform.parent = cloudsMainGO.transform; + + SphereCollider fluidSC = cloudsFluidGO.AddComponent(); + fluidSC.isTrigger = true; + fluidSC.radius = atmo.size; + + OWShellCollider fluidOWSC = cloudsFluidGO.AddComponent(); + fluidOWSC._innerRadius = atmo.size * 0.9f; + + CloudLayerFluidVolume fluidCLFV = cloudsFluidGO.AddComponent(); + fluidCLFV._layer = 5; + fluidCLFV._priority = 1; + fluidCLFV._density = 1.2f; + + var fluidType = FluidVolume.Type.CLOUD; + + try + { + fluidType = (FluidVolume.Type)Enum.Parse(typeof(FluidVolume.Type), Enum.GetName(typeof(CloudFluidType), atmo.clouds.fluidType).ToUpper()); + } + catch (Exception ex) + { + Logger.LogError($"Couldn't parse fluid volume type [{atmo.clouds.fluidType}]: {ex.Message}, {ex.StackTrace}"); + } + + fluidCLFV._fluidType = fluidType; + fluidCLFV._allowShipAutoroll = true; + fluidCLFV._disableOnStart = false; + + // Fix the rotations once the rest is done + cloudsMainGO.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(0, 0, 0)); + // 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)); + + // Lightning + if (atmo.clouds.hasLightning) + { + var lightning = _lightningPrefab.InstantiateInactive(); + lightning.transform.parent = cloudsMainGO.transform; + lightning.transform.localPosition = Vector3.zero; + + var lightningGenerator = lightning.GetComponent(); + lightningGenerator._altitude = (atmo.clouds.outerCloudRadius + atmo.clouds.innerCloudRadius) / 2f; + lightningGenerator._audioSector = sector; + if (atmo.clouds.lightningGradient != null) + { + var gradient = new GradientColorKey[atmo.clouds.lightningGradient.Length]; + + for(int i = 0; i < atmo.clouds.lightningGradient.Length; i++) + { + var pair = atmo.clouds.lightningGradient[i]; + gradient[i] = new GradientColorKey(pair.tint.ToColor(), pair.time); + } + + lightningGenerator._lightColor.colorKeys = gradient; + } + lightning.SetActive(true); + } + + cloudsMainGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero); + cloudsBottomGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero); + cloudsFluidGO.transform.position = planetGO.transform.TransformPoint(Vector3.zero); + + cloudsBottomGO.SetActive(true); + cloudsFluidGO.SetActive(true); + cloudsMainGO.SetActive(true); + } + + public static GameObject MakeTopClouds(GameObject rootObject, AtmosphereModule atmo, IModBehaviour mod) + { + Color cloudTint = atmo.clouds.tint?.ToColor() ?? Color.white; + + Texture2D image, cap, ramp; + + try + { + image = ImageUtilities.GetTexture(mod, atmo.clouds.texturePath); + + if (atmo.clouds.capPath == null) cap = ImageUtilities.ClearTexture(128, 128); + else cap = ImageUtilities.GetTexture(mod, atmo.clouds.capPath); + if (atmo.clouds.rampPath == null) ramp = ImageUtilities.CanvasScaled(image, 1, image.height); + else ramp = ImageUtilities.GetTexture(mod, atmo.clouds.rampPath); + } + catch (Exception e) + { + Logger.LogError($"Couldn't load Cloud textures for [{rootObject.name}], {e.Message}, {e.StackTrace}"); + return null; + } + + GameObject cloudsTopGO = new GameObject("TopClouds"); + cloudsTopGO.SetActive(false); + cloudsTopGO.transform.parent = rootObject.transform; + cloudsTopGO.transform.localScale = Vector3.one * atmo.clouds.outerCloudRadius; + + MeshFilter topMF = cloudsTopGO.AddComponent(); + topMF.mesh = SearchUtilities.Find("CloudsTopLayer_GD").GetComponent().mesh; + + MeshRenderer topMR = cloudsTopGO.AddComponent(); + + if (_sphereShader == null) _sphereShader = Main.NHAssetBundle.LoadAsset("Assets/Shaders/SphereTextureWrapper.shader"); + if (_gdCloudMaterials == null) _gdCloudMaterials = SearchUtilities.Find("CloudsTopLayer_GD").GetComponent().sharedMaterials; + if (_qmCloudMaterials == null) _qmCloudMaterials = SearchUtilities.Find("CloudsTopLayer_QM").GetComponent().sharedMaterials; + Material[] prefabMaterials = atmo.clouds.cloudsPrefab == CloudPrefabType.GiantsDeep ? _gdCloudMaterials : _qmCloudMaterials; + var tempArray = new Material[2]; + + if (atmo.clouds.cloudsPrefab == CloudPrefabType.Basic) + { + var material = new Material(_sphereShader); + if (atmo.clouds.unlit) material.renderQueue = 2550; + material.name = atmo.clouds.unlit ? "BasicCloud" : "BasicShadowCloud"; + + tempArray[0] = material; + } + else + { + var material = new Material(prefabMaterials[0]); + if (atmo.clouds.unlit) material.renderQueue = 2550; + material.name = atmo.clouds.unlit ? "AdvancedCloud" : "AdvancedShadowCloud"; + tempArray[0] = material; + } + + // This is the stencil material for the fog under the clouds + tempArray[1] = new Material(prefabMaterials[1]); + topMR.sharedMaterials = tempArray; + + foreach (var material in topMR.sharedMaterials) + { + material.SetColor(Color1, cloudTint); + material.SetColor(TintColor, cloudTint); + + material.SetTexture(MainTex, image); + material.SetTexture(RampTex, ramp); + material.SetTexture(CapTex, cap); + } + + if (atmo.clouds.unlit) + { + cloudsTopGO.layer = LayerMask.NameToLayer("IgnoreSun"); + } + + RotateTransform topRT = cloudsTopGO.AddComponent(); + // Idk why but the axis is weird + topRT._localAxis = atmo.clouds.cloudsPrefab == CloudPrefabType.Basic ? Vector3.forward : Vector3.up; + topRT._degreesPerSecond = 10; + topRT._randomizeRotationRate = false; + + cloudsTopGO.transform.localPosition = Vector3.zero; + + cloudsTopGO.SetActive(true); + + return cloudsTopGO; + } + } +} diff --git a/NewHorizons/Builder/Atmosphere/FogBuilder.cs b/NewHorizons/Builder/Atmosphere/FogBuilder.cs index b521ede5..4eae1a82 100644 --- a/NewHorizons/Builder/Atmosphere/FogBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/FogBuilder.cs @@ -17,9 +17,9 @@ namespace NewHorizons.Builder.Atmosphere fogGO.transform.localScale = Vector3.one; // Going to copy from dark bramble - var dbFog = GameObject.Find("DarkBramble_Body/Atmosphere_DB/FogLOD"); - var dbPlanetaryFogController = GameObject.Find("DarkBramble_Body/Atmosphere_DB/FogSphere_DB").GetComponent(); - var brambleLODFog = GameObject.Find("DarkBramble_Body/Sector_DB/Proxy_DB/LOD_DB_VolumeticFog"); + var dbFog = SearchUtilities.Find("DarkBramble_Body/Atmosphere_DB/FogLOD"); + var dbPlanetaryFogController = SearchUtilities.Find("DarkBramble_Body/Atmosphere_DB/FogSphere_DB").GetComponent(); + var brambleLODFog = SearchUtilities.Find("DarkBramble_Body/Sector_DB/Proxy_DB/LOD_DB_VolumeticFog"); MeshFilter MF = fogGO.AddComponent(); MF.mesh = dbFog.GetComponent().mesh; diff --git a/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs b/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs index f4e7e17c..cba3845d 100644 --- a/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs @@ -1,4 +1,5 @@ -using NewHorizons.External.Configs; +using NewHorizons.External.Configs; +using NewHorizons.Utility; using UnityEngine; namespace NewHorizons.Builder.Atmosphere { @@ -6,7 +7,7 @@ namespace NewHorizons.Builder.Atmosphere { private static readonly int FogColor = Shader.PropertyToID("_FogColor"); - public static void Make(GameObject planetGO, PlanetConfig config, float sphereOfInfluence) + public static void Make(GameObject planetGO, OWRigidbody owrb, PlanetConfig config, float sphereOfInfluence) { var innerRadius = config.Base.surfaceSize; @@ -37,7 +38,7 @@ namespace NewHorizons.Builder.Atmosphere EffectRuleset ER = rulesetGO.AddComponent(); ER._type = EffectRuleset.BubbleType.Underwater; - var gdRuleset = GameObject.Find("GiantsDeep_Body/Sector_GD/Volumes_GD/RulesetVolumes_GD").GetComponent(); + var gdRuleset = SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Volumes_GD/RulesetVolumes_GD").GetComponent(); ER._material = gdRuleset._material; @@ -48,6 +49,32 @@ namespace NewHorizons.Builder.Atmosphere } ER._cloudMaterial = cloudMaterial; + if (config.Base.zeroGravityRadius != 0) + { + var zeroGObject = new GameObject("ZeroGVolume"); + zeroGObject.transform.parent = volumesGO.transform; + zeroGObject.transform.localPosition = Vector3.zero; + zeroGObject.transform.localScale = Vector3.one * config.Base.zeroGravityRadius; + zeroGObject.layer = LayerMask.NameToLayer("BasicEffectVolume"); + + var sphereCollider = zeroGObject.AddComponent(); + sphereCollider.radius = 1; + sphereCollider.isTrigger = true; + + var owCollider = zeroGObject.AddComponent(); + owCollider._parentBody = owrb; + owCollider._collider = sphereCollider; + + var triggerVolume = zeroGObject.AddComponent(); + triggerVolume._owCollider = owCollider; + + var zeroGVolume = zeroGObject.AddComponent(); + zeroGVolume._attachedBody = owrb; + zeroGVolume._triggerVolume = triggerVolume; + zeroGVolume._inheritable = true; + zeroGVolume._priority = 1; + } + volumesGO.transform.position = planetGO.transform.position; rulesetGO.SetActive(true); volumesGO.SetActive(true); diff --git a/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs b/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs index 64543600..5e71238f 100644 --- a/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs +++ b/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.External.Configs; +using NewHorizons.External.Configs; using NewHorizons.External.Modules; using NewHorizons.Handlers; using NewHorizons.Utility; @@ -34,7 +34,6 @@ namespace NewHorizons.Builder.Body hasMapMarker = false, surfaceGravity = 1, surfaceSize = size, - hasReferenceFrame = false, gravityFallOff = GravityFallOff.InverseSquared }; @@ -49,6 +48,11 @@ namespace NewHorizons.Builder.Body showOrbitLine = false }; + config.ReferenceFrame = new ReferenceFrameModule() + { + hideInMap = true + }; + config.ProcGen = belt.procGen; if (config.ProcGen == null) { diff --git a/NewHorizons/Builder/Body/CloakBuilder.cs b/NewHorizons/Builder/Body/CloakBuilder.cs index 4debb50a..ab18f6bf 100644 --- a/NewHorizons/Builder/Body/CloakBuilder.cs +++ b/NewHorizons/Builder/Body/CloakBuilder.cs @@ -1,12 +1,30 @@ -using NewHorizons.Components; +using NewHorizons.Components; +using NewHorizons.External.Modules; using NewHorizons.Utility; +using OWML.Common; using UnityEngine; namespace NewHorizons.Builder.Body { public static class CloakBuilder { - public static void Make(GameObject planetGO, Sector sector, OWRigidbody OWRB, float radius) + public static void Make(GameObject planetGO, Sector sector, OWRigidbody OWRB, CloakModule module, bool keepReferenceFrame, IModBehaviour mod) { + var radius = module.radius; + + AudioClip clip = null; + if (module.audioClip != null) clip = SearchUtilities.FindResourceOfTypeAndName(module.audioClip); + else if (module.audioFilePath != null) + { + try + { + clip = AudioUtilities.LoadAudio(mod.ModHelper.Manifest.ModFolderPath + "/" + module.audioFilePath); + } + catch (System.Exception e) + { + Utility.Logger.LogError($"Couldn't load audio file {module.audioFilePath} : {e.Message}"); + } + } + var cloak = SearchUtilities.Find("RingWorld_Body/CloakingField_IP"); var newCloak = GameObject.Instantiate(cloak, sector?.transform ?? planetGO.transform); @@ -29,11 +47,23 @@ namespace NewHorizons.Builder.Body var cloakSectorController = newCloak.AddComponent(); cloakSectorController.Init(newCloak.GetComponent(), planetGO); + var cloakAudioSource = newCloak.GetComponentInChildren(); + cloakAudioSource._audioSource = cloakAudioSource.GetComponent(); + cloakAudioSource._audioLibraryClip = AudioType.None; + cloakAudioSource._clipArrayIndex = 0; + cloakAudioSource._clipArrayLength = 0; + cloakAudioSource._clipSelectionOnPlay = OWAudioSource.ClipSelectionOnPlay.MANUAL; + cloakAudioSource.clip = clip; + newCloak.SetActive(true); cloakFieldController.enabled = true; + cloakSectorController.EnableCloak(); + // To cloak from the start Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(cloakSectorController.OnPlayerExit); + Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(clip != null ? cloakSectorController.TurnOnMusic : cloakSectorController.TurnOffMusic); + Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(keepReferenceFrame ? cloakSectorController.EnableReferenceFrameVolume : cloakSectorController.DisableReferenceFrameVolume); } } } diff --git a/NewHorizons/Builder/Body/CometTailBuilder.cs b/NewHorizons/Builder/Body/CometTailBuilder.cs index be13a836..5980b2d1 100644 --- a/NewHorizons/Builder/Body/CometTailBuilder.cs +++ b/NewHorizons/Builder/Body/CometTailBuilder.cs @@ -1,4 +1,5 @@ -using NewHorizons.External.Configs; +using NewHorizons.External.Configs; +using NewHorizons.Utility; using UnityEngine; namespace NewHorizons.Builder.Body { @@ -6,7 +7,7 @@ namespace NewHorizons.Builder.Body { public static void Make(GameObject planetGO, Sector sector, PlanetConfig config) { - var cometTail = GameObject.Instantiate(GameObject.Find("Comet_Body/Sector_CO/Effects_CO/Effects_CO_TailMeshes"), sector?.transform ?? planetGO.transform); + var cometTail = GameObject.Instantiate(SearchUtilities.Find("Comet_Body/Sector_CO/Effects_CO/Effects_CO_TailMeshes"), sector?.transform ?? planetGO.transform); cometTail.transform.position = planetGO.transform.position; cometTail.name = "CometTail"; cometTail.transform.localScale = Vector3.one * config.Base.surfaceSize / 110; diff --git a/NewHorizons/Builder/Body/FunnelBuilder.cs b/NewHorizons/Builder/Body/FunnelBuilder.cs index 9c54486f..eea69694 100644 --- a/NewHorizons/Builder/Body/FunnelBuilder.cs +++ b/NewHorizons/Builder/Body/FunnelBuilder.cs @@ -1,4 +1,4 @@ -using System.Runtime.Serialization; +using System.Runtime.Serialization; using NewHorizons.Components; using NewHorizons.Utility; using UnityEngine; @@ -43,13 +43,13 @@ namespace NewHorizons.Builder.Body scaleRoot.transform.localPosition = Vector3.zero; scaleRoot.transform.localScale = new Vector3(1, 1, 1); - var proxyGO = GameObject.Instantiate(GameObject.Find("SandFunnel_Body/ScaleRoot/Proxy_SandFunnel"), scaleRoot.transform); + var proxyGO = GameObject.Instantiate(SearchUtilities.Find("SandFunnel_Body/ScaleRoot/Proxy_SandFunnel"), scaleRoot.transform); proxyGO.name = "Proxy_Funnel"; - var geoGO = GameObject.Instantiate(GameObject.Find("SandFunnel_Body/ScaleRoot/Geo_SandFunnel"), scaleRoot.transform); + var geoGO = GameObject.Instantiate(SearchUtilities.Find("SandFunnel_Body/ScaleRoot/Geo_SandFunnel"), scaleRoot.transform); geoGO.name = "Geo_Funnel"; - var volumesGO = GameObject.Instantiate(GameObject.Find("SandFunnel_Body/ScaleRoot/Volumes_SandFunnel"), scaleRoot.transform); + var volumesGO = GameObject.Instantiate(SearchUtilities.Find("SandFunnel_Body/ScaleRoot/Volumes_SandFunnel"), scaleRoot.transform); volumesGO.name = "Volumes_Funnel"; var sfv = volumesGO.GetComponentInChildren(); var fluidVolume = sfv.gameObject; @@ -63,7 +63,7 @@ namespace NewHorizons.Builder.Body GameObject.Destroy(geoGO.transform.Find("Effects_HT_SandColumn/SandColumn_Interior").gameObject); - var waterMaterials = GameObject.Find("TimberHearth_Body/Sector_TH/Geometry_TH/Terrain_TH_Water_v3/Village_Upper_Water/Village_Upper_Water_Geo").GetComponent().materials; + var waterMaterials = SearchUtilities.Find("TimberHearth_Body/Sector_TH/Geometry_TH/Terrain_TH_Water_v3/Village_Upper_Water/Village_Upper_Water_Geo").GetComponent().materials; var materials = new Material[waterMaterials.Length]; for (int i = 0; i < waterMaterials.Length; i++) { @@ -111,7 +111,7 @@ namespace NewHorizons.Builder.Body GameObject.Destroy(geoGO.transform.Find("Effects_HT_SandColumn/SandColumn_Interior").gameObject); - var lavaMaterial = new Material(GameObject.Find("VolcanicMoon_Body/MoltenCore_VM/LavaSphere").GetComponent().material); + var lavaMaterial = new Material(SearchUtilities.Find("VolcanicMoon_Body/MoltenCore_VM/LavaSphere").GetComponent().material); lavaMaterial.mainTextureOffset = new Vector2(0.1f, 0.2f); lavaMaterial.mainTextureScale = new Vector2(1f, 3f); diff --git a/NewHorizons/Builder/Body/GeometryBuilder.cs b/NewHorizons/Builder/Body/GeometryBuilder.cs index dc422e71..fb0fc698 100644 --- a/NewHorizons/Builder/Body/GeometryBuilder.cs +++ b/NewHorizons/Builder/Body/GeometryBuilder.cs @@ -1,4 +1,5 @@ -using UnityEngine; +using UnityEngine; +using NewHorizons.Utility; namespace NewHorizons.Builder.Body { public static class GeometryBuilder @@ -9,7 +10,7 @@ namespace NewHorizons.Builder.Body groundGO.transform.parent = sector?.transform ?? planetGO.transform; groundGO.transform.localScale = new Vector3(groundScale, groundScale, groundScale); groundGO.transform.position = planetGO.transform.position; - groundGO.GetComponent().mesh = GameObject.Find("CloudsTopLayer_GD").GetComponent().mesh; + groundGO.GetComponent().mesh = SearchUtilities.Find("CloudsTopLayer_GD").GetComponent().mesh; groundGO.GetComponent().radius = 1f; groundGO.SetActive(true); } diff --git a/NewHorizons/Builder/Body/HeightMapBuilder.cs b/NewHorizons/Builder/Body/HeightMapBuilder.cs index cf9e359a..50d7c93a 100644 --- a/NewHorizons/Builder/Body/HeightMapBuilder.cs +++ b/NewHorizons/Builder/Body/HeightMapBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Builder.Body.Geometry; +using NewHorizons.Builder.Body.Geometry; using NewHorizons.External.Modules; using NewHorizons.Utility; using OWML.Common; @@ -57,7 +57,8 @@ namespace NewHorizons.Builder.Body var cubeSphereMC = cubeSphere.AddComponent(); cubeSphereMC.sharedMesh = mesh; - if (planetGO.GetComponent() != null) cubeSphere.AddComponent(); + var superGroup = planetGO.GetComponent(); + if (superGroup != null) cubeSphere.AddComponent()._superGroup = superGroup; // Fix rotation in the end cubeSphere.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(90, 0, 0)); diff --git a/NewHorizons/Builder/Body/LavaBuilder.cs b/NewHorizons/Builder/Body/LavaBuilder.cs index ea831506..dc1d4d47 100644 --- a/NewHorizons/Builder/Body/LavaBuilder.cs +++ b/NewHorizons/Builder/Body/LavaBuilder.cs @@ -1,5 +1,6 @@ -using System.Collections.Generic; +using System.Collections.Generic; using UnityEngine; +using NewHorizons.Utility; using NewHorizons.External.Modules.VariableSize; namespace NewHorizons.Builder.Body @@ -28,7 +29,7 @@ namespace NewHorizons.Builder.Body moltenCore.transform.position = planetGO.transform.position; moltenCore.transform.localScale = Vector3.one * module.size; - var lavaSphere = GameObject.Instantiate(GameObject.Find("VolcanicMoon_Body/MoltenCore_VM/LavaSphere"), moltenCore.transform); + var lavaSphere = GameObject.Instantiate(SearchUtilities.Find("VolcanicMoon_Body/MoltenCore_VM/LavaSphere"), moltenCore.transform); lavaSphere.transform.localScale = Vector3.one; lavaSphere.transform.name = "LavaSphere"; lavaSphere.GetComponent().material.SetFloat(HeightScale, heightScale); @@ -37,7 +38,7 @@ namespace NewHorizons.Builder.Body var sectorCullGroup = lavaSphere.GetComponent(); sectorCullGroup.SetSector(sector); - var moltenCoreProxy = GameObject.Instantiate(GameObject.Find("VolcanicMoon_Body/MoltenCore_VM/MoltenCore_Proxy"), moltenCore.transform); ; + var moltenCoreProxy = GameObject.Instantiate(SearchUtilities.Find("VolcanicMoon_Body/MoltenCore_VM/MoltenCore_Proxy"), moltenCore.transform); ; moltenCoreProxy.name = "MoltenCore_Proxy"; var proxyLavaSphere = moltenCoreProxy.transform.Find("LavaSphere (1)"); @@ -50,7 +51,7 @@ namespace NewHorizons.Builder.Body sectorProxy._renderers = new List { proxyLavaSphere.GetComponent() }; sectorProxy.SetSector(sector); - var destructionVolume = GameObject.Instantiate(GameObject.Find("VolcanicMoon_Body/MoltenCore_VM/DestructionVolume"), moltenCore.transform); + var destructionVolume = GameObject.Instantiate(SearchUtilities.Find("VolcanicMoon_Body/MoltenCore_VM/DestructionVolume"), moltenCore.transform); destructionVolume.GetComponent().radius = 1; destructionVolume.SetActive(true); diff --git a/NewHorizons/Builder/Body/ProcGenBuilder.cs b/NewHorizons/Builder/Body/ProcGenBuilder.cs index af13da22..156b6ba6 100644 --- a/NewHorizons/Builder/Body/ProcGenBuilder.cs +++ b/NewHorizons/Builder/Body/ProcGenBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Builder.Body.Geometry; +using NewHorizons.Builder.Body.Geometry; using NewHorizons.External.Modules; using NewHorizons.Utility; using UnityEngine; @@ -16,14 +16,14 @@ namespace NewHorizons.Builder.Body GameObject icosphere = new GameObject("Icosphere"); + icosphere.SetActive(false); icosphere.transform.parent = sector?.transform ?? planetGO.transform; icosphere.transform.rotation = Quaternion.Euler(90, 0, 0); icosphere.transform.position = planetGO.transform.position; Mesh mesh = Icosphere.Build(4, module.scale, module.scale * 1.2f); - icosphere.AddComponent(); - icosphere.GetComponent().mesh = mesh; + icosphere.AddComponent().mesh = mesh; var cubeSphereMR = icosphere.AddComponent(); cubeSphereMR.material = new Material(Shader.Find("Standard")); @@ -33,7 +33,10 @@ namespace NewHorizons.Builder.Body cubeSphereMC.sharedMesh = mesh; icosphere.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(90, 0, 0)); - icosphere.AddComponent(); + var superGroup = planetGO.GetComponent(); + if (superGroup != null) icosphere.AddComponent()._superGroup = superGroup; + + icosphere.SetActive(true); } } } diff --git a/NewHorizons/Builder/Body/ProxyBuilder.cs b/NewHorizons/Builder/Body/ProxyBuilder.cs index fb950a47..aea9a019 100644 --- a/NewHorizons/Builder/Body/ProxyBuilder.cs +++ b/NewHorizons/Builder/Body/ProxyBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Builder.Atmosphere; +using NewHorizons.Builder.Atmosphere; using NewHorizons.Builder.Props; using NewHorizons.Components; using NewHorizons.Components.SizeControllers; @@ -176,7 +176,7 @@ namespace NewHorizons.Builder.Body private static void MakeBlackHole(GameObject rootObject, float size) { - if (_blackHolePrefab == null) _blackHolePrefab = GameObject.Find(_blackHolePath); + if (_blackHolePrefab == null) _blackHolePrefab = SearchUtilities.Find(_blackHolePath); var blackHoleShader = _blackHolePrefab.GetComponent().material.shader; if (blackHoleShader == null) blackHoleShader = _blackHolePrefab.GetComponent().sharedMaterial.shader; @@ -201,7 +201,7 @@ namespace NewHorizons.Builder.Body private static void MakeWhiteHole(GameObject rootObject, float size) { - if (_whiteHolePrefab == null) _whiteHolePrefab = GameObject.Find(_whiteHolePath); + if (_whiteHolePrefab == null) _whiteHolePrefab = SearchUtilities.Find(_whiteHolePath); var whiteHoleShader = _whiteHolePrefab.GetComponent().material.shader; if (whiteHoleShader == null) whiteHoleShader = _whiteHolePrefab.GetComponent().sharedMaterial.shader; diff --git a/NewHorizons/Builder/Body/SandBuilder.cs b/NewHorizons/Builder/Body/SandBuilder.cs index 35de7c8b..43b86ac5 100644 --- a/NewHorizons/Builder/Body/SandBuilder.cs +++ b/NewHorizons/Builder/Body/SandBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Utility; +using NewHorizons.Utility; using UnityEngine; using NewHorizons.External.Modules.VariableSize; @@ -11,7 +11,7 @@ namespace NewHorizons.Builder.Body var sandGO = new GameObject("Sand"); sandGO.SetActive(false); - var sandSphere = GameObject.Instantiate(GameObject.Find("TowerTwin_Body/SandSphere_Draining/SandSphere"), sandGO.transform); + var sandSphere = GameObject.Instantiate(SearchUtilities.Find("TowerTwin_Body/SandSphere_Draining/SandSphere"), sandGO.transform); if (module.tint != null) { var oldMR = sandSphere.GetComponent(); @@ -28,13 +28,13 @@ namespace NewHorizons.Builder.Body sandMR.sharedMaterials[1].color = module.tint.ToColor(); } - var collider = GameObject.Instantiate(GameObject.Find("TowerTwin_Body/SandSphere_Draining/Collider"), sandGO.transform); + var collider = GameObject.Instantiate(SearchUtilities.Find("TowerTwin_Body/SandSphere_Draining/Collider"), sandGO.transform); var sphereCollider = collider.GetComponent(); collider.SetActive(true); - var occlusionSphere = GameObject.Instantiate(GameObject.Find("TowerTwin_Body/SandSphere_Draining/OcclusionSphere"), sandGO.transform); + var occlusionSphere = GameObject.Instantiate(SearchUtilities.Find("TowerTwin_Body/SandSphere_Draining/OcclusionSphere"), sandGO.transform); - var proxyShadowCasterGO = GameObject.Instantiate(GameObject.Find("TowerTwin_Body/SandSphere_Draining/ProxyShadowCaster"), sandGO.transform); + var proxyShadowCasterGO = GameObject.Instantiate(SearchUtilities.Find("TowerTwin_Body/SandSphere_Draining/ProxyShadowCaster"), sandGO.transform); var proxyShadowCaster = proxyShadowCasterGO.GetComponent(); proxyShadowCaster.SetSuperGroup(sandGO.GetComponent()); diff --git a/NewHorizons/Builder/Body/SingularityBuilder.cs b/NewHorizons/Builder/Body/SingularityBuilder.cs index 949041f0..b9a031f6 100644 --- a/NewHorizons/Builder/Body/SingularityBuilder.cs +++ b/NewHorizons/Builder/Body/SingularityBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Components; +using NewHorizons.Components; using NewHorizons.External.Configs; using NewHorizons.Utility; using System; @@ -88,10 +88,10 @@ namespace NewHorizons.Builder.Body blackHoleRender.transform.localScale = Vector3.one * size; var meshFilter = blackHoleRender.AddComponent(); - meshFilter.mesh = GameObject.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleRenderer").GetComponent().mesh; + meshFilter.mesh = SearchUtilities.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleRenderer").GetComponent().mesh; var meshRenderer = blackHoleRender.AddComponent(); - if (blackHoleShader == null) blackHoleShader = GameObject.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleRenderer").GetComponent().sharedMaterial.shader; + if (blackHoleShader == null) blackHoleShader = SearchUtilities.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleRenderer").GetComponent().sharedMaterial.shader; meshRenderer.material = new Material(blackHoleShader); meshRenderer.material.SetFloat(Radius, size * 0.4f); meshRenderer.material.SetFloat(MaxDistortRadius, size * 0.95f); @@ -100,7 +100,7 @@ namespace NewHorizons.Builder.Body if (makeAudio) { - var blackHoleAmbience = GameObject.Instantiate(GameObject.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleAmbience"), blackHole.transform); + var blackHoleAmbience = GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleAmbience"), blackHole.transform); blackHoleAmbience.name = "BlackHoleAmbience"; blackHoleAmbience.GetComponent().SetSector(sector); @@ -109,7 +109,7 @@ namespace NewHorizons.Builder.Body blackHoleAudioSource.minDistance = size * 0.4f; blackHoleAmbience.transform.localPosition = Vector3.zero; - var blackHoleOneShot = GameObject.Instantiate(GameObject.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleEmissionOneShot"), blackHole.transform); + var blackHoleOneShot = GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleEmissionOneShot"), blackHole.transform); var oneShotAudioSource = blackHoleOneShot.GetComponent(); oneShotAudioSource.maxDistance = size * 3f; oneShotAudioSource.minDistance = size * 0.4f; @@ -137,7 +137,7 @@ namespace NewHorizons.Builder.Body } else { - var blackHoleVolume = GameObject.Instantiate(GameObject.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleVolume"), blackHole.transform); + var blackHoleVolume = GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/BlackHole_BH/BlackHoleVolume"), blackHole.transform); blackHoleVolume.name = "BlackHoleVolume"; blackHoleVolume.GetComponent().radius = size * 0.4f; } @@ -159,10 +159,10 @@ namespace NewHorizons.Builder.Body whiteHoleRenderer.transform.localScale = Vector3.one * size * 2.8f; var meshFilter = whiteHoleRenderer.AddComponent(); - meshFilter.mesh = GameObject.Find("WhiteHole_Body/WhiteHoleVisuals/Singularity").GetComponent().mesh; + meshFilter.mesh = SearchUtilities.Find("WhiteHole_Body/WhiteHoleVisuals/Singularity").GetComponent().mesh; var meshRenderer = whiteHoleRenderer.AddComponent(); - if (whiteHoleShader == null) whiteHoleShader = GameObject.Find("WhiteHole_Body/WhiteHoleVisuals/Singularity").GetComponent().sharedMaterial.shader; + if (whiteHoleShader == null) whiteHoleShader = SearchUtilities.Find("WhiteHole_Body/WhiteHoleVisuals/Singularity").GetComponent().sharedMaterial.shader; meshRenderer.material = new Material(whiteHoleShader); meshRenderer.sharedMaterial.SetFloat(Radius, size * 0.4f); meshRenderer.sharedMaterial.SetFloat(DistortFadeDist, size); @@ -170,14 +170,14 @@ namespace NewHorizons.Builder.Body meshRenderer.sharedMaterial.SetFloat(MassScale, -1); meshRenderer.sharedMaterial.SetColor(Color1, new Color(1.88f, 1.88f, 1.88f, 1f)); - var ambientLight = GameObject.Instantiate(GameObject.Find("WhiteHole_Body/WhiteHoleVisuals/AmbientLight_WH")); + var ambientLight = GameObject.Instantiate(SearchUtilities.Find("WhiteHole_Body/WhiteHoleVisuals/AmbientLight_WH")); ambientLight.transform.parent = whiteHole.transform; ambientLight.transform.localScale = Vector3.one; ambientLight.transform.localPosition = Vector3.zero; ambientLight.name = "AmbientLight"; ambientLight.GetComponent().range = size * 7f; - GameObject whiteHoleVolumeGO = GameObject.Instantiate(GameObject.Find("WhiteHole_Body/WhiteHoleVolume")); + GameObject whiteHoleVolumeGO = GameObject.Instantiate(SearchUtilities.Find("WhiteHole_Body/WhiteHoleVolume")); whiteHoleVolumeGO.transform.parent = whiteHole.transform; whiteHoleVolumeGO.transform.localPosition = Vector3.zero; whiteHoleVolumeGO.transform.localScale = Vector3.one; @@ -205,13 +205,13 @@ namespace NewHorizons.Builder.Body if (makeZeroGVolume) { - var zeroGVolume = GameObject.Instantiate(GameObject.Find("WhiteHole_Body/ZeroGVolume"), whiteHole.transform); + var zeroGVolume = GameObject.Instantiate(SearchUtilities.Find("WhiteHole_Body/ZeroGVolume"), whiteHole.transform); zeroGVolume.name = "ZeroGVolume"; zeroGVolume.transform.localPosition = Vector3.zero; zeroGVolume.GetComponent().radius = size * 10f; zeroGVolume.GetComponent()._attachedBody = OWRB; - var rulesetVolume = GameObject.Instantiate(GameObject.Find("WhiteHole_Body/Sector_WhiteHole/RulesetVolumes_WhiteHole"), planetGO.transform); + var rulesetVolume = GameObject.Instantiate(SearchUtilities.Find("WhiteHole_Body/Sector_WhiteHole/RulesetVolumes_WhiteHole"), planetGO.transform); rulesetVolume.name = "RulesetVolume"; rulesetVolume.transform.localPosition = Vector3.zero; rulesetVolume.transform.localScale = Vector3.one * size / 100f; diff --git a/NewHorizons/Builder/Body/StarBuilder.cs b/NewHorizons/Builder/Body/StarBuilder.cs index e51341ef..d50ae5c7 100644 --- a/NewHorizons/Builder/Body/StarBuilder.cs +++ b/NewHorizons/Builder/Body/StarBuilder.cs @@ -23,7 +23,7 @@ namespace NewHorizons.Builder.Body { var starGO = MakeStarGraphics(planetGO, sector, starModule); - var sunAudio = Object.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Audio_SUN"), starGO.transform); + var sunAudio = Object.Instantiate(SearchUtilities.Find("Sun_Body/Sector_SUN/Audio_SUN"), starGO.transform); sunAudio.transform.localPosition = Vector3.zero; sunAudio.transform.localScale = Vector3.one; sunAudio.transform.Find("SurfaceAudio_Sun").GetComponent().maxDistance = starModule.size * 2f; @@ -36,7 +36,7 @@ namespace NewHorizons.Builder.Body GameObject sunAtmosphere = null; if (starModule.hasAtmosphere) { - sunAtmosphere = Object.Instantiate(GameObject.Find("Sun_Body/Atmosphere_SUN"), starGO.transform); + sunAtmosphere = Object.Instantiate(SearchUtilities.Find("Sun_Body/Atmosphere_SUN"), starGO.transform); sunAtmosphere.transform.position = planetGO.transform.position; sunAtmosphere.transform.localScale = Vector3.one * OuterRadiusRatio; sunAtmosphere.name = "Atmosphere_Star"; @@ -59,17 +59,17 @@ namespace NewHorizons.Builder.Body fog.lodFadeDistance = fog.fogRadius * (StarBuilder.OuterRadiusRatio - 1f); } - var ambientLightGO = Object.Instantiate(GameObject.Find("Sun_Body/AmbientLight_SUN"), starGO.transform); + var ambientLightGO = Object.Instantiate(SearchUtilities.Find("Sun_Body/AmbientLight_SUN"), starGO.transform); ambientLightGO.transform.localPosition = Vector3.zero; ambientLightGO.name = "AmbientLight_Star"; - var heatVolume = Object.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Volumes_SUN/HeatVolume"), starGO.transform); + var heatVolume = Object.Instantiate(SearchUtilities.Find("Sun_Body/Sector_SUN/Volumes_SUN/HeatVolume"), starGO.transform); heatVolume.transform.localPosition = Vector3.zero; heatVolume.transform.localScale = Vector3.one; heatVolume.GetComponent().radius = 1f; heatVolume.name = "HeatVolume"; - var deathVolume = Object.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Volumes_SUN/ScaledVolumesRoot/DestructionFluidVolume"), starGO.transform); + var deathVolume = Object.Instantiate(SearchUtilities.Find("Sun_Body/Sector_SUN/Volumes_SUN/ScaledVolumesRoot/DestructionFluidVolume"), starGO.transform); deathVolume.transform.localPosition = Vector3.zero; deathVolume.transform.localScale = Vector3.one; deathVolume.GetComponent().radius = 1f; @@ -85,8 +85,9 @@ namespace NewHorizons.Builder.Body sunLight.transform.localScale = Vector3.one; var light = sunLight.AddComponent(); - light.CopyPropertiesFrom(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); + light.CopyPropertiesFrom(SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); light.intensity *= starModule.solarLuminosity; + light.range = starModule.lightRadius; light.range *= Mathf.Sqrt(starModule.solarLuminosity); Color lightColour = light.color; @@ -96,12 +97,12 @@ namespace NewHorizons.Builder.Body ambientLight.color = lightColour; var faceActiveCamera = sunLight.AddComponent(); - faceActiveCamera.CopyPropertiesFrom(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); + faceActiveCamera.CopyPropertiesFrom(SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); var csmTextureCacher = sunLight.AddComponent(); - csmTextureCacher.CopyPropertiesFrom(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); + csmTextureCacher.CopyPropertiesFrom(SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); csmTextureCacher._light = light; var proxyShadowLight = sunLight.AddComponent(); - proxyShadowLight.CopyPropertiesFrom(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); + proxyShadowLight.CopyPropertiesFrom(SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); proxyShadowLight._light = light; StarController starController = null; @@ -133,11 +134,12 @@ namespace NewHorizons.Builder.Body // It fucking insists on this existing and its really annoying var supernovaVolume = new GameObject("SupernovaVolumePlaceholder"); supernovaVolume.transform.SetParent(starGO.transform); - supernova._supernovaVolume = supernovaVolume.AddComponent(); + supernovaVolume.layer = LayerMask.NameToLayer("BasicEffectVolume"); var sphere = supernovaVolume.AddComponent(); sphere.radius = 0f; sphere.isTrigger = true; supernovaVolume.AddComponent(); + supernova._supernovaVolume = supernovaVolume.AddComponent(); return starController; } @@ -148,6 +150,8 @@ namespace NewHorizons.Builder.Body var supernova = MakeSupernova(starGO, starModule); + supernova._belongsToProxySun = true; + starGO.SetActive(false); var controller = starGO.AddComponent(); if (starModule.curve != null) controller.scaleCurve = starModule.GetAnimationCurve(); @@ -170,12 +174,12 @@ namespace NewHorizons.Builder.Body var starGO = new GameObject("Star"); starGO.transform.parent = sector?.transform ?? rootObject.transform; - var sunSurface = Object.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Geometry_SUN/Surface"), starGO.transform); + var sunSurface = Object.Instantiate(SearchUtilities.Find("Sun_Body/Sector_SUN/Geometry_SUN/Surface"), starGO.transform); sunSurface.transform.position = rootObject.transform.position; sunSurface.transform.localScale = Vector3.one; sunSurface.name = "Surface"; - var solarFlareEmitter = Object.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SolarFlareEmitter"), starGO.transform); + var solarFlareEmitter = Object.Instantiate(SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SolarFlareEmitter"), starGO.transform); solarFlareEmitter.transform.localPosition = Vector3.zero; solarFlareEmitter.transform.localScale = Vector3.one; solarFlareEmitter.name = "SolarFlareEmitter"; @@ -202,7 +206,7 @@ namespace NewHorizons.Builder.Body var colour = starModule.tint.ToColor(); - var sun = GameObject.Find("Sun_Body"); + var sun = SearchUtilities.Find("Sun_Body"); var mainSequenceMaterial = sun.GetComponent()._startSurfaceMaterial; var giantMaterial = sun.GetComponent()._endSurfaceMaterial; @@ -228,7 +232,7 @@ namespace NewHorizons.Builder.Body private static SupernovaEffectController MakeSupernova(GameObject starGO, StarModule starModule) { - var supernovaGO = GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/Supernova").InstantiateInactive(); + var supernovaGO = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/Supernova").InstantiateInactive(); supernovaGO.transform.SetParent(starGO.transform); supernovaGO.transform.localPosition = Vector3.zero; diff --git a/NewHorizons/Builder/Body/WaterBuilder.cs b/NewHorizons/Builder/Body/WaterBuilder.cs index 5780e638..fdb85ec8 100644 --- a/NewHorizons/Builder/Body/WaterBuilder.cs +++ b/NewHorizons/Builder/Body/WaterBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Components; +using NewHorizons.Components; using NewHorizons.Components.SizeControllers; using NewHorizons.Utility; using UnityEngine; @@ -19,7 +19,7 @@ namespace NewHorizons.Builder.Body waterGO.transform.parent = sector?.transform ?? planetGO.transform; waterGO.transform.localScale = new Vector3(waterSize, waterSize, waterSize); - var GDTSR = GameObject.Find("Ocean_GD").GetComponent(); + var GDTSR = SearchUtilities.Find("Ocean_GD").GetComponent(); TessellatedSphereRenderer TSR = waterGO.AddComponent(); TSR.tessellationMeshGroup = ScriptableObject.CreateInstance(); @@ -30,7 +30,7 @@ namespace NewHorizons.Builder.Body TSR.tessellationMeshGroup.variants[i] = mesh; } - var GDSharedMaterials = GameObject.Find("Ocean_GD").GetComponent()._lowAltitudeMaterials; + var GDSharedMaterials = SearchUtilities.Find("Ocean_GD").GetComponent()._lowAltitudeMaterials; var tempArray = new Material[GDSharedMaterials.Length]; for (int i = 0; i < GDSharedMaterials.Length; i++) { @@ -87,7 +87,7 @@ namespace NewHorizons.Builder.Body fluidVolume._radius = waterSize; fluidVolume._layer = LayerMask.NameToLayer("BasicEffectVolume"); - var fogGO = GameObject.Instantiate(GameObject.Find("GiantsDeep_Body/Sector_GD/Sector_GDInterior/Effects_GDInterior/OceanFog"), waterGO.transform); + var fogGO = GameObject.Instantiate(SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Sector_GDInterior/Effects_GDInterior/OceanFog"), waterGO.transform); fogGO.name = "OceanFog"; fogGO.transform.localPosition = Vector3.zero; fogGO.transform.localScale = Vector3.one; diff --git a/NewHorizons/Builder/General/AmbientLightBuilder.cs b/NewHorizons/Builder/General/AmbientLightBuilder.cs index 6ad20aaf..c51f90c0 100644 --- a/NewHorizons/Builder/General/AmbientLightBuilder.cs +++ b/NewHorizons/Builder/General/AmbientLightBuilder.cs @@ -1,11 +1,12 @@ -using UnityEngine; +using UnityEngine; +using NewHorizons.Utility; namespace NewHorizons.Builder.General { public static class AmbientLightBuilder { public static void Make(GameObject planetGO, Sector sector, float scale, float intensity) { - GameObject lightGO = GameObject.Instantiate(GameObject.Find("BrittleHollow_Body/AmbientLight_BH_Surface"), sector?.transform ?? planetGO.transform); + GameObject lightGO = GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/AmbientLight_BH_Surface"), sector?.transform ?? planetGO.transform); lightGO.transform.position = planetGO.transform.position; lightGO.name = "Light"; diff --git a/NewHorizons/Builder/General/DetectorBuilder.cs b/NewHorizons/Builder/General/DetectorBuilder.cs index d71c30b4..3f47e8bb 100644 --- a/NewHorizons/Builder/General/DetectorBuilder.cs +++ b/NewHorizons/Builder/General/DetectorBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Components.Orbital; +using NewHorizons.Components.Orbital; using NewHorizons.External.Configs; using UnityEngine; using Logger = NewHorizons.Utility.Logger; @@ -31,6 +31,8 @@ namespace NewHorizons.Builder.General fluidDetector._collider = sphereCollider; + OWRB.RegisterAttachedFluidDetector(fluidDetector); + // Could copy the splash from the interloper as well some day } diff --git a/NewHorizons/Builder/General/GravityBuilder.cs b/NewHorizons/Builder/General/GravityBuilder.cs index 067a1a75..95f8a886 100644 --- a/NewHorizons/Builder/General/GravityBuilder.cs +++ b/NewHorizons/Builder/General/GravityBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.External.Configs; +using NewHorizons.External.Configs; using NewHorizons.External.Modules; using UnityEngine; using Logger = NewHorizons.Utility.Logger; @@ -6,7 +6,7 @@ namespace NewHorizons.Builder.General { public static class GravityBuilder { - public static GravityVolume Make(GameObject planetGO, AstroObject ao, PlanetConfig config) + public static GravityVolume Make(GameObject planetGO, AstroObject ao, OWRigidbody owrb, PlanetConfig config) { var exponent = config.Base.gravityFallOff == GravityFallOff.Linear ? 1f : 2f; var GM = config.Base.surfaceGravity * Mathf.Pow(config.Base.surfaceSize, exponent); @@ -60,6 +60,7 @@ namespace NewHorizons.Builder.General gravityGO.SetActive(true); ao._gravityVolume = gravityVolume; + owrb.RegisterAttachedGravityVolume(gravityVolume); return gravityVolume; } diff --git a/NewHorizons/Builder/General/RFVolumeBuilder.cs b/NewHorizons/Builder/General/RFVolumeBuilder.cs index 892aae9a..178234e4 100644 --- a/NewHorizons/Builder/General/RFVolumeBuilder.cs +++ b/NewHorizons/Builder/General/RFVolumeBuilder.cs @@ -1,10 +1,11 @@ -using NewHorizons.External.Configs; +using NewHorizons.External.Configs; +using NewHorizons.External.Modules; using UnityEngine; namespace NewHorizons.Builder.General { public static class RFVolumeBuilder { - public static void Make(GameObject planetGO, OWRigidbody owRigidBody, float sphereOfInfluence) + public static void Make(GameObject planetGO, OWRigidbody owrb, float sphereOfInfluence, ReferenceFrameModule module) { var rfGO = new GameObject("RFVolume"); rfGO.transform.parent = planetGO.transform; @@ -18,8 +19,10 @@ namespace NewHorizons.Builder.General var RFV = rfGO.AddComponent(); - var RV = new ReferenceFrame(owRigidBody); - RV._minSuitTargetDistance = sphereOfInfluence; + var minTargetDistance = module.targetWhenClose ? 0 : sphereOfInfluence; + + var RV = new ReferenceFrame(owrb); + RV._minSuitTargetDistance = minTargetDistance; RV._maxTargetDistance = 0; RV._autopilotArrivalDistance = 2.0f * sphereOfInfluence; RV._autoAlignmentDistance = sphereOfInfluence * 1.5f; @@ -28,15 +31,17 @@ namespace NewHorizons.Builder.General RV._matchAngularVelocity = true; RV._minMatchAngularVelocityDistance = 70; RV._maxMatchAngularVelocityDistance = 400; - RV._bracketsRadius = sphereOfInfluence; + RV._bracketsRadius = module.bracketRadius > -1 ? module.bracketRadius : sphereOfInfluence; RFV._referenceFrame = RV; - RFV._minColliderRadius = sphereOfInfluence; - RFV._maxColliderRadius = sphereOfInfluence * 2f; + RFV._minColliderRadius = minTargetDistance; + RFV._maxColliderRadius = module.maxTargetDistance > -1 ? module.maxTargetDistance : sphereOfInfluence * 2f; RFV._isPrimaryVolume = true; RFV._isCloseRangeVolume = false; - rfGO.SetActive(true); + owrb.SetAttachedReferenceFrameVolume(RFV); + + rfGO.SetActive(!module.hideInMap); } } } diff --git a/NewHorizons/Builder/General/RigidBodyBuilder.cs b/NewHorizons/Builder/General/RigidBodyBuilder.cs index f6672314..d016f469 100644 --- a/NewHorizons/Builder/General/RigidBodyBuilder.cs +++ b/NewHorizons/Builder/General/RigidBodyBuilder.cs @@ -1,4 +1,5 @@ -using NewHorizons.External.Configs; +using NewHorizons.External.Configs; +using NewHorizons.Utility; using UnityEngine; namespace NewHorizons.Builder.General { @@ -18,7 +19,6 @@ namespace NewHorizons.Builder.General rigidBody.collisionDetectionMode = CollisionDetectionMode.Discrete; KinematicRigidbody kinematicRigidBody = body.AddComponent(); - kinematicRigidBody.centerOfMass = Vector3.zero; OWRigidbody owRigidBody = body.AddComponent(); owRigidBody._kinematicSimulation = true; @@ -27,7 +27,7 @@ namespace NewHorizons.Builder.General owRigidBody._maintainOriginalCenterOfMass = true; owRigidBody._rigidbody = rigidBody; owRigidBody._kinematicRigidbody = kinematicRigidBody; - owRigidBody._origParent = GameObject.Find("SolarSystemRoot").transform; + owRigidBody._origParent = SearchUtilities.Find("SolarSystemRoot").transform; owRigidBody.EnableKinematicSimulation(); owRigidBody.MakeKinematic(); diff --git a/NewHorizons/Builder/General/SectorBuilder.cs b/NewHorizons/Builder/General/SectorBuilder.cs index ff10fb97..8093b429 100644 --- a/NewHorizons/Builder/General/SectorBuilder.cs +++ b/NewHorizons/Builder/General/SectorBuilder.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using UnityEngine; namespace NewHorizons.Builder.General { @@ -27,6 +27,7 @@ namespace NewHorizons.Builder.General S._subsectors = new List(); sectorGO.SetActive(true); + S.enabled = true; return S; } diff --git a/NewHorizons/Builder/General/SpawnPointBuilder.cs b/NewHorizons/Builder/General/SpawnPointBuilder.cs index 05f6d7a4..8c26fd9c 100644 --- a/NewHorizons/Builder/General/SpawnPointBuilder.cs +++ b/NewHorizons/Builder/General/SpawnPointBuilder.cs @@ -1,4 +1,5 @@ -using NewHorizons.External.Modules; +using NewHorizons.External.Modules; +using NewHorizons.Utility; using UnityEngine; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.General @@ -18,8 +19,9 @@ namespace NewHorizons.Builder.General spawnGO.transform.localPosition = module.playerSpawnPoint; playerSpawn = spawnGO.AddComponent(); - - if(module.playerSpawnRotation != null) + playerSpawn._triggerVolumes = new OWTriggerVolume[0]; + + if (module.playerSpawnRotation != null) { spawnGO.transform.rotation = Quaternion.Euler(module.playerSpawnRotation); } @@ -40,8 +42,9 @@ namespace NewHorizons.Builder.General var spawnPoint = spawnGO.AddComponent(); spawnPoint._isShipSpawn = true; + spawnPoint._triggerVolumes = new OWTriggerVolume[0]; - var ship = GameObject.Find("Ship_Body"); + var ship = SearchUtilities.Find("Ship_Body"); ship.transform.position = spawnPoint.transform.position; if(module.shipSpawnRotation != null) @@ -67,6 +70,7 @@ namespace NewHorizons.Builder.General playerSpawnGO.transform.localPosition = new Vector3(0, 0, 0); playerSpawn = playerSpawnGO.AddComponent(); + playerSpawn._triggerVolumes = new OWTriggerVolume[0]; playerSpawnGO.transform.localRotation = Quaternion.Euler(0, 0, 0); } } @@ -89,7 +93,7 @@ namespace NewHorizons.Builder.General Locator.GetPlayerTransform().GetComponent().SuitUp(false, true, true); // Make the ship act as if the player took the suit - var spv = GameObject.Find("Ship_Body/Module_Supplies/Systems_Supplies/ExpeditionGear")?.GetComponent(); + var spv = SearchUtilities.Find("Ship_Body/Module_Supplies/Systems_Supplies/ExpeditionGear")?.GetComponent(); if (spv == null) return; diff --git a/NewHorizons/Builder/Orbital/FocalPointBuilder.cs b/NewHorizons/Builder/Orbital/FocalPointBuilder.cs index c217664e..98a51bd9 100644 --- a/NewHorizons/Builder/Orbital/FocalPointBuilder.cs +++ b/NewHorizons/Builder/Orbital/FocalPointBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Components.Orbital; +using NewHorizons.Components.Orbital; using NewHorizons.External.Configs; using NewHorizons.External.Modules; using NewHorizons.Handlers; @@ -59,7 +59,7 @@ namespace NewHorizons.Builder.Orbital fakeMassConfig.name = config.name + "_FakeBarycenterMass"; fakeMassConfig.Base.sphereOfInfluence = 0; fakeMassConfig.Base.hasMapMarker = false; - fakeMassConfig.Base.hasReferenceFrame = false; + fakeMassConfig.ReferenceFrame.hideInMap = true; fakeMassConfig.Orbit = new OrbitModule(); fakeMassConfig.Orbit.CopyPropertiesFrom(config.Orbit); diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 490c2c69..f66a4c06 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -62,6 +62,11 @@ namespace NewHorizons.Builder.Props detailGO = newDetailGO; } + if (detail.rename != null) + { + detailGO.name = detail.rename; + } + detailInfoToCorrespondingSpawnedGameObject[detail] = detailGO; } @@ -145,7 +150,7 @@ namespace NewHorizons.Builder.Props { torchItem.enabled = true; torchItem.mindProjectorTrigger.enabled = true; - torchItem.mindSlideProjector._mindProjectorImageEffect = GameObject.Find("Player_Body/PlayerCamera").GetComponent(); + torchItem.mindSlideProjector._mindProjectorImageEffect = SearchUtilities.Find("Player_Body/PlayerCamera").GetComponent(); } // fix campfires @@ -178,6 +183,7 @@ namespace NewHorizons.Builder.Props { try { + 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; @@ -200,7 +206,7 @@ namespace NewHorizons.Builder.Props } catch (Exception e) { - Logger.LogWarning($"Exception when modifying component [{component.GetType().Name}] on [{planetGO.name}] : {e.Message}, {e.StackTrace}"); + Logger.LogWarning($"Exception when modifying component [{component.GetType().Name}] on [{planetGO.name}] for prop [{prefab.name}] : {e.GetType().FullName} {e.Message} {e.StackTrace}"); } }); } diff --git a/NewHorizons/Builder/Props/GeyserBuilder.cs b/NewHorizons/Builder/Props/GeyserBuilder.cs index bd177925..6cb77acb 100644 --- a/NewHorizons/Builder/Props/GeyserBuilder.cs +++ b/NewHorizons/Builder/Props/GeyserBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.External.Modules; +using NewHorizons.External.Modules; using NewHorizons.Utility; using UnityEngine; namespace NewHorizons.Builder.Props @@ -7,7 +7,7 @@ namespace NewHorizons.Builder.Props { public static void Make(GameObject planetGO, Sector sector, PropModule.GeyserInfo info) { - var original = GameObject.Find("TimberHearth_Body/Sector_TH/Interactables_TH/Geysers/Geyser_Village"); + var original = SearchUtilities.Find("TimberHearth_Body/Sector_TH/Interactables_TH/Geysers/Geyser_Village"); GameObject geyserGO = original.InstantiateInactive(); geyserGO.transform.parent = sector?.transform ?? planetGO.transform; geyserGO.name = "Geyser"; diff --git a/NewHorizons/Builder/Props/NomaiTextBuilder.cs b/NewHorizons/Builder/Props/NomaiTextBuilder.cs index 06f7202a..bc9acf4a 100644 --- a/NewHorizons/Builder/Props/NomaiTextBuilder.cs +++ b/NewHorizons/Builder/Props/NomaiTextBuilder.cs @@ -67,18 +67,18 @@ namespace NewHorizons.Builder.Props _ghostArcPrefabs.Add(arc); } - _scrollPrefab = GameObject.Find("BrittleHollow_Body/Sector_BH/Sector_NorthHemisphere/Sector_NorthPole/Sector_HangingCity/Sector_HangingCity_District2/Interactables_HangingCity_District2/Prefab_NOM_Scroll").InstantiateInactive(); + _scrollPrefab = SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_NorthHemisphere/Sector_NorthPole/Sector_HangingCity/Sector_HangingCity_District2/Interactables_HangingCity_District2/Prefab_NOM_Scroll").InstantiateInactive(); _scrollPrefab.name = "Prefab_NOM_Scroll"; - _computerPrefab = GameObject.Find("VolcanicMoon_Body/Sector_VM/Interactables_VM/Prefab_NOM_Computer").InstantiateInactive(); + _computerPrefab = SearchUtilities.Find("VolcanicMoon_Body/Sector_VM/Interactables_VM/Prefab_NOM_Computer").InstantiateInactive(); _computerPrefab.name = "Prefab_NOM_Computer"; _computerPrefab.transform.rotation = Quaternion.identity; - _cairnPrefab = GameObject.Find("BrittleHollow_Body/Sector_BH/Sector_Crossroads/Interactables_Crossroads/Trailmarkers/Prefab_NOM_BH_Cairn_Arc (1)").InstantiateInactive(); + _cairnPrefab = SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_Crossroads/Interactables_Crossroads/Trailmarkers/Prefab_NOM_BH_Cairn_Arc (1)").InstantiateInactive(); _cairnPrefab.name = "Prefab_NOM_Cairn"; _cairnPrefab.transform.rotation = Quaternion.identity; - _recorderPrefab = GameObject.Find("Comet_Body/Prefab_NOM_Shuttle/Sector_NomaiShuttleInterior/Interactibles_NomaiShuttleInterior/Prefab_NOM_Recorder").InstantiateInactive(); + _recorderPrefab = SearchUtilities.Find("Comet_Body/Prefab_NOM_Shuttle/Sector_NomaiShuttleInterior/Interactibles_NomaiShuttleInterior/Prefab_NOM_Recorder").InstantiateInactive(); _recorderPrefab.name = "Prefab_NOM_Recorder"; _recorderPrefab.transform.rotation = Quaternion.identity; } diff --git a/NewHorizons/Builder/Props/ProjectionBuilder.cs b/NewHorizons/Builder/Props/ProjectionBuilder.cs index 8862da5a..4a9f1bb7 100644 --- a/NewHorizons/Builder/Props/ProjectionBuilder.cs +++ b/NewHorizons/Builder/Props/ProjectionBuilder.cs @@ -41,7 +41,7 @@ namespace NewHorizons.Builder.Props { 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 = SearchUtilities.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?"); @@ -139,7 +139,7 @@ namespace NewHorizons.Builder.Props { 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 = SearchUtilities.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?"); @@ -261,7 +261,7 @@ namespace NewHorizons.Builder.Props // var mindSlideProjector = standingTorch.GetComponent(); - mindSlideProjector._mindProjectorImageEffect = GameObject.Find("Player_Body/PlayerCamera").GetComponent(); + mindSlideProjector._mindProjectorImageEffect = SearchUtilities.Find("Player_Body/PlayerCamera").GetComponent(); // setup for visually supporting async texture loading mindSlideProjector.enabled = false; diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index f3293eaa..89307795 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.External.Configs; +using NewHorizons.External.Configs; using NewHorizons.External.Modules; using NewHorizons.Utility; using OWML.Common; @@ -44,7 +44,7 @@ namespace NewHorizons.Builder.Props GameObject prefab; if (propInfo.assetBundle != null) prefab = AssetBundleUtilities.LoadPrefab(propInfo.assetBundle, propInfo.path, mod); - else prefab = GameObject.Find(propInfo.path); + else prefab = SearchUtilities.Find(propInfo.path); for (int i = 0; i < propInfo.count; i++) { var randomInd = (int)Random.Range(0, points.Count - 1); diff --git a/NewHorizons/Builder/Props/SignalBuilder.cs b/NewHorizons/Builder/Props/SignalBuilder.cs index 7f38857e..097ea6cb 100644 --- a/NewHorizons/Builder/Props/SignalBuilder.cs +++ b/NewHorizons/Builder/Props/SignalBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Components; +using NewHorizons.Components; using NewHorizons.External.Modules; using NewHorizons.Utility; using OWML.Common; @@ -192,7 +192,7 @@ namespace NewHorizons.Builder.Props source.rolloffMode = AudioRolloffMode.Custom; if (_customCurve == null) - _customCurve = GameObject.Find("Moon_Body/Sector_THM/Characters_THM/Villager_HEA_Esker/Signal_Whistling").GetComponent().GetCustomCurve(AudioSourceCurveType.CustomRolloff); + _customCurve = SearchUtilities.Find("Moon_Body/Sector_THM/Characters_THM/Villager_HEA_Esker/Signal_Whistling").GetComponent().GetCustomCurve(AudioSourceCurveType.CustomRolloff); source.SetCustomCurve(AudioSourceCurveType.CustomRolloff, _customCurve); // If it can be heard regularly then we play it immediately diff --git a/NewHorizons/Builder/Props/TornadoBuilder.cs b/NewHorizons/Builder/Props/TornadoBuilder.cs index 730790b5..34c21494 100644 --- a/NewHorizons/Builder/Props/TornadoBuilder.cs +++ b/NewHorizons/Builder/Props/TornadoBuilder.cs @@ -26,17 +26,17 @@ namespace NewHorizons.Builder.Props { if (_upPrefab == null) { - _upPrefab = GameObject.Find("BrittleHollow_Body/Sector_BH/Sector_SouthHemisphere/Sector_SouthPole/Sector_Observatory/Interactables_Observatory/MockUpTornado").InstantiateInactive(); + _upPrefab = SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_SouthHemisphere/Sector_SouthPole/Sector_Observatory/Interactables_Observatory/MockUpTornado").InstantiateInactive(); _upPrefab.name = "Tornado_Up_Prefab"; } if (_downPrefab == null) { - _downPrefab = GameObject.Find("BrittleHollow_Body/Sector_BH/Sector_SouthHemisphere/Sector_SouthPole/Sector_Observatory/Interactables_Observatory/MockDownTornado").InstantiateInactive(); + _downPrefab = SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_SouthHemisphere/Sector_SouthPole/Sector_Observatory/Interactables_Observatory/MockDownTornado").InstantiateInactive(); _downPrefab.name = "Tornado_Down_Prefab"; } if (_hurricanePrefab == null) { - _hurricanePrefab = GameObject.Find("GiantsDeep_Body/Sector_GD/Sector_GDInterior/Tornadoes_GDInterior/Hurricane/").InstantiateInactive(); + _hurricanePrefab = SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Sector_GDInterior/Tornadoes_GDInterior/Hurricane/").InstantiateInactive(); // For some reason they put the hurricane at the origin and offset all its children (450) // Increasing by 40 will keep the bottom above the ground foreach (Transform child in _hurricanePrefab.transform) @@ -50,7 +50,7 @@ namespace NewHorizons.Builder.Props } if (_soundPrefab == null) { - _soundPrefab = GameObject.Find("GiantsDeep_Body/Sector_GD/Sector_GDInterior/Tornadoes_GDInterior/SouthernTornadoes/DownTornado_Pivot/DownTornado/AudioRail").InstantiateInactive(); + _soundPrefab = SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Sector_GDInterior/Tornadoes_GDInterior/SouthernTornadoes/DownTornado_Pivot/DownTornado/AudioRail").InstantiateInactive(); _soundPrefab.name = "AudioRail_Prefab"; } if (_mainTexture == null) diff --git a/NewHorizons/Builder/Props/VolcanoBuilder.cs b/NewHorizons/Builder/Props/VolcanoBuilder.cs index a9e04b51..48f5fa99 100644 --- a/NewHorizons/Builder/Props/VolcanoBuilder.cs +++ b/NewHorizons/Builder/Props/VolcanoBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.External.Modules; +using NewHorizons.External.Modules; using NewHorizons.Utility; using UnityEngine; namespace NewHorizons.Builder.Props @@ -12,7 +12,7 @@ namespace NewHorizons.Builder.Props public static void Make(GameObject planetGO, Sector sector, PropModule.VolcanoInfo info) { - var prefab = GameObject.Find("VolcanicMoon_Body/Sector_VM/Effects_VM/VolcanoPivot (2)/MeteorLauncher"); + var prefab = SearchUtilities.Find("VolcanicMoon_Body/Sector_VM/Effects_VM/VolcanoPivot (2)/MeteorLauncher"); var launcherGO = prefab.InstantiateInactive(); launcherGO.transform.parent = sector.transform; diff --git a/NewHorizons/Builder/ShipLog/MapModeBuilder.cs b/NewHorizons/Builder/ShipLog/MapModeBuilder.cs index 8b007aa3..157ff721 100644 --- a/NewHorizons/Builder/ShipLog/MapModeBuilder.cs +++ b/NewHorizons/Builder/ShipLog/MapModeBuilder.cs @@ -1,4 +1,4 @@ -using NewHorizons.Components; +using NewHorizons.Components; using NewHorizons.External.Modules; using NewHorizons.Handlers; using NewHorizons.Utility; @@ -16,7 +16,7 @@ namespace NewHorizons.Builder.ShipLog #region General public static ShipLogAstroObject[][] ConstructMapMode(string systemName, GameObject transformParent, ShipLogAstroObject[][] currentNav, int layer) { - Material greyScaleMaterial = GameObject.Find(ShipLogHandler.PAN_ROOT_PATH + "/TimberHearth/Sprite").GetComponent().material; + Material greyScaleMaterial = SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH + "/TimberHearth/Sprite").GetComponent().material; List bodies = Main.BodyDict[systemName].Where( b => !(b.Config.ShipLog?.mapMode?.remove ?? false) && !b.Config.isQuantumState ).ToList(); @@ -99,6 +99,8 @@ namespace NewHorizons.Builder.ShipLog { const float unviewedIconOffset = 15; + Logger.Log($"Adding ship log astro object for {body.Config.name}"); + GameObject unviewedReference = SearchUtilities.CachedFind(ShipLogHandler.PAN_ROOT_PATH + "/TimberHearth/UnviewedIcon"); ShipLogAstroObject astroObject = gameObject.AddComponent(); @@ -235,6 +237,12 @@ namespace NewHorizons.Builder.ShipLog { GameObject newMapModeGO = CreateMapModeGameObject(body, transformParent, layer, body.Config.ShipLog?.mapMode?.manualPosition); ShipLogAstroObject newAstroObject = AddShipLogAstroObject(newMapModeGO, body, greyScaleMaterial, layer); + if (body.Config.FocalPoint != null) + { + newAstroObject._imageObj.GetComponent().enabled = false; + newAstroObject._outlineObj.GetComponent().enabled = false; + newAstroObject._unviewedObj.GetComponent().enabled = false; + } MakeDetails(body, newMapModeGO.transform, greyScaleMaterial); Vector2 navigationPosition = body.Config.ShipLog?.mapMode?.manualNavigationPosition; navMatrix[(int)navigationPosition.y][(int)navigationPosition.x] = newAstroObject; @@ -251,12 +259,12 @@ namespace NewHorizons.Builder.ShipLog navMatrix[navIndex[0]][navIndex[1]] = null; if (astroObject.GetID() == "CAVE_TWIN" || astroObject.GetID() == "TOWER_TWIN") { - GameObject.Find(ShipLogHandler.PAN_ROOT_PATH + "/" + "SandFunnel").SetActive(false); + SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH + "/" + "SandFunnel").SetActive(false); } } else if (name == "SandFunnel") { - GameObject.Find(ShipLogHandler.PAN_ROOT_PATH + "/" + "SandFunnel").SetActive(false); + SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH + "/" + "SandFunnel").SetActive(false); } gameObject.SetActive(false); } @@ -380,7 +388,7 @@ namespace NewHorizons.Builder.ShipLog return new MapModeObject(); } - private static List ConstructChildrenNodes(MapModeObject parent, List searchList, string secondaryName = "") + private static List ConstructChildrenNodes(MapModeObject parent, List searchList, string secondaryName = "", string focalPointName = "") { List children = new List(); int newX = parent.x; @@ -388,7 +396,7 @@ namespace NewHorizons.Builder.ShipLog int newLevel = parent.level + 1; MapModeObject lastSibling = parent; - foreach (NewHorizonsBody body in searchList.Where(b => b.Config.Orbit.primaryBody == parent.mainBody.Config.name || b.Config.name == secondaryName)) + foreach (NewHorizonsBody body in searchList.Where(b => b.Config.Orbit.primaryBody == parent.mainBody.Config.name || (b.Config.Orbit.primaryBody == focalPointName && b.Config.name != parent.mainBody.Config.name) || b.Config.name == secondaryName)) { bool even = newLevel % 2 == 0; newX = even ? newX : newX + 1; @@ -403,13 +411,15 @@ namespace NewHorizons.Builder.ShipLog lastSibling = lastSibling }; string newSecondaryName = ""; + string newFocalPointName = ""; if (body.Config.FocalPoint != null) { + newFocalPointName = body.Config.name; newNode.mainBody = searchList.Find(b => b.Config.name == body.Config.FocalPoint.primary); newSecondaryName = searchList.Find(b => b.Config.name == body.Config.FocalPoint.secondary).Config.name; } - newNode.children = ConstructChildrenNodes(newNode, searchList, newSecondaryName); + newNode.children = ConstructChildrenNodes(newNode, searchList, newSecondaryName, newFocalPointName); if (even) { newY += newNode.branch_height; @@ -481,7 +491,7 @@ namespace NewHorizons.Builder.ShipLog GameObject newNodeGO = CreateMapModeGameObject(node.mainBody, parent, layer, position); ShipLogAstroObject astroObject = AddShipLogAstroObject(newNodeGO, node.mainBody, greyScaleMaterial, layer); if (node.mainBody.Config.FocalPoint != null) - { + { astroObject._imageObj.GetComponent().enabled = false; astroObject._outlineObj.GetComponent().enabled = false; astroObject._unviewedObj.GetComponent().enabled = false; diff --git a/NewHorizons/Components/CloakSectorController.cs b/NewHorizons/Components/CloakSectorController.cs index 844a1a15..e7d8e9b0 100644 --- a/NewHorizons/Components/CloakSectorController.cs +++ b/NewHorizons/Components/CloakSectorController.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using UnityEngine; namespace NewHorizons.Components @@ -12,6 +12,10 @@ namespace NewHorizons.Components private List _renderers = null; + internal static bool isPlayerInside = false; + internal static bool isProbeInside = false; + internal static bool isShipInside = false; + public void Init(CloakFieldController cloak, GameObject root) { _cloak = cloak; @@ -20,9 +24,17 @@ namespace NewHorizons.Components // Lets just clear these off idc _cloak.OnPlayerEnter = new OWEvent(); _cloak.OnPlayerExit = new OWEvent(); + _cloak.OnProbeEnter = new OWEvent(); + _cloak.OnProbeExit = new OWEvent(); + _cloak.OnShipEnter = new OWEvent(); + _cloak.OnShipExit = new OWEvent(); _cloak.OnPlayerEnter += OnPlayerEnter; _cloak.OnPlayerExit += OnPlayerExit; + _cloak.OnProbeEnter += OnProbeEnter; + _cloak.OnProbeExit += OnProbeExit; + _cloak.OnShipEnter += OnShipEnter; + _cloak.OnShipExit += OnShipExit; _isInitialized = true; } @@ -49,6 +61,9 @@ namespace NewHorizons.Components { renderer.forceRenderingOff = false; } + + isPlayerInside = true; + GlobalMessenger.FireEvent("PlayerEnterCloakField"); } public void OnPlayerExit() @@ -59,6 +74,56 @@ namespace NewHorizons.Components { renderer.forceRenderingOff = true; } + + isPlayerInside = false; + GlobalMessenger.FireEvent("PlayerExitCloakField"); } + + public void OnProbeEnter() + { + isProbeInside = true; + GlobalMessenger.FireEvent("ProbeEnterCloakField"); + } + + public void OnProbeExit() + { + isProbeInside = false; + GlobalMessenger.FireEvent("ProbeExitCloakField"); + } + + public void OnShipEnter() + { + isShipInside = true; + GlobalMessenger.FireEvent("ShipEnterCloakField"); + } + + public void OnShipExit() + { + isShipInside = false; + GlobalMessenger.FireEvent("ShipExitCloakField"); + } + + public void EnableCloak() + { + SunLightController.RegisterSunOverrider(_cloak, 900); + _cloak._cloakSphereRenderer.SetActivation(true); + Shader.EnableKeyword("_CLOAKINGFIELDENABLED"); + _cloak._cloakVisualsEnabled = true; + } + + public void DisableCloak() + { + SunLightController.UnregisterSunOverrider(_cloak); + _cloak._cloakSphereRenderer.SetActivation(false); + Shader.DisableKeyword("_CLOAKINGFIELDENABLED"); + _cloak._cloakVisualsEnabled = false; + } + + public void SetReferenceFrameVolumeActive(bool active) => _cloak._referenceFrameVolume.gameObject.SetActive(active); + public void EnableReferenceFrameVolume() => SetReferenceFrameVolumeActive(true); + public void DisableReferenceFrameVolume() => SetReferenceFrameVolumeActive(false); + + public void TurnOnMusic() => _cloak._hasTriggeredMusic = false; + public void TurnOffMusic() => _cloak._hasTriggeredMusic = true; } } diff --git a/NewHorizons/Components/ShipLogStarChartMode.cs b/NewHorizons/Components/ShipLogStarChartMode.cs index c23643e9..70a6e48f 100644 --- a/NewHorizons/Components/ShipLogStarChartMode.cs +++ b/NewHorizons/Components/ShipLogStarChartMode.cs @@ -1,4 +1,4 @@ -using NewHorizons.Handlers; +using NewHorizons.Handlers; using NewHorizons.Utility; using System; using System.Collections.Generic; @@ -99,7 +99,7 @@ namespace NewHorizons.Components { if (_cardTemplate == null) { - var panRoot = GameObject.Find("Ship_Body/Module_Cabin/Systems_Cabin/ShipLogPivot/ShipLog/ShipLogPivot/ShipLogCanvas/DetectiveMode/ScaleRoot/PanRoot"); + var panRoot = SearchUtilities.Find("Ship_Body/Module_Cabin/Systems_Cabin/ShipLogPivot/ShipLog/ShipLogPivot/ShipLogCanvas/DetectiveMode/ScaleRoot/PanRoot"); _cardTemplate = GameObject.Instantiate(panRoot.GetComponentInChildren().gameObject); _cardTemplate.SetActive(false); } diff --git a/NewHorizons/Components/ShipWarpController.cs b/NewHorizons/Components/ShipWarpController.cs index 470dc432..b79a60d9 100644 --- a/NewHorizons/Components/ShipWarpController.cs +++ b/NewHorizons/Components/ShipWarpController.cs @@ -1,4 +1,5 @@ -using NewHorizons.Builder.General; +using NewHorizons.Builder.General; +using NewHorizons.Utility; using UnityEngine; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Components @@ -26,8 +27,8 @@ namespace NewHorizons.Components public void Init() { - _blackHolePrefab = GameObject.Find(_blackHolePath); - _whiteHolePrefab = GameObject.Find(_whiteHolePath); + _blackHolePrefab = SearchUtilities.Find(_blackHolePath); + _whiteHolePrefab = SearchUtilities.Find(_whiteHolePath); } public void Start() @@ -36,8 +37,9 @@ namespace NewHorizons.Components MakeWhiteHole(); _isWarpingIn = false; - - _oneShotSource = base.gameObject.AddComponent(); + + _oneShotSource = gameObject.AddComponent(); + _oneShotSource._track = OWAudioMixer.TrackName.Ship; GlobalMessenger.AddListener("FinishOpenEyes", new Callback(OnFinishOpenEyes)); } @@ -183,7 +185,7 @@ namespace NewHorizons.Components // For some reason warping into the ship makes you suffocate while in the ship if (_wearingSuit) resources.OnSuitUp(); var o2Volume = Locator.GetShipBody().GetComponent(); - var atmoVolume = GameObject.Find("Ship_Body/Volumes/ShipAtmosphereVolume").GetComponent(); + var atmoVolume = SearchUtilities.Find("Ship_Body/Volumes/ShipAtmosphereVolume").GetComponent(); resources._cameraFluidDetector.AddVolume(atmoVolume); resources._cameraFluidDetector.OnVolumeAdded(atmoVolume); diff --git a/NewHorizons/Components/SizeControllers/StarEvolutionController.cs b/NewHorizons/Components/SizeControllers/StarEvolutionController.cs index c862f7fc..d27486fb 100644 --- a/NewHorizons/Components/SizeControllers/StarEvolutionController.cs +++ b/NewHorizons/Components/SizeControllers/StarEvolutionController.cs @@ -199,8 +199,8 @@ namespace NewHorizons.Components.SizeControllers supernova.enabled = true; _isSupernova = true; _supernovaStartTime = Time.time; - atmosphere.SetActive(false); - _destructionVolume._deathType = DeathType.Supernova; + if (atmosphere != null) atmosphere.SetActive(false); + if (_destructionVolume != null) _destructionVolume._deathType = DeathType.Supernova; return; } } diff --git a/NewHorizons/External/Configs/PlanetConfig.cs b/NewHorizons/External/Configs/PlanetConfig.cs index 74c82151..98876470 100644 --- a/NewHorizons/External/Configs/PlanetConfig.cs +++ b/NewHorizons/External/Configs/PlanetConfig.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using NewHorizons.External.Modules; @@ -45,6 +45,11 @@ namespace NewHorizons.External.Configs #endregion Obsolete + /// + /// Add a cloaking field to this planet + /// + public CloakModule Cloak; + /// /// `true` if you want to delete this planet /// @@ -96,6 +101,11 @@ namespace NewHorizons.External.Configs /// public PropModule Props; + /// + /// Reference frame properties of this body + /// + public ReferenceFrameModule ReferenceFrame; + /// /// A list of paths to child GameObjects to destroy on this planet /// @@ -157,6 +167,7 @@ namespace NewHorizons.External.Configs if (Base == null) Base = new BaseModule(); if (Orbit == null) Orbit = new OrbitModule(); if (ShipLog == null) ShipLog = new ShipLogModule(); + if (ReferenceFrame == null) ReferenceFrame = new ReferenceFrameModule(); } public void MigrateAndValidate() @@ -190,8 +201,16 @@ namespace NewHorizons.External.Configs if (Base.isSatellite) Base.showMinimap = false; + if (!Base.hasReferenceFrame) ReferenceFrame.hideInMap = true; + if (childrenToDestroy != null) removeChildren = childrenToDestroy; + if (Base.cloakRadius != 0) + Cloak = new CloakModule + { + radius = Base.cloakRadius + }; + if (Base.hasAmbientLight) Base.ambientLight = 0.5f; if (Atmosphere != null) @@ -215,7 +234,11 @@ namespace NewHorizons.External.Configs // Former is obsolete, latter is to validate if (Atmosphere.hasAtmosphere || Atmosphere.atmosphereTint != null) - Atmosphere.useAtmosphereShader = true; + Atmosphere.useAtmosphereShader = true; + + // useBasicCloudShader is obsolete + if (Atmosphere.clouds != null && Atmosphere.clouds.useBasicCloudShader) + Atmosphere.clouds.cloudsPrefab = CloudPrefabType.Basic; } if (Props?.tornados != null) diff --git a/NewHorizons/External/Configs/StarSystemConfig.cs b/NewHorizons/External/Configs/StarSystemConfig.cs index a939a456..86cc9c2b 100644 --- a/NewHorizons/External/Configs/StarSystemConfig.cs +++ b/NewHorizons/External/Configs/StarSystemConfig.cs @@ -51,6 +51,16 @@ namespace NewHorizons.External.Configs /// public bool startHere; + /// + /// Name of an existing AudioClip in the game that will play when travelling in space. + /// + public string travelAudioClip; + + /// + /// Relative filepath to the .wav file to use as the audio. Mutually exclusive with travelAudioClip. + /// + public string travelAudioFilePath; + public class NomaiCoordinates { public int[] x; diff --git a/NewHorizons/External/Modules/AtmosphereModule.cs b/NewHorizons/External/Modules/AtmosphereModule.cs index d58bbe61..926b65fd 100644 --- a/NewHorizons/External/Modules/AtmosphereModule.cs +++ b/NewHorizons/External/Modules/AtmosphereModule.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; @@ -20,6 +20,16 @@ namespace NewHorizons.External.Modules [EnumMember(Value = @"sand")] Sand = 3, [EnumMember(Value = @"plasma")] Plasma = 4 + } + + [JsonConverter(typeof(StringEnumConverter))] + public enum CloudPrefabType + { + [EnumMember(Value = @"giantsDeep")] GiantsDeep = 0, + + [EnumMember(Value = @"quantumMoon")] QuantumMoon = 1, + + [EnumMember(Value = @"basic")] Basic = 2, } [JsonObject] @@ -88,6 +98,11 @@ namespace NewHorizons.External.Modules [JsonObject] public class CloudInfo { + /// + /// Should these clouds be based on Giant's Deep's banded clouds, or the Quantum Moon's non-banded clouds? + /// + public CloudPrefabType cloudsPrefab; + /// /// Relative filepath to the cloud cap texture, if the planet has clouds. /// @@ -138,11 +153,19 @@ namespace NewHorizons.External.Modules /// If the top layer shouldn't have shadows. Set to true if you're making a brown dwarf for example. /// public bool unlit; + + + + #region Obsolete /// /// Set to `false` in order to use Giant's Deep's shader. Set to `true` to just apply the cloud texture as is. /// + [Obsolete("useBasicCloudShader is deprecated, please use cloudsPrefab=\"basic\" instead")] public bool useBasicCloudShader; + + #endregion Obsolete + } diff --git a/NewHorizons/External/Modules/BaseModule.cs b/NewHorizons/External/Modules/BaseModule.cs index 28f2f8ba..27858633 100644 --- a/NewHorizons/External/Modules/BaseModule.cs +++ b/NewHorizons/External/Modules/BaseModule.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Runtime.Serialization; using NewHorizons.Utility; @@ -30,12 +30,6 @@ namespace NewHorizons.External.Modules /// public bool centerOfSolarSystem; - /// - /// Radius of the cloaking field around the planet. It's a bit finicky so experiment with different values. If you - /// don't want a cloak, leave this as 0. - /// - public float cloakRadius; - /// /// If it has a comet tail, it'll be oriented according to these Euler angles. /// @@ -62,11 +56,6 @@ namespace NewHorizons.External.Modules /// public bool hasMapMarker; - /// - /// Allows the object to be targeted on the map. - /// - [DefaultValue(true)] public bool hasReferenceFrame = true; - /// /// Can this planet survive entering a star? /// @@ -92,6 +81,11 @@ namespace NewHorizons.External.Modules /// public float surfaceSize; + /// + /// Radius of the zero gravity volume. This will make it so no gravity from any planet will affect you. Useful for satellites. + /// + public float zeroGravityRadius; + #region Obsolete [Obsolete("IsSatellite is deprecated, please use ShowMinimap instead")] @@ -112,6 +106,12 @@ namespace NewHorizons.External.Modules [Obsolete("HasAmbientLight is deprecated, please use AmbientLight instead")] public bool hasAmbientLight; + [Obsolete("HasReferenceFrame is deprecated, please use ReferenceModule instead")] + [DefaultValue(true)] public bool hasReferenceFrame = true; + + [Obsolete("CloakRadius is deprecated, please use CloakModule instead")] + public float cloakRadius; + #endregion Obsolete } } \ No newline at end of file diff --git a/NewHorizons/External/Modules/CloakModule.cs b/NewHorizons/External/Modules/CloakModule.cs new file mode 100644 index 00000000..55ad844c --- /dev/null +++ b/NewHorizons/External/Modules/CloakModule.cs @@ -0,0 +1,29 @@ +using System; +using System.ComponentModel; +using System.Runtime.Serialization; +using NewHorizons.Utility; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace NewHorizons.External.Modules +{ + [JsonObject] + public class CloakModule + { + /// + /// Radius of the cloaking field around the planet. It's a bit finicky so experiment with different values. If you + /// don't want a cloak, leave this as 0. + /// + public float radius; + + /// + /// Name of an existing AudioClip in the game that will play when entering the cloaking field. + /// + public string audioClip; + + /// + /// Relative filepath to the .wav file to use as the audio. Mutually exclusive with audioClip. + /// + public string audioFilePath; + } +} \ No newline at end of file diff --git a/NewHorizons/External/Modules/PropModule.cs b/NewHorizons/External/Modules/PropModule.cs index 4102784f..983a001e 100644 --- a/NewHorizons/External/Modules/PropModule.cs +++ b/NewHorizons/External/Modules/PropModule.cs @@ -16,10 +16,6 @@ namespace NewHorizons.External.Modules /// public DetailInfo[] details; - public QuantumSocketGroupInfo[] quantumSocketGroups; - class QuantumSocketGroupInfo { string id; QuantumSocketInfo[] sockets; } - class QuantumSocketInfo { MVector3 position; MVector3 rotation; float probability; } - /// /// Add dialogue triggers to this planet /// @@ -117,6 +113,11 @@ namespace NewHorizons.External.Modules [JsonObject] public class DetailInfo { + /// + /// An optional rename of the detail + /// + public string rename; + /// /// Do we override rotation and try to automatically align this object to stand upright on the body's surface? /// diff --git a/NewHorizons/External/Modules/ReferenceFrameModule.cs b/NewHorizons/External/Modules/ReferenceFrameModule.cs new file mode 100644 index 00000000..793bb5f0 --- /dev/null +++ b/NewHorizons/External/Modules/ReferenceFrameModule.cs @@ -0,0 +1,33 @@ +using System; +using System.ComponentModel; +using System.Runtime.Serialization; +using NewHorizons.Utility; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace NewHorizons.External.Modules +{ + [JsonObject] + public class ReferenceFrameModule + { + /// + /// Stop the object from being targeted on the map. + /// + public bool hideInMap; + + /// + /// Radius of the brackets that show up when you target this. Defaults to the sphereOfInfluence. + /// + [DefaultValue(-1)] public float bracketRadius = -1; + + /// + /// If it should be targetable even when super close. + /// + public bool targetWhenClose; + + /// + /// The maximum distance that the reference frame can be targeted from. Defaults to double the sphereOfInfluence. + /// + [DefaultValue(-1)] public float maxTargetDistance = -1; + } +} \ No newline at end of file diff --git a/NewHorizons/External/Modules/VariableSize/StarModule.cs b/NewHorizons/External/Modules/VariableSize/StarModule.cs index d722be68..201571e3 100644 --- a/NewHorizons/External/Modules/VariableSize/StarModule.cs +++ b/NewHorizons/External/Modules/VariableSize/StarModule.cs @@ -1,4 +1,4 @@ -using System.ComponentModel; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using NewHorizons.Utility; using Newtonsoft.Json; @@ -55,5 +55,11 @@ namespace NewHorizons.External.Modules.VariableSize /// Colour of the star. /// public MColor tint; + + /// + /// How far the light from the star can reach. + /// + [DefaultValue(50000f)] [Range(0f, double.MaxValue)] + public float lightRadius = 50000f; } } diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index b7600d4d..1470b5f6 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -1,4 +1,4 @@ -using NewHorizons.Builder.Atmosphere; +using NewHorizons.Builder.Atmosphere; using NewHorizons.Builder.Body; using NewHorizons.Builder.General; using NewHorizons.Builder.Orbital; @@ -33,13 +33,13 @@ namespace NewHorizons.Handlers // Set up stars // Need to manage this when there are multiple stars - var sun = GameObject.Find("Sun_Body"); + var sun = SearchUtilities.Find("Sun_Body"); var starController = sun.AddComponent(); - starController.Light = GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); - starController.AmbientLight = GameObject.Find("Sun_Body/AmbientLight_SUN").GetComponent(); - starController.FaceActiveCamera = GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); - starController.CSMTextureCacher = GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); - starController.ProxyShadowLight = GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.Light = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.AmbientLight = SearchUtilities.Find("Sun_Body/AmbientLight_SUN").GetComponent(); + starController.FaceActiveCamera = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.CSMTextureCacher = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.ProxyShadowLight = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); starController.Intensity = 0.9859f; starController.SunColor = new Color(1f, 0.8845f, 0.6677f, 1f); @@ -137,7 +137,7 @@ namespace NewHorizons.Handlers catch (Exception) { if (body?.Config?.name == null) Logger.LogError($"How is there no name for {body}"); - else existingPlanet = GameObject.Find(body.Config.name.Replace(" ", "") + "_Body"); + else existingPlanet = SearchUtilities.Find(body.Config.name.Replace(" ", "") + "_Body", false); } if (existingPlanet != null) @@ -252,7 +252,7 @@ namespace NewHorizons.Handlers { foreach (var child in body.Config.removeChildren) { - Main.Instance.ModHelper.Events.Unity.FireInNUpdates(() => GameObject.Find(go.name + "/" + child)?.SetActive(false), 2); + Main.Instance.ModHelper.Events.Unity.FireInNUpdates(() => SearchUtilities.Find(go.name + "/" + child)?.SetActive(false), 2); } } @@ -303,20 +303,17 @@ namespace NewHorizons.Handlers if (body.Config.Base.surfaceGravity != 0) { - GravityBuilder.Make(go, ao, body.Config); + GravityBuilder.Make(go, ao, owRigidBody, body.Config); } - if (body.Config.Base.hasReferenceFrame) - { - RFVolumeBuilder.Make(go, owRigidBody, sphereOfInfluence); - } + RFVolumeBuilder.Make(go, owRigidBody, sphereOfInfluence, body.Config.ReferenceFrame); if (body.Config.Base.hasMapMarker) { MarkerBuilder.Make(go, body.Config.name, body.Config); } - VolumesBuilder.Make(go, body.Config, sphereOfInfluence); + VolumesBuilder.Make(go, owRigidBody, body.Config, sphereOfInfluence); if (body.Config.FocalPoint != null) { @@ -483,9 +480,9 @@ namespace NewHorizons.Handlers } // Has to go last probably - if (body.Config.Base.cloakRadius != 0f) + if (body.Config.Cloak != null && body.Config.Cloak.radius != 0f) { - CloakBuilder.Make(go, sector, rb, body.Config.Base.cloakRadius); + CloakBuilder.Make(go, sector, rb, body.Config.Cloak, !body.Config.ReferenceFrame.hideInMap, body.Mod); } return go; diff --git a/NewHorizons/Handlers/PlanetDestructionHandler.cs b/NewHorizons/Handlers/PlanetDestructionHandler.cs index 6dead21b..82c0454a 100644 --- a/NewHorizons/Handlers/PlanetDestructionHandler.cs +++ b/NewHorizons/Handlers/PlanetDestructionHandler.cs @@ -1,4 +1,4 @@ -using NewHorizons.Components; +using NewHorizons.Components; using NewHorizons.Utility; using OWML.Utils; using System; @@ -33,7 +33,7 @@ namespace NewHorizons.Handlers public static void RemoveSolarSystem() { // Stop the sun from killing the player - var sunVolumes = GameObject.Find("Sun_Body/Sector_SUN/Volumes_SUN"); + var sunVolumes = SearchUtilities.Find("Sun_Body/Sector_SUN/Volumes_SUN"); sunVolumes.SetActive(false); foreach (var name in _solarSystemBodies) @@ -82,11 +82,11 @@ namespace NewHorizons.Handlers break; case AstroObject.Name.CaveTwin: case AstroObject.Name.TowerTwin: - DisableBody(GameObject.Find("FocalBody"), delete); - DisableBody(GameObject.Find("SandFunnel_Body"), delete); + DisableBody(SearchUtilities.Find("FocalBody"), delete); + DisableBody(SearchUtilities.Find("SandFunnel_Body"), delete); break; case AstroObject.Name.MapSatellite: - DisableBody(GameObject.Find("MapSatellite_Body"), delete); + DisableBody(SearchUtilities.Find("MapSatellite_Body"), delete); break; case AstroObject.Name.GiantsDeep: // Might prevent leftover jellyfish from existing @@ -100,7 +100,7 @@ namespace NewHorizons.Handlers break; case AstroObject.Name.TimberHearth: // Always just fucking kill this one to stop THE WARP BUG!!! - DisableBody(GameObject.Find("StreamingGroup_TH"), true); + DisableBody(SearchUtilities.Find("StreamingGroup_TH"), true); foreach (var obj in GameObject.FindObjectsOfType()) { @@ -229,8 +229,8 @@ namespace NewHorizons.Handlers { if (name.Equals("TowerTwin")) name = "AshTwin"; if (name.Equals("CaveTwin")) name = "EmberTwin"; - var distantProxy = GameObject.Find(name + "_DistantProxy"); - var distantProxyClone = GameObject.Find(name + "_DistantProxy(Clone)"); + var distantProxy = SearchUtilities.Find(name + "_DistantProxy", false); + var distantProxyClone = SearchUtilities.Find(name + "_DistantProxy(Clone)", false); if (distantProxy != null) GameObject.Destroy(distantProxy.gameObject); if (distantProxyClone != null) GameObject.Destroy(distantProxyClone.gameObject); diff --git a/NewHorizons/Handlers/ShipLogHandler.cs b/NewHorizons/Handlers/ShipLogHandler.cs index 55f6184b..0d5faaf5 100644 --- a/NewHorizons/Handlers/ShipLogHandler.cs +++ b/NewHorizons/Handlers/ShipLogHandler.cs @@ -26,7 +26,7 @@ namespace NewHorizons.Handlers _entryIDsToNHBody = new Dictionary(); _nhBodyToAstroIDs = new Dictionary(); - List gameObjects = SearchUtilities.GetAllChildren(GameObject.Find(PAN_ROOT_PATH)); + List gameObjects = SearchUtilities.GetAllChildren(SearchUtilities.Find(PAN_ROOT_PATH)); _vanillaBodies = gameObjects.ConvertAll(g => g.name).ToArray(); _vanillaBodyIDs = gameObjects.ConvertAll(g => g.GetComponent()?.GetID()).ToArray(); } diff --git a/NewHorizons/Handlers/StarChartHandler.cs b/NewHorizons/Handlers/StarChartHandler.cs index e22406d3..4b1844e6 100644 --- a/NewHorizons/Handlers/StarChartHandler.cs +++ b/NewHorizons/Handlers/StarChartHandler.cs @@ -1,4 +1,4 @@ -using NewHorizons.Components; +using NewHorizons.Components; using NewHorizons.Utility; using System.Collections.Generic; using UnityEngine; @@ -18,7 +18,7 @@ namespace NewHorizons.Handlers { _systems = systems; - var shipLogRoot = GameObject.Find("Ship_Body/Module_Cabin/Systems_Cabin/ShipLogPivot/ShipLog/ShipLogPivot/ShipLogCanvas"); + var shipLogRoot = SearchUtilities.Find("Ship_Body/Module_Cabin/Systems_Cabin/ShipLogPivot/ShipLog/ShipLogPivot/ShipLogCanvas"); var starChartLog = new GameObject("StarChartMode"); starChartLog.SetActive(false); @@ -29,7 +29,7 @@ namespace NewHorizons.Handlers ShipLogStarChartMode = starChartLog.AddComponent(); - var reticleImage = GameObject.Instantiate(GameObject.Find("Ship_Body/Module_Cabin/Systems_Cabin/ShipLogPivot/ShipLog/ShipLogPivot/ShipLogCanvas/DetectiveMode/ReticleImage (1)/"), starChartLog.transform); + var reticleImage = GameObject.Instantiate(SearchUtilities.Find("Ship_Body/Module_Cabin/Systems_Cabin/ShipLogPivot/ShipLog/ShipLogPivot/ShipLogCanvas/DetectiveMode/ReticleImage (1)/"), starChartLog.transform); var scaleRoot = new GameObject("ScaleRoot"); scaleRoot.transform.parent = starChartLog.transform; @@ -45,7 +45,7 @@ namespace NewHorizons.Handlers var centerPromptList = shipLogRoot.transform.Find("ScreenPromptListScaleRoot/ScreenPromptList_Center")?.GetComponent(); var upperRightPromptList = shipLogRoot.transform.Find("ScreenPromptListScaleRoot/ScreenPromptList_UpperRight")?.GetComponent(); - var oneShotSource = GameObject.Find("Ship_Body/Module_Cabin/Systems_Cabin/ShipLogPivot/ShipLog/OneShotAudio_ShipLog")?.GetComponent(); + var oneShotSource = SearchUtilities.Find("Ship_Body/Module_Cabin/Systems_Cabin/ShipLogPivot/ShipLog/OneShotAudio_ShipLog")?.GetComponent(); _starSystemToFactID = new Dictionary(); _factIDToStarSystem = new Dictionary(); diff --git a/NewHorizons/Handlers/SystemCreationHandler.cs b/NewHorizons/Handlers/SystemCreationHandler.cs index fa020c5d..f4c0ca99 100644 --- a/NewHorizons/Handlers/SystemCreationHandler.cs +++ b/NewHorizons/Handlers/SystemCreationHandler.cs @@ -1,4 +1,4 @@ -using NewHorizons.Builder.StarSystem; +using NewHorizons.Builder.StarSystem; using NewHorizons.Components; using NewHorizons.Utility; using UnityEngine; @@ -9,7 +9,7 @@ namespace NewHorizons.Handlers { public static void LoadSystem(NewHorizonsSystem system) { - var skybox = GameObject.Find("Skybox/Starfield"); + var skybox = SearchUtilities.Find("Skybox/Starfield"); if (system.Config.skybox?.destroyStarField ?? false) { @@ -26,6 +26,30 @@ namespace NewHorizons.Handlers var timeLoopController = new GameObject("TimeLoopController"); timeLoopController.AddComponent(); } + + AudioClip clip = null; + if (system.Config.travelAudioClip != null) clip = SearchUtilities.FindResourceOfTypeAndName(system.Config.travelAudioClip); + else if (system.Config.travelAudioFilePath != null) + { + try + { + clip = AudioUtilities.LoadAudio(system.Mod.ModHelper.Manifest.ModFolderPath + "/" + system.Config.travelAudioFilePath); + } + catch (System.Exception e) + { + Utility.Logger.LogError($"Couldn't load audio file {system.Config.travelAudioFilePath} : {e.Message}"); + } + } + + if (clip != null) + { + var travelSource = Locator.GetGlobalMusicController()._travelSource; + travelSource._audioLibraryClip = AudioType.None; + travelSource._clipArrayIndex = 0; + travelSource._clipArrayLength = 0; + travelSource._clipSelectionOnPlay = OWAudioSource.ClipSelectionOnPlay.MANUAL; + travelSource.clip = clip; + } } } } diff --git a/NewHorizons/Handlers/TitleSceneHandler.cs b/NewHorizons/Handlers/TitleSceneHandler.cs index 6baf33ea..ebbb4043 100644 --- a/NewHorizons/Handlers/TitleSceneHandler.cs +++ b/NewHorizons/Handlers/TitleSceneHandler.cs @@ -13,7 +13,7 @@ namespace NewHorizons.Handlers { public static void InitSubtitles() { - GameObject subtitleContainer = GameObject.Find("TitleMenu/TitleCanvas/TitleLayoutGroup/Logo_EchoesOfTheEye"); + GameObject subtitleContainer = SearchUtilities.Find("TitleMenu/TitleCanvas/TitleLayoutGroup/Logo_EchoesOfTheEye"); if (subtitleContainer == null) { @@ -60,11 +60,11 @@ namespace NewHorizons.Handlers body3.transform.localRotation = Quaternion.Euler(10f, 0f, 0f); } - GameObject.Find("Scene/Background/PlanetPivot/Prefab_HEA_Campfire").SetActive(false); - GameObject.Find("Scene/Background/PlanetPivot/PlanetRoot").SetActive(false); + SearchUtilities.Find("Scene/Background/PlanetPivot/Prefab_HEA_Campfire").SetActive(false); + SearchUtilities.Find("Scene/Background/PlanetPivot/PlanetRoot").SetActive(false); var lightGO = new GameObject("Light"); - lightGO.transform.parent = GameObject.Find("Scene/Background").transform; + lightGO.transform.parent = SearchUtilities.Find("Scene/Background").transform; lightGO.transform.localPosition = new Vector3(-47.9203f, 145.7596f, 43.1802f); var light = lightGO.AddComponent(); light.color = new Color(1f, 1f, 1f, 1f); @@ -98,7 +98,7 @@ namespace NewHorizons.Handlers HeightMapBuilder.Make(titleScreenGO, null, heightMap, body.Mod); - GameObject pivot = GameObject.Instantiate(GameObject.Find("Scene/Background/PlanetPivot"), GameObject.Find("Scene/Background").transform); + GameObject pivot = GameObject.Instantiate(SearchUtilities.Find("Scene/Background/PlanetPivot"), SearchUtilities.Find("Scene/Background").transform); pivot.GetComponent()._degreesPerSecond = 10f; foreach (Transform child in pivot.transform) { diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 6264a5b7..9309b9a5 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -159,7 +159,14 @@ namespace NewHorizons private static void OnWakeUp() { IsSystemReady = true; - Instance.OnStarSystemLoaded?.Invoke(Instance.CurrentStarSystem); + try + { + Instance.OnStarSystemLoaded?.Invoke(Instance.CurrentStarSystem); + } + catch (Exception e) + { + Logger.LogError($"Exception thrown when invoking star system loaded event with parameter [{Instance.CurrentStarSystem}] : {e.GetType().FullName} {e.Message} {e.StackTrace}"); + } } private void OnSceneUnloaded(Scene scene) @@ -190,7 +197,7 @@ namespace NewHorizons } launchController.enabled = false; } - var nomaiProbe = GameObject.Find("NomaiProbe_Body"); + var nomaiProbe = SearchUtilities.Find("NomaiProbe_Body"); if (nomaiProbe != null) nomaiProbe.gameObject.SetActive(false); } @@ -221,7 +228,7 @@ namespace NewHorizons if (_ship != null) { - _ship = GameObject.Find("Ship_Body").InstantiateInactive(); + _ship = SearchUtilities.Find("Ship_Body").InstantiateInactive(); DontDestroyOnLoad(_ship); } @@ -238,7 +245,7 @@ namespace NewHorizons // Warp drive StarChartHandler.Init(SystemDict.Values.ToArray()); HasWarpDrive = StarChartHandler.CanWarp(); - _shipWarpController = GameObject.Find("Ship_Body").AddComponent(); + _shipWarpController = SearchUtilities.Find("Ship_Body").AddComponent(); _shipWarpController.Init(); if (HasWarpDrive == true) EnableWarpDrive(); @@ -251,7 +258,7 @@ namespace NewHorizons if (map != null) map._maxPanDistance = FurthestOrbit * 1.5f; // Fix the map satellite - GameObject.Find("HearthianMapSatellite_Body").AddComponent(); + SearchUtilities.Find("HearthianMapSatellite_Body", false).AddComponent(); } else { diff --git a/NewHorizons/Patches/HUDPatches.cs b/NewHorizons/Patches/HUDPatches.cs new file mode 100644 index 00000000..bbb0061a --- /dev/null +++ b/NewHorizons/Patches/HUDPatches.cs @@ -0,0 +1,63 @@ +using HarmonyLib; + +namespace NewHorizons.Patches +{ + [HarmonyPatch] + public static class HUDPatches + { + [HarmonyPostfix] + [HarmonyPatch(typeof(HUDMarker), nameof(HUDMarker.Awake))] + public static void HUDMarker_Awake(HUDMarker __instance) + { + GlobalMessenger.AddListener("PlayerEnterCloakField", __instance.OnPlayerEnterCloakField); + GlobalMessenger.AddListener("PlayerExitCloakField", __instance.OnPlayerExitCloakField); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(HUDMarker), nameof(HUDMarker.OnDestroy))] + public static void HUDMarker_OnDestroy(HUDMarker __instance) + { + GlobalMessenger.RemoveListener("PlayerEnterCloakField", __instance.OnPlayerEnterCloakField); + GlobalMessenger.RemoveListener("PlayerExitCloakField", __instance.OnPlayerExitCloakField); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(ProbeHUDMarker), nameof(ProbeHUDMarker.Awake))] + public static void ProbeHUDMarker_Awake(ProbeHUDMarker __instance) + { + GlobalMessenger.AddListener("ProbeEnterCloakField", __instance.RefreshOwnVisibility); + GlobalMessenger.AddListener("ProbeExitCloakField", __instance.RefreshOwnVisibility); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(ProbeHUDMarker), nameof(ProbeHUDMarker.OnDestroy))] + public static void ProbeHUDMarker_OnDestroy(ProbeHUDMarker __instance) + { + GlobalMessenger.RemoveListener("ProbeEnterCloakField", __instance.RefreshOwnVisibility); + GlobalMessenger.RemoveListener("ProbeExitCloakField", __instance.RefreshOwnVisibility); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(ShipHUDMarker), nameof(ShipHUDMarker.Awake))] + public static void ShipHUDMarker_Awake(ShipHUDMarker __instance) + { + GlobalMessenger.AddListener("ShipEnterCloakField", __instance.RefreshOwnVisibility); + GlobalMessenger.AddListener("ShipExitCloakField", __instance.RefreshOwnVisibility); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(ShipHUDMarker), nameof(ShipHUDMarker.OnDestroy))] + public static void ShipHUDMarker_OnDestroy(ShipHUDMarker __instance) + { + GlobalMessenger.RemoveListener("ShipEnterCloakField", __instance.RefreshOwnVisibility); + GlobalMessenger.RemoveListener("ShipExitCloakField", __instance.RefreshOwnVisibility); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(ProbeCamera), nameof(ProbeCamera.HasInterference))] + public static void ProbeCamera_HasInterference(ProbeCamera __instance, ref bool __result) + { + __result = __result || Components.CloakSectorController.isPlayerInside != Components.CloakSectorController.isProbeInside; + } + } +} diff --git a/NewHorizons/Patches/LocatorPatches.cs b/NewHorizons/Patches/LocatorPatches.cs index eb933baf..30c76cf2 100644 --- a/NewHorizons/Patches/LocatorPatches.cs +++ b/NewHorizons/Patches/LocatorPatches.cs @@ -1,4 +1,4 @@ -using HarmonyLib; +using HarmonyLib; namespace NewHorizons.Patches { [HarmonyPatch] @@ -10,5 +10,26 @@ namespace NewHorizons.Patches { return Locator._cloakFieldController == null; } + + [HarmonyPostfix] + [HarmonyPatch(typeof(CloakFieldController), nameof(CloakFieldController.isPlayerInsideCloak), MethodType.Getter)] + public static void CloakFieldController_isPlayerInsideCloak(CloakFieldController __instance, ref bool __result) + { + __result = __result || Components.CloakSectorController.isPlayerInside; + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(CloakFieldController), nameof(CloakFieldController.isProbeInsideCloak), MethodType.Getter)] + public static void CloakFieldController_isProbeInsideCloak(CloakFieldController __instance, ref bool __result) + { + __result = __result || Components.CloakSectorController.isProbeInside; + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(CloakFieldController), nameof(CloakFieldController.isShipInsideCloak), MethodType.Getter)] + public static void CloakFieldController_isShipInsideCloak(CloakFieldController __instance, ref bool __result) + { + __result = __result || Components.CloakSectorController.isShipInside; + } } } diff --git a/NewHorizons/Patches/MapControllerPatches.cs b/NewHorizons/Patches/MapControllerPatches.cs index b3c25e29..903868fb 100644 --- a/NewHorizons/Patches/MapControllerPatches.cs +++ b/NewHorizons/Patches/MapControllerPatches.cs @@ -1,4 +1,4 @@ -using HarmonyLib; +using HarmonyLib; using UnityEngine.SceneManagement; namespace NewHorizons.Patches @@ -43,5 +43,12 @@ namespace NewHorizons.Patches return true; } + + [HarmonyPrefix] + [HarmonyPatch(typeof(ReferenceFrameTracker), nameof(ReferenceFrameTracker.UntargetReferenceFrame), new System.Type[] { typeof(bool) })] + public static bool ReferenceFrameTracker_UntargetReferenceFrame(ReferenceFrameTracker __instance, bool playAudio) + { + return __instance != null && __instance._hasTarget && __instance._currentReferenceFrame != null; + } } } diff --git a/NewHorizons/Patches/PlayerSpawnerPatches.cs b/NewHorizons/Patches/PlayerSpawnerPatches.cs index e6dec94d..09e9ff0a 100644 --- a/NewHorizons/Patches/PlayerSpawnerPatches.cs +++ b/NewHorizons/Patches/PlayerSpawnerPatches.cs @@ -1,4 +1,4 @@ -using HarmonyLib; +using HarmonyLib; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Patches { diff --git a/NewHorizons/Patches/ShipLogPatches.cs b/NewHorizons/Patches/ShipLogPatches.cs index acc1c021..672660c8 100644 --- a/NewHorizons/Patches/ShipLogPatches.cs +++ b/NewHorizons/Patches/ShipLogPatches.cs @@ -1,4 +1,4 @@ -using HarmonyLib; +using HarmonyLib; using NewHorizons.Builder.ShipLog; using NewHorizons.Components; using NewHorizons.Handlers; @@ -135,8 +135,8 @@ namespace NewHorizons.Patches [HarmonyPatch(typeof(ShipLogMapMode), nameof(ShipLogMapMode.Initialize))] public static void ShipLogMapMode_Initialize(ShipLogMapMode __instance) { - GameObject panRoot = GameObject.Find(ShipLogHandler.PAN_ROOT_PATH); - GameObject sunObject = GameObject.Find(ShipLogHandler.PAN_ROOT_PATH + "/Sun"); + GameObject panRoot = SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH); + GameObject sunObject = SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH + "/Sun"); ShipLogAstroObject[][] navMatrix = MapModeBuilder.ConstructMapMode(Main.Instance.CurrentStarSystem, panRoot, __instance._astroObjects, sunObject.layer); if (navMatrix == null || navMatrix.Length <= 1) { @@ -151,9 +151,9 @@ namespace NewHorizons.Patches List delete = SearchUtilities.GetAllChildren(panRoot).Where(g => g.name.Contains("_ShipLog") == false).ToList(); foreach (GameObject gameObject in delete) { - Object.Destroy(GameObject.Find(ShipLogHandler.PAN_ROOT_PATH + "/" + gameObject.name)); + Object.Destroy(SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH + "/" + gameObject.name)); } - if (GameObject.Find(ShipLogHandler.PAN_ROOT_PATH + "/" + "SandFunnel") == null) + if (SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH + "/" + "SandFunnel") == null) { __instance._sandFunnel = __instance.gameObject.AddComponent(); } diff --git a/NewHorizons/Patches/SunPatches.cs b/NewHorizons/Patches/SunPatches.cs index ba57ffee..447028bd 100644 --- a/NewHorizons/Patches/SunPatches.cs +++ b/NewHorizons/Patches/SunPatches.cs @@ -1,4 +1,4 @@ -using HarmonyLib; +using HarmonyLib; using UnityEngine; namespace NewHorizons.Patches { @@ -40,5 +40,26 @@ namespace NewHorizons.Patches __instance._audioSource.SetLocalVolume(num * num * __instance._fade); return false; } + + [HarmonyPrefix] + [HarmonyPatch(typeof(SunProxyEffectController), nameof(SunProxyEffectController.UpdateScales))] + public static bool SunProxyEffectController_UpdateScales(SunProxyEffectController __instance) + { + return __instance != null && __instance._surface != null && __instance._fog != null && __instance._fogMaterial != null && __instance._solarFlareEmitter != null && __instance._atmosphere != null; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(SunProxyEffectController), nameof(SunProxyEffectController.UpdateAtmosphereRadii))] + public static bool SunProxyEffectController_UpdateAtmosphereRadii(SunProxyEffectController __instance) + { + return __instance != null && __instance.transform != null && __instance.transform.parent != null && __instance._atmosphereMaterial != null; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(VanishVolume), nameof(VanishVolume.Shrink))] + public static bool VanishVolume_Shrink(VanishVolume __instance, OWRigidbody bodyToShrink) + { + return __instance != null && __instance.transform != null && __instance._shrinkingBodies != null && __instance._shrinkingBodyLocationData != null && bodyToShrink != null; + } } } diff --git a/NewHorizons/Patches/WarpDrivePatches.cs b/NewHorizons/Patches/WarpDrivePatches.cs index ac7e6f92..610cfbdd 100644 --- a/NewHorizons/Patches/WarpDrivePatches.cs +++ b/NewHorizons/Patches/WarpDrivePatches.cs @@ -1,5 +1,6 @@ -using HarmonyLib; +using HarmonyLib; using NewHorizons.Handlers; +using NewHorizons.Utility; using UnityEngine; namespace NewHorizons.Patches { diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index b52e6823..00b268c8 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -30,6 +30,10 @@ "type": "boolean", "description": "Should this planet ever be shown on the title screen?" }, + "Cloak": { + "description": "Add a cloaking field to this planet", + "$ref": "#/definitions/CloakModule" + }, "destroy": { "type": "boolean", "description": "`true` if you want to delete this planet" @@ -71,6 +75,10 @@ "description": "Spawn various objects on this body", "$ref": "#/definitions/PropModule" }, + "ReferenceFrame": { + "description": "Reference frame properties of this body", + "$ref": "#/definitions/ReferenceFrameModule" + }, "removeChildren": { "type": "array", "description": "A list of paths to child GameObjects to destroy on this planet", @@ -289,6 +297,10 @@ "type": "object", "additionalProperties": false, "properties": { + "cloudsPrefab": { + "description": "Should these clouds be based on Giant's Deep's banded clouds, or the Quantum Moon's non-banded clouds?", + "$ref": "#/definitions/CloudPrefabType" + }, "capPath": { "type": "string", "description": "Relative filepath to the cloud cap texture, if the planet has clouds." @@ -333,13 +345,23 @@ "unlit": { "type": "boolean", "description": "If the top layer shouldn't have shadows. Set to true if you're making a brown dwarf for example." - }, - "useBasicCloudShader": { - "type": "boolean", - "description": "Set to `false` in order to use Giant's Deep's shader. Set to `true` to just apply the cloud texture as is." } } }, + "CloudPrefabType": { + "type": "string", + "description": "", + "x-enumNames": [ + "GiantsDeep", + "QuantumMoon", + "Basic" + ], + "enum": [ + "giantsDeep", + "quantumMoon", + "basic" + ] + }, "CloudFluidType": { "type": "string", "description": "", @@ -384,11 +406,6 @@ "type": "boolean", "description": "Set this to true if you are replacing the sun with a different body. Only one object in a star system should ever\nhave this set to true." }, - "cloakRadius": { - "type": "number", - "description": "Radius of the cloaking field around the planet. It's a bit finicky so experiment with different values. If you\ndon't want a cloak, leave this as 0.", - "format": "float" - }, "cometTailRotation": { "description": "If it has a comet tail, it'll be oriented according to these Euler angles.", "$ref": "#/definitions/MVector3" @@ -410,11 +427,6 @@ "type": "boolean", "description": "If the body should have a marker on the map screen." }, - "hasReferenceFrame": { - "type": "boolean", - "description": "Allows the object to be targeted on the map.", - "default": true - }, "invulnerableToSun": { "type": "boolean", "description": "Can this planet survive entering a star?" @@ -438,6 +450,11 @@ "type": "number", "description": "A scale height used for a number of things. Should be the approximate radius of the body.", "format": "float" + }, + "zeroGravityRadius": { + "type": "number", + "description": "Radius of the zero gravity volume. This will make it so no gravity from any planet will affect you. Useful for satellites.", + "format": "float" } } }, @@ -471,6 +488,25 @@ "inverseSquared" ] }, + "CloakModule": { + "type": "object", + "additionalProperties": false, + "properties": { + "radius": { + "type": "number", + "description": "Radius of the cloaking field around the planet. It's a bit finicky so experiment with different values. If you\ndon't want a cloak, leave this as 0.", + "format": "float" + }, + "audioClip": { + "type": "string", + "description": "Name of an existing AudioClip in the game that will play when entering the cloaking field." + }, + "audioFilePath": { + "type": "string", + "description": "Relative filepath to the .wav file to use as the audio. Mutually exclusive with audioClip." + } + } + }, "FocalPointModule": { "type": "object", "additionalProperties": false, @@ -775,6 +811,10 @@ "type": "object", "additionalProperties": false, "properties": { + "rename": { + "type": "string", + "description": "An optional rename of the detail" + }, "alignToNormal": { "type": "boolean", "description": "Do we override rotation and try to automatically align this object to stand upright on the body's surface?" @@ -1301,6 +1341,32 @@ } } }, + "ReferenceFrameModule": { + "type": "object", + "additionalProperties": false, + "properties": { + "hideInMap": { + "type": "boolean", + "description": "Stop the object from being targeted on the map." + }, + "bracketRadius": { + "type": "number", + "description": "Radius of the brackets that show up when you target this. Defaults to the sphereOfInfluence.", + "format": "float", + "default": -1 + }, + "targetWhenClose": { + "type": "boolean", + "description": "If it should be targetable even when super close." + }, + "maxTargetDistance": { + "type": "number", + "description": "The maximum distance that the reference frame can be targeted from. Defaults to double the sphereOfInfluence.", + "format": "float", + "default": -1 + } + } + }, "RingModule": { "type": "object", "additionalProperties": false, @@ -1730,6 +1796,13 @@ "tint": { "description": "Colour of the star.", "$ref": "#/definitions/MColor" + }, + "lightRadius": { + "type": "number", + "description": "How far the light from the star can reach.", + "format": "float", + "default": 50000.0, + "minimum": 0.0 } } }, diff --git a/NewHorizons/Schemas/shiplog_schema.xsd b/NewHorizons/Schemas/shiplog_schema.xsd index 4655788f..71f503ef 100644 --- a/NewHorizons/Schemas/shiplog_schema.xsd +++ b/NewHorizons/Schemas/shiplog_schema.xsd @@ -67,7 +67,7 @@ - Ignore more to explore if a fact is known + Ignore more to explore if a persistent condition is `true` @@ -202,4 +202,4 @@ - \ No newline at end of file + diff --git a/NewHorizons/Schemas/star_system_schema.json b/NewHorizons/Schemas/star_system_schema.json index 13ae6ecc..1a4076a5 100644 --- a/NewHorizons/Schemas/star_system_schema.json +++ b/NewHorizons/Schemas/star_system_schema.json @@ -38,6 +38,14 @@ "type": "boolean", "description": "Set to `true` if you want to spawn here after dying, not Timber Hearth. You can still warp back to the main star\nsystem." }, + "travelAudioClip": { + "type": "string", + "description": "Name of an existing AudioClip in the game that will play when travelling in space." + }, + "travelAudioFilePath": { + "type": "string", + "description": "Relative filepath to the .wav file to use as the audio. Mutually exclusive with travelAudioClip." + }, "$schema": { "type": "string", "description": "The schema to validate with" diff --git a/NewHorizons/Utility/AstroObjectLocator.cs b/NewHorizons/Utility/AstroObjectLocator.cs index 428e0f4b..40cb3ddc 100644 --- a/NewHorizons/Utility/AstroObjectLocator.cs +++ b/NewHorizons/Utility/AstroObjectLocator.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using UnityEngine; namespace NewHorizons.Utility @@ -97,35 +97,35 @@ namespace NewHorizons.Utility switch (primary._name) { case AstroObject.Name.TowerTwin: - otherChildren.Add(GameObject.Find("TimeLoopRing_Body")); + otherChildren.Add(SearchUtilities.Find("TimeLoopRing_Body")); break; case AstroObject.Name.ProbeCannon: - otherChildren.Add(GameObject.Find("NomaiProbe_Body")); - otherChildren.Add(GameObject.Find("CannonMuzzle_Body")); - otherChildren.Add(GameObject.Find("FakeCannonMuzzle_Body (1)")); - otherChildren.Add(GameObject.Find("CannonBarrel_Body")); - otherChildren.Add(GameObject.Find("FakeCannonBarrel_Body (1)")); - otherChildren.Add(GameObject.Find("Debris_Body (1)")); + otherChildren.Add(SearchUtilities.Find("NomaiProbe_Body")); + otherChildren.Add(SearchUtilities.Find("CannonMuzzle_Body")); + otherChildren.Add(SearchUtilities.Find("FakeCannonMuzzle_Body (1)")); + otherChildren.Add(SearchUtilities.Find("CannonBarrel_Body")); + otherChildren.Add(SearchUtilities.Find("FakeCannonBarrel_Body (1)")); + otherChildren.Add(SearchUtilities.Find("Debris_Body (1)")); break; case AstroObject.Name.GiantsDeep: - otherChildren.Add(GameObject.Find("BrambleIsland_Body")); - otherChildren.Add(GameObject.Find("GabbroIsland_Body")); - otherChildren.Add(GameObject.Find("QuantumIsland_Body")); - otherChildren.Add(GameObject.Find("StatueIsland_Body")); - otherChildren.Add(GameObject.Find("ConstructionYardIsland_Body")); - otherChildren.Add(GameObject.Find("GabbroShip_Body")); + otherChildren.Add(SearchUtilities.Find("BrambleIsland_Body")); + otherChildren.Add(SearchUtilities.Find("GabbroIsland_Body")); + otherChildren.Add(SearchUtilities.Find("QuantumIsland_Body")); + otherChildren.Add(SearchUtilities.Find("StatueIsland_Body")); + otherChildren.Add(SearchUtilities.Find("ConstructionYardIsland_Body")); + otherChildren.Add(SearchUtilities.Find("GabbroShip_Body")); break; case AstroObject.Name.WhiteHole: - otherChildren.Add(GameObject.Find("WhiteholeStation_Body")); - otherChildren.Add(GameObject.Find("WhiteholeStationSuperstructure_Body")); + otherChildren.Add(SearchUtilities.Find("WhiteholeStation_Body")); + otherChildren.Add(SearchUtilities.Find("WhiteholeStationSuperstructure_Body")); break; case AstroObject.Name.TimberHearth: - otherChildren.Add(GameObject.Find("MiningRig_Body")); - otherChildren.Add(GameObject.Find("Ship_Body")); + otherChildren.Add(SearchUtilities.Find("MiningRig_Body")); + otherChildren.Add(SearchUtilities.Find("Ship_Body")); break; case AstroObject.Name.DreamWorld: - otherChildren.Add(GameObject.Find("BackRaft_Body")); - otherChildren.Add(GameObject.Find("SealRaft_Body")); + otherChildren.Add(SearchUtilities.Find("BackRaft_Body")); + otherChildren.Add(SearchUtilities.Find("SealRaft_Body")); break; // For some dumb reason the sun station doesn't use AstroObject.Name.SunStation case AstroObject.Name.CustomString: diff --git a/NewHorizons/Utility/DebugUtilities/DebugRaycaster.cs b/NewHorizons/Utility/DebugUtilities/DebugRaycaster.cs index b2d353c5..3ea0c367 100644 --- a/NewHorizons/Utility/DebugUtilities/DebugRaycaster.cs +++ b/NewHorizons/Utility/DebugUtilities/DebugRaycaster.cs @@ -1,14 +1,14 @@ -using UnityEngine; -using UnityEngine.InputSystem; - -namespace NewHorizons.Utility.DebugUtilities -{ - [RequireComponent(typeof(OWRigidbody))] - public class DebugRaycaster : MonoBehaviour - { - private OWRigidbody _rb; - private GameObject _surfaceSphere; - private GameObject _normalSphere1; +using UnityEngine; +using UnityEngine.InputSystem; + +namespace NewHorizons.Utility.DebugUtilities +{ + [RequireComponent(typeof(OWRigidbody))] + public class DebugRaycaster : MonoBehaviour + { + private OWRigidbody _rb; + private GameObject _surfaceSphere; + private GameObject _normalSphere1; private GameObject _normalSphere2; private GameObject _planeUpRightSphere; @@ -17,43 +17,44 @@ namespace NewHorizons.Utility.DebugUtilities private GameObject _planeDownLeftSphere; - private void Awake() - { - _rb = this.GetRequiredComponent(); - } + private void Awake() + { + _rb = this.GetRequiredComponent(); + } + + + private void Update() + { + if (!Main.Debug) return; + if (Keyboard.current == null) return; + + if (Keyboard.current[Key.P].wasReleasedThisFrame) + { + PrintRaycast(); + } + } + + + + internal void PrintRaycast() + { + DebugRaycastData data = Raycast(); + + var posText = $"{{\"x\": {data.pos.x}, \"y\": {data.pos.y}, \"z\": {data.pos.z}}}"; + var normText = $"{{\"x\": {data.norm.x}, \"y\": {data.norm.y}, \"z\": {data.norm.z}}}"; - - private void Update() - { - if (!Main.Debug) return; - if (Keyboard.current == null) return; - - if (Keyboard.current[Key.P].wasReleasedThisFrame) - { - PrintRaycast(); - } - } - - - - internal void PrintRaycast() - { - DebugRaycastData data = Raycast(); - var posText = $"{{\"x\": {data.pos.x}, \"y\": {data.pos.y}, \"z\": {data.pos.z}}}"; - var normText = $"{{\"x\": {data.norm.x}, \"y\": {data.norm.y}, \"z\": {data.norm.z}}}"; - - if(_surfaceSphere != null) GameObject.Destroy(_surfaceSphere); - if(_normalSphere1 != null) GameObject.Destroy(_normalSphere1); - if(_normalSphere2 != null) GameObject.Destroy(_normalSphere2); + if(_surfaceSphere != null) GameObject.Destroy(_surfaceSphere); + if(_normalSphere1 != null) GameObject.Destroy(_normalSphere1); + if(_normalSphere2 != null) GameObject.Destroy(_normalSphere2); if(_planeUpRightSphere != null) GameObject.Destroy(_planeUpRightSphere ); if(_planeUpLeftSphere != null) GameObject.Destroy(_planeUpLeftSphere ); if(_planeDownLeftSphere != null) GameObject.Destroy(_planeDownLeftSphere ); if(_planeDownRightSphere != null) GameObject.Destroy(_planeDownRightSphere); - + _surfaceSphere = AddDebugShape.AddSphere(data.hitBodyGameObject, 0.1f, Color.green); _normalSphere1 = AddDebugShape.AddSphere(data.hitBodyGameObject, 0.01f, Color.red); _normalSphere2 = AddDebugShape.AddSphere(data.hitBodyGameObject, 0.01f, Color.red); - + _surfaceSphere.transform.localPosition = data.pos; _normalSphere1.transform.localPosition = data.pos + data.norm * 0.5f; _normalSphere2.transform.localPosition = data.pos + data.norm; @@ -71,35 +72,35 @@ namespace NewHorizons.Utility.DebugUtilities _planeDownLeftSphere .transform.localPosition = data.plane.origin + data.plane.u*-1*planeSize + data.plane.v*-1*planeSize; _planeDownRightSphere.transform.localPosition = data.plane.origin + data.plane.u*1*planeSize + data.plane.v*-1*planeSize; - Logger.Log($"Raycast hit \"position\": {posText}, \"normal\": {normText} on [{data.bodyName}] at [{data.bodyPath}]"); - } - internal DebugRaycastData Raycast() - { - DebugRaycastData data = new DebugRaycastData(); - - _rb.DisableCollisionDetection(); - int layerMask = OWLayerMask.physicalMask; - var origin = Locator.GetActiveCamera().transform.position; - var direction = Locator.GetActiveCamera().transform.TransformDirection(Vector3.forward); - - data.hit = Physics.Raycast(origin, direction, out RaycastHit hitInfo, 100f, layerMask); - if (data.hit) - { - data.pos = hitInfo.transform.InverseTransformPoint(hitInfo.point); - data.norm = hitInfo.transform.InverseTransformDirection(hitInfo.normal); - var o = hitInfo.transform.gameObject; + Logger.Log($"Raycast hit \"position\": {posText}, \"normal\": {normText} on [{data.bodyName}] at [{data.bodyPath}]"); + } + internal DebugRaycastData Raycast() + { + DebugRaycastData data = new DebugRaycastData(); + + _rb.DisableCollisionDetection(); + int layerMask = OWLayerMask.physicalMask; + var origin = Locator.GetActiveCamera().transform.position; + var direction = Locator.GetActiveCamera().transform.TransformDirection(Vector3.forward); + + data.hit = Physics.Raycast(origin, direction, out RaycastHit hitInfo, 100f, layerMask); + if (data.hit) + { + data.pos = hitInfo.transform.InverseTransformPoint(hitInfo.point); + data.norm = hitInfo.transform.InverseTransformDirection(hitInfo.normal); + var o = hitInfo.transform.gameObject; var hitAstroObject = o.GetComponent() ?? o.GetComponentInParent(); - data.bodyName = o.name; - data.bodyPath = SearchUtilities.GetPath(o.transform); + data.bodyName = o.name; + data.bodyPath = SearchUtilities.GetPath(o.transform); data.hitObject = o; data.hitBodyGameObject = hitAstroObject?.gameObject; data.plane = ConstructPlane(data); - } - _rb.EnableCollisionDetection(); - - return data; + } + _rb.EnableCollisionDetection(); + + return data; } @@ -132,5 +133,5 @@ namespace NewHorizons.Utility.DebugUtilities }; return p; } - } -} + } +} diff --git a/NewHorizons/Utility/DebugUtilities/DebugReload.cs b/NewHorizons/Utility/DebugUtilities/DebugReload.cs index 8e763eab..ac48c7ad 100644 --- a/NewHorizons/Utility/DebugUtilities/DebugReload.cs +++ b/NewHorizons/Utility/DebugUtilities/DebugReload.cs @@ -1,4 +1,4 @@ -using NewHorizons.Handlers; +using NewHorizons.Handlers; using OWML.Common; using OWML.Common.Menus; using System; @@ -45,7 +45,7 @@ namespace NewHorizons.Utility.DebugUtilities Logger.LogWarning("Error While Reloading"); } - GameObject.Find("/PauseMenu/PauseMenuManagers").GetComponent().OnSkipToNextTimeLoop(); + SearchUtilities.Find("/PauseMenu/PauseMenuManagers").GetComponent().OnSkipToNextTimeLoop(); Main.Instance.ChangeCurrentStarSystem(Main.Instance.CurrentStarSystem); diff --git a/NewHorizons/Utility/SearchUtilities.cs b/NewHorizons/Utility/SearchUtilities.cs index 6697ebdc..af140b5d 100644 --- a/NewHorizons/Utility/SearchUtilities.cs +++ b/NewHorizons/Utility/SearchUtilities.cs @@ -129,7 +129,7 @@ namespace NewHorizons.Utility return null; } - public static GameObject Find(string path) + public static GameObject Find(string path, bool warn = true) { if (CachedGameObjects.ContainsKey(path)) { @@ -150,7 +150,7 @@ namespace NewHorizons.Utility var t = root?.transform; if (t == null) { - Logger.LogWarning($"Couldn't find root object in path ({names[0]})"); + if (warn) Logger.LogWarning($"Couldn't find root object in path ({names[0]})"); } else { @@ -162,7 +162,7 @@ namespace NewHorizons.Utility { foreach (Transform c in t.GetComponentsInChildren(true)) { - if (t.name.Equals(names[i])) + if (c.name.Equals(names[i])) { child = c; break; @@ -172,7 +172,7 @@ namespace NewHorizons.Utility if (child == null) { - Logger.LogWarning($"Couldn't find object in path ({names[i]})"); + if (warn) Logger.LogWarning($"Couldn't find object in path ({names[i]})"); t = null; break; } @@ -187,7 +187,7 @@ namespace NewHorizons.Utility if (go == null) { var name = names.Last(); - Logger.LogWarning($"Couldn't find object {path}, will look for potential matches for name {name}"); + if (warn) Logger.LogWarning($"Couldn't find object {path}, will look for potential matches for name {name}"); go = FindObjectOfTypeAndName(name); } diff --git a/NewHorizons/manifest.json b/NewHorizons/manifest.json index 3aa5a918..45398176 100644 --- a/NewHorizons/manifest.json +++ b/NewHorizons/manifest.json @@ -3,7 +3,7 @@ "author": "xen, Bwc9876, & Book", "name": "New Horizons", "uniqueName": "xen.NewHorizons", - "version": "1.2.2", + "version": "1.2.4", "owmlVersion": "2.3.3", "conflicts": [ "Raicuparta.QuantumSpaceBuddies", "Vesper.AutoResume", "PacificEngine.OW_Randomizer" ], "pathsToPreserve": [ "planets", "systems", "translations" ] diff --git a/README.md b/README.md index 93571fe0..ce9b9a73 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ New Horizons was made with help from: - And the Outer Wilds modding server. Translation credits: -- Russian: GrayFix and Tlya +- Russian: Tlya - German: Nolram - Spanish: Ciborgm9 and Ink