using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.Json; using BepInEx; using BepInEx.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using BepInEx.Unity.IL2CPP.Utils.Collections; using HarmonyLib; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; using ProjectM; using ProjectM.Network; using ProjectM.UI; using StunShared.UI; using Stunlock.Network; using Stunlock.Network.Steam; using TMPro; using Unity.Collections; using Unity.Entities; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("KinCreator")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+711254f94702daf8506ba4b6561c6f1451fe5a5d")] [assembly: AssemblyProduct("KinCreator")] [assembly: AssemblyTitle("KinCreator")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace KinCreator { [BepInPlugin("Kindred.KinCreator", "KinCreator", "1.0.0")] internal class Plugin : BasePlugin { private Harmony _harmony; private static MonoBehaviour _monoBehaviour; public static readonly string DirectoryPath = Path.Combine(Paths.ConfigPath, "KinCreator"); public static ConfigEntry _serverAddress; public static ConfigEntry _password; public static ConfigEntry _autoReconnect; public static ConfigEntry _retryInterval; internal static Plugin Instance { get; set; } public static ManualLogSource LogInstance => ((BasePlugin)Instance).Log; public static PresetManager Presets { get; set; } public override void Load() { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Expected O, but got Unknown //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown Instance = this; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val; if (Application.productName == "VRisingServer") { ManualLogSource logInstance = LogInstance; val = new BepInExInfoLogInterpolatedStringHandler(22, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("KinCreator"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("["); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("1.0.0"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("] is a client mod! ("); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(Application.productName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(")"); } logInstance.LogInfo(val); return; } ClassInjector.RegisterTypeInIl2Cpp(); _harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null); InitConfig(); Presets = new PresetManager(); ManualLogSource logInstance2 = LogInstance; val = new BepInExInfoLogInterpolatedStringHandler(20, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("KinCreator"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("["); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("1.0.0"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("] loaded on client!"); } logInstance2.LogInfo(val); } public override bool Unload() { ((BasePlugin)this).Config.Clear(); _harmony.UnpatchSelf(); return true; } private static void InitConfig() { if (!Directory.Exists(DirectoryPath)) { Directory.CreateDirectory(DirectoryPath); } _autoReconnect = ((BasePlugin)Instance).Config.Bind("AutoReconnect", "Enabled", true, "Enables automatic reconnections when attempting to join full servers."); _retryInterval = ((BasePlugin)Instance).Config.Bind("AutoReconnect", "RetryInterval", 15, "Time in seconds between reconnection attempts."); _serverAddress = ((BasePlugin)Instance).Config.Bind("AutoReconnect", "ServerAddress", "", "Server address to use for auto-reconnect (stored automatically on connect)."); _password = ((BasePlugin)Instance).Config.Bind("AutoReconnect", "Password", "", "Password to use when auto-reconnecting (blank for none)."); } public static Coroutine StartCoroutine(IEnumerator routine) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown if ((Object)(object)_monoBehaviour == (Object)null) { GameObject val = new GameObject("KinCreator"); _monoBehaviour = (MonoBehaviour)(object)val.AddComponent(); Object.DontDestroyOnLoad((Object)val); } return _monoBehaviour.StartCoroutine(CollectionExtensions.WrapToIl2Cpp(routine)); } public static void Delayed(Action action, float delay = 0.25f) { RunDelayed(delay, action).Run(); } private static IEnumerator RunDelayed(float delay, Action action) { yield return (object)new WaitForSeconds(delay); action?.Invoke(); } } internal static class CoroutineExtensions { public static void Run(this IEnumerator routine, float delay = 0f) { if (delay > 0f) { Plugin.StartCoroutine(Delay(routine, delay)); } else { Plugin.StartCoroutine(routine); } } private static IEnumerator Delay(IEnumerator routine, float delay) { yield return (object)new WaitForSeconds(delay); routine.Run(); } } internal class CoroutineHost : MonoBehaviour { public CoroutineHost(IntPtr ptr) : base(ptr) { } } public class CharacterPreset { public string Name { get; set; } = ""; public int BodyTypeIndex { get; set; } public int SkinToneColorIndex { get; set; } public int FaceIndex { get; set; } public int EyeColorIndex { get; set; } public int HairIndex { get; set; } public int HairColorIndex { get; set; } public int FeaturesIndex { get; set; } public int AccessoriesIndex { get; set; } } internal class PresetManager { private static readonly string _filePath = Path.Combine(Plugin.DirectoryPath, "presets.json"); private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions { WriteIndented = true }; public Dictionary SavedPresets { get; private set; } = new Dictionary(); public List PresetNames => SavedPresets.Keys.ToList(); public bool HasPresets => SavedPresets.Count > 0; public PresetManager() { Load(); } public CharacterPreset GetPreset(string name) { if (!SavedPresets.TryGetValue(name, out var value)) { return null; } return value; } public string GetNextPresetName() { int num = 1; string text; while (true) { text = $"Preset {num}"; if (!SavedPresets.ContainsKey(text)) { break; } num++; } return text; } public void SavePreset(string name, CharacterPreset preset) { SavedPresets[name] = preset; Save(); } public void DeletePreset(string name) { if (SavedPresets.Remove(name)) { Save(); } } public bool RenamePreset(string oldName, string newName) { if (!SavedPresets.TryGetValue(oldName, out var value)) { return false; } if (SavedPresets.ContainsKey(newName)) { return false; } SavedPresets.Remove(oldName); value.Name = newName; SavedPresets[newName] = value; Save(); return true; } private void Save() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown try { string contents = JsonSerializer.Serialize(SavedPresets, _jsonOptions); File.WriteAllText(_filePath, contents); } catch (Exception ex) { ManualLogSource logInstance = Plugin.LogInstance; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(40, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[PresetManager] Failed to save presets: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } logInstance.LogWarning(val); } } private void Load() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown try { if (File.Exists(_filePath)) { string json = File.ReadAllText(_filePath); SavedPresets = JsonSerializer.Deserialize>(json, _jsonOptions) ?? new Dictionary(); } } catch (Exception ex) { ManualLogSource logInstance = Plugin.LogInstance; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(40, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[PresetManager] Failed to load presets: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } logInstance.LogWarning(val); SavedPresets = new Dictionary(); } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "Kindred.KinCreator"; public const string PLUGIN_NAME = "KinCreator"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace KinCreator.Patches { [HarmonyPatch] internal static class AutoReconnectPatch { private const ushort DEFAULT_PORT = 9876; private static string _serverSession = string.Empty; private static string _serverPassword = string.Empty; public static bool _allowRetry; private static DefaultWorldConsoleCommandSystem DefaultWorldConsoleCommandSystem => World.DefaultGameObjectInjectionWorld.GetOrCreateSystemManaged(); [HarmonyPatch(typeof(MainMenuNewView), "Update")] [HarmonyPrefix] private static void UpdatePrefix() { _allowRetry = false; } [HarmonyPatch(typeof(ClientBootstrapSystem), "OnStatusChangedEvent")] [HarmonyPostfix] private static void OnStatusChangedEventPostfix(ClientBootstrapSystem __instance, StatusChangedEvent statusChangedEvent) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) ManualLogSource logInstance = Plugin.LogInstance; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(30, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[ClientBootstrapSystem] -> "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(statusChangedEvent.Status); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" ? "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(__instance.DisconnectChangeReason); } logInstance.LogWarning(val); if (Plugin._autoReconnect.Value && ((object)__instance.DisconnectChangeReason/*cast due to .constrained prefix*/).Equals((object)(ConnectionStatusChangeReason)11)) { ConnectAddress connectAddress = GetConnectAddress(_serverSession); _allowRetry = true; Plugin.Delayed(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) DoReconnect(connectAddress); }, Plugin._retryInterval.Value); } } [HarmonyPatch(typeof(ClientSteamTransportLayer), "Connect")] [HarmonyPostfix] private static void ClientConnectPostfix(ConnectAddress connectAddress) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) ManualLogSource logInstance = Plugin.LogInstance; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(31, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[ClientSteamTransportLayer] -> "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(connectAddress); } logInstance.LogWarning(val); DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(1, 2); FixedString32Bytes address = connectAddress.Address; defaultInterpolatedStringHandler.AppendFormatted(((FixedString32Bytes)(ref address)).Value); defaultInterpolatedStringHandler.AppendLiteral(":"); defaultInterpolatedStringHandler.AppendFormatted(connectAddress.Port); _serverSession = defaultInterpolatedStringHandler.ToStringAndClear(); } private static ConnectAddress GetConnectAddress(string address) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) string[] array = address.Split(':'); string text = array[0]; ushort result; ushort num = (ushort)((array.Length > 1 && ushort.TryParse(array[1], out result)) ? result : 0); if (num <= 0) { return ConnectAddressUtility.CreateIPv4(text, (ushort)9876, false); } return ConnectAddressUtility.CreateIPv4(text, num, false); } private static void DoReconnect(ConnectAddress connectAddress) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) if (_allowRetry) { Plugin.LogInstance.LogWarning((object)"[AutoReconnect] Retrying..."); DefaultWorldConsoleCommandSystem.DoConnect(connectAddress, _serverPassword); } } } [HarmonyPatch] internal static class CharacterCreationMenuPatch { private static LocalizedText _saveButtonText; private static GameObject _presetButtonObject; private static GameObject _editDeleteContainer; private static GameObject _editButtonObject; private static GameObject _deleteButtonObject; private static CharacterCreationMenuMapper _activeMenuMapper; private static string _selectedPresetName; private static TMP_Dropdown _nativeDropdown; private static string _editingPreset; private static bool _isEditMode; private static bool _suppressDropdownCallback; private static bool _labelLocTextKilled; private static GenericTextInputPopup _renamePopup; private static GameObject _renameButtonObject; private static GameObject _completeButtonHidden; private static readonly string[] InjectedButtonNames = new string[3] { "SavePreset_StandardButton", "PresetDropdown", "EditDeleteContainer" }; private const float COMPACT_FONT_SIZE = 18f; private const float COMPACT_BUTTON_WIDTH = 110f; private const float DROPDOWN_FONT_SIZE = 20f; private const string BUTTON_PARENT = "HUDCanvas(Clone)/HUDMenuParent/CharacterCreationMenu(Clone)/Root/NewContainer/CharacterCreationScreen(Clone)/Content/LeftMenu/Container_BottomKBAMButtonBar"; private static PresetManager Presets => Plugin.Presets; [HarmonyPatch(typeof(CharacterCreationMenuMapper), "OnStartRunning")] [HarmonyPostfix] public static void OnStartRunningPostfix(CharacterCreationMenuMapper __instance) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown try { _activeMenuMapper = __instance; _editingPreset = null; _isEditMode = false; _selectedPresetName = null; _nativeDropdown = null; _labelLocTextKilled = false; BuildPresetButtons(__instance); Plugin.StartCoroutine(EnsurePresetButtons(__instance)); } catch (Exception ex) { ManualLogSource logInstance = Plugin.LogInstance; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(31, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[CharacterCreationMenuMapper]: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } logInstance.LogWarning(val); } } private static IEnumerator EnsurePresetButtons(CharacterCreationMenuMapper menuMapper) { for (int frame = 0; frame < 150; frame++) { yield return null; if (_activeMenuMapper != menuMapper) { break; } GameObject val = GameObject.Find("HUDCanvas(Clone)/HUDMenuParent/CharacterCreationMenu(Clone)/Root/NewContainer/CharacterCreationScreen(Clone)/Content/LeftMenu/Container_BottomKBAMButtonBar"); if (!((Object)(object)val == (Object)null)) { if ((Object)(object)val.transform.Find("SavePreset_StandardButton") == (Object)null) { BuildPresetButtons(menuMapper); } RectTransform component = val.GetComponent(); if ((Object)(object)component != (Object)null) { LayoutRebuilder.ForceRebuildLayoutImmediate(component); } } } } private static void BuildPresetButtons(CharacterCreationMenuMapper menuMapper) { //IL_0385: Unknown result type (might be due to invalid IL or missing references) //IL_038c: Expected O, but got Unknown //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Expected O, but got Unknown //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_0238: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Expected O, but got Unknown try { GameObject val = GameObject.Find("HUDCanvas(Clone)/HUDMenuParent/CharacterCreationMenu(Clone)/Root/NewContainer/CharacterCreationScreen(Clone)/Content/LeftMenu/Container_BottomKBAMButtonBar"); if ((Object)(object)val == (Object)null) { Plugin.LogInstance.LogWarning((object)"[BuildPresetButtons]: button bar not found"); return; } for (int num = val.transform.childCount - 1; num >= 0; num--) { Transform child = val.transform.GetChild(num); if (Array.IndexOf(InjectedButtonNames, ((Object)child).name) >= 0) { Object.DestroyImmediate((Object)(object)((Component)child).gameObject); } } GameObject val2 = null; for (int i = 0; i < val.transform.childCount; i++) { Transform child2 = val.transform.GetChild(i); if (((Object)child2).name.Contains("Randomize")) { val2 = ((Component)child2).gameObject; break; } } if ((Object)(object)val2 == (Object)null) { val2 = ((Component)val.transform.GetChild(0)).gameObject; } GameObject val3 = UIHelper.InstantiateGameObjectUnderAnchor(val2, val.transform); val3.transform.SetSiblingIndex(val2.transform.GetSiblingIndex() + 1); ((Object)val3).name = "SavePreset_StandardButton"; _saveButtonText = val3.GetComponentInChildren(); _saveButtonText.ForceSet("Save New Preset"); SimpleStunButton component = val3.GetComponent(); ((UnityEventBase)component.onClick).RemoveAllListeners(); ((UnityEvent)component.onClick).AddListener(UnityAction.op_Implicit((Action)delegate { SavePreset(menuMapper); })); val3.SetActive(true); BuildNativeDropdown(val, val3); _editDeleteContainer = new GameObject("EditDeleteContainer"); _editDeleteContainer.transform.SetParent(val.transform, false); _editDeleteContainer.transform.SetSiblingIndex(_presetButtonObject.transform.GetSiblingIndex() + 1); LayoutElement obj = _editDeleteContainer.AddComponent(); obj.preferredHeight = 35f; obj.minHeight = 35f; obj.flexibleHeight = 0f; _editDeleteContainer.AddComponent().verticalFit = (FitMode)2; HorizontalLayoutGroup obj2 = _editDeleteContainer.AddComponent(); ((LayoutGroup)obj2).childAlignment = (TextAnchor)4; ((HorizontalOrVerticalLayoutGroup)obj2).childForceExpandWidth = false; ((HorizontalOrVerticalLayoutGroup)obj2).childForceExpandHeight = true; ((HorizontalOrVerticalLayoutGroup)obj2).childControlHeight = true; ((HorizontalOrVerticalLayoutGroup)obj2).childControlWidth = true; ((HorizontalOrVerticalLayoutGroup)obj2).spacing = 30f; ((LayoutGroup)obj2).padding = new RectOffset { left = 0, right = 0, top = 0, bottom = 0 }; TextMeshProUGUI componentInChildren = val3.GetComponentInChildren(); _editButtonObject = UIHelper.InstantiateGameObjectUnderAnchor(val2, _editDeleteContainer.transform); ((Object)_editButtonObject).name = "EditPreset_StandardButton"; ConfigureCompactButton(_editButtonObject, "Edit", componentInChildren); SimpleStunButton component2 = _editButtonObject.GetComponent(); ((UnityEventBase)component2.onClick).RemoveAllListeners(); ((UnityEvent)component2.onClick).AddListener(UnityAction.op_Implicit((Action)OnEditClicked)); _editButtonObject.SetActive(true); _deleteButtonObject = UIHelper.InstantiateGameObjectUnderAnchor(val2, _editDeleteContainer.transform); ((Object)_deleteButtonObject).name = "DeletePreset_StandardButton"; ConfigureCompactButton(_deleteButtonObject, "Del", componentInChildren); SimpleStunButton component3 = _deleteButtonObject.GetComponent(); ((UnityEventBase)component3.onClick).RemoveAllListeners(); ((UnityEvent)component3.onClick).AddListener(UnityAction.op_Implicit((Action)OnDeleteClicked)); _deleteButtonObject.SetActive(true); _editDeleteContainer.SetActive(Presets.HasPresets); RectTransform component4 = val.GetComponent(); if ((Object)(object)component4 != (Object)null) { LayoutRebuilder.ForceRebuildLayoutImmediate(component4); } } catch (Exception ex) { ManualLogSource logInstance = Plugin.LogInstance; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val4 = new BepInExWarningLogInterpolatedStringHandler(22, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("[BuildPresetButtons]: "); ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted(ex.Message); } logInstance.LogWarning(val4); } } private static void LockCaptionFont(TextMeshProUGUI tmp) { ((TMP_Text)tmp).enableAutoSizing = false; ((TMP_Text)tmp).fontSize = 20f; ((TMP_Text)tmp).fontSizeMin = 20f; ((TMP_Text)tmp).fontSizeMax = 20f; } private static void ConfigureCompactButton(GameObject btnObj, string label, TextMeshProUGUI reference) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) LocalizedText componentInChildren = btnObj.GetComponentInChildren(); if (componentInChildren != null) { componentInChildren.ForceSet(label); } foreach (TextAccessibilityScaler componentsInChild in btnObj.GetComponentsInChildren(true)) { Object.DestroyImmediate((Object)(object)componentsInChild); } TextMeshProUGUI componentInChildren2 = btnObj.GetComponentInChildren(); if ((Object)(object)componentInChildren2 != (Object)null) { if ((Object)(object)reference != (Object)null) { ((TMP_Text)componentInChildren2).font = ((TMP_Text)reference).font; ((TMP_Text)componentInChildren2).fontStyle = ((TMP_Text)reference).fontStyle; ((Graphic)componentInChildren2).color = ((Graphic)reference).color; } ((TMP_Text)componentInChildren2).enableAutoSizing = false; ((TMP_Text)componentInChildren2).fontSize = 18f; ((TMP_Text)componentInChildren2).alignment = (TextAlignmentOptions)514; ((TMP_Text)componentInChildren2).enableWordWrapping = false; ((TMP_Text)componentInChildren2).overflowMode = (TextOverflowModes)0; } ContentSizeFitter component = btnObj.GetComponent(); if ((Object)(object)component != (Object)null) { Object.DestroyImmediate((Object)(object)component); } LayoutElement val = btnObj.GetComponent(); if ((Object)(object)val == (Object)null) { val = btnObj.AddComponent(); } val.preferredWidth = 110f; val.minWidth = 110f; val.preferredHeight = 35f; val.minHeight = 35f; val.flexibleWidth = 0f; val.flexibleHeight = 0f; RectTransform component2 = btnObj.GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.sizeDelta = new Vector2(110f, 35f); } StretchChildren(btnObj.transform); } private static void StretchChildren(Transform parent, int depth = 0) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < parent.childCount; i++) { Transform child = parent.GetChild(i); RectTransform component = ((Component)child).GetComponent(); if ((Object)(object)component != (Object)null) { component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; } if (depth < 1) { StretchChildren(child, depth + 1); } } } private static void BuildNativeDropdown(GameObject buttonParent, GameObject saveButtonObject) { //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_029a: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) //IL_03eb: Unknown result type (might be due to invalid IL or missing references) //IL_038a: Unknown result type (might be due to invalid IL or missing references) //IL_057c: Unknown result type (might be due to invalid IL or missing references) //IL_0416: Unknown result type (might be due to invalid IL or missing references) //IL_04bb: Unknown result type (might be due to invalid IL or missing references) //IL_0506: Unknown result type (might be due to invalid IL or missing references) //IL_053d: Unknown result type (might be due to invalid IL or missing references) GameObject val = null; foreach (TMP_Dropdown item in Resources.FindObjectsOfTypeAll()) { if ((Object)(object)item != (Object)null && (Object)(object)((Component)item).gameObject != (Object)null && ((Object)((Component)item).gameObject).name == "FacialhairDropdown") { val = ((Component)item).gameObject; break; } } if ((Object)(object)val == (Object)null) { Plugin.LogInstance.LogWarning((object)"[BuildNativeDropdown]: FacialhairDropdown not found"); return; } _presetButtonObject = UIHelper.InstantiateGameObjectUnderAnchor(val, buttonParent.transform); _presetButtonObject.transform.SetSiblingIndex(saveButtonObject.transform.GetSiblingIndex() + 1); ((Object)_presetButtonObject).name = "PresetDropdown"; _nativeDropdown = _presetButtonObject.GetComponent(); if ((Object)(object)_nativeDropdown == (Object)null) { Plugin.LogInstance.LogWarning((object)"[BuildNativeDropdown]: Cloned object missing TMP_Dropdown component"); Object.Destroy((Object)(object)_presetButtonObject); _presetButtonObject = null; return; } ((UnityEventBase)_nativeDropdown.onValueChanged).RemoveAllListeners(); ((UnityEvent)(object)_nativeDropdown.onValueChanged).AddListener(UnityAction.op_Implicit((Action)OnNativeDropdownChanged)); foreach (TextAccessibilityScaler componentsInChild in _presetButtonObject.GetComponentsInChildren(true)) { Object.DestroyImmediate((Object)(object)componentsInChild); } foreach (LocalizedText componentsInChild2 in _presetButtonObject.GetComponentsInChildren(true)) { Object.DestroyImmediate((Object)(object)componentsInChild2); } _labelLocTextKilled = true; LayoutElement component = saveButtonObject.GetComponent(); LayoutElement val2 = _presetButtonObject.GetComponent(); if ((Object)(object)val2 == (Object)null) { val2 = _presetButtonObject.AddComponent(); } if ((Object)(object)component != (Object)null) { val2.preferredWidth = component.preferredWidth; val2.preferredHeight = component.preferredHeight; val2.minWidth = component.minWidth; val2.minHeight = component.minHeight; val2.flexibleWidth = component.flexibleWidth; val2.flexibleHeight = component.flexibleHeight; } val2.flexibleHeight = 0f; ContentSizeFitter component2 = _presetButtonObject.GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.horizontalFit = (FitMode)0; component2.verticalFit = (FitMode)0; } RectTransform component3 = saveButtonObject.GetComponent(); RectTransform component4 = _presetButtonObject.GetComponent(); if ((Object)(object)component3 != (Object)null && (Object)(object)component4 != (Object)null) { component4.sizeDelta = component3.sizeDelta; component4.anchorMin = component3.anchorMin; component4.anchorMax = component3.anchorMax; } Image component5 = saveButtonObject.GetComponent(); Image component6 = _presetButtonObject.GetComponent(); if ((Object)(object)component6 != (Object)null && (Object)(object)component5 != (Object)null) { component6.sprite = component5.sprite; component6.type = component5.type; ((Graphic)component6).color = ((Graphic)component5).color; ((Graphic)component6).material = ((Graphic)component5).material; } Selectable component7 = _presetButtonObject.GetComponent(); if ((Object)(object)component7 != (Object)null) { component7.transition = (Transition)3; } TextMeshProUGUI componentInChildren = saveButtonObject.GetComponentInChildren(); Transform val3 = _presetButtonObject.transform.Find("Label"); if ((Object)(object)val3 != (Object)null) { TextMeshProUGUI component8 = ((Component)val3).GetComponent(); if ((Object)(object)component8 != (Object)null) { if ((Object)(object)componentInChildren != (Object)null) { ((TMP_Text)component8).font = ((TMP_Text)componentInChildren).font; } LockCaptionFont(component8); ((TMP_Text)component8).alignment = (TextAlignmentOptions)514; ((Graphic)component8).color = Color.white; } _nativeDropdown.captionText = null; } Transform val4 = _presetButtonObject.transform.Find("Template"); if ((Object)(object)val4 != (Object)null) { Image component9 = ((Component)val4).GetComponent(); if ((Object)(object)component9 != (Object)null) { ((Graphic)component9).color = new Color(0.1f, 0.1f, 0.15f, 0.97f); } Il2CppArrayBase componentsInChildren = ((Component)val4).GetComponentsInChildren(true); if (componentsInChildren != null) { foreach (TextMeshProUGUI item2 in componentsInChildren) { ((Graphic)item2).color = Color.white; ((TMP_Text)item2).fontSize = 16f; } } Transform val5 = val4.Find("Viewport"); if ((Object)(object)val5 != (Object)null) { Transform val6 = val5.Find("Content"); if ((Object)(object)val6 != (Object)null) { Transform val7 = val6.Find("Item"); if ((Object)(object)val7 != (Object)null) { Image component10 = ((Component)val7).GetComponent(); if ((Object)(object)component10 != (Object)null) { ((Graphic)component10).color = new Color(0.12f, 0.12f, 0.18f, 0.95f); } Transform val8 = val7.Find("Item Background"); if ((Object)(object)val8 != (Object)null) { Image component11 = ((Component)val8).GetComponent(); if ((Object)(object)component11 != (Object)null) { ((Graphic)component11).color = new Color(0.2f, 0.2f, 0.3f, 0.8f); } } Transform val9 = val7.Find("Item Checkmark"); if ((Object)(object)val9 != (Object)null) { Image component12 = ((Component)val9).GetComponent(); if ((Object)(object)component12 != (Object)null) { ((Graphic)component12).color = Color.white; } } } } } } Transform val10 = _presetButtonObject.transform.Find("Arrow"); if ((Object)(object)val10 != (Object)null) { Image component13 = ((Component)val10).GetComponent(); if ((Object)(object)component13 != (Object)null) { ((Graphic)component13).color = Color.white; } } RefreshNativeDropdown(); _presetButtonObject.SetActive(Presets.HasPresets); } private static void RefreshNativeDropdown() { if ((Object)(object)_nativeDropdown == (Object)null) { return; } if (!_labelLocTextKilled) { GameObject presetButtonObject = _presetButtonObject; Transform val = ((presetButtonObject != null) ? presetButtonObject.transform.Find("Label") : null); if ((Object)(object)val != (Object)null) { LocalizedText component = ((Component)val).GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } _labelLocTextKilled = true; } } _suppressDropdownCallback = true; _nativeDropdown.ClearOptions(); List val2 = new List(); val2.Add("Load Preset"); if (Presets.HasPresets) { foreach (string presetName in Presets.PresetNames) { val2.Add(presetName); } } _nativeDropdown.AddOptions(val2); string labelText = "Load Preset"; if (!string.IsNullOrEmpty(_selectedPresetName) && Presets.HasPresets) { List presetNames = Presets.PresetNames; for (int i = 0; i < presetNames.Count; i++) { if (presetNames[i] == _selectedPresetName) { _nativeDropdown.SetValueWithoutNotify(i + 1); labelText = _selectedPresetName; break; } } } else { _selectedPresetName = null; _nativeDropdown.SetValueWithoutNotify(0); } _suppressDropdownCallback = false; SetLabelText(labelText); } private static IEnumerator FlashSaveButtonText(string message) { _saveButtonText.ForceSet(message); yield return (object)new WaitForSeconds(5f); if ((Object)(object)_saveButtonText != (Object)null) { _saveButtonText.ForceSet("Save New Preset"); } } private static void SetLabelText(string text) { if ((Object)(object)_presetButtonObject == (Object)null) { return; } Transform val = _presetButtonObject.transform.Find("Label"); if ((Object)(object)val != (Object)null) { TextMeshProUGUI component = ((Component)val).GetComponent(); if ((Object)(object)component != (Object)null) { ((TMP_Text)component).text = text; LockCaptionFont(component); } } } private static void OnNativeDropdownChanged(int index) { if (_suppressDropdownCallback) { return; } if (index <= 0) { _selectedPresetName = null; SetLabelText("Load Preset"); return; } int num = index - 1; List presetNames = Presets.PresetNames; if (num >= 0 && num < presetNames.Count) { _selectedPresetName = presetNames[num]; SetLabelText(_selectedPresetName); OnPresetSelected(_selectedPresetName); } } private static void OnEditClicked() { if (!string.IsNullOrEmpty(_selectedPresetName)) { StartEdit(_selectedPresetName); } } private static void OnDeleteClicked() { if (!string.IsNullOrEmpty(_selectedPresetName)) { DeletePreset(_selectedPresetName); } } private static void UpdatePresetUIVisibility() { bool hasPresets = Presets.HasPresets; if ((Object)(object)_presetButtonObject != (Object)null) { _presetButtonObject.SetActive(hasPresets); } if ((Object)(object)_editDeleteContainer != (Object)null) { _editDeleteContainer.SetActive(hasPresets); } } private static void StartEdit(string presetName) { //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Expected O, but got Unknown _editingPreset = presetName; _isEditMode = true; _saveButtonText.ForceSet("Save Edit"); try { CharacterCreationMenuMapper activeMenuMapper = _activeMenuMapper; SimpleStunButton val = ((activeMenuMapper != null) ? activeMenuMapper._CharacterCreationScreen.ConfirmCharacter : null); GameObject val2 = (((Object)(object)val != (Object)null) ? ((Component)val).gameObject : null); if ((Object)(object)val2 == (Object)null) { Plugin.LogInstance.LogWarning((object)"[StartEdit]: Complete button not found"); return; } _renameButtonObject = UIHelper.InstantiateGameObjectUnderAnchor(val2, val2.transform.parent); ((Object)_renameButtonObject).name = "RenamePreset_StandardButton"; _renameButtonObject.transform.SetSiblingIndex(val2.transform.GetSiblingIndex()); LocalizedText componentInChildren = _renameButtonObject.GetComponentInChildren(); if (componentInChildren != null) { componentInChildren.ForceSet("Rename"); } SimpleStunButton component = _renameButtonObject.GetComponent(); if ((Object)(object)component != (Object)null) { ((UnityEventBase)component.onClick).RemoveAllListeners(); ((UnityEvent)component.onClick).AddListener(UnityAction.op_Implicit((Action)OpenRenameBox)); } _renameButtonObject.SetActive(true); val2.SetActive(false); _completeButtonHidden = val2; } catch (Exception ex) { ManualLogSource logInstance = Plugin.LogInstance; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(13, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("[StartEdit]: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex.Message); } logInstance.LogWarning(val3); } } private static void OpenRenameBox() { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown try { CharacterCreationMenuMapper activeMenuMapper = _activeMenuMapper; GenericPopupSystem val = ((activeMenuMapper != null) ? activeMenuMapper._PopupSystem : null); _renamePopup = ((val != null) ? val.GenericTextInputPopup : null); if ((Object)(object)_renamePopup == (Object)null) { Plugin.LogInstance.LogWarning((object)"[OpenRenameBox]: text input popup unavailable"); return; } _renamePopup.Show(new Data()); Plugin.StartCoroutine(SetupRenamePopup(_renamePopup, _editingPreset)); } catch (Exception ex) { ManualLogSource logInstance = Plugin.LogInstance; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(17, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[OpenRenameBox]: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } logInstance.LogWarning(val2); } } private static IEnumerator SetupRenamePopup(GenericTextInputPopup popup, string currentName) { for (int i = 0; i < 30; i++) { if ((Object)(object)popup == (Object)null) { yield break; } if (popup.IsOpen) { break; } yield return null; } try { popup._IgnoreValidation = true; if ((Object)(object)popup.InputField != (Object)null) { popup.InputField.text = currentName ?? ""; try { popup.InputField.caretPosition = popup.InputField.text.Length; } catch { } } LocalizedText header = popup.Header; if (header != null) { header.ForceSet("Rename Preset"); } if ((Object)(object)popup.ConfirmButton != (Object)null) { ((Component)popup.ConfirmButton).gameObject.SetActive(true); LocalizedText confirmButtonText = popup.ConfirmButtonText; if (confirmButtonText != null) { confirmButtonText.ForceSet("Confirm Rename"); } ((UnityEventBase)popup.ConfirmButton.onClick).RemoveAllListeners(); ((UnityEvent)popup.ConfirmButton.onClick).AddListener(UnityAction.op_Implicit((Action)OnRenameConfirmed)); } if ((Object)(object)popup.CancelButton != (Object)null) { ((Component)popup.CancelButton).gameObject.SetActive(true); LocalizedText cancelButtonText = popup.CancelButtonText; if (cancelButtonText != null) { cancelButtonText.ForceSet("Cancel"); } ((UnityEventBase)popup.CancelButton.onClick).RemoveAllListeners(); ((UnityEvent)popup.CancelButton.onClick).AddListener(UnityAction.op_Implicit((Action)OnRenameCancelled)); } if ((Object)(object)popup.RandomizeButton != (Object)null) { ((Component)popup.RandomizeButton).gameObject.SetActive(false); } } catch (Exception ex) { ManualLogSource logInstance = Plugin.LogInstance; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(20, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[SetupRenamePopup]: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } logInstance.LogWarning(val); } } private static void OnRenameConfirmed() { //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Expected O, but got Unknown //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown bool flag = default(bool); try { string editingPreset = _editingPreset; GenericTextInputPopup renamePopup = _renamePopup; string text = (((Object)(object)((renamePopup != null) ? renamePopup.InputField : null) != (Object)null) ? _renamePopup.InputField.text : null); if (string.IsNullOrWhiteSpace(text)) { text = editingPreset; } text = text?.Trim(); if (string.IsNullOrEmpty(editingPreset) || string.IsNullOrEmpty(text) || !(editingPreset != text)) { return; } if (Presets.RenamePreset(editingPreset, text)) { _selectedPresetName = text; if ((Object)(object)_nativeDropdown != (Object)null) { RefreshNativeDropdown(); } Plugin.StartCoroutine(FlashSaveButtonText("Renamed!")); return; } ManualLogSource logInstance = Plugin.LogInstance; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(44, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Rename '"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(editingPreset); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("' -> '"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("' failed (name already taken)."); } logInstance.LogWarning(val); } catch (Exception ex) { ManualLogSource logInstance2 = Plugin.LogInstance; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(21, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[OnRenameConfirmed]: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } logInstance2.LogWarning(val); } finally { try { GenericTextInputPopup renamePopup2 = _renamePopup; if (renamePopup2 != null) { renamePopup2.Hide(); } } catch { } ExitEditMode(); } } private static void OnRenameCancelled() { try { GenericTextInputPopup renamePopup = _renamePopup; if (renamePopup != null) { renamePopup.Hide(); } } catch { } } private static void ExitEditMode() { _editingPreset = null; _isEditMode = false; if ((Object)(object)_saveButtonText != (Object)null) { _saveButtonText.ForceSet("Save New Preset"); } if ((Object)(object)_renameButtonObject != (Object)null) { Object.Destroy((Object)(object)_renameButtonObject); _renameButtonObject = null; } if ((Object)(object)_completeButtonHidden != (Object)null) { _completeButtonHidden.SetActive(true); } _completeButtonHidden = null; } private static void DeletePreset(string presetName) { Presets.DeletePreset(presetName); _selectedPresetName = null; if (_isEditMode) { ExitEditMode(); } if ((Object)(object)_nativeDropdown != (Object)null) { RefreshNativeDropdown(); } UpdatePresetUIVisibility(); } private static void OnPresetSelected(string presetName) { if (_activeMenuMapper == null) { return; } CharacterPreset preset = Presets.GetPreset(presetName); if (preset == null) { return; } _activeMenuMapper._SelectedBodyTypeIndex = preset.BodyTypeIndex; _activeMenuMapper._SkinToneColorIndex = preset.SkinToneColorIndex; _activeMenuMapper._FaceIndex = preset.FaceIndex; _activeMenuMapper._EyeColorIndex = preset.EyeColorIndex; _activeMenuMapper._HairIndex = preset.HairIndex; _activeMenuMapper._HairColorIndex = preset.HairColorIndex; _activeMenuMapper._FeaturesIndex = preset.FeaturesIndex; _activeMenuMapper._AccessoriesIndex = preset.AccessoriesIndex; if (!string.IsNullOrEmpty(preset.Name)) { ((UnityEvent)_activeMenuMapper._CharacterCreationScreen.ConfirmCharacter.onClick).AddListener(UnityAction.op_Implicit((Action)delegate { try { TMP_InputField nameInputField = _activeMenuMapper._CharacterCreationScreen.NameInputField; if (nameInputField != null) { nameInputField.SetText(preset.Name, true); } } catch { } })); } if (_isEditMode) { ExitEditMode(); } } private static void SavePreset(CharacterCreationMenuMapper menuMapper) { string text = (_isEditMode ? _editingPreset : null); if (_isEditMode) { ExitEditMode(); } string text2 = ((!string.IsNullOrEmpty(text)) ? text : Presets.GetNextPresetName()); CharacterPreset preset = new CharacterPreset { Name = text2, BodyTypeIndex = menuMapper._SelectedBodyTypeIndex, SkinToneColorIndex = menuMapper._SkinToneColorIndex, FaceIndex = menuMapper._FaceIndex, EyeColorIndex = menuMapper._EyeColorIndex, HairIndex = menuMapper._HairIndex, HairColorIndex = menuMapper._HairColorIndex, FeaturesIndex = menuMapper._FeaturesIndex, AccessoriesIndex = menuMapper._AccessoriesIndex }; Presets.SavePreset(text2, preset); Plugin.StartCoroutine(FlashSaveButtonText("Saved!")); _selectedPresetName = text2; if ((Object)(object)_nativeDropdown != (Object)null) { RefreshNativeDropdown(); } UpdatePresetUIVisibility(); } } }