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 LethalModManager v0.1.6
LethalModManager.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.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Steamworks; using Steamworks.Data; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.Rendering; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LethalModManager")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+d0e680e28ecd8bba0834b1100bf96a5649243635")] [assembly: AssemblyProduct("LethalModManager")] [assembly: AssemblyTitle("LethalModManager")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Kyxino/LethalModManager")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace LethalModManager { [JsonConverter(typeof(ModInfo))] internal class ModInfoConverter : JsonConverter<ModInfo> { public override bool CanRead => true; public override bool CanWrite => true; public override void WriteJson(JsonWriter writer, ModInfo value, JsonSerializer serializer) { writer.WriteValue(value.ToString()); } public override ModInfo ReadJson(JsonReader reader, Type objectType, ModInfo existingValue, bool hasExistingValue, JsonSerializer serializer) { return ModInfo.Parse(reader.Value.ToString()); } } public class ModInfo { public static Dictionary<string, ModInfo> CachedModInfos = new Dictionary<string, ModInfo>(); public static readonly ModInfo BepInEx_Offline = new ModInfo("BepInEx", "BepInExPack", new Version("5.4.2100")); public static readonly ModInfo LethalModManager_Offline = new ModInfo("kyxino", "LethalModManager", new Version("0.1.6")); private string _Creator; private string _Name; private Version _Version; public string Full_Name; public string Full_Version; public static ModInfo BepInEx => BepInEx_Offline; public static ModInfo LethalModManager => LethalModManager_Offline; public string Creator { get { return _Creator; } set { _Creator = value; Full_Name = value + "-" + _Name; Full_Version = ((_Version != null) ? $"{Full_Name}-{Version}" : null); } } public string Name { get { return _Name; } set { _Name = value; Full_Name = _Creator + "-" + value; Full_Version = ((_Version != null) ? $"{Full_Name}-{Version}" : null); } } public Version Version { get { return _Version; } set { _Version = value; Full_Version = ((value != null) ? $"{_Creator}-{_Name}-{value}" : null); } } public Uri DownloadURL => new Uri($"https://thunderstore.io/package/download/{Creator}/{Name}/{Version}/"); public ModInfo(string ModCreator, string ModName, Version ModVersion = null) { _Creator = ModCreator; _Name = ModName; _Version = ModVersion; Full_Name = ModCreator + "-" + ModName; Full_Version = ((ModVersion != null) ? $"{ModCreator}-{ModName}-{ModVersion}" : null); base..ctor(); } public ModListing GetMod() { ModListing value; return LMM_ModHandler.ThunderstoreData.TryGetValue(Full_Name, out value) ? value : null; } public VersionListing GetVersion(ModListing AltModClassData = null) { return (AltModClassData ?? GetMod())?.Versions?.FirstOrDefault((VersionListing x) => x.Version == Version); } public void Download(bool IncludeDependencies = true, string Profile = null, bool SaveToTempProfile = false, bool IgnoreConfigs = false) { if (IncludeDependencies) { VersionListing version = GetVersion(); IEnumerable<KeyValuePair<ModInfo, int>> enumerable = version.FilteredDependencies.Where((KeyValuePair<ModInfo, int> x) => x.Key.Full_Name != "BepInEx-BepInExPack" && x.Key.Full_Name != "kyxino-LethalModManager"); LMM_ModHandler.DownloadMod(this, Profile, SaveToTempProfile, IgnoreConfigs); foreach (KeyValuePair<ModInfo, int> item in enumerable) { LMM_ModHandler.DownloadMod(item.Key, Profile, SaveToTempProfile, IgnoreConfigs); } } else { LMM_ModHandler.DownloadMod(this, Profile, SaveToTempProfile, IgnoreConfigs); } ModManager.MLS.LogFatal((object)"DONE DOWNLOADING."); } public void SetInfo(string ModCreator, string ModName, Version ModVersion = null) { _Creator = ModCreator; Name = ModName; Version = ModVersion; } public void SetInfo(string ModVersionString) { if (CachedModInfos.TryGetValue(ModVersionString, out var value)) { _Creator = value.Creator; Name = value.Name; Version = value.Version; } else { string[] array = ModVersionString.Split('-'); Version result; int num = ((!Version.TryParse(array[^1], out result)) ? 1 : 2); _Creator = string.Join('-', array, 0, array.Length - num); Name = array[^num]; Version = result; } } public ModInfo WithVersion(Version ModVersion) { return new ModInfo(Creator, Name, ModVersion); } public static ModInfo Parse(string input) { if (CachedModInfos.TryGetValue(input, out var value)) { return value; } string[] array = input.Split('-'); Version result; int num = ((!Version.TryParse(array[^1], out result)) ? 1 : 2); return CachedModInfos[input] = new ModInfo(string.Join('-', array, 0, array.Length - num), array[^num], result); } public static bool TryParse(string input, out ModInfo result) { if (Utility.IsNullOrWhiteSpace(input) || input.Count((char x) => x == '-') < 2) { return (result = null) != null; } result = Parse(input); return true; } public bool Equals(ModInfo B) { return GetHashCode() == B.GetHashCode(); } public override bool Equals(object obj) { return GetHashCode() == obj.GetHashCode(); } public override int GetHashCode() { return HashCode.Combine(Creator, Name, Version); } public static bool operator ==(ModInfo A, ModInfo B) { return A?.GetHashCode() == B?.GetHashCode(); } public static bool operator !=(ModInfo A, ModInfo B) { return A?.GetHashCode() != B?.GetHashCode(); } } public enum ModStatus { Missing, Downloading, Downloaded, Extracting, Installed } public class Profile { public string Name; public string Desc; public string Author; public string Linked; public DirectoryInfo ProfilePath; public Dictionary<string, LocalMod> Mods; } public class LocalMod { public bool Active = false; public ModStatus Status = ModStatus.Missing; public Profile LinkedProfile; public static ModManifestV1 Manifest; public ModInfo Mod; public List<string> LinkedConfigs; public string CorePath; public string PatchersPath; public string PluginsPath; public string TempZipPath; public string CachedZipPath; } public class ModPage { } public class ModListPage { } public class ModListing { public int Downloads = 0; public int Dependents = 0; public int OnceDependents = 0; public int CurrentDependents = 0; [JsonProperty("date_created")] public DateTime Created; [JsonProperty("date_updated")] public DateTime Updated; [JsonProperty("rating_score")] public int Likes; [JsonProperty("is_pinned")] public bool Pinned; [JsonProperty("is_deprecated")] public bool Deprecated; [JsonProperty("has_nsfw_content")] public bool NSFW; [JsonProperty("categories")] public List<string> Tags; [JsonProperty("versions")] public List<VersionListing> Versions; [JsonProperty("full_name")] public ModInfo Info { get; set; } public string Creator => Info.Creator; public string Name => Info.Name; public string Full_Name => Info.Full_Name; } public class ModManifestV1 { [JsonProperty("name")] public string Name; [JsonProperty("version_number")] public Version Version; [JsonProperty("website_url")] public string Website; [JsonProperty("description")] public string Desc; [JsonProperty("dependencies")] public List<ModInfo> Dependencies; public bool UserEnabled = false; public string DirectoryPath; } public class VersionListing { public ModListing Mod; public Version Version; [JsonProperty("full_name")] public string Full_Version; [JsonProperty("description")] public string Desc; public string Icon; [JsonProperty("dependencies")] public List<ModInfo> Dependencies; public Dictionary<ModInfo, int> FilteredDependencies; [JsonProperty("downloads")] public int Downloads; public int Dependents = 0; public int OnceDependents = 0; public int CurrentDependents = 0; [JsonProperty("date_created")] public DateTime Created; [JsonProperty("is_active")] public bool Active; [JsonProperty("file_size")] public long Size; public ModInfo Info => Mod.Info; public string Creator => Info.Creator; public string Name => Info.Name; public string Full_Name => Info.Full_Name; } public enum ModSlotState { Required, Preferred, Optional, Forced, Enabled, Disabled } internal class LMM_ModSlot : MonoBehaviour { public ModInfo ModInfo; public ModManifestV1 ModManifest; public ModSlotState State; public IEnumerator ImageEnumerator; public Button Button; public Image Border; public Image Panel; public RawImage Logo; public Text Label; public Text Desc; public Button Website; public Transform Data; public Text Creator; public Text Downloads; public Text Dependents; public Text Likes; public Text Dependencies; public Text Size; public Text TinyDesc; public Transform Options; public Image OptionsFrame; public Button ProfileDownload; public Dropdown ProfileDropdown; public Button ModToggle; public Button ModDelete; public Dropdown VersionDropdown; private UnityWebRequest LogoRequest; private Texture2D DownloadedTexture; public void SetModInfo(string ModCreator, string ModName, Version ModVersion = null) { if (ModInfo != null) { ModInfo.SetInfo(ModCreator, ModName, ModVersion); } else { ModInfo = new ModInfo(ModCreator, ModName, ModVersion); } } public void SetModInfo(string ModVersionString) { if (ModInfo != null) { ModInfo.SetInfo(ModVersionString); } else { ModInfo = ModInfo.Parse(ModVersionString); } } private void Awake() { //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Expected O, but got Unknown //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Expected O, but got Unknown //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Expected O, but got Unknown //IL_0286: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Expected O, but got Unknown //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_02ad: Expected O, but got Unknown Button = ((Component)this).transform.Find<Button>(); Border = ((Component)this).transform.Find<Image>(); Panel = ((Component)this).transform.Find<Image>("Panel"); Logo = ((Component)this).transform.Find<RawImage>("Logo"); Label = ((Component)this).transform.Find<Text>("ModText"); Desc = ((Component)this).transform.Find<Text>("Description"); Website = ((Component)this).transform.Find<Button>("Website"); Data = ((Component)this).transform.Find("Data"); Creator = Data.Find<Text>("CTEXT"); Downloads = Data.Find<Text>("DTEXT"); Dependents = Data.Find<Text>("DPTTEXT"); Likes = Data.Find<Text>("LTEXT"); Dependencies = Data.Find<Text>("DPCTEXT"); Size = ((Component)this).transform.Find<Text>("ModSize"); TinyDesc = ((Component)this).transform.Find<Text>("TinyDesc"); Options = ((Component)this).transform.Find("Options"); OptionsFrame = Options.Find<Image>(); ProfileDownload = Options.Find<Button>("ProfileDownload"); ProfileDropdown = Options.Find<Dropdown>("ProfileDropdown"); ModToggle = Options.Find<Button>("ModToggle"); ModDelete = Options.Find<Button>("ModDelete"); VersionDropdown = Options.Find<Dropdown>("VersionDropdown"); UpdateBorderByState(); ((UnityEvent)Website.onClick).AddListener((UnityAction)delegate { Application.OpenURL("https://thunderstore.io/c/lethal-company/p/" + ModInfo.Creator + "/" + ModInfo.Name + "/" + ((ModInfo.GetVersion() != null && ModManager.SpecificModVersionLink.Value) ? $"v/{ModInfo.Version}/" : "")); }); ((UnityEvent<int>)(object)VersionDropdown.onValueChanged).AddListener((UnityAction<int>)delegate(int VersionId) { ModListing mod = ModInfo.GetMod(); if (mod != null) { ModListing value; List<VersionListing> LocalModVersions = ((mod == null) ? null : (LMM_ModHandler.LocalMods.TryGetValue(mod.Full_Name, out value) ? value : null)?.Versions); List<VersionListing> list = mod?.Versions?.ToList() ?? LocalModVersions; if (LocalModVersions != null) { int i2; for (i2 = 0; i2 < LocalModVersions?.Count; i2++) { if (list.FirstOrDefault((VersionListing x) => x.Version == LocalModVersions[i2].Version) == null) { list.Add(LocalModVersions[i2]); } } } list.Sort((VersionListing x, VersionListing y) => y.Version.CompareTo(x.Version)); ModInfo.Version = list.FirstOrDefault((VersionListing x) => VersionDropdown.options[VersionId].text.EndsWith($": {x.Version}"))?.Version; bool? showOptions = true; UpdateModSlot(null, showOptions); } }); ProfileDropdown.AddOptions(LMM_UI.Actions.Find<Dropdown>("Local/ProfileSelectionDropdown").options); ((UnityEvent)ProfileDownload.onClick).AddListener((UnityAction)delegate { Text obj = ((Component)ProfileDropdown).transform.Find<Text>("Text"); string obj2 = ((obj != null) ? obj.text : null); Transform actions = LMM_UI.Actions; object obj3; if (actions == null) { obj3 = null; } else { Text obj4 = actions.Find<Text>("Local/ProfileSelectionDropdown/Text"); obj3 = ((obj4 != null) ? obj4.text : null); } if (obj2 == (string?)obj3) { LMM_UI.Instance.AddModToUI(ModInfo.Full_Version, LMM_UI.LP_Local); VersionListing version = ModInfo.GetVersion(); foreach (KeyValuePair<ModInfo, int> item in version.FilteredDependencies.Where((KeyValuePair<ModInfo, int> x) => x.Key.Full_Name != "BepInEx-BepInExPack" && x.Key.Full_Name != "kyxino-LethalModManager")) { LMM_UI.Instance.AddModToUI(item.Key.Full_Version, LMM_UI.LP_Local); } } Task.Run(delegate { LMM_UI.DisableInteracts.Add(ProfileDownload); ModInfo.Download(IncludeDependencies: true, ProfileDropdown.options[ProfileDropdown.value].text); LMM_UI.EnableInteracts.Add(ProfileDownload); }); }); ((UnityEvent)Button.onClick).AddListener((UnityAction)delegate { if (State == ModSlotState.Enabled || State == ModSlotState.Disabled) { ((Component)Options).gameObject.SetActive(!((Component)Options).gameObject.activeSelf); } else if (State != ModSlotState.Forced) { SetState((State == ModSlotState.Optional) ? ModSlotState.Preferred : ((State != ModSlotState.Preferred) ? ModSlotState.Optional : ModSlotState.Required)); UpdateBorderByState(); } }); ((UnityEvent)ModToggle.onClick).AddListener((UnityAction)delegate { bool userEnabled = ModManifest.UserEnabled; ((Selectable)ModToggle).interactable = false; DirectoryInfo parent2 = Directory.GetParent(ModManifest.DirectoryPath); if (Directory.Exists(Path.Combine(parent2.Parent.FullName, "plugins", parent2.Name))) { string[] files5 = Directory.GetFiles(Path.Combine(parent2.Parent.FullName, "plugins", parent2.Name), userEnabled ? "*" : "*.old", SearchOption.AllDirectories); foreach (string text8 in files5) { try { string destFileName; if (!userEnabled) { string text9 = text8; destFileName = text9.Substring(0, text9.Length - 4); } else { destFileName = text8 + ".old"; } File.Move(text8, destFileName); } catch (Exception ex5) { ModManager.MLS.LogWarning((object)ex5.Message); } } } if (Directory.Exists(Path.Combine(parent2.Parent.FullName, "patchers", parent2.Name))) { string[] files6 = Directory.GetFiles(Path.Combine(parent2.Parent.FullName, "patchers", parent2.Name), userEnabled ? "*" : "*.old", SearchOption.AllDirectories); foreach (string text10 in files6) { try { string destFileName2; if (!userEnabled) { string text9 = text10; destFileName2 = text9.Substring(0, text9.Length - 4); } else { destFileName2 = text10 + ".old"; } File.Move(text10, destFileName2); } catch (Exception ex6) { ModManager.MLS.LogWarning((object)ex6.Message); } } } if (Directory.Exists(Path.Combine(parent2.Parent.FullName, "core", parent2.Name))) { string[] files7 = Directory.GetFiles(Path.Combine(parent2.Parent.FullName, "core", parent2.Name), userEnabled ? "*" : "*.old", SearchOption.AllDirectories); foreach (string text11 in files7) { try { string destFileName3; if (!userEnabled) { string text9 = text11; destFileName3 = text9.Substring(0, text9.Length - 4); } else { destFileName3 = text11 + ".old"; } File.Move(text11, destFileName3); } catch (Exception ex7) { ModManager.MLS.LogWarning((object)ex7.Message); } } } ((Component)ModToggle).transform.Find<Text>().text = (userEnabled ? "Disable Mod" : "Enable Mod"); ((Selectable)ModToggle).interactable = true; ModManifest.UserEnabled = !userEnabled; UpdateBorderByState(); }); ((UnityEvent)ModDelete.onClick).AddListener((UnityAction)delegate { State = ModSlotState.Disabled; ((Selectable)ModToggle).interactable = false; ((Selectable)ModDelete).interactable = false; DirectoryInfo parent = Directory.GetParent(ModManifest.DirectoryPath); string text = Path.Combine(parent.Parent.FullName, "plugins", parent.Name); string text2 = Path.Combine(parent.Parent.FullName, "patchers", parent.Name); string text3 = Path.Combine(parent.Parent.FullName, "core", parent.Name); try { Directory.Delete(ModManifest.DirectoryPath, recursive: true); } catch (Exception) { string[] files = Directory.GetFiles(ModManifest.DirectoryPath, "*", SearchOption.AllDirectories); foreach (string text4 in files) { File.Move(text4, text4 + ".lmm-delete"); } Directory.Move(ModManifest.DirectoryPath, Path.Combine(Paths.GameRootPath, "DELETE", Random.Range(0, 10000000).ToString("X"))); } try { if (Directory.Exists(text)) { Directory.Delete(text, recursive: true); } } catch (Exception) { if (Directory.Exists(text2)) { string[] files2 = Directory.GetFiles(text, "*", SearchOption.AllDirectories); foreach (string text5 in files2) { File.Move(text5, text5 + ".lmm-delete"); } Directory.Move(text, Path.Combine(Paths.GameRootPath, "DELETE", Random.Range(0, 10000000).ToString("X"))); } } try { if (Directory.Exists(text2)) { Directory.Delete(text2, recursive: true); } } catch (Exception) { if (Directory.Exists(text2)) { string[] files3 = Directory.GetFiles(text2, "*", SearchOption.AllDirectories); foreach (string text6 in files3) { File.Move(text6, text6 + ".lmm-delete"); } Directory.Move(text2, Path.Combine(Paths.GameRootPath, "DELETE", Random.Range(0, 10000000).ToString("X"))); } } try { if (Directory.Exists(text3)) { Directory.Delete(text3, recursive: true); } } catch (Exception) { if (Directory.Exists(text3)) { string[] files4 = Directory.GetFiles(text3, "*", SearchOption.AllDirectories); foreach (string text7 in files4) { File.Move(text7, text7 + ".lmm-delete"); } Directory.Move(text3, Path.Combine(Paths.GameRootPath, "DELETE", Random.Range(0, 10000000).ToString("X"))); } } ModManifest.UserEnabled = false; UpdateBorderByState(); }); } public void SetState(ModSlotState NewState) { if (State != ModSlotState.Forced && State != ModSlotState.Enabled && State != ModSlotState.Disabled) { ((Component)Options).gameObject.SetActive(false); State = NewState; UpdateBorderByState(); } } public void UpdateBorderByState() { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) Image optionsFrame = OptionsFrame; Image border = Border; ModManifestV1 modManifest = ModManifest; Color color = (((Graphic)border).color = Color32.op_Implicit((modManifest != null && !modManifest.UserEnabled) ? LMM_Colors.Secondary_Border : ((State == ModSlotState.Required || State == ModSlotState.Forced) ? Color32.op_Implicit(Color.white) : ((State == ModSlotState.Preferred || State == ModSlotState.Enabled) ? LMM_Colors.Primary_Border : LMM_Colors.Secondary_Border)))); ((Graphic)optionsFrame).color = color; Image panel = Panel; ModManifestV1 modManifest2 = ModManifest; ((Graphic)panel).color = ((modManifest2 != null && !modManifest2.UserEnabled) ? Color.black : Color.white); } public void OnDestroy() { LMM_UI.UpdateUI = true; } public void UpdateDataLayout() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: 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_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Data == (Object)null) { return; } Vector2 val = Vector2.zero; RectTransform[] componentsInChildren = ((Component)Data).GetComponentsInChildren<RectTransform>(true); foreach (RectTransform val2 in componentsInChildren) { if (!((Object)(object)val2 == (Object)(object)Data.Find<RectTransform>())) { val2.anchoredPosition = val; Text component = ((Component)val2).GetComponent<Text>(); if ((Object)(object)component != (Object)null) { val2.sizeDelta = new Vector2(component.preferredWidth, 24f); } Vector2 val3 = val; Rect rect = val2.rect; val = val3 + new Vector2(((Rect)(ref rect)).width + 2f, 0f); } } } public IEnumerator DownloadImage(string MediaUrl) { if ((Object)(object)Logo.texture != (Object)null) { Object.Destroy((Object)(object)Logo.texture); } Logo.texture = null; UnityWebRequest logoRequest = LogoRequest; if (logoRequest != null) { logoRequest.Abort(); } UnityWebRequest logoRequest2 = LogoRequest; if (logoRequest2 != null) { logoRequest2.Dispose(); } LogoRequest = UnityWebRequestTexture.GetTexture(MediaUrl); for (int i = 0; i < ModManager.RetryLogoLoadingTimes.Value; i++) { if (((object)Logo).Equals((object?)null)) { break; } yield return LogoRequest.SendWebRequest(); if (((object)Logo).Equals((object?)null)) { break; } if ((int)LogoRequest.result == 2 || (int)LogoRequest.result == 3) { LogoRequest = UnityWebRequestTexture.GetTexture(MediaUrl); continue; } if ((Object)(object)DownloadedTexture != (Object)null) { Object.Destroy((Object)(object)DownloadedTexture); } DownloadedTexture = DownloadHandlerTexture.GetContent(LogoRequest); if (!((object)Logo).Equals((object?)null)) { Logo.texture = (Texture)(object)DownloadedTexture; } break; } } public void UpdateModSlot(bool? SetActive = null, bool? ShowOptions = false) { if (ImageEnumerator != null) { ((MonoBehaviour)LMM_UI.Instance).StopCoroutine(ImageEnumerator); } ImageEnumerator = null; if (SetActive.HasValue) { ((Component)this).gameObject.SetActive(SetActive.Value); } if (ShowOptions.HasValue) { ((Component)Options).gameObject.SetActive(ShowOptions.Value); } ModListing mod = ModInfo.GetMod(); VersionListing version = ModInfo.GetVersion(mod); string text = ModInfo.Name.Replace('_', ' ') + ((ModInfo.Version != null) ? $" v{ModInfo.Version}" : ""); Label.text = text; Desc.text = version?.Desc ?? ""; ((Component)Website).gameObject.SetActive(version != null || !ModManager.HideLinkIfMissingVersion.Value); Creator.text = ModInfo.Creator ?? "-"; Downloads.text = ((mod == null && (!ModManager.SpecificModVersionDownloads.Value || version == null)) ? "-" : ((!ModManager.SpecificModVersionDownloads.Value) ? mod?.Downloads : version?.Downloads)?.ToString("N0")); Text dependents = Dependents; string text2; if (ModManager.SpecificModVersionDependents.Value ? (version != null) : (mod != null)) { DependentVersionChecks value = ModManager.ModpackVersionCheck.Value; if (1 == 0) { } int num = value switch { DependentVersionChecks.All => ModManager.SpecificModVersionDependents.Value ? version.Dependents : mod.Dependents, DependentVersionChecks.Latest => ModManager.SpecificModVersionDependents.Value ? version.CurrentDependents : mod.CurrentDependents, _ => ModManager.SpecificModVersionDependents.Value ? version.OnceDependents : mod.OnceDependents, }; if (1 == 0) { } text2 = num.ToString("N0"); } else { text2 = "-"; } dependents.text = text2; Likes.text = mod?.Likes.ToString("N0") ?? "-"; Dependencies.text = ((!ModManager.CountFlattenedDependencies.Value) ? version?.Dependencies?.Count : version?.FilteredDependencies?.Count)?.ToString("N0") ?? "-"; UpdateDataLayout(); Text size = Size; object text3; if (version != null) { _ = version.Size; text3 = string.Format("{0}{1}", Math.Round((decimal)((version.Size > 999999) ? ((float)version.Size / 1000000f) : ((version.Size > 999) ? ((float)version.Size / 1000f) : ((float)version.Size)))), (version.Size > 999999) ? "MB" : ((version.Size > 999) ? "KB" : "B")); } else { text3 = ""; } size.text = (string)text3; Text tinyDesc = TinyDesc; object text4; if (mod == null) { text4 = ""; } else { string[] obj = new string[6] { "Tags: ", null, null, null, null, null }; List<string> tags = mod.Tags; obj[1] = ((tags != null) ? GeneralExtensions.Join<string>((IEnumerable<string>)tags, (Func<string, string>)null, ", ") : null) ?? "-"; obj[2] = " | Updated: "; obj[3] = ((mod.Updated == default(DateTime)) ? "-" : LMM_Utils.HowLongAgo(mod.Updated)); obj[4] = " | Created: "; obj[5] = ((mod.Created == default(DateTime)) ? "-" : LMM_Utils.HowLongAgo(mod.Created)); text4 = string.Concat(obj); } tinyDesc.text = (string)text4; Button modDelete = ModDelete; bool interactable = (((Selectable)ModToggle).interactable = ModManifest != null && ModManifest.Version == version?.Version); ((Selectable)modDelete).interactable = interactable; VersionDropdown.ClearOptions(); ModListing value2; List<VersionListing> LocalModVersions = (LMM_ModHandler.LocalMods.TryGetValue(ModInfo.Full_Name, out value2) ? value2 : null)?.Versions; List<VersionListing> list = mod?.Versions?.ToList() ?? LocalModVersions; if (LocalModVersions != null) { int i; for (i = 0; i < LocalModVersions.Count; i++) { if (list.FirstOrDefault((VersionListing x) => x.Version == LocalModVersions[i].Version) == null) { list.Add(LocalModVersions[i]); } } } list?.Sort((VersionListing x, VersionListing y) => y.Version.CompareTo(x.Version)); if (list != null && mod != null) { VersionDropdown.AddOptions(list.Select(delegate(VersionListing x) { bool? flag2 = LMM_ModHandler.UserMods.FirstOrDefault((KeyValuePair<string, ModManifestV1> y) => $"{y.Key}-{y.Value.Version}" == x.Full_Version).Value?.UserEnabled; if (1 == 0) { } string arg = ((!flag2.HasValue) ? (File.Exists(".\\LethalModManager\\ModStorage\\" + x.Full_Version + ".zip") ? "Downloaded " : "") : ((!flag2.GetValueOrDefault()) ? "Inactive " : "Installed ")); if (1 == 0) { } return $"{arg}Version: {x.Version}"; }).ToList()); } if (list != null && version != null) { VersionDropdown.SetValueWithoutNotify(list.IndexOf(version)); } if (version != null) { ((MonoBehaviour)LMM_UI.Instance).StartCoroutine(ImageEnumerator = DownloadImage(version.Icon ?? ("https://gcdn.thunderstore.io/live/repository/icons/" + version.Full_Version + ".png"))); } } public void Update() { if (LMM_UI.BreakUI) { return; } if (LMM_ModHandler.FinishedDownloads.Contains(ModInfo.Full_Version)) { VersionListing version = ModInfo.GetVersion(); Text size = Size; object text; if (version != null) { _ = version.Size; text = string.Format("{0}{1}", Math.Round((decimal)((version.Size > 999999) ? ((float)version.Size / 1000000f) : ((version.Size > 999) ? ((float)version.Size / 1000f) : ((float)version.Size)))), (version.Size > 999999) ? "MB" : ((version.Size > 999) ? "KB" : "B")); } else { text = ""; } size.text = (string)text; LMM_ModHandler.FinishedDownloads.Remove(ModInfo.Full_Version); } else if (LMM_ModHandler.QueuedDownloads.ContainsKey(ModInfo.Full_Version)) { DownloadProgressChangedEventArgs downloadProgressChangedEventArgs = LMM_ModHandler.QueuedDownloads[ModInfo.Full_Version]; Size.text = string.Format("{0}{1}/{2}{3}", Math.Round((decimal)((downloadProgressChangedEventArgs.BytesReceived > 999999) ? ((float)downloadProgressChangedEventArgs.BytesReceived / 1000000f) : ((downloadProgressChangedEventArgs.BytesReceived > 999) ? ((float)downloadProgressChangedEventArgs.BytesReceived / 1000f) : ((float)downloadProgressChangedEventArgs.BytesReceived)))), (downloadProgressChangedEventArgs.BytesReceived > 999999) ? "MB" : ((downloadProgressChangedEventArgs.BytesReceived > 999) ? "KB" : "B"), Math.Round((decimal)((downloadProgressChangedEventArgs.TotalBytesToReceive > 999999) ? ((float)downloadProgressChangedEventArgs.TotalBytesToReceive / 1000000f) : ((downloadProgressChangedEventArgs.TotalBytesToReceive > 999) ? ((float)downloadProgressChangedEventArgs.TotalBytesToReceive / 1000f) : ((float)downloadProgressChangedEventArgs.TotalBytesToReceive)))), (downloadProgressChangedEventArgs.TotalBytesToReceive > 999999) ? "MB" : ((downloadProgressChangedEventArgs.TotalBytesToReceive > 999) ? "KB" : "B")); } } } [StructLayout(LayoutKind.Sequential, Size = 1)] public struct LMM_Colors { public static Color32 Background_Tint = new Color32((byte)58, (byte)0, (byte)0, (byte)201); public static Color32 Logo_Mult = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue); public static Color32 Primary_Frame = new Color32((byte)79, (byte)0, (byte)0, byte.MaxValue); public static Color32 Primary_Border = new Color32((byte)202, (byte)48, (byte)0, byte.MaxValue); public static Color32 Secondary_Border = new Color32((byte)64, (byte)0, (byte)0, byte.MaxValue); public static Color32 Primary_Text = new Color32(byte.MaxValue, (byte)122, (byte)0, byte.MaxValue); public static Color32 Secondary_Text_Icons = new Color32((byte)202, (byte)48, (byte)0, byte.MaxValue); public static Color32 Unknown_1 = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)0); public static Color32 Dropdown_Normal = new Color32((byte)87, (byte)0, (byte)0, byte.MaxValue); public static Color32 Dropdown_Highlighted = new Color32((byte)118, (byte)0, (byte)0, byte.MaxValue); public static Color32 Dropdown_Selected = new Color32((byte)118, (byte)0, (byte)0, byte.MaxValue); public static Color32 Dropdown_Pressed = new Color32((byte)0, (byte)0, (byte)0, byte.MaxValue); } internal class LMM_UI : MonoBehaviour { [CompilerGenerated] private static class <>O { public static Func<string, string> <0>__GetFileName; public static UnityAction <1>__UpdateThunderstoreData; } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action <>9__14_0; public static Comparison<ModListing> <>9__31_0; public static Comparison<ModListing> <>9__31_1; public static Comparison<ModListing> <>9__31_2; public static Comparison<ModListing> <>9__31_8; public static Comparison<ModListing> <>9__31_9; public static Comparison<ModListing> <>9__31_10; public static Comparison<ModListing> <>9__31_11; public static Comparison<ModListing> <>9__31_12; public static Comparison<ModListing> <>9__31_13; public static Comparison<ModListing> <>9__31_3; public static Comparison<ModListing> <>9__31_4; public static Comparison<ModListing> <>9__31_5; public static Comparison<ModListing> <>9__31_6; public static Comparison<ModListing> <>9__31_7; public static Func<string, string> <>9__32_0; public static UnityAction <>9__34_0; public static UnityAction <>9__34_1; public static UnityAction <>9__34_2; public static UnityAction <>9__34_3; public static Func<ModListing, bool> <>9__34_24; public static UnityAction <>9__34_20; public static UnityAction <>9__34_21; internal void <Awake>b__14_0() { LMM_ModHandler.LoadThunderstoreData(ModManager.ForceUpdateUponOpening.Value); } internal int <ResortData>b__31_0(ModListing x, ModListing y) { return y.Updated.CompareTo(x.Updated); } internal int <ResortData>b__31_1(ModListing x, ModListing y) { return y.Created.CompareTo(x.Created); } internal int <ResortData>b__31_2(ModListing x, ModListing y) { return y.Downloads.CompareTo(x.Downloads); } internal int <ResortData>b__31_8(ModListing x, ModListing y) { return y.Versions.FirstOrDefault().Dependents.CompareTo(x.Versions.FirstOrDefault().Dependents); } internal int <ResortData>b__31_9(ModListing x, ModListing y) { return y.Dependents.CompareTo(x.Dependents); } internal int <ResortData>b__31_10(ModListing x, ModListing y) { return y.Versions.FirstOrDefault().CurrentDependents.CompareTo(x.Versions.FirstOrDefault().CurrentDependents); } internal int <ResortData>b__31_11(ModListing x, ModListing y) { return y.CurrentDependents.CompareTo(x.CurrentDependents); } internal int <ResortData>b__31_12(ModListing x, ModListing y) { return y.Versions.FirstOrDefault().OnceDependents.CompareTo(x.Versions.FirstOrDefault().OnceDependents); } internal int <ResortData>b__31_13(ModListing x, ModListing y) { return y.OnceDependents.CompareTo(x.OnceDependents); } internal int <ResortData>b__31_3(ModListing x, ModListing y) { return y.Likes.CompareTo(x.Likes); } internal int <ResortData>b__31_4(ModListing x, ModListing y) { return y.Versions.FirstOrDefault().FilteredDependencies.Count.CompareTo(x.Versions.FirstOrDefault().FilteredDependencies.Count); } internal int <ResortData>b__31_5(ModListing x, ModListing y) { return y.Versions.FirstOrDefault().Dependencies.Count.CompareTo(x.Versions.FirstOrDefault().Dependencies.Count); } internal int <ResortData>b__31_6(ModListing x, ModListing y) { return y.Versions.Count.CompareTo(x.Versions.Count); } internal int <ResortData>b__31_7(ModListing x, ModListing y) { return y.Versions.FirstOrDefault().Size.CompareTo(x.Versions.FirstOrDefault().Size); } internal string <UpdateProfileSelection>b__32_0(string x) { return "TEMP: " + Path.GetFileName(x); } internal void <Start>b__34_0() { LoadMenu("Local"); } internal void <Start>b__34_1() { LoadMenu("Thunderstore"); } internal void <Start>b__34_2() { LoadMenu("Downloads"); } internal void <Start>b__34_3() { ConfigsToDownload = null; ModManager.JoiningLobbyId = null; ((Component)LMM_Canvas).gameObject.SetActive(false); } internal bool <Start>b__34_24(ModListing x) { int result; if (!x.Tags.Contains("Modpacks")) { VersionListing? versionListing = x.Versions.FirstOrDefault(); result = ((versionListing != null && versionListing.Dependencies?.Count < 10) ? 1 : 0); } else { result = 0; } return (byte)result != 0; } internal void <Start>b__34_20() { ModManager.MLS.LogFatal((object)"Attempting to open lobby via mod sync."); using WebClient webClient = new WebClient(); Dictionary<string, int> dictionary = new Dictionary<string, int>(); for (int i = 0; i < LP_Host.childCount; i++) { LMM_ModSlot component = ((Component)LP_Host.GetChild(i)).GetComponent<LMM_ModSlot>(); dictionary.Add(component.ModInfo.Full_Version, (component.State != ModSlotState.Optional) ? ((component.State == ModSlotState.Preferred) ? 1 : (-1)) : 0); } ((Component)LMM_Canvas).gameObject.SetActive(false); Dictionary<string, object> dictionary2 = new Dictionary<string, object> { ["Mods"] = dictionary, ["Configs"] = LMM_ModHandler.CompressConfigs() }; string data = "#lethalmodmanager\n" + Convert.ToBase64String(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject((object)dictionary2))); webClient.Headers.Add("Content-Type", "application/octet-stream"); string text = webClient.UploadString("https://thunderstore.io/api/experimental/legacyprofile/create/", data); Dictionary<string, object> dictionary3 = JsonConvert.DeserializeObject<Dictionary<string, object>>(text); ModManager.MLS.LogWarning((object)text); if (!dictionary3.TryGetValue("key", out var value)) { FailedOpenLobby = Time.time + 1f; return; } ModManager.ModSyncKey = value.ToString(); ModManager.ModSyncCount = dictionary.Count; ModManager.MLS.LogWarning((object)ModManager.ModSyncKey); ModManager.OpeningLobby = true; Object.FindObjectOfType<MenuManager>().ConfirmHostButton(); } internal void <Start>b__34_21() { for (int i = 0; i < LP_LobbyMods.childCount; i++) { ((Component)LP_LobbyMods.GetChild(i)).GetComponent<LMM_ModSlot>()?.SetState(ModSlotState.Preferred); } } } public static LMM_UI Instance; public static Transform LMM_Canvas; public static Transform Actions; public static Transform ListPanel; public static Transform LP_Local; public static Transform LP_Thunderstore; public static Transform LP_Downloads; public static Transform LP_Host; public static Transform LP_Config; public static Transform LP_LobbyMods; public static Transform LP_LobbyConfigs; public static GameObject ModSlotTemp; public static GameObject ModManagerCanvas; public static float? FailedOpenLobby; public static bool AttemptQuickReload = false; public static ulong? AttemptQuickLobby = null; public static bool UpdateModSlots = false; public static bool BreakUI = false; public static bool ResortUI = false; public static bool UpdateUI = true; public static bool SwitchedPanel = true; public static bool PreviousActive = false; public static float PreviousWidth = 0f; public static float PreviousHeight = 0f; public static List<Button> DisableInteracts = new List<Button>(); public static List<Button> EnableInteracts = new List<Button>(); public static string ConfigsToDownload; public void AddModToUI(string DepString, Transform Parent, ModManifestV1 Manifest = null, ModSlotState State = ModSlotState.Enabled, bool IgnoreExisting = false) { //IL_00df: Unknown result type (might be due to invalid IL or missing references) if (!IgnoreExisting) { for (int i = 0; i < Parent.childCount; i++) { ModInfo modInfo = ModInfo.Parse(DepString); LMM_ModSlot component = ((Component)Parent.GetChild(i)).GetComponent<LMM_ModSlot>(); if (!(component.ModInfo.Full_Name != modInfo.Full_Name)) { component.ModInfo = modInfo; component.UpdateBorderByState(); component.UpdateModSlot(null, false); UpdateUI = true; return; } } } LMM_ModSlot lMM_ModSlot = Object.Instantiate<GameObject>(ModSlotTemp).AddComponent<LMM_ModSlot>(); lMM_ModSlot.ModManifest = Manifest; lMM_ModSlot.SetState(State); lMM_ModSlot.UpdateBorderByState(); lMM_ModSlot.SetModInfo(DepString); lMM_ModSlot.UpdateModSlot(null, false); ((Component)lMM_ModSlot).transform.SetParent(Parent); ((Component)lMM_ModSlot).transform.localScale = Vector3.one; UpdateUI = true; } private void Awake() { Instance = this; AssetBundle val = null; try { val = AssetBundle.LoadFromMemory(Resource1.LethalModManagerUI); } catch (Exception ex) { ModManager.MLS.LogError((object)ex); } if ((Object)(object)val == (Object)null) { ModManager.MLS.LogWarning((object)"LethalModManager could not load, WHAT."); return; } ModManager.MLS.LogWarning((object)"LethalModManagerUI has loaded."); Object obj = val.LoadAsset("ModSlotV2.prefab"); ModSlotTemp = (GameObject)(object)((obj is GameObject) ? obj : null); Object obj2 = val.LoadAsset("LMM_Canvas.prefab"); ModManagerCanvas = (GameObject)(object)((obj2 is GameObject) ? obj2 : null); ModManagerCanvas.GetComponent<CanvasScaler>().uiScaleMode = (ScaleMode)(ModManager.ScaleUI.Value ? 1 : 0); ModManagerCanvas.GetComponent<CanvasScaler>().matchWidthOrHeight = ModManager.ScaleBetweenWidthToHeight.Value; Object.DontDestroyOnLoad((Object)(object)ModManagerCanvas); Task.Run(delegate { LMM_ModHandler.LoadThunderstoreData(ModManager.ForceUpdateUponOpening.Value); }); } private void Update() { //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_0428: Unknown result type (might be due to invalid IL or missing references) //IL_042d: Unknown result type (might be due to invalid IL or missing references) //IL_044d: Unknown result type (might be due to invalid IL or missing references) //IL_0452: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Instance == (Object)null || BreakUI) { return; } if (AttemptQuickReload && LMM_ModHandler.QueuedDownloads.Count <= 0 && LMM_ModHandler.ExtractingMods.Count <= 0) { AttemptQuickReload = false; ModManager.DoorstopSettings.Add("isQuickReloaded=true"); ModManager.DoorstopSettings.Add("reloadLaunchMode=" + ((GameNetworkManager.Instance?.disableSteam).Value ? "LAN" : "Online")); if (AttemptQuickLobby.HasValue) { ModManager.DoorstopSettings.Add("joiningLobbyId=" + AttemptQuickLobby); } File.WriteAllLines(Path.Combine(Paths.GameRootPath, "doorstop_config.ini"), ModManager.DoorstopSettings); Process process = new Process { StartInfo = new ProcessStartInfo("steam://rungameid/1966720") { UseShellExecute = true } }; ModManager.MLS.LogWarning((object)process.Start()); Process.GetCurrentProcess().Kill(); return; } while (DisableInteracts.Count > 0) { ((Selectable)DisableInteracts[0]).interactable = false; DisableInteracts.Remove(DisableInteracts[0]); } while (EnableInteracts.Count > 0) { ((Selectable)EnableInteracts[0]).interactable = true; EnableInteracts.Remove(EnableInteracts[0]); } if (!((Component)LMM_Canvas).gameObject.activeSelf) { return; } if (FailedOpenLobby.HasValue) { if (FailedOpenLobby <= Time.time) { FailedOpenLobby = null; } Actions.Find<Text>("Host/OpenLobby/Text").text = ((!FailedOpenLobby.HasValue) ? "Open Lobby" : "Failed"); } if (ResortUI) { ResortUI = false; if ((Object)(object)Actions != (Object)null) { ((Transform)Actions.Find<RectTransform>("Thunderstore/ReverseSort/Text")).eulerAngles = new Vector3(0f, 0f, (float)(LMM_ModHandler.TS_Reversed ? 90 : (-90))); } ResortData(); } if (UpdateModSlots) { UpdateModSlots = false; for (int i = 0; i < LP_Host.childCount; i++) { ((Component)LP_Host.GetChild(i)).GetComponent<LMM_ModSlot>().UpdateModSlot(null, false); } for (int j = 0; j < LP_Local.childCount; j++) { ((Component)LP_Local.GetChild(j)).GetComponent<LMM_ModSlot>().UpdateModSlot(null, false); } for (int k = 0; k < LP_Downloads.childCount; k++) { ((Component)LP_Downloads.GetChild(k)).GetComponent<LMM_ModSlot>().UpdateModSlot(null, false); } } if (LMM_ModHandler.DownloadedMods.Count > 0) { string text = LMM_ModHandler.DownloadedMods.FirstOrDefault(); LMM_ModHandler.DownloadedMods.Remove(text); AddModToUI(Path.GetFileNameWithoutExtension(text), LP_Downloads); } bool flag = PreviousActive == (PreviousActive = ((Component)LMM_Canvas).gameObject.activeSelf); if (!UpdateUI && !SwitchedPanel && flag) { float previousWidth = PreviousWidth; Rect rect = LMM_Canvas.Find<RectTransform>().rect; if (previousWidth == (PreviousWidth = ((Rect)(ref rect)).width)) { float previousHeight = PreviousHeight; rect = ((Component)LMM_Canvas).GetComponent<RectTransform>().rect; if (previousHeight == (PreviousHeight = ((Rect)(ref rect)).height)) { return; } } } UpdateUI = false; SwitchedPanel = false; LMM_Utils.AdjustScroll(LP_Local); LMM_Utils.AdjustScroll(LP_Thunderstore); LMM_Utils.AdjustScroll(LP_Downloads); LMM_Utils.AdjustScroll(LP_Host); LMM_Utils.AdjustScroll(LP_LobbyMods); } public void UpdatePage(int Offset) { if (LMM_ModHandler.TS_SearchChoice == null) { return; } int count = LMM_ModHandler.TS_SearchChoice.Count; ModManager.MLS.LogWarning((object)$"{Offset} | {count} | {LMM_ModHandler.TS_Count} | {Math.Max(0, Mathf.FloorToInt((float)(count - 1) / (float)LMM_ModHandler.TS_Count) * LMM_ModHandler.TS_Count)}"); Offset = Math.Clamp(Offset, 0, Math.Max(0, Mathf.FloorToInt((float)(count - 1) / (float)LMM_ModHandler.TS_Count) * LMM_ModHandler.TS_Count)); for (int i = 0; i < Math.Min(Offset + LMM_ModHandler.TS_Count, count) - Offset; i++) { if (i < LP_Thunderstore.childCount) { LMM_ModSlot component = ((Component)LP_Thunderstore.GetChild(i)).GetComponent<LMM_ModSlot>(); if (Object.op_Implicit((Object)(object)component)) { ModListing modListing = LMM_ModHandler.TS_SearchChoice[i + Offset]; component.SetModInfo(modListing.Creator, modListing.Name, modListing?.Versions?.FirstOrDefault()?.Version); component.UpdateModSlot(true, false); } } else { AddModToUI(LMM_ModHandler.TS_SearchChoice[i + Offset].Versions.FirstOrDefault()?.Full_Version, LP_Thunderstore); } } for (int j = Math.Min(Offset + LMM_ModHandler.TS_Count, count) - Offset; j < LP_Thunderstore.childCount; j++) { LMM_ModSlot component2 = ((Component)LP_Thunderstore.GetChild(j)).GetComponent<LMM_ModSlot>(); ((MonoBehaviour)component2).StopAllCoroutines(); Object.Destroy((Object)(object)((Component)component2).gameObject); } LMM_ModHandler.TS_Offset = Offset; Actions.Find<InputField>("Thunderstore/InputPage").SetTextWithoutNotify($"{Math.Ceiling((float)(LMM_ModHandler.TS_Offset + LMM_ModHandler.TS_Count) / (float)LMM_ModHandler.TS_Count)}"); UpdateUI = true; SwitchedPanel = true; } public static void LoadMenu(string MenuName) { try { ((Component)LMM_Canvas).gameObject.SetActive(true); RectTransform val = ListPanel.Find<RectTransform>(MenuName); LMM_Utils.HideOthersInParent((Transform)(object)val); LMM_Utils.HideOthersInParent(Actions.Find(MenuName)); ListPanel.Find<ScrollRect>().content = val; UpdateUI = true; SwitchedPanel = true; } catch (Exception ex) { ModManager.MLS.LogWarning((object)ex.Message); } } public void ResortData(int? Value = null) { Dropdown val = Actions?.Find<Dropdown>("Thunderstore/SortDropdown"); if ((Object)(object)val == (Object)null) { return; } OptionData obj = val.options[Value ?? val.value]; switch (((obj != null) ? obj.text : null) ?? "Last Updated") { default: LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Updated.CompareTo(x.Updated)); break; case "Last Released": LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Created.CompareTo(x.Created)); break; case "Most Downloads": LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Downloads.CompareTo(x.Downloads)); break; case "Most Dependents": switch (ModManager.ModpackVersionCheck.Value) { case DependentVersionChecks.All: if (ModManager.SpecificModVersionDependents.Value) { LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Versions.FirstOrDefault().Dependents.CompareTo(x.Versions.FirstOrDefault().Dependents)); } else { LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Dependents.CompareTo(x.Dependents)); } break; case DependentVersionChecks.Latest: if (ModManager.SpecificModVersionDependents.Value) { LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Versions.FirstOrDefault().CurrentDependents.CompareTo(x.Versions.FirstOrDefault().CurrentDependents)); } else { LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.CurrentDependents.CompareTo(x.CurrentDependents)); } break; default: if (ModManager.SpecificModVersionDependents.Value) { LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Versions.FirstOrDefault().OnceDependents.CompareTo(x.Versions.FirstOrDefault().OnceDependents)); } else { LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.OnceDependents.CompareTo(x.OnceDependents)); } break; } break; case "Most Likes": LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Likes.CompareTo(x.Likes)); break; case "Most Dependencies": if (ModManager.CountFlattenedDependencies.Value) { LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Versions.FirstOrDefault().FilteredDependencies.Count.CompareTo(x.Versions.FirstOrDefault().FilteredDependencies.Count)); } else { LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Versions.FirstOrDefault().Dependencies.Count.CompareTo(x.Versions.FirstOrDefault().Dependencies.Count)); } break; case "Most Versions": LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Versions.Count.CompareTo(x.Versions.Count)); break; case "Latest Size": LMM_ModHandler.TS_SearchChoice.Sort((ModListing x, ModListing y) => y.Versions.FirstOrDefault().Size.CompareTo(x.Versions.FirstOrDefault().Size)); break; } if (LMM_ModHandler.TS_Reversed) { LMM_ModHandler.TS_SearchChoice?.Reverse(); } UpdatePage(LMM_ModHandler.TS_Offset); } public void UpdateProfileSelection(Dropdown ProfileSelectionDropdown, bool Select = false) { ProfileSelectionDropdown.ClearOptions(); ProfileSelectionDropdown.AddOptions(new List<string> { "Main Directory" }); List<string> list = (from x in Directory.GetDirectories(ModManager.DIR_TempProfiles.FullName) select "TEMP: " + Path.GetFileName(x)).ToList(); ProfileSelectionDropdown.AddOptions(list); List<string> list2 = Directory.GetDirectories(ModManager.DIR_Profiles.FullName).Select(Path.GetFileName).ToList(); ProfileSelectionDropdown.AddOptions(list2); string fullName = ModManager.DIR_CurrentProfile.Parent.FullName; ModManager.MLS.LogFatal((object)fullName); ModManager.MLS.LogFatal((object)ModManager.DIR_LethalCompany.FullName); string text = ((ModManager.DIR_Profiles.FullName == fullName) ? "LMM" : ((ModManager.DIR_TempProfiles.FullName == fullName) ? "TEMP" : ((ModManager.DIR_LethalCompany.FullName == ModManager.DIR_CurrentProfile.FullName) ? "MAIN" : "ALT"))); if (text == "ALT") { ProfileSelectionDropdown.AddOptions(new List<string> { "ALT: " + ModManager.DIR_CurrentProfile.Name }); if (Select) { ProfileSelectionDropdown.value = ProfileSelectionDropdown.options.Count; } } else { if (!(text != "MAIN")) { return; } List<string> ProfilesDirectory = ((text == "LMM") ? list2 : list); if (Select) { ProfileSelectionDropdown.value = ProfileSelectionDropdown.options.FindIndex((OptionData x) => !ProfilesDirectory.Contains(x.text)); } } } private void Start() { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Expected O, but got Unknown //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Expected O, but got Unknown //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Expected O, but got Unknown //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_0293: Expected O, but got Unknown //IL_02af: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Expected O, but got Unknown //IL_046b: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Expected O, but got Unknown //IL_04a1: Unknown result type (might be due to invalid IL or missing references) //IL_04ab: Expected O, but got Unknown //IL_04c7: Unknown result type (might be due to invalid IL or missing references) //IL_04d1: Expected O, but got Unknown //IL_04ed: Unknown result type (might be due to invalid IL or missing references) //IL_04f7: Expected O, but got Unknown //IL_0539: Unknown result type (might be due to invalid IL or missing references) //IL_0543: Expected O, but got Unknown //IL_055f: Unknown result type (might be due to invalid IL or missing references) //IL_0569: Expected O, but got Unknown //IL_0585: Unknown result type (might be due to invalid IL or missing references) //IL_058f: Expected O, but got Unknown //IL_0608: Unknown result type (might be due to invalid IL or missing references) //IL_0612: Expected O, but got Unknown //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Expected O, but got Unknown //IL_063b: Unknown result type (might be due to invalid IL or missing references) //IL_0640: Unknown result type (might be due to invalid IL or missing references) //IL_0646: Expected O, but got Unknown //IL_06ba: Unknown result type (might be due to invalid IL or missing references) //IL_06c4: Expected O, but got Unknown //IL_0674: Unknown result type (might be due to invalid IL or missing references) //IL_0679: Unknown result type (might be due to invalid IL or missing references) //IL_067f: Expected O, but got Unknown //IL_09d5: Unknown result type (might be due to invalid IL or missing references) //IL_09da: Unknown result type (might be due to invalid IL or missing references) try { LMM_Canvas = Object.Instantiate<GameObject>(ModManagerCanvas, GameObject.Find("Canvas").transform.parent, false).transform; ButtonClickedEvent onClick = LMM_Canvas.Find<Button>("Menu/Local_Show").onClick; object obj = <>c.<>9__34_0; if (obj == null) { UnityAction val = delegate { LoadMenu("Local"); }; <>c.<>9__34_0 = val; obj = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj); ButtonClickedEvent onClick2 = LMM_Canvas.Find<Button>("Menu/TS_Show").onClick; object obj2 = <>c.<>9__34_1; if (obj2 == null) { UnityAction val2 = delegate { LoadMenu("Thunderstore"); }; <>c.<>9__34_1 = val2; obj2 = (object)val2; } ((UnityEvent)onClick2).AddListener((UnityAction)obj2); ButtonClickedEvent onClick3 = LMM_Canvas.Find<Button>("Menu/Downloads_Show").onClick; object obj3 = <>c.<>9__34_2; if (obj3 == null) { UnityAction val3 = delegate { LoadMenu("Downloads"); }; <>c.<>9__34_2 = val3; obj3 = (object)val3; } ((UnityEvent)onClick3).AddListener((UnityAction)obj3); ButtonClickedEvent onClick4 = LMM_Canvas.Find<Button>("Menu/ExitAction").onClick; object obj4 = <>c.<>9__34_3; if (obj4 == null) { UnityAction val4 = delegate { ConfigsToDownload = null; ModManager.JoiningLobbyId = null; ((Component)LMM_Canvas).gameObject.SetActive(false); }; <>c.<>9__34_3 = val4; obj4 = (object)val4; } ((UnityEvent)onClick4).AddListener((UnityAction)obj4); ButtonClickedEvent onClick5 = LMM_Canvas.Find<Button>("Menu/Reload").onClick; object obj5 = <>O.<1>__UpdateThunderstoreData; if (obj5 == null) { UnityAction val5 = LMM_ModHandler.UpdateThunderstoreData; <>O.<1>__UpdateThunderstoreData = val5; obj5 = (object)val5; } ((UnityEvent)onClick5).AddListener((UnityAction)obj5); LMM_Canvas.Find<Text>("LMM/Text").text = "LethalModManager v0.1.6 by Kyxino"; Actions = LMM_Canvas.Find("Menu/Actions"); InputField SaveProfileInput = Actions.Find<InputField>("Local/SaveProfile"); Text SaveProfileButtonText = Actions.Find<Text>("Local/SaveProfileButton/Text"); Dropdown ProfileSelectionDropdown = Actions.Find<Dropdown>("Local/ProfileSelectionDropdown"); Text ProfileDropdownText = Actions.Find<Text>("Local/ProfileSelectionDropdown/Text"); UpdateProfileSelection(ProfileSelectionDropdown, Select: true); ((UnityEvent<int>)(object)ProfileSelectionDropdown.onValueChanged).AddListener((UnityAction<int>)delegate(int Value) { string text11 = ProfileSelectionDropdown.options[Value].text; SaveProfileInput.text = ((text11.StartsWith("TEMP:") || text11.StartsWith("ALT:")) ? "" : text11); for (int num3 = 0; num3 < LP_Local.childCount; num3++) { LMM_ModSlot component4 = ((Component)LP_Local.GetChild(num3)).GetComponent<LMM_ModSlot>(); ((MonoBehaviour)component4).StopAllCoroutines(); Object.Destroy((Object)(object)((Component)component4).gameObject); } object obj8; if (!text11.StartsWith("TEMP: ")) { obj8 = (text11.StartsWith("ALT: ") ? Paths.PluginPath : ((text11 == "Main Directory") ? Path.Combine(ModManager.DIR_LethalCompany.FullName, "BepInEx", "plugins") : Path.Combine(ModManager.DIR_Profiles.FullName, text11, "BepInEx", "plugins"))); } else { string fullName = ModManager.DIR_TempProfiles.FullName; string text12 = text11; obj8 = Path.Combine(fullName, text12.Substring(7, text12.Length - 7), "BepInEx", "plugins"); } string text13 = (string)obj8; ModManager.MLS.LogInfo((object)text13); foreach (KeyValuePair<string, ModManifestV1> mod2 in LMM_ModHandler.GetMods(text13)) { AddModToUI($"{mod2.Key}-{mod2.Value.Version}", LP_Local, mod2.Value, ModSlotState.Enabled, IgnoreExisting: true); } UpdateUI = true; SwitchedPanel = true; }); char[] InvalidPathChars = Path.GetInvalidFileNameChars(); ModManager.MLS.LogFatal((object)InvalidPathChars); SaveProfileButtonText.text = "New Profile"; ((UnityEvent<string>)(object)SaveProfileInput.onValueChanged).AddListener((UnityAction<string>)delegate(string Value) { string text10 = string.Join("", Value.Where((char x) => !InvalidPathChars.Contains(x))); int caretPosition = SaveProfileInput.caretPosition; SaveProfileInput.SetTextWithoutNotify(text10); SaveProfileInput.caretPosition = caretPosition; SaveProfileButtonText.text = (Directory.Exists(Path.Combine(ModManager.DIR_Profiles.FullName, text10)) ? "Delete Profile" : "New Profile"); }); ((UnityEvent)Actions.Find<Button>("Local/SaveProfileButton").onClick).AddListener((UnityAction)delegate { string text9 = SaveProfileInput.text.Trim(); if (text9.Length >= 1 && !(text9 == "Main Directory")) { ModManager.MLS.LogFatal((object)text9); if (SaveProfileButtonText.text == "Delete Profile") { UpdateProfileSelection(ProfileSelectionDropdown, Select: true); } else { SaveProfileButtonText.text = "Delete Profile"; LMM_ModHandler.CreateProfile(text9); ProfileSelectionDropdown.AddOptions(new List<string> { text9 }); } } }); ((UnityEvent)Actions.Find<Button>("Local/LoadProfile").onClick).AddListener((UnityAction)delegate { string text6 = SaveProfileInput.text.Trim(); for (int n = 0; n < ModManager.DoorstopSettings.Count; n++) { string text7 = ModManager.DoorstopSettings[n]; if (text7.StartsWith("targetAssembly=")) { List<string> doorstopSettings = ModManager.DoorstopSettings; int index = n; object value3; if (!(ProfileDropdownText.text == "Main Directory")) { if (!ProfileDropdownText.text.StartsWith("ALT: ")) { if (!ProfileDropdownText.text.StartsWith("TEMP: ")) { value3 = "targetAssembly=.\\LethalModManager\\Profiles\\" + ProfileDropdownText.text + "\\BepInEx\\core\\BepInEx.Preloader.dll"; } else { string text8 = ProfileDropdownText.text; value3 = "targetAssembly=.\\LethalModManager\\TempProfiles\\" + text8.Substring(5, text8.Length - 5) + "\\BepInEx\\core\\BepInEx.Preloader.dll"; } } else { value3 = Paths.BepInExAssemblyDirectory + "\\BepInEx.Preloader.dll"; } } else { value3 = "targetAssembly=BepInEx\\core\\BepInEx.Preloader.dll"; } doorstopSettings[index] = (string)value3; } } LMM_ModHandler.QuickReload(); }); ((UnityEvent)Actions.Find<Button>("Thunderstore/ReverseSort").onClick).AddListener((UnityAction)delegate { //IL_0035: Unknown result type (might be due to invalid IL or missing references) LMM_ModHandler.TS_Reversed = !LMM_ModHandler.TS_Reversed; ((Transform)Actions.Find<RectTransform>("Thunderstore/ReverseSort/Text")).eulerAngles = new Vector3(0f, 0f, (float)(LMM_ModHandler.TS_Reversed ? 90 : (-90))); LMM_ModHandler.TS_SearchChoice.Reverse(); UpdatePage(0); }); ModManager.MLS.LogWarning((object)"FFFFFFFFFFFFFFFFF"); Actions.Find<Dropdown>("Thunderstore/SortDropdown").ClearOptions(); Actions.Find<Dropdown>("Thunderstore/SortDropdown").AddOptions(new List<string>(8) { "Last Updated", "Last Released", "Most Downloads", "Most Dependents", "Most Likes", "Most Dependencies", "Most Versions", "Latest Size" }); ((UnityEvent<int>)(object)Actions.Find<Dropdown>("Thunderstore/SortDropdown").onValueChanged).AddListener((UnityAction<int>)delegate(int Value) { ResortData(Value); }); Actions.Find<Dropdown>("Thunderstore/CountDropdown").ClearOptions(); Actions.Find<Dropdown>("Thunderstore/CountDropdown").AddOptions(new List<string>(7) { "12 Results", "18 Results", "24 Results", "36 Results", "48 Results", "72 Results", "96 Results" }); ((UnityEvent<int>)(object)Actions.Find<Dropdown>("Thunderstore/CountDropdown").onValueChanged).AddListener((UnityAction<int>)delegate(int Value) { LMM_ModHandler.TS_Count = (int.TryParse(Actions.Find<Dropdown>("Thunderstore/CountDropdown").options[Value].text.Replace(" Results", ""), out var result3) ? result3 : 12); UpdatePage(LMM_ModHandler.TS_Offset); }); ModManager.MLS.LogWarning((object)"FFFFFFFFFFFFFFFFF"); Actions.Find<Dropdown>("Thunderstore/CountDropdown").value = 0; ((UnityEvent)Actions.Find<Button>("Thunderstore/SearchButton").onClick).AddListener((UnityAction)delegate { string Text = Actions.Find<InputField>("Thunderstore/Search").text.ToUpper(); LMM_ModHandler.TS_SearchChoice = LMM_ModHandler.TS_Search; if (Text.StartsWith(";")) { string text5 = Text; Text = text5.Substring(1, text5.Length - 1); LMM_ModHandler.TS_SearchChoice = LMM_ModHandler.TS_SearchChoice.Where(delegate(ModListing x) { int result2; if (!x.Tags.Contains("Modpacks")) { VersionListing? versionListing = x.Versions.FirstOrDefault(); result2 = ((versionListing != null && versionListing.Dependencies?.Count < 10) ? 1 : 0); } else { result2 = 0; } return (byte)result2 != 0; }).ToList(); } LMM_ModHandler.TS_SearchChoice = LMM_ModHandler.TS_SearchChoice.Where((ModListing x) => x.Full_Name.ToUpper().Contains(Text) || x.Versions.FirstOrDefault().Desc.ToUpper().Contains(Text)).ToList(); UpdatePage(0); }); ModManager.MLS.LogWarning((object)"FFFFFFFFFFFFFFFFF"); ((UnityEvent)Actions.Find<Button>("Thunderstore/FirstPage").onClick).AddListener((UnityAction)delegate { UpdatePage(0); }); ((UnityEvent)Actions.Find<Button>("Thunderstore/DoubleBackPage").onClick).AddListener((UnityAction)delegate { UpdatePage(LMM_ModHandler.TS_Offset - 2 * LMM_ModHandler.TS_Count); }); ((UnityEvent)Actions.Find<Button>("Thunderstore/BackPage").onClick).AddListener((UnityAction)delegate { UpdatePage(LMM_ModHandler.TS_Offset - LMM_ModHandler.TS_Count); }); ((UnityEvent<string>)(object)Actions.Find<InputField>("Thunderstore/InputPage").onEndEdit).AddListener((UnityAction<string>)delegate(string Input) { UpdatePage((int.Parse(Input) - 1) * LMM_ModHandler.TS_Count); }); ((UnityEvent)Actions.Find<Button>("Thunderstore/NextPage").onClick).AddListener((UnityAction)delegate { UpdatePage(LMM_ModHandler.TS_Offset + LMM_ModHandler.TS_Count); }); ((UnityEvent)Actions.Find<Button>("Thunderstore/DoubleNextPage").onClick).AddListener((UnityAction)delegate { UpdatePage(LMM_ModHandler.TS_Offset + 2 * LMM_ModHandler.TS_Count); }); ((UnityEvent)Actions.Find<Button>("Thunderstore/LastPage").onClick).AddListener((UnityAction)delegate { UpdatePage(Mathf.FloorToInt((float)LMM_ModHandler.TS_SearchChoice.Count / (float)LMM_ModHandler.TS_Count) * LMM_ModHandler.TS_Count); }); string[] AutoRequired = new string[6] { "Equipment", "Items", "Monsters", "Moons", "Furniture", "Modpacks" }; int AllSetting = 1; Actions.Find<Text>("Host/SetAllPriority/Text").text = "Set All Preferred"; ((UnityEvent)Actions.Find<Button>("Host/SetAllPriority").onClick).AddListener((UnityAction)delegate { for (int m = 0; m < LP_Host.childCount; m++) { LMM_ModSlot component3 = ((Component)LP_Host.GetChild(m)).GetComponent<LMM_ModSlot>(); if (!((Object)(object)component3 == (Object)null)) { switch (AllSetting) { case 0: component3.SetState(ModSlotState.Optional); break; case 1: component3.SetState(ModSlotState.Preferred); break; case -1: component3.SetState(ModSlotState.Required); break; default: { ModListing mod = component3.ModInfo.GetMod(); if (mod == null) { continue; } if (mod.Tags.Contains("Translations")) { component3.SetState(ModSlotState.Optional); } else if (mod.Tags.FirstOrDefault((string x) => AutoRequired.Contains(x)) != null || (mod.Tags.Contains("Server-side") && mod.Tags.Contains("Client-side"))) { component3.SetState(ModSlotState.Required); } else { component3.SetState(ModSlotState.Preferred); } break; } } component3.UpdateBorderByState(); } } AllSetting = (AllSetting + 2) % 4 - 1; Actions.Find<Text>("Host/SetAllPriority/Text").text = ((AllSetting == 0) ? "Set All Optional" : ((AllSetting == 1) ? "Set All Preferred" : ((AllSetting == -1) ? "Set All Required" : "Set All Mods Auto"))); }); ButtonClickedEvent onClick6 = Actions.Find<Button>("Host/OpenLobby").onClick; object obj6 = <>c.<>9__34_20; if (obj6 == null) { UnityAction val6 = delegate { ModManager.MLS.LogFatal((object)"Attempting to open lobby via mod sync."); using WebClient webClient = new WebClient(); Dictionary<string, int> dictionary2 = new Dictionary<string, int>(); for (int l = 0; l < LP_Host.childCount; l++) { LMM_ModSlot component2 = ((Component)LP_Host.GetChild(l)).GetComponent<LMM_ModSlot>(); dictionary2.Add(component2.ModInfo.Full_Version, (component2.State != ModSlotState.Optional) ? ((component2.State == ModSlotState.Preferred) ? 1 : (-1)) : 0); } ((Component)LMM_Canvas).gameObject.SetActive(false); Dictionary<string, object> dictionary3 = new Dictionary<string, object> { ["Mods"] = dictionary2, ["Configs"] = LMM_ModHandler.CompressConfigs() }; string data = "#lethalmodmanager\n" + Convert.ToBase64String(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject((object)dictionary3))); webClient.Headers.Add("Content-Type", "application/octet-stream"); string text4 = webClient.UploadString("https://thunderstore.io/api/experimental/legacyprofile/create/", data); Dictionary<string, object> dictionary4 = JsonConvert.DeserializeObject<Dictionary<string, object>>(text4); ModManager.MLS.LogWarning((object)text4); if (!dictionary4.TryGetValue("key", out var value2)) { FailedOpenLobby = Time.time + 1f; } else { ModManager.ModSyncKey = value2.ToString(); ModManager.ModSyncCount = dictionary2.Count; ModManager.MLS.LogWarning((object)ModManager.ModSyncKey); ModManager.OpeningLobby = true; Object.FindObjectOfType<MenuManager>().ConfirmHostButton(); } }; <>c.<>9__34_20 = val6; obj6 = (object)val6; } ((UnityEvent)onClick6).AddListener((UnityAction)obj6); ButtonClickedEvent onClick7 = Actions.Find<Button>("LobbyMods/ApplyAll").onClick; object obj7 = <>c.<>9__34_21; if (obj7 == null) { UnityAction val7 = delegate { for (int k = 0; k < LP_LobbyMods.childCount; k++) { ((Component)LP_LobbyMods.GetChild(k)).GetComponent<LMM_ModSlot>()?.SetState(ModSlotState.Preferred); } }; <>c.<>9__34_21 = val7; obj7 = (object)val7; } ((UnityEvent)onClick7).AddListener((UnityAction)obj7); Actions.Find<Text>("LobbyMods/Download/Text").text = "Install/Launch"; ((UnityEvent)Actions.Find<Button>("LobbyMods/Download").onClick).AddListener((UnityAction)delegate { LMM_ModHandler.CreateProfile(ModManager.JoiningLobbyId.ToString(), TempProfile: true); for (int i = 0; i < LP_LobbyMods.childCount; i++) { LMM_ModSlot component = ((Component)LP_LobbyMods.GetChild(i)).GetComponent<LMM_ModSlot>(); if ((Object)(object)component != (Object)null && (component.State == ModSlotState.Preferred || component.State == ModSlotState.Forced)) { component.ModInfo.Download(IncludeDependencies: false, ModManager.JoiningLobbyId.ToString(), SaveToTempProfile: true, IgnoreConfigs: true); } } string text = Path.Combine(ModManager.DIR_TempProfiles.FullName, ModManager.JoiningLobbyId.ToString()); Match match = Regex.Match(ConfigsToDownload, "LMM\\$.+\\n"); while (match.Success) { ModManager.MLS.LogWarning((object)match.Index); string value = match.Value; string path = text + "\\BepInEx\\" + value.Substring(4, value.Length - 1 - 4).Replace('/', '\\'); int num = match.Index + match.Length; match = match.NextMatch(); new DirectoryInfo(path).Parent.Create(); string configsToDownload = ConfigsToDownload; int num2 = num; File.WriteAllText(path, configsToDownload.Substring(num2, (match.Success ? (match.Index - 1) : ConfigsToDownload.Length) - num2)); } string text2 = SaveProfileInput.text.Trim(); for (int j = 0; j < ModManager.DoorstopSettings.Count; j++) { string text3 = ModManager.DoorstopSettings[j]; if (text3.StartsWith("targetAssembly=")) { ModManager.DoorstopSettings[j] = $"targetAssembly=.\\LethalModManager\\TempProfiles\\{ModManager.JoiningLobbyId}\\BepInEx\\core\\BepInEx.Preloader.dll"; } } LMM_ModHandler.QuickReload(ModManager.JoiningLobbyId); }); ListPanel = LMM_Canvas.Find("Menu/ListPanel"); LP_Local = ListPanel.Find("Local"); LP_Thunderstore = Object.Instantiate<Transform>(LP_Local, ListPanel, false); ((Object)LP_Thunderstore).name = "Thunderstore"; LP_Downloads = Object.Instantiate<Transform>(LP_Local, ListPanel, false); ((Object)LP_Downloads).name = "Downloads"; LP_Host = Object.Instantiate<Transform>(LP_Local, ListPanel, false); ((Object)LP_Host).name = "Host"; LP_Config = Object.Instantiate<Transform>(LP_Local, ListPanel, false); ((Object)LP_Config).name = "Config"; LP_LobbyMods = Object.Instantiate<Transform>(LP_Local, ListPanel, false); ((Object)LP_LobbyMods).name = "LobbyMods"; LP_LobbyConfigs = Object.Instantiate<Transform>(LP_Local, ListPanel, false); ((Object)LP_LobbyConfigs).name = "LobbyConfigs"; LMM_ModHandler.UserMods = LMM_ModHandler.GetMods(); Dictionary<string, ModInfo> dictionary = new Dictionary<string, ModInfo>(); foreach (string item in Directory.EnumerateFiles(".\\LethalModManager\\ModStorage", "*.zip")) { if (!ModInfo.TryParse(Path.GetFileNameWithoutExtension(item), out var result)) { continue; } string full_Name = result.Full_Name; if (dictionary.ContainsKey(full_Name)) { if (dictionary[full_Name].Version < result.Version) { dictionary[full_Name] = result; } } else { dictionary.TryAdd(full_Name, result); } } foreach (KeyValuePair<string, ModInfo> item2 in dictionary) { AddModToUI(item2.Value.Full_Version, LP_Downloads); } foreach (KeyValuePair<string, ModManifestV1> userMod in LMM_ModHandler.UserMods) { AddModToUI($"{userMod.Key}-{userMod.Value.Version}", LP_Local, userMod.Value); if (userMod.Value.UserEnabled) { Instance.AddModToUI($"{userMod.Key}-{userMod.Value.Version}", LP_Host, userMod.Value, ModSlotState.Preferred); } } UpdateUI = true; SwitchedPanel = true; ResortData(0); Object.DontDestroyOnLoad((Object)(object)LMM_Canvas); ((Component)LMM_Canvas).gameObject.SetActive(false); ((Component)LMM_Canvas.Find("Tint")).gameObject.SetActive(true); ManualLogSource mLS = ModManager.MLS; Scene activeScene = SceneManager.GetActiveScene(); mLS.LogWarning((object)("Scene: " + ((Scene)(ref activeScene)).name + " | Loaded LMM_UI.")); } catch (Exception ex) { BreakUI = true; ModManager.MLS.LogError((object)"[LMM]: Unexpected error, disabling to prevent error spam."); ModManager.MLS.LogError((object)ex); } } } public enum LaunchOptions { None, Online, LAN } public enum DependentVersionChecks { Once, Latest, All } [DefaultExecutionOrder(int.MaxValue)] [BepInPlugin("Kyxino.LethalModManager", "LethalModManager", "0.1.6")] public class ModManager : BaseUnityPlugin { private readonly Harmony HarmonyX = new Harmony("Kyxino.LethalModManager"); public const string ModVersion = "0.1.6"; internal static ManualLogSource MLS = Logger.CreateLogSource("Kyxino.LethalModManager"); public static ModManager Instance; public static ConfigFile LMM_Config = new ConfigFile(Path.Combine("LethalModManager", "Settings.cfg"), true, MetadataHelper.GetMetadata(typeof(ModManager))); public static ConfigFile Mod_Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "Kyxino.LethalModManager.cfg"), true, MetadataHelper.GetMetadata(typeof(ModManager))); public static ConfigEntry<bool> Active_LobbySearcher = Mod_Config.Bind<bool>("Active Settings", "LobbySearcher", true, "[Needs Restarting] LMM's lobby search for mod sync compatibility. (Handles basic stuff that other things that override the vanilla one typically handles, this will eventually be replaced with a lobby search in the LMM UI that won't affect the vanilla one at some point.)"); public static ConfigEntry<bool> SharedRequiredInstantLoading = LMM_Config.Bind<bool>("Mod Sync Settings", "SharedRequiredInstantLoading", false, "Temporary setting for joining hosts and sharing the same required mods to instantly join rather than download a temp profile and what not. (Warning: This is more likely to cause you to accidentally have missing mods/configs.)"); public static ConfigEntry<float> PositionalRelativityToHostButtonMultiplier = Mod_Config.Bind<float>("Mods Button", "PositionalRelativityToHostButtonMultiplier", 1f, "If another button is above the Host button, please set this to 2."); public static ConfigEntry<float> UpdateTime = LMM_Config.Bind<float>("API Settings", "UpdateTime", 30f, "How long (in minutes) between every API request to update mod info."); public static ConfigEntry<bool> ForceUpdateUponOpening = LMM_Config.Bind<bool>("API Settings", "ForceUpdateUponOpening", false, "If the mod data should update every time the game is opened REGARDLESS of the update timer."); public static ConfigEntry<bool> ScaleUI = LMM_Config.Bind<bool>("UI Settings", "ScaleUI", true, "If the UI should scale with your screen ratio."); public static ConfigEntry<float> ScaleBetweenWidthToHeight = LMM_Config.Bind<float>("UI Settings", "ScaleBetweenWidthToHeight", 1f, "How the UI should scale with your screen ratio. (Width: 0 -> Height: 1)"); public static ConfigEntry<string> ModsButtonText = LMM_Config.Bind<string>("UI Settings", "LMM_ButtonText", "> LethalModManager", "Feel free to name it whatever you want. (Modpacks can't change your choice.)"); public static ConfigEntry<int> RetryLogoLoadingTimes = LMM_Config.Bind<int>("Thunderstore Settings", "RetryLogoLoadingTimes", 5, "How many times should LMM try to load a logo from online."); public static ConfigEntry<bool> SpecificModVersionLink = LMM_Config.Bind<bool>("Thunderstore Settings", "SpecificModVersionLink", false, "If clicking the Web icon on a mod should take you to the specific version."); public static ConfigEntry<bool> HideLinkIfMissingVersion = LMM_Config.Bind<bool>("Thunderstore Settings", "HideLinkIfMissingVersion", true, "If the Web icon should be hidden from a mod if missing the selected version."); public static ConfigEntry<bool> CountFlattenedDependencies = LMM_Config.Bind<bool>("Thunderstore Settings", "CountFlattenedDependencies", false, "If it should count flattened dependencies or just listed dependencies."); public static ConfigEntry<bool> SpecificModVersionDownloads = LMM_Config.Bind<bool>("Thunderstore Settings", "SpecificModVersionDownloads", false, "If it should only show the specific version's downloads."); public static ConfigEntry<bool> SpecificModVersionDependents = LMM_Config.Bind<bool>("Thunderstore Settings", "SpecificModVersionDependents", false, "If it should only count the dependents for the specific version."); public static ConfigEntry<DependentVersionChecks> ModpackVersionCheck = LMM_Config.Bind<DependentVersionChecks>("Thunderstore Settings", "ModpackVersionCheck", DependentVersionChecks.Once, "How it should calculate those dependents."); public static ConfigEntry<bool> ForcedLobbySearch = Mod_Config.Bind<bool>("Search Settings", "ForcedLobbySearch", false, "If this is enabled, it will forcibly replace lobby searching if you want it to work regardless of other lobby mods that may change it."); public static ConfigEntry<bool> IncludeFullLobbies = Mod_Config.Bind<bool>("Search Settings", "IncludeFullLobbies", false, "Whether or not to show full lobbies. (You are weird.)"); public static ConfigEntry<bool> OnlyShowModSyncLobbies = Mod_Config.Bind<bool>("Search Settings", "OnlyShowModSyncLobbies", false, "Whether or not to ONLY show lobbies with LMM hosts for mod sync."); public static DirectoryInfo DIR_LMM = Directory.CreateDirectory("LethalModManager"); public static DirectoryInfo DIR_ModCache = DIR_LMM.CreateSubdirectory("ModCache"); public static DirectoryInfo DIR_ModStorage = DIR_LMM.CreateSubdirectory("ModStorage"); public static DirectoryInfo DIR_TempProfiles = DIR_LMM.CreateSubdirectory("TempProfiles"); public static DirectoryInfo DIR_Profiles = DIR_LMM.CreateSubdirectory("Profiles"); public static DirectoryInfo DIR_LethalCompany = DIR_LMM.Parent; public static DirectoryInfo DIR_CurrentProfile = Directory.GetParent(Paths.BepInExRootPath); public static List<string> DoorstopSettings; public static bool IsQuickReloaded; public static LaunchOptions QR_AutoLaunchMode; public static string ModSyncKey; public static int ModSyncCount; public static bool OpeningLobby; public static ulong? JoiningLobbyId; public static bool HasQuickReloaded; public static bool SkippedLaunchModeMenu; public static bool QR_SkipSplash; public static bool QR_SkipBootAnim; public static bool QL_SkipSplash; public static bool QL_SkipBootAnim; public static LaunchOptions QL_AutoLaunchMode; public static bool SkipSplash; public static bool SkipBootAnim; public static bool SkipUpdatePopup; public static bool SkipLANPopup; public static LaunchOptions AutoLaunchMode; private void Awake() { Instance = this; MLS.LogWarning((object)GeneralExtensions.Join<string>((IEnumerable<string>)DoorstopSettings, (Func<string, string>)null, "\n")); if (IsQuickReloaded) { DoorstopSettings.Remove("isQuickReloaded=true"); DoorstopSettings.Remove("reloadLaunchMode=LAN"); DoorstopSettings.Remove("reloadLaunchMode=Online"); for (int i = 0; i < DoorstopSettings.Count; i++) { string text = DoorstopSettings[i]; if (text.StartsWith("targetAssembly=")) { DoorstopSettings[i] = "targetAssembly=BepInEx\\core\\BepInEx.Preloader.dll"; } } File.WriteAllLines(Path.Combine(Paths.GameRootPath, "doorstop_config.ini"), DoorstopSettings.Where((string x) => !x.StartsWith("joiningLobbyId"))); } else { try { DirectoryInfo[] directories = DIR_TempProfiles.GetDirectories(); foreach (DirectoryInfo directoryInfo in directories) { directoryInfo.Delete(recursive: true); } } catch (Exception ex) { MLS.LogWarning((object)ex.Message); } } QuickLoad(); ((Object)((Component)this).gameObject).hideFlags = (HideFlags)63; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); ((Object)((Component)this).gameObject).name = "LethalModManager"; ((Component)this).gameObject.AddComponent<LMM_UI>(); MLS.LogInfo((object)"Loaded LethalModManager, patching."); JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = new List<JsonConverter> { (JsonConverter)(object)new ModInfoConverter() } }; HarmonyX.PatchAll(typeof(LMM_LobbySearcher)); HarmonyX.PatchAll(typeof(LMM_ModHandler)); HarmonyX.PatchAll(typeof(LMM_ModSyncer)); DirectoryInfo directoryInfo2 = new DirectoryInfo(Path.Combine(Paths.GameRootPath, "DELETE")); if (directoryInfo2.Exists) { directoryInfo2.Delete(recursive: true); } directoryInfo2.Create(); string[] files = Directory.GetFiles(Paths.GameRootPath, "*.lmm-delete", SearchOption.AllDirectories); foreach (string path in files) { try { File.Delete(path); } catch (Exception ex2) { MLS.LogError((object)ex2.Message); } } string[] files2 = Directory.GetFiles(Paths.BepInExRootPath, "*.lmm-delete", SearchOption.AllDirectories); foreach (string path2 in files2) { try { File.Delete(path2); } catch (Exception ex3) { MLS.LogError((object)ex3.Message); } } LMM_ModHandler.CreateProfile("Main Directory"); } private void QuickLoad() { if (HasQuickReloaded) { return; } HasQuickReloaded = true; SceneManager.sceneLoaded += OnSceneLoaded; HarmonyX.PatchAll(typeof(ModManager)); if (!SkipSplash) { return; } Task.Run(delegate { while (!SkippedLaunchModeMenu) { SplashScreen.Stop((StopBehavior)0); } MLS.LogWarning((object)SplashScreen.isFinished); }); } private static void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (((Scene)(ref scene)).name == "InitScene" || ((Scene)(ref scene)).name == "InitSceneLANMode") { SkippedLaunchModeMenu = true; if (SkipBootAnim) { InitializeGame val = Object.FindObjectOfType<InitializeGame>(); if (!((Object)(object)val == (Object)null)) { val.runBootUpScreen = false; } } } else { if (!(((Scene)(ref scene)).name == "MainMenu")) { return; } SkippedLaunchModeMenu = true; if (SkipUpdatePopup) { GameNetworkManager.Instance.firstTimeInMenu = false; } if (!SkipLANPopup) { return; } MenuManager obj = Object.FindObjectOfType<MenuManager>(); if (obj != null) { GameObject lanWarningContainer = obj.lanWarningContainer; if (lanWarningContainer != null) { lanWarningContainer.SetActive(false); } } } } [HarmonyPrefix] [HarmonyPatch(typeof(PreInitSceneScript), "SkipToFinalSetting")] public static bool SkipToFinalSetting(PreInitSceneScript __instance) { if (AutoLaunchMode == LaunchOptions.None) { return SkippedLaunchModeMenu = true; } GameObject launchSettingsPanelsContainer = __instance.launchSettingsPanelsContainer; if (launchSettingsPanelsContainer != null) { launchSettingsPanelsContainer.SetActive(false); } if (SkippedLaunchModeMenu) { return false; } SkippedLaunchModeMenu = true; SceneManager.LoadScene((AutoLaunchMode == LaunchOptions.LAN) ? "InitSceneLANMode" : "InitScene"); return false; } static ModManager() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown string[] array = File.ReadAllLines(Path.Combine(Paths.GameRootPath, "doorstop_config.ini")); List<string> list = new List<string>(array.Length); string[] array2 = array; foreach (string item in array2) { list.Add(item); } DoorstopSettings = list; IsQuickReloaded = DoorstopSettings.Contains("isQuickReloaded=true"); string text = DoorstopSettings.Where((string x) => x.StartsWith("reloadLaunchMode=")).LastOrDefault(); if (1 == 0) { } LaunchOptions qR_AutoLaunchMode = ((text == "reloadLaunchMode=Online") ? LaunchOptions.Online : ((text == "reloadLaunchMode=LAN") ? LaunchOptions.LAN : LaunchOptions.None)); if (1 == 0) { } QR_AutoLaunchMode = qR_AutoLaunchMode; OpeningLobby = false; JoiningLobbyId = (ulong.TryParse(DoorstopSettings.Where((string x) => x.StartsWith("joiningLobbyId=")).LastOrDefault()?.Replace("joiningLobbyId=", ""), out var result) ? new ulong?(result) : null); HasQuickReloaded = false; SkippedLaunchModeMenu = false; QR_SkipSplash = Mod_Config.Bind<bool>("Quick Reload", "SkipSplash", true, "Whether or not to skip the Unity/Zeekerss splash screen when quick reloading.").Value; QR_SkipBootAnim = Mod_Config.Bind<bool>("Quick Reload", "SkipBootAnim", true, "Whether or not to skip the OS boot animation when quick reloading.").Value; QL_SkipSplash = Mod_Config.Bind<bool>("Quick Launch", "SkipSplash", false, "Whether or not to skip the Unity/Zeekerss splash screen.").Value; QL_SkipBootAnim = Mod_Config.Bind<bool>("Quick Launch", "SkipBootAnim", false, "Whether or not to skip the OS boot animation.").Value; QL_AutoLaunchMode = Mod_Config.Bind<LaunchOptions>("Quick Launch", "AutoLaunchMode", LaunchOptions.None, "What mode should be automatically selected.").Value; SkipSplash = (IsQuickReloaded ? QR_SkipSplash : QL_SkipSplash); SkipBootAnim = (IsQuickReloaded ? QR_SkipBootAnim : QL_SkipBootAnim); SkipUpdatePopup = Mod_Config.Bind<bool>("Quick Launch", "SkipUpdatePopup", false, "Whether or not to skip the update popup.").Value; SkipLANPopup = Mod_Config.Bind<bool>("Quick Launch", "SkipLANPopup", false, "Whether or not to skip the LAN popup.").Value; AutoLaunchMode = (IsQuickReloaded ? QR_AutoLaunchMode : QL_AutoLaunchMode); } } [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] internal class Resource1 { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] internal static ResourceManager ResourceManager { get { if (resourceMan == null) { ResourceManager resourceManager = new ResourceManager("LethalModManager.Resource1", typeof(Resource1).Assembly); resourceMan = resourceManager; } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal static byte[] LethalModManagerUI { get { object @object = ResourceManager.GetObject("LethalModManagerUI", resourceCulture); return (byte[])@object; } } internal Resource1() { } } internal class LMM_LobbySearcher { [HarmonyPostfix] [HarmonyPatch(typeof(SteamLobbyManager), "loadLobbyListAndFilter")] private static void LobbyListFilter(SteamLobbyManager __instance, ref IEnumerator __result) { __result = LMM_Utils.HarmonyEnumerator(__result, null, delegate { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) LobbySlot val2 = ((Component)__instance.levelListContainer).GetComponentsInChildren<LobbySlot>().LastOrDefault(); if (!((Object)(object)val2 == (Object)null)) { Lobby thisLobby2 = val2.thisLobby; if (!Utility.IsNullOrWhiteSpace(((Lobby)(ref thisLobby2)).GetData("LMM_Sync"))) { ((TMP_Text)((Component)val2).transform.Find<TextMeshProUGUI>("JoinButton/Text (TMP)")).text = "Sync"; } ((TMP_Text)val2.LobbyName).text = ((Lobby)(ref thisLobby2)).GetData("name"); ((TMP_Text)val2.playerCount).text = $"{((Lobby)(ref thisLobby2)).MemberCount} / {((Lobby)(ref thisLobby2)).MaxMembers}"; if (!Utility.IsNullOrWhiteSpace(((Lobby)(ref thisLobby2)).GetData("LMM_Mods"))) { TextMeshProUGUI playerCount2 = val2.playerCount; ((TMP_Text)playerCount2).text = ((TMP_Text)playerCount2).text + " (" + ((Lobby)(ref thisLobby2)).GetData("LMM_Mods") + " Mods | v" + ((Lobby)(ref thisLobby2)).GetData("vers") + ")"; } if (!Utility.IsNullOrWhiteSpace(((Lobby)(ref thisLobby2)).GetData("LethalModManager"))) { ((Component)val2).transform.SetAsFirstSibling(); } } }, null, null, delegate { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) LobbySlot val = ((Component)__instance.levelListContainer).GetComponentsInChildren<LobbySlot>().LastOrDefault(); if (!((Object)(object)val == (Object)null)) { Lobby thisLobby = val.thisLobby; if (!Utility.IsNullOrWhiteSpace(((Lobby)(ref thisLobby)).GetData("LMM_Sync"))) { ((TMP_Text)((Component)val).transform.Find<TextMeshProUGUI>("JoinButton/Text (TMP)")).text = "Sync"; } ((TMP_Text)val.LobbyName).text = ((Lobby)(ref thisLobby)).GetData("name"); ((TMP_Text)val.playerCount).text = $"{((Lobby)(ref thisLobby)).MemberCount} / {((Lobby)(ref thisLobby)).MaxMembers}"; if (!Utility.IsNullOrWhiteSpace(((Lobby)(ref thisLobby)).GetData("LMM_Mods"))) { TextMeshProUGUI playerCount = val.playerCount; ((TMP_Text)playerCount).text = ((TMP_Text)playerCount).text + " (" + ((Lobby)(ref thisLobby)).GetData("LMM_Mods") + " Mods | v" + ((Lobby)(ref thisLobby)).GetData("vers") + ")"; } if (!Utility.IsNullOrWhiteSpace(((Lobby)(ref thisLobby)).GetData("LethalModManager"))) { ((Component)val).transform.SetAsFirstSibling(); } } }); } private static async void LobbyRedo(SteamLobbyManager __instance) { if (!GameNetworkManager.Instance.waitingForLobbyDataRefresh) { Coroutine loadLobbyListCoroutine = LMM_Utils.GetField<Coroutine>(__instance, "loadLobbyListCoroutine"); if (loadLobbyListCoroutine != null) { ((MonoBehaviour)__instance).StopCoroutine(loadLobbyListCoroutine); } LMM_Utils.SetField(__instance, "refreshServerListTimer", 0f); ((TMP_Text)__instance.serverListBlankText).text = "Loading server list..."; LobbySlot[] LobbySlots = Object.FindObjectsOfType<LobbySlot>(); LobbySlot[] array = LobbySlots; foreach (LobbySlot Destroy in array) { Object.Destroy((Object)(object)((Component)Destroy).gameObject); } Debug.Log((object)"Requested server list"); GameNetworkManager.Instance.waitingForLobbyDataRefresh = true; int sortByDistanceSetting = __instance.sortByDistanceSetting; if (1 == 0) { } LobbyQuery lobbyList; LobbyQuery val; switch (sortByDistanceSetting) { case 0: lobbyList = SteamMatchmaking.LobbyList; val = ((LobbyQuery)(ref lobbyList)).FilterDistanceClose(); break; case 1: lobbyList = SteamMatchmaking.LobbyList; val = ((LobbyQuery)(ref lobbyList)).FilterDistanceFar(); break; default: lobbyList = SteamMatchmaking.LobbyList; val = ((LobbyQuery)(ref lobbyList)).FilterDistanceWorldwide(); break; } if (1 == 0) { } LobbyQuery lobbyQuery = val; if (!LMM_Utils.GetField<bool>(__instance, "sortWithChallengeMoons")) { lobbyQuery = ((LobbyQuery)(ref lobbyQuery)).WithKeyValue("chal", "f"); } if (__instance.serverTagInputField.text != string.Empty) { lobbyQuery = ((LobbyQuery)(ref lobbyQuery)).WithKeyValue("tag", __instance.serverTagInputField.text.Substring(0, Mathf.Min(19, __instance.serverTagInputField.text.Length)).ToLower()); } val = ((LobbyQuery)(ref lobbyQuery)).WithSlotsAvailable((!ModManager.IncludeFullLobbies.Value) ? 1 : 0); Lobby[] AllLobbies = (await ((LobbyQuery)(ref val)).RequestAsync())?.ToArray(); Lobby[] currentLobbyList = LMM_Utils.SetField(__instance, "currentLobbyList", AllLobbies); GameNetworkManager.Instance.waitingForLobbyDataRefresh = false; if (currentLobbyList != null) { Debug.Log((object)"Got lobby list!"); LMM_Utils.InvokeMethod(__instance, "DebugLogServerList"); ((Component)__instance.serverListBlankText).gameObject.SetActive(currentLobbyList.Length == 0); ((TMP_Text)__instance.serverListBlankText).text = "No available servers to join."; LMM_Utils.SetField(__instance, "lobbySlotPositionOffset", 0f); LMM_Utils.SetField<Coroutine>(__instance, "loadLobbyListCoroutine", ((MonoBehaviour)__instance).StartCoroutine((IEnumerator)LMM_Utils.InvokeMethod(__instance, "loadLobbyListAndFilter", new object[1] { currentLobbyList }))); } else { Debug.Log((object)"Lobby list is null after request."); ((Component)__instance.serverListBlankText).gameObject.SetActive(true); ((TMP_Text)__instance.serverListBlankText).text = "No available servers to join."; } } } [HarmonyPrefix] [HarmonyPatch(typeof(SteamLobbyManager), "LoadServerList")] [HarmonyAfter(new string[] { "me.swipez.melonloader.morecompany" })] private static bool UnfortunateForcedPatch(SteamLobbyManager __instance) { if (!ModManager.ForcedLobbySearch.Value) { return true; } LobbyRedo(__instance); return false; } [HarmonyPostfix] [HarmonyPatch(typeof(SteamLobbyManager), "OnEnable")] private static void FixLobbySearchList(SteamLobbyManager __instance, Transform ___levelListContainer) { ContentSizeFitter val = ((Component)___levelListContainer).gameObject.AddComponent<ContentSizeFitter>(); val.verticalFit = (FitMode)2; VerticalLayoutGroup val2 = ((Component)___levelListContainer).gameObject.AddComponent<VerticalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)val2).childControlHeight = false; ((HorizontalOrVerticalLayoutGroup)val2).spacing = 2f; } } internal static class LMM_ModHandler { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Func<KeyValuePair<ModInfo, int>, string> <>9__21_0; public static Func<KeyValuePair<ModInfo, int>, (ModInfo Key, int Value)> <>9__21_1; public static Func<KeyValuePair<string, (ModInfo Key, int Value)>, ModInfo> <>9__21_2; public static Func<KeyValueP