mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Fix collision issue
This commit is contained in:
parent
8f4993a1ac
commit
7bcddf4261
@ -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,26 +292,20 @@ 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
|
|
||||||
Delay.RunWhen(() => Main.IsSystemReady, () =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (component == null) return;
|
|
||||||
if (component is Animator animator) animator.enabled = true;
|
|
||||||
else if (component is Collider collider) collider.enabled = true;
|
|
||||||
else if (component is Renderer renderer) renderer.enabled = true;
|
|
||||||
else if (component is Shape shape) shape.enabled = true;
|
|
||||||
else if (component is SectorCullGroup sectorCullGroup)
|
|
||||||
{
|
|
||||||
sectorCullGroup._inMapView = false;
|
|
||||||
sectorCullGroup._isFastForwarding = false;
|
|
||||||
sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false);
|
|
||||||
}
|
}
|
||||||
// If it's not a moving anglerfish make sure the anim controller is regular
|
|
||||||
else if (component is AnglerfishAnimController angler && angler.GetComponentInParent<AnglerfishController>() == null)
|
/// <summary>
|
||||||
|
/// 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()
|
||||||
|
{
|
||||||
|
[typeof(AnglerfishAnimController)] = (x) =>
|
||||||
|
{
|
||||||
|
var angler = x as AnglerfishAnimController;
|
||||||
|
|
||||||
Logger.LogVerbose("Enabling anglerfish animation");
|
Logger.LogVerbose("Enabling anglerfish animation");
|
||||||
// Remove any reference to its angler
|
// Remove any reference to its angler
|
||||||
if (angler._anglerfishController)
|
if (angler._anglerfishController)
|
||||||
@ -308,13 +317,50 @@ namespace NewHorizons.Builder.Props
|
|||||||
}
|
}
|
||||||
angler.enabled = true;
|
angler.enabled = true;
|
||||||
angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking);
|
angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking);
|
||||||
}
|
},
|
||||||
}
|
[typeof(SectorCullGroup)] = (x) =>
|
||||||
catch (Exception e)
|
|
||||||
{
|
{
|
||||||
Logger.LogWarning($"Exception when modifying component [{component.GetType().Name}] on [{planetGO.name}] for prop [{prefab}]:\n{e}");
|
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
|
||||||
|
{
|
||||||
|
if (component != null)
|
||||||
|
{
|
||||||
|
var key = fixes.Keys.FirstOrDefault(x => x.IsAssignableFrom(component.GetType()));
|
||||||
|
var fix = fixes[key];
|
||||||
|
fix(component);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
Logger.LogWarning($"Failed to fix component {component} on {gameObject.name}");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user