using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using Imui.Controls;
using Imui.Core;
using Imui.IO.Touch;
using Imui.Rendering;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.SceneManagement;
using WKLib.API;
using WKLib.API.Input;
using WKLib.API.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("MyFirstPlugin")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("My first plugin")]
[assembly: AssemblyTitle("MyFirstPlugin")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace MyFirstPlugin
{
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "MyFirstPlugin";
public const string PLUGIN_NAME = "My first plugin";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace ListList
{
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("firebug.listlist", "ListList", "0.9.0")]
public class ListListPlugin : BaseUnityPlugin
{
internal enum menumodes
{
FilterMods,
EditFilters
}
public class MyModListTab : ModTab
{
public override string DisplayName => "ListList";
public override void DrawSubMenu(ImGui gui)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
if (ImButton.Button(gui, (ReadOnlySpan<char>)"ListList Menu", default(ImSize), (ImButtonFlag)0))
{
((WKLibWindow)MyWindowObject).isOpen = !((WKLibWindow)MyWindowObject).isOpen;
}
}
}
public class ListListMenu : WKLibWindow
{
private static menumodes filtermenumodes;
public static List<string> alertlist = new List<string>();
public static Dictionary<string, HashSet<int>> selectdic = new Dictionary<string, HashSet<int>>();
private string curfilter = "ALL MODS";
private static string filtersavebox = string.Empty;
private static bool checkboxValue;
public static HashSet<int> selectedValues = new HashSet<int>();
public static List<string> filteredpluginnames = new List<string>();
public ListListMenu()
{
base.isOpen = true;
}
public override void Draw(ImGui gui, bool isRootPanelOpen)
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0194: Unknown result type (might be due to invalid IL or missing references)
//IL_0465: Unknown result type (might be due to invalid IL or missing references)
//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
//IL_0567: Unknown result type (might be due to invalid IL or missing references)
//IL_056d: Unknown result type (might be due to invalid IL or missing references)
//IL_0599: Unknown result type (might be due to invalid IL or missing references)
//IL_059f: Unknown result type (might be due to invalid IL or missing references)
//IL_06a1: Unknown result type (might be due to invalid IL or missing references)
//IL_06a7: Unknown result type (might be due to invalid IL or missing references)
//IL_0322: Unknown result type (might be due to invalid IL or missing references)
//IL_0328: Unknown result type (might be due to invalid IL or missing references)
//IL_07ec: Unknown result type (might be due to invalid IL or missing references)
//IL_07f2: Unknown result type (might be due to invalid IL or missing references)
if (!isRootPanelOpen || !ImWindow.BeginWindow(gui, "ListList Menu", ref base.isOpen, new ImSize(800f, 400f), (ImWindowFlag)0))
{
return;
}
float spacing = gui.Style.Layout.Spacing;
float layoutWidth = ImLayoutUtility.GetLayoutWidth(gui);
float num = layoutWidth / 3f - spacing / 2f;
float layoutHeight = ImLayoutUtility.GetLayoutHeight(gui);
float num2 = layoutHeight - ImLayoutUtility.GetRowHeight(gui) - ImLayoutUtility.GetRowHeight(gui) - spacing;
ImLayoutUtility.BeginHorizontal(gui, 0f, 0f);
ImText.Text(gui, (ReadOnlySpan<char>)"Mode: ", false, (ImTextOverflow)0);
if (ImRadio.Radio<menumodes>(gui, ref filtermenumodes, true))
{
selectedValues.Clear();
if (filtermenumodes == menumodes.FilterMods && curfilter != "ALL MODS")
{
filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys.Intersect(allfilters[curfilter]));
}
else
{
filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys);
}
if (filtermenumodes == menumodes.EditFilters)
{
selectedValues.UnionWith(selectdic[curfilter]);
}
}
ImLayoutUtility.EndHorizontal(gui);
ImLayoutUtility.BeginHorizontal(gui, num, ImLayoutUtility.GetLayoutHeight(gui) - ImLayoutUtility.GetRowHeight(gui) - spacing * 3f);
ImLayoutUtility.BeginVertical(gui, num, num2);
ImSeparator.Separator(gui, (ReadOnlySpan<char>)"Filters Panel");
ImTabsPane.BeginTabsPane(gui, ImLayoutUtility.AddLayoutRect(gui, num, num2), (ImTabsPaneFlags)0);
if (ImTabsPane.BeginTab(gui, (ReadOnlySpan<char>)"Filters"))
{
foreach (string item in allfilters.Keys.ToList())
{
if (ImButton.Button(gui, (ReadOnlySpan<char>)item, default(ImSize), (ImButtonFlag)0))
{
selectedValues.Clear();
curfilter = item;
filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys.Intersect(allfilters[item]));
if (filtermenumodes == menumodes.EditFilters)
{
selectedValues.UnionWith(selectdic[curfilter]);
filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys);
}
if (alertlist.Contains(curfilter))
{
checkboxValue = true;
}
else
{
checkboxValue = false;
}
}
}
ImTabsPane.EndTab(gui);
}
if (ImTabsPane.BeginTab(gui, (ReadOnlySpan<char>)"Alerts"))
{
if (alertlist != null || alertlist.Any())
{
foreach (string item2 in alertlist)
{
if (ImButton.Button(gui, (ReadOnlySpan<char>)item2, default(ImSize), (ImButtonFlag)0))
{
Logger.LogInfo((object)string.Join(", ", selectdic.Keys));
selectedValues.Clear();
curfilter = item2;
filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys.Intersect(allfilters[item2]));
if (filtermenumodes == menumodes.EditFilters)
{
selectedValues.UnionWith(selectdic[curfilter]);
filteredpluginnames = new List<string>(Chainloader.PluginInfos.Keys);
}
checkboxValue = true;
}
}
}
ImTabsPane.EndTab(gui);
}
ImTabsPane.EndTabsPane(gui);
ImLayoutUtility.EndVertical(gui);
ImLayoutUtility.AddSpacing(gui, spacing);
ImLayoutUtility.BeginVertical(gui, num, num2);
ImSeparator.Separator(gui, (ReadOnlySpan<char>)"Mods Panel");
ImText.Text(gui, (ReadOnlySpan<char>)("Filter: " + curfilter), false, (ImTextOverflow)0);
ImList.BeginList(gui, ImSize.op_Implicit((num, num2 - ImLayoutUtility.GetRowHeight(gui) - spacing / 2f)));
for (int i = 0; i < filteredpluginnames.Count; i++)
{
bool flag = selectedValues.Contains(i);
if (ImList.ListItem(gui, flag, (ReadOnlySpan<char>)Chainloader.PluginInfos[filteredpluginnames[i]].Metadata.Name))
{
if (flag)
{
selectedValues.Remove(i);
}
else
{
selectedValues.Add(i);
}
}
}
gui.EndList((ImScrollFlag)0);
ImLayoutUtility.EndVertical(gui);
ImLayoutUtility.AddSpacing(gui, spacing);
ImLayoutUtility.BeginVertical(gui, num - spacing / 2f, num2);
ImSeparator.Separator(gui, (ReadOnlySpan<char>)"Tool Panel");
if (filtermenumodes == menumodes.EditFilters)
{
ReadOnlySpan<char> readOnlySpan = "Save filter as";
bool? flag2 = false;
ImTextEdit.TextEdit(gui, ref filtersavebox, default(ImSize), flag2, 0, (ImTouchKeyboardType)0, readOnlySpan);
ImLayoutUtility.BeginHorizontal(gui, 0f, 0f);
if (ImButton.Button(gui, (ReadOnlySpan<char>)"Delete", default(ImSize), (ImButtonFlag)0) && curfilter != "ALL MODS")
{
UIUtility.ShowPopupForTime("Delete", 10f);
selectedValues.Clear();
allfilters.Remove(curfilter);
selectdic.Remove(curfilter);
if (alertlist.Remove(curfilter))
{
File.WriteAllLines(configfolder?.ToString() + "/alertlist.txt", alertlist);
}
File.Delete(configfolder?.ToString() + "/" + curfilter);
curfilter = "ALL MODS";
}
ImTooltip.TooltipAtLastControl(gui, (ReadOnlySpan<char>)("Removes " + curfilter + "\nfrom the menu and your files"), (ImTooltipShow)1);
if (ImButton.Button(gui, (ReadOnlySpan<char>)"Save", default(ImSize), (ImButtonFlag)0) && filtersavebox != "ALL MODS")
{
List<string> list = new List<string>();
foreach (int selectedValue in selectedValues)
{
list.Add(filteredpluginnames[selectedValue]);
}
File.WriteAllLines(configfolder?.ToString() + "/" + filtersavebox + ".txt", list);
list.Clear();
allfilters[filtersavebox + ".txt"] = File.ReadAllLines(configfolder?.ToString() + "/" + filtersavebox + ".txt");
selectdic[filtersavebox + ".txt"] = new HashSet<int>(selectedValues);
UIUtility.ShowPopupForTime("Saved", 2f);
}
ImTooltip.TooltipAtLastControl(gui, (ReadOnlySpan<char>)"Saves the selected mods as a\nnew filter (to overwrite a filter,\nmake the name above the same as an\nexisting filter)", (ImTooltipShow)1);
if (ImCheckbox.Checkbox(gui, ref checkboxValue, (ReadOnlySpan<char>)"<Set Alert", default(ImSize)))
{
if (checkboxValue)
{
alertlist.Add(curfilter);
}
else
{
alertlist.Remove(curfilter);
}
File.WriteAllLines(configfolder?.ToString() + "/alertlist.txt", alertlist);
}
ImTooltip.TooltipAtLastControl(gui, (ReadOnlySpan<char>)"If enabled, shows a window on\nlaunch listing any installed mods\non this filter", (ImTooltipShow)1);
ImLayoutUtility.EndHorizontal(gui);
}
ImLayoutUtility.EndVertical(gui);
ImLayoutUtility.EndHorizontal(gui);
ImWindow.EndWindow(gui);
}
public override void HandleInput(ImGui gui)
{
if (InputUtility.GetKeyDown((KeyCode)306))
{
UIUtility.ShowPopupForTime(filtersavebox, 10f);
}
}
}
public static class SceneHandler
{
public static void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
bool flag = false;
if (!(((Scene)(ref scene)).name == "Main-Menu") || popupseen)
{
return;
}
popupseen = true;
ListListMenu.selectedValues.Clear();
ListListMenu.filteredpluginnames = Chainloader.PluginInfos.Keys.ToList();
string path = Paths.BepInExRootPath + "/plugins/Firebug-FB_Hand_Template_Palette/ailist.txt";
bool flag2 = File.Exists(path);
if (flag2)
{
File.WriteAllLines(configfolder?.ToString() + "/ailist.txt", File.ReadAllLines(path));
File.Delete(path);
if (!File.Exists(configfolder?.ToString() + "/alertlist.txt"))
{
File.WriteAllText(configfolder?.ToString() + "/alertlist.txt", "ailist.txt");
}
}
if (File.Exists(configfolder?.ToString() + "/alertlist.txt"))
{
ListListMenu.alertlist = File.ReadAllLines(configfolder?.ToString() + "/alertlist.txt").ToList();
if (flag2)
{
if (!ListListMenu.alertlist.Contains("ailist.txt"))
{
ListListMenu.alertlist.Add("ailist.txt");
}
File.WriteAllLines(configfolder?.ToString() + "/alertlist.txt", ListListMenu.alertlist);
}
}
ListListPlugin.fileInfos = configfolder.GetFiles();
for (int i = 0; i < Chainloader.PluginInfos.Count; i++)
{
ListListMenu.selectedValues.Add(i);
}
foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos)
{
Logger.LogInfo((object)$"{pluginInfo}");
}
ListListMenu.selectdic.Add("ALL MODS", new HashSet<int>(ListListMenu.selectedValues));
allfilters.Add("ALL MODS", Chainloader.PluginInfos.Keys.ToArray());
string[] array = Chainloader.PluginInfos.Keys.ToArray();
FileInfo[] fileInfos = ListListPlugin.fileInfos;
foreach (FileInfo fileInfo in fileInfos)
{
ListListMenu.selectedValues.Clear();
allfilters.Add(fileInfo.Name, File.ReadAllLines(configfolder?.ToString() + "/" + fileInfo.Name));
for (int k = 0; k < Chainloader.PluginInfos.Count; k++)
{
if (allfilters[fileInfo.Name].Contains(array[k]))
{
ListListMenu.selectedValues.Add(k);
}
}
ListListMenu.selectdic.Add(fileInfo.Name, new HashSet<int>(ListListMenu.selectedValues));
ListListMenu.selectedValues.Clear();
}
allfilters.Remove("alertlist.txt");
Dictionary<string, PluginInfo> dictionary = new Dictionary<string, PluginInfo>();
string text = "";
bool flag3 = false;
if (File.Exists(configfolder?.ToString() + "/ailist.txt") && allfilters["ailist.txt"].Any(Chainloader.PluginInfos.ContainsKey))
{
text = "AI mods detected!\nView your \"ailist.txt\" filter in ListList to check\n";
flag3 = true;
}
foreach (string item in ListListMenu.alertlist)
{
foreach (string item2 in Chainloader.PluginInfos.Keys.Intersect(allfilters[item]))
{
dictionary.Add(item2, Chainloader.PluginInfos[item2]);
flag3 = true;
}
}
if (!flag3)
{
return;
}
text += "Alert triggered! (List below)\n\n";
foreach (KeyValuePair<string, PluginInfo> item3 in dictionary)
{
text = text + ((object)item3.Value)?.ToString() + " (" + item3.Key + ")\n";
}
UIUtility.ShowPopupForTime(text, 20f);
}
}
public const string Guid = "firebug.listlist";
public const string Name = "ListList";
public const string Version = "0.9.0";
internal static ManualLogSource Logger;
public static WKLibAPI WKLibAPI;
public static ListListMenu MyWindowObject = new ListListMenu();
private static bool popupseen = false;
public static string configpath;
private static DirectoryInfo configfolder = new DirectoryInfo(Paths.ConfigPath + "/modfilters");
private static FileInfo[] fileInfos;
private static Dictionary<string, string[]> allfilters = new Dictionary<string, string[]>();
private void Awake()
{
Logger = ((BaseUnityPlugin)this).Logger;
Logger.LogInfo((object)"Plugin firebug.listlist is loaded!");
SceneManager.sceneLoaded += SceneHandler.OnSceneLoaded;
WKLibAPI = WKLibAPI.Create("ListList", "firebug.listlist");
WKLibAPI.AddWindow((WKLibWindow)(object)MyWindowObject);
WKLibAPI.AddToModList((ModTab)(object)new MyModListTab());
configpath = Paths.ConfigPath + "/modfilters";
if (!Directory.Exists(configpath))
{
Directory.CreateDirectory(configpath);
}
}
private void OnDestroy()
{
WKLibAPI.Destroy();
}
}
public static class CustomImList
{
public static void EndList(this ImGui gui, ImScrollFlag flags = (ImScrollFlag)0)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
ImScroll.EndScrollable(gui, flags);
gui.Canvas.PopClipRect();
gui.Canvas.PopRectMask();
gui.Layout.Pop();
}
}
}