Merge branch 'dev' into qsb-compat

This commit is contained in:
JohnCorby 2022-11-10 15:14:18 -08:00
commit 5391a3c1ac
10 changed files with 259 additions and 344 deletions

View File

@ -2,12 +2,16 @@ using System.Collections.Generic;
using UnityEngine;
using NewHorizons.Utility;
using NewHorizons.External.Modules.VariableSize;
using System.Linq;
using UnityEngine.Assertions.Must;
namespace NewHorizons.Builder.Body
{
public static class LavaBuilder
{
private static readonly int HeightScale = Shader.PropertyToID("_HeightScale");
private static readonly int EdgeFade = Shader.PropertyToID("_EdgeFade");
private static readonly int TexHeight = Shader.PropertyToID("_TexHeight");
private static readonly int EmissionColor = Shader.PropertyToID("_EmissionColor");
private static GameObject _lavaSphere;
@ -31,15 +35,11 @@ namespace NewHorizons.Builder.Body
{
InitPrefabs();
var heightScale = module.size;
var multiplier = module.size / 100f;
if (module.curve != null)
{
var modifier = 1f;
foreach (var pair in module.curve)
{
if (pair.value < modifier) modifier = pair.value;
}
heightScale = Mathf.Max(0.1f, heightScale * modifier);
var modifier = module.curve.Max(pair => pair.value);
multiplier *= modifier;
}
var moltenCore = new GameObject("MoltenCore");
@ -51,7 +51,9 @@ namespace NewHorizons.Builder.Body
var lavaSphere = GameObject.Instantiate(_lavaSphere, moltenCore.transform);
lavaSphere.transform.localScale = Vector3.one;
lavaSphere.transform.name = "LavaSphere";
lavaSphere.GetComponent<MeshRenderer>().material.SetFloat(HeightScale, heightScale);
lavaSphere.GetComponent<MeshRenderer>().material.SetFloat(HeightScale, 150f * multiplier);
lavaSphere.GetComponent<MeshRenderer>().material.SetFloat(EdgeFade, 15f * multiplier);
lavaSphere.GetComponent<MeshRenderer>().material.SetFloat(TexHeight, 15f * multiplier);
if (module.tint != null) lavaSphere.GetComponent<MeshRenderer>().material.SetColor(EmissionColor, module.tint.ToColor());
lavaSphere.SetActive(true);
@ -65,7 +67,9 @@ namespace NewHorizons.Builder.Body
var proxyLavaSphere = moltenCoreProxy.transform.Find("LavaSphere (1)");
proxyLavaSphere.transform.localScale = Vector3.one;
proxyLavaSphere.name = "LavaSphere_Proxy";
proxyLavaSphere.GetComponent<MeshRenderer>().material.SetFloat(HeightScale, heightScale);
proxyLavaSphere.GetComponent<MeshRenderer>().material.SetFloat(HeightScale, 150f * multiplier);
proxyLavaSphere.GetComponent<MeshRenderer>().material.SetFloat(EdgeFade, 15f * multiplier);
proxyLavaSphere.GetComponent<MeshRenderer>().material.SetFloat(TexHeight, 15f * multiplier);
if (module.tint != null) proxyLavaSphere.GetComponent<MeshRenderer>().material.SetColor(EmissionColor, module.tint.ToColor());
var sectorProxy = moltenCoreProxy.GetComponent<SectorProxy>();

View File

@ -187,16 +187,9 @@ namespace NewHorizons.Builder.Body
{
foreach (var singularity in body.Config.Props.singularities)
{
if (singularity.type == SingularityModule.SingularityType.BlackHole)
{
SingularityBuilder.MakeBlackHoleProxy(proxy, singularity.position, singularity.size, singularity.curve);
}
else
{
SingularityBuilder.MakeWhiteHoleProxy(proxy, singularity.position, singularity.size, singularity.curve);
}
if (realSize < singularity.size) realSize = singularity.size;
var polarity = singularity.type == SingularityModule.SingularityType.BlackHole;
SingularityBuilder.MakeSingularityProxy(proxy, singularity.position, polarity, singularity.horizonRadius, singularity.distortRadius, singularity.curve, singularity.renderQueueOverride);
if (realSize < singularity.distortRadius) realSize = singularity.distortRadius;
}
}

View File

@ -37,6 +37,7 @@ namespace NewHorizons.Builder.Body
private static Mesh _whiteHoleMesh;
private static GameObject _whiteHoleAmbientLight;
private static GameObject _whiteHoleAmbience;
private static GameObject _whiteHoleZeroGVolume;
private static GameObject _whiteHoleRulesetVolume;
private static GameObject _whiteHoleVolume;
@ -62,6 +63,7 @@ namespace NewHorizons.Builder.Body
if (_whiteHoleMesh == null) _whiteHoleMesh = SearchUtilities.Find("WhiteHole_Body/WhiteHoleVisuals/Singularity").GetComponent<MeshFilter>().mesh.DontDestroyOnLoad();
if (_whiteHoleAmbientLight == null) _whiteHoleAmbientLight = SearchUtilities.Find("WhiteHole_Body/WhiteHoleVisuals/AmbientLight_WH").InstantiateInactive().Rename("WhiteHoleAmbientLight").DontDestroyOnLoad();
if (_whiteHoleAmbience == null) _whiteHoleAmbience = SearchUtilities.Find("WhiteHole_Body/Ambience_WhiteHole").InstantiateInactive().Rename("WhiteHoleAmbience").DontDestroyOnLoad();
if (_whiteHoleZeroGVolume == null) _whiteHoleZeroGVolume = SearchUtilities.Find("WhiteHole_Body/ZeroGVolume").InstantiateInactive().Rename("WhiteHoleZeroGVolume").DontDestroyOnLoad();
if (_whiteHoleRulesetVolume == null) _whiteHoleRulesetVolume = SearchUtilities.Find("WhiteHole_Body/Sector_WhiteHole/RulesetVolumes_WhiteHole").InstantiateInactive().Rename("WhiteHoleRulesetVolume").DontDestroyOnLoad();
if (_whiteHoleVolume == null) _whiteHoleVolume = SearchUtilities.Find("WhiteHole_Body/WhiteHoleVolume").InstantiateInactive().Rename("WhiteHoleVolume").DontDestroyOnLoad();
@ -74,28 +76,21 @@ namespace NewHorizons.Builder.Body
// If we've reloaded the first one will now be null so we have to refresh the list
if (_singularitiesByID?.Values?.FirstOrDefault() == null) _singularitiesByID = new Dictionary<string, GameObject>();
var size = singularity.size;
var horizonRadius = singularity.horizonRadius;
var distortRadius = singularity.distortRadius != 0f ? singularity.distortRadius : horizonRadius * 2.5f;
var pairedSingularity = singularity.pairedSingularity;
var polarity = singularity.type;
bool polarity = singularity.type == SingularityModule.SingularityType.BlackHole;
bool isWormHole = singularity?.targetStarSystem != null;
bool hasHazardVolume = !isWormHole && (pairedSingularity == null);
bool makeZeroGVolume = singularity == null ? true : singularity.makeZeroGVolume;
Vector3 localPosition = singularity?.position == null ? Vector3.zero : singularity.position;
Vector3 localRotation = singularity?.rotation == null ? Vector3.zero : singularity.rotation;
GameObject newSingularity = null;
switch (polarity)
{
case SingularityModule.SingularityType.BlackHole:
newSingularity = MakeBlackHole(go, sector, localPosition, size, hasHazardVolume, singularity.targetStarSystem, singularity.curve);
break;
case SingularityModule.SingularityType.WhiteHole:
newSingularity = MakeWhiteHole(go, sector, OWRB, localPosition, size, singularity.curve, makeZeroGVolume);
break;
}
newSingularity = MakeSingularity(go, sector, localPosition, localRotation, polarity, horizonRadius, distortRadius,
hasHazardVolume, singularity.targetStarSystem, singularity.curve, singularity.hasWarpEffects, singularity.renderQueueOverride);
var uniqueID = string.IsNullOrEmpty(singularity.uniqueID) ? config.name : singularity.uniqueID;
_singularitiesByID.Add(uniqueID, newSingularity);
@ -107,10 +102,10 @@ namespace NewHorizons.Builder.Body
{
switch (polarity)
{
case SingularityModule.SingularityType.BlackHole:
case true:
PairSingularities(uniqueID, pairedSingularity, newSingularity, pairedSingularityGO);
break;
case SingularityModule.SingularityType.WhiteHole:
case false:
PairSingularities(pairedSingularity, uniqueID, pairedSingularityGO, newSingularity);
break;
}
@ -138,275 +133,179 @@ namespace NewHorizons.Builder.Body
blackHoleVolume._whiteHole = whiteHoleVolume;
}
public static GameObject MakeBlackHole(GameObject planetGO, Sector sector, Vector3 localPosition, float size,
bool hasDestructionVolume, string targetSolarSystem = null, TimeValuePair[] curve = null, bool makeAudio = true)
public static GameObject MakeSingularity(GameObject planetGO, Sector sector, Vector3 position, Vector3 rotation, bool polarity, float horizon, float distort,
bool hasDestructionVolume, string targetStarSystem = null, TimeValuePair[] curve = null, bool warpEffects = true, int renderQueue = 2985)
{
InitPrefabs();
var blackHole = new GameObject("BlackHole");
blackHole.SetActive(false);
blackHole.transform.parent = sector?.transform ?? planetGO.transform;
blackHole.transform.position = planetGO.transform.TransformPoint(localPosition);
// polarity true = black, false = white
var blackHoleRender = MakeBlackHoleGraphics(blackHole, size);
var singularity = new GameObject(polarity ? "BlackHole" : "WhiteHole");
singularity.transform.parent = sector?.transform ?? planetGO.transform;
singularity.transform.position = planetGO.transform.TransformPoint(position);
BlackHoleSizeController sizeController = null;
var singularityRenderer = MakeSingularityGraphics(singularity, polarity, horizon, distort, renderQueue);
SingularitySizeController sizeController = null;
if (curve != null)
{
sizeController = blackHoleRender.gameObject.AddComponent<BlackHoleSizeController>();
sizeController = singularityRenderer.gameObject.AddComponent<SingularitySizeController>();
sizeController.SetScaleCurve(curve);
sizeController.size = size;
sizeController.material = blackHoleRender.material;
sizeController.size = distort;
sizeController.innerScale = horizon;
sizeController.material = singularityRenderer.material;
}
OWAudioSource oneShotOWAudioSource = null;
if (makeAudio)
var singularityAmbience = GameObject.Instantiate(_blackHoleAmbience, singularity.transform);
singularityAmbience.name = polarity ? "BlackHoleAmbience" : "WhiteHoleAmbience";
singularityAmbience.SetActive(true);
singularityAmbience.GetComponent<SectorAudioGroup>().SetSector(sector);
var singularityAudioSource = singularityAmbience.GetComponent<AudioSource>();
singularityAudioSource.maxDistance = distort * 2.5f;
singularityAudioSource.minDistance = horizon;
singularityAmbience.transform.localPosition = Vector3.zero;
if (sizeController != null) sizeController.audioSource = singularityAudioSource;
if (polarity)
{
var blackHoleAmbience = GameObject.Instantiate(_blackHoleAmbience, blackHole.transform);
blackHoleAmbience.name = "BlackHoleAmbience";
blackHoleAmbience.SetActive(true);
blackHoleAmbience.GetComponent<SectorAudioGroup>().SetSector(sector);
var blackHoleAudioSource = blackHoleAmbience.GetComponent<AudioSource>();
blackHoleAudioSource.maxDistance = size * 2.5f;
blackHoleAudioSource.minDistance = size * 0.4f;
blackHoleAmbience.transform.localPosition = Vector3.zero;
if (sizeController != null) sizeController.audioSource = blackHoleAudioSource;
var blackHoleOneShot = GameObject.Instantiate(_blackHoleEmissionOneShot, blackHole.transform);
blackHoleOneShot.name = "BlackHoleEmissionOneShot";
blackHoleOneShot.SetActive(true);
oneShotOWAudioSource = blackHoleOneShot.GetComponent<OWAudioSource>();
var oneShotAudioSource = blackHoleOneShot.GetComponent<AudioSource>();
oneShotAudioSource.maxDistance = size * 3f;
oneShotAudioSource.minDistance = size * 0.4f;
if (sizeController != null) sizeController.oneShotAudioSource = oneShotAudioSource;
}
if (hasDestructionVolume || targetSolarSystem != null)
{
var destructionVolumeGO = new GameObject("DestructionVolume");
destructionVolumeGO.layer = LayerMask.NameToLayer("BasicEffectVolume");
destructionVolumeGO.transform.parent = blackHole.transform;
destructionVolumeGO.transform.localScale = Vector3.one;
destructionVolumeGO.transform.localPosition = Vector3.zero;
var sphereCollider = destructionVolumeGO.AddComponent<SphereCollider>();
sphereCollider.radius = size * 0.4f;
sphereCollider.isTrigger = true;
if (sizeController != null) sizeController.sphereCollider = sphereCollider;
if (hasDestructionVolume) destructionVolumeGO.AddComponent<BlackHoleDestructionVolume>();
else if (targetSolarSystem != null)
if (hasDestructionVolume || targetStarSystem != null)
{
var wormholeVolume = destructionVolumeGO.AddComponent<ChangeStarSystemVolume>();
wormholeVolume.TargetSolarSystem = targetSolarSystem;
var destructionVolumeGO = new GameObject("DestructionVolume");
destructionVolumeGO.layer = LayerMask.NameToLayer("BasicEffectVolume");
destructionVolumeGO.transform.parent = singularity.transform;
destructionVolumeGO.transform.localScale = Vector3.one;
destructionVolumeGO.transform.localPosition = Vector3.zero;
var sphereCollider = destructionVolumeGO.AddComponent<SphereCollider>();
sphereCollider.radius = horizon;
sphereCollider.isTrigger = true;
if (sizeController != null) sizeController.sphereCollider = sphereCollider;
if (hasDestructionVolume) destructionVolumeGO.AddComponent<BlackHoleDestructionVolume>();
else if (targetStarSystem != null)
{
var wormholeVolume = destructionVolumeGO.AddComponent<ChangeStarSystemVolume>();
wormholeVolume.TargetSolarSystem = targetStarSystem;
}
}
else
{
var blackHoleOneShot = GameObject.Instantiate(_blackHoleEmissionOneShot, singularity.transform);
blackHoleOneShot.name = "BlackHoleEmissionOneShot";
blackHoleOneShot.SetActive(true);
oneShotOWAudioSource = blackHoleOneShot.GetComponent<OWAudioSource>();
var oneShotAudioSource = blackHoleOneShot.GetComponent<AudioSource>();
oneShotAudioSource.maxDistance = distort * 3f;
oneShotAudioSource.minDistance = horizon;
if (sizeController != null) sizeController.oneShotAudioSource = oneShotAudioSource;
var blackHoleVolume = GameObject.Instantiate(_blackHoleVolume, singularity.transform);
blackHoleVolume.name = "BlackHoleVolume";
blackHoleVolume.SetActive(true);
var bhVolume = blackHoleVolume.GetComponent<BlackHoleVolume>();
bhVolume._audioSector = sector;
bhVolume._emissionSource = oneShotOWAudioSource;
var blackHoleSphereCollider = blackHoleVolume.GetComponent<SphereCollider>();
blackHoleSphereCollider.radius = horizon;
if (sizeController != null) sizeController.sphereCollider = blackHoleSphereCollider;
if (!warpEffects)
{
Delay.FireOnNextUpdate(() =>
{
foreach (var renderer in blackHoleVolume.GetComponentsInChildren<ParticleSystemRenderer>(true))
{
UnityEngine.Object.Destroy(renderer);
}
});
}
}
}
else
{
var blackHoleVolume = GameObject.Instantiate(_blackHoleVolume, blackHole.transform);
blackHoleVolume.name = "BlackHoleVolume";
blackHoleVolume.SetActive(true);
var bhVolume = blackHoleVolume.GetComponent<BlackHoleVolume>();
bhVolume._audioSector = sector;
bhVolume._emissionSource = oneShotOWAudioSource;
var blackHoleSphereCollider = blackHoleVolume.GetComponent<SphereCollider>();
blackHoleSphereCollider.radius = size * 0.4f;
if (sizeController != null) sizeController.sphereCollider = blackHoleSphereCollider;
GameObject whiteHoleVolumeGO = GameObject.Instantiate(_whiteHoleVolume);
whiteHoleVolumeGO.transform.parent = singularity.transform;
whiteHoleVolumeGO.transform.localPosition = Vector3.zero;
whiteHoleVolumeGO.transform.localScale = Vector3.one;
whiteHoleVolumeGO.GetComponent<SphereCollider>().radius = horizon;
whiteHoleVolumeGO.name = "WhiteHoleVolume";
whiteHoleVolumeGO.SetActive(true);
if (sizeController != null) sizeController.sphereCollider = whiteHoleVolumeGO.GetComponent<SphereCollider>();
var OWRB = planetGO.GetComponent<OWRigidbody>();
var whiteHoleFluidVolume = whiteHoleVolumeGO.GetComponent<WhiteHoleFluidVolume>();
whiteHoleFluidVolume._innerRadius = horizon;
whiteHoleFluidVolume._outerRadius = distort;
whiteHoleFluidVolume._attachedBody = OWRB;
if (sizeController != null) sizeController.fluidVolume = whiteHoleFluidVolume;
var whiteHoleVolume = whiteHoleVolumeGO.GetComponent<WhiteHoleVolume>();
whiteHoleVolume._debrisDistMax = distort * 6.5f;
whiteHoleVolume._debrisDistMin = distort * 2f;
whiteHoleVolume._whiteHoleSector = sector;
whiteHoleVolume._fluidVolume = whiteHoleFluidVolume;
whiteHoleVolume._whiteHoleBody = OWRB;
whiteHoleVolume._whiteHoleProxyShadowSuperGroup = planetGO.GetComponent<ProxyShadowCasterSuperGroup>();
whiteHoleVolume._radius = horizon;
whiteHoleVolume._airlocksToOpen = new NomaiAirlock[0];
if (sizeController != null) sizeController.volume = whiteHoleVolume;
whiteHoleVolume.enabled = true;
whiteHoleFluidVolume.enabled = true;
}
blackHole.SetActive(true);
return blackHole;
}
singularity.transform.rotation = planetGO.transform.TransformRotation(Quaternion.Euler(rotation));
public static MeshRenderer MakeBlackHoleGraphics(GameObject blackHole, float size)
singularity.SetActive(true);
return singularity;
}
public static MeshRenderer MakeSingularityGraphics(GameObject singularity, bool polarity, float horizon, float distort, int queue = 2985)
{
InitPrefabs();
var blackHoleRender = new GameObject("BlackHoleRender");
blackHoleRender.transform.parent = blackHole.transform;
blackHoleRender.transform.localPosition = Vector3.zero;
blackHoleRender.transform.localScale = Vector3.one * size;
var singularityRenderer = new GameObject(polarity ? "BlackHoleRenderer" : "WhiteHoleRenderer");
singularityRenderer.transform.parent = singularity.transform;
singularityRenderer.transform.localPosition = Vector3.zero;
singularityRenderer.transform.localScale = Vector3.one * distort;
var meshFilter = blackHoleRender.AddComponent<MeshFilter>();
meshFilter.mesh = _blackHoleMesh;
var meshFilter = singularityRenderer.AddComponent<MeshFilter>();
meshFilter.mesh = polarity ? _blackHoleMesh : _whiteHoleMesh;
var meshRenderer = blackHoleRender.AddComponent<MeshRenderer>();
meshRenderer.material = new Material(blackHoleShader);
meshRenderer.material.SetFloat(Radius, size * 0.4f);
meshRenderer.material.SetFloat(MaxDistortRadius, size * 0.95f);
meshRenderer.material.SetFloat(MassScale, 1);
meshRenderer.material.SetFloat(DistortFadeDist, size * 0.55f);
var meshRenderer = singularityRenderer.AddComponent<MeshRenderer>();
meshRenderer.material = new Material(polarity ? blackHoleShader : whiteHoleShader);
meshRenderer.material.SetFloat(Radius, horizon);
meshRenderer.material.SetFloat(MaxDistortRadius, distort);
meshRenderer.material.SetFloat(MassScale, polarity ? 1f : -1f);
meshRenderer.material.SetFloat(DistortFadeDist, distort - horizon);
if (!polarity) meshRenderer.material.SetColor(Color1, new Color(1.88f, 1.88f, 1.88f, 1f));
meshRenderer.material.renderQueue = queue;
return meshRenderer;
}
public static GameObject MakeWhiteHole(GameObject planetGO, Sector sector, OWRigidbody OWRB, Vector3 localPosition, float size,
TimeValuePair[] curve, bool makeZeroGVolume = true)
public static GameObject MakeSingularityProxy(GameObject rootObject, MVector3 position, bool polarity, float horizon, float distort, TimeValuePair[] curve = null, int queue = 2985)
{
InitPrefabs();
var whiteHole = new GameObject("WhiteHole");
whiteHole.SetActive(false);
whiteHole.transform.parent = sector?.transform ?? planetGO.transform;
whiteHole.transform.position = planetGO.transform.TransformPoint(localPosition);
var singularityRenderer = MakeSingularityGraphics(rootObject, polarity, horizon, distort, queue);
if (position != null) singularityRenderer.transform.localPosition = position;
var whiteHoleRenderer = new GameObject("WhiteHoleRenderer");
whiteHoleRenderer.transform.parent = whiteHole.transform;
whiteHoleRenderer.transform.localPosition = Vector3.zero;
whiteHoleRenderer.transform.localScale = Vector3.one * size * 2.8f;
WhiteHoleSizeController sizeController = null;
SingularitySizeController sizeController = null;
if (curve != null)
{
sizeController = whiteHoleRenderer.AddComponent<WhiteHoleSizeController>();
sizeController = singularityRenderer.gameObject.AddComponent<SingularitySizeController>();
sizeController.SetScaleCurve(curve);
sizeController.size = size * 2.8f; // Gets goofy because of this
sizeController.size = distort;
sizeController.innerScale = horizon;
sizeController.material = singularityRenderer.material;
}
var meshFilter = whiteHoleRenderer.AddComponent<MeshFilter>();
meshFilter.mesh = _whiteHoleMesh;
var meshRenderer = whiteHoleRenderer.AddComponent<MeshRenderer>();
meshRenderer.material = new Material(whiteHoleShader);
meshRenderer.sharedMaterial.SetFloat(Radius, size * 0.4f);
meshRenderer.sharedMaterial.SetFloat(DistortFadeDist, size);
meshRenderer.sharedMaterial.SetFloat(MaxDistortRadius, size * 2.8f);
meshRenderer.sharedMaterial.SetFloat(MassScale, -1);
meshRenderer.sharedMaterial.SetColor(Color1, new Color(1.88f, 1.88f, 1.88f, 1f));
if (sizeController != null) sizeController.material = meshRenderer.sharedMaterial;
var ambientLight = GameObject.Instantiate(_whiteHoleAmbientLight);
ambientLight.transform.parent = whiteHole.transform;
ambientLight.transform.localScale = Vector3.one;
ambientLight.transform.localPosition = Vector3.zero;
ambientLight.name = "AmbientLight";
ambientLight.SetActive(true);
var light = ambientLight.GetComponent<Light>();
light.range = size * 7f;
if (sizeController != null) sizeController.light = light;
GameObject whiteHoleVolumeGO = GameObject.Instantiate(_whiteHoleVolume);
whiteHoleVolumeGO.transform.parent = whiteHole.transform;
whiteHoleVolumeGO.transform.localPosition = Vector3.zero;
whiteHoleVolumeGO.transform.localScale = Vector3.one;
whiteHoleVolumeGO.GetComponent<SphereCollider>().radius = size;
whiteHoleVolumeGO.name = "WhiteHoleVolume";
whiteHoleVolumeGO.SetActive(true);
if (sizeController != null) sizeController.sphereCollider = whiteHoleVolumeGO.GetComponent<SphereCollider>();
var whiteHoleFluidVolume = whiteHoleVolumeGO.GetComponent<WhiteHoleFluidVolume>();
whiteHoleFluidVolume._innerRadius = size * 0.5f;
whiteHoleFluidVolume._outerRadius = size;
whiteHoleFluidVolume._attachedBody = OWRB;
if (sizeController != null) sizeController.fluidVolume = whiteHoleFluidVolume;
var whiteHoleVolume = whiteHoleVolumeGO.GetComponent<WhiteHoleVolume>();
whiteHoleVolume._debrisDistMax = size * 6.5f;
whiteHoleVolume._debrisDistMin = size * 2f;
whiteHoleVolume._whiteHoleSector = sector;
whiteHoleVolume._fluidVolume = whiteHoleFluidVolume;
whiteHoleVolume._whiteHoleBody = OWRB;
whiteHoleVolume._whiteHoleProxyShadowSuperGroup = planetGO.GetComponent<ProxyShadowCasterSuperGroup>();
whiteHoleVolume._radius = size * 0.5f;
whiteHoleVolume._airlocksToOpen = new NomaiAirlock[0];
if (sizeController != null) sizeController.volume = whiteHoleVolume;
whiteHoleVolume.enabled = true;
whiteHoleFluidVolume.enabled = true;
if (makeZeroGVolume)
{
var zeroGVolume = GameObject.Instantiate(_whiteHoleZeroGVolume, whiteHole.transform);
zeroGVolume.name = "ZeroGVolume";
zeroGVolume.transform.localPosition = Vector3.zero;
zeroGVolume.SetActive(true);
zeroGVolume.GetComponent<SphereCollider>().radius = size * 10f;
zeroGVolume.GetComponent<ZeroGVolume>()._attachedBody = OWRB;
var rulesetVolume = GameObject.Instantiate(_whiteHoleRulesetVolume, planetGO.transform);
rulesetVolume.name = "RulesetVolume";
rulesetVolume.transform.localPosition = Vector3.zero;
rulesetVolume.transform.localScale = Vector3.one * size / 100f;
rulesetVolume.SetActive(true);
rulesetVolume.GetComponent<SphereShape>().enabled = true;
if (sizeController != null)
{
sizeController.zeroGSphereCollider = zeroGVolume.GetComponent<SphereCollider>();
sizeController.rulesetVolume = rulesetVolume;
}
}
whiteHole.SetActive(true);
return whiteHole;
}
public static GameObject MakeBlackHoleProxy(GameObject rootObject, MVector3 position, float size, TimeValuePair[] curve = null)
{
InitPrefabs();
var blackHoleShader = _blackHoleProxyPrefab.GetComponent<MeshRenderer>().material.shader;
if (blackHoleShader == null) blackHoleShader = _blackHoleProxyPrefab.GetComponent<MeshRenderer>().sharedMaterial.shader;
var blackHoleRender = new GameObject("BlackHoleRender");
blackHoleRender.transform.parent = rootObject.transform;
if (position != null) blackHoleRender.transform.localPosition = position;
else blackHoleRender.transform.localPosition = Vector3.zero;
blackHoleRender.transform.localScale = Vector3.one * size;
var meshFilter = blackHoleRender.AddComponent<MeshFilter>();
meshFilter.mesh = _blackHoleProxyPrefab.GetComponent<MeshFilter>().mesh;
var meshRenderer = blackHoleRender.AddComponent<MeshRenderer>();
meshRenderer.material = new Material(blackHoleShader);
meshRenderer.material.SetFloat(Radius, size * 0.4f);
meshRenderer.material.SetFloat(MaxDistortRadius, size * 0.95f);
meshRenderer.material.SetFloat(MassScale, 1);
meshRenderer.material.SetFloat(DistortFadeDist, size * 0.55f);
if (curve != null) AddSizeController(blackHoleRender, curve, size);
blackHoleRender.SetActive(true);
return blackHoleRender;
}
public static GameObject MakeWhiteHoleProxy(GameObject rootObject, MVector3 position, float size, TimeValuePair[] curve = null)
{
InitPrefabs();
var whiteHoleShader = _whiteHoleProxyPrefab.GetComponent<MeshRenderer>().material.shader;
if (whiteHoleShader == null) whiteHoleShader = _whiteHoleProxyPrefab.GetComponent<MeshRenderer>().sharedMaterial.shader;
var whiteHoleRenderer = new GameObject("WhiteHoleRenderer");
whiteHoleRenderer.transform.parent = rootObject.transform;
if (position != null) whiteHoleRenderer.transform.localPosition = position;
else whiteHoleRenderer.transform.localPosition = Vector3.zero;
whiteHoleRenderer.transform.localScale = Vector3.one * size * 2.8f;
var meshFilter = whiteHoleRenderer.AddComponent<MeshFilter>();
meshFilter.mesh = _whiteHoleProxyPrefab.GetComponent<MeshFilter>().mesh;
var meshRenderer = whiteHoleRenderer.AddComponent<MeshRenderer>();
meshRenderer.material = new Material(whiteHoleShader);
meshRenderer.sharedMaterial.SetFloat(Radius, size * 0.4f);
meshRenderer.sharedMaterial.SetFloat(DistortFadeDist, size);
meshRenderer.sharedMaterial.SetFloat(MaxDistortRadius, size * 2.8f);
meshRenderer.sharedMaterial.SetColor(Color1, new Color(1.88f, 1.88f, 1.88f, 1f));
if (curve != null) AddSizeController(whiteHoleRenderer, curve, size);
whiteHoleRenderer.SetActive(true);
return whiteHoleRenderer;
}
private static SizeController AddSizeController(GameObject go, TimeValuePair[] curve, float size)
{
var sizeController = go.AddComponent<SizeController>();
sizeController.SetScaleCurve(curve);
sizeController.size = size;
return sizeController;
singularityRenderer.gameObject.SetActive(true);
return singularityRenderer.gameObject;
}
}
}

