diff --git a/NAK_CVR_Mods.sln b/NAK_CVR_Mods.sln index 6a9a721..754d011 100644 --- a/NAK_CVR_Mods.sln +++ b/NAK_CVR_Mods.sln @@ -31,6 +31,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzCurls", "EzCurls\EzCurls. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhysicsGunMod", "PhysicsGunMod\PhysicsGunMod.csproj", "{F94DDB73-9041-4F5C-AD43-6960701E8417}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MirrorClone", "MirrorClone\MirrorClone.csproj", "{D5E81123-9D3B-4420-9CCD-1861657BE00B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BetterShadowClone", "BetterShadowClone\BetterShadowClone.csproj", "{D0C40987-AF16-490A-9304-F99D5A5A774C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -93,6 +97,14 @@ Global {F94DDB73-9041-4F5C-AD43-6960701E8417}.Debug|Any CPU.Build.0 = Debug|Any CPU {F94DDB73-9041-4F5C-AD43-6960701E8417}.Release|Any CPU.ActiveCfg = Release|Any CPU {F94DDB73-9041-4F5C-AD43-6960701E8417}.Release|Any CPU.Build.0 = Release|Any CPU + {D5E81123-9D3B-4420-9CCD-1861657BE00B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5E81123-9D3B-4420-9CCD-1861657BE00B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5E81123-9D3B-4420-9CCD-1861657BE00B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5E81123-9D3B-4420-9CCD-1861657BE00B}.Release|Any CPU.Build.0 = Release|Any CPU + {D0C40987-AF16-490A-9304-F99D5A5A774C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D0C40987-AF16-490A-9304-F99D5A5A774C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0C40987-AF16-490A-9304-F99D5A5A774C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D0C40987-AF16-490A-9304-F99D5A5A774C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ThirdPerson/CameraLogic.cs b/ThirdPerson/CameraLogic.cs index fe0cefe..27d4dcf 100644 --- a/ThirdPerson/CameraLogic.cs +++ b/ThirdPerson/CameraLogic.cs @@ -12,7 +12,8 @@ internal static class CameraLogic { private static float _dist; private static float _scale = 1f; - private static Camera _thirdpersonCam; + private static Camera _thirdPersonCam; + private static Camera _uiCam; private static Camera _desktopCam; private static int _storedCamMask; private static CameraFovClone _cameraFovClone; @@ -36,38 +37,40 @@ internal static class CameraLogic _state = !CheckIsRestricted() && value; if (_state) _storedCamMask = _desktopCam.cullingMask; _desktopCam.cullingMask = _state ? 0 : _storedCamMask; - _thirdpersonCam.gameObject.SetActive(_state); + _uiCam.cullingMask = _state ? _uiCam.cullingMask & ~(1 << CVRLayers.PlayerClone) : _uiCam.cullingMask | (1 << CVRLayers.PlayerClone); + _thirdPersonCam.gameObject.SetActive(_state); } } internal static IEnumerator SetupCamera() { yield return new WaitUntil(() => PlayerSetup.Instance); - - _thirdpersonCam = new GameObject("ThirdPersonCameraObj", typeof(Camera)).GetComponent(); - - _cameraFovClone = _thirdpersonCam.gameObject.AddComponent(); + + _thirdPersonCam = new GameObject("ThirdPersonCameraObj", typeof(Camera)).GetComponent(); + + _cameraFovClone = _thirdPersonCam.gameObject.AddComponent(); _desktopCam = PlayerSetup.Instance.desktopCamera.GetComponent(); _cameraFovClone.targetCamera = _desktopCam; - _thirdpersonCam.transform.SetParent(_desktopCam.transform); + _thirdPersonCam.transform.SetParent(_desktopCam.transform); + _uiCam = _desktopCam.transform.Find("_UICamera").GetComponent(); RelocateCam(CameraLocation.Default); - _thirdpersonCam.gameObject.SetActive(false); - + _thirdPersonCam.gameObject.SetActive(false); + ThirdPerson.Logger.Msg("Finished setting up third person camera."); } internal static void CopyPlayerCamValues() { Camera activePlayerCam = PlayerSetup.Instance.GetActiveCamera().GetComponent(); - if (_thirdpersonCam == null || activePlayerCam == null) + if (_thirdPersonCam == null || activePlayerCam == null) return; ThirdPerson.Logger.Msg("Copying active camera settings & components."); - CVRTools.CopyToDestCam(activePlayerCam, _thirdpersonCam); + CVRTools.CopyToDestCam(activePlayerCam, _thirdPersonCam); if (!CheckIsRestricted()) return; @@ -78,7 +81,7 @@ internal static class CameraLogic internal static void RelocateCam(CameraLocation location, bool resetDist = false) { - Transform thirdPersonCam = _thirdpersonCam.transform; + Transform thirdPersonCam = _thirdPersonCam.transform; thirdPersonCam.rotation = _desktopCam.transform.rotation; if (resetDist) ResetDist(); switch (location) @@ -106,12 +109,19 @@ internal static class CameraLogic break; } } - - + private static void ResetDist() => _dist = 0; internal static void ScrollDist(float sign) { _dist += sign * 0.25f; RelocateCam(CurrentLocation); } internal static void AdjustScale(float height) { _scale = height; RelocateCam(CurrentLocation); } internal static void CheckVRMode() { if (MetaPort.Instance.isUsingVr) State = false; } private static bool CheckIsRestricted() => !CVRWorld.Instance.enableZoom; + + internal static bool ShouldNotHideHead_ThirdPerson(Camera cam) + { + if (cam != _desktopCam) + return true; // we dont care + + return !State; + } } \ No newline at end of file diff --git a/ThirdPerson/Integrations/BSCAddon.cs b/ThirdPerson/Integrations/BSCAddon.cs new file mode 100644 index 0000000..65306af --- /dev/null +++ b/ThirdPerson/Integrations/BSCAddon.cs @@ -0,0 +1,11 @@ +using NAK.BetterShadowClone; + +namespace NAK.ThirdPerson.Integrations; + +public static class BSCAddon +{ + public static void Initialize() + { + ShadowCloneMod.wantsToHideHead += CameraLogic.ShouldNotHideHead_ThirdPerson; + } +} \ No newline at end of file diff --git a/ThirdPerson/Properties/AssemblyInfo.cs b/ThirdPerson/Properties/AssemblyInfo.cs index f209ac4..4fa680e 100644 --- a/ThirdPerson/Properties/AssemblyInfo.cs +++ b/ThirdPerson/Properties/AssemblyInfo.cs @@ -1,6 +1,7 @@ using MelonLoader; using NAK.ThirdPerson.Properties; using System.Reflection; +using CurvedUI; [assembly: AssemblyVersion(AssemblyInfoParams.Version)] [assembly: AssemblyFileVersion(AssemblyInfoParams.Version)] @@ -23,6 +24,7 @@ using System.Reflection; [assembly: MelonColor(255, 246, 25, 97)] [assembly: MelonAuthorColor(255, 158, 21, 32)] [assembly: HarmonyDontPatchAll] +[assembly: MelonOptionalDependencies("BetterShadowClone")] namespace NAK.ThirdPerson.Properties; internal static class AssemblyInfoParams diff --git a/ThirdPerson/ThirdPerson.cs b/ThirdPerson/ThirdPerson.cs index 428c5ab..0017c44 100644 --- a/ThirdPerson/ThirdPerson.cs +++ b/ThirdPerson/ThirdPerson.cs @@ -11,11 +11,22 @@ public class ThirdPerson : MelonMod public override void OnInitializeMelon() { Logger = LoggerInstance; - + Patches.Apply(HarmonyInstance); MelonCoroutines.Start(SetupCamera()); + + InitializeIntegration("BetterShadowClone", Integrations.BSCAddon.Initialize); } + + private static void InitializeIntegration(string modName, Action integrationAction) + { + if (RegisteredMelons.All(it => it.Info.Name != modName)) + return; + Logger.Msg($"Initializing {modName} integration."); + integrationAction.Invoke(); + } + public override void OnUpdate() { // Prevents scrolling while using Effector/BetterInteractDesktop diff --git a/ThirdPerson/ThirdPerson.csproj b/ThirdPerson/ThirdPerson.csproj index 13a6b34..9cb91de 100644 --- a/ThirdPerson/ThirdPerson.csproj +++ b/ThirdPerson/ThirdPerson.csproj @@ -1,2 +1,6 @@  - + + + + +