Unify volume builders and support shapes on all volume types

This commit is contained in:
Joshua Thome 2025-02-22 14:12:59 -06:00
parent be1b408da3
commit 9fe04aad7d
25 changed files with 161 additions and 117 deletions

View File

@ -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)

View File

@ -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<OWTriggerVolume>();
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<OWCollider>();
}
else
{
var col = go.AddComponent<SphereCollider>();
col.radius = defaultRadius;
col.isTrigger = true;
var owCollider = go.GetAddComponent<OWCollider>();
owTriggerVolume._owCollider = owCollider;
}
return owTriggerVolume;
}
public static Component AddShapeOrCollider(GameObject go, ShapeInfo info)
{
if (info.useShape.HasValue)

View File

@ -25,7 +25,8 @@ namespace NewHorizons.Builder.Volumes
owAudioSource.SetTrack(info.track.ConvertToOW());
AudioUtilities.SetAudioClip(owAudioSource, info.audio, mod);
var audioVolume = go.AddComponent<AudioVolume>();
var audioVolume = PriorityVolumeBuilder.MakeExisting<AudioVolume>(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<SphereShape>();
shape.radius = info.radius;
var owTriggerVolume = go.AddComponent<OWTriggerVolume>();
owTriggerVolume._shape = shape;
var owTriggerVolume = go.GetComponent<OWTriggerVolume>();
audioVolume._triggerVolumeOverride = owTriggerVolume;
go.SetActive(true);

View File

@ -13,6 +13,8 @@ namespace NewHorizons.Builder.Volumes
volume.TargetSolarSystem = info.targetStarSystem;
volume.TargetSpawnID = info.spawnPointID;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -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;
}
}

View File

@ -15,7 +15,8 @@ namespace NewHorizons.Builder.Volumes
var go = GeneralPropBuilder.MakeNew("DayNightAudioVolume", planetGO, sector, info);
go.layer = Layer.AdvancedEffectVolume;
var audioVolume = go.AddComponent<NHDayNightAudioVolume>();
var audioVolume = PriorityVolumeBuilder.MakeExisting<NHDayNightAudioVolume>(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<SphereShape>();
shape.radius = info.radius;
var owTriggerVolume = go.AddComponent<OWTriggerVolume>();
owTriggerVolume._shape = shape;
go.SetActive(true);
audioVolume.gameObject.SetActive(true);
return audioVolume;
}

View File

@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes
volume._deathType = EnumUtils.Parse<DeathType>(info.deathType.ToString(), DeathType.Default);
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -35,6 +35,8 @@ namespace NewHorizons.Builder.Volumes
volume._allowShipAutoroll = info.allowShipAutoroll;
volume._disableOnStart = info.disableOnStart;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -18,28 +18,35 @@ namespace NewHorizons.Builder.Volumes
public static CylindricalForceVolume Make(GameObject planetGO, Sector sector, CylindricalForceVolumeInfo info)
{
var forceVolume = Make<CylindricalForceVolume>(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<DirectionalForceVolume>(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<GravityVolume>(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<PolarForceVolume>(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<RadialForceVolume>(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<T>(GameObject planetGO, Sector sector, ForceVolumeInfo info) where T : ForceVolume
public static TVolume Make<TVolume>(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<TVolume>(planetGO, sector, info);
var owTriggerVolume = go.AddComponent<OWTriggerVolume>();
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<OWCollider>();
}
else
{
var col = go.AddComponent<SphereCollider>();
col.radius = info.radius;
col.isTrigger = true;
var owCollider = go.GetAddComponent<OWCollider>();
owTriggerVolume._owCollider = owCollider;
}
var forceVolume = go.AddComponent<T>();
forceVolume._priority = info.priority;
forceVolume._alignmentPriority = info.alignmentPriority;
forceVolume._inheritable = info.inheritable;

View File

@ -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<SphereShape>();
shape.radius = info.radius;
var owTriggerVolume = go.AddComponent<OWTriggerVolume>();
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<RiverHeatHazardVolume>();
hazardVolume = VolumeBuilder.MakeExisting<RiverHeatHazardVolume>(go, planetGO, sector, info);
}
else if (type == HazardVolumeInfo.HazardType.HEAT)
else if (info.type == HazardVolumeInfo.HazardType.HEAT)
{
hazardVolume = go.AddComponent<HeatHazardVolume>();
hazardVolume = VolumeBuilder.MakeExisting<HeatHazardVolume>(go, planetGO, sector, info);
}
else if (type == HazardVolumeInfo.HazardType.DARKMATTER)
else if (info.type == HazardVolumeInfo.HazardType.DARKMATTER)
{
hazardVolume = go.AddComponent<DarkMatterVolume>();
hazardVolume = VolumeBuilder.MakeExisting<DarkMatterVolume>(go, planetGO, sector, info);
var visorFrostEffectVolume = go.AddComponent<VisorFrostEffectVolume>();
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<ElectricityVolume>();
var electricityVolume = VolumeBuilder.MakeExisting<ElectricityVolume>(go, planetGO, sector, info);
electricityVolume._shockAudioPool = new OWAudioSource[0];
hazardVolume = electricityVolume;
}
else
{
var simpleHazardVolume = go.AddComponent<SimpleHazardVolume>();
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
});
}
}
}

View File

@ -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<NHNotificationVolume>(planetGO, sector, info);
var shape = go.AddComponent<SphereShape>();
shape.radius = info.radius;
// Preserving name for backwards compatibility
notificationVolume.gameObject.name = string.IsNullOrEmpty(info.rename) ? "NotificationVolume" : info.rename;
var owTriggerVolume = go.AddComponent<OWTriggerVolume>();
owTriggerVolume._shape = shape;
var notificationVolume = go.AddComponent<NHNotificationVolume>();
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;
}

