From 9fe04aad7d76362ec6ccdf03dca75374813223ea Mon Sep 17 00:00:00 2001 From: Joshua Thome Date: Sat, 22 Feb 2025 14:12:59 -0600 Subject: [PATCH] Unify volume builders and support shapes on all volume types --- .../Builder/Body/SingularityBuilder.cs | 1 + NewHorizons/Builder/Props/ShapeBuilder.cs | 25 +++++++++ .../Builder/Volumes/AudioVolumeBuilder.cs | 9 ++-- .../Volumes/ChangeStarSystemVolumeBuilder.cs | 2 + .../Builder/Volumes/CreditsVolumeBuilder.cs | 2 + .../Volumes/DayNightAudioVolumeBuilder.cs | 11 ++-- .../Volumes/DestructionVolumeBuilder.cs | 2 + .../Builder/Volumes/FluidVolumeBuilder.cs | 2 + .../Builder/Volumes/ForceVolumeBuilder.cs | 42 ++++++--------- .../Builder/Volumes/HazardVolumeBuilder.cs | 54 ++++++++++--------- .../Volumes/NotificationVolumeBuilder.cs | 13 ++--- .../Builder/Volumes/OxygenVolumeBuilder.cs | 2 + .../Builder/Volumes/PriorityVolumeBuilder.cs | 11 ++++ .../Rulesets/PlayerImpactRulesetBuilder.cs | 2 + .../Volumes/Rulesets/ProbeRulesetBuilder.cs | 2 + .../Volumes/Rulesets/ThrustRulesetBuilder.cs | 2 + .../Builder/Volumes/SpeedTrapVolumeBuilder.cs | 2 + .../Builder/Volumes/VanishVolumeBuilder.cs | 20 +------ .../VisorFrostEffectVolumeBuilder.cs | 2 + .../VisorRainEffectVolumeBuilder.cs | 2 + NewHorizons/Builder/Volumes/VolumeBuilder.cs | 37 +++++++++---- .../Builder/Volumes/VolumesBuildManager.cs | 18 +++---- .../Builder/Volumes/ZeroGVolumeBuilder.cs | 2 + .../Volumes/VolumeInfos/ForceVolumeInfo.cs | 5 -- .../Modules/Volumes/VolumeInfos/VolumeInfo.cs | 8 ++- 25 files changed, 161 insertions(+), 117 deletions(-) diff --git a/NewHorizons/Builder/Body/SingularityBuilder.cs b/NewHorizons/Builder/Body/SingularityBuilder.cs index eb8863c8..f7d303ef 100644 --- a/NewHorizons/Builder/Body/SingularityBuilder.cs +++ b/NewHorizons/Builder/Body/SingularityBuilder.cs @@ -150,6 +150,7 @@ namespace NewHorizons.Builder.Body streamingVolume.streamingGroup = streamingGroup; streamingVolume.transform.parent = blackHoleVolume.transform; streamingVolume.transform.localPosition = Vector3.zero; + streamingVolume.gameObject.SetActive(true); } } catch (Exception e) diff --git a/NewHorizons/Builder/Props/ShapeBuilder.cs b/NewHorizons/Builder/Props/ShapeBuilder.cs index e7594f6e..7e224e98 100644 --- a/NewHorizons/Builder/Props/ShapeBuilder.cs +++ b/NewHorizons/Builder/Props/ShapeBuilder.cs @@ -11,6 +11,31 @@ namespace NewHorizons.Builder.Props { public static class ShapeBuilder { + public static OWTriggerVolume AddTriggerVolume(GameObject go, ShapeInfo info, float defaultRadius) + { + var owTriggerVolume = go.AddComponent(); + + if (info != null) + { + var shapeOrCol = AddShapeOrCollider(go, info); + if (shapeOrCol is Shape shape) + owTriggerVolume._shape = shape; + else if (shapeOrCol is Collider col) + owTriggerVolume._owCollider = col.GetComponent(); + } + else + { + var col = go.AddComponent(); + col.radius = defaultRadius; + col.isTrigger = true; + var owCollider = go.GetAddComponent(); + + owTriggerVolume._owCollider = owCollider; + } + + return owTriggerVolume; + } + public static Component AddShapeOrCollider(GameObject go, ShapeInfo info) { if (info.useShape.HasValue) diff --git a/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs b/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs index 6b961a79..0c209154 100644 --- a/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs @@ -25,7 +25,8 @@ namespace NewHorizons.Builder.Volumes owAudioSource.SetTrack(info.track.ConvertToOW()); AudioUtilities.SetAudioClip(owAudioSource, info.audio, mod); - var audioVolume = go.AddComponent(); + var audioVolume = PriorityVolumeBuilder.MakeExisting(go, planetGO, sector, info); + audioVolume._layer = info.layer; audioVolume.SetPriority(info.priority); audioVolume._fadeSeconds = info.fadeSeconds; @@ -33,11 +34,7 @@ namespace NewHorizons.Builder.Volumes audioVolume._randomizePlayhead = info.randomizePlayhead; audioVolume._pauseOnFadeOut = info.pauseOnFadeOut; - var shape = go.AddComponent(); - shape.radius = info.radius; - - var owTriggerVolume = go.AddComponent(); - owTriggerVolume._shape = shape; + var owTriggerVolume = go.GetComponent(); audioVolume._triggerVolumeOverride = owTriggerVolume; go.SetActive(true); diff --git a/NewHorizons/Builder/Volumes/ChangeStarSystemVolumeBuilder.cs b/NewHorizons/Builder/Volumes/ChangeStarSystemVolumeBuilder.cs index 5557da98..54eddc3d 100644 --- a/NewHorizons/Builder/Volumes/ChangeStarSystemVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/ChangeStarSystemVolumeBuilder.cs @@ -13,6 +13,8 @@ namespace NewHorizons.Builder.Volumes volume.TargetSolarSystem = info.targetStarSystem; volume.TargetSpawnID = info.spawnPointID; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/CreditsVolumeBuilder.cs b/NewHorizons/Builder/Volumes/CreditsVolumeBuilder.cs index 81c3c6ce..5692c3e5 100644 --- a/NewHorizons/Builder/Volumes/CreditsVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/CreditsVolumeBuilder.cs @@ -14,6 +14,8 @@ namespace NewHorizons.Builder.Volumes volume.gameOver = info.gameOver; volume.deathType = info.deathType == null ? null : EnumUtils.Parse(info.deathType.ToString(), DeathType.Default); + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/DayNightAudioVolumeBuilder.cs b/NewHorizons/Builder/Volumes/DayNightAudioVolumeBuilder.cs index b2ed1ce1..875bba75 100644 --- a/NewHorizons/Builder/Volumes/DayNightAudioVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/DayNightAudioVolumeBuilder.cs @@ -15,7 +15,8 @@ namespace NewHorizons.Builder.Volumes var go = GeneralPropBuilder.MakeNew("DayNightAudioVolume", planetGO, sector, info); go.layer = Layer.AdvancedEffectVolume; - var audioVolume = go.AddComponent(); + var audioVolume = PriorityVolumeBuilder.MakeExisting(go, planetGO, sector, info); + audioVolume.sunName = info.sun; audioVolume.dayWindow = info.dayWindow; audioVolume.dayAudio = info.dayAudio; @@ -24,13 +25,7 @@ namespace NewHorizons.Builder.Volumes audioVolume.volume = info.volume; audioVolume.SetTrack(info.track.ConvertToOW()); - var shape = go.AddComponent(); - shape.radius = info.radius; - - var owTriggerVolume = go.AddComponent(); - owTriggerVolume._shape = shape; - - go.SetActive(true); + audioVolume.gameObject.SetActive(true); return audioVolume; } diff --git a/NewHorizons/Builder/Volumes/DestructionVolumeBuilder.cs b/NewHorizons/Builder/Volumes/DestructionVolumeBuilder.cs index ad93ad7f..d633d27c 100644 --- a/NewHorizons/Builder/Volumes/DestructionVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/DestructionVolumeBuilder.cs @@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes volume._deathType = EnumUtils.Parse(info.deathType.ToString(), DeathType.Default); + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/FluidVolumeBuilder.cs b/NewHorizons/Builder/Volumes/FluidVolumeBuilder.cs index e2839bd3..70b6d399 100644 --- a/NewHorizons/Builder/Volumes/FluidVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/FluidVolumeBuilder.cs @@ -35,6 +35,8 @@ namespace NewHorizons.Builder.Volumes volume._allowShipAutoroll = info.allowShipAutoroll; volume._disableOnStart = info.disableOnStart; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/ForceVolumeBuilder.cs b/NewHorizons/Builder/Volumes/ForceVolumeBuilder.cs index 12e1f83f..ebc5c360 100644 --- a/NewHorizons/Builder/Volumes/ForceVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/ForceVolumeBuilder.cs @@ -18,28 +18,35 @@ namespace NewHorizons.Builder.Volumes public static CylindricalForceVolume Make(GameObject planetGO, Sector sector, CylindricalForceVolumeInfo info) { var forceVolume = Make(planetGO, sector, info); + forceVolume._acceleration = info.force; forceVolume._localAxis = info.normal ?? Vector3.up; forceVolume._playGravityCrystalAudio = info.playGravityCrystalAudio; + forceVolume.gameObject.SetActive(true); + return forceVolume; } public static DirectionalForceVolume Make(GameObject planetGO, Sector sector, DirectionalForceVolumeInfo info) { var forceVolume = Make(planetGO, sector, info); + forceVolume._fieldDirection = info.normal ?? Vector3.up; forceVolume._fieldMagnitude = info.force; forceVolume._affectsAlignment = info.affectsAlignment; forceVolume._offsetCentripetalForce = info.offsetCentripetalForce; forceVolume._playGravityCrystalAudio = info.playGravityCrystalAudio; + forceVolume.gameObject.SetActive(true); + return forceVolume; } public static GravityVolume Make(GameObject planetGO, Sector sector, GravityVolumeInfo info) { var forceVolume = Make(planetGO, sector, info); + forceVolume._isPlanetGravityVolume = false; forceVolume._setMass = false; forceVolume._surfaceAcceleration = info.force; @@ -54,23 +61,29 @@ namespace NewHorizons.Builder.Volumes GravityFallOff.InverseSquared => GravityVolume.FalloffType.inverseSquared, _ => throw new NotImplementedException(), }; + forceVolume.gameObject.SetActive(true); + return forceVolume; } public static PolarForceVolume Make(GameObject planetGO, Sector sector, PolarForceVolumeInfo info) { var forceVolume = Make(planetGO, sector, info); + forceVolume._acceleration = info.force; forceVolume._localAxis = info.normal ?? Vector3.up; forceVolume._fieldMode = info.tangential ? PolarForceVolume.ForceMode.Tangential : PolarForceVolume.ForceMode.Polar; + forceVolume.gameObject.SetActive(true); + return forceVolume; } public static RadialForceVolume Make(GameObject planetGO, Sector sector, RadialForceVolumeInfo info) { var forceVolume = Make(planetGO, sector, info); + forceVolume._acceleration = info.force; forceVolume._falloff = info.fallOff switch { @@ -79,37 +92,16 @@ namespace NewHorizons.Builder.Volumes RadialForceVolumeInfo.FallOff.InverseSquared => RadialForceVolume.Falloff.InvSqr, _ => throw new NotImplementedException(), }; + forceVolume.gameObject.SetActive(true); + return forceVolume; } - public static T Make(GameObject planetGO, Sector sector, ForceVolumeInfo info) where T : ForceVolume + public static TVolume Make(GameObject planetGO, Sector sector, ForceVolumeInfo info) where TVolume : ForceVolume { - var go = GeneralPropBuilder.MakeNew(typeof(T).Name, planetGO, sector, info); - go.layer = Layer.BasicEffectVolume; + var forceVolume = PriorityVolumeBuilder.Make(planetGO, sector, info); - var owTriggerVolume = go.AddComponent(); - - if (info.shape != null) - { - var shapeOrCol = ShapeBuilder.AddShapeOrCollider(go, info.shape); - if (shapeOrCol is Shape shape) - owTriggerVolume._shape = shape; - else if (shapeOrCol is Collider col) - owTriggerVolume._owCollider = col.GetComponent(); - } - else - { - var col = go.AddComponent(); - col.radius = info.radius; - col.isTrigger = true; - var owCollider = go.GetAddComponent(); - - owTriggerVolume._owCollider = owCollider; - } - - var forceVolume = go.AddComponent(); - forceVolume._priority = info.priority; forceVolume._alignmentPriority = info.alignmentPriority; forceVolume._inheritable = info.inheritable; diff --git a/NewHorizons/Builder/Volumes/HazardVolumeBuilder.cs b/NewHorizons/Builder/Volumes/HazardVolumeBuilder.cs index f26f0c2e..1d5fe013 100644 --- a/NewHorizons/Builder/Volumes/HazardVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/HazardVolumeBuilder.cs @@ -3,6 +3,7 @@ using NewHorizons.External.Modules.Volumes.VolumeInfos; using NewHorizons.Utility.OuterWilds; using OWML.Common; using OWML.Utils; +using System; using System.Linq; using UnityEngine; @@ -13,35 +14,28 @@ namespace NewHorizons.Builder.Volumes public static HazardVolume Make(GameObject planetGO, Sector sector, OWRigidbody owrb, HazardVolumeInfo info, IModBehaviour mod) { var go = GeneralPropBuilder.MakeNew("HazardVolume", planetGO, sector, info); - go.layer = Layer.BasicEffectVolume; - - var shape = go.AddComponent(); - shape.radius = info.radius; - - var owTriggerVolume = go.AddComponent(); - owTriggerVolume._shape = shape; - - var volume = AddHazardVolume(go, sector, owrb, info.type, info.firstContactDamageType, info.firstContactDamage, info.damagePerSecond); + + var volume = MakeExisting(go, planetGO, sector, owrb, info); go.SetActive(true); return volume; } - public static HazardVolume AddHazardVolume(GameObject go, Sector sector, OWRigidbody owrb, HazardVolumeInfo.HazardType? type, HazardVolumeInfo.InstantDamageType? firstContactDamageType, float firstContactDamage, float damagePerSecond) + public static HazardVolume MakeExisting(GameObject go, GameObject planetGO, Sector sector, OWRigidbody owrb, HazardVolumeInfo info) { HazardVolume hazardVolume = null; - if (type == HazardVolumeInfo.HazardType.RIVERHEAT) + if (info.type == HazardVolumeInfo.HazardType.RIVERHEAT) { - hazardVolume = go.AddComponent(); + hazardVolume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); } - else if (type == HazardVolumeInfo.HazardType.HEAT) + else if (info.type == HazardVolumeInfo.HazardType.HEAT) { - hazardVolume = go.AddComponent(); + hazardVolume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); } - else if (type == HazardVolumeInfo.HazardType.DARKMATTER) + else if (info.type == HazardVolumeInfo.HazardType.DARKMATTER) { - hazardVolume = go.AddComponent(); + hazardVolume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); var visorFrostEffectVolume = go.AddComponent(); visorFrostEffectVolume._frostRate = 0.5f; visorFrostEffectVolume._maxFrost = 0.91f; @@ -67,28 +61,38 @@ namespace NewHorizons.Builder.Volumes submerge._fluidDetector = detector; } } - else if (type == HazardVolumeInfo.HazardType.ELECTRICITY) + else if (info.type == HazardVolumeInfo.HazardType.ELECTRICITY) { - var electricityVolume = go.AddComponent(); + var electricityVolume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); electricityVolume._shockAudioPool = new OWAudioSource[0]; hazardVolume = electricityVolume; } else { var simpleHazardVolume = go.AddComponent(); - simpleHazardVolume._type = EnumUtils.Parse(type.ToString(), HazardVolume.HazardType.GENERAL); + simpleHazardVolume._type = EnumUtils.Parse(info.type.ToString(), HazardVolume.HazardType.GENERAL); hazardVolume = simpleHazardVolume; } hazardVolume._attachedBody = owrb; - hazardVolume._damagePerSecond = type == null ? 0f : damagePerSecond; + hazardVolume._damagePerSecond = info.type == HazardVolumeInfo.HazardType.NONE ? 0f : info.damagePerSecond; - if (firstContactDamageType != null) - { - hazardVolume._firstContactDamageType = EnumUtils.Parse(firstContactDamageType.ToString(), InstantDamageType.Impact); - hazardVolume._firstContactDamage = firstContactDamage; - } + hazardVolume._firstContactDamageType = EnumUtils.Parse(info.firstContactDamageType.ToString(), InstantDamageType.Impact); + hazardVolume._firstContactDamage = info.firstContactDamage; return hazardVolume; } + + public static HazardVolume AddHazardVolume(GameObject go, Sector sector, OWRigidbody owrb, HazardVolumeInfo.HazardType? type, HazardVolumeInfo.InstantDamageType? firstContactDamageType, float firstContactDamage, float damagePerSecond) + { + var planetGO = sector.transform.root.gameObject; + return MakeExisting(go, planetGO, sector, owrb, new HazardVolumeInfo + { + radius = 0f, // Volume builder should skip creating an extra trigger volume and collider if radius is 0 + type = type ?? HazardVolumeInfo.HazardType.NONE, + firstContactDamageType = firstContactDamageType ?? HazardVolumeInfo.InstantDamageType.Impact, + firstContactDamage = firstContactDamage, + damagePerSecond = damagePerSecond + }); + } } } diff --git a/NewHorizons/Builder/Volumes/NotificationVolumeBuilder.cs b/NewHorizons/Builder/Volumes/NotificationVolumeBuilder.cs index 18f51e69..bf4bbe3f 100644 --- a/NewHorizons/Builder/Volumes/NotificationVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/NotificationVolumeBuilder.cs @@ -11,21 +11,16 @@ namespace NewHorizons.Builder.Volumes { public static NHNotificationVolume Make(GameObject planetGO, Sector sector, NotificationVolumeInfo info, IModBehaviour mod) { - var go = GeneralPropBuilder.MakeNew("NotificationVolume", planetGO, sector, info); - go.layer = Layer.BasicEffectVolume; + var notificationVolume = VolumeBuilder.Make(planetGO, sector, info); - var shape = go.AddComponent(); - shape.radius = info.radius; + // Preserving name for backwards compatibility + notificationVolume.gameObject.name = string.IsNullOrEmpty(info.rename) ? "NotificationVolume" : info.rename; - var owTriggerVolume = go.AddComponent(); - owTriggerVolume._shape = shape; - - var notificationVolume = go.AddComponent(); notificationVolume.SetTarget(info.target); if (info.entryNotification != null) notificationVolume.SetEntryNotification(info.entryNotification.displayMessage, info.entryNotification.duration); if (info.exitNotification != null) notificationVolume.SetExitNotification(info.exitNotification.displayMessage, info.exitNotification.duration); - go.SetActive(true); + notificationVolume.gameObject.SetActive(true); return notificationVolume; } diff --git a/NewHorizons/Builder/Volumes/OxygenVolumeBuilder.cs b/NewHorizons/Builder/Volumes/OxygenVolumeBuilder.cs index 3fa34dfe..bcd1aa77 100644 --- a/NewHorizons/Builder/Volumes/OxygenVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/OxygenVolumeBuilder.cs @@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes volume._treeVolume = info.treeVolume; volume._playRefillAudio = info.playRefillAudio; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/PriorityVolumeBuilder.cs b/NewHorizons/Builder/Volumes/PriorityVolumeBuilder.cs index f3cce567..fc76910f 100644 --- a/NewHorizons/Builder/Volumes/PriorityVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/PriorityVolumeBuilder.cs @@ -5,6 +5,17 @@ namespace NewHorizons.Builder.Volumes { public static class PriorityVolumeBuilder { + public static TVolume MakeExisting(GameObject go, GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume + { + var volume = VolumeBuilder.MakeExisting(go, planetGO, sector, info); + + volume._layer = info.layer; + volume.SetPriority(info.priority); + + return volume; + } + + public static TVolume Make(GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume { var volume = VolumeBuilder.Make(planetGO, sector, info); diff --git a/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs b/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs index f892ea07..988e9da8 100644 --- a/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs +++ b/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs @@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes.Rulesets volume.minImpactSpeed = info.minImpactSpeed; volume.maxImpactSpeed = info.maxImpactSpeed; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs b/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs index 98823ffa..b0768324 100644 --- a/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs +++ b/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs @@ -15,6 +15,8 @@ namespace NewHorizons.Builder.Volumes.Rulesets volume._lanternRange = info.lanternRange; volume._ignoreAnchor = info.ignoreAnchor; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs b/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs index 8a49808d..5e158ecd 100644 --- a/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs +++ b/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs @@ -13,6 +13,8 @@ namespace NewHorizons.Builder.Volumes.Rulesets volume._nerfJetpackBooster = info.nerfJetpackBooster; volume._nerfDuration = info.nerfDuration; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/SpeedTrapVolumeBuilder.cs b/NewHorizons/Builder/Volumes/SpeedTrapVolumeBuilder.cs index fa1ed9bc..1b9319ed 100644 --- a/NewHorizons/Builder/Volumes/SpeedTrapVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/SpeedTrapVolumeBuilder.cs @@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes volume._speedLimit = info.speedLimit; volume._acceleration = info.acceleration; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs b/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs index 9bc2a514..4b312a60 100644 --- a/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs @@ -1,6 +1,4 @@ -using NewHorizons.Builder.Props; using NewHorizons.External.Modules.Volumes.VolumeInfos; -using NewHorizons.Utility.OuterWilds; using UnityEngine; namespace NewHorizons.Builder.Volumes @@ -9,27 +7,13 @@ namespace NewHorizons.Builder.Volumes { public static TVolume Make(GameObject planetGO, Sector sector, VanishVolumeInfo info) where TVolume : VanishVolume { - var go = GeneralPropBuilder.MakeNew(typeof(TVolume).Name, planetGO, sector, info); - go.layer = Layer.BasicEffectVolume; - - var collider = go.AddComponent(); - collider.isTrigger = true; - collider.radius = info.radius; - - var owCollider = go.AddComponent(); - owCollider._collider = collider; - - var owTriggerVolume = go.AddComponent(); - owTriggerVolume._owCollider = owCollider; - - var volume = go.AddComponent(); + var volume = VolumeBuilder.Make(planetGO, sector, info); + var collider = volume.gameObject.GetComponent(); volume._collider = collider; volume._shrinkBodies = info.shrinkBodies; volume._onlyAffectsPlayerAndShip = info.onlyAffectsPlayerRelatedBodies; - go.SetActive(true); - return volume; } } diff --git a/NewHorizons/Builder/Volumes/VisorEffects/VisorFrostEffectVolumeBuilder.cs b/NewHorizons/Builder/Volumes/VisorEffects/VisorFrostEffectVolumeBuilder.cs index 793d72b4..c33886e2 100644 --- a/NewHorizons/Builder/Volumes/VisorEffects/VisorFrostEffectVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/VisorEffects/VisorFrostEffectVolumeBuilder.cs @@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes.VisorEffects volume._frostRate = info.frostRate; volume._maxFrost = info.maxFrost; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/VisorEffects/VisorRainEffectVolumeBuilder.cs b/NewHorizons/Builder/Volumes/VisorEffects/VisorRainEffectVolumeBuilder.cs index e07c95e6..6f7c9c01 100644 --- a/NewHorizons/Builder/Volumes/VisorEffects/VisorRainEffectVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/VisorEffects/VisorRainEffectVolumeBuilder.cs @@ -13,6 +13,8 @@ namespace NewHorizons.Builder.Volumes.VisorEffects volume._dropletRate = info.dropletRate; volume._streakRate = info.streakRate; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/Builder/Volumes/VolumeBuilder.cs b/NewHorizons/Builder/Volumes/VolumeBuilder.cs index 0ee5d0b7..061ea559 100644 --- a/NewHorizons/Builder/Volumes/VolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/VolumeBuilder.cs @@ -7,21 +7,36 @@ namespace NewHorizons.Builder.Volumes { public static class VolumeBuilder { + public static TVolume MakeExisting(GameObject go, GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour + { + // Respect existing layer if set to a valid volume layer + if (go.layer != Layer.AdvancedEffectVolume) + { + go.layer = Layer.BasicEffectVolume; + } + + // Skip creating a trigger volume if one already exists and has a shape set and we aren't overriding it + var trigger = go.GetComponent(); + if (trigger == null || (trigger._shape == null && trigger._owCollider == null) || info.shape != null || info.radius > 0f) + { + ShapeBuilder.AddTriggerVolume(go, info.shape, info.radius); + } + + var volume = go.AddComponent(); + + return volume; + } + public static TVolume Make(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour //Could be BaseVolume but I need to create vanilla volumes too. { var go = GeneralPropBuilder.MakeNew(typeof(TVolume).Name, planetGO, sector, info); - go.layer = Layer.BasicEffectVolume; - - var shape = go.AddComponent(); - shape.radius = info.radius; - - var owTriggerVolume = go.AddComponent(); - owTriggerVolume._shape = shape; - - var volume = go.AddComponent(); - - go.SetActive(true); + return MakeExisting(go, planetGO, sector, info); + } + public static TVolume MakeAndEnable(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour + { + var volume = Make(planetGO, sector, info); + volume.gameObject.SetActive(true); return volume; } } diff --git a/NewHorizons/Builder/Volumes/VolumesBuildManager.cs b/NewHorizons/Builder/Volumes/VolumesBuildManager.cs index acd48bf1..66c33c49 100644 --- a/NewHorizons/Builder/Volumes/VolumesBuildManager.cs +++ b/NewHorizons/Builder/Volumes/VolumesBuildManager.cs @@ -60,28 +60,28 @@ namespace NewHorizons.Builder.Volumes { foreach (var mapRestrictionVolume in config.Volumes.mapRestrictionVolumes) { - VolumeBuilder.Make(go, sector, mapRestrictionVolume); + VolumeBuilder.MakeAndEnable(go, sector, mapRestrictionVolume); } } if (config.Volumes.interferenceVolumes != null) { foreach (var interferenceVolume in config.Volumes.interferenceVolumes) { - VolumeBuilder.Make(go, sector, interferenceVolume); + VolumeBuilder.MakeAndEnable(go, sector, interferenceVolume); } } if (config.Volumes.reverbVolumes != null) { foreach (var reverbVolume in config.Volumes.reverbVolumes) { - VolumeBuilder.Make(go, sector, reverbVolume); + VolumeBuilder.MakeAndEnable(go, sector, reverbVolume); } } if (config.Volumes.insulatingVolumes != null) { foreach (var insulatingVolume in config.Volumes.insulatingVolumes) { - VolumeBuilder.Make(go, sector, insulatingVolume); + VolumeBuilder.MakeAndEnable(go, sector, insulatingVolume); } } if (config.Volumes.zeroGravityVolumes != null) @@ -156,14 +156,14 @@ namespace NewHorizons.Builder.Volumes { foreach (var destructionVolume in config.Volumes.probe.destructionVolumes) { - VolumeBuilder.Make(go, sector, destructionVolume); + VolumeBuilder.MakeAndEnable(go, sector, destructionVolume); } } if (config.Volumes.probe.safetyVolumes != null) { foreach (var safetyVolume in config.Volumes.probe.safetyVolumes) { - VolumeBuilder.Make(go, sector, safetyVolume); + VolumeBuilder.MakeAndEnable(go, sector, safetyVolume); } } } @@ -190,7 +190,7 @@ namespace NewHorizons.Builder.Volumes { foreach (var antiTravelMusicRuleset in config.Volumes.rulesets.antiTravelMusicRulesets) { - VolumeBuilder.Make(go, sector, antiTravelMusicRuleset); + VolumeBuilder.MakeAndEnable(go, sector, antiTravelMusicRuleset); } } if (config.Volumes.rulesets.playerImpactRulesets != null) @@ -219,7 +219,7 @@ namespace NewHorizons.Builder.Volumes { foreach (var referenceFrameBlockerVolume in config.Volumes.referenceFrameBlockerVolumes) { - VolumeBuilder.Make(go, sector, referenceFrameBlockerVolume); + VolumeBuilder.MakeAndEnable(go, sector, referenceFrameBlockerVolume); } } if (config.Volumes.speedTrapVolumes != null) @@ -233,7 +233,7 @@ namespace NewHorizons.Builder.Volumes { foreach (var lightSourceVolume in config.Volumes.lightSourceVolumes) { - VolumeBuilder.Make(go, sector, lightSourceVolume); + VolumeBuilder.MakeAndEnable(go, sector, lightSourceVolume); } } if (config.Volumes.solarSystemVolume != null) diff --git a/NewHorizons/Builder/Volumes/ZeroGVolumeBuilder.cs b/NewHorizons/Builder/Volumes/ZeroGVolumeBuilder.cs index afdde0b8..70ecc7e1 100644 --- a/NewHorizons/Builder/Volumes/ZeroGVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/ZeroGVolumeBuilder.cs @@ -11,6 +11,8 @@ namespace NewHorizons.Builder.Volumes volume._inheritable = true; + volume.gameObject.SetActive(true); + return volume; } } diff --git a/NewHorizons/External/Modules/Volumes/VolumeInfos/ForceVolumeInfo.cs b/NewHorizons/External/Modules/Volumes/VolumeInfos/ForceVolumeInfo.cs index 4d5fe636..e56a3ca5 100644 --- a/NewHorizons/External/Modules/Volumes/VolumeInfos/ForceVolumeInfo.cs +++ b/NewHorizons/External/Modules/Volumes/VolumeInfos/ForceVolumeInfo.cs @@ -12,11 +12,6 @@ namespace NewHorizons.External.Modules.Volumes.VolumeInfos [JsonObject] public class ForceVolumeInfo : PriorityVolumeInfo { - /// - /// The shape of this volume. Defaults to a sphere shape with a radius of `radius`. - /// - public ShapeInfo shape; - /// /// The force applied by this volume. Can be negative to reverse the direction. /// diff --git a/NewHorizons/External/Modules/Volumes/VolumeInfos/VolumeInfo.cs b/NewHorizons/External/Modules/Volumes/VolumeInfos/VolumeInfo.cs index 17cee4bb..94f7a41b 100644 --- a/NewHorizons/External/Modules/Volumes/VolumeInfos/VolumeInfo.cs +++ b/NewHorizons/External/Modules/Volumes/VolumeInfos/VolumeInfo.cs @@ -1,3 +1,4 @@ +using NewHorizons.External.Modules.Props; using Newtonsoft.Json; using System.ComponentModel; @@ -7,8 +8,13 @@ namespace NewHorizons.External.Modules.Volumes.VolumeInfos public class VolumeInfo : GeneralPropInfo { /// - /// The radius of this volume. + /// The radius of this volume, if a shape is not specified. /// [DefaultValue(1f)] public float radius = 1f; + + /// + /// The shape of this volume. Defaults to a sphere with a radius of `radius` if not specified. + /// + public ShapeInfo shape; } }