Add destruction volumes

This commit is contained in:
Noah Pilarski 2022-11-25 13:42:22 -05:00
parent 9f8fecacb5
commit 0763b306c5
4 changed files with 132 additions and 0 deletions

View File

@ -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<DestructionVolume>(planetGO, sector, info);
volume._deathType = EnumUtils.Parse<DeathType>(info.deathType.ToString(), DeathType.Default);
return volume;
}
}
}

View File

@ -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<TVolume>(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<SphereCollider>();
collider.isTrigger = true;
collider.radius = info.radius;
var owCollider = go.AddComponent<OWCollider>();
owCollider._collider = collider;
var owTriggerVolume = go.AddComponent<OWTriggerVolume>();
owTriggerVolume._owCollider = owCollider;
var volume = go.AddComponent<TVolume>();
volume._collider = collider;
volume._shrinkBodies = info.shrinkBodies;
volume._onlyAffectsPlayerAndShip = info.onlyAffectsPlayerAndShip;
go.SetActive(true);
return volume;
}
}
}

View File

@ -85,6 +85,13 @@ namespace NewHorizons.Builder.Volumes
ZeroGVolumeBuilder.Make(go, sector, zeroGravityVolume); ZeroGVolumeBuilder.Make(go, sector, zeroGravityVolume);
} }
} }
if (config.Volumes.destructionVolumes != null)
{
foreach (var destructionVolume in config.Volumes.destructionVolumes)
{
DestructionVolumeBuilder.Make(go, sector, destructionVolume);
}
}
} }
} }
} }

View File

@ -20,6 +20,11 @@ namespace NewHorizons.External.Modules
/// </summary> /// </summary>
public AudioVolumeInfo[] audioVolumes; public AudioVolumeInfo[] audioVolumes;
/// <summary>
/// Add destruction volumes to this planet.
/// </summary>
public DestructionVolumeInfo[] destructionVolumes;
/// <summary> /// <summary>
/// Add hazard volumes to this planet. /// Add hazard volumes to this planet.
/// </summary> /// </summary>
@ -262,6 +267,49 @@ namespace NewHorizons.External.Modules
[EnumMember(Value = @"electrical")] Electrical [EnumMember(Value = @"electrical")] Electrical
} }
} }
[JsonObject]
public class VanishVolumeInfo : VolumeInfo
{
/// <summary>
/// Whether the bodies will shrink when they enter this volume or just disappear instantly.
/// </summary>
[DefaultValue(true)] public bool shrinkBodies = true;
/// <summary>
/// Whether this volume only affects the player and ship.
/// </summary>
public bool onlyAffectsPlayerAndShip;
}
[JsonObject]
public class DestructionVolumeInfo : VanishVolumeInfo
{
/// <summary>
/// The type of death the player will have if they enter this volume.
/// </summary>
[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))] [JsonConverter(typeof(StringEnumConverter))]