Decompiled source of AvatarStatsLoader v1.3.4

Mods/AvatarStatsLoader.dll

Decompiled 4 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text.Json;
using System.Text.Json.Serialization;
using AvatarStatsLoader;
using AvatarStatsLoader.BoneMenu;
using BoneLib;
using BoneLib.BoneMenu;
using HarmonyLib;
using Il2CppSLZ.VRMK;
using Il2CppSystem.IO;
using MelonLoader;
using MelonLoader.Preferences;
using MelonLoader.Utils;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Avatar Stats Loader")]
[assembly: AssemblyDescription("Customized stats loader for BoneLab")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AvatarStatsLoader")]
[assembly: AssemblyCopyright("Copyright © FirEmerald 2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("649c4263-395f-44aa-bb88-6841559df396")]
[assembly: AssemblyFileVersion("1.3.4")]
[assembly: MelonInfo(typeof(AvatarStatsMod), "Avatar Stats Loader", "1.3.4", "FirEmerald", "https://bonelab.thunderstore.io/package/FirEmerald/AvatarStatsLoader/")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyVersion("1.3.4.0")]
namespace AvatarStatsLoader
{
	public static class AvatarExtensions
	{
		private static float defAgility;

		private static float defStrengthUpper;

		private static float defStrengthLower;

		private static float defVitality;

		private static float defSpeed;

		private static float defIntelligence;

		private static float loadAgility;

		private static float loadStrengthUpper;

		private static float loadStrengthLower;

		private static float loadVitality;

		private static float loadSpeed;

		private static float loadIntelligence;

		private static float defMassChest;

		private static float defMassPelvis;

		private static float defMassHead;

		private static float defMassArm;

		private static float defMassLeg;

		private static float loadMassChest;

		private static float loadMassPelvis;

		private static float loadMassHead;

		private static float loadMassArm;

		private static float loadMassLeg;

		public static void SetDefStats(this Avatar avatar)
		{
			defAgility = avatar._agility;
			defStrengthUpper = avatar._strengthUpper;
			defStrengthLower = avatar._strengthLower;
			defVitality = avatar._vitality;
			defSpeed = avatar._speed;
			defIntelligence = avatar._intelligence;
		}

		public static float GetDefAgility(this Avatar avatar)
		{
			return defAgility;
		}

		public static float GetDefStrengthUpper(this Avatar avatar)
		{
			return defStrengthUpper;
		}

		public static float GetDefStrengthLower(this Avatar avatar)
		{
			return defStrengthLower;
		}

		public static float GetDefVitality(this Avatar avatar)
		{
			return defVitality;
		}

		public static float GetDefSpeed(this Avatar avatar)
		{
			return defSpeed;
		}

		public static float GetDefIntelligence(this Avatar avatar)
		{
			return defIntelligence;
		}

		public static void SetLoadStats(this Avatar avatar)
		{
			loadAgility = avatar._agility;
			loadStrengthUpper = avatar._strengthUpper;
			loadStrengthLower = avatar._strengthLower;
			loadVitality = avatar._vitality;
			loadSpeed = avatar._speed;
			loadIntelligence = avatar._intelligence;
		}

		public static float GetLoadAgility(this Avatar avatar)
		{
			return loadAgility;
		}

		public static float GetLoadStrengthUpper(this Avatar avatar)
		{
			return loadStrengthUpper;
		}

		public static float GetLoadStrengthLower(this Avatar avatar)
		{
			return loadStrengthLower;
		}

		public static float GetLoadVitality(this Avatar avatar)
		{
			return loadVitality;
		}

		public static float GetLoadSpeed(this Avatar avatar)
		{
			return loadSpeed;
		}

		public static float GetLoadIntelligence(this Avatar avatar)
		{
			return loadIntelligence;
		}

		public static void SetDefMasses(this Avatar avatar)
		{
			defMassChest = avatar._massChest;
			defMassPelvis = avatar._massPelvis;
			defMassHead = avatar._massHead;
			defMassArm = avatar._massArm;
			defMassLeg = avatar._massLeg;
		}

		public static float GetDefMassChest(this Avatar avatar)
		{
			return defMassChest;
		}

		public static float GetDefMassPelvis(this Avatar avatar)
		{
			return defMassPelvis;
		}

		public static float GetDefMassHead(this Avatar avatar)
		{
			return defMassHead;
		}

		public static float GetDefMassArm(this Avatar avatar)
		{
			return defMassArm;
		}

		public static float GetDefMassLeg(this Avatar avatar)
		{
			return defMassLeg;
		}

		public static void SetLoadMasses(this Avatar avatar)
		{
			loadMassChest = avatar._massChest;
			loadMassPelvis = avatar._massPelvis;
			loadMassHead = avatar._massHead;
			loadMassArm = avatar._massArm;
			loadMassLeg = avatar._massLeg;
		}

		public static float GetLoadMassChest(this Avatar avatar)
		{
			return loadMassChest;
		}

		public static float GetLoadMassPelvis(this Avatar avatar)
		{
			return loadMassPelvis;
		}

		public static float GetLoadMassHead(this Avatar avatar)
		{
			return loadMassHead;
		}

		public static float GetLoadMassArm(this Avatar avatar)
		{
			return loadMassArm;
		}

		public static float GetLoadMassLeg(this Avatar avatar)
		{
			return loadMassLeg;
		}

		public static bool IsEmptyRig(this Avatar avatar)
		{
			return ((Object)avatar).name == "[RealHeptaRig (Marrow1)]";
		}

		public static string GetName(this Avatar avatar)
		{
			if (((Object)avatar).name.EndsWith("(Clone)"))
			{
				string name = ((Object)avatar).name;
				int length = "(Clone)".Length;
				return name.Substring(0, name.Length - length);
			}
			return ((Object)avatar).name;
		}

		public static void RecalculateTotalMass(this Avatar avatar)
		{
			avatar._massTotal = avatar._massChest + avatar._massPelvis + avatar._massHead + (avatar._massArm + avatar._massLeg) * 2f;
		}
	}
	public class ModInfo
	{
		public const string Name = "Avatar Stats Loader";

		public const string Product = "AvatarStatsLoader";

		public const string Description = "Customized stats loader for BoneLab";

		public const string Version = "1.3.4";

		public const string Author = "FirEmerald";

		public const string Copyright = "Copyright © FirEmerald 2022";

		public const string URL = "https://bonelab.thunderstore.io/package/FirEmerald/AvatarStatsLoader/";
	}
	public class AvatarStatsMod : MelonMod
	{
		internal static readonly string STATS_FOLDER = Path.Combine(MelonEnvironment.UserDataDirectory, "AvatarStats");

		internal static readonly string MASS_FOLDER = Path.Combine(MelonEnvironment.UserDataDirectory, "AvatarMass");

		internal static AvatarStatsMod instance;

		internal static MelonPreferences_Category mpCat;

		internal static MelonPreferences_Entry<float> agility;

		internal static MelonPreferences_Entry<float> strengthUpper;

		internal static MelonPreferences_Entry<float> strengthLower;

		internal static MelonPreferences_Entry<float> vitality;

		internal static MelonPreferences_Entry<float> speed;

		internal static MelonPreferences_Entry<float> intelligence;

		internal static MelonPreferences_Entry<bool> loadStats;

		internal static MelonPreferences_Entry<bool> saveStats;

		internal static MelonPreferences_Entry<float> massChest;

		internal static MelonPreferences_Entry<float> massPelvis;

		internal static MelonPreferences_Entry<float> massHead;

		internal static MelonPreferences_Entry<float> massArm;

		internal static MelonPreferences_Entry<float> massLeg;

		internal static MelonPreferences_Entry<bool> loadMasses;

		internal static MelonPreferences_Entry<bool> saveMasses;

		internal static Avatar currentAvatar = null;

		internal static bool isLoadingAvatarValues = false;

		public AvatarStatsMod()
		{
			instance = this;
		}

		public override void OnInitializeMelon()
		{
			Hooking.OnSwitchAvatarPostfix += delegate(Avatar avatar)
			{
				if ((Object)(object)avatar != (Object)null && !avatar.IsEmptyRig())
				{
					if ((Object)(object)avatar != (Object)(object)currentAvatar)
					{
						Log("Setting avatar to " + avatar.GetName());
						isLoadingAvatarValues = true;
						agility.DefaultValue = avatar.GetDefAgility();
						agility.Value = avatar._agility;
						strengthUpper.DefaultValue = avatar.GetDefStrengthUpper();
						strengthUpper.Value = avatar._strengthUpper;
						strengthLower.DefaultValue = avatar.GetDefStrengthLower();
						strengthLower.Value = avatar._strengthLower;
						vitality.DefaultValue = avatar.GetDefVitality();
						vitality.Value = avatar._vitality;
						speed.DefaultValue = avatar.GetDefSpeed();
						speed.Value = avatar._speed;
						intelligence.DefaultValue = avatar.GetDefIntelligence();
						intelligence.Value = avatar._intelligence;
						massChest.DefaultValue = avatar.GetDefMassChest();
						massChest.Value = avatar._massChest;
						massPelvis.DefaultValue = avatar.GetDefMassPelvis();
						massPelvis.Value = avatar._massPelvis;
						massHead.DefaultValue = avatar.GetDefMassHead();
						massHead.Value = avatar._massHead;
						massArm.DefaultValue = avatar.GetDefMassArm();
						massArm.Value = avatar._massArm;
						massLeg.DefaultValue = avatar.GetDefMassLeg();
						massLeg.Value = avatar._massLeg;
						currentAvatar = avatar;
						isLoadingAvatarValues = false;
					}
				}
				else
				{
					Log("Setting avatar to null");
					currentAvatar = null;
				}
			};
			mpCat = MelonPreferences.CreateCategory("AvatarStatsMod");
			agility = mpCat.CreateEntry<float>("agility", 0f, "Agility", "Determines how fast an avatar can acclerate or decelerate.", false, true, (ValueValidator)null, (string)null);
			strengthUpper = mpCat.CreateEntry<float>("strengthUpper", 0f, "Arm strength", "Determines the arm strength, affecting weapon holding and climbing.", false, true, (ValueValidator)null, (string)null);
			strengthLower = mpCat.CreateEntry<float>("strengthLower", 0f, "Leg strength", "Determines leg strength, affecting running and jumping.", false, true, (ValueValidator)null, (string)null);
			vitality = mpCat.CreateEntry<float>("vitality", 0f, "Vitality", "Determines how much damage an avatar takes.", false, true, (ValueValidator)null, (string)null);
			speed = mpCat.CreateEntry<float>("speed", 0f, "Speed", "Determines how fast an avatar can run.", false, true, (ValueValidator)null, (string)null);
			intelligence = mpCat.CreateEntry<float>("intelligence", 0f, "Intelligence", "Currently has no effect.", false, true, (ValueValidator)null, (string)null);
			((MelonEventBase<LemonAction<float, float>>)(object)agility.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			((MelonEventBase<LemonAction<float, float>>)(object)strengthUpper.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			((MelonEventBase<LemonAction<float, float>>)(object)strengthLower.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			((MelonEventBase<LemonAction<float, float>>)(object)vitality.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			((MelonEventBase<LemonAction<float, float>>)(object)speed.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			((MelonEventBase<LemonAction<float, float>>)(object)intelligence.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			loadStats = mpCat.CreateEntry<bool>("loadStats", false, "Reload stats", "loads the previously loaded stats of the current avatar into the preferences.", false, false, (ValueValidator)null, (string)null);
			((MelonEventBase<LemonAction<bool, bool>>)(object)loadStats.OnEntryValueChanged).Subscribe((LemonAction<bool, bool>)delegate(bool prev, bool cur)
			{
				if (cur)
				{
					LoadStatValues();
					((MelonPreferences_Entry)loadStats).ResetToDefault();
				}
			}, 0, false);
			saveStats = mpCat.CreateEntry<bool>("saveStats", false, "Save stats", "Saves the current stat preferences into the override file of the current avatar.", false, false, (ValueValidator)null, (string)null);
			((MelonEventBase<LemonAction<bool, bool>>)(object)saveStats.OnEntryValueChanged).Subscribe((LemonAction<bool, bool>)delegate(bool prev, bool cur)
			{
				if (cur)
				{
					SaveStatsToFile();
					((MelonPreferences_Entry)saveStats).ResetToDefault();
				}
			}, 0, false);
			massChest = mpCat.CreateEntry<float>("massChest", 0f, "Chest mass", "Chest mass of the last loaded avatar.", false, true, (ValueValidator)null, (string)null);
			massPelvis = mpCat.CreateEntry<float>("massPelvis", 0f, "Pelvis mass", "Pelvis mass of the last loaded avatar.", false, true, (ValueValidator)null, (string)null);
			massHead = mpCat.CreateEntry<float>("massHead", 0f, "Head mass", "Head mass of the last loaded avatar.", false, true, (ValueValidator)null, (string)null);
			massArm = mpCat.CreateEntry<float>("massArm", 0f, "Arm mass", "Arm mass of the last loaded avatar.", false, true, (ValueValidator)null, (string)null);
			massLeg = mpCat.CreateEntry<float>("massLeg", 0f, "Leg mass", "Leg mass of the last loaded avatar.", false, true, (ValueValidator)null, (string)null);
			((MelonEventBase<LemonAction<float, float>>)(object)massChest.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			((MelonEventBase<LemonAction<float, float>>)(object)massPelvis.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			((MelonEventBase<LemonAction<float, float>>)(object)massHead.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			((MelonEventBase<LemonAction<float, float>>)(object)massArm.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			((MelonEventBase<LemonAction<float, float>>)(object)massLeg.OnEntryValueChanged).Subscribe((LemonAction<float, float>)refreshAvatarAct, int.MaxValue, false);
			loadMasses = mpCat.CreateEntry<bool>("loadMasses", false, "Reload masses", "Reloads the mass of the current avatar into the preferences.", false, false, (ValueValidator)null, (string)null);
			((MelonEventBase<LemonAction<bool, bool>>)(object)loadMasses.OnEntryValueChanged).Subscribe((LemonAction<bool, bool>)delegate(bool prev, bool cur)
			{
				if (cur)
				{
					LoadMassValues();
					((MelonPreferences_Entry)loadMasses).ResetToDefault();
				}
			}, 0, false);
			saveMasses = mpCat.CreateEntry<bool>("saveMasses", false, "Save masses", "Saves the current mass preferences into the override file of the current avatar.", false, false, (ValueValidator)null, (string)null);
			((MelonEventBase<LemonAction<bool, bool>>)(object)saveMasses.OnEntryValueChanged).Subscribe((LemonAction<bool, bool>)delegate(bool prev, bool cur)
			{
				if (cur)
				{
					SaveMassesToFile();
					((MelonPreferences_Entry)saveMasses).ResetToDefault();
				}
			}, 0, false);
			mpCat.SaveToFile(true);
			StatsBoneMenu.Init();
			MassesBoneMenu.Init();
			static void refreshAvatarAct(float prev, float cur)
			{
				RefreshAvatarStats();
			}
		}

		public static void RefreshAvatarStats()
		{
			if (isLoadingAvatarValues || !((Object)(object)currentAvatar != (Object)null))
			{
				return;
			}
			Log("Refreshing " + currentAvatar.GetName());
			try
			{
				Player.RigManager.SwapAvatar(currentAvatar);
			}
			catch (Exception ex)
			{
				Error("An error occurred attempting to refresh avatar stats.", ex);
			}
		}

		public static void SaveStatsToFile()
		{
			if ((Object)(object)currentAvatar != (Object)null)
			{
				if (!Directory.Exists(STATS_FOLDER))
				{
					DirectoryInfo val = Directory.CreateDirectory(STATS_FOLDER);
					Log("Avatar stats folder did not exist, created at " + ((FileSystemInfo)val).Name);
				}
				string text = Path.Combine(STATS_FOLDER, currentAvatar.GetName() + ".json");
				Log("Saving stats to " + text);
				File.WriteAllText(text, JsonSerializer.Serialize(new AvatarStats(agility.Value, strengthUpper.Value, strengthLower.Value, vitality.Value, speed.Value, intelligence.Value)));
			}
		}

		internal static void LoadStatValues()
		{
			if ((Object)(object)currentAvatar != (Object)null)
			{
				LoadStatValues(currentAvatar);
			}
		}

		internal static void LoadStatValues(Avatar avatar)
		{
			agility.Value = avatar._agility;
			strengthUpper.Value = avatar._strengthUpper;
			strengthLower.Value = avatar._strengthLower;
			vitality.Value = avatar._vitality;
			speed.Value = avatar._speed;
			intelligence.Value = avatar._intelligence;
		}

		public static void SaveMassesToFile()
		{
			if ((Object)(object)currentAvatar != (Object)null)
			{
				if (!Directory.Exists(MASS_FOLDER))
				{
					DirectoryInfo val = Directory.CreateDirectory(MASS_FOLDER);
					Log("Avatar masses folder did not exist, created at " + ((FileSystemInfo)val).Name);
				}
				string text = Path.Combine(MASS_FOLDER, currentAvatar.GetName() + ".json");
				Log("Saving masses to " + text);
				File.WriteAllText(text, JsonSerializer.Serialize(new AvatarMass(massChest.Value, massPelvis.Value, massHead.Value, massArm.Value, massLeg.Value)));
			}
		}

		internal static void LoadMassValues()
		{
			if ((Object)(object)currentAvatar != (Object)null)
			{
				LoadMassValues(currentAvatar);
			}
		}

		internal static void LoadMassValues(Avatar avatar)
		{
			massChest.Value = avatar._massChest;
			massPelvis.Value = avatar._massPelvis;
			massHead.Value = avatar._massHead;
			massArm.Value = avatar._massArm;
			massLeg.Value = avatar._massLeg;
		}

		internal static void Log(string str)
		{
			((MelonBase)instance).LoggerInstance.Msg(str);
		}

		internal static void Log(string str, Exception ex)
		{
			((MelonBase)instance).LoggerInstance.Msg(str, new object[1] { ex });
		}

		internal static void Log(object obj)
		{
			((MelonBase)instance).LoggerInstance.Msg(obj?.ToString() ?? "null");
		}

		internal static void Warn(string str)
		{
			((MelonBase)instance).LoggerInstance.Warning(str);
		}

		internal static void Warn(string str, Exception ex)
		{
			((MelonBase)instance).LoggerInstance.Warning(str, new object[1] { ex });
		}

		internal static void Warn(object obj)
		{
			((MelonBase)instance).LoggerInstance.Warning(obj?.ToString() ?? "null");
		}

		internal static void Error(string str)
		{
			((MelonBase)instance).LoggerInstance.Error(str);
		}

		internal static void Error(string str, Exception ex)
		{
			((MelonBase)instance).LoggerInstance.Error(str, ex);
		}

		internal static void Error(object obj)
		{
			((MelonBase)instance).LoggerInstance.Error(obj?.ToString() ?? "null");
		}
	}
	[HarmonyPatch(typeof(Avatar), "ComputeBaseStats")]
	public static class AvatarComputeStatChange
	{
		public static void Postfix(Avatar __instance)
		{
			if (__instance.IsEmptyRig())
			{
				return;
			}
			string name = __instance.GetName();
			if ((Object)(object)__instance == (Object)(object)AvatarStatsMod.currentAvatar)
			{
				AvatarStatsMod.Log("Overriding stats for " + name + " with values from preferences.");
				__instance._agility = AvatarStatsMod.agility.Value;
				__instance._strengthUpper = AvatarStatsMod.strengthUpper.Value;
				__instance._strengthLower = AvatarStatsMod.strengthLower.Value;
				__instance._vitality = AvatarStatsMod.vitality.Value;
				__instance._speed = AvatarStatsMod.speed.Value;
				__instance._intelligence = AvatarStatsMod.intelligence.Value;
				return;
			}
			__instance.SetDefStats();
			AvatarStatsMod.Log("Load stats: " + name);
			if (Directory.Exists(AvatarStatsMod.STATS_FOLDER))
			{
				string text = Path.Combine(AvatarStatsMod.STATS_FOLDER, name + ".json");
				if (File.Exists(text))
				{
					AvatarStatsMod.Log("Overriding stats with values from " + text);
					JsonSerializer.Deserialize<AvatarStats>(File.ReadAllText(text)).Apply(__instance);
				}
			}
			__instance.SetLoadStats();
		}
	}
	public class AvatarStats
	{
		[JsonInclude]
		public float agility;

		[JsonInclude]
		public float strengthUpper;

		[JsonInclude]
		public float strengthLower;

		[JsonInclude]
		public float vitality;

		[JsonInclude]
		public float speed;

		[JsonInclude]
		public float intelligence;

		public AvatarStats()
		{
		}

		public AvatarStats(float agility, float strengthUpper, float strengthLower, float vitality, float speed, float intelligence)
		{
			this.agility = agility;
			this.strengthUpper = strengthUpper;
			this.strengthLower = strengthLower;
			this.vitality = vitality;
			this.speed = speed;
			this.intelligence = intelligence;
		}

		public AvatarStats(Avatar avatar)
		{
			agility = avatar._agility;
			strengthUpper = avatar._strengthUpper;
			strengthLower = avatar._strengthLower;
			vitality = avatar._vitality;
			speed = avatar._speed;
			intelligence = avatar._intelligence;
		}

		public void Apply(Avatar avatar)
		{
			avatar._agility = agility;
			avatar._strengthUpper = strengthUpper;
			avatar._strengthLower = strengthLower;
			avatar._vitality = vitality;
			avatar._speed = speed;
			avatar._intelligence = intelligence;
		}
	}
	[HarmonyPatch(typeof(Avatar), "ComputeMass")]
	public static class AvatarComputeMassChange
	{
		public static void Postfix(Avatar __instance, float normalizeTo82)
		{
			if (__instance.IsEmptyRig())
			{
				return;
			}
			string name = __instance.GetName();
			if ((Object)(object)__instance == (Object)(object)AvatarStatsMod.currentAvatar)
			{
				AvatarStatsMod.Log("Overriding mass for " + name + " with values from preferences.");
				__instance._massChest = AvatarStatsMod.massChest.Value;
				__instance._massPelvis = AvatarStatsMod.massPelvis.Value;
				__instance._massHead = AvatarStatsMod.massHead.Value;
				__instance._massArm = AvatarStatsMod.massArm.Value;
				__instance._massLeg = AvatarStatsMod.massLeg.Value;
				__instance.RecalculateTotalMass();
				return;
			}
			__instance.SetDefMasses();
			AvatarStatsMod.Log("Load mass: " + name);
			if (Directory.Exists(AvatarStatsMod.MASS_FOLDER))
			{
				string text = Path.Combine(AvatarStatsMod.MASS_FOLDER, ".json");
				if (File.Exists(text))
				{
					AvatarStatsMod.Log("Overriding mass with values from " + text);
					JsonSerializer.Deserialize<AvatarMass>(File.ReadAllText(text)).Apply(__instance);
				}
			}
			__instance.SetLoadMasses();
		}
	}
	public class AvatarMass
	{
		public float massChest;

		public float massPelvis;

		public float massHead;

		public float massArm;

		public float massLeg;

		public AvatarMass()
		{
		}

		public AvatarMass(float massChest, float massPelvis, float massHead, float massArm, float massLeg)
		{
			this.massChest = massChest;
			this.massPelvis = massPelvis;
			this.massHead = massHead;
			this.massArm = massArm;
			this.massLeg = massLeg;
		}

		public AvatarMass(Avatar avatar)
		{
			massChest = avatar._massChest;
			massPelvis = avatar._massPelvis;
			massHead = avatar._massHead;
			massArm = avatar._massArm;
			massLeg = avatar._massLeg;
		}

		public void Apply(Avatar avatar)
		{
			avatar._massChest = massChest;
			avatar._massPelvis = massPelvis;
			avatar._massHead = massHead;
			avatar._massArm = massArm;
			avatar._massLeg = massLeg;
			avatar.RecalculateTotalMass();
		}
	}
}
namespace AvatarStatsLoader.BoneMenu
{
	internal class EntryMenu
	{
		public readonly Page menu;

		public readonly FloatElement incrementOne;

		public readonly FloatElement incrementPointOne;

		public readonly FloatElement incrementPointZeroOne;

		public readonly FloatElement incrementPointZeroZeroOne;

		public readonly FunctionElement setToOne;

		public readonly FunctionElement loadFromAvatar;

		public readonly FunctionElement loadFromAvatarCalculated;

		public EntryMenu(Page parentMenu, string name, Func<float> getFromLoaded, MelonPreferences_Entry<float> entry)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			EntryMenu entryMenu = this;
			menu = parentMenu.CreatePage(name, Color.white, 7, true);
			incrementOne = MakeIncrement(menu, 1f, entry);
			incrementPointOne = MakeIncrement(menu, 0.1f, entry);
			incrementPointZeroOne = MakeIncrement(menu, 0.01f, entry);
			incrementPointZeroZeroOne = MakeIncrement(menu, 0.01f, entry);
			setToOne = menu.CreateFunction("Set to 1.0", Color.white, (Action)delegate
			{
				entry.Value = 1f;
			});
			loadFromAvatar = menu.CreateFunction("Load from avatar's loaded value", Color.white, (Action)delegate
			{
				entry.Value = getFromLoaded();
			});
			loadFromAvatarCalculated = menu.CreateFunction("Load from avatar's computed value", Color.white, (Action)delegate
			{
				((MelonPreferences_Entry)entry).ResetToDefault();
			});
			((MelonEventBase<LemonAction<float, float>>)(object)entry.OnEntryValueChanged).Subscribe((LemonAction<float, float>)delegate(float prev, float cur)
			{
				if (cur != entryMenu.incrementOne.Value)
				{
					entryMenu.incrementOne.Value = cur;
				}
				if (cur != entryMenu.incrementPointOne.Value)
				{
					entryMenu.incrementPointOne.Value = cur;
				}
				if (cur != entryMenu.incrementPointZeroOne.Value)
				{
					entryMenu.incrementPointZeroOne.Value = cur;
				}
				if (cur != entryMenu.incrementPointZeroZeroOne.Value)
				{
					entryMenu.incrementPointZeroZeroOne.Value = cur;
				}
			}, int.MaxValue, false);
		}

		private static FloatElement MakeIncrement(Page page, float increment, MelonPreferences_Entry<float> entry)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			return page.CreateFloat("+/-" + increment, Color.white, 0f, increment, float.NegativeInfinity, float.PositiveInfinity, (Action<float>)delegate(float value)
			{
				if (value != entry.Value)
				{
					entry.Value = value;
				}
			});
		}
	}
	internal class MassesBoneMenu
	{
		public static Page menu;

		public static EntryMenu massChest;

		public static EntryMenu massPelvis;

		public static EntryMenu massHead;

		public static EntryMenu massArm;

		public static EntryMenu massLeg;

		public static FunctionElement saveMasses;

		public static void Init()
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			menu = Page.Root.CreatePage("Avatar Mass", Color.white, 7, true);
			massChest = new EntryMenu(menu, "Chest Mass", () => AvatarStatsMod.currentAvatar.GetLoadMassChest(), AvatarStatsMod.massChest);
			massPelvis = new EntryMenu(menu, "Pelvis Mass", () => AvatarStatsMod.currentAvatar.GetLoadMassPelvis(), AvatarStatsMod.massPelvis);
			massHead = new EntryMenu(menu, "Head Mass", () => AvatarStatsMod.currentAvatar.GetLoadMassHead(), AvatarStatsMod.massHead);
			massArm = new EntryMenu(menu, "Arm Mass", () => AvatarStatsMod.currentAvatar.GetLoadMassArm(), AvatarStatsMod.massArm);
			massLeg = new EntryMenu(menu, "Leg Mass", () => AvatarStatsMod.currentAvatar.GetLoadMassLeg(), AvatarStatsMod.massLeg);
			saveMasses = menu.CreateFunction("Save masses", Color.white, (Action)AvatarStatsMod.SaveMassesToFile);
		}
	}
	internal class StatsBoneMenu
	{
		public static Page menu;

		public static EntryMenu agility;

		public static EntryMenu strengthUpper;

		public static EntryMenu strengthLower;

		public static EntryMenu vitality;

		public static EntryMenu speed;

		public static EntryMenu intelligence;

		public static FunctionElement saveStats;

		public static FunctionElement loadStats;

		public static void Init()
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			menu = Page.Root.CreatePage("Avatar Stats", Color.white, 7, true);
			agility = new EntryMenu(menu, "Agility", () => AvatarStatsMod.currentAvatar.GetLoadAgility(), AvatarStatsMod.agility);
			strengthUpper = new EntryMenu(menu, "Strength Upper", () => AvatarStatsMod.currentAvatar.GetLoadStrengthUpper(), AvatarStatsMod.strengthUpper);
			strengthLower = new EntryMenu(menu, "Strength Lower", () => AvatarStatsMod.currentAvatar.GetLoadStrengthLower(), AvatarStatsMod.strengthLower);
			vitality = new EntryMenu(menu, "Vitality", () => AvatarStatsMod.currentAvatar.GetLoadVitality(), AvatarStatsMod.vitality);
			speed = new EntryMenu(menu, "Speed", () => AvatarStatsMod.currentAvatar.GetLoadSpeed(), AvatarStatsMod.speed);
			intelligence = new EntryMenu(menu, "Intelligence", () => AvatarStatsMod.currentAvatar.GetLoadIntelligence(), AvatarStatsMod.intelligence);
			saveStats = menu.CreateFunction("Save stats", Color.white, (Action)AvatarStatsMod.SaveStatsToFile);
		}
	}
}