mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Turn quantum lightning into a prop based thing, make quantum details build with the repeat-10-times-for-parent-to-exist thing for back compat
This commit is contained in:
parent
82e4a8755d
commit
37c90f52f0
@ -22,6 +22,20 @@ namespace NewHorizons.Builder.Props
|
||||
private static readonly Dictionary<(Sector, string), (GameObject prefab, bool isItem)> _fixedPrefabCache = new();
|
||||
private static GameObject _emptyPrefab;
|
||||
|
||||
private static readonly Dictionary<DetailInfo, GameObject> _detailInfoToGameObject = new();
|
||||
|
||||
public static GameObject GetGameObjectFromDetailInfo(DetailInfo info)
|
||||
{
|
||||
if (_detailInfoToGameObject.ContainsKey(info))
|
||||
{
|
||||
return _detailInfoToGameObject[info];
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static DetailBuilder()
|
||||
{
|
||||
SceneManager.sceneUnloaded += SceneManager_sceneUnloaded;
|
||||
@ -47,6 +61,7 @@ namespace NewHorizons.Builder.Props
|
||||
UnityEngine.Object.Destroy(prefab.prefab);
|
||||
}
|
||||
_fixedPrefabCache.Clear();
|
||||
_detailInfoToGameObject.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -286,6 +301,8 @@ namespace NewHorizons.Builder.Props
|
||||
ConditionalObjectActivation.SetUp(prop, detail.deactivationCondition, detail.blinkWhenActiveChanged, false);
|
||||
}
|
||||
|
||||
_detailInfoToGameObject[detail] = prop;
|
||||
|
||||
return prop;
|
||||
}
|
||||
|
||||
|
||||
@ -6,15 +6,12 @@ using NewHorizons.Builder.ShipLog;
|
||||
using NewHorizons.External;
|
||||
using NewHorizons.External.Configs;
|
||||
using NewHorizons.External.Modules;
|
||||
using NewHorizons.External.Modules.Props;
|
||||
using NewHorizons.External.Modules.Props.Quantum;
|
||||
using NewHorizons.Utility;
|
||||
using NewHorizons.Utility.OWML;
|
||||
using OWML.Common;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NewHorizons.External.Modules.Props;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Builder.Props
|
||||
@ -143,6 +140,10 @@ namespace NewHorizons.Builder.Props
|
||||
MakeGeneralProps(go, config.Props.audioSources, (audioSource) => AudioSourceBuilder.Make(go, sector, audioSource, mod), (audioSource) => audioSource.audio);
|
||||
RemoteBuilder.MakeGeneralProps(go, sector, config.Props.remotes, nhBody);
|
||||
if (Main.HasDLC) MakeGeneralProps(go, config.Props.projectionTotems, (totem) => ProjectionTotemBuilder.Make(go, sector, totem, mod));
|
||||
// For quantum groups, make the details in advance
|
||||
if (config.Props.socketQuantumGroups != null) MakeGeneralProps(go, config.Props.socketQuantumGroups.SelectMany(x => x.details), (detail) => DetailBuilder.Make(go, sector, mod, detail), (detail) => detail.path);
|
||||
if (config.Props.stateQuantumGroups != null) MakeGeneralProps(go, config.Props.stateQuantumGroups.SelectMany(x => x.details), (detail) => DetailBuilder.Make(go, sector, mod, detail), (detail) => detail.path);
|
||||
if (config.Props.lightningQuantumGroups != null) MakeGeneralProps(go, config.Props.lightningQuantumGroups, (lightning) => QuantumBuilder.MakeQuantumLightning(go, sector, mod, lightning));
|
||||
|
||||
RunMultiPass();
|
||||
|
||||
@ -165,7 +166,6 @@ namespace NewHorizons.Builder.Props
|
||||
}
|
||||
}
|
||||
|
||||
if (config.Props.lightningQuantumGroups != null) QuantumBuilder.Make(go, sector, mod, config.Props.lightningQuantumGroups);
|
||||
if (config.Props.socketQuantumGroups != null) QuantumBuilder.Make(go, sector, mod, config.Props.socketQuantumGroups);
|
||||
if (config.Props.stateQuantumGroups != null) QuantumBuilder.Make(go, sector, mod, config.Props.stateQuantumGroups);
|
||||
}
|
||||
|
||||
@ -1,16 +1,13 @@
|
||||
using NewHorizons.Components.Quantum;
|
||||
using NewHorizons.External.Configs;
|
||||
using NewHorizons.External.Modules.Props;
|
||||
using NewHorizons.External.Modules.Props.Quantum;
|
||||
using NewHorizons.Utility.Files;
|
||||
using NewHorizons.Utility.Geometry;
|
||||
using NewHorizons.Utility.OWML;
|
||||
using System;
|
||||
using OWML.Common;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NewHorizons.External.Modules.Props;
|
||||
using UnityEngine;
|
||||
using OWML.Common;
|
||||
|
||||
namespace NewHorizons.Builder.Props
|
||||
{
|
||||
@ -40,26 +37,14 @@ namespace NewHorizons.Builder.Props
|
||||
{
|
||||
MakeStateGroup(planetGO, sector, mod, stateGroup);
|
||||
}
|
||||
else if (quantumGroup is LightningQuantumGroupInfo lightningGroup)
|
||||
{
|
||||
MakeQuantumLightning(planetGO, sector, mod, lightningGroup);
|
||||
}
|
||||
}
|
||||
|
||||
public static void MakeQuantumLightning(GameObject planetGO, Sector sector, IModBehaviour mod, LightningQuantumGroupInfo quantumGroup)
|
||||
public static void MakeQuantumLightning(GameObject planetGO, Sector sector, IModBehaviour mod, LightningQuantumInfo quantumGroup)
|
||||
{
|
||||
(GameObject go, QuantumDetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.Make(planetGO, sector, mod, x), x)).ToArray();
|
||||
(GameObject go, DetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.Make(planetGO, sector, mod, x), x)).ToArray();
|
||||
|
||||
// Bases its position off the first object with position set
|
||||
var root = propsInGroup.FirstOrDefault(x => x.detail.position != null || x.detail.rotation != null || x.detail.isRelativeToParent);
|
||||
|
||||
var rootGo = root == default ? sector.gameObject : root.go;
|
||||
|
||||
var lightning = DetailBuilder.Make(planetGO, sector, Main.Instance, AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset<GameObject>("Prefab_EYE_QuantumLightningObject"), new DetailInfo());
|
||||
var lightning = DetailBuilder.Make(planetGO, sector, Main.Instance, AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset<GameObject>("Prefab_EYE_QuantumLightningObject"), new DetailInfo(quantumGroup));
|
||||
AssetBundleUtilities.ReplaceShaders(lightning);
|
||||
lightning.transform.position = rootGo.transform.position;
|
||||
lightning.transform.rotation = rootGo.transform.rotation;
|
||||
lightning.transform.parent = rootGo.transform.parent;
|
||||
|
||||
foreach (var (go, _) in propsInGroup)
|
||||
{
|
||||
@ -82,7 +67,7 @@ namespace NewHorizons.Builder.Props
|
||||
// Nice to have: socket groups that specify a filledSocketObject and an emptySocketObject (eg the archway in the giant's deep tower)
|
||||
public static void MakeSocketGroup(GameObject planetGO, Sector sector, IModBehaviour mod, SocketQuantumGroupInfo quantumGroup)
|
||||
{
|
||||
(GameObject go, QuantumDetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.Make(planetGO, sector, mod, x), x)).ToArray();
|
||||
(GameObject go, QuantumDetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.GetGameObjectFromDetailInfo(x), x)).ToArray();
|
||||
|
||||
GameObject specialProp = null;
|
||||
QuantumDetailInfo specialInfo = null;
|
||||
@ -177,7 +162,7 @@ namespace NewHorizons.Builder.Props
|
||||
// while states put the QuantumObject component (NHMultiStateQuantumObject) on the parent, which is located at the center of the planet
|
||||
// this means that the distance measured by QuantumObject is not accurate, since it's not measuring from the active prop, but from the center of the planet
|
||||
|
||||
var propsInGroup = quantumGroup.details.Select(x => DetailBuilder.Make(go, sector, mod, x)).ToArray();
|
||||
var propsInGroup = quantumGroup.details.Select(x => DetailBuilder.GetGameObjectFromDetailInfo(x)).ToArray();
|
||||
|
||||
var groupRoot = new GameObject(quantumGroup.rename);
|
||||
groupRoot.transform.parent = sector?.transform ?? go.transform;
|
||||
|
||||
2
NewHorizons/External/Modules/PropModule.cs
vendored
2
NewHorizons/External/Modules/PropModule.cs
vendored
@ -132,7 +132,7 @@ namespace NewHorizons.External.Modules
|
||||
/// <summary>
|
||||
/// Add quantum lightning to a planet. When lightning strikes, a different detail object is shown. The lightning will take the first defined position/rotation for all objects.
|
||||
/// </summary>
|
||||
public LightningQuantumGroupInfo[] lightningQuantumGroups;
|
||||
public LightningQuantumInfo[] lightningQuantumGroups;
|
||||
|
||||
/// <summary>
|
||||
/// Add campfires that allow you to enter the dream world/simulation (requires Echoes of the Eye DLC). Must be paired with a dream arrival point, which can be placed on this planet or elsewhere.
|
||||
|
||||
@ -1,14 +0,0 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace NewHorizons.External.Modules.Props.Quantum;
|
||||
|
||||
[JsonObject]
|
||||
public class LightningQuantumGroupInfo : BaseQuantumGroupInfo
|
||||
{
|
||||
|
||||
}
|
||||
12
NewHorizons/External/Modules/Props/Quantum/LightningQuantumInfo.cs
vendored
Normal file
12
NewHorizons/External/Modules/Props/Quantum/LightningQuantumInfo.cs
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace NewHorizons.External.Modules.Props.Quantum;
|
||||
|
||||
[JsonObject]
|
||||
public class LightningQuantumInfo : GeneralPropInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// List of props which will be alternated between during flashes of lightning
|
||||
/// </summary>
|
||||
public DetailInfo[] details;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user