View File

@ -118,7 +118,7 @@ namespace NewHorizons.Builder.Body
flares.gameObject.transform.localScale = new Vector3(0.85f, 0.85f, 0.85f);
// Add singularity
var singularityRenderer = SingularityBuilder.MakeBlackHoleGraphics(planetGO, neutronStarSize * 2.5f);
var singularityRenderer = SingularityBuilder.MakeSingularityGraphics(planetGO, true, neutronStarSize, neutronStarSize * 2.5f);
singularityRenderer.GetComponent<MeshRenderer>().material.color = new Color(0.5f, 2f, 2f, 1f);
return neutronStar;
@ -128,8 +128,8 @@ namespace NewHorizons.Builder.Body
{
var blackHoleSize = progenitor.size / 100;
if (proxy != null) return SingularityBuilder.MakeBlackHoleProxy(proxy, Vector3.zero, blackHoleSize);
else return SingularityBuilder.MakeBlackHole(planetGO, sector, Vector3.zero, blackHoleSize, true, string.Empty);
if (proxy != null) return SingularityBuilder.MakeSingularityProxy(proxy, Vector3.zero, true, blackHoleSize, blackHoleSize * 2.5f);
else return SingularityBuilder.MakeSingularity(planetGO, sector, Vector3.zero, Vector3.zero, true, blackHoleSize, blackHoleSize * 2.5f, true, string.Empty);
}
public static GameObject MakeProxyRemnant(GameObject planet, GameObject proxy, IModBehaviour mod, StarModule progenitor)

