Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of LethalConfig v1.3.4
plugins/LethalConfig/LethalConfig.dll
Decompiled 2 years ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using LethalConfig.AutoConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using LethalConfig.Mods; using LethalConfig.MonoBehaviours; using LethalConfig.MonoBehaviours.Components; using LethalConfig.MonoBehaviours.Managers; using LethalConfig.Settings; using LethalConfig.Utils; using Newtonsoft.Json; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyVersion("0.0.0.0")] [CompilerGenerated] [EditorBrowsable(EditorBrowsableState.Never)] [GeneratedCode("Unity.MonoScriptGenerator.MonoScriptInfoGenerator", null)] internal class UnitySourceGeneratedAssemblyMonoScriptTypes_v1 { private struct MonoScriptData { public byte[] FilePathsData; public byte[] TypesData; public int TotalTypes; public int TotalFiles; public bool IsEditorOnly; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static MonoScriptData Get() { MonoScriptData result = default(MonoScriptData); result.FilePathsData = new byte[3641] { 0, 0, 0, 2, 0, 0, 0, 49, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 65, 117, 116, 111, 67, 111, 110, 102, 105, 103, 92, 65, 117, 116, 111, 67, 111, 110, 102, 105, 103, 71, 101, 110, 101, 114, 97, 116, 111, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 45, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 65, 117, 116, 111, 67, 111, 110, 102, 105, 103, 92, 67, 111, 110, 102, 105, 103, 69, 110, 116, 114, 121, 80, 97, 116, 104, 46, 99, 115, 0, 0, 0, 2, 0, 0, 0, 45, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 66, 97, 115, 101, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 53, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 66, 111, 111, 108, 67, 104, 101, 99, 107, 66, 111, 120, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 53, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 69, 110, 117, 109, 68, 114, 111, 112, 68, 111, 119, 110, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 56, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 70, 108, 111, 97, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 52, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 70, 108, 111, 97, 116, 83, 108, 105, 100, 101, 114, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 56, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 70, 108, 111, 97, 116, 83, 116, 101, 112, 83, 108, 105, 100, 101, 114, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 54, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 71, 101, 110, 101, 114, 105, 99, 66, 117, 116, 116, 111, 110, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 54, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 73, 110, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 50, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 73, 110, 116, 83, 108, 105, 100, 101, 114, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 50, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 66, 97, 115, 101, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 55, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 66, 97, 115, 101, 82, 97, 110, 103, 101, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 58, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 66, 111, 111, 108, 67, 104, 101, 99, 107, 66, 111, 120, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 54, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 67, 97, 110, 77, 111, 100, 105, 102, 121, 82, 101, 115, 117, 108, 116, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 58, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 69, 110, 117, 109, 68, 114, 111, 112, 68, 111, 119, 110, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 61, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 70, 108, 111, 97, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 57, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 70, 108, 111, 97, 116, 83, 108, 105, 100, 101, 114, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 61, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 70, 108, 111, 97, 116, 83, 116, 101, 112, 83, 108, 105, 100, 101, 114, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 59, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 71, 101, 110, 101, 114, 105, 99, 66, 117, 116, 116, 111, 110, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 59, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 73, 110, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 55, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 73, 110, 116, 83, 108, 105, 100, 101, 114, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 60, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 79, 112, 116, 105, 111, 110, 115, 92, 84, 101, 120, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 79, 112, 116, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 55, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 92, 84, 101, 120, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 38, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 77, 97, 110, 97, 103, 101, 114, 46, 99, 115, 0, 0, 0, 2, 0, 0, 0, 37, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 80, 108, 117, 103, 105, 110, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 27, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 100, 115, 92, 77, 111, 100, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 31, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 100, 115, 92, 77, 111, 100, 73, 110, 102, 111, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 44, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 100, 115, 92, 84, 104, 117, 110, 100, 101, 114, 115, 116, 111, 114, 101, 77, 97, 110, 105, 102, 101, 115, 116, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 67, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 66, 111, 111, 108, 67, 104, 101, 99, 107, 66, 111, 120, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 67, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 69, 110, 117, 109, 68, 114, 111, 112, 68, 111, 119, 110, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 70, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 70, 108, 111, 97, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 66, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 70, 108, 111, 97, 116, 83, 108, 105, 100, 101, 114, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 70, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 70, 108, 111, 97, 116, 83, 116, 101, 112, 83, 108, 105, 100, 101, 114, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 68, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 71, 101, 110, 101, 114, 105, 99, 66, 117, 116, 116, 111, 110, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 68, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 73, 110, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 64, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 73, 110, 116, 83, 108, 105, 100, 101, 114, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 2, 0, 0, 0, 64, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 77, 111, 100, 67, 111, 110, 102, 105, 103, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 69, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 92, 84, 101, 120, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 47, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 110, 102, 105, 103, 73, 110, 102, 111, 66, 111, 120, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 44, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 110, 102, 105, 103, 76, 105, 115, 116, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 44, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 110, 102, 105, 103, 77, 101, 110, 117, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 56, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 67, 111, 110, 102, 105, 103, 77, 101, 110, 117, 78, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 48, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 66, 111, 120, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 65, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 77, 97, 110, 97, 103, 101, 114, 115, 92, 67, 111, 110, 102, 105, 103, 77, 101, 110, 117, 65, 117, 100, 105, 111, 77, 97, 110, 97, 103, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 60, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 77, 97, 110, 97, 103, 101, 114, 115, 92, 67, 111, 110, 102, 105, 103, 77, 101, 110, 117, 77, 97, 110, 97, 103, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 44, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 77, 111, 100, 73, 110, 102, 111, 66, 111, 120, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 41, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 77, 111, 100, 76, 105, 115, 116, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 45, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 77, 111, 100, 76, 105, 115, 116, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 47, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 83, 101, 99, 116, 105, 111, 110, 72, 101, 97, 100, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 41, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 84, 111, 111, 108, 116, 105, 112, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 47, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 84, 111, 111, 108, 116, 105, 112, 83, 121, 115, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 48, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 84, 111, 111, 108, 116, 105, 112, 84, 114, 105, 103, 103, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 46, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 92, 86, 101, 114, 115, 105, 111, 110, 76, 97, 98, 101, 108, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 45, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 80, 97, 116, 99, 104, 101, 115, 92, 77, 101, 110, 117, 77, 97, 110, 97, 103, 101, 114, 80, 97, 116, 99, 104, 101, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 50, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 80, 97, 116, 99, 104, 101, 115, 92, 81, 117, 105, 99, 107, 77, 101, 110, 117, 77, 97, 110, 97, 103, 101, 114, 80, 97, 116, 99, 104, 101, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 43, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 85, 116, 105, 108, 115, 92, 65, 115, 115, 101, 109, 98, 108, 121, 69, 120, 116, 101, 110, 115, 105, 111, 110, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 31, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 85, 116, 105, 108, 115, 92, 65, 115, 115, 101, 116, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 33, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 85, 116, 105, 108, 115, 92, 76, 111, 103, 85, 116, 105, 108, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 35, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 85, 116, 105, 108, 115, 92, 77, 101, 110, 117, 115, 85, 116, 105, 108, 115, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 34, 92, 65, 115, 115, 101, 116, 115, 92, 83, 99, 114, 105, 112, 116, 115, 92, 85, 116, 105, 108, 115, 92, 80, 97, 116, 104, 85, 116, 105, 108, 115, 46, 99, 115 }; result.TypesData = new byte[3298] { 0, 0, 0, 0, 43, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 65, 117, 116, 111, 67, 111, 110, 102, 105, 103, 124, 65, 117, 116, 111, 67, 111, 110, 102, 105, 103, 71, 101, 110, 101, 114, 97, 116, 111, 114, 0, 0, 0, 0, 58, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 65, 117, 116, 111, 67, 111, 110, 102, 105, 103, 46, 65, 117, 116, 111, 67, 111, 110, 102, 105, 103, 71, 101, 110, 101, 114, 97, 116, 111, 114, 124, 65, 117, 116, 111, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 39, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 65, 117, 116, 111, 67, 111, 110, 102, 105, 103, 124, 67, 111, 110, 102, 105, 103, 69, 110, 116, 114, 121, 80, 97, 116, 104, 0, 0, 0, 0, 39, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 66, 97, 115, 101, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 44, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 66, 97, 115, 101, 86, 97, 108, 117, 101, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 47, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 66, 111, 111, 108, 67, 104, 101, 99, 107, 66, 111, 120, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 47, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 69, 110, 117, 109, 68, 114, 111, 112, 68, 111, 119, 110, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 50, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 70, 108, 111, 97, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 46, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 70, 108, 111, 97, 116, 83, 108, 105, 100, 101, 114, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 50, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 70, 108, 111, 97, 116, 83, 116, 101, 112, 83, 108, 105, 100, 101, 114, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 48, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 71, 101, 110, 101, 114, 105, 99, 66, 117, 116, 116, 111, 110, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 48, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 73, 110, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 44, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 73, 110, 116, 83, 108, 105, 100, 101, 114, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 44, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 66, 97, 115, 101, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 49, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 66, 97, 115, 101, 82, 97, 110, 103, 101, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 52, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 66, 111, 111, 108, 67, 104, 101, 99, 107, 66, 111, 120, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 48, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 67, 97, 110, 77, 111, 100, 105, 102, 121, 82, 101, 115, 117, 108, 116, 0, 0, 0, 0, 52, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 69, 110, 117, 109, 68, 114, 111, 112, 68, 111, 119, 110, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 55, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 70, 108, 111, 97, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 51, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 70, 108, 111, 97, 116, 83, 108, 105, 100, 101, 114, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 55, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 70, 108, 111, 97, 116, 83, 116, 101, 112, 83, 108, 105, 100, 101, 114, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 53, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 71, 101, 110, 101, 114, 105, 99, 66, 117, 116, 116, 111, 110, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 53, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 73, 110, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 49, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 73, 110, 116, 83, 108, 105, 100, 101, 114, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 54, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 46, 79, 112, 116, 105, 111, 110, 115, 124, 84, 101, 120, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 79, 112, 116, 105, 111, 110, 115, 0, 0, 0, 0, 49, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 115, 124, 84, 101, 120, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 102, 105, 103, 73, 116, 101, 109, 0, 0, 0, 0, 32, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 124, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 77, 97, 110, 97, 103, 101, 114, 0, 0, 0, 0, 23, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 124, 80, 108, 117, 103, 105, 110, 73, 110, 102, 111, 0, 0, 0, 0, 31, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 124, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 80, 108, 117, 103, 105, 110, 0, 0, 0, 0, 21, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 100, 115, 124, 77, 111, 100, 0, 0, 0, 0, 25, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 100, 115, 124, 77, 111, 100, 73, 110, 102, 111, 0, 0, 0, 0, 38, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 100, 115, 124, 84, 104, 117, 110, 100, 101, 114, 115, 116, 111, 114, 101, 77, 97, 110, 105, 102, 101, 115, 116, 0, 0, 0, 0, 61, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 66, 111, 111, 108, 67, 104, 101, 99, 107, 66, 111, 120, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 0, 0, 0, 0, 61, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 69, 110, 117, 109, 68, 114, 111, 112, 68, 111, 119, 110, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 0, 0, 0, 0, 64, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 70, 108, 111, 97, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 0, 0, 0, 0, 60, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 70, 108, 111, 97, 116, 83, 108, 105, 100, 101, 114, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 0, 0, 0, 0, 64, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 70, 108, 111, 97, 116, 83, 116, 101, 112, 83, 108, 105, 100, 101, 114, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 0, 0, 0, 0, 62, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 71, 101, 110, 101, 114, 105, 99, 66, 117, 116, 116, 111, 110, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 0, 0, 0, 0, 62, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 73, 110, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 0, 0, 0, 0, 58, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 73, 110, 116, 83, 108, 105, 100, 101, 114, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 1, 0, 0, 0, 58, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 77, 111, 100, 67, 111, 110, 102, 105, 103, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 1, 0, 0, 0, 58, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 77, 111, 100, 67, 111, 110, 102, 105, 103, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 0, 0, 0, 0, 63, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 67, 111, 109, 112, 111, 110, 101, 110, 116, 115, 124, 84, 101, 120, 116, 73, 110, 112, 117, 116, 70, 105, 101, 108, 100, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 0, 0, 0, 0, 41, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 67, 111, 110, 102, 105, 103, 73, 110, 102, 111, 66, 111, 120, 0, 0, 0, 0, 38, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 67, 111, 110, 102, 105, 103, 76, 105, 115, 116, 0, 0, 0, 0, 38, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 67, 111, 110, 102, 105, 103, 77, 101, 110, 117, 0, 0, 0, 0, 50, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 67, 111, 110, 102, 105, 103, 77, 101, 110, 117, 78, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, 0, 0, 0, 0, 42, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 66, 111, 120, 0, 0, 0, 0, 59, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 77, 97, 110, 97, 103, 101, 114, 115, 124, 67, 111, 110, 102, 105, 103, 77, 101, 110, 117, 65, 117, 100, 105, 111, 77, 97, 110, 97, 103, 101, 114, 0, 0, 0, 0, 54, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 46, 77, 97, 110, 97, 103, 101, 114, 115, 124, 67, 111, 110, 102, 105, 103, 77, 101, 110, 117, 77, 97, 110, 97, 103, 101, 114, 0, 0, 0, 0, 38, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 77, 111, 100, 73, 110, 102, 111, 66, 111, 120, 0, 0, 0, 0, 35, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 77, 111, 100, 76, 105, 115, 116, 0, 0, 0, 0, 39, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 77, 111, 100, 76, 105, 115, 116, 73, 116, 101, 109, 0, 0, 0, 0, 41, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 83, 101, 99, 116, 105, 111, 110, 72, 101, 97, 100, 101, 114, 0, 0, 0, 0, 35, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 84, 111, 111, 108, 116, 105, 112, 0, 0, 0, 0, 41, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 84, 111, 111, 108, 116, 105, 112, 83, 121, 115, 116, 101, 109, 0, 0, 0, 0, 42, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 84, 111, 111, 108, 116, 105, 112, 84, 114, 105, 103, 103, 101, 114, 0, 0, 0, 0, 40, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 77, 111, 110, 111, 66, 101, 104, 97, 118, 105, 111, 117, 114, 115, 124, 86, 101, 114, 115, 105, 111, 110, 76, 97, 98, 101, 108, 0, 0, 0, 0, 39, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 80, 97, 116, 99, 104, 101, 115, 124, 77, 101, 110, 117, 77, 97, 110, 97, 103, 101, 114, 80, 97, 116, 99, 104, 101, 115, 0, 0, 0, 0, 44, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 80, 97, 116, 99, 104, 101, 115, 124, 81, 117, 105, 99, 107, 77, 101, 110, 117, 77, 97, 110, 97, 103, 101, 114, 80, 97, 116, 99, 104, 101, 115, 0, 0, 0, 0, 37, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 85, 116, 105, 108, 115, 124, 65, 115, 115, 101, 109, 98, 108, 121, 69, 120, 116, 101, 110, 115, 105, 111, 110, 115, 0, 0, 0, 0, 25, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 85, 116, 105, 108, 115, 124, 65, 115, 115, 101, 116, 115, 0, 0, 0, 0, 27, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 85, 116, 105, 108, 115, 124, 76, 111, 103, 85, 116, 105, 108, 115, 0, 0, 0, 0, 32, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 83, 101, 116, 116, 105, 110, 103, 115, 124, 77, 101, 110, 117, 115, 85, 116, 105, 108, 115, 0, 0, 0, 0, 28, 76, 101, 116, 104, 97, 108, 67, 111, 110, 102, 105, 103, 46, 85, 116, 105, 108, 115, 124, 80, 97, 116, 104, 85, 116, 105, 108, 115 }; result.TotalFiles = 61; result.TotalTypes = 65; result.IsEditorOnly = false; return result; } } namespace LethalConfig { public static class LethalConfigManager { private static bool hasGeneratedMissingConfigs = false; internal static Dictionary<string, Mod> Mods { get; private set; } = new Dictionary<string, Mod>(); private static Dictionary<Mod, Assembly> ModToAssemblyMap { get; set; } = new Dictionary<Mod, Assembly>(); internal static void AutoGenerateMissingConfigsIfNeeded() { if (hasGeneratedMissingConfigs) { return; } Mod[] second = Mods.Values.ToArray(); IEnumerable<BaseConfigItem> existingConfigsFlat = Mods.SelectMany((KeyValuePair<string, Mod> kv) => kv.Value.configItems); AutoConfigGenerator.AutoConfigItem[] array = AutoConfigGenerator.AutoGenerateConfigs(); Dictionary<Mod, IEnumerable<BaseConfigItem>> dictionary = (from c in array group c.ConfigItem by ModForAssembly(c.Assembly) into kv where kv.Key != null select kv).SelectMany((IGrouping<Mod, BaseConfigItem> kv) => from c in kv.Select(delegate(BaseConfigItem c) { c.Owner = kv.Key; return c; }) where !kv.Key.entriesToSkipAutoGen.Any((ConfigEntryPath path) => path.Matches(c)) where existingConfigsFlat.FirstOrDefault((BaseConfigItem ec) => c.IsSameConfig(ec)) == null group c by c.Owner).ToDictionary((IGrouping<Mod, BaseConfigItem> kv) => kv.Key, (IGrouping<Mod, BaseConfigItem> kv) => kv.Select((BaseConfigItem c) => c)); Mod[] array2 = dictionary.Keys.Except(second).ToArray(); Mod[] array3 = array2; foreach (Mod obj in array3) { obj.IsAutoGenerated = true; obj.modInfo.Description += "\n*This mod entry was automatically generated as it does not use LethalConfig directly."; } foreach (KeyValuePair<Mod, IEnumerable<BaseConfigItem>> item in dictionary) { Assembly valueOrDefault = ModToAssemblyMap.GetValueOrDefault(item.Key); if (!(valueOrDefault != null)) { continue; } foreach (BaseConfigItem item2 in item.Value) { AddConfigItemForAssembly(item2, valueOrDefault); } } LogUtils.LogInfo($"Generated {array2.Count()} mod entries."); LogUtils.LogInfo($"Generated {array.Length} configs, of which {dictionary.SelectMany((KeyValuePair<Mod, IEnumerable<BaseConfigItem>> kv) => kv.Value).Count()} were missing and registered."); hasGeneratedMissingConfigs = true; } public static void AddConfigItem(BaseConfigItem configItem) { if (AddConfigItemForAssembly(configItem, Assembly.GetCallingAssembly())) { LogUtils.LogInfo($"Registered config \"{configItem}\""); } } private static bool AddConfigItemForAssembly(BaseConfigItem configItem, Assembly assembly) { Mod mod = ModForAssembly(assembly); if (mod == null) { LogUtils.LogWarning("Mod for assembly not found."); return false; } configItem.Owner = mod; if (mod.configItems.Where((BaseConfigItem c) => c.IsSameConfig(configItem)).Count() > 0) { LogUtils.LogWarning($"Ignoring duplicated config \"{configItem}\""); return false; } mod.AddConfigItem(configItem); return true; } private static Mod ModForAssembly(Assembly assembly) { if (assembly.TryGetModInfo(out var modInfo)) { if (Mods.TryGetValue(modInfo.GUID, out var value)) { return value; } Mod mod = new Mod(modInfo); Mods.Add(modInfo.GUID, mod); ModToAssemblyMap.Add(mod, assembly); return mod; } return null; } public static void SetModIcon(Sprite sprite) { if (!((Object)(object)sprite == (Object)null)) { Mod mod = ModForAssembly(Assembly.GetCallingAssembly()); if (mod != null) { mod.modInfo.Icon = sprite; } } } public static void SetModDescription(string description) { if (description != null) { Mod mod = ModForAssembly(Assembly.GetCallingAssembly()); if (mod != null) { mod.modInfo.Description = description; } } } public static void SkipAutoGenFor(string configSection) { ModForAssembly(Assembly.GetCallingAssembly())?.entriesToSkipAutoGen.Add(new ConfigEntryPath(configSection, "*")); } public static void SkipAutoGenFor(ConfigEntryBase configEntryBase) { ModForAssembly(Assembly.GetCallingAssembly())?.entriesToSkipAutoGen.Add(new ConfigEntryPath(configEntryBase.Definition.Section, configEntryBase.Definition.Key)); } public static void SkipAutoGen() { ModForAssembly(Assembly.GetCallingAssembly())?.entriesToSkipAutoGen.Add(new ConfigEntryPath("*", "*")); } } internal static class PluginInfo { public const string Guid = "ainavt.lc.lethalconfig"; public const string Name = "LethalConfig"; public const string Version = "1.3.4"; } [BepInPlugin("ainavt.lc.lethalconfig", "LethalConfig", "1.3.4")] internal class LethalConfigPlugin : BaseUnityPlugin { private enum TestEnum { None, First, Second } private static LethalConfigPlugin instance; private static Harmony harmony; private void Awake() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown if ((Object)(object)instance == (Object)null) { instance = this; } LogUtils.Init("ainavt.lc.lethalconfig"); Assets.Init(); harmony = new Harmony("ainavt.lc.lethalconfig"); harmony.PatchAll(); CreateExampleConfigs(); LogUtils.LogInfo("LethalConfig loaded!"); } private void CreateExampleConfigs() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Expected O, but got Unknown //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown ConfigEntry<int> configEntry = ((BaseUnityPlugin)this).Config.Bind<int>("Example", "Int Slider", 30, new ConfigDescription("This is an integer slider. You can also type a value in the input field to the right of the slider.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>())); ConfigEntry<float> configEntry2 = ((BaseUnityPlugin)this).Config.Bind<float>("Example", "Float Slider", 0f, new ConfigDescription("This is a float slider. You can also type a value in the input field to the right of the slider.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 1f), Array.Empty<object>())); ConfigEntry<float> configEntry3 = ((BaseUnityPlugin)this).Config.Bind<float>("Example", "Float Step Slider", 0f, new ConfigDescription("This is a float step slider. It set values in increments. You can also type a value in the input field to the right of the slider.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 1f), Array.Empty<object>())); ConfigEntry<bool> configEntry4 = ((BaseUnityPlugin)this).Config.Bind<bool>("Example", "Bool Checkbox", false, new ConfigDescription("This is a bool checkbox.", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<TestEnum> configEntry5 = ((BaseUnityPlugin)this).Config.Bind<TestEnum>("Example", "Enum Dropdown", TestEnum.None, new ConfigDescription("This is a enum dropdown.", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> configEntry6 = ((BaseUnityPlugin)this).Config.Bind<string>("Example", "Text Input", "Example", "This is a text input field. It can have a limit of characters too."); ConfigEntry<int> configEntry7 = ((BaseUnityPlugin)this).Config.Bind<int>("Example", "Int Input", 50, "This is an integer input field."); ConfigEntry<float> configEntry8 = ((BaseUnityPlugin)this).Config.Bind<float>("Example", "Float Input", 0.5f, "This is a float input field."); LethalConfigManager.AddConfigItem(new IntSliderConfigItem(configEntry, requiresRestart: false)); LethalConfigManager.AddConfigItem(new FloatSliderConfigItem(configEntry2, requiresRestart: false)); LethalConfigManager.AddConfigItem(new FloatStepSliderConfigItem(configEntry3, new FloatStepSliderOptions { Step = 0.1f, RequiresRestart = false, Min = -1f, Max = 1f })); LethalConfigManager.AddConfigItem(new BoolCheckBoxConfigItem(configEntry4, requiresRestart: false)); LethalConfigManager.AddConfigItem(new EnumDropDownConfigItem<TestEnum>(configEntry5, requiresRestart: false)); LethalConfigManager.AddConfigItem(new TextInputFieldConfigItem(configEntry6, requiresRestart: false)); LethalConfigManager.AddConfigItem(new GenericButtonConfigItem("Example", "Button", "This is a test button with a callback", "Open", delegate { ConfigMenuManager.Instance?.DisplayNotification("Buttons can be used to open custom menus or other things.", "OK"); })); LethalConfigManager.AddConfigItem(new IntInputFieldConfigItem(configEntry7, new IntInputFieldOptions { Max = 150 })); LethalConfigManager.AddConfigItem(new FloatInputFieldConfigItem(configEntry8, new FloatInputFieldOptions { Max = 2.5f })); } } } namespace LethalConfig.Settings { internal static class MenusUtils { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__0_0; public static UnityAction <>9__0_1; public static Func<Button, GameObject> <>9__0_2; public static Func<GameObject, RectTransform> <>9__0_4; public static Func<RectTransform, float> <>9__0_5; public static Func<float, float, float> <>9__0_6; internal void <InjectMenu>b__0_0() { ConfigMenuManager.Instance.ShowConfigMenu(); } internal void <InjectMenu>b__0_1() { ConfigMenuManager.Instance.menuAudio.PlayConfirmSFX(); } internal GameObject <InjectMenu>b__0_2(Button b) { return ((Component)b).gameObject; } internal RectTransform <InjectMenu>b__0_4(GameObject b) { Transform transform = b.transform; return (RectTransform)(object)((transform is RectTransform) ? transform : null); } internal float <InjectMenu>b__0_5(RectTransform t) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return t.anchoredPosition.y; } internal float <InjectMenu>b__0_6(float y1, float y2) { return Mathf.Abs(y2 - y1); } } internal static void InjectMenu(Transform parentTransform, Transform mainButtonsTransform, GameObject quitButton) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Expected O, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Expected O, but got Unknown //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Expected O, but got Unknown //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_02b6: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) //IL_02c6: Unknown result type (might be due to invalid IL or missing references) GameObject obj = Object.Instantiate<GameObject>(Assets.ConfigMenuManagerPrefab); obj.transform.SetParent(parentTransform); obj.transform.localPosition = Vector3.zero; GameObject obj2 = Object.Instantiate<GameObject>(Assets.ConfigMenuPrefab); obj2.transform.SetParent(parentTransform, false); obj2.transform.localPosition = Vector3.zero; obj2.transform.localScale = Vector3.one; obj2.transform.localRotation = Quaternion.identity; obj2.SetActive(false); GameObject obj3 = Object.Instantiate<GameObject>(Assets.ConfigMenuNotificationPrefab); obj3.transform.SetParent(parentTransform, false); obj3.transform.localPosition = Vector3.zero; obj3.transform.localScale = Vector3.one; obj3.transform.localRotation = Quaternion.identity; obj3.SetActive(false); GameObject clonedButton = Object.Instantiate<GameObject>(quitButton, mainButtonsTransform); ((UnityEventBase)clonedButton.GetComponent<Button>().onClick).RemoveAllListeners(); clonedButton.GetComponent<Button>().onClick = new ButtonClickedEvent(); ButtonClickedEvent onClick = clonedButton.GetComponent<Button>().onClick; object obj4 = <>c.<>9__0_0; if (obj4 == null) { UnityAction val = delegate { ConfigMenuManager.Instance.ShowConfigMenu(); }; <>c.<>9__0_0 = val; obj4 = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj4); ButtonClickedEvent onClick2 = clonedButton.GetComponent<Button>().onClick; object obj5 = <>c.<>9__0_1; if (obj5 == null) { UnityAction val2 = delegate { ConfigMenuManager.Instance.menuAudio.PlayConfirmSFX(); }; <>c.<>9__0_1 = val2; obj5 = (object)val2; } ((UnityEvent)onClick2).AddListener((UnityAction)obj5); ((TMP_Text)clonedButton.GetComponentInChildren<TextMeshProUGUI>()).text = "> LethalConfig"; IEnumerable<GameObject> source = from b in ((Component)mainButtonsTransform).GetComponentsInChildren<Button>() select ((Component)b).gameObject; IEnumerable<float> enumerable = from t in source.Where((GameObject b) => (Object)(object)b != (Object)(object)clonedButton).Select(delegate(GameObject b) { Transform transform = b.transform; return (RectTransform)(object)((transform is RectTransform) ? transform : null); }) select t.anchoredPosition.y; float num = enumerable.Zip(enumerable.Skip(1), (float y1, float y2) => Mathf.Abs(y2 - y1)).Min(); foreach (GameObject item in source.Where((GameObject g) => (Object)(object)g != (Object)(object)quitButton)) { RectTransform component = item.GetComponent<RectTransform>(); component.anchoredPosition += new Vector2(0f, num); } clonedButton.GetComponent<RectTransform>().anchoredPosition = quitButton.GetComponent<RectTransform>().anchoredPosition + new Vector2(0f, num); } } } namespace LethalConfig.Utils { internal static class AssemblyExtensions { internal static bool TryGetModInfo(this Assembly assembly, out ModInfo modInfo) { modInfo = new ModInfo(); BepInPlugin val = assembly.FindPluginAttribute(); if (val == null) { return false; } modInfo.Name = val.Name; modInfo.GUID = val.GUID; modInfo.Version = val.Version.ToString(); return true; } internal static BepInPlugin FindPluginAttribute(this Assembly assembly) { Type[] array; try { array = assembly.GetTypes(); } catch (ReflectionTypeLoadException ex) { array = ex.Types.Where((Type t) => t != null).ToArray(); } Type[] array2 = array; for (int i = 0; i < array2.Length; i++) { BepInPlugin customAttribute = ((MemberInfo)array2[i]).GetCustomAttribute<BepInPlugin>(); if (customAttribute != null) { return customAttribute; } } return null; } } internal static class Assets { private static AssetBundle assetBundle; internal static GameObject ConfigMenuManagerPrefab; internal static GameObject ConfigMenuNotificationPrefab; internal static GameObject ConfigMenuPrefab; internal static GameObject ModListItemPrefab; internal static GameObject SectionHeaderPrefab; internal static GameObject IntSliderPrefab; internal static GameObject FloatSliderPrefab; internal static GameObject FloatStepSliderPrefab; internal static GameObject BoolCheckBoxPrefab; internal static GameObject EnumDropDownPrefab; internal static GameObject TextInputFieldPrefab; internal static GameObject IntInputFieldPrefab; internal static GameObject FloatInputFieldPrefab; internal static GameObject GenericButtonPrefab; internal static Sprite DefaultModIcon; internal static Sprite LethalConfigModIcon; internal static void Init() { assetBundle = AssetBundle.LoadFromFile(PathUtils.PathForResourceInAssembly("ainavt_lethalconfig")); if ((Object)(object)assetBundle == (Object)null) { LogUtils.LogError("Failed to load LethalConfig bundle."); return; } LoadAsset<GameObject>("prefabs/ConfigMenuManager.prefab", out ConfigMenuManagerPrefab); LoadAsset<GameObject>("prefabs/ConfigMenuNotification.prefab", out ConfigMenuNotificationPrefab); LoadAsset<GameObject>("prefabs/ConfigMenu.prefab", out ConfigMenuPrefab); LoadAsset<GameObject>("prefabs/ModListItem.prefab", out ModListItemPrefab); LoadAsset<GameObject>("prefabs/components/SectionHeader.prefab", out SectionHeaderPrefab); LoadAsset<GameObject>("prefabs/components/IntSliderItem.prefab", out IntSliderPrefab); LoadAsset<GameObject>("prefabs/components/FloatSliderItem.prefab", out FloatSliderPrefab); LoadAsset<GameObject>("prefabs/components/FloatStepSliderItem.prefab", out FloatStepSliderPrefab); LoadAsset<GameObject>("prefabs/components/BoolCheckBoxItem.prefab", out BoolCheckBoxPrefab); LoadAsset<GameObject>("prefabs/components/EnumDropDownItem.prefab", out EnumDropDownPrefab); LoadAsset<GameObject>("prefabs/components/TextInputFieldItem.prefab", out TextInputFieldPrefab); LoadAsset<GameObject>("prefabs/components/IntInputFieldItem.prefab", out IntInputFieldPrefab); LoadAsset<GameObject>("prefabs/components/FloatInputFieldItem.prefab", out FloatInputFieldPrefab); LoadAsset<GameObject>("prefabs/components/GenericButtonItem.prefab", out GenericButtonPrefab); LoadAsset<Sprite>("sprite/unknown-icon.png", out DefaultModIcon); LoadAsset<Sprite>("icon.png", out LethalConfigModIcon); LogUtils.LogInfo("Finished loading assets."); } private static void LoadAsset<T>(string assetName, out T asset) where T : Object { string text = "Assets/" + assetName; asset = assetBundle.LoadAsset<T>(text); if ((Object)(object)asset == (Object)null) { LogUtils.LogError("Failed to load asset (" + text + ")"); } } } internal static class LogUtils { private static Dictionary<Assembly, ManualLogSource> logSources = new Dictionary<Assembly, ManualLogSource>(); public static void Init(string pluginGuid) { Assembly callingAssembly = Assembly.GetCallingAssembly(); if (!logSources.ContainsKey(callingAssembly)) { logSources.Add(callingAssembly, Logger.CreateLogSource(pluginGuid)); } } public static void LogInfo(string message) { logSources[Assembly.GetCallingAssembly()].LogInfo((object)message); } public static void LogWarning(string message) { logSources[Assembly.GetCallingAssembly()].LogWarning((object)message); } public static void LogError(string message) { logSources[Assembly.GetCallingAssembly()].LogError((object)message); } public static void LogFatal(string message) { logSources[Assembly.GetCallingAssembly()].LogFatal((object)message); } } internal static class PathUtils { public static string PathForResourceInAssembly(string resourceName, Assembly assembly = null) { return Path.Combine(Path.GetDirectoryName((assembly ?? Assembly.GetCallingAssembly()).Location), resourceName); } } } namespace LethalConfig.Patches { [HarmonyPatch(typeof(MenuManager))] internal class MenuManagerPatches { [HarmonyPatch("Start")] [HarmonyPostfix] public static void StartPostFix(MenuManager __instance) { ((MonoBehaviour)__instance).StartCoroutine(DelayedMainMenuInjection()); } private static IEnumerator DelayedMainMenuInjection() { yield return (object)new WaitForSeconds(0f); InjectToMainMenu(); } private static void InjectToMainMenu() { LogUtils.LogInfo("Injecting mod config menu into main menu..."); GameObject val = GameObject.Find("MenuContainer"); Transform val2 = ((val != null) ? val.transform.Find("MainButtons") : null); object obj; if (val2 == null) { obj = null; } else { Transform obj2 = val2.Find("QuitButton"); obj = ((obj2 != null) ? ((Component)obj2).gameObject : null); } GameObject val3 = (GameObject)obj; if (!((Object)(object)val == (Object)null) && !((Object)(object)val2 == (Object)null) && !((Object)(object)val3 == (Object)null)) { MenusUtils.InjectMenu(val.transform, val2, val3); } } } [HarmonyPatch(typeof(QuickMenuManager))] internal class QuickMenuManagerPatches { [HarmonyPatch("CloseQuickMenuPanels")] [HarmonyPostfix] public static void CloseQuickMenuPanelsPostFix(QuickMenuManager __instance) { ConfigMenu componentInChildren = ((Component)__instance.menuContainer.transform).GetComponentInChildren<ConfigMenu>(true); ConfigMenuNotification componentInChildren2 = ((Component)__instance.menuContainer.transform).GetComponentInChildren<ConfigMenuNotification>(true); componentInChildren?.Close(animated: false); componentInChildren2?.Close(animated: false); } [HarmonyPatch("Start")] [HarmonyPostfix] public static void StartPostFix(QuickMenuManager __instance) { LogUtils.LogInfo("Injecting mod config menu into quick menu..."); GameObject menuContainer = __instance.menuContainer; Transform val = ((menuContainer != null) ? menuContainer.transform.Find("MainButtons") : null); GameObject val2 = ((val != null) ? ((Component)val.Find("Quit")).gameObject : null); if (!((Object)(object)menuContainer == (Object)null) && !((Object)(object)val == (Object)null) && !((Object)(object)val2 == (Object)null)) { MenusUtils.InjectMenu(menuContainer.transform, val, val2); } } } } namespace LethalConfig.MonoBehaviours { internal class ConfigInfoBox : MonoBehaviour { public TextMeshProUGUI configInfoText; public void SetConfigInfo(string configInfo) { ((TMP_Text)configInfoText).text = configInfo; } } internal class ConfigList : MonoBehaviour { public GameObject listContainerObject; public DescriptionBox descriptionBox; internal void LoadConfigsForMod(Mod mod) { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) ClearConfigList(); foreach (IGrouping<string, BaseConfigItem> item in from c in mod.configItems group c by c.Section) { GameObject obj = Object.Instantiate<GameObject>(Assets.SectionHeaderPrefab); obj.GetComponent<SectionHeader>().SetSectionName(item.Key); obj.transform.SetParent(listContainerObject.transform); obj.transform.localPosition = Vector3.zero; obj.transform.localScale = Vector3.one; obj.transform.localRotation = Quaternion.identity; foreach (BaseConfigItem item2 in item) { GameObject val = item2.CreateGameObjectForConfig(); ModConfigController controller = val.GetComponent<ModConfigController>(); if (!controller.SetConfigItem(item2)) { Object.DestroyImmediate((Object)(object)val.gameObject); return; } val.transform.SetParent(listContainerObject.transform); val.transform.localPosition = Vector3.zero; val.transform.localScale = Vector3.one; val.transform.localRotation = Quaternion.identity; controller.OnHoverEnter += delegate { descriptionBox.ShowConfigInfo(controller.GetDescription()); ConfigMenuManager.Instance.menuAudio.PlayHoverSFX(); }; } } } private void ClearConfigList() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) foreach (Transform item in listContainerObject.transform) { Object.Destroy((Object)(object)((Component)item).gameObject); } } } internal class ConfigMenu : MonoBehaviour { public ConfigList configList; public Animator menuAnimator; private void Awake() { LethalConfigManager.AutoGenerateMissingConfigsIfNeeded(); } public void Open() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) AnimatorStateInfo currentAnimatorStateInfo = menuAnimator.GetCurrentAnimatorStateInfo(0); if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("ConfigMenuNormal") && !((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("ConfigMenuAppear")) { ((Component)this).gameObject.SetActive(true); menuAnimator.SetTrigger("Open"); ((Component)this).transform.SetAsLastSibling(); } } public void Close(bool animated = true) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) AnimatorStateInfo currentAnimatorStateInfo = menuAnimator.GetCurrentAnimatorStateInfo(0); if (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("ConfigMenuClosed") || ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("ConfigMenuDisappear")) { return; } foreach (BaseConfigItem item in LethalConfigManager.Mods.SelectMany((KeyValuePair<string, Mod> m) => m.Value.configItems)) { item.CancelChanges(); } UpdateAppearanceOfCurrentComponents(); if (!animated) { ((Component)this).gameObject.SetActive(false); menuAnimator.SetTrigger("ForceClose"); } else { menuAnimator.SetTrigger("Close"); } } public void OnCloseAnimationEnd() { ((Component)this).gameObject.SetActive(false); } public void OnCancelButtonClicked() { Close(); ConfigMenuManager.Instance.menuAudio.PlayCancelSFX(); } public void OnApplyButtonClicked() { List<BaseConfigItem> list = (from c in LethalConfigManager.Mods.SelectMany((KeyValuePair<string, Mod> m) => m.Value.configItems) where c.HasValueChanged select c).ToList(); List<BaseConfigItem> list2 = list.Where((BaseConfigItem c) => c.RequiresRestart).ToList(); foreach (BaseConfigItem item in list) { item.ApplyChanges(); } UpdateAppearanceOfCurrentComponents(); ConfigMenuManager.Instance.menuAudio.PlayConfirmSFX(); LogUtils.LogInfo($"Saved config values for {list.Count} items."); LogUtils.LogInfo($"Modified {list2.Count} item(s) that requires a restart."); if (list2.Count > 0) { ConfigMenuManager.Instance.DisplayNotification("Some of the modified settings may require a restart to take effect.", "OK"); } } private void UpdateAppearanceOfCurrentComponents() { ModConfigController[] componentsInChildren = ((Component)configList).GetComponentsInChildren<ModConfigController>(); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].UpdateAppearance(); } } } internal class ConfigMenuNotification : MonoBehaviour { public TextMeshProUGUI messageTextComponent; public TextMeshProUGUI buttonTextComponent; public Animator notificationAnimator; public void SetNotificationContent(string text, string button) { ((TMP_Text)messageTextComponent).text = text; ((TMP_Text)buttonTextComponent).text = "[" + button + "]"; } public void Open() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) AnimatorStateInfo currentAnimatorStateInfo = notificationAnimator.GetCurrentAnimatorStateInfo(0); if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("NotificationNormal") && !((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("NotificationAppear")) { ((Component)this).gameObject.SetActive(true); notificationAnimator.SetTrigger("Open"); ((Component)this).transform.SetAsLastSibling(); } } public void Close(bool animated = true) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) AnimatorStateInfo currentAnimatorStateInfo = notificationAnimator.GetCurrentAnimatorStateInfo(0); if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("NotificationClosed") && !((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("NotificationDisappear")) { if (!animated) { ((Component)this).gameObject.SetActive(false); notificationAnimator.SetTrigger("ForceClose"); } else { notificationAnimator.SetTrigger("Close"); } } } public void OnButtonClick() { Close(); ConfigMenuManager.Instance.menuAudio.PlayConfirmSFX(); } public void OnCloseAnimationEnd() { ((Component)this).gameObject.SetActive(false); } } internal class DescriptionBox : MonoBehaviour { public ModInfoBox modInfoBox; public ConfigInfoBox configInfoBox; private void Awake() { ((Component)modInfoBox).gameObject.SetActive(false); ((Component)configInfoBox).gameObject.SetActive(false); } public void ShowConfigInfo(string configInfo) { ((Component)configInfoBox).gameObject.SetActive(true); configInfoBox.SetConfigInfo(configInfo); HideModInfo(); } public void HideConfigInfo() { ((Component)configInfoBox).gameObject.SetActive(false); } public void ShowModInfo(Mod mod) { ((Component)modInfoBox).gameObject.SetActive(true); modInfoBox.SetModInfo(mod); HideConfigInfo(); } public void HideModInfo() { ((Component)modInfoBox).gameObject.SetActive(false); } } internal class ModInfoBox : MonoBehaviour { public Image modIconImage; public TextMeshProUGUI modInfoText; public void SetModInfo(Mod mod) { modIconImage.sprite = mod.modInfo.Icon; _ = $"{mod.modInfo}"; ((TMP_Text)modInfoText).text = $"{mod.modInfo}"; } } internal class ModList : MonoBehaviour { public GameObject modItemPrefab; public GameObject listContainerObject; public ConfigList configList; public DescriptionBox descriptionBox; private List<ModListItem> _items; private void Awake() { _items = new List<ModListItem>(); BuildModList(); } private void BuildModList() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) _items.Clear(); foreach (Transform item in listContainerObject.transform) { Object.Destroy((Object)(object)((Component)item).gameObject); } foreach (Mod mod in from m in LethalConfigManager.Mods.Values orderby m.modInfo.GUID != "ainavt.lc.lethalconfig", m.IsAutoGenerated, m.modInfo.Name select m) { GameObject val = Object.Instantiate<GameObject>(modItemPrefab, listContainerObject.transform); val.transform.localScale = Vector3.one; val.transform.localPosition = Vector3.zero; val.transform.localRotation = Quaternion.identity; ModListItem component = val.GetComponent<ModListItem>(); component.mod = mod; component.modSelected += ModSelected; component.OnHoverEnter += delegate { descriptionBox.ShowModInfo(mod); ConfigMenuManager.Instance.menuAudio.PlayHoverSFX(); }; component.OnHoverExit += delegate { descriptionBox.HideModInfo(); }; _items.Add(val.GetComponent<ModListItem>()); } } private void ModSelected(Mod mod) { ConfigMenuManager.Instance.menuAudio.PlayConfirmSFX(); configList.LoadConfigsForMod(mod); _items.First((ModListItem i) => i.mod == mod).SetSelected(selected: true); foreach (ModListItem item in _items.Where((ModListItem i) => i.mod != mod)) { item.SetSelected(selected: false); } } } internal class ModListItem : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler { public delegate void OnHoverHandler(); internal delegate void ModSelectedHandler(Mod mod); public TextMeshProUGUI textMesh; public GameObject selectedBorder; public Image modIcon; private Mod _mod; internal Mod mod { get { return _mod; } set { _mod = value; ((TMP_Text)textMesh).text = _mod.modInfo.Name; modIcon.sprite = _mod.modInfo.Icon; } } public event OnHoverHandler OnHoverEnter; public event OnHoverHandler OnHoverExit; internal event ModSelectedHandler modSelected; public void OnClick() { this.modSelected(_mod); } public void SetSelected(bool selected) { selectedBorder.SetActive(selected); } public void OnPointerEnter(PointerEventData eventData) { this.OnHoverEnter?.Invoke(); } public void OnPointerExit(PointerEventData eventData) { this.OnHoverExit?.Invoke(); } public string GetDescription() { return _mod.modInfo.Name + "\n" + _mod.modInfo.GUID + "\n" + _mod.modInfo.Version; } } internal class SectionHeader : MonoBehaviour { public TextMeshProUGUI textMesh; public void SetSectionName(string sectionName) { ((TMP_Text)textMesh).text = "[" + sectionName + "]"; } } internal class Tooltip : MonoBehaviour { public TextMeshProUGUI textComponent; private RectTransform rectTransform; private Camera uiCamera; public void SetText(string text) { ((TMP_Text)textComponent).text = text; } public void SetTarget(GameObject gameObject) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) ((Component)this).transform.position = gameObject.transform.position; } } internal class TooltipSystem : MonoBehaviour { private static TooltipSystem instance; public Tooltip tooltip; private void Awake() { instance = this; } public static void Show(string content, GameObject target) { if (!((Object)(object)instance == (Object)null)) { ((Component)instance.tooltip).gameObject.SetActive(true); instance.tooltip.SetText(content); instance.tooltip.SetTarget(target); } } public static void Hide() { if (!((Object)(object)instance == (Object)null)) { ((Component)instance.tooltip).gameObject.SetActive(false); } } } internal class TooltipTrigger : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler { public string tooltipText; public void OnPointerEnter(PointerEventData eventData) { TooltipSystem.Show(tooltipText, ((Component)this).gameObject); } public void OnPointerExit(PointerEventData eventData) { TooltipSystem.Hide(); } } internal class VersionLabel : MonoBehaviour { private void Start() { ((TMP_Text)((Component)this).GetComponent<TextMeshProUGUI>()).text = "LethalConfig v1.3.4"; } } } namespace LethalConfig.MonoBehaviours.Managers { internal class ConfigMenuAudioManager : MonoBehaviour { public AudioClip confirmSFX; public AudioClip cancelSFX; public AudioClip selectSFX; public AudioClip hoverSFX; public AudioClip changeValueSFX; public AudioSource audioSource; public void PlayConfirmSFX() { audioSource.PlayOneShot(confirmSFX); } public void PlayCancelSFX() { audioSource.PlayOneShot(cancelSFX); } public void PlayHoverSFX() { audioSource.PlayOneShot(hoverSFX); } public void PlaySelectSFX() { audioSource.PlayOneShot(selectSFX); } public void PlayChangeValueSFX() { audioSource.PlayOneShot(changeValueSFX); } } internal class ConfigMenuManager : MonoBehaviour { public ConfigMenuAudioManager menuAudio; public static ConfigMenuManager Instance { get; private set; } private void Awake() { Instance = this; } private void OnDestroy() { Instance = null; } public void ShowConfigMenu() { Object.FindObjectOfType<ConfigMenu>(true)?.Open(); } public void DisplayNotification(string message, string button) { ConfigMenuNotification configMenuNotification = Object.FindObjectOfType<ConfigMenuNotification>(true); if ((Object)(object)configMenuNotification == (Object)null) { LogUtils.LogWarning("Notification object not found"); return; } configMenuNotification.SetNotificationContent(message, button); configMenuNotification.Open(); EventSystem.current.SetSelectedGameObject(((Component)((Component)configMenuNotification).GetComponentInChildren<Button>()).gameObject); } } } namespace LethalConfig.MonoBehaviours.Components { internal class BoolCheckBoxController : ModConfigController<BoolCheckBoxConfigItem, bool> { public Toggle toggleComponent; public override void UpdateAppearance() { base.UpdateAppearance(); toggleComponent.SetIsOnWithoutNotify(base.ConfigItem.CurrentValue); } protected override void OnSetConfigItem() { toggleComponent.SetIsOnWithoutNotify(base.ConfigItem.CurrentValue); UpdateAppearance(); } public void OnCheckBoxValueChanged(bool value) { base.ConfigItem.CurrentValue = value; UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } } internal class EnumDropDownController : ModConfigController { public TMP_Dropdown dropdownComponent; private Type _enumType; private List<string> _enumNames = new List<string>(); public override string GetDescription() { return base.GetDescription() + "\n\nDefault: " + Enum.GetName(_enumType, baseConfigItem.BoxedDefaultValue); } public override void UpdateAppearance() { base.UpdateAppearance(); int valueWithoutNotify = _enumNames.FindIndex((string e) => e == Enum.GetName(_enumType, baseConfigItem.CurrentBoxedValue)); dropdownComponent.SetValueWithoutNotify(valueWithoutNotify); } protected override void OnSetConfigItem() { _enumType = baseConfigItem.BaseConfigEntry.SettingType; _enumNames = Enum.GetNames(_enumType).ToList(); dropdownComponent.ClearOptions(); dropdownComponent.AddOptions(_enumNames); int valueWithoutNotify = _enumNames.FindIndex((string e) => e == Enum.GetName(_enumType, baseConfigItem.CurrentBoxedValue)); dropdownComponent.SetValueWithoutNotify(valueWithoutNotify); UpdateAppearance(); } public void OnDropDownValueChanged(int index) { baseConfigItem.CurrentBoxedValue = Enum.Parse(_enumType, _enumNames[index]); UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } } internal class FloatInputFieldController : ModConfigController<FloatInputFieldConfigItem, float> { public TMP_InputField textInputField; public override string GetDescription() { string text = base.GetDescription(); if (base.ConfigItem.MinValue != float.MinValue) { text += $"\nMin: {base.ConfigItem.MinValue:0.0#}"; } if (base.ConfigItem.MaxValue != float.MaxValue) { text += $"\nMax: {base.ConfigItem.MaxValue:0.0#}"; } return text; } protected override void OnSetConfigItem() { textInputField.SetTextWithoutNotify($"{base.ConfigItem.CurrentValue}"); UpdateAppearance(); } public void OnInputFieldEndEdit(string value) { if (float.TryParse(value, out var result)) { base.ConfigItem.CurrentValue = Math.Clamp(result, base.ConfigItem.MinValue, base.ConfigItem.MaxValue); } UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } public override void UpdateAppearance() { //IL_003b: Unknown result type (might be due to invalid IL or missing references) base.UpdateAppearance(); textInputField.SetTextWithoutNotify($"{base.ConfigItem.CurrentValue}"); ((Transform)textInputField.textComponent.rectTransform).localPosition = Vector3.zero; } } internal class FloatSliderController : ModConfigController<FloatSliderConfigItem, float> { public Slider sliderComponent; public TMP_InputField valueInputField; public override string GetDescription() { return $"{base.GetDescription()}\nMin: {base.ConfigItem.MinValue:0.0#}\nMax: {base.ConfigItem.MaxValue:0.0#}"; } protected override void OnSetConfigItem() { sliderComponent.SetValueWithoutNotify(base.ConfigItem.CurrentValue); sliderComponent.maxValue = base.ConfigItem.MaxValue; sliderComponent.minValue = base.ConfigItem.MinValue; UpdateAppearance(); } public void OnSliderValueChanged(float value) { base.ConfigItem.CurrentValue = value; UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } public void OnInputFieldEndEdit(string value) { if (float.TryParse(value, out var result)) { base.ConfigItem.CurrentValue = Math.Clamp(result, base.ConfigItem.MinValue, base.ConfigItem.MaxValue); } UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } public override void UpdateAppearance() { base.UpdateAppearance(); sliderComponent.SetValueWithoutNotify(base.ConfigItem.CurrentValue); valueInputField.SetTextWithoutNotify($"{base.ConfigItem.CurrentValue:0.0#}"); } } internal class FloatStepSliderController : ModConfigController<FloatStepSliderConfigItem, float> { public Slider sliderComponent; public TMP_InputField valueInputField; public override string GetDescription() { return $"{base.GetDescription()}\nMin: {base.ConfigItem.MinValue:0.0#}\nMax: {base.ConfigItem.MaxValue:0.0#}"; } protected override void OnSetConfigItem() { sliderComponent.SetValueWithoutNotify(base.ConfigItem.CurrentValue); int num = (int)MathF.Ceiling((base.ConfigItem.MaxValue - base.ConfigItem.MinValue) / MathF.Max(base.ConfigItem.Step, float.Epsilon)); sliderComponent.maxValue = num; sliderComponent.minValue = 0f; sliderComponent.wholeNumbers = true; UpdateAppearance(); } public void OnSliderValueChanged(float value) { base.ConfigItem.CurrentValue = MathF.Round(base.ConfigItem.MinValue + base.ConfigItem.Step * (float)(int)value, 4); UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } public void OnInputFieldEndEdit(string value) { if (float.TryParse(value, out var result)) { base.ConfigItem.CurrentValue = Math.Clamp(result, base.ConfigItem.MinValue, base.ConfigItem.MaxValue); } UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } public override void UpdateAppearance() { base.UpdateAppearance(); sliderComponent.SetValueWithoutNotify((base.ConfigItem.CurrentValue - base.ConfigItem.MinValue) / MathF.Max(base.ConfigItem.Step, float.Epsilon)); valueInputField.SetTextWithoutNotify($"{base.ConfigItem.CurrentValue:0.0#}"); } } internal class GenericButtonController : ModConfigController { public TextMeshProUGUI buttonTextComponent; private GenericButtonConfigItem ConfigItem => baseConfigItem as GenericButtonConfigItem; public override void UpdateAppearance() { base.UpdateAppearance(); ((TMP_Text)buttonTextComponent).text = ConfigItem?.ButtonOptions?.ButtonText ?? "Button"; } protected override void OnSetConfigItem() { UpdateAppearance(); } public void OnButtonClicked() { ConfigMenuManager.Instance.menuAudio.PlayConfirmSFX(); ConfigItem?.ButtonOptions?.ButtonHandler?.Invoke(); } } internal class IntInputFieldController : ModConfigController<IntInputFieldConfigItem, int> { public TMP_InputField textInputField; public override string GetDescription() { string text = base.GetDescription(); if (base.ConfigItem.MinValue != int.MinValue) { text += $"\nMin: {base.ConfigItem.MinValue}"; } if (base.ConfigItem.MaxValue != int.MaxValue) { text += $"\nMax: {base.ConfigItem.MaxValue}"; } return text; } protected override void OnSetConfigItem() { textInputField.SetTextWithoutNotify($"{base.ConfigItem.CurrentValue}"); UpdateAppearance(); } public void OnInputFieldEndEdit(string value) { if (int.TryParse(value, out var result)) { base.ConfigItem.CurrentValue = Math.Clamp(result, base.ConfigItem.MinValue, base.ConfigItem.MaxValue); } UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } public override void UpdateAppearance() { //IL_003b: Unknown result type (might be due to invalid IL or missing references) base.UpdateAppearance(); textInputField.SetTextWithoutNotify($"{base.ConfigItem.CurrentValue}"); ((Transform)textInputField.textComponent.rectTransform).localPosition = Vector3.zero; } } internal class IntSliderController : ModConfigController<IntSliderConfigItem, int> { public Slider sliderComponent; public TMP_InputField valueInputField; public override string GetDescription() { return $"{base.GetDescription()}\nMin: {base.ConfigItem.MinValue}\nMax: {base.ConfigItem.MaxValue}"; } protected override void OnSetConfigItem() { sliderComponent.SetValueWithoutNotify((float)base.ConfigItem.CurrentValue); sliderComponent.maxValue = base.ConfigItem.MaxValue; sliderComponent.minValue = base.ConfigItem.MinValue; UpdateAppearance(); } public void OnSliderValueChanged(float value) { base.ConfigItem.CurrentValue = (int)value; UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } public void OnInputFieldEndEdit(string value) { if (int.TryParse(value, out var result)) { base.ConfigItem.CurrentValue = Math.Clamp(result, base.ConfigItem.MinValue, base.ConfigItem.MaxValue); } UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } public override void UpdateAppearance() { base.UpdateAppearance(); sliderComponent.SetValueWithoutNotify((float)base.ConfigItem.CurrentValue); valueInputField.SetTextWithoutNotify($"{base.ConfigItem.CurrentValue}"); } } internal abstract class ModConfigController : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler { public delegate void OnHoverHandler(); private readonly List<Selectable> _selectables = new List<Selectable>(); protected BaseConfigItem baseConfigItem; protected bool isOnSetup; public TextMeshProUGUI nameTextComponent; public TooltipTrigger tooltipTrigger; protected CanModifyResult CanModify { get { if (baseConfigItem.Options.CanModifyCallback == null) { return true; } return baseConfigItem.Options.CanModifyCallback(); } } public event OnHoverHandler OnHoverEnter; public event OnHoverHandler OnHoverExit; protected virtual void Awake() { ((Behaviour)tooltipTrigger).enabled = false; if (_selectables.Count <= 0) { _selectables.AddRange(((Component)this).GetComponentsInChildren<Selectable>()); } } public virtual bool SetConfigItem(BaseConfigItem configItem) { baseConfigItem = configItem; isOnSetup = true; OnSetConfigItem(); isOnSetup = false; if (baseConfigItem.Options.CanModifyCallback != null) { tooltipTrigger.tooltipText = "<b>Modifying this entry is currently disabled:</b>\n<b>" + CanModify.Reason + "</b>"; } return true; } protected abstract void OnSetConfigItem(); public virtual void UpdateAppearance() { ((TMP_Text)nameTextComponent).text = (baseConfigItem.HasValueChanged ? "* " : "") + baseConfigItem.Name; CanModifyResult canModify = CanModify; foreach (Selectable selectable in _selectables) { selectable.interactable = canModify; } ((Behaviour)tooltipTrigger).enabled = !canModify; } public virtual void ResetToDefault() { ConfigMenuManager.Instance.menuAudio.PlayConfirmSFX(); baseConfigItem.ChangeToDefault(); UpdateAppearance(); } public virtual string GetDescription() { string text = "<b>" + baseConfigItem.Name + "</b>"; if (baseConfigItem.IsAutoGenerated) { text += "\n\n<b>*This config entry was automatically generated and may require a restart*</b>"; } else if (baseConfigItem.RequiresRestart) { text += "\n\n<b>*REQUIRES RESTART*</b>"; } return text + "\n\n" + baseConfigItem.Description; } public void OnPointerEnter(PointerEventData eventData) { this.OnHoverEnter?.Invoke(); } public void OnPointerExit(PointerEventData eventData) { this.OnHoverExit?.Invoke(); } } internal abstract class ModConfigController<T, V> : ModConfigController where T : BaseValueConfigItem<V> { public T ConfigItem => (T)baseConfigItem; public override string GetDescription() { return $"{base.GetDescription()}\n\nDefault: {ConfigItem.Defaultvalue}"; } public override bool SetConfigItem(BaseConfigItem configItem) { if (!(configItem is T)) { LogUtils.LogError("Expected config item of type " + typeof(T).Name + ", but got " + configItem.GetType().Name + " instead."); return false; } return base.SetConfigItem(configItem); } } internal class TextInputFieldController : ModConfigController<TextInputFieldConfigItem, string> { public TMP_InputField textInputField; protected override void OnSetConfigItem() { textInputField.SetTextWithoutNotify(base.ConfigItem.CurrentValue); UpdateAppearance(); } public void OnInputFieldEndEdit(string value) { base.ConfigItem.CurrentValue = value; UpdateAppearance(); ConfigMenuManager.Instance.menuAudio.PlayChangeValueSFX(); } public override void UpdateAppearance() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) base.UpdateAppearance(); textInputField.SetTextWithoutNotify(base.ConfigItem.CurrentValue); ((Transform)textInputField.textComponent.rectTransform).localPosition = Vector3.zero; } } } namespace LethalConfig.Mods { internal class Mod { public ModInfo modInfo; public bool IsAutoGenerated; public List<BaseConfigItem> configItems; public List<ConfigEntryPath> entriesToSkipAutoGen; internal Mod(ModInfo modInfo) { configItems = new List<BaseConfigItem>(); entriesToSkipAutoGen = new List<ConfigEntryPath>(); this.modInfo = modInfo; TryResolveIconAndDesc(); } internal void TryResolveIconAndDesc() { if (modInfo.TryGetPluginInfo(out var pluginInfo)) { string text = Path.GetFullPath(pluginInfo.Location); DirectoryInfo parent = Directory.GetParent(text); while (parent != null && !string.Equals(parent.Name, "plugins", StringComparison.OrdinalIgnoreCase)) { text = parent.FullName; parent = Directory.GetParent(text); } if (!text.EndsWith(".dll")) { string iconPath = Directory.EnumerateFiles(text, "icon.png", SearchOption.AllDirectories).FirstOrDefault(); LoadIcon(iconPath); string manifestPath = Directory.EnumerateFiles(text, "manifest.json", SearchOption.AllDirectories).FirstOrDefault(); LoadDesc(manifestPath); } } } private void LoadIcon(string iconPath) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) try { if (iconPath != null) { Texture2D val = new Texture2D(256, 256); if (ImageConversion.LoadImage(val, File.ReadAllBytes(iconPath))) { modInfo.Icon = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f); } } } catch { } } private void LoadDesc(string manifestPath) { try { if (manifestPath != null) { ThunderstoreManifest thunderstoreManifest = JsonConvert.DeserializeObject<ThunderstoreManifest>(File.ReadAllText(manifestPath)); if (thunderstoreManifest != null) { modInfo.Description = thunderstoreManifest.Description; } } } catch { } } internal void AddConfigItem(BaseConfigItem item) { configItems.Add(item); } } internal class ModInfo { internal string Name { get; set; } internal string GUID { get; set; } internal string Version { get; set; } internal string Description { get; set; } = ""; internal Sprite Icon { get; set; } = Assets.DefaultModIcon; public override string ToString() { return "<b>" + Name + "</b>\n" + GUID + "\nv" + Version + "\n\n" + Description; } public bool TryGetPluginInfo(out PluginInfo pluginInfo) { return Chainloader.PluginInfos.TryGetValue(GUID, out pluginInfo); } } internal class ThunderstoreManifest { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("version_number")] public string VersionNumber { get; set; } [JsonProperty("website_url")] public string WebsiteURL { get; set; } [JsonProperty("description")] public string Description { get; set; } [JsonProperty("dependencies")] public IList<string> Dependencies { get; set; } } } namespace LethalConfig.ConfigItems { public abstract class BaseConfigItem { internal ConfigEntryBase BaseConfigEntry { get; private set; } internal BaseOptions Options { get; } internal bool RequiresRestart => Options.RequiresRestart; internal Mod Owner { get; set; } internal bool IsAutoGenerated { get; set; } private string UnderlyingSection { get { ConfigEntryBase baseConfigEntry = BaseConfigEntry; return ((baseConfigEntry != null) ? baseConfigEntry.Definition.Section : null) ?? string.Empty; } } private string UnderlyingName { get { ConfigEntryBase baseConfigEntry = BaseConfigEntry; return ((baseConfigEntry != null) ? baseConfigEntry.Definition.Key : null) ?? string.Empty; } } private string UnderlyingDescription { get { ConfigEntryBase baseConfigEntry = BaseConfigEntry; return ((baseConfigEntry != null) ? baseConfigEntry.Description.Description : null) ?? string.Empty; } } internal string Section => Options.Section ?? UnderlyingSection; internal string Name => Options.Name ?? UnderlyingName; internal string Description => Options.Description ?? UnderlyingDescription; internal object CurrentBoxedValue { get; set; } internal object OriginalBoxedValue { get { ConfigEntryBase baseConfigEntry = BaseConfigEntry; if (baseConfigEntry == null) { return null; } return baseConfigEntry.BoxedValue; } } internal object BoxedDefaultValue { get { ConfigEntryBase baseConfigEntry = BaseConfigEntry; if (baseConfigEntry == null) { return null; } return baseConfigEntry.DefaultValue; } } internal bool HasValueChanged { get { object currentBoxedValue = CurrentBoxedValue; if (currentBoxedValue == null) { return false; } return !currentBoxedValue.Equals(OriginalBoxedValue); } } internal abstract GameObject CreateGameObjectForConfig(); internal void ApplyChanges() { if (BaseConfigEntry != null) { BaseConfigEntry.BoxedValue = CurrentBoxedValue; } } internal void CancelChanges() { CurrentBoxedValue = OriginalBoxedValue; } internal void ChangeToDefault() { CurrentBoxedValue = BoxedDefaultValue; } internal BaseConfigItem(BaseOptions options) : this(null, options) { } internal BaseConfigItem(ConfigEntryBase configEntry, BaseOptions options) { BaseConfigEntry = configEntry; Options = options; CurrentBoxedValue = OriginalBoxedValue; } internal bool IsSameConfig(BaseConfigItem configItem) { bool num = configItem.UnderlyingSection == UnderlyingSection; bool flag = configItem.UnderlyingName == UnderlyingName; bool flag2 = configItem.Owner.modInfo.GUID == Owner.modInfo.GUID; return num && flag && flag2; } } public abstract class BaseValueConfigItem<T> : BaseConfigItem { internal ConfigEntry<T> ConfigEntry => (ConfigEntry<T>)(object)base.BaseConfigEntry; internal T CurrentValue { get { return (T)base.CurrentBoxedValue; } set { base.CurrentBoxedValue = value; } } internal T OriginalValue => ConfigEntry.Value; internal T Defaultvalue => (T)((ConfigEntryBase)ConfigEntry).DefaultValue; internal BaseValueConfigItem(ConfigEntry<T> configEntry, BaseOptions options) : base((ConfigEntryBase)(object)configEntry, options) { CurrentValue = OriginalValue; } public override string ToString() { return base.Owner.modInfo.Name + "/" + ((ConfigEntryBase)ConfigEntry).Definition.Section + "/" + ((ConfigEntryBase)ConfigEntry).Definition.Key; } } public class BoolCheckBoxConfigItem : BaseValueConfigItem<bool> { public BoolCheckBoxConfigItem(ConfigEntry<bool> configEntry) : this(configEntry, requiresRestart: true) { } public BoolCheckBoxConfigItem(ConfigEntry<bool> configEntry, bool requiresRestart) : this(configEntry, new BoolCheckBoxOptions { RequiresRestart = requiresRestart }) { } public BoolCheckBoxConfigItem(ConfigEntry<bool> configEntry, BoolCheckBoxOptions options) : base(configEntry, (BaseOptions)options) { } internal override GameObject CreateGameObjectForConfig() { return Object.Instantiate<GameObject>(Assets.BoolCheckBoxPrefab); } } public class EnumDropDownConfigItem<T> : BaseValueConfigItem<T> where T : Enum { public EnumDropDownConfigItem(ConfigEntry<T> configEntry) : this(configEntry, requiresRestart: true) { } public EnumDropDownConfigItem(ConfigEntry<T> configEntry, bool requiresRestart) : this(configEntry, new EnumDropDownOptions { RequiresRestart = requiresRestart }) { } public EnumDropDownConfigItem(ConfigEntry<T> configEntry, EnumDropDownOptions options) : base(configEntry, (BaseOptions)options) { } internal override GameObject CreateGameObjectForConfig() { return Object.Instantiate<GameObject>(Assets.EnumDropDownPrefab); } } public sealed class FloatInputFieldConfigItem : BaseValueConfigItem<float> { internal float MaxValue { get; private set; } internal float MinValue { get; private set; } public FloatInputFieldConfigItem(ConfigEntry<float> configEntry) : this(configEntry, requiresRestart: true) { } public FloatInputFieldConfigItem(ConfigEntry<float> configEntry, bool requiresRestart) : this(configEntry, GetDefaultOptions(configEntry, requiresRestart)) { } public FloatInputFieldConfigItem(ConfigEntry<float> configEntry, FloatInputFieldOptions options) : base(configEntry, (BaseOptions)options) { AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; MinValue = (options.IsMinSet ? options.Min : ((acceptableValues as AcceptableValueRange<float>)?.MinValue ?? 0f)); MaxValue = (options.IsMaxSet ? options.Max : ((acceptableValues as AcceptableValueRange<float>)?.MaxValue ?? 1f)); } internal override GameObject CreateGameObjectForConfig() { return Object.Instantiate<GameObject>(Assets.FloatInputFieldPrefab); } private static FloatInputFieldOptions GetDefaultOptions(ConfigEntry<float> configEntry, bool requiresRestart = true) { AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; return new FloatInputFieldOptions { Min = ((acceptableValues as AcceptableValueRange<float>)?.MinValue ?? float.MinValue), Max = ((acceptableValues as AcceptableValueRange<float>)?.MaxValue ?? float.MaxValue), RequiresRestart = requiresRestart }; } } public sealed class FloatSliderConfigItem : BaseValueConfigItem<float> { internal float MaxValue { get; private set; } internal float MinValue { get; private set; } public FloatSliderConfigItem(ConfigEntry<float> configEntry) : this(configEntry, requiresRestart: true) { } public FloatSliderConfigItem(ConfigEntry<float> configEntry, bool requiresRestart) : this(configEntry, GetDefaultOptions(configEntry, requiresRestart)) { } public FloatSliderConfigItem(ConfigEntry<float> configEntry, FloatSliderOptions options) : base(configEntry, (BaseOptions)options) { AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; MinValue = (options.IsMinSet ? options.Min : ((acceptableValues as AcceptableValueRange<float>)?.MinValue ?? 0f)); MaxValue = (options.IsMaxSet ? options.Max : ((acceptableValues as AcceptableValueRange<float>)?.MaxValue ?? 1f)); } internal override GameObject CreateGameObjectForConfig() { return Object.Instantiate<GameObject>(Assets.FloatSliderPrefab); } private static FloatSliderOptions GetDefaultOptions(ConfigEntry<float> configEntry, bool requiresRestart = true) { AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; return new FloatSliderOptions { Min = ((acceptableValues as AcceptableValueRange<float>)?.MinValue ?? 0f), Max = ((acceptableValues as AcceptableValueRange<float>)?.MaxValue ?? 1f), RequiresRestart = requiresRestart }; } } public sealed class FloatStepSliderConfigItem : BaseValueConfigItem<float> { internal float MaxValue { get; private set; } internal float MinValue { get; private set; } internal float Step { get; private set; } public FloatStepSliderConfigItem(ConfigEntry<float> configEntry) : this(configEntry, requiresRestart: true) { } public FloatStepSliderConfigItem(ConfigEntry<float> configEntry, bool requiresRestart) : this(configEntry, GetDefaultOptions(configEntry, requiresRestart)) { } public FloatStepSliderConfigItem(ConfigEntry<float> configEntry, FloatStepSliderOptions options) : base(configEntry, (BaseOptions)options) { AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; MinValue = (options.IsMinSet ? options.Min : ((acceptableValues as AcceptableValueRange<float>)?.MinValue ?? 0f)); MaxValue = (options.IsMaxSet ? options.Max : ((acceptableValues as AcceptableValueRange<float>)?.MaxValue ?? 1f)); Step = options.Step; } internal override GameObject CreateGameObjectForConfig() { return Object.Instantiate<GameObject>(Assets.FloatStepSliderPrefab); } private static FloatStepSliderOptions GetDefaultOptions(ConfigEntry<float> configEntry, bool requiresRestart = true) { AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; return new FloatStepSliderOptions { Min = ((acceptableValues as AcceptableValueRange<float>)?.MinValue ?? 0f), Max = ((acceptableValues as AcceptableValueRange<float>)?.MaxValue ?? 1f), Step = 0.1f, RequiresRestart = requiresRestart }; } } public class GenericButtonConfigItem : BaseConfigItem { public GenericButtonOptions ButtonOptions => base.Options as GenericButtonOptions; public GenericButtonConfigItem(string section, string name, string description, string buttonText, GenericButtonOptions.GenericButtonHandler buttonHandler) : base(new GenericButtonOptions { Section = section, Name = name, Description = description, ButtonText = buttonText, ButtonHandler = buttonHandler, RequiresRestart = false }) { } internal override GameObject CreateGameObjectForConfig() { return Object.Instantiate<GameObject>(Assets.GenericButtonPrefab); } } public sealed class IntInputFieldConfigItem : BaseValueConfigItem<int> { internal int MaxValue { get; private set; } internal int MinValue { get; private set; } public IntInputFieldConfigItem(ConfigEntry<int> configEntry) : this(configEntry, requiresRestart: true) { } public IntInputFieldConfigItem(ConfigEntry<int> configEntry, bool requiresRestart) : this(configEntry, GetDefaultOptions(configEntry, requiresRestart)) { } public IntInputFieldConfigItem(ConfigEntry<int> configEntry, IntInputFieldOptions options) : base(configEntry, (BaseOptions)options) { AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; MinValue = (options.IsMinSet ? options.Min : ((acceptableValues as AcceptableValueRange<int>)?.MinValue ?? 0)); MaxValue = (options.IsMaxSet ? options.Max : ((acceptableValues as AcceptableValueRange<int>)?.MaxValue ?? 100)); } internal override GameObject CreateGameObjectForConfig() { return Object.Instantiate<GameObject>(Assets.IntInputFieldPrefab); } private static IntInputFieldOptions GetDefaultOptions(ConfigEntry<int> configEntry, bool requiresRestart = true) { AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; return new IntInputFieldOptions { Min = ((acceptableValues as AcceptableValueRange<int>)?.MinValue ?? int.MinValue), Max = ((acceptableValues as AcceptableValueRange<int>)?.MaxValue ?? int.MaxValue), RequiresRestart = requiresRestart }; } } public sealed class IntSliderConfigItem : BaseValueConfigItem<int> { internal int MaxValue { get; private set; } internal int MinValue { get; private set; } public IntSliderConfigItem(ConfigEntry<int> configEntry) : this(configEntry, requiresRestart: true) { } public IntSliderConfigItem(ConfigEntry<int> configEntry, bool requiresRestart) : this(configEntry, GetDefaultOptions(configEntry, requiresRestart)) { } public IntSliderConfigItem(ConfigEntry<int> configEntry, IntSliderOptions options) : base(configEntry, (BaseOptions)options) { AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; MinValue = (options.IsMinSet ? options.Min : ((acceptableValues as AcceptableValueRange<int>)?.MinValue ?? 0)); MaxValue = (options.IsMaxSet ? options.Max : ((acceptableValues as AcceptableValueRange<int>)?.MaxValue ?? 100)); } internal override GameObject CreateGameObjectForConfig() { return Object.Instantiate<GameObject>(A