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 REPOLobbyListMod v1.0.0
REPOLobbyListMod.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Threading.Tasks; using BepInEx; using BepInEx.Logging; using MenuLib; using MenuLib.MonoBehaviors; using Steamworks; using Steamworks.Data; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("REPOLobbyListMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3f571bba74fe0fa269fe60f2369d185e90583a55")] [assembly: AssemblyProduct("REPOLobbyListMod")] [assembly: AssemblyTitle("REPOLobbyListMod")] [assembly: AssemblyVersion("1.0.0.0")] namespace REPOLobbyListMod; internal enum LobbyFilterEnum { Close, Far, WorldWide } [BepInPlugin("com.github.kronik.REPOLobbyListMod", "REPOLobbyListMod", "1.0.0")] [BepInDependency("nickklmao.menulib", "2.4.1")] internal class REPOLobbyListMod : BaseUnityPlugin { private LobbyFilterEnum lobbyFilter; private REPOButton xButton; private bool serverListPopulating; private bool shouldPopulate; private const string BUTTONTEXT = " ?"; private readonly SortedDictionary<ulong, REPOElement> lobbyCache = new SortedDictionary<ulong, REPOElement>(); internal static REPOLobbyListMod Instance { get; private set; } internal REPOPopupPage ServerListPage { get; private set; } private bool IsPopulated { get { if (!serverListPopulating) { return shouldPopulate; } return false; } } private void Awake() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown Instance = this; PreventDestroy(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded plugin"); MenuAPI.AddElementToMainMenu(new BuilderDelegate(CreateMenu)); } private void PreventDestroy() { ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; } private void CreateMenu(Transform parent) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: 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_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) MenuAPI.CreateREPOButton("Server List", (Action)OnOpenServerListPressed, parent, Vector2.op_Implicit(new Vector3(150f, 218.4f))); ServerListPage = MenuAPI.CreateREPOPopupPage("Server List", (PresetSide)1, true, false, 0f); Transform transform = ((Component)ServerListPage.menuScrollBox).transform; transform.position += new Vector3(0f, -40f); Transform transform2 = ((Component)ServerListPage).transform; xButton = MenuAPI.CreateREPOButton("<color=#ff0000ff>X</color>", (Action)OnPressCloseServerListPage, transform2, Vector2.op_Implicit(new Vector3(383f, 310f, 0f))); MenuAPI.CreateREPOButton("Join Random", (Action)OnJoinRandomPressed, transform2, Vector2.op_Implicit(new Vector3(520f, 260f))); MenuAPI.CreateREPOButton("Refresh", (Action)OnRefreshPressed, transform2, Vector2.op_Implicit(new Vector3(390f, 260f))); } private void OnSortTogglePressed(bool val) { PopulateServerList(); } private void OnOpenServerListPressed() { ServerListPage.OpenPage(false); shouldPopulate = true; } private void OnPressCloseServerListPage() { ServerListPage.ClosePage(false); shouldPopulate = false; } private void OnJoinRandomPressed() { //IL_0051: Unknown result type (might be due to invalid IL or missing references) if (!IsPopulated || lobbyCache.Count == 0) { return; } int num = Random.Range(0, lobbyCache.Count - 1); int num2 = 0; foreach (KeyValuePair<ulong, REPOElement> item in lobbyCache) { if (num2++ == num) { JoinLobby(SteamId.op_Implicit(item.Key)); break; } } } private void OnRefreshPressed() { PopulateServerList(); } private async void PopulateServerList() { if (serverListPopulating || !shouldPopulate) { return; } serverListPopulating = true; ClearServerList(); Lobby[] lobbies = await GetLobbies(lobbyFilter); for (int i = 0; i < lobbies.Length; i++) { Lobby lobby = lobbies[i]; if (((Lobby)(ref lobby)).GetData("BuildName").ToString() == BuildManager.instance.version.title && shouldPopulate && (int)(await ((Lobby)(ref lobby)).Join()) == 1) { REPOElement value = await AddLobbyToList(lobby); ((Lobby)(ref lobby)).Leave(); lobbyCache.Add(SteamId.op_Implicit(((Lobby)(ref lobby)).Id), value); } if (!shouldPopulate) { ClearServerList(); break; } } serverListPopulating = false; } private void ClearServerList() { foreach (KeyValuePair<ulong, REPOElement> item in lobbyCache) { if ((Object)(object)item.Value != (Object)null) { Object.Destroy((Object)(object)((Component)item.Value).gameObject); } } lobbyCache.Clear(); } private REPOButton BuildSteamLobbyButton(Image? img, Lobby lobby, Transform parent, Action onPressed) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) REPOButton val = MenuAPI.CreateREPOButton(" ?", onPressed, parent, default(Vector2)); ((REPOElement)val).rectTransform.sizeDelta = new Vector2(260f, ((REPOElement)val).rectTransform.sizeDelta.y); if (img.HasValue) { Image valueOrDefault = img.GetValueOrDefault(); if (valueOrDefault.Data != null) { AddSteamAvatarToButton(valueOrDefault, ((Component)val).transform); } } Friend owner = ((Lobby)(ref lobby)).Owner; AddSteamPlayerNameToButton(((Friend)(ref owner)).Name, ((Component)val).transform); AddLobbyStatsToButton(lobby, ((Component)val).transform); return val; } private void AddSteamAvatarToButton(Image image, Transform parent) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D((int)image.Width, (int)image.Height, (TextureFormat)4, false, true); val.LoadRawTextureData(image.Data); val.Apply(); GameObject val2 = new GameObject("steampfp"); val2.transform.SetParent(parent); val2.transform.localScale = Vector3.one * 0.35f; val2.transform.SetLocalPositionAndRotation(Vector3.right * 110f, Quaternion.identity); RawImage val3 = val2.AddComponent<RawImage>(); val3.texture = (Texture)(object)val; Rect uvRect = val3.uvRect; float num = ((Rect)(ref uvRect)).width * -1f; uvRect = val3.uvRect; val3.uvRect = new Rect(1f, 0f, num, ((Rect)(ref uvRect)).height); ((Transform)((Component)val3).GetComponent<RectTransform>()).Rotate(new Vector3(0f, 0f, 180f), (Space)1); } private void AddSteamPlayerNameToButton(string name, Transform parent) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) REPOLabel obj = MenuAPI.CreateREPOLabel(name, parent, default(Vector2)); ((Component)obj).transform.localScale = Vector3.one * 0.55f; Transform transform = ((Component)obj).transform; transform.localPosition += Vector3.up * 20f; } private void AddLobbyStatsToButton(Lobby lobby, Transform parent) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) ((Component)MenuAPI.CreateREPOLabel($"{((Lobby)(ref lobby)).MemberCount}/{((Lobby)(ref lobby)).MaxMembers}", parent, default(Vector2))).transform.localScale = Vector3.one * 0.45f; } private async Task<REPOElement> AddLobbyToList(Lobby lobby) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) ManualLogSource logger = ((BaseUnityPlugin)this).Logger; Friend owner = ((Lobby)(ref lobby)).Owner; logger.LogInfo((object)("Added lobby: " + ((Friend)(ref owner)).Name + " to list")); SteamId steamId = ((Lobby)(ref lobby)).Id; owner = ((Lobby)(ref lobby)).Owner; REPOButton val = BuildSteamLobbyButton(await ((Friend)(ref owner)).GetMediumAvatarAsync(), lobby, null, delegate { //IL_0007: Unknown result type (might be due to invalid IL or missing references) JoinLobby(steamId); }); ServerListPage.AddElementToScrollView(((REPOElement)val).rectTransform, default(Vector2), 0f, 10f); ((REPOElement)val).rectTransform.sizeDelta = new Vector2(260f, ((REPOElement)val).rectTransform.sizeDelta.y); return (REPOElement)(object)val; } private async void JoinLobby(SteamId lobbyId) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) ServerListPage.ClosePage(true); await SteamMatchmaking.JoinLobbyAsync(lobbyId); Reflection.joinLobbyField.SetValue(SteamManager.instance, true); } private static async Task<Lobby[]> GetLobbies(LobbyFilterEnum lobbyFilter) { LobbyQuery lobbyList = SteamMatchmaking.LobbyList; LobbyQuery val = (LobbyQuery)(lobbyFilter switch { LobbyFilterEnum.Close => ((LobbyQuery)(ref lobbyList)).FilterDistanceClose(), LobbyFilterEnum.Far => ((LobbyQuery)(ref lobbyList)).FilterDistanceFar(), LobbyFilterEnum.WorldWide => ((LobbyQuery)(ref lobbyList)).FilterDistanceWorldwide(), _ => ((LobbyQuery)(ref lobbyList)).FilterDistanceClose(), }); return await ((LobbyQuery)(ref val)).RequestAsync(); } } public static class PluginInfo { public const string GUID = "com.github.kronik.REPOLobbyListMod"; public const string Name = "REPOLobbyListMod"; public const string Version = "1.0.0"; } internal static class Reflection { public static readonly FieldInfo joinLobbyField = typeof(SteamManager).GetField("joinLobby", BindingFlags.Instance | BindingFlags.NonPublic); }