mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Unify volume builders and support shapes on all volume types
This commit is contained in:
parent
be1b408da3
commit
9fe04aad7d
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -13,6 +13,8 @@ namespace NewHorizons.Builder.Volumes
|
||||
volume.TargetSolarSystem = info.targetStarSystem;
|
||||
volume.TargetSpawnID = info.spawnPointID;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes
|
||||
|
||||
volume._deathType = EnumUtils.Parse<DeathType>(info.deathType.ToString(), DeathType.Default);
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -35,6 +35,8 @@ namespace NewHorizons.Builder.Volumes
|
||||
volume._allowShipAutoroll = info.allowShipAutoroll;
|
||||
volume._disableOnStart = info.disableOnStart;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes
|
||||
volume._treeVolume = info.treeVolume;
|
||||
volume._playRefillAudio = info.playRefillAudio;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes.Rulesets
|
||||
volume.minImpactSpeed = info.minImpactSpeed;
|
||||
volume.maxImpactSpeed = info.maxImpactSpeed;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,6 +15,8 @@ namespace NewHorizons.Builder.Volumes.Rulesets
|
||||
volume._lanternRange = info.lanternRange;
|
||||
volume._ignoreAnchor = info.ignoreAnchor;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,6 +13,8 @@ namespace NewHorizons.Builder.Volumes.Rulesets
|
||||
volume._nerfJetpackBooster = info.nerfJetpackBooster;
|
||||
volume._nerfDuration = info.nerfDuration;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes
|
||||
volume._speedLimit = info.speedLimit;
|
||||
volume._acceleration = info.acceleration;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,6 +12,8 @@ namespace NewHorizons.Builder.Volumes.VisorEffects
|
||||
volume._frostRate = info.frostRate;
|
||||
volume._maxFrost = info.maxFrost;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,6 +13,8 @@ namespace NewHorizons.Builder.Volumes.VisorEffects
|
||||
volume._dropletRate = info.dropletRate;
|
||||
volume._streakRate = info.streakRate;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -11,6 +11,8 @@ namespace NewHorizons.Builder.Volumes
|
||||
|
||||
volume._inheritable = true;
|
||||
|
||||
volume.gameObject.SetActive(true);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user