View File

@ -134,7 +134,7 @@ namespace NewHorizons.Builder.Body
noMeshChange = true;
foreach (var singularity in config.Props.singularities)
{
if (singularity.size > biggestSize) biggestSize = singularity.size;
if (singularity.distortRadius > biggestSize) biggestSize = singularity.distortRadius;
}
}

View File

@ -8,36 +8,52 @@ using UnityEngine;
namespace NewHorizons.Components.SizeControllers
{
public class BlackHoleSizeController : SizeController
public class SingularitySizeController : SizeController
{
public Material material;
public float innerScale;
public AudioSource audioSource;
public AudioSource oneShotAudioSource;
public SphereCollider sphereCollider;
public WhiteHoleFluidVolume fluidVolume;
public WhiteHoleVolume volume;
protected new void FixedUpdate()
{
base.FixedUpdate();
material.SetFloat(SingularityBuilder.Radius, CurrentScale * 0.4f);
material.SetFloat(SingularityBuilder.MaxDistortRadius, CurrentScale * 0.95f);
material.SetFloat(SingularityBuilder.DistortFadeDist, CurrentScale * 0.55f);
material.SetFloat(SingularityBuilder.Radius, CurrentScale * innerScale);
material.SetFloat(SingularityBuilder.MaxDistortRadius, CurrentScale);
material.SetFloat(SingularityBuilder.DistortFadeDist, CurrentScale - CurrentScale * innerScale);
if (audioSource != null)
{
audioSource.maxDistance = CurrentScale * 2.5f;
audioSource.minDistance = CurrentScale * 0.4f;
audioSource.minDistance = CurrentScale * innerScale;
}
if(oneShotAudioSource != null)
{
oneShotAudioSource.maxDistance = CurrentScale * 3f;
oneShotAudioSource.minDistance = CurrentScale * 0.4f;
oneShotAudioSource.minDistance = CurrentScale * innerScale;
}
if (sphereCollider != null)
{
sphereCollider.radius = CurrentScale * 0.4f;
sphereCollider.radius = CurrentScale * innerScale;
}
if (fluidVolume != null)
{
fluidVolume._innerRadius = CurrentScale * innerScale;
fluidVolume._outerRadius = CurrentScale;
}
if (volume != null)
{
volume._debrisDistMax = CurrentScale * 6.5f;
volume._debrisDistMin = CurrentScale * 2f;
volume._radius = CurrentScale * innerScale;
}
}
}

View File

@ -1,55 +0,0 @@
using NewHorizons.Builder.Body;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace NewHorizons.Components.SizeControllers
{
public class WhiteHoleSizeController : SizeController
{
public Material material;
public Light light;
public SphereCollider sphereCollider, zeroGSphereCollider;
public WhiteHoleFluidVolume fluidVolume;
public WhiteHoleVolume volume;
public GameObject rulesetVolume;
public new void FixedUpdate()
{
base.FixedUpdate();
// The "size" parameter set in the config got multiplied by 2.8 so we gotta divide by that
var trueSize = CurrentScale / 2.8f;
material.SetFloat(SingularityBuilder.Radius, trueSize * 0.4f);
material.SetFloat(SingularityBuilder.DistortFadeDist, trueSize);
material.SetFloat(SingularityBuilder.MaxDistortRadius, trueSize * 2.8f);
if (light != null)
{
light.range = trueSize * 7f;
}
if (sphereCollider != null) sphereCollider.radius = trueSize;
if (fluidVolume != null)
{
fluidVolume._innerRadius = trueSize * 0.5f;
fluidVolume._outerRadius = trueSize;
}
if (volume != null)
{
volume._debrisDistMax = trueSize * 6.5f;
volume._debrisDistMin = trueSize * 2f;
volume._radius = trueSize * 0.5f;
}
if (zeroGSphereCollider != null) zeroGSphereCollider.radius = trueSize * 10f;
if (rulesetVolume != null) rulesetVolume.transform.localScale = Vector3.one * trueSize / 100f;
}
}
}

View File

@ -369,6 +369,27 @@ namespace NewHorizons.External.Configs
Props.singularities = Props.singularities.Append(Singularity).ToArray();
}
// Old singularity size
if (Props?.singularities != null)
{
foreach (var singularity in Props.singularities)
{
if (singularity.size != 0f)
{
singularity.horizonRadius = singularity.size * 0.4f;
switch (singularity.type)
{
case SingularityModule.SingularityType.BlackHole:
singularity.distortRadius = singularity.size * 0.95f;
break;
case SingularityModule.SingularityType.WhiteHole:
singularity.distortRadius = singularity.size * 2.8f;
break;
}
}
}
}
// Signals are now in props
if (Signal?.signals != null)
{

View File

@ -1,3 +1,4 @@
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
@ -18,11 +19,6 @@ namespace NewHorizons.External.Modules.VariableSize
[EnumMember(Value = @"whiteHole")] WhiteHole = 1
}
/// <summary>
/// Only for White Holes. Should this white hole repel the player from it.
/// </summary>
[DefaultValue(true)] public bool makeZeroGVolume = true;
/// <summary>
/// The uniqueID of the white hole or black hole that is paired to this one. If you don't set a value, entering will kill
/// the player
@ -39,11 +35,26 @@ namespace NewHorizons.External.Modules.VariableSize
/// </summary>
public MVector3 position;
/// <summary>
/// Rotation of the singularity. Determines the direction you come out of a white hole
/// </summary>
public MVector3 rotation;
/// <summary>
/// Radius of the singularity. Note that this isn't the same as the event horizon, but includes the entire volume that
/// has warped effects in it.
/// </summary>
[Range(0f, double.MaxValue)] public float size;
[Obsolete("size is deprecated, please use horizonRadius and distortRadius instead")] [Range(0f, double.MaxValue)] public float size;
/// <summary>
/// Radius of the event horizon (solid part)
/// </summary>
[Range(0f, double.MaxValue)] public float horizonRadius;
/// <summary>
/// Radius of the distortion effects. Defaults to 2.5 * horizonRadius
/// </summary>
[Range(0f, double.MaxValue)] public float distortRadius;
/// <summary>
/// If you want a black hole to load a new star system scene, put its name here.
@ -54,5 +65,15 @@ namespace NewHorizons.External.Modules.VariableSize
/// Type of singularity (white hole or black hole)
/// </summary>
public SingularityType type;
/// <summary>
/// Whether a black hole emits blue particles upon warping. It doesn't scale, so disabling this for small black holes is recommended
/// </summary>
public bool hasWarpEffects = true;
/// <summary>
/// Optional override for the render queue. If the singularity is rendering oddly, increasing this to 3000 can help
/// </summary>
[Range(2501f, 3500f)] public int renderQueueOverride = 2985;
}
}

View File

@ -1741,11 +1741,6 @@
"$ref": "#/definitions/TimeValuePair"
}
},
"makeZeroGVolume": {
"type": "boolean",
"description": "Only for White Holes. Should this white hole repel the player from it.",
"default": true
},
"pairedSingularity": {
"type": "string",
"description": "The uniqueID of the white hole or black hole that is paired to this one. If you don't set a value, entering will kill\nthe player"
@ -1758,9 +1753,19 @@
"description": "Position of the singularity",
"$ref": "#/definitions/MVector3"
},
"size": {
"rotation": {
"description": "Rotation of the singularity. Determines the direction you come out of a white hole",
"$ref": "#/definitions/MVector3"
},
"horizonRadius": {
"type": "number",
"description": "Radius of the singularity. Note that this isn't the same as the event horizon, but includes the entire volume that\nhas warped effects in it.",
"description": "Radius of the event horizon (solid part)",
"format": "float",
"minimum": 0.0
},
"distortRadius": {
"type": "number",
"description": "Radius of the distortion effects. Defaults to 2.5 * horizonRadius",
"format": "float",
"minimum": 0.0
},
@ -1771,6 +1776,17 @@
"type": {
"description": "Type of singularity (white hole or black hole)",
"$ref": "#/definitions/SingularityType"
},
"hasWarpEffects": {
"type": "boolean",
"description": "Whether a black hole emits blue particles upon warping. It doesn't scale, so disabling this for small black holes is recommended"
},
"renderQueueOverride": {
"type": "integer",
"description": "Optional override for the render queue. If the singularity is rendering oddly, increasing this to 3000 can help",
"format": "int32",
"maximum": 3500.0,
"minimum": 2501.0
}
}
},