mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Add destruction volumes
This commit is contained in:
parent
9f8fecacb5
commit
0763b306c5
18
NewHorizons/Builder/Volumes/DestructionVolumeBuilder.cs
Normal file
18
NewHorizons/Builder/Volumes/DestructionVolumeBuilder.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
59
NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs
Normal file
59
NewHorizons/Builder/Volumes/VanishVolumeBuilder.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
48
NewHorizons/External/Modules/VolumesModule.cs
vendored
48
NewHorizons/External/Modules/VolumesModule.cs
vendored
@ -20,6 +20,11 @@ namespace NewHorizons.External.Modules
|
||||
/// </summary>
|
||||
public AudioVolumeInfo[] audioVolumes;
|
||||
|
||||
/// <summary>
|
||||
/// Add destruction volumes to this planet.
|
||||
/// </summary>
|
||||
public DestructionVolumeInfo[] destructionVolumes;
|
||||
|
||||
/// <summary>
|
||||
/// Add hazard volumes to this planet.
|
||||
/// </summary>
|
||||
@ -262,6 +267,49 @@ namespace NewHorizons.External.Modules
|
||||
[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))]
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user