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.OuterWilds;
using NewHorizons.Utility.OWML;
using Newtonsoft.Json;
using OWML.Common;
using System.Collections.Generic;
using System.Linq;
@ -414,7 +415,13 @@ namespace NewHorizons.Builder.Props
{
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>()._sourceRadius = 1;
signalGO.transform.position = brambleNode.transform.position;

View File

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

View File

@ -1,6 +1,7 @@
using HarmonyLib;
using NewHorizons.Components.Sectored;
using NewHorizons.Handlers;
using NewHorizons.Utility.OWML;
namespace NewHorizons.Patches.HUDPatches
{
@ -27,15 +28,21 @@ namespace NewHorizons.Patches.HUDPatches
[HarmonyPatch(nameof(ProbeHUDMarker.RefreshOwnVisibility))]
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 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;
bool insideCloak = CloakSectorController.isPlayerInside == CloakSectorController.isProbeInside;
// Either the controllers wtv are null or the player and probe state are the same
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 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);

View File

@ -19,10 +19,17 @@ namespace NewHorizons.Utility.OWML
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 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(params object[] obj) => LogWarning(string.Join(", ", obj));
public static void LogError(object text) => Log(text, LogType.Error);
public static void LogError(params object[] obj) => LogError(string.Join(", ", obj));
public enum LogType
{