View File

@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes
volume._treeVolume = info.treeVolume;
volume._playRefillAudio = info.playRefillAudio;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -5,6 +5,17 @@ namespace NewHorizons.Builder.Volumes
{
public static class PriorityVolumeBuilder
{
public static TVolume MakeExisting<TVolume>(GameObject go, GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume
{
var volume = VolumeBuilder.MakeExisting<TVolume>(go, planetGO, sector, info);
volume._layer = info.layer;
volume.SetPriority(info.priority);
return volume;
}
public static TVolume Make<TVolume>(GameObject planetGO, Sector sector, PriorityVolumeInfo info) where TVolume : PriorityVolume
{
var volume = VolumeBuilder.Make<TVolume>(planetGO, sector, info);

View File

@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes.Rulesets
volume.minImpactSpeed = info.minImpactSpeed;
volume.maxImpactSpeed = info.maxImpactSpeed;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -15,6 +15,8 @@ namespace NewHorizons.Builder.Volumes.Rulesets
volume._lanternRange = info.lanternRange;
volume._ignoreAnchor = info.ignoreAnchor;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -13,6 +13,8 @@ namespace NewHorizons.Builder.Volumes.Rulesets
volume._nerfJetpackBooster = info.nerfJetpackBooster;
volume._nerfDuration = info.nerfDuration;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes
volume._speedLimit = info.speedLimit;
volume._acceleration = info.acceleration;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -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<TVolume>(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<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>();
var volume = VolumeBuilder.Make<TVolume>(planetGO, sector, info);
var collider = volume.gameObject.GetComponent<SphereCollider>();
volume._collider = collider;
volume._shrinkBodies = info.shrinkBodies;
volume._onlyAffectsPlayerAndShip = info.onlyAffectsPlayerRelatedBodies;
go.SetActive(true);
return volume;
}
}

View File

@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes.VisorEffects
volume._frostRate = info.frostRate;
volume._maxFrost = info.maxFrost;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -13,6 +13,8 @@ namespace NewHorizons.Builder.Volumes.VisorEffects
volume._dropletRate = info.dropletRate;
volume._streakRate = info.streakRate;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -7,21 +7,36 @@ namespace NewHorizons.Builder.Volumes
{
public static class VolumeBuilder
{
public static TVolume MakeExisting<TVolume>(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<OWTriggerVolume>();
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<TVolume>();
return volume;
}
public static TVolume Make<TVolume>(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<SphereShape>();
shape.radius = info.radius;
var owTriggerVolume = go.AddComponent<OWTriggerVolume>();
owTriggerVolume._shape = shape;
var volume = go.AddComponent<TVolume>();
go.SetActive(true);
return MakeExisting<TVolume>(go, planetGO, sector, info);
}
public static TVolume MakeAndEnable<TVolume>(GameObject planetGO, Sector sector, VolumeInfo info) where TVolume : MonoBehaviour
{
var volume = Make<TVolume>(planetGO, sector, info);
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -60,28 +60,28 @@ namespace NewHorizons.Builder.Volumes
{
foreach (var mapRestrictionVolume in config.Volumes.mapRestrictionVolumes)
{
VolumeBuilder.Make<MapRestrictionVolume>(go, sector, mapRestrictionVolume);
VolumeBuilder.MakeAndEnable<MapRestrictionVolume>(go, sector, mapRestrictionVolume);
}
}
if (config.Volumes.interferenceVolumes != null)
{
foreach (var interferenceVolume in config.Volumes.interferenceVolumes)
{
VolumeBuilder.Make<Components.Volumes.InterferenceVolume>(go, sector, interferenceVolume);
VolumeBuilder.MakeAndEnable<Components.Volumes.InterferenceVolume>(go, sector, interferenceVolume);
}
}
if (config.Volumes.reverbVolumes != null)
{
foreach (var reverbVolume in config.Volumes.reverbVolumes)
{
VolumeBuilder.Make<ReverbTriggerVolume>(go, sector, reverbVolume);
VolumeBuilder.MakeAndEnable<ReverbTriggerVolume>(go, sector, reverbVolume);
}
}
if (config.Volumes.insulatingVolumes != null)
{
foreach (var insulatingVolume in config.Volumes.insulatingVolumes)
{
VolumeBuilder.Make<InsulatingVolume>(go, sector, insulatingVolume);
VolumeBuilder.MakeAndEnable<InsulatingVolume>(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<ProbeDestructionVolume>(go, sector, destructionVolume);
VolumeBuilder.MakeAndEnable<ProbeDestructionVolume>(go, sector, destructionVolume);
}
}
if (config.Volumes.probe.safetyVolumes != null)
{
foreach (var safetyVolume in config.Volumes.probe.safetyVolumes)
{
VolumeBuilder.Make<ProbeSafetyVolume>(go, sector, safetyVolume);
VolumeBuilder.MakeAndEnable<ProbeSafetyVolume>(go, sector, safetyVolume);
}
}
}
@ -190,7 +190,7 @@ namespace NewHorizons.Builder.Volumes
{
foreach (var antiTravelMusicRuleset in config.Volumes.rulesets.antiTravelMusicRulesets)
{
VolumeBuilder.Make<AntiTravelMusicRuleset>(go, sector, antiTravelMusicRuleset);
VolumeBuilder.MakeAndEnable<AntiTravelMusicRuleset>(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<ReferenceFrameBlockerVolume>(go, sector, referenceFrameBlockerVolume);
VolumeBuilder.MakeAndEnable<ReferenceFrameBlockerVolume>(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<LightlessLightSourceVolume>(go, sector, lightSourceVolume);
VolumeBuilder.MakeAndEnable<LightlessLightSourceVolume>(go, sector, lightSourceVolume);
}
}
if (config.Volumes.solarSystemVolume != null)

View File

@ -11,6 +11,8 @@ namespace NewHorizons.Builder.Volumes
volume._inheritable = true;
volume.gameObject.SetActive(true);
return volume;
}
}

View File

@ -12,11 +12,6 @@ namespace NewHorizons.External.Modules.Volumes.VolumeInfos
[JsonObject]
public class ForceVolumeInfo : PriorityVolumeInfo
{
/// <summary>
/// The shape of this volume. Defaults to a sphere shape with a radius of `radius`.
/// </summary>
public ShapeInfo shape;
/// <summary>
/// The force applied by this volume. Can be negative to reverse the direction.
/// </summary>

View File

@ -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
{
/// <summary>
/// The radius of this volume.
/// The radius of this volume, if a shape is not specified.
/// </summary>
[DefaultValue(1f)] public float radius = 1f;
/// <summary>
/// The shape of this volume. Defaults to a sphere with a radius of `radius` if not specified.
/// </summary>
public ShapeInfo shape;
}
}