Fix collision issue

This commit is contained in:
Nick 2022-09-13 21:58:31 -04:00
parent 8f4993a1ac
commit 7bcddf4261
2 changed files with 77 additions and 31 deletions

View File

@ -5,8 +5,10 @@ using NewHorizons.Utility;
using OWML.Common; using OWML.Common;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
using Component = UnityEngine.Component;
using Logger = NewHorizons.Utility.Logger; using Logger = NewHorizons.Utility.Logger;
namespace NewHorizons.Builder.Props namespace NewHorizons.Builder.Props
{ {
@ -71,6 +73,9 @@ namespace NewHorizons.Builder.Props
var isTorch = prop.GetComponent<VisionTorchItem>() != null; var isTorch = prop.GetComponent<VisionTorchItem>() != null;
// Fix a bunch of stuff when done loading
var fixes = new List<Component>();
foreach (var component in prop.GetComponentsInChildren<Component>(true)) foreach (var component in prop.GetComponentsInChildren<Component>(true))
{ {
if (sector == null) if (sector == null)
@ -80,6 +85,16 @@ namespace NewHorizons.Builder.Props
else FixSectoredComponent(component, sector, isTorch); else FixSectoredComponent(component, sector, isTorch);
FixComponent(component, go, prefab.name); FixComponent(component, go, prefab.name);
if (DetailFixer.fixes.Keys.Any(x => x.IsAssignableFrom(component.GetType())))
{
fixes.Add(component);
}
}
if (fixes.Count > 0)
{
prop.AddComponent<DetailFixer>().SetFixes(fixes);
} }
prop.transform.position = detail.position == null ? go.transform.position : go.transform.TransformPoint(detail.position); prop.transform.position = detail.position == null ? go.transform.position : go.transform.TransformPoint(detail.position);
@ -277,44 +292,75 @@ namespace NewHorizons.Builder.Props
torchItem.mindProjectorTrigger.enabled = true; torchItem.mindProjectorTrigger.enabled = true;
torchItem.mindSlideProjector._mindProjectorImageEffect = SearchUtilities.Find("Player_Body/PlayerCamera").GetComponent<MindProjectorImageEffect>(); torchItem.mindSlideProjector._mindProjectorImageEffect = SearchUtilities.Find("Player_Body/PlayerCamera").GetComponent<MindProjectorImageEffect>();
} }
}
// Fix a bunch of stuff when done loading /// <summary>
Delay.RunWhen(() => Main.IsSystemReady, () => /// Performs fixes that have to be done after the system loads
/// Has to be done this way to ensure that scatter works
/// </summary>
private class DetailFixer : MonoBehaviour
{
public static Dictionary<Type, Action<Component>> fixes = new()
{ {
try [typeof(AnglerfishAnimController)] = (x) =>
{ {
if (component == null) return; var angler = x as AnglerfishAnimController;
if (component is Animator animator) animator.enabled = true;
else if (component is Collider collider) collider.enabled = true; Logger.LogVerbose("Enabling anglerfish animation");
else if (component is Renderer renderer) renderer.enabled = true; // Remove any reference to its angler
else if (component is Shape shape) shape.enabled = true; if (angler._anglerfishController)
else if (component is SectorCullGroup sectorCullGroup)
{ {
sectorCullGroup._inMapView = false; angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState;
sectorCullGroup._isFastForwarding = false; angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn;
sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false); angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended;
angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended;
} }
// If it's not a moving anglerfish make sure the anim controller is regular angler.enabled = true;
else if (component is AnglerfishAnimController angler && angler.GetComponentInParent<AnglerfishController>() == null) angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking);
},
[typeof(SectorCullGroup)] = (x) =>
{
var sectorCullGroup = x as SectorCullGroup;
sectorCullGroup._inMapView = false;
sectorCullGroup._isFastForwarding = false;
sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false);
},
[typeof(Shape)] = (x) => (x as Shape).enabled = true,
[typeof(Renderer)] = (x) => (x as Renderer).enabled = true,
[typeof(Collider)] = (x) => (x as Collider).enabled = true,
[typeof(Animator)] = (x) => (x as Animator).enabled = true
};
// Have to be public to be copied by Instantiate
public Component[] componentsToFix;
public void SetFixes(List<Component> fixes)
{
// Components must be in a list for unity to properly deep copy
componentsToFix = fixes.ToArray();
}
public void Start()
{
for (int i = 0; i < componentsToFix.Length; i++)
{
var component = componentsToFix[i];
try
{ {
Logger.LogVerbose("Enabling anglerfish animation"); if (component != null)
// Remove any reference to its angler
if (angler._anglerfishController)
{ {
angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; var key = fixes.Keys.FirstOrDefault(x => x.IsAssignableFrom(component.GetType()));
angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn; var fix = fixes[key];
angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; fix(component);
angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended;
} }
angler.enabled = true; }
angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); catch (Exception)
{
Logger.LogWarning($"Failed to fix component {component} on {gameObject.name}");
} }
} }
catch (Exception e) }
{
Logger.LogWarning($"Exception when modifying component [{component.GetType().Name}] on [{planetGO.name}] for prop [{prefab}]:\n{e}");
}
});
} }
} }
} }

View File

@ -70,7 +70,7 @@ namespace NewHorizons.Builder.Props
{ {
scale = propInfo.scale scale = propInfo.scale
}; };
prefab = DetailBuilder.Make(go, sector, prefab, detailInfo); var scatterPrefab = DetailBuilder.Make(go, sector, prefab, detailInfo);
for (int i = 0; i < propInfo.count; i++) for (int i = 0; i < propInfo.count; i++)
{ {
@ -116,7 +116,7 @@ namespace NewHorizons.Builder.Props
point = Quaternion.Euler(90, 0, 0) * point; point = Quaternion.Euler(90, 0, 0) * point;
} }
var prop = prefab.InstantiateInactive(); var prop = scatterPrefab.InstantiateInactive();
prop.transform.SetParent(sector?.transform ?? go.transform); prop.transform.SetParent(sector?.transform ?? go.transform);
prop.transform.localPosition = go.transform.TransformPoint(point * height); prop.transform.localPosition = go.transform.TransformPoint(point * height);
var up = go.transform.InverseTransformPoint(prop.transform.position).normalized; var up = go.transform.InverseTransformPoint(prop.transform.position).normalized;
@ -131,7 +131,7 @@ namespace NewHorizons.Builder.Props
prop.SetActive(true); prop.SetActive(true);
} }
GameObject.Destroy(prefab); GameObject.Destroy(scatterPrefab);
} }
} }
} }