diff --git a/SiraUtil.Suite/Tests/Sabers/TestSaberModelController.cs b/SiraUtil.Suite/Tests/Sabers/TestSaberModelController.cs index 75f86a5..fdb9722 100644 --- a/SiraUtil.Suite/Tests/Sabers/TestSaberModelController.cs +++ b/SiraUtil.Suite/Tests/Sabers/TestSaberModelController.cs @@ -1,20 +1,23 @@ using SiraUtil.Interfaces; using UnityEngine; +using Zenject; namespace SiraUtil.Suite.Tests.Sabers { - internal class TestSaberModelController : SaberModelController, IColorable + internal class TestSaberModelController : SaberModelController, IColorable, IPreSaberModelInit { public Color Color { get; set; } - public override void Init(Transform parent, Saber saber) + [Inject] + private readonly ColorManager _colorManager = null!; + + public void PreInit(Transform parent, Saber saber) { Color = _colorManager.ColorForSaberType(saber.saberType); GameObject g = GameObject.CreatePrimitive(PrimitiveType.Sphere); g.transform.localScale *= 0.1f; g.transform.SetParent(transform); g.transform.localPosition = new Vector3(0f, 0f, 1f); - base.Init(parent, saber); } } } \ No newline at end of file diff --git a/SiraUtil/Installers/SiraInitializationInstaller.cs b/SiraUtil/Installers/SiraInitializationInstaller.cs index a040843..1cbc5be 100644 --- a/SiraUtil/Installers/SiraInitializationInstaller.cs +++ b/SiraUtil/Installers/SiraInitializationInstaller.cs @@ -32,6 +32,7 @@ public SiraInitializationInstaller(Zenjector siraUtil, ZenjectManager zenjectMan public override void InstallBindings() { Container.BindInterfacesTo().AsSingle(); + Container.BindInterfacesTo().AsSingle(); // Install all UBinders foreach (var zenjector in _zenjectManager.ActiveZenjectors) diff --git a/SiraUtil/Interfaces/IPostSaberModelInit.cs b/SiraUtil/Interfaces/IPostSaberModelInit.cs new file mode 100644 index 0000000..b621c41 --- /dev/null +++ b/SiraUtil/Interfaces/IPostSaberModelInit.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +namespace SiraUtil.Interfaces +{ + /// + /// Defines for something to be run after a saber model initializes. + /// + public interface IPostSaberModelInit + { + /// + /// Runs after model initialization. + /// + /// The parent of the saber model. + /// The saber component associated with the current model. + void PostInit(Transform parent, Saber saber); + } +} \ No newline at end of file diff --git a/SiraUtil/Interfaces/IPreSaberModelInit.cs b/SiraUtil/Interfaces/IPreSaberModelInit.cs new file mode 100644 index 0000000..0059ad1 --- /dev/null +++ b/SiraUtil/Interfaces/IPreSaberModelInit.cs @@ -0,0 +1,18 @@ +using UnityEngine; + +namespace SiraUtil.Interfaces +{ + /// + /// Defines for something to be run before a saber model initializes. + /// + public interface IPreSaberModelInit + { + /// + /// Runs before model initialization. + /// + /// The parent of the saber model. + /// The saber component associated with the current model. + /// Do you want the original Init to run? + bool PreInit(Transform parent, Saber saber); + } +} \ No newline at end of file diff --git a/SiraUtil/Sabers/Effects/SiraSaberClashChecker.cs b/SiraUtil/Sabers/Effects/SiraSaberClashChecker.cs index 3b5bf59..ee04c7d 100644 --- a/SiraUtil/Sabers/Effects/SiraSaberClashChecker.cs +++ b/SiraUtil/Sabers/Effects/SiraSaberClashChecker.cs @@ -6,11 +6,19 @@ namespace SiraUtil.Sabers.Effects { - internal class SiraSaberClashChecker : SaberClashChecker + internal interface ISiraClashChecker + { + event Action? NewSabersClashed; + + bool ExtraSabersDetected { get; } + + bool AreSabersClashing(ref bool sabersAreClashing, ref Vector3 localClashingPoint, ref int prevGetFrameNum, out Vector3 clashingPoint); + } + + internal class SiraSaberClashChecker : SaberClashChecker, ISiraClashChecker { private Saber? _lastSaberA; private Saber? _lastSaberB; - private bool _extraSabersDetected; private readonly HashSet _sabers = new(); public event Action? NewSabersClashed; @@ -18,6 +26,8 @@ internal class SiraSaberClashChecker : SaberClashChecker protected readonly SaberManager _saberManager; protected readonly SiraSaberFactory _siraSaberFactory; + public bool ExtraSabersDetected { get; private set; } + public SiraSaberClashChecker(DiContainer container, SaberManager saberManager, SiraSaberFactory siraSaberFactory) { _container = container; @@ -30,7 +40,7 @@ public SiraSaberClashChecker(DiContainer container, SaberManager saberManager, S private void SiraSaberFactory_SaberCreated(SiraSaber siraSaber) { - _extraSabersDetected = true; + ExtraSabersDetected = true; _sabers.Add(siraSaber.Saber); } @@ -39,28 +49,19 @@ private void SiraSaberFactory_SaberCreated(SiraSaber siraSaber) _siraSaberFactory.SaberCreated -= SiraSaberFactory_SaberCreated; } - /// - /// Checks if any of the registered sabers are clashing. - /// - /// The point that the sabers are clashing at. - /// Are any sabers clashing? - public override bool AreSabersClashing(out Vector3 clashingPoint) + public bool AreSabersClashing(ref bool sabersAreClashing, ref Vector3 localClashingPoint, ref int prevGetFrameNum, out Vector3 clashingPoint) { - if (!_extraSabersDetected) - { - return base.AreSabersClashing(out clashingPoint); - } if (_leftSaber.movementData.lastAddedData.time < 0.1f) { - clashingPoint = _clashingPoint; + clashingPoint = localClashingPoint; return false; } - if (_prevGetFrameNum == Time.frameCount) + if (prevGetFrameNum == Time.frameCount) { - clashingPoint = _clashingPoint; - return _sabersAreClashing; + clashingPoint = localClashingPoint; + return sabersAreClashing; } - _prevGetFrameNum = Time.frameCount; + prevGetFrameNum = Time.frameCount; for (int i = 0; i < _sabers.Count; i++) { for (int h = 0; h < _sabers.Count; h++) @@ -86,22 +87,22 @@ public override bool AreSabersClashing(out Vector3 clashingPoint) _lastSaberB = saberB; NewSabersClashed?.Invoke(_lastSaberA, _lastSaberB); } - _clashingPoint = clashingPoint2; - clashingPoint = _clashingPoint; - _sabersAreClashing = true; - return _sabersAreClashing; + localClashingPoint = clashingPoint2; + clashingPoint = localClashingPoint; + sabersAreClashing = true; + return sabersAreClashing; } else { _lastSaberA = null; _lastSaberB = null; - _sabersAreClashing = false; + sabersAreClashing = false; } } } } - clashingPoint = _clashingPoint; - return _sabersAreClashing; + clashingPoint = localClashingPoint; + return sabersAreClashing; } } } \ No newline at end of file diff --git a/SiraUtil/Sabers/Effects/SiraSaberClashCheckerPatch.cs b/SiraUtil/Sabers/Effects/SiraSaberClashCheckerPatch.cs index 40fe0f8..79af0fe 100644 --- a/SiraUtil/Sabers/Effects/SiraSaberClashCheckerPatch.cs +++ b/SiraUtil/Sabers/Effects/SiraSaberClashCheckerPatch.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Reflection; using System.Reflection.Emit; +using UnityEngine; using Zenject; namespace SiraUtil.Sabers.Effects @@ -39,6 +40,22 @@ public static IEnumerable Upgrade(IEnumerable } + [HarmonyPatch(typeof(SaberClashChecker), nameof(SaberClashChecker.AreSabersClashing))] + private class DefaultOverride + { + [HarmonyPrefix] + public static bool OverrideDefault(ref SaberClashChecker __instance, ref bool ____sabersAreClashing, ref Vector3 ____clashingPoint, ref int ____prevGetFrameNum, ref bool __result, out Vector3 clashingPoint) + { + if (__instance is not ISiraClashChecker customClashChecker || !customClashChecker.ExtraSabersDetected) + { + clashingPoint = Vector3.zero; + return true; + } + __result = customClashChecker.AreSabersClashing(ref ____sabersAreClashing, ref ____clashingPoint, ref ____prevGetFrameNum, out clashingPoint); + return false; + } + } + internal static void Upgrade(ref List codes) { for (int i = 0; i < codes.Count; i++) diff --git a/SiraUtil/Sabers/SaberModelProvider.cs b/SiraUtil/Sabers/SaberModelProvider.cs index 0e20d5e..fc6841f 100644 --- a/SiraUtil/Sabers/SaberModelProvider.cs +++ b/SiraUtil/Sabers/SaberModelProvider.cs @@ -1,6 +1,7 @@ using IPA.Utilities; using SiraUtil.Affinity; using SiraUtil.Extras; +using SiraUtil.Interfaces; using SiraUtil.Logging; using System; using System.Collections.Generic; @@ -168,5 +169,28 @@ private void DefaultSaberPrefabSwap(ref SaberModelContainer __instance, ref Sabe ____saberModelControllerPrefab = NewModel(____saber.saberType); } + + [AffinityPrefix] + [AffinityPatch(typeof(SaberModelController), nameof(SaberModelController.Init))] + private bool PreInit(ref SaberModelController __instance, Transform parent, Saber saber) + { + var runner = __instance.GetComponent(); + if (runner == null) + return true; + + return runner.PreInit(parent, saber); + } + + + [AffinityPostfix] + [AffinityPatch(typeof(SaberModelController), nameof(SaberModelController.Init))] + private void PostInit(ref SaberModelController __instance, Transform parent, Saber saber) + { + var runner = __instance.GetComponent(); + if (runner == null) + return; + + runner.PostInit(parent, saber); + } } } \ No newline at end of file diff --git a/SiraUtil/SiraUtil.csproj b/SiraUtil/SiraUtil.csproj index d78d764..c9e890d 100644 --- a/SiraUtil/SiraUtil.csproj +++ b/SiraUtil/SiraUtil.csproj @@ -13,6 +13,7 @@ SiraUtil SiraUtil false + BSIPA false @@ -92,18 +93,22 @@ $(BeatSaberDir)\Beat Saber_Data\Managed\Rendering.dll False - - $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.dll - False - $(BeatSaberDir)\Beat Saber_Data\Managed\Unity.TextMeshPro.dll False + + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.dll + False + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.AudioModule.dll False + + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.CoreModule.dll + False + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.InputLegacyModule.dll False @@ -112,14 +117,14 @@ $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.ParticleSystemModule.dll False + + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.SpatialTracking.dll + False + $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.UI.dll False - - $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.CoreModule.dll - False - $(BeatSaberDir)\Beat Saber_Data\Managed\UnityEngine.UIElementsModule.dll False @@ -142,6 +147,7 @@ $(BeatSaberDir)\Beat Saber_Data\Managed\Main.dll + True False @@ -162,6 +168,7 @@ $(BeatSaberDir)\Beat Saber_Data\Managed\VRUI.dll + True False @@ -184,23 +191,20 @@ - - - + + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + \ No newline at end of file diff --git a/SiraUtil/Tools/FPFC/FPFCToggle.cs b/SiraUtil/Tools/FPFC/FPFCToggle.cs index 1478049..aba83d1 100644 --- a/SiraUtil/Tools/FPFC/FPFCToggle.cs +++ b/SiraUtil/Tools/FPFC/FPFCToggle.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using UnityEngine; using UnityEngine.EventSystems; +using UnityEngine.SpatialTracking; using UnityEngine.XR; using VRUIControls; using Zenject; @@ -119,8 +120,8 @@ private void EnableFPFC() _menuControllerAccessor.RightController.enabled = false; } - if (_vrInputModule != null) - _vrInputModule.useMouseForPressInput = true; + //if (_vrInputModule != null) + // _vrInputModule.useMouseForPressInput = true; if (_didFirstFocus) { @@ -128,6 +129,13 @@ private void EnableFPFC() Cursor.visible = false; } + if (_mainCamera != null) + { + var poseDriver = _mainCamera.GetComponent(); + if (poseDriver != null) + poseDriver.enabled = false; + } + foreach (var listener in _fpfcListeners) listener.Enabled(); } @@ -145,8 +153,8 @@ private void DisableFPFC() _menuControllerAccessor.RightController.enabled = true; } - if (_vrInputModule != null) - _vrInputModule.useMouseForPressInput = false; + //if (_vrInputModule != null) + // _vrInputModule.useMouseForPressInput = false; _simpleCameraController.AllowInput = false; @@ -163,6 +171,13 @@ private void DisableFPFC() } } + if (_mainCamera != null) + { + var poseDriver = _mainCamera.GetComponent(); + if (poseDriver != null) + poseDriver.enabled = true; + } + Cursor.lockState = CursorLockMode.None; Cursor.visible = true; diff --git a/SiraUtil/Tools/FPFC/InputSpoofFPFCListener.cs b/SiraUtil/Tools/FPFC/InputSpoofFPFCListener.cs new file mode 100644 index 0000000..06389c1 --- /dev/null +++ b/SiraUtil/Tools/FPFC/InputSpoofFPFCListener.cs @@ -0,0 +1,36 @@ +using SiraUtil.Affinity; + +namespace SiraUtil.Tools.FPFC +{ + internal class InputSpoofFPFCListener : IFPFCListener, IAffinity + { + private bool _active; + private readonly DevicelessVRHelper _devicelessVRHelper = new(); + + public void Enabled() + { + _active = true; + } + + public void Disabled() + { + _active = false; + } + + [AffinityPrefix] + [AffinityPatch(typeof(UnityXRHelper), nameof(IVRPlatformHelper.GetTriggerValue))] + protected bool GetTriggerValueOverridePatch(ref float __result) + { + __result = _devicelessVRHelper.GetTriggerValue(default); + return !_active; + } + + [AffinityPrefix] + [AffinityPatch(typeof(OculusVRHelper), nameof(IVRPlatformHelper.GetTriggerValue))] + protected bool GetOculusTriggerValueOverridePatch(ref float __result) + { + __result = _devicelessVRHelper.GetTriggerValue(default); + return !_active; + } + } +} \ No newline at end of file diff --git a/SiraUtil/Tools/FPFC/MenuFPFCListener.cs b/SiraUtil/Tools/FPFC/MenuFPFCListener.cs index 58d3969..4ce60b0 100644 --- a/SiraUtil/Tools/FPFC/MenuFPFCListener.cs +++ b/SiraUtil/Tools/FPFC/MenuFPFCListener.cs @@ -8,8 +8,11 @@ internal class MenuFPFCListener : IFPFCListener private readonly IMenuControllerAccessor _menuControllerAccessor; private const string HandleName = "MenuHandle"; - private bool _rightDefaultState; - private bool _leftDefaultState; + //private bool _rightDefaultState; + //private bool _leftDefaultState; + + private Pose _leftDefaultPose; + private Pose _rightDefaultPose; public MenuFPFCListener(IMenuControllerAccessor menuControllerAccessor) { @@ -21,11 +24,17 @@ public void Enabled() Transform leftHandle = _menuControllerAccessor.LeftController.transform.Find(HandleName); Transform rightHandle = _menuControllerAccessor.RightController.transform.Find(HandleName); - _leftDefaultState = leftHandle.gameObject.activeSelf; - _rightDefaultState = rightHandle.gameObject.activeSelf; + //_leftDefaultState = leftHandle.gameObject.activeSelf; + //_rightDefaultState = rightHandle.gameObject.activeSelf; + + _leftDefaultPose = new Pose(leftHandle.localPosition, leftHandle.localRotation); + _rightDefaultPose = new Pose(rightHandle.localPosition, rightHandle.localRotation); - leftHandle.gameObject.SetActive(false); - rightHandle.gameObject.SetActive(false); + leftHandle.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); + rightHandle.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); + + //leftHandle.gameObject.SetActive(false); + //rightHandle.gameObject.SetActive(false); } public void Disabled() @@ -33,8 +42,11 @@ public void Disabled() Transform leftHandle = _menuControllerAccessor.LeftController.transform.Find(HandleName); Transform rightHandle = _menuControllerAccessor.RightController.transform.Find(HandleName); - leftHandle.gameObject.SetActive(_leftDefaultState); - rightHandle.gameObject.SetActive(_rightDefaultState); + leftHandle.SetLocalPositionAndRotation(_leftDefaultPose.position, _leftDefaultPose.rotation); + rightHandle.SetLocalPositionAndRotation(_rightDefaultPose.position, _rightDefaultPose.rotation); + + //leftHandle.gameObject.SetActive(_leftDefaultState); + //rightHandle.gameObject.SetActive(_rightDefaultState); } } } \ No newline at end of file diff --git a/SiraUtil/Web/Implementations/UWRHttpService.cs b/SiraUtil/Web/Implementations/UWRHttpService.cs index fa9740d..c3b2d21 100644 --- a/SiraUtil/Web/Implementations/UWRHttpService.cs +++ b/SiraUtil/Web/Implementations/UWRHttpService.cs @@ -140,7 +140,7 @@ public async Task SendRawAsync(HTTPMethod method, string url, byt await Task.Delay(10); } downloadProgress?.Report(1f); - bool successful = request.isDone && !request.isHttpError && !request.isNetworkError; + bool successful = request.isDone && request.result == UnityWebRequest.Result.Success; return new UnityWebRequestHttpResponse(request, successful); }); return response; diff --git a/SiraUtil/Web/Implementations/UnityWebRequestHttpResponse.cs b/SiraUtil/Web/Implementations/UnityWebRequestHttpResponse.cs index 7ce4845..ed024e2 100644 --- a/SiraUtil/Web/Implementations/UnityWebRequestHttpResponse.cs +++ b/SiraUtil/Web/Implementations/UnityWebRequestHttpResponse.cs @@ -33,7 +33,7 @@ public UnityWebRequestHttpResponse(UnityWebRequest unityWebRequest, bool success try { - return JsonConvert.DeserializeObject(body).Error; + return JsonConvert.DeserializeObject(body)!.Error; } catch { diff --git a/SiraUtil/Web/SiraSync/Implementations/GitHubSiraSyncService.cs b/SiraUtil/Web/SiraSync/Implementations/GitHubSiraSyncService.cs index b7765c7..6fb5b4b 100644 --- a/SiraUtil/Web/SiraSync/Implementations/GitHubSiraSyncService.cs +++ b/SiraUtil/Web/SiraSync/Implementations/GitHubSiraSyncService.cs @@ -64,7 +64,7 @@ internal void Set(string repoOwner, string repoName) Release[] releases; try { - releases = JsonConvert.DeserializeObject(await response.ReadAsStringAsync()); + releases = JsonConvert.DeserializeObject(await response.ReadAsStringAsync())!; } catch (Exception e) { diff --git a/SiraUtil/Zenject/Internal/Instructors/InstructorManager.cs b/SiraUtil/Zenject/Internal/Instructors/InstructorManager.cs index 5504c6f..d6b0e4c 100644 --- a/SiraUtil/Zenject/Internal/Instructors/InstructorManager.cs +++ b/SiraUtil/Zenject/Internal/Instructors/InstructorManager.cs @@ -7,7 +7,7 @@ internal class InstructorManager { private readonly IInstructor _monoInstructor = new MonoInstructor(); private readonly IInstructor _typedInstructor = new TypedInstructor(); - private readonly IInstructor _parameterizedInstructor = new ParamertizedInstructor(); + private readonly IInstructor _parameterizedInstructor = new ParameterizedInstructor(); public IInstructor? InstructorForSet(InstallSet installSet) { diff --git a/SiraUtil/Zenject/Internal/Instructors/ParamertizedInstructor.cs b/SiraUtil/Zenject/Internal/Instructors/ParamertizedInstructor.cs index 8e6fb8c..303b8b0 100644 --- a/SiraUtil/Zenject/Internal/Instructors/ParamertizedInstructor.cs +++ b/SiraUtil/Zenject/Internal/Instructors/ParamertizedInstructor.cs @@ -4,7 +4,7 @@ namespace SiraUtil.Zenject.Internal.Instructors { - internal class ParamertizedInstructor : IInstructor + internal class ParameterizedInstructor : IInstructor { public void Install(InstallSet installSet, ContextBinding contextBinding) { diff --git a/SiraUtil/manifest.json b/SiraUtil/manifest.json index 3f20f61..9fb843c 100644 --- a/SiraUtil/manifest.json +++ b/SiraUtil/manifest.json @@ -3,12 +3,12 @@ "id": "SiraUtil", "name": "SiraUtil", "author": "Auros", - "version": "3.1.2", + "version": "3.1.3-dev.3", "icon": "SiraUtil.Resources.logo.png", "description": "A powerful utility mod which expands the capabilities and provides more tools to Beat Saber modders.", - "gameVersion": "1.24.0", + "gameVersion": "1.29.4", "dependsOn": { - "BSIPA": "^4.2.1" + "BSIPA": "^4.3.0" }, "links": { "donate": "https://ko-fi.com/auros",