diff --git a/NewHorizons/Builder/Volumes/DestructionVolumeBuilder.cs b/NewHorizons/Builder/Volumes/DestructionVolumeBuilder.cs new file mode 100644 index 00000000..b657cce0 --- /dev/null +++ b/NewHorizons/Builder/Volumes/DestructionVolumeBuilder.cs @@ -0,0 +1,18 @@ +using NewHorizons.External.Modules; +using OWML.Utils; +using UnityEngine; + +namespace NewHorizons.Builder.Volumes +{ + public static class DestructionVolumeBuilder + { + public static DestructionVolume Make(GameObject planetGO, Sector sector, VolumesModule.DestructionVolumeInfo info) + { + var volume = VanishVolumeBuilder.Make(planetGO, sector, info); + + volume._deathType = EnumUtils.Parse(info.deathType.ToString(), DeathType.Default); + + return volume; + } + } +} diff --git a/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs b/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs new file mode 100644 index 00000000..451d1c4b --- /dev/null +++ b/NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs @@ -0,0 +1,59 @@ +using NewHorizons.Components; +using NewHorizons.External.Modules; +using UnityEngine; +using Logger = NewHorizons.Utility.Logger; + +namespace NewHorizons.Builder.Volumes +{ + public static class VanishVolumeBuilder + { + public static TVolume Make(GameObject planetGO, Sector sector, VolumesModule.VanishVolumeInfo info) where TVolume : VanishVolume + { + var go = new GameObject(typeof(TVolume).Name); + go.SetActive(false); + + go.transform.parent = sector?.transform ?? planetGO.transform; + + if (!string.IsNullOrEmpty(info.rename)) + { + go.name = info.rename; + } + + if (!string.IsNullOrEmpty(info.parentPath)) + { + var newParent = planetGO.transform.Find(info.parentPath); + if (newParent != null) + { + go.transform.parent = newParent; + } + else + { + Logger.LogWarning($"Cannot find parent object at path: {planetGO.name}/{info.parentPath}"); + } + } + + go.transform.position = planetGO.transform.TransformPoint(info.position != null ? (Vector3)info.position : Vector3.zero); + go.layer = LayerMask.NameToLayer("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(); + + volume._collider = collider; + volume._shrinkBodies = info.shrinkBodies; + volume._onlyAffectsPlayerAndShip = info.onlyAffectsPlayerAndShip; + + go.SetActive(true); + + return volume; + } + } +} diff --git a/NewHorizons/Builder/Volumes/VolumesBuildManager.cs b/NewHorizons/Builder/Volumes/VolumesBuildManager.cs index 74815e13..fdb2c2f1 100644 --- a/NewHorizons/Builder/Volumes/VolumesBuildManager.cs +++ b/NewHorizons/Builder/Volumes/VolumesBuildManager.cs @@ -85,6 +85,13 @@ namespace NewHorizons.Builder.Volumes ZeroGVolumeBuilder.Make(go, sector, zeroGravityVolume); } } + if (config.Volumes.destructionVolumes != null) + { + foreach (var destructionVolume in config.Volumes.destructionVolumes) + { + DestructionVolumeBuilder.Make(go, sector, destructionVolume); + } + } } } } diff --git a/NewHorizons/External/Modules/VolumesModule.cs b/NewHorizons/External/Modules/VolumesModule.cs index 34986d58..753fe6b1 100644 --- a/NewHorizons/External/Modules/VolumesModule.cs +++ b/NewHorizons/External/Modules/VolumesModule.cs @@ -20,6 +20,11 @@ namespace NewHorizons.External.Modules /// public AudioVolumeInfo[] audioVolumes; + /// + /// Add destruction volumes to this planet. + /// + public DestructionVolumeInfo[] destructionVolumes; + /// /// Add hazard volumes to this planet. /// @@ -262,6 +267,49 @@ namespace NewHorizons.External.Modules [EnumMember(Value = @"electrical")] Electrical } } + + [JsonObject] + public class VanishVolumeInfo : VolumeInfo + { + /// + /// Whether the bodies will shrink when they enter this volume or just disappear instantly. + /// + [DefaultValue(true)] public bool shrinkBodies = true; + + /// + /// Whether this volume only affects the player and ship. + /// + public bool onlyAffectsPlayerAndShip; + } + + [JsonObject] + public class DestructionVolumeInfo : VanishVolumeInfo + { + /// + /// The type of death the player will have if they enter this volume. + /// + [DefaultValue("default")] public DeathType deathType = DeathType.Default; + + [JsonConverter(typeof(StringEnumConverter))] + public enum DeathType + { + [EnumMember(Value = @"default")] Default, + [EnumMember(Value = @"impact")] Impact, + [EnumMember(Value = @"asphyxiation")] Asphyxiation, + [EnumMember(Value = @"energy")] Energy, + [EnumMember(Value = @"supernova")] Supernova, + [EnumMember(Value = @"digestion")] Digestion, + [EnumMember(Value = @"bigBang")] BigBang, + [EnumMember(Value = @"crushed")] Crushed, + [EnumMember(Value = @"meditation")] Meditation, + [EnumMember(Value = @"timeLoop")] TimeLoop, + [EnumMember(Value = @"lava")] Lava, + [EnumMember(Value = @"blackHole")] BlackHole, + [EnumMember(Value = @"dream")] Dream, + [EnumMember(Value = @"dreamExplosion")] DreamExplosion, + [EnumMember(Value = @"crushedByElevator")] CrushedByElevator + } + } } [JsonConverter(typeof(StringEnumConverter))]