Jam fixes (#828)

## Bug fixes
- Don't look for old parent path when propagating signals.
- Don't explode if an object is deleted in a custom bramble node
- Fixes compat issue with Visible Stranger where the Probes map marker
would vanish forever.
This commit is contained in:
xen-42 2024-04-01 00:05:50 -04:00 committed by GitHub
commit d5968c7588
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 43 additions and 38 deletions

View File

@ -6,6 +6,7 @@ using NewHorizons.Handlers;
using NewHorizons.Utility; using NewHorizons.Utility;
using NewHorizons.Utility.OuterWilds; using NewHorizons.Utility.OuterWilds;
using NewHorizons.Utility.OWML; using NewHorizons.Utility.OWML;
using Newtonsoft.Json;
using OWML.Common; using OWML.Common;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -414,7 +415,13 @@ namespace NewHorizons.Builder.Props
{ {
foreach (var signalConfig in connectedSignals) foreach (var signalConfig in connectedSignals)
{ {
var signalGO = SignalBuilder.Make(go, sector, signalConfig, mod); // Have to ensure that this new signal doesn't use parent path, else it looks for a parent that only exists on the original body
// Have to make a copy of it as well to avoid modifying the old body's info
var signalConfigCopy = JsonConvert.DeserializeObject<SignalInfo>(JsonConvert.SerializeObject(signalConfig));
signalConfigCopy.parentPath = null;
signalConfigCopy.isRelativeToParent = false;
var signalGO = SignalBuilder.Make(go, sector, signalConfigCopy, mod);
signalGO.GetComponent<AudioSignal>()._identificationDistance = 0; signalGO.GetComponent<AudioSignal>()._identificationDistance = 0;
signalGO.GetComponent<AudioSignal>()._sourceRadius = 1; signalGO.GetComponent<AudioSignal>()._sourceRadius = 1;
signalGO.transform.position = brambleNode.transform.position; signalGO.transform.position = brambleNode.transform.position;

View File

@ -33,13 +33,16 @@ namespace NewHorizons.Components.Sectored
} }
private void Start() private void Start()
{
DisableRenderers();
}
private void GetRenderers()
{ {
_renderers = gameObject.GetComponentsInChildren<Renderer>(); _renderers = gameObject.GetComponentsInChildren<Renderer>();
_tessellatedRenderers = gameObject.GetComponentsInChildren<TessellatedRenderer>(); _tessellatedRenderers = gameObject.GetComponentsInChildren<TessellatedRenderer>();
_colliders = gameObject.GetComponentsInChildren<Collider>(); _colliders = gameObject.GetComponentsInChildren<Collider>();
_lights = gameObject.GetComponentsInChildren<Light>(); _lights = gameObject.GetComponentsInChildren<Light>();
DisableRenderers();
} }
private void OnSectorOccupantsUpdated() private void OnSectorOccupantsUpdated()
@ -54,54 +57,35 @@ namespace NewHorizons.Components.Sectored
} }
} }
private void EnableRenderers() private void EnableRenderers() => ToggleRenderers(true);
private void DisableRenderers() => ToggleRenderers(false);
private void ToggleRenderers(bool visible)
{ {
GetRenderers();
foreach (var renderer in _renderers) foreach (var renderer in _renderers)
{ {
renderer.forceRenderingOff = false; renderer.forceRenderingOff = !visible;
} }
foreach (var tessellatedRenderer in _tessellatedRenderers) foreach (var tessellatedRenderer in _tessellatedRenderers)
{ {
tessellatedRenderer.enabled = true; tessellatedRenderer.enabled = visible;
} }
foreach (var collider in _colliders) foreach (var collider in _colliders)
{ {
collider.enabled = true; collider.enabled = visible;
} }
foreach (var light in _lights) foreach (var light in _lights)
{ {
light.enabled = true; light.enabled = visible;
} }
_renderersShown = true; _renderersShown = visible;
}
private void DisableRenderers()
{
foreach (var renderer in _renderers)
{
renderer.forceRenderingOff = true;
}
foreach (var tessellatedRenderer in _tessellatedRenderers)
{
tessellatedRenderer.enabled = false;
}
foreach (var collider in _colliders)
{
collider.enabled = false;
}
foreach (var light in _lights)
{
light.enabled = false;
}
_renderersShown = false;
} }
} }
} }

View File

@ -1,6 +1,7 @@
using HarmonyLib; using HarmonyLib;
using NewHorizons.Components.Sectored; using NewHorizons.Components.Sectored;
using NewHorizons.Handlers; using NewHorizons.Handlers;
using NewHorizons.Utility.OWML;
namespace NewHorizons.Patches.HUDPatches namespace NewHorizons.Patches.HUDPatches
{ {
@ -27,15 +28,21 @@ namespace NewHorizons.Patches.HUDPatches
[HarmonyPatch(nameof(ProbeHUDMarker.RefreshOwnVisibility))] [HarmonyPatch(nameof(ProbeHUDMarker.RefreshOwnVisibility))]
public static bool ProbeHUDMarker_RefreshOwnVisibility(ProbeHUDMarker __instance) public static bool ProbeHUDMarker_RefreshOwnVisibility(ProbeHUDMarker __instance)
{ {
// Probe marker seems to never appear in the eye or QM in base game (inside eye being past the vortex) ?? at least thats what its code implies
bool insideEYE = Locator.GetEyeStateManager() != null && Locator.GetEyeStateManager().IsInsideTheEye(); bool insideEYE = Locator.GetEyeStateManager() != null && Locator.GetEyeStateManager().IsInsideTheEye();
bool insideQM = __instance._quantumMoon != null && (__instance._quantumMoon.IsPlayerInside() || __instance._quantumMoon.IsProbeInside()); bool insideQM = __instance._quantumMoon != null && (__instance._quantumMoon.IsPlayerInside() || __instance._quantumMoon.IsProbeInside());
bool insideRW = Locator.GetRingWorldController() != null && Locator.GetRingWorldController().isPlayerInside == Locator.GetRingWorldController().isProbeInside;
bool insideIP = Locator.GetCloakFieldController() != null && Locator.GetCloakFieldController().isPlayerInsideCloak == Locator.GetCloakFieldController().isProbeInsideCloak; // Either the controllers wtv are null or the player and probe state are the same
bool insideCloak = CloakSectorController.isPlayerInside == CloakSectorController.isProbeInside; bool sameRW = Locator.GetRingWorldController() == null || Locator.GetRingWorldController().isPlayerInside == Locator.GetRingWorldController().isProbeInside;
bool sameIP = Locator.GetCloakFieldController() == null || Locator.GetCloakFieldController().isPlayerInsideCloak == Locator.GetCloakFieldController().isProbeInsideCloak;
bool sameCloak = CloakSectorController.isPlayerInside == CloakSectorController.isProbeInside;
bool sameInterference = InterferenceHandler.IsPlayerSameAsProbe(); bool sameInterference = InterferenceHandler.IsPlayerSameAsProbe();
bool isActive = __instance.gameObject.activeInHierarchy || __instance._isTLCDuplicate; bool isActive = __instance.gameObject.activeInHierarchy || __instance._isTLCDuplicate;
__instance._isVisible = isActive && !insideEYE && !insideQM && !__instance._translatorEquipped && !__instance._inConversation && __instance._launched && (__instance._isWearingHelmet || __instance._atFlightConsole) && insideRW && insideIP && insideCloak && sameInterference; __instance._isVisible = isActive && !insideEYE && !insideQM && !__instance._translatorEquipped
&& !__instance._inConversation && __instance._launched && (__instance._isWearingHelmet || __instance._atFlightConsole)
&& sameRW && sameIP && sameCloak && sameInterference;
if (__instance._canvasMarker != null) __instance._canvasMarker.SetVisibility(__instance._isVisible); if (__instance._canvasMarker != null) __instance._canvasMarker.SetVisibility(__instance._isVisible);

View File

@ -19,10 +19,17 @@ namespace NewHorizons.Utility.OWML
Main.Instance.ModHelper.Console.WriteLine($"{Enum.GetName(typeof(LogType), type)} : {text}", LogTypeToMessageType(type)); Main.Instance.ModHelper.Console.WriteLine($"{Enum.GetName(typeof(LogType), type)} : {text}", LogTypeToMessageType(type));
} }
public static void LogVerbose(params object[] obj) => LogVerbose(string.Join(", ", obj));
public static void LogVerbose(object text) => Log(text, LogType.Verbose); public static void LogVerbose(object text) => Log(text, LogType.Verbose);
public static void Log(object text) => Log(text, LogType.Log); public static void Log(object text) => Log(text, LogType.Log);
public static void Log(params object[] obj) => Log(string.Join(", ", obj));
public static void LogWarning(object text) => Log(text, LogType.Warning); public static void LogWarning(object text) => Log(text, LogType.Warning);
public static void LogWarning(params object[] obj) => LogWarning(string.Join(", ", obj));
public static void LogError(object text) => Log(text, LogType.Error); public static void LogError(object text) => Log(text, LogType.Error);
public static void LogError(params object[] obj) => LogError(string.Join(", ", obj));
public enum LogType public enum LogType
{ {