using 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);
}