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 RepoVersus v1.0.0
RepoVersus.dll
Decompiled 19 hours agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Logging; using HarmonyLib; using MenuLib; using MenuLib.MonoBehaviors; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using RepoSeeded; using Steamworks; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.UI; using WebSocketSharp; [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("Larsielol")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("RepoVersus")] [assembly: AssemblyTitle("RepoVersus")] [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 RepoVersus { [HarmonyPatch(typeof(MenuButton))] internal class ChangeMenuButtons { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__1_0; public static UnityAction <>9__1_1; internal void <setup>b__1_0() { DataDirector.instance.networkRegion = ""; SemiFunc.MenuActionHostGame((string)null, (List<string>)null); } internal void <setup>b__1_1() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) MenuManager.instance.PagePopUp("Could not open lobby menu", Color.white, "Sorry! For now only the host can join a lobby.", "Alrighty!", false); } } [CompilerGenerated] private sealed class <setPositionDelayed>d__3 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MenuButton button; public Vector3 pos; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <setPositionDelayed>d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; ((Component)button).transform.localPosition = pos; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <setSizeDelayed>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MenuButton button; public Vector2 sizeDelta; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <setSizeDelayed>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; button.rectTransform.sizeDelta = sizeDelta; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <setTextDelayed>d__2 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MenuButton button; public string text; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <setTextDelayed>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; ((TMP_Text)button.buttonText).SetText(text, true); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static MenuButton startButton; [HarmonyPostfix] [HarmonyPatch("Awake")] public static void setup(MenuButton __instance) { //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_0378: Expected O, but got Unknown //IL_0348: Unknown result type (might be due to invalid IL or missing references) //IL_0352: Expected O, but got Unknown //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Expected O, but got Unknown //IL_03f4: Unknown result type (might be due to invalid IL or missing references) //IL_03be: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_0292: Expected O, but got Unknown //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_02dc: Expected O, but got Unknown MenuButton button = __instance; if (((TMP_Text)button.buttonText).text != "start game" && (Object)(object)button != (Object)(object)startButton) { if (((TMP_Text)button.buttonText).text == "Leave") { for (int i = 0; i < ((UnityEventBase)button.menuButtonPopUp.option1Event).GetPersistentEventCount(); i++) { Debug.LogError((object)((UnityEventBase)button.menuButtonPopUp.option1Event).GetPersistentTarget(i)); Debug.LogError((object)((UnityEventBase)button.menuButtonPopUp.option1Event).GetPersistentMethodName(i)); } button.menuButtonPopUp.option1Event.AddListener(new UnityAction(RepoVersus.Instance.leaveLobby)); } else if (((TMP_Text)button.buttonText).text.ToLower() == "join friend") { ((MonoBehaviour)RepoVersus.Instance).StartCoroutine(setTextDelayed(button, "Join Teammate")); ((MonoBehaviour)RepoVersus.Instance).StartCoroutine(setPositionDelayed(button, new Vector3(0f, 202f, 0f))); ((MonoBehaviour)RepoVersus.Instance).StartCoroutine(setSizeDelayed(button, new Vector2(124f, 36f))); } else if (((TMP_Text)button.buttonText).text == "Private Game") { button.menuButtonPopUp = null; ((UnityEventBase)button.button.onClick).RemoveAllListeners(); ButtonClickedEvent onClick = button.button.onClick; object obj = <>c.<>9__1_0; if (obj == null) { UnityAction val = delegate { DataDirector.instance.networkRegion = ""; SemiFunc.MenuActionHostGame((string)null, (List<string>)null); }; <>c.<>9__1_0 = val; obj = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj); ((MonoBehaviour)RepoVersus.Instance).StartCoroutine(setTextDelayed(button, "Create team")); } else { if (!(((TMP_Text)button.buttonText).text.ToLower() == "Versus Lobby")) { return; } if (SemiFunc.IsMasterClientOrSingleplayer()) { ((UnityEventBase)button.button.onClick).RemoveAllListeners(); ((UnityEvent)button.button.onClick).AddListener(new UnityAction(RepoVersus.Instance.openLobbyPage)); return; } ((UnityEventBase)button.button.onClick).RemoveAllListeners(); ButtonClickedEvent onClick2 = button.button.onClick; object obj2 = <>c.<>9__1_1; if (obj2 == null) { UnityAction val2 = delegate { //IL_000b: Unknown result type (might be due to invalid IL or missing references) MenuManager.instance.PagePopUp("Could not open lobby menu", Color.white, "Sorry! For now only the host can join a lobby.", "Alrighty!", false); }; <>c.<>9__1_1 = val2; obj2 = (object)val2; } ((UnityEvent)onClick2).AddListener((UnityAction)obj2); } return; } startButton = button; button.menuButtonPopUp = null; ((UnityEventBase)button.button.onClick).RemoveAllListeners(); if (RepoVersus.currentLobby.host == SteamClient.Name) { ((UnityEvent)button.button.onClick).AddListener((UnityAction)delegate { ((Behaviour)button).enabled = false; RepoVersus.sendWsMessage(JsonUtility.ToJson((object)new ServerManager.UpdateOutboundPacket { type = "start", action = "" })); }); } else { ((UnityEvent)button.button.onClick).AddListener((UnityAction)delegate { RepoVersus.sendWsMessage(JsonUtility.ToJson((object)new ServerManager.UpdateOutboundPacket { type = "ready", action = "" })); if (!RepoVersus.currentLobby.playerData[SteamClient.Name].ready) { ((TMP_Text)button.buttonText).SetText("Unready", true); RepoVersus.currentLobby.playerData[SteamClient.Name].ready = true; } else { ((TMP_Text)button.buttonText).SetText("Ready up", true); RepoVersus.currentLobby.playerData[SteamClient.Name].ready = false; } }); } if (!RepoVersus.currentLobby.playerData.ContainsKey(SteamClient.Name) || RepoVersus.currentLobby.started) { ((Graphic)button.buttonText).color = new Color(0.25f, 0.25f, 0.25f); ((Behaviour)button).enabled = false; } else { ((Graphic)button.buttonText).color = new Color(0.5f, 0.5f, 0.5f); ((Behaviour)button).enabled = true; } updateStartButton(setupAgain: false); if (RepoVersus.currentLobby.host == SteamClient.Name) { ((MonoBehaviour)RepoVersus.Instance).StartCoroutine(setTextDelayed(button, "Start match")); } else if (!RepoVersus.currentLobby.playerData.ContainsKey(SteamClient.Name) || !RepoVersus.currentLobby.playerData[SteamClient.Name].ready) { ((MonoBehaviour)RepoVersus.Instance).StartCoroutine(setTextDelayed(button, "Ready up")); } else { ((MonoBehaviour)RepoVersus.Instance).StartCoroutine(setTextDelayed(button, "Unready")); } } [IteratorStateMachine(typeof(<setTextDelayed>d__2))] private static IEnumerator setTextDelayed(MenuButton button, string text) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <setTextDelayed>d__2(0) { button = button, text = text }; } [IteratorStateMachine(typeof(<setPositionDelayed>d__3))] private static IEnumerator setPositionDelayed(MenuButton button, Vector3 pos) { //IL_000e: 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) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <setPositionDelayed>d__3(0) { button = button, pos = pos }; } [IteratorStateMachine(typeof(<setSizeDelayed>d__4))] private static IEnumerator setSizeDelayed(MenuButton button, Vector2 sizeDelta) { //IL_000e: 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) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <setSizeDelayed>d__4(0) { button = button, sizeDelta = sizeDelta }; } public static void updateStartButton(bool setupAgain = true) { //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) if (setupAgain && (Object)(object)startButton != (Object)null) { setup(startButton); } if (!((Object)(object)startButton != (Object)null) || !(RepoVersus.currentLobby.host == SteamClient.Name)) { return; } bool flag = true; foreach (KeyValuePair<string, ServerManager.PlayerData> playerDatum in RepoVersus.currentLobby.playerData) { if (playerDatum.Key == SteamClient.Name || playerDatum.Value.ready) { continue; } flag = false; break; } if (flag) { ((Behaviour)startButton).enabled = true; ((Graphic)startButton.buttonText).color = Color.gray; ((TMP_Text)startButton.buttonText).SetText("Start match", true); } else { ((Graphic)startButton.buttonText).color = new Color(0.25f, 0.25f, 0.25f); ((Behaviour)startButton).enabled = false; } } } [HarmonyPatch(typeof(RunManager))] internal class DeathManager { [HarmonyPatch("ChangeLevel")] [HarmonyPrefix] private static bool detectLevelFail(bool _levelFailed, ref ChangeLevelType _changeLevelType) { if (_levelFailed && !SemiFunc.RunIsShop() && !SemiFunc.RunIsLobby()) { if (RepoVersus.currentLobby.settings.forfeitOnDeath) { RepoVersus.Instance.playerForfeit(); return false; } RepoSeeded.setSeed(RepoVersus.currentLobby.seed); RunManager.instance.ResetProgress(); MenuPageLobby.instance.ButtonStart(); return false; } return true; } } [HarmonyPatch(typeof(RoundDirector))] internal static class ExtractTracking { [HarmonyPrefix] [HarmonyPatch("ExtractionCompleted")] private static void SendExtractionMessage() { ServerManager.finishedExtract(); } } [HarmonyPatch(typeof(MenuPageEsc))] internal class LeaveLobbyOnLeaveREPOLobby { [HarmonyPatch("ButtonEventQuitToMenu")] [HarmonyPrefix] private static void leaveVersusLobby() { RepoVersus.Instance.leaveLobby(); } } [HarmonyPatch(typeof(SemiFunc))] internal static class LevelTracking { [HarmonyPrefix] [HarmonyPatch("StatSetRunLevel")] private static void SendLevelMessage(int value) { if (value == RepoVersus.currentLobby.playerData[SteamClient.Name].level) { ServerManager.finishedLevel(); } else if (value > RepoVersus.currentLobby.playerData[SteamClient.Name].level) { RepoVersus.Logger.LogError((object)$"SOMEHOW WE SKIPPED A LEVEL?? LEvel {value}"); } } } [BepInPlugin("Larsielol.RepoVersus", "RepoVersus", "1.0")] public class RepoVersus : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static BuilderDelegate <>9__25_2; public static ShouldCloseMenuDelegate <>9__27_0; public static Action<string> <>9__27_4; public static ScrollViewBuilderDelegate <>9__27_1; public static Action <>9__27_11; public static BuilderDelegate <>9__27_9; public static ScrollViewBuilderDelegate <>9__27_10; public static EventHandler <>9__34_0; public static EventHandler<CloseEventArgs> <>9__34_2; internal void <Awake>b__25_2(Transform parent) { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) Transform val = parent.Find("Buttons"); Transform val2 = val.Find("Menu Button - Public Game"); ((Component)val2).gameObject.SetActive(false); Transform val3 = val.Find("Menu Button - singleplayer"); ((Component)val3).gameObject.SetActive(false); Transform val4 = val.Find("Menu Button - Tutorial"); ((Component)val4).gameObject.SetActive(false); Transform val5 = val.Find("Menu Button - Quit game"); val5.localPosition = val4.localPosition; Transform val6 = val.Find("Menu Button - Settings"); val6.localPosition = val3.localPosition; } internal bool <openLobbyPage>b__27_0() { lobbyPage = null; return true; } internal RectTransform <openLobbyPage>b__27_1(Transform scrollView) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) Action<string> obj = delegate(string code) { RepoVersus.currentCode = code.Replace(" ", "").ToUpper(); }; string currentCode = RepoVersus.currentCode; REPOInputField val = MenuAPI.CreateREPOInputField("Lobby name", obj, scrollView, default(Vector2), false, "", currentCode); return ((REPOElement)val).rectTransform; } internal void <openLobbyPage>b__27_4(string code) { currentCode = code.Replace(" ", "").ToUpper(); } internal void <openLobbyPage>b__27_9(Transform parent) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) REPOButton val = MenuAPI.CreateREPOButton("Leave Lobby", (Action)delegate { ws.Close(); lobbyPage.ClosePage(true); ChangeMenuButtons.updateStartButton(); }, parent, new Vector2(50f, 35f)); } internal void <openLobbyPage>b__27_11() { ws.Close(); lobbyPage.ClosePage(true); ChangeMenuButtons.updateStartButton(); } internal RectTransform <openLobbyPage>b__27_10(Transform scrollView) { //IL_0009: 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_0026: 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) REPOLabel val = MenuAPI.CreateREPOLabel("Players", scrollView, default(Vector2)); ((Transform)((REPOElement)val).rectTransform).localScale = Vector2.op_Implicit(new Vector2(0.8f, 0.85f)); return ((REPOElement)val).rectTransform; } internal void <ConnectToLobbyWs>b__34_0(object sender, EventArgs e) { Console.WriteLine("Connected to the websocket."); if (wsOn) { ws.Close(); } else { wsOn = true; } } internal void <ConnectToLobbyWs>b__34_2(object sender, CloseEventArgs e) { Console.WriteLine("The websocket to the lobby was closed"); wsOn = false; currentLobby.settings.clearSeedFields(); currentLobby = new ServerManager.Lobby(); } } [CompilerGenerated] private sealed class <>c__DisplayClass28_0 { public RepoVersus <>4__this; public Action<bool> onCreate; internal void <MakeLobby>b__0(string response) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) bool flag = !response.Contains("error"); if (flag) { <>4__this.createdLobby(response); } else { string error = JsonUtility.FromJson<ServerManager.GenericResponse>(response).error; MenuManager.instance.PagePopUp("Something went wrong while creating the lobby!", Color.gray, error, "Close", false); } onCreate(flag); } } [CompilerGenerated] private sealed class <>c__DisplayClass29_0 { public RepoVersus <>4__this; public Action<bool> onJoin; internal void <JoinLobby>b__0(string response) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) bool flag = !response.Contains("error"); if (flag) { <>4__this.joinedLobby(response); } else { string error = JsonUtility.FromJson<ServerManager.GenericResponse>(response).error; MenuManager.instance.PagePopUp("Something went wrong while joining the lobby!", Color.gray, error, "Close", false); } onJoin(flag); } } [CompilerGenerated] private sealed class <JoinLobby>d__29 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string name; public Action<bool> onJoin; public RepoVersus <>4__this; private <>c__DisplayClass29_0 <>8__1; private ServerManager.GenericUnsafeRequest <req>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <JoinLobby>d__29(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; <req>5__2 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>8__1 = new <>c__DisplayClass29_0(); <>8__1.<>4__this = <>4__this; <>8__1.onJoin = onJoin; Logger.LogMessage((object)("Joining lobby " + name + ".\n")); <req>5__2 = new ServerManager.GenericUnsafeRequest(); <req>5__2.name = name; <req>5__2.player = SteamClient.Name; <>2__current = ((MonoBehaviour)<>4__this).StartCoroutine(ServerManager.postJsonRequest("/api/join", <req>5__2, delegate(string response) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) bool flag = !response.Contains("error"); if (flag) { <>8__1.<>4__this.joinedLobby(response); } else { string error = JsonUtility.FromJson<ServerManager.GenericResponse>(response).error; MenuManager.instance.PagePopUp("Something went wrong while joining the lobby!", Color.gray, error, "Close", false); } <>8__1.onJoin(flag); })); <>1__state = 1; return true; case 1: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <MakeLobby>d__28 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string name; public Action<bool> onCreate; public RepoVersus <>4__this; private <>c__DisplayClass28_0 <>8__1; private ServerManager.GenericUnsafeRequest <req>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <MakeLobby>d__28(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; <req>5__2 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>8__1 = new <>c__DisplayClass28_0(); <>8__1.<>4__this = <>4__this; <>8__1.onCreate = onCreate; <req>5__2 = new ServerManager.GenericUnsafeRequest(); <req>5__2.name = name; <req>5__2.player = SteamClient.Name; <>2__current = ((MonoBehaviour)<>4__this).StartCoroutine(ServerManager.postJsonRequest("/api/createlobby", <req>5__2, delegate(string response) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) bool flag = !response.Contains("error"); if (flag) { <>8__1.<>4__this.createdLobby(response); } else { string error = JsonUtility.FromJson<ServerManager.GenericResponse>(response).error; MenuManager.instance.PagePopUp("Something went wrong while creating the lobby!", Color.gray, error, "Close", false); } <>8__1.onCreate(flag); })); <>1__state = 1; return true; case 1: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <StartLobby>d__38 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public RepoVersus <>4__this; private ServerManager.GenericSafeRequest <request>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <StartLobby>d__38(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <request>5__1 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <request>5__1 = new ServerManager.GenericSafeRequest(); <request>5__1.name = currentLobby.name; <request>5__1.player = SteamClient.Name; <request>5__1.key = key; <>2__current = ((MonoBehaviour)<>4__this).StartCoroutine(ServerManager.postJsonRequest("/api/startlobby", <request>5__1)); <>1__state = 1; return true; case 1: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <TryReturnToLobby>d__33 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public bool playerWon; public RepoVersus <>4__this; private RunManager <rm>5__1; private bool <startedInLobbyMenu>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TryReturnToLobby>d__33(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <rm>5__1 = null; <>1__state = -2; } private bool MoveNext() { //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; if (returningToLobby) { return false; } returningToLobby = true; <rm>5__1 = RunManager.instance; <startedInLobbyMenu>5__2 = false; if (SemiFunc.MenuLevel()) { <startedInLobbyMenu>5__2 = true; <>4__this.showMatchEndedScreen(); } goto IL_00b6; case 1: <>1__state = -1; goto IL_00b6; case 2: { <>1__state = -1; if (!<startedInLobbyMenu>5__2) { if (playerWon) { <>4__this.showWinScreen(); } else { <>4__this.showLossScreen(); } } return false; } IL_00b6: if (!SemiFunc.MenuLevel()) { <rm>5__1.ChangeLevel(true, SemiFunc.RunIsArena(), (ChangeLevelType)3); <>2__current = (object)new WaitForSeconds(3f); <>1__state = 1; return true; } <rm>5__1.ResetProgress(); currentLobby.reset(); ChangeMenuButtons.updateStartButton(); returningToLobby = false; <>2__current = (object)new WaitForSeconds(5f); <>1__state = 2; return true; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static bool returningToLobby = false; internal static ServerManager.Lobby currentLobby = new ServerManager.Lobby(); internal static string key; private static bool wsOn = false; private static WebSocket ws; public static bool inMatch = false; private static string currentCode = ""; private static ServerManager.PlayerData highestLevel = new ServerManager.PlayerData(); private static REPOPopupPage lobbyPage; internal static string newestToast = ""; internal static RepoVersus Instance { get; private set; } = null; internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } public static void trySetSeed(string seed) { if (!inMatch) { setSeed(seed); } } public static void setSeed(string seed) { RepoSeeded.setSeed(seed); currentLobby.seed = seed; } internal void leaveLobby() { if (ws != null) { ws.Close(); } } private void Awake() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); RepoSeeded.isLibrary = true; RepoSeeded.randomizeSeed = false; MenuAPI.AddElementToLobbyMenu((BuilderDelegate)delegate(Transform parent) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) REPOButton val9 = MenuAPI.CreateREPOButton("Versus Lobby", (Action)openLobbyPage, parent, Vector2.op_Implicit(new Vector3(128f, 64f, 0f))); }); MenuAPI.AddElementToEscapeMenu((BuilderDelegate)delegate(Transform parent) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) REPOButton val8 = MenuAPI.CreateREPOButton("Forfeit", (Action)playerForfeit, parent, new Vector2(126f, 70f)); }); object obj = <>c.<>9__25_2; if (obj == null) { BuilderDelegate val = delegate(Transform parent) { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) Transform val2 = parent.Find("Buttons"); Transform val3 = val2.Find("Menu Button - Public Game"); ((Component)val3).gameObject.SetActive(false); Transform val4 = val2.Find("Menu Button - singleplayer"); ((Component)val4).gameObject.SetActive(false); Transform val5 = val2.Find("Menu Button - Tutorial"); ((Component)val5).gameObject.SetActive(false); Transform val6 = val2.Find("Menu Button - Quit game"); val6.localPosition = val5.localPosition; Transform val7 = val2.Find("Menu Button - Settings"); val7.localPosition = val4.localPosition; }; <>c.<>9__25_2 = val; obj = (object)val; } MenuAPI.AddElementToMainMenu((BuilderDelegate)obj); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } private void refreshLobbyPage() { if (!((Object)(object)lobbyPage == (Object)null)) { Console.WriteLine("Reopening the lobby menu."); lobbyPage.ClosePage(true); openLobbyPage(); } } public void openLobbyPage() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Expected O, but got Unknown //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Expected O, but got Unknown //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Expected O, but got Unknown string text = "Lobby"; if (currentLobby != null && currentLobby.name != null) { text = currentLobby.name; } lobbyPage = MenuAPI.CreateREPOPopupPage(text, (PresetSide)0, false, true, 1.5f); REPOPopupPage obj = lobbyPage; object obj2 = <>c.<>9__27_0; if (obj2 == null) { ShouldCloseMenuDelegate val = delegate { lobbyPage = null; return true; }; <>c.<>9__27_0 = val; obj2 = (object)val; } obj.onEscapePressed = (ShouldCloseMenuDelegate)obj2; if (currentLobby == null || currentLobby.name == null) { REPOPopupPage obj3 = lobbyPage; object obj4 = <>c.<>9__27_1; if (obj4 == null) { ScrollViewBuilderDelegate val2 = delegate(Transform scrollView) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) Action<string> obj9 = delegate(string code) { currentCode = code.Replace(" ", "").ToUpper(); }; string text2 = currentCode; REPOInputField val11 = MenuAPI.CreateREPOInputField("Lobby name", obj9, scrollView, default(Vector2), false, "", text2); return ((REPOElement)val11).rectTransform; }; <>c.<>9__27_1 = val2; obj4 = (object)val2; } obj3.AddElementToScrollView((ScrollViewBuilderDelegate)obj4, 0f, 0f); lobbyPage.AddElement((BuilderDelegate)delegate(Transform page) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) REPOButton val10 = MenuAPI.CreateREPOButton("Create Lobby", (Action)delegate { ((MonoBehaviour)this).StartCoroutine(MakeLobby(currentCode, delegate(bool created) { if (created && (Object)(object)lobbyPage != (Object)null) { ChangeMenuButtons.updateStartButton(); refreshLobbyPage(); } })); }, page, new Vector2(70f, 240f)); }); lobbyPage.AddElement((BuilderDelegate)delegate(Transform page) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) REPOButton val9 = MenuAPI.CreateREPOButton("Join Lobby", (Action)delegate { ((MonoBehaviour)this).StartCoroutine(JoinLobby(currentCode, delegate(bool joined) { if (joined && (Object)(object)lobbyPage != (Object)null) { ChangeMenuButtons.updateStartButton(); refreshLobbyPage(); } })); }, page, new Vector2(190f, 240f)); }); lobbyPage.OpenPage(false); return; } REPOPopupPage obj5 = lobbyPage; object obj6 = <>c.<>9__27_9; if (obj6 == null) { BuilderDelegate val3 = delegate(Transform parent) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) REPOButton val8 = MenuAPI.CreateREPOButton("Leave Lobby", (Action)delegate { ws.Close(); lobbyPage.ClosePage(true); ChangeMenuButtons.updateStartButton(); }, parent, new Vector2(50f, 35f)); }; <>c.<>9__27_9 = val3; obj6 = (object)val3; } obj5.AddElement((BuilderDelegate)obj6); REPOPopupPage obj7 = lobbyPage; object obj8 = <>c.<>9__27_10; if (obj8 == null) { ScrollViewBuilderDelegate val4 = delegate(Transform scrollView) { //IL_0009: 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_0026: 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) REPOLabel val7 = MenuAPI.CreateREPOLabel("Players", scrollView, default(Vector2)); ((Transform)((REPOElement)val7).rectTransform).localScale = Vector2.op_Implicit(new Vector2(0.8f, 0.85f)); return ((REPOElement)val7).rectTransform; }; <>c.<>9__27_10 = val4; obj8 = (object)val4; } obj7.AddElementToScrollView((ScrollViewBuilderDelegate)obj8, 0f, -10f); foreach (string p in currentLobby.playerData.Keys) { lobbyPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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_0046: Unknown result type (might be due to invalid IL or missing references) REPOLabel val6 = MenuAPI.CreateREPOLabel(p ?? "", scrollView, default(Vector2)); ((Transform)((REPOElement)val6).rectTransform).localScale = Vector2.op_Implicit(new Vector2(0.7f, 0.7f)); ((Graphic)val6.labelTMP).color = Color.gray; return ((REPOElement)val6).rectTransform; }, 0f, -10f); } lobbyPage.OpenPage(false); REPOPopupPage val5 = MenuAPI.CreateREPOPopupPage("Settings", (PresetSide)1, false, false, 0f); currentLobby.settings.putInScrollView(val5, currentLobby.host == SteamClient.Name); val5.OpenPage(true); } [IteratorStateMachine(typeof(<MakeLobby>d__28))] internal IEnumerator MakeLobby(string name, Action<bool> onCreate) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <MakeLobby>d__28(0) { <>4__this = this, name = name, onCreate = onCreate }; } [IteratorStateMachine(typeof(<JoinLobby>d__29))] internal IEnumerator JoinLobby(string name, Action<bool> onJoin) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <JoinLobby>d__29(0) { <>4__this = this, name = name, onJoin = onJoin }; } private void showWinScreen() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) MenuManager.instance.PagePopUp("Match results", Color.green, "You won!", "Close", false); } private void showLossScreen() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) MenuManager.instance.PagePopUp("Match results", Color.red, "You lost :(", "Close", false); } private void showMatchEndedScreen() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) if (!returningToLobby) { MenuManager.instance.PagePopUp("Match ended", Color.red, "The ongoing match has ended, you can now ready up and play another round!", "Close", false); UIManager.SetToast(""); } } [IteratorStateMachine(typeof(<TryReturnToLobby>d__33))] internal IEnumerator TryReturnToLobby(bool playerWon) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TryReturnToLobby>d__33(0) { <>4__this = this, playerWon = playerWon }; } internal void ConnectToLobbyWs() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown ws = new WebSocket("wss://repoversus.com/ws/" + currentLobby.name + "/" + SteamClient.Name + "/" + key, Array.Empty<string>()); ws.OnOpen += delegate { Console.WriteLine("Connected to the websocket."); if (wsOn) { ws.Close(); } else { wsOn = true; } }; ws.OnMessage += delegate(object sender, MessageEventArgs e) { ServerManager.UpdateInboundPacket updateInboundPacket = JsonUtility.FromJson<ServerManager.UpdateInboundPacket>(e.Data); Console.WriteLine("Message received: " + e.Data); if (updateInboundPacket.type == "update") { if (updateInboundPacket.action == "level") { currentLobby.playerData[updateInboundPacket.player].extract = 1; if (currentLobby.playerData[updateInboundPacket.player].level >= highestLevel.level) { UIManager.SetToast($"{updateInboundPacket.player} has completed level {currentLobby.playerData[updateInboundPacket.player].level}."); } currentLobby.playerData[updateInboundPacket.player].level++; } else if (updateInboundPacket.action == "extract") { if (currentLobby.playerData[updateInboundPacket.player].level >= highestLevel.level && currentLobby.playerData[updateInboundPacket.player].extract >= highestLevel.extract) { UIManager.SetToast($"{updateInboundPacket.player} has completed extract {currentLobby.playerData[updateInboundPacket.player].extract} in level {currentLobby.playerData[updateInboundPacket.player].level}."); } currentLobby.playerData[updateInboundPacket.player].extract++; } else if (updateInboundPacket.action == "forfeit") { UIManager.SetToast(updateInboundPacket.player + " has forfeit the match.", 10); } } else if (updateInboundPacket.type == "join") { currentLobby.playerData[updateInboundPacket.player] = new ServerManager.PlayerData(); ChangeMenuButtons.updateStartButton(); } else if (updateInboundPacket.type == "leave") { int num = 0; currentLobby.playerData.Remove(updateInboundPacket.player); foreach (KeyValuePair<string, ServerManager.PlayerData> playerDatum in currentLobby.playerData) { if ((playerDatum.Value.ready && playerDatum.Key != SteamClient.Name) || !currentLobby.playerData[SteamClient.Name].ready) { num++; break; } } if (num == 0) { playerWon(); } if (updateInboundPacket.player == currentLobby.host) { ws.Close(); } ChangeMenuButtons.updateStartButton(); } else if (updateInboundPacket.type == "setting") { ServerManager.SettingsPacket settingsPacket = JsonUtility.FromJson<ServerManager.SettingsPacket>(e.Data); if (settingsPacket.setting == "levels") { currentLobby.settings.levels = int.Parse(settingsPacket.newValue); } else if (settingsPacket.setting == "seed") { setSeed(settingsPacket.newValue); } else if (settingsPacket.setting == "setSeed") { currentLobby.settings.setSeed = settingsPacket.newValue == "True"; } else if (settingsPacket.setting == "forfeitOnDeath") { currentLobby.settings.forfeitOnDeath = settingsPacket.newValue == "True"; } currentLobby.settings.updateFields(); } else if (updateInboundPacket.type == "ready") { currentLobby.playerData[updateInboundPacket.player].ready = !currentLobby.playerData[updateInboundPacket.player].ready; ChangeMenuButtons.updateStartButton(); } else if (updateInboundPacket.type == "start") { foreach (ServerManager.PlayerData value in currentLobby.playerData.Values) { value.ready = true; } currentLobby.started = true; MenuPageLobby.instance.ButtonStart(); } if (updateInboundPacket.type == "finish") { ServerManager.FinishInboundPacket finishInboundPacket = JsonUtility.FromJson<ServerManager.FinishInboundPacket>(e.Data); UIManager.SetToast(""); setSeed(finishInboundPacket.newSeed); foreach (string item in currentLobby.playerData.Keys.ToList()) { currentLobby.playerData[item] = new ServerManager.PlayerData(); } ((MonoBehaviour)this).StartCoroutine(TryReturnToLobby(finishInboundPacket.winner == SteamClient.Name)); currentLobby.started = false; } }; ws.OnClose += delegate { Console.WriteLine("The websocket to the lobby was closed"); wsOn = false; currentLobby.settings.clearSeedFields(); currentLobby = new ServerManager.Lobby(); }; ws.ConnectAsync(); } internal static void sendWsMessage(string message) { ws.SendAsync(message, (Action<bool>)null); } internal void createdLobby(string response) { currentLobby = JsonConvert.DeserializeObject<ServerManager.Lobby>(response); currentLobby.playerData[SteamClient.Name] = new ServerManager.PlayerData(); currentLobby.host = SteamClient.Name; int num = response.IndexOf("\"key\":\""); int num2 = num + "\"key\":\"".Length; int num3 = response.IndexOf("\"", num2); key = response.Substring(num2, num3 - num2); setSeed(currentLobby.seed); ConnectToLobbyWs(); } internal void joinedLobby(string response) { currentLobby = JsonConvert.DeserializeObject<ServerManager.Lobby>(response); key = JsonUtility.FromJson<ServerManager.GenericResponse>(response).key; ServerManager.PlayerList playerList = JsonConvert.DeserializeObject<ServerManager.PlayerList>(response); foreach (string player in playerList.players) { currentLobby.playerData[player] = new ServerManager.PlayerData(); } setSeed(currentLobby.seed); ConnectToLobbyWs(); } [IteratorStateMachine(typeof(<StartLobby>d__38))] internal IEnumerator StartLobby() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <StartLobby>d__38(0) { <>4__this = this }; } internal void playerWon() { ((MonoBehaviour)this).StartCoroutine(TryReturnToLobby(playerWon: true)); if (currentLobby.playerData[SteamClient.Name].ready) { ServerManager.UpdateOutboundPacket updateOutboundPacket = new ServerManager.UpdateOutboundPacket(); updateOutboundPacket.type = "ready"; updateOutboundPacket.action = ""; sendWsMessage(JsonUtility.ToJson((object)updateOutboundPacket)); ChangeMenuButtons.updateStartButton(); } UIManager.SetToast(""); } internal void playerLost() { currentLobby.playerData[SteamClient.Name] = new ServerManager.PlayerData(); ((MonoBehaviour)this).StartCoroutine(TryReturnToLobby(playerWon: false)); } internal void playerForfeit() { ServerManager.UpdateOutboundPacket updateOutboundPacket = new ServerManager.UpdateOutboundPacket(); updateOutboundPacket.type = "update"; updateOutboundPacket.action = "forfeit"; sendWsMessage(JsonUtility.ToJson((object)updateOutboundPacket)); playerLost(); } internal void Patch() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0026: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } } internal static class ServerManager { internal static class ClientFields { public static REPOLabel levelsField; public static REPOLabel seedField; public static REPOLabel ffOnDeathField; public static void update() { if ((Object)(object)seedFieldHost != (Object)null) { seedFieldHost.inputStringSystem.SetValue(RepoVersus.currentLobby.seed, false); } if ((Object)(object)seedField != (Object)null) { ((TMP_Text)seedField.labelTMP).text = "Seed: " + RepoVersus.currentLobby.seed; ((REPOElement)seedField).repoScrollViewElement.visibility = RepoVersus.currentLobby.settings.setSeed; } if ((Object)(object)levelsField != (Object)null) { ((TMP_Text)levelsField.labelTMP).text = "Levels: " + RepoVersus.currentLobby.settings.levels; } if ((Object)(object)ffOnDeathField != (Object)null) { ((TMP_Text)ffOnDeathField.labelTMP).text = "Forfeit on death: " + RepoVersus.currentLobby.settings.forfeitOnDeath; } } } [Serializable] public class GenericUnsafeRequest { public string name; public string player; } [Serializable] public class GenericSafeRequest { public string name; public string player; public string key = RepoVersus.key; } [Serializable] public class GameSettings { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static ScrollViewBuilderDelegate <>9__3_6; public static Action<string> <>9__3_8; public static ScrollViewBuilderDelegate <>9__3_1; internal RectTransform <putInScrollView>b__3_6(Transform scrollView) { //IL_0022: 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_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) //IL_0055: Unknown result type (might be due to invalid IL or missing references) REPOLabel val = MenuAPI.CreateREPOLabel("Forfeit on death: " + RepoVersus.currentLobby.settings.forfeitOnDeath, scrollView, default(Vector2)); ((Transform)((REPOElement)val).rectTransform).localScale = Vector2.op_Implicit(new Vector2(0.7f, 0.7f)); ((Graphic)val.labelTMP).color = Color.gray; ClientFields.ffOnDeathField = val; return ((REPOElement)val).rectTransform; } internal RectTransform <putInScrollView>b__3_1(Transform scrollView) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) Action<string> obj = delegate(string newSeed) { RepoVersus.setSeed(newSeed); RepoVersus.sendWsMessage(JsonUtility.ToJson((object)new SettingsPacket { setting = "seed", newValue = newSeed })); }; string seed = RepoVersus.currentLobby.seed; seedFieldHost = MenuAPI.CreateREPOInputField("Seed", obj, scrollView, default(Vector2), false, "", seed); return ((REPOElement)seedFieldHost).rectTransform; } internal void <putInScrollView>b__3_8(string newSeed) { RepoVersus.setSeed(newSeed); RepoVersus.sendWsMessage(JsonUtility.ToJson((object)new SettingsPacket { setting = "seed", newValue = newSeed })); } } public bool setSeed = false; public int levels; public bool forfeitOnDeath = false; public void putInScrollView(REPOPopupPage page, bool hosting) { //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Expected O, but got Unknown //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Expected O, but got Unknown //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown if (!hosting) { REPOLabel label = null; page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: 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) //IL_005a: Unknown result type (might be due to invalid IL or missing references) label = MenuAPI.CreateREPOLabel("Seed: " + RepoVersus.currentLobby.seed, scrollView, default(Vector2)); ((Transform)((REPOElement)label).rectTransform).localScale = Vector2.op_Implicit(new Vector2(0.7f, 0.7f)); ((Graphic)label.labelTMP).color = Color.gray; ClientFields.seedField = label; return ((REPOElement)label).rectTransform; }, 0f, 0f); ((REPOElement)label).repoScrollViewElement.visibility = setSeed; page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: 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_003b: 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) REPOLabel val7 = MenuAPI.CreateREPOLabel($"Levels: {levels}", scrollView, default(Vector2)); ((Transform)((REPOElement)val7).rectTransform).localScale = Vector2.op_Implicit(new Vector2(0.7f, 0.7f)); ((Graphic)val7.labelTMP).color = Color.gray; ClientFields.levelsField = val7; return ((REPOElement)val7).rectTransform; }, 0f, -10f); object obj = <>c.<>9__3_6; if (obj == null) { ScrollViewBuilderDelegate val = delegate(Transform scrollView) { //IL_0022: 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_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) //IL_0055: Unknown result type (might be due to invalid IL or missing references) REPOLabel val6 = MenuAPI.CreateREPOLabel("Forfeit on death: " + RepoVersus.currentLobby.settings.forfeitOnDeath, scrollView, default(Vector2)); ((Transform)((REPOElement)val6).rectTransform).localScale = Vector2.op_Implicit(new Vector2(0.7f, 0.7f)); ((Graphic)val6.labelTMP).color = Color.gray; ClientFields.ffOnDeathField = val6; return ((REPOElement)val6).rectTransform; }; <>c.<>9__3_6 = val; obj = (object)val; } page.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, -10f); return; } page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) Action<bool> obj6 = delegate(bool randomize) { setSeed = !randomize; ((REPOElement)seedFieldHost).repoScrollViewElement.visibility = setSeed; seedFieldHost.inputStringSystem.SetValue(RepoVersus.currentLobby.seed, false); RepoVersus.sendWsMessage(JsonUtility.ToJson((object)new SettingsPacket { setting = "setSeed", newValue = setSeed.ToString() })); }; bool flag2 = !setSeed; REPOToggle val5 = MenuAPI.CreateREPOToggle("Randomize seed", obj6, scrollView, default(Vector2), "ON", "OFF", flag2); return ((REPOElement)val5).rectTransform; }, 0f, 0f); object obj2 = <>c.<>9__3_1; if (obj2 == null) { ScrollViewBuilderDelegate val2 = delegate(Transform scrollView) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) Action<string> obj5 = delegate(string newSeed) { RepoVersus.setSeed(newSeed); RepoVersus.sendWsMessage(JsonUtility.ToJson((object)new SettingsPacket { setting = "seed", newValue = newSeed })); }; string seed = RepoVersus.currentLobby.seed; seedFieldHost = MenuAPI.CreateREPOInputField("Seed", obj5, scrollView, default(Vector2), false, "", seed); return ((REPOElement)seedFieldHost).rectTransform; }; <>c.<>9__3_1 = val2; obj2 = (object)val2; } page.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 0f); ((REPOElement)seedFieldHost).repoScrollViewElement.visibility = setSeed; page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) Action<int> obj4 = delegate(int lvls) { levels = lvls; string message = JsonUtility.ToJson((object)new SettingsPacket { setting = "levels", newValue = levels.ToString() }); RepoVersus.sendWsMessage(message); }; int num = levels; REPOSlider val4 = MenuAPI.CreateREPOSlider("Levels", "", obj4, scrollView, default(Vector2), 1, 20, num, "", "", (BarBehavior)0); UIManager.removeSliderBackground(val4); return ((REPOElement)val4).rectTransform; }, 0f, 0f); page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) Action<bool> obj3 = delegate(bool ffOnDeath) { forfeitOnDeath = ffOnDeath; RepoVersus.sendWsMessage(JsonUtility.ToJson((object)new SettingsPacket { setting = "forfeitOnDeath", newValue = forfeitOnDeath.ToString() })); }; bool flag = forfeitOnDeath; REPOToggle val3 = MenuAPI.CreateREPOToggle("Forfeit on death", obj3, scrollView, default(Vector2), "ON", "OFF", flag); return ((REPOElement)val3).rectTransform; }, 0f, 0f); } public void updateFields() { if ((Object)(object)seedFieldHost != (Object)null) { seedFieldHost.inputStringSystem.SetValue(RepoVersus.currentLobby.seed, false); } ClientFields.update(); } public void clearSeedFields() { ClientFields.seedField = null; seedFieldHost = null; } } [Serializable] public class GenericResponse { public string success; public string error; public string seed; public string key; } [Serializable] public class Lobby { public string name; public string host; public Dictionary<string, PlayerData> playerData = new Dictionary<string, PlayerData>(); public string seed; public bool started = false; public GameSettings settings; public void reset() { foreach (PlayerData value in playerData.Values) { value.level = 1; value.extract = 1; value.forfeit = false; } } } [Serializable] public class PlayerList { public List<string> players; } [Serializable] public class PlayerData { public int extract = 1; public int level = 1; public bool forfeit = false; public bool ready = false; } [Serializable] public class UpdateOutboundPacket { public string type; public string action; } [Serializable] public class SettingsPacket { public string type = "setting"; public string setting; public string newValue; } [Serializable] public class UpdateInboundPacket { public string type; public string action; public string player; } [Serializable] public class FinishInboundPacket { public string type; public string winner; public string newSeed; } [CompilerGenerated] private sealed class <getRequest>d__16 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string endpoint; private UnityWebRequest <webRequest>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <getRequest>d__16(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <webRequest>5__1 = null; <>1__state = -2; } private bool MoveNext() { try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <webRequest>5__1 = UnityWebRequest.Get(adress + endpoint); <>1__state = -3; <>2__current = <webRequest>5__1.SendWebRequest(); <>1__state = 1; return true; case 1: <>1__state = -3; <>m__Finally1(); <webRequest>5__1 = null; return false; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<webRequest>5__1 != null) { ((IDisposable)<webRequest>5__1).Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <postJsonRequest>d__18 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string endpoint; public object message; public Action<string> callOnComplete; private string <json>5__1; private byte[] <messageB>5__2; private UnityWebRequest <www>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <postJsonRequest>d__18(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <json>5__1 = null; <messageB>5__2 = null; <www>5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Invalid comparison between Unknown and I4 try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <json>5__1 = JsonUtility.ToJson(message); <messageB>5__2 = Encoding.UTF8.GetBytes(<json>5__1); <www>5__3 = new UnityWebRequest(adress + endpoint, "POST"); <>1__state = -3; <www>5__3.uploadHandler = (UploadHandler)new UploadHandlerRaw(<messageB>5__2); <www>5__3.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); <www>5__3.SetRequestHeader("Content-Type", "application/json"); <>2__current = <www>5__3.SendWebRequest(); <>1__state = 1; return true; case 1: <>1__state = -3; if ((int)<www>5__3.result != 1) { RepoVersus.Logger.LogError((object)("POST Failed: " + <www>5__3.error)); } else { RepoVersus.Logger.LogMessage((object)("POST Success: " + <www>5__3.downloadHandler.text)); if (callOnComplete != null) { callOnComplete(<www>5__3.downloadHandler.text); } } <>m__Finally1(); <www>5__3 = null; return false; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<www>5__3 != null) { ((IDisposable)<www>5__3).Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <postTextRequest>d__17 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string endpoint; public string message; public Action<string> callOnComplete; private byte[] <messageB>5__1; private UnityWebRequest <www>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <postTextRequest>d__17(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <messageB>5__1 = null; <www>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Invalid comparison between Unknown and I4 try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <messageB>5__1 = Encoding.UTF8.GetBytes(message); <www>5__2 = new UnityWebRequest(adress + endpoint, "POST"); <>1__state = -3; <www>5__2.uploadHandler = (UploadHandler)new UploadHandlerRaw(<messageB>5__1); <www>5__2.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); <www>5__2.SetRequestHeader("Content-Type", "text/plain"); <>2__current = <www>5__2.SendWebRequest(); <>1__state = 1; return true; case 1: <>1__state = -3; if ((int)<www>5__2.result != 1) { RepoVersus.Logger.LogError((object)("POST Failed: " + <www>5__2.error)); } else { if (callOnComplete != null) { callOnComplete(<www>5__2.downloadHandler.text); } RepoVersus.Logger.LogMessage((object)("POST Success: " + <www>5__2.downloadHandler.text)); } <>m__Finally1(); <www>5__2 = null; return false; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<www>5__2 != null) { ((IDisposable)<www>5__2).Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static string adress = "https://repoversus.com"; private static REPOInputField seedFieldHost; internal static void finishedExtract() { UpdateOutboundPacket updateOutboundPacket = new UpdateOutboundPacket(); updateOutboundPacket.type = "update"; updateOutboundPacket.action = "bounce extract"; RepoVersus.sendWsMessage(JsonUtility.ToJson((object)updateOutboundPacket)); } internal static void finishedLevel() { UpdateOutboundPacket updateOutboundPacket = new UpdateOutboundPacket(); updateOutboundPacket.type = "update"; updateOutboundPacket.action = "bounce level"; RepoVersus.sendWsMessage(JsonUtility.ToJson((object)updateOutboundPacket)); } [IteratorStateMachine(typeof(<getRequest>d__16))] internal static IEnumerator getRequest(string endpoint) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <getRequest>d__16(0) { endpoint = endpoint }; } [IteratorStateMachine(typeof(<postTextRequest>d__17))] internal static IEnumerator postTextRequest(string endpoint, string message, Action<string>? callOnComplete = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <postTextRequest>d__17(0) { endpoint = endpoint, message = message, callOnComplete = callOnComplete }; } [IteratorStateMachine(typeof(<postJsonRequest>d__18))] internal static IEnumerator postJsonRequest(string endpoint, object message, Action<string>? callOnComplete = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <postJsonRequest>d__18(0) { endpoint = endpoint, message = message, callOnComplete = callOnComplete }; } } internal static class UIManager { [HarmonyPatch(typeof(HealthUI))] private class HealthUIPatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void CloneHealthUI() { SetupToast(); } } [CompilerGenerated] private sealed class <SetToast>d__5 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string text; public int seconds; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <SetToast>d__5(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; ((TMP_Text)toastText).text = text; <>2__current = (object)new WaitForSeconds((float)seconds); <>1__state = 1; return true; case 1: <>1__state = -1; if (((TMP_Text)toastText).text == text) { ((TMP_Text)toastText).text = RepoVersus.newestToast; } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static TextMeshProUGUI toastText; internal static void SetupToast() { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)toastText != (Object)null)) { GameObject gameObject = ((Component)((Component)HealthUI.instance).transform.Find("HealthMax")).gameObject; GameObject val = Object.Instantiate<GameObject>(gameObject); val.transform.parent = gameObject.transform.parent.parent; val.transform.position = Vector2.op_Implicit(new Vector2(590f, 315f)); toastText = val.GetComponent<TextMeshProUGUI>(); ((Graphic)toastText).color = Color.yellow; ((TMP_Text)toastText).lineSpacing = -50f; ((TMP_Text)toastText).text = RepoVersus.newestToast; } } internal static void SetToast(string text) { ((TMP_Text)toastText).text = text; RepoVersus.newestToast = text; } internal static void removeSliderBackground(REPOSlider slider) { ((Component)((Component)slider).gameObject.transform.Find("SliderBG").Find("RawImage (3)")).gameObject.SetActive(false); } [IteratorStateMachine(typeof(<SetToast>d__5))] internal static IEnumerator SetToast(string text, int seconds) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <SetToast>d__5(0) { text = text, seconds = seconds }; } } }