[AvatarScaleMod] Implement actual avatar scaling as test.

fuckin 30 minutes proof of concept
This commit is contained in:
NotAKidoS 2023-06-22 21:47:50 -05:00
parent 3d8f392f1d
commit 44d5c7762b
3 changed files with 44 additions and 19 deletions

View file

@ -1,11 +1,11 @@
using ABI_RC.Core; using ABI_RC.Core.Player;
using ABI_RC.Core.Player;
using HarmonyLib; using HarmonyLib;
namespace NAK.AvatarScaleMod.HarmonyPatches; namespace NAK.AvatarScaleMod.HarmonyPatches;
class PlayerSetupPatches class PlayerSetupPatches
{ {
/**
[HarmonyPostfix] [HarmonyPostfix]
[HarmonyPatch(typeof(PlayerSetup), nameof(PlayerSetup.SetupAvatar))] [HarmonyPatch(typeof(PlayerSetup), nameof(PlayerSetup.SetupAvatar))]
static void Postfix_PlayerSetup_SetupAvatar(ref PlayerSetup __instance, ref float ____initialAvatarHeight) static void Postfix_PlayerSetup_SetupAvatar(ref PlayerSetup __instance, ref float ____initialAvatarHeight)
@ -19,7 +19,7 @@ class PlayerSetupPatches
} }
// User has cleared MelonPrefs, store a default value. // User has cleared MelonPrefs, store a default value.
AvatarScaleMod.HiddenAvatarScale.Value = CalculateParameterValue(____initialAvatarHeight); AvatarScaleMod.HiddenAvatarScale.Value = Utils.CalculateParameterValue(____initialAvatarHeight);
} }
[HarmonyPrefix] [HarmonyPrefix]
@ -28,29 +28,27 @@ class PlayerSetupPatches
{ {
if (!AvatarScaleMod.EntryEnabled.Value) return; if (!AvatarScaleMod.EntryEnabled.Value) return;
if (!IsSupportedAvatar(__instance.animatorManager) && !AvatarScaleMod.EntryPersistAnyways.Value) if (!Utils.IsSupportedAvatar(__instance.animatorManager) && !AvatarScaleMod.EntryPersistAnyways.Value)
{ {
return; return;
} }
AvatarScaleMod.HiddenAvatarScale.Value = CalculateParameterValue(____avatarHeight); AvatarScaleMod.HiddenAvatarScale.Value = Utils.CalculateParameterValue(____avatarHeight);
} }
**/
public static float CalculateParameterValue(float lastAvatarHeight) [HarmonyPostfix]
[HarmonyPatch(typeof(PlayerSetup), nameof(PlayerSetup.SetupAvatar))]
static void Postfix_PlayerSetup_SetupAvatar(ref PlayerSetup __instance)
{ {
float t = (lastAvatarHeight - AvatarScaleMod.MinimumHeight) / (AvatarScaleMod.MaximumHeight - AvatarScaleMod.MinimumHeight); try
return t; {
__instance._avatar.AddComponent<AvatarScaleManager>().Initialize(__instance._initialAvatarHeight, __instance.initialScale);
} }
catch (Exception e)
public static bool IsSupportedAvatar(CVRAnimatorManager manager)
{ {
if (manager.animatorParameterFloatList.Contains(AvatarScaleMod.ParameterName) && manager._animator != null) AvatarScaleMod.Logger.Error($"Error during the patched method {nameof(Postfix_PlayerSetup_SetupAvatar)}");
{ AvatarScaleMod.Logger.Error(e);
if (manager._advancedAvatarIndicesFloat.TryGetValue(AvatarScaleMod.ParameterName, out int index))
{
return index < manager._advancedAvatarCacheFloat.Count;
} }
} }
return false;
}
} }

View file

@ -8,6 +8,8 @@ public class AvatarScaleMod : MelonMod
internal const float MinimumHeight = 0.25f; internal const float MinimumHeight = 0.25f;
internal const float MaximumHeight = 2.5f; internal const float MaximumHeight = 2.5f;
internal static MelonLogger.Instance Logger;
public static readonly MelonPreferences_Category Category = public static readonly MelonPreferences_Category Category =
MelonPreferences.CreateCategory(nameof(AvatarScaleMod)); MelonPreferences.CreateCategory(nameof(AvatarScaleMod));
@ -22,6 +24,7 @@ public class AvatarScaleMod : MelonMod
public override void OnInitializeMelon() public override void OnInitializeMelon()
{ {
Logger = LoggerInstance;
ApplyPatches(typeof(HarmonyPatches.PlayerSetupPatches)); ApplyPatches(typeof(HarmonyPatches.PlayerSetupPatches));
} }

24
AvatarScale/Utils.cs Normal file
View file

@ -0,0 +1,24 @@
using ABI_RC.Core;
namespace NAK.AvatarScaleMod;
class Utils
{
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;
}
public static float CalculateParameterValue(float lastAvatarHeight)
{
float t = (lastAvatarHeight - AvatarScaleMod.MinimumHeight) / (AvatarScaleMod.MaximumHeight - AvatarScaleMod.MinimumHeight);
return t;
}
}