This commit is contained in:
Nick 2022-07-09 14:36:40 -04:00
commit d7c3c914af
7 changed files with 99 additions and 10 deletions

View File

@ -89,6 +89,9 @@ namespace NewHorizons.Builder.Body
fog.fogTint = body.Config.Bramble.dimension.fogTint.ToColor(); fog.fogTint = body.Config.Bramble.dimension.fogTint.ToColor();
} }
// clear base game fog lights
dimensionSector.GetComponent<Sector>()._fogLightsInSector = null;
dimension.SetActive(true); dimension.SetActive(true);
return dimension; return dimension;

View File

@ -7,6 +7,7 @@ using System.Linq;
using UnityEngine; using UnityEngine;
using static NewHorizons.External.Modules.BrambleModule; using static NewHorizons.External.Modules.BrambleModule;
using static NewHorizons.External.Modules.SignalModule; using static NewHorizons.External.Modules.SignalModule;
using Logger = NewHorizons.Utility.Logger;
namespace NewHorizons.Builder.Props namespace NewHorizons.Builder.Props
{ {
@ -34,12 +35,23 @@ namespace NewHorizons.Builder.Props
BuiltBrambleNodes = new(); BuiltBrambleNodes = new();
} }
// how warping works
// every frame, each FogWarpDetector loops over all FogWarpVolume instances it has in _warpVolumes. Each instance gets CheckWarpProximity called
// (pretty much every FogWarpVolume in the game is a SphericalFogWarpVolume. that's where CheckWarpProximity is called)
// if CheckWarpProximity would return 0, it calls its own WarpDetector() function
//
public static void FinishPairingNodesForDimension(string dimensionName, AstroObject dimensionAO = null) public static void FinishPairingNodesForDimension(string dimensionName, AstroObject dimensionAO = null)
{ {
Logger.LogWarning($"Pairing missed for {dimensionName}");
if (!_unpairedNodes.ContainsKey(dimensionName)) return; if (!_unpairedNodes.ContainsKey(dimensionName)) return;
Logger.LogWarning("proceeding");
foreach (var nodeWarpController in _unpairedNodes[dimensionName]) foreach (var nodeWarpController in _unpairedNodes[dimensionName])
{ {
Logger.LogWarning($"Pairing node {nodeWarpController.gameObject.name} links to {dimensionName}");
PairEntrance(nodeWarpController, dimensionName, dimensionAO); PairEntrance(nodeWarpController, dimensionName, dimensionAO);
} }
@ -50,6 +62,8 @@ namespace NewHorizons.Builder.Props
{ {
if (!_unpairedNodes.ContainsKey(linksTo)) _unpairedNodes[linksTo] = new(); if (!_unpairedNodes.ContainsKey(linksTo)) _unpairedNodes[linksTo] = new();
Logger.LogWarning($"Recording node {warpVolume.gameObject.name} links to {linksTo}");
_unpairedNodes[linksTo].Add(warpVolume); _unpairedNodes[linksTo].Add(warpVolume);
} }
@ -133,15 +147,24 @@ namespace NewHorizons.Builder.Props
private static bool PairEntrance(InnerFogWarpVolume nodeWarp, string destinationName, AstroObject dimensionAO = null) private static bool PairEntrance(InnerFogWarpVolume nodeWarp, string destinationName, AstroObject dimensionAO = null)
{ {
Logger.LogWarning($"Pairing node {nodeWarp.gameObject.name} to {destinationName}");
var destinationAO = dimensionAO ?? AstroObjectLocator.GetAstroObject(destinationName); // find child "Sector/OuterWarp" var destinationAO = dimensionAO ?? AstroObjectLocator.GetAstroObject(destinationName); // find child "Sector/OuterWarp"
if (destinationAO == null) return false; if (destinationAO == null) return false;
Logger.LogWarning($"Found {destinationName} as gameobject {destinationAO.gameObject.name} (was passed in: {dimensionAO != null})");
// link the node's warp volume to the destination's // link the node's warp volume to the destination's
var destination = GetOuterFogWarpVolumeFromAstroObject(destinationAO.gameObject); var destination = GetOuterFogWarpVolumeFromAstroObject(destinationAO.gameObject);
if (destination == null) return false; if (destination == null) return false;
Logger.LogWarning($"Proceeding with pairing node {nodeWarp.gameObject.name} to {destinationName}. Path to outer fog warp volume: {destination.transform.GetPath()}");
nodeWarp._linkedOuterWarpVolume = destination; nodeWarp._linkedOuterWarpVolume = destination;
destination.RegisterSenderWarp(nodeWarp); destination.RegisterSenderWarp(nodeWarp);
var fogLight = nodeWarp.GetComponent<FogLight>();
fogLight._linkedSector = destinationAO._rootSector;
return true; return true;
} }
@ -168,13 +191,60 @@ namespace NewHorizons.Builder.Props
var brambleNodePrefabPath = "DB_HubDimension_Body/Sector_HubDimension/Interactables_HubDimension/InnerWarp_ToCluster"; var brambleNodePrefabPath = "DB_HubDimension_Body/Sector_HubDimension/Interactables_HubDimension/InnerWarp_ToCluster";
var path = config.isSeed ? brambleSeedPrefabPath : brambleNodePrefabPath; var path = config.isSeed ? brambleSeedPrefabPath : brambleNodePrefabPath;
var brambleNode = DetailBuilder.MakeDetail(go, sector, path, config.position, config.rotation, 1, false); var brambleNode = DetailBuilder.MakeDetail(go, sector, path, config.position, config.rotation, 1, false, leaveInactive:true);
brambleNode.name = "Bramble Node to " + config.linksTo; brambleNode.name = "Bramble Node to " + config.linksTo;
var warpController = brambleNode.GetComponent<InnerFogWarpVolume>(); var warpController = brambleNode.GetComponent<InnerFogWarpVolume>();
// this node comes with Feldspar's signal, we don't want that though // this node comes with Feldspar's signal, we don't want that though
GameObject.Destroy(brambleNode.FindChild("Signal_Harmonica")); GameObject.Destroy(brambleNode.FindChild("Signal_Harmonica"));
//
// Fix some components
//
var fogLight = brambleNode.GetComponent<FogLight>();
fogLight._parentBody = go.GetComponent<OWRigidbody>();
fogLight._sector = sector;
fogLight._linkedFogLights.Clear();
fogLight._linkedLightData.Clear();
fogLight._linkedSector = null;
sector.RegisterFogLight(fogLight);
//
// Set the scale
//
brambleNode.transform.localScale = Vector3.one * config.scale;
warpController._warpRadius *= config.scale;
warpController._exitRadius *= config.scale;
// seed fog works differently, so it doesn't need to be fixed (it's also located on a different child path, so the below FindChild calls wouldn't work)
if (!config.isSeed)
{
var fog = brambleNode.FindChild("Effects").FindChild("InnerWarpFogSphere");
var fogMaterial = fog.GetComponent<MeshRenderer>().sharedMaterial;
fog.transform.localScale /= config.scale;
fogMaterial.SetFloat("_Radius", fogMaterial.GetFloat("_Radius") * config.scale);
fogMaterial.SetFloat("_Density", fogMaterial.GetFloat("_Density") / config.scale);
}
// issue: when exiting a scaled bramblenode, the screen fog effect uses the original bramble node radius
// it's controlled by this class FogWarpEffectBubbleController which is on a game object under Player_Camera
// found under PlayerFogWarpDetector.LateUpdate()
// _playerEffectBubbleController.SetFogFade(_fogFraction, _fogColor); // where _fogFraction is basically _targetFogFraction, but lerped into over time
// found under FogWarpDetector.FixedUpdate()
// FogWarpVolume fogWarpVolume = _warpVolumes[i];
// float num2 = Mathf.Abs(fogWarpVolume.CheckWarpProximity(this));
// float b = Mathf.Clamp01(1f - Mathf.Abs(num2) / fogWarpVolume.GetFogThickness());
// _targetFogFraction = Mathf.Max(_targetFogFraction, b);
// this means that either CheckWarpProximity() or GetFogThickness() is incorrect for the InnerWarpFogSpheres.
// most likely it's CheckWarpProximity()
// //
// change the colors // change the colors
// //
@ -217,6 +287,7 @@ namespace NewHorizons.Builder.Props
} }
// Done! // Done!
brambleNode.SetActive(true);
return brambleNode; return brambleNode;
} }
@ -228,6 +299,9 @@ namespace NewHorizons.Builder.Props
fogRenderer._fogColor = fogTint.Value; fogRenderer._fogColor = fogTint.Value;
fogRenderer._useFarFogColor = false; fogRenderer._useFarFogColor = false;
var fogBackdrop = brambleNode.FindChild("Terrain_DB_BrambleSphere_Inner_v2")?.FindChild("fogbackdrop_v2");
if (fogBackdrop != null) fogBackdrop.GetComponent<MeshRenderer>().sharedMaterial.color = (Color)fogTint;
} }
if (lightTint != null) if (lightTint != null)

View File

@ -94,14 +94,14 @@ namespace NewHorizons.Builder.Props
detailInfoToCorrespondingSpawnedGameObject[detail] = detailGO; detailInfoToCorrespondingSpawnedGameObject[detail] = detailGO;
} }
public static GameObject MakeDetail(GameObject go, Sector sector, string propToClone, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal) public static GameObject MakeDetail(GameObject go, Sector sector, string propToClone, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal, bool leaveInactive=false)
{ {
var prefab = SearchUtilities.Find(propToClone); var prefab = SearchUtilities.Find(propToClone);
if (prefab == null) Logger.LogError($"Couldn't find detail {propToClone}"); if (prefab == null) Logger.LogError($"Couldn't find detail {propToClone}");
return MakeDetail(go, sector, prefab, position, rotation, scale, alignWithNormal); return MakeDetail(go, sector, prefab, position, rotation, scale, alignWithNormal, leaveInactive);
} }
public static GameObject MakeDetail(GameObject planetGO, Sector sector, GameObject prefab, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal) public static GameObject MakeDetail(GameObject planetGO, Sector sector, GameObject prefab, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal, bool leaveInactive=false)
{ {
if (prefab == null) return null; if (prefab == null) return null;
@ -271,7 +271,7 @@ namespace NewHorizons.Builder.Props
prop.transform.localScale = scale != 0 ? Vector3.one * scale : prefab.transform.localScale; prop.transform.localScale = scale != 0 ? Vector3.one * scale : prefab.transform.localScale;
prop.SetActive(true); if (!leaveInactive) prop.SetActive(true);
return prop; return prop;
} }

View File

@ -52,6 +52,11 @@ namespace NewHorizons.External.Modules
/// </summary> /// </summary>
public MVector3 rotation; public MVector3 rotation;
/// <summary>
/// The physical scale of the node
/// </summary>
[DefaultValue(1f)] public float scale = 1f;
/// <summary> /// <summary>
/// The name of the planet that hosts the dimension this node links to /// The name of the planet that hosts the dimension this node links to
/// </summary> /// </summary>

View File

@ -412,7 +412,8 @@ namespace NewHorizons.Handlers
} }
else if (body.Config.Orbit.staticPosition != null) else if (body.Config.Orbit.staticPosition != null)
{ {
ao.transform.position = body.Config.Orbit.staticPosition; // NH doesn't set the value of _centerOfTheUniverse for a few frames
ao.transform.position = body.Config.Orbit.staticPosition + Locator._centerOfTheUniverse._staticReferenceFrame._lastPosition;
} }
if (ao.GetAstroObjectName() == AstroObject.Name.CustomString) if (ao.GetAstroObjectName() == AstroObject.Name.CustomString)

View File

@ -531,6 +531,12 @@
"description": "The physical rotation of the node", "description": "The physical rotation of the node",
"$ref": "#/definitions/MVector3" "$ref": "#/definitions/MVector3"
}, },
"scale": {
"type": "number",
"description": "The physical scale of the node",
"format": "float",
"default": 1.0
},
"linksTo": { "linksTo": {
"type": "string", "type": "string",
"description": "The name of the planet that hosts the dimension this node links to" "description": "The name of the planet that hosts the dimension this node links to"