diff --git a/AvatarScale/HarmonyPatches.cs b/AvatarScale/HarmonyPatches.cs index d12b81a..1b61424 100644 --- a/AvatarScale/HarmonyPatches.cs +++ b/AvatarScale/HarmonyPatches.cs @@ -1,4 +1,5 @@ -using ABI_RC.Core.Player; +using ABI_RC.Core; +using ABI_RC.Core.Player; using HarmonyLib; namespace NAK.AvatarScaleMod.HarmonyPatches; @@ -6,12 +7,12 @@ namespace NAK.AvatarScaleMod.HarmonyPatches; class PlayerSetupPatches { [HarmonyPostfix] - [HarmonyPatch(typeof(PlayerSetup), nameof(PlayerSetup.SetupAvatarGeneral))] - static void Postfix_PlayerSetup_SetupAvatarGeneral(ref PlayerSetup __instance, ref float ____initialAvatarHeight) + [HarmonyPatch(typeof(PlayerSetup), nameof(PlayerSetup.SetupAvatar))] + static void Postfix_PlayerSetup_SetupAvatar(ref PlayerSetup __instance, ref float ____initialAvatarHeight) { if (!AvatarScaleMod.EntryEnabled.Value) return; - if (AvatarScaleMod.HiddenAvatarScale.Value > 0) + if (AvatarScaleMod.HiddenAvatarScale.Value > 0f) { __instance.changeAnimatorParam(AvatarScaleMod.ParameterName, AvatarScaleMod.HiddenAvatarScale.Value); return; @@ -23,10 +24,15 @@ class PlayerSetupPatches [HarmonyPrefix] [HarmonyPatch(typeof(PlayerSetup), nameof(PlayerSetup.ClearAvatar))] - static void Prefix_PlayerSetup_ClearAvatar(ref float ____avatarHeight) + static void Prefix_PlayerSetup_ClearAvatar(ref PlayerSetup __instance, ref float ____avatarHeight) { if (!AvatarScaleMod.EntryEnabled.Value) return; + if (!IsSupportedAvatar(__instance.animatorManager) && !AvatarScaleMod.EntryPersistAnyways.Value) + { + return; + } + AvatarScaleMod.HiddenAvatarScale.Value = CalculateParameterValue(____avatarHeight); } @@ -35,4 +41,16 @@ class PlayerSetupPatches float t = (lastAvatarHeight - AvatarScaleMod.MinimumHeight) / (AvatarScaleMod.MaximumHeight - AvatarScaleMod.MinimumHeight); return t; } + + public static bool IsSupportedAvatar(CVRAnimatorManager manager) + { + if (manager.animatorParameterFloatList.Contains(AvatarScaleMod.ParameterName) && manager._animator != null) + { + if (manager._advancedAvatarIndicesFloat.TryGetValue(AvatarScaleMod.ParameterName, out int index)) + { + return index < manager._advancedAvatarCacheFloat.Count; + } + } + return false; + } } \ No newline at end of file diff --git a/AvatarScale/Main.cs b/AvatarScale/Main.cs index 9e127b5..d6303c8 100644 --- a/AvatarScale/Main.cs +++ b/AvatarScale/Main.cs @@ -6,13 +6,16 @@ public class AvatarScaleMod : MelonMod { internal const string ParameterName = "AvatarScale"; internal const float MinimumHeight = 0.25f; - internal const float MaximumHeight = 2f; + internal const float MaximumHeight = 2.5f; public static readonly MelonPreferences_Category Category = MelonPreferences.CreateCategory(nameof(AvatarScaleMod)); public static readonly MelonPreferences_Entry EntryEnabled = - Category.CreateEntry("Enabled", true, description: "Should there be persistant avatar scaling? This only works properly on supported avatars."); + Category.CreateEntry("Enabled", true, description: "Should there be persistant avatar scaling? This only works properly across supported avatars."); + + public static readonly MelonPreferences_Entry EntryPersistAnyways = + Category.CreateEntry("Persist From Unsupported", true, description: "Should avatar scale persist even from unsupported avatars?"); public static readonly MelonPreferences_Entry HiddenAvatarScale = Category.CreateEntry("Last Avatar Scale", -1f, is_hidden: true);