diff --git a/AvatarScale/AvatarScaleGesture.cs b/AvatarScale/AvatarScaleGesture.cs index 378d3c6..52241e0 100644 --- a/AvatarScale/AvatarScaleGesture.cs +++ b/AvatarScale/AvatarScaleGesture.cs @@ -1,15 +1,22 @@ using UnityEngine; +using ABI_RC.Core.Savior; namespace NAK.AvatarScaleMod; public static class AvatarScaleGesture { + public static bool GestureEnabled; + public static bool RequireTriggers = true; public static float InitialModifier = 1f; public static float InitialTargetHeight = 1.8f; public static void OnScaleStart(float modifier, Transform transform1, Transform transform2) { // AvatarScaleMod.Logger.Msg("OnScaleStart!"); + if (!GestureEnabled) + return; + + // you can start the scale, but cant interact with it without holding triggers if (AvatarScaleManager.LocalAvatar != null) { @@ -22,6 +29,11 @@ public static class AvatarScaleGesture public static void OnScaleStay(float modifier, Transform transform1, Transform transform2) { // AvatarScaleMod.Logger.Msg("OnScaleStay!"); + if (!GestureEnabled) + return; + + if (RequireTriggers && !IsBothTriggersDown()) + return; if (AvatarScaleManager.LocalAvatar != null) { @@ -39,4 +51,9 @@ public static class AvatarScaleGesture { // AvatarScaleMod.Logger.Msg("OnScaleEnd!"); } + + public static bool IsBothTriggersDown() + { + return CVRInputManager.Instance.interactLeftValue > 0.75f && CVRInputManager.Instance.interactRightValue > 0.75f; + } } diff --git a/AvatarScale/AvatarScaleManager.cs b/AvatarScale/AvatarScaleManager.cs index af01c46..1ea95fb 100644 --- a/AvatarScale/AvatarScaleManager.cs +++ b/AvatarScale/AvatarScaleManager.cs @@ -1,4 +1,6 @@ using ABI.CCK.Components; +using NAK.AvatarScaleMod.ScaledComponents; +using System.Collections; using UnityEngine; using UnityEngine.Animations; @@ -19,8 +21,8 @@ public class AvatarScaleManager : MonoBehaviour typeof(ScaleConstraint), }; - public const float MinimumHeight = 0.25f; - public const float MaximumHeight = 2.5f; + public const float MinimumHeight = 0.1f; + public const float MaximumHeight = 10f; // Scalable Components private List _lights = new List(); @@ -104,6 +106,11 @@ public class AvatarScaleManager : MonoBehaviour LocalAvatar = null; } + private void OnDisable() + { + ResetAllToInitialScale(); + } + private void FindComponentsOfType(params System.Type[] types) { foreach (var type in types) @@ -206,4 +213,58 @@ public class AvatarScaleManager : MonoBehaviour scaledScaleConstraint.Component.scaleOffset = scaledScaleConstraint.InitialScaleOffset * ScaleFactor; } } + + private void ResetAllToInitialScale() + { + // quick n lazy for right now + transform.localScale = InitialScale; + + foreach (var scaledLight in _lights) + { + scaledLight.Component.range = scaledLight.InitialRange; + } + foreach (var scaledAudioSource in _audioSources) + { + scaledAudioSource.Component.minDistance = scaledAudioSource.InitialMinDistance; + scaledAudioSource.Component.maxDistance = scaledAudioSource.InitialMaxDistance; + } + foreach (var scaledParentConstraint in _parentConstraints) + { + scaledParentConstraint.Component.translationAtRest = scaledParentConstraint.InitialTranslationAtRest; + + for (int i = 0; i < scaledParentConstraint.InitialTranslationOffsets.Count; i++) + { + scaledParentConstraint.Component.translationOffsets[i] = scaledParentConstraint.InitialTranslationOffsets[i]; + } + } + foreach (var scaledPositionConstraint in _positionConstraints) + { + scaledPositionConstraint.Component.translationAtRest = scaledPositionConstraint.InitialTranslationAtRest; + scaledPositionConstraint.Component.translationOffset = scaledPositionConstraint.InitialTranslationOffset; + } + foreach (var scaledScaleConstraint in _scaleConstraints) + { + scaledScaleConstraint.Component.scaleAtRest = scaledScaleConstraint.InitialScaleAtRest; + scaledScaleConstraint.Component.scaleOffset = scaledScaleConstraint.InitialScaleOffset; + } + } + + // use for slow transition between avatars initial height & saved height>>>?????????????? + public IEnumerator SetTargetHeightOverTime(float newHeight, float duration) + { + float startTime = Time.time; + float startHeight = TargetHeight; + newHeight = Mathf.Clamp(newHeight, MinimumHeight, MaximumHeight); + + while (Time.time < startTime + duration) + { + float t = (Time.time - startTime) / duration; + TargetHeight = Mathf.Lerp(startHeight, newHeight, t); + UpdateScaleFactor(); + yield return null; + } + + TargetHeight = newHeight; + UpdateScaleFactor(); + } } \ No newline at end of file diff --git a/AvatarScale/HarmonyPatches.cs b/AvatarScale/HarmonyPatches.cs index 0cac1c3..53dd071 100644 --- a/AvatarScale/HarmonyPatches.cs +++ b/AvatarScale/HarmonyPatches.cs @@ -38,6 +38,7 @@ class GesturePlaneTestPatches name = "avatarScale", type = CVRGesture.GestureType.Hold, }; + // TODO: Expose these settings in-game and tune till they feel right gesture.steps.Add(new CVRGestureStep { firstGesture = CVRGestureStep.Gesture.Fist, diff --git a/AvatarScale/Main.cs b/AvatarScale/Main.cs index 2a6794b..5809205 100644 --- a/AvatarScale/Main.cs +++ b/AvatarScale/Main.cs @@ -13,11 +13,13 @@ public class AvatarScaleMod : MelonMod Category.CreateEntry("Enabled", true, description: "Toggle AvatarScaleMod entirely."); public static readonly MelonPreferences_Entry EntryUseScaleGesture = - Category.CreateEntry("Scale Gesture", true, description: "Use two fists to scale yourself easily."); + Category.CreateEntry("Scale Gesture", false, description: "Use two fists to scale yourself easily."); public override void OnInitializeMelon() { Logger = LoggerInstance; + + ModSettings.InitializeModSettings(); ApplyPatches(typeof(HarmonyPatches.PlayerSetupPatches)); ApplyPatches(typeof(HarmonyPatches.GesturePlaneTestPatches)); } diff --git a/AvatarScale/ModSettings.cs b/AvatarScale/ModSettings.cs new file mode 100644 index 0000000..155030f --- /dev/null +++ b/AvatarScale/ModSettings.cs @@ -0,0 +1,23 @@ +namespace NAK.AvatarScaleMod; + +// Another thing i stole from Kafe, this organizes stuff so much moreee +// Should I move the entries here too? +static class ModSettings +{ + public static void InitializeModSettings() + { + AvatarScaleMod.EntryEnabled.OnEntryValueChanged.Subscribe(OnEntryEnabledChanged); + AvatarScaleMod.EntryUseScaleGesture.OnEntryValueChanged.Subscribe(OnEntryUseScaleGestureChanged); + } + + static void OnEntryEnabledChanged(bool newValue, bool oldValue) + { + if (AvatarScaleManager.LocalAvatar != null) + AvatarScaleManager.LocalAvatar.enabled = newValue; + } + + static void OnEntryUseScaleGestureChanged(bool newValue, bool oldValue) + { + AvatarScaleGesture.GestureEnabled = newValue; + } +} \ No newline at end of file diff --git a/AvatarScale/Properties/AssemblyInfo.cs b/AvatarScale/Properties/AssemblyInfo.cs index 512339a..ba2b41c 100644 --- a/AvatarScale/Properties/AssemblyInfo.cs +++ b/AvatarScale/Properties/AssemblyInfo.cs @@ -20,6 +20,9 @@ using System.Reflection; [assembly: MelonGame("Alpha Blend Interactive", "ChilloutVR")] [assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] [assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)] +[assembly: MelonColor(255, 241, 200, 82)] +[assembly: MelonAuthorColor(255, 114, 17, 25)] +[assembly: HarmonyDontPatchAll] namespace NAK.AvatarScaleMod.Properties; internal static class AssemblyInfoParams diff --git a/AvatarScale/ScaledComponents.cs b/AvatarScale/ScaledComponents.cs index c490550..5b60fc8 100644 --- a/AvatarScale/ScaledComponents.cs +++ b/AvatarScale/ScaledComponents.cs @@ -1,7 +1,7 @@ using UnityEngine; using UnityEngine.Animations; -namespace NAK.AvatarScaleMod; +namespace NAK.AvatarScaleMod.ScaledComponents; public class ScaledAudioSource {