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 LobbyImprovements REPO v1.1.7
BepInEx/plugins/LobbyImprovements/uk.1a3.lobbyimprovements.dll
Decompiled 6 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using ExitGames.Client.Photon; using HarmonyLib; using LobbyImprovements.Patches; using MenuLib; using MenuLib.MonoBehaviors; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Photon.Pun; using Photon.Realtime; using Steamworks; using Steamworks.Data; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; 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: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("uk.1a3.lobbyimprovements")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.7.0")] [assembly: AssemblyInformationalVersion("1.1.7+e47ac7f169769768c28ddf74c0b5ba4280a45330")] [assembly: AssemblyProduct("LobbyImprovements")] [assembly: AssemblyTitle("uk.1a3.lobbyimprovements")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace LobbyImprovements { public class ObjectScreenshotTaker : MonoBehaviour { private enum ScreenshotTypes { None, Modules, Enemies, Items, Valuables } [CompilerGenerated] private sealed class <TakeScreenshotsCoroutine>d__20 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ObjectScreenshotTaker <>4__this; public string ssType; public GameObject[] modules; private GameObject[] <>7__wrap1; private int <>7__wrap2; private GameObject <module>5__4; private string <fileName>5__5; private bool <useCollisionsForBounds>5__6; private GameObject <boundsObject>5__7; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TakeScreenshotsCoroutine>d__20(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>7__wrap1 = null; <module>5__4 = null; <fileName>5__5 = null; <boundsObject>5__7 = null; <>1__state = -2; } private bool MoveNext() { //IL_063c: Unknown result type (might be due to invalid IL or missing references) //IL_0641: Unknown result type (might be due to invalid IL or missing references) //IL_064c: Unknown result type (might be due to invalid IL or missing references) //IL_065b: Unknown result type (might be due to invalid IL or missing references) //IL_066a: Unknown result type (might be due to invalid IL or missing references) //IL_06c1: Unknown result type (might be due to invalid IL or missing references) //IL_06c6: Unknown result type (might be due to invalid IL or missing references) //IL_06ca: Unknown result type (might be due to invalid IL or missing references) //IL_06cf: Unknown result type (might be due to invalid IL or missing references) //IL_06e3: Unknown result type (might be due to invalid IL or missing references) //IL_06e8: Unknown result type (might be due to invalid IL or missing references) //IL_0466: Unknown result type (might be due to invalid IL or missing references) //IL_0736: Unknown result type (might be due to invalid IL or missing references) //IL_073b: Unknown result type (might be due to invalid IL or missing references) //IL_073f: Unknown result type (might be due to invalid IL or missing references) //IL_0744: Unknown result type (might be due to invalid IL or missing references) //IL_077a: Unknown result type (might be due to invalid IL or missing references) //IL_077f: Unknown result type (might be due to invalid IL or missing references) //IL_0783: Unknown result type (might be due to invalid IL or missing references) //IL_0788: Unknown result type (might be due to invalid IL or missing references) //IL_079f: Unknown result type (might be due to invalid IL or missing references) //IL_05d7: Unknown result type (might be due to invalid IL or missing references) //IL_07c3: Unknown result type (might be due to invalid IL or missing references) //IL_07c8: Unknown result type (might be due to invalid IL or missing references) //IL_07cc: Unknown result type (might be due to invalid IL or missing references) //IL_07d1: Unknown result type (might be due to invalid IL or missing references) //IL_07e8: Unknown result type (might be due to invalid IL or missing references) //IL_03a5: Unknown result type (might be due to invalid IL or missing references) //IL_03af: Expected O, but got Unknown //IL_09c1: Unknown result type (might be due to invalid IL or missing references) //IL_09cb: Expected O, but got Unknown //IL_053e: Unknown result type (might be due to invalid IL or missing references) //IL_0548: Expected O, but got Unknown //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_09a1: Unknown result type (might be due to invalid IL or missing references) //IL_0980: Unknown result type (might be due to invalid IL or missing references) //IL_09b6: Unknown result type (might be due to invalid IL or missing references) //IL_0412: Unknown result type (might be due to invalid IL or missing references) //IL_041c: Expected O, but got Unknown int num = <>1__state; ObjectScreenshotTaker objectScreenshotTaker = <>4__this; Bounds val2; float num2; Vector3 val3; Vector3 val4; float num3; float num4; switch (num) { default: return false; case 0: <>1__state = -1; if (!Directory.Exists(objectScreenshotTaker.SavePath + "/" + ssType)) { Directory.CreateDirectory(objectScreenshotTaker.SavePath + "/" + ssType); } <>7__wrap1 = modules; <>7__wrap2 = 0; goto IL_0a45; case 1: <>1__state = -1; <useCollisionsForBounds>5__6 = false; <boundsObject>5__7 = objectScreenshotTaker.moduleObject; if (ssType == "Enemies") { Enemy componentInChildren = objectScreenshotTaker.moduleObject.GetComponentInChildren<Enemy>(); if (componentInChildren != null) { componentInChildren.Freeze(7f); } if (((Object)<module>5__4).name == "Enemy - Bomb Thrower") { <boundsObject>5__7 = ((Component)componentInChildren.Rigidbody).gameObject; } else if (((Object)<module>5__4).name == "Enemy - Elsa") { <boundsObject>5__7 = ((Component)((Component)componentInChildren).gameObject.GetComponent<EnemyElsa>().visualsTransform).gameObject; } else if (((Object)<module>5__4).name == "Enemy - Oogly") { <boundsObject>5__7 = ((Component)((Component)componentInChildren).gameObject.GetComponent<EnemyOogly>().visualTransform).gameObject; } if (((Object)<module>5__4).name != "Enemy - Beamer" && ((Object)<module>5__4).name != "Enemy - Shadow" && ((Object)<module>5__4).name != "Enemy - Slow Walker" && ((Object)<module>5__4).name != "Enemy - Upscream") { <useCollisionsForBounds>5__6 = true; } if (((Object)<module>5__4).name == "Enemy - Bomb Thrower" || ((Object)<module>5__4).name == "Enemy - Floater" || ((Object)<module>5__4).name == "Enemy - Runner" || ((Object)<module>5__4).name == "Enemy - Slow Walker" || ((Object)<module>5__4).name == "Enemy - Tumbler") { <>2__current = (object)new WaitForSeconds(1f); <>1__state = 2; return true; } if (((Object)<module>5__4).name == "Enemy - Hidden" || ((Object)<module>5__4).name == "Enemy - Hunter" || ((Object)<module>5__4).name == "Enemy - Oogly") { <>2__current = (object)new WaitForSeconds(5f); <>1__state = 3; return true; } } else if (ssType == "Items") { Rigidbody component = objectScreenshotTaker.moduleObject.GetComponent<Rigidbody>(); if (Object.op_Implicit((Object)(object)component)) { component.useGravity = false; component.velocity = Vector3.zero; component.constraints = (RigidbodyConstraints)126; } PhysGrabObjectImpactDetector component2 = objectScreenshotTaker.moduleObject.GetComponent<PhysGrabObjectImpactDetector>(); if (Object.op_Implicit((Object)(object)component2) && !component2.particleDisable) { component2.particleDisable = true; } if (((Object)<module>5__4).name == "Item Cart Cannon" || ((Object)<module>5__4).name == "Item Cart Laser") { ItemCartCannonMain component3 = objectScreenshotTaker.moduleObject.GetComponent<ItemCartCannonMain>(); if (component3 != null) { ItemBattery battery = component3.battery; if (battery != null) { BatteryVisualLogic batteryVisualLogic = battery.batteryVisualLogic; if (batteryVisualLogic != null) { ((Component)batteryVisualLogic).gameObject.SetActive(false); } } } } <useCollisionsForBounds>5__6 = true; if (((Object)<module>5__4).name == "Item Melee Baseball Bat" || ((Object)<module>5__4).name == "Item Melee Frying Pan") { <>2__current = (object)new WaitForSeconds(1f); <>1__state = 4; return true; } } else if (ssType == "Modules") { PhysGrabObject[] array = Object.FindObjectsOfType<PhysGrabObject>(); foreach (PhysGrabObject val in array) { if (!val.hasHinge) { val.DestroyPhysGrabObject(); } } } else if (ssType == "Valuables") { Rigidbody component4 = objectScreenshotTaker.moduleObject.GetComponent<Rigidbody>(); if (Object.op_Implicit((Object)(object)component4)) { component4.useGravity = false; component4.velocity = Vector3.zero; component4.constraints = (RigidbodyConstraints)126; } PhysGrabObjectImpactDetector component5 = objectScreenshotTaker.moduleObject.GetComponent<PhysGrabObjectImpactDetector>(); if (Object.op_Implicit((Object)(object)component5) && !component5.particleDisable) { component5.particleDisable = true; } if (((Object)<module>5__4).name == "Valuable Gumball") { <useCollisionsForBounds>5__6 = true; } } goto IL_062f; case 2: <>1__state = -1; goto IL_062f; case 3: <>1__state = -1; goto IL_062f; case 4: <>1__state = -1; goto IL_062f; case 5: { <>1__state = -1; objectScreenshotTaker.TakeScreenshot(<fileName>5__5); PluginLoader.StaticLogger.LogDebug((object)("Screenshot saved: " + <fileName>5__5)); Object.Destroy((Object)(object)objectScreenshotTaker.moduleObject); if (Time.timeScale == 0f) { Time.timeScale = 1f; } <fileName>5__5 = null; <boundsObject>5__7 = null; <module>5__4 = null; goto IL_0a37; } IL_0a37: <>7__wrap2++; goto IL_0a45; IL_0a45: if (<>7__wrap2 < <>7__wrap1.Length) { <module>5__4 = <>7__wrap1[<>7__wrap2]; if (Object.op_Implicit((Object)(object)<module>5__4) && (!(ssType == "Modules") || !((Object)<module>5__4).name.StartsWith("Start Room - Shop"))) { string text = ((Object)<module>5__4).name; if (ssType == "Enemies") { text = ((Object)<module>5__4).name.Replace("Enemy - ", ""); } else if (ssType == "Modules") { text = Regex.Replace(((Object)<module>5__4).name, " - [0-9]+ - ", " - "); } <fileName>5__5 = objectScreenshotTaker.SavePath + "/" + ssType + "/" + text + ".png"; if (!File.Exists(<fileName>5__5)) { if (ssType == "Valuables" && ((Object)<module>5__4).name.StartsWith("Surplus Valuable - ")) { Time.timeScale = 0f; } objectScreenshotTaker.moduleObject = Object.Instantiate<GameObject>(<module>5__4, Vector3.zero, Quaternion.identity); <>2__current = null; <>1__state = 1; return true; } } goto IL_0a37; } <>7__wrap1 = null; return false; IL_062f: val2 = objectScreenshotTaker.CalculateBounds(<boundsObject>5__7, <useCollisionsForBounds>5__6); num2 = Mathf.Max(new float[3] { ((Bounds)(ref val2)).size.x, ((Bounds)(ref val2)).size.y, ((Bounds)(ref val2)).size.z }); objectScreenshotTaker.ScreenshotCamera.orthographic = !((Object)<module>5__4).name.StartsWith("Enemy Valuable - "); objectScreenshotTaker.ScreenshotCamera.orthographicSize = num2 * 0.8f; val3 = new Vector3(1f, 1f, -1f); val4 = ((Vector3)(ref val3)).normalized; if (ssType == "Enemies") { val4 = Vector3.forward; } else if ((ssType == "Items" && ((Object)<module>5__4).name.StartsWith("Item Upgrade ")) || ssType == "Valuables") { val3 = new Vector3(1f, 1f, 1f); val4 = ((Vector3)(ref val3)).normalized; } num3 = 1f; if (ssType == "Items") { num3 = 0.75f; } num4 = num2 * num3; ((Component)objectScreenshotTaker.ScreenshotCamera).transform.position = ((Bounds)(ref val2)).center + val4 * num4; ((Component)objectScreenshotTaker.ScreenshotCamera).transform.LookAt(((Bounds)(ref val2)).center); if (Object.op_Implicit((Object)(object)objectScreenshotTaker.ScreenshotLight)) { ((Component)objectScreenshotTaker.ScreenshotLight).transform.position = ((Bounds)(ref val2)).center + val4 * num4; ((Component)objectScreenshotTaker.ScreenshotLight).transform.LookAt(((Bounds)(ref val2)).center); } if (ssType != "Modules") { if (Object.op_Implicit((Object)(object)objectScreenshotTaker.ScreenshotLight)) { if (ssType == "Valuables" && (((Object)<module>5__4).name == "Valuable Goblet" || ((Object)<module>5__4).name == "Valuable GoldFish" || ((Object)<module>5__4).name == "Valuable GoldTooth" || ((Object)<module>5__4).name == "Valuable Piano" || ((Object)<module>5__4).name == "Valuable SilverFish" || ((Object)<module>5__4).name == "Valuable Trophy" || ((Object)<module>5__4).name == "Valuable Wizard Griffin Statue" || ((Object)<module>5__4).name == "Valuable Wizard Master Potion" || ((Object)<module>5__4).name == "Valuable Wizard Sword")) { ((Behaviour)objectScreenshotTaker.ScreenshotLight).enabled = true; } else { ((Behaviour)objectScreenshotTaker.ScreenshotLight).enabled = false; } } if ((ssType == "Enemies" && ((Object)<module>5__4).name == "Enemy - Gnome") || (ssType == "Items" && ((Object)<module>5__4).name == "Item Duck Bucket")) { objectScreenshotTaker.ambientLight = new Color(0.5f, 0.5f, 0.5f); } else { objectScreenshotTaker.ambientLight = new Color(1f, 1f, 1f); } RenderSettings.ambientLight = objectScreenshotTaker.ambientLight.Value; } <>2__current = (object)new WaitForEndOfFrame(); <>1__state = 5; 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(); } } [CompilerGenerated] private sealed class <TakeScreenshotsOfEnemies>d__15 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ObjectScreenshotTaker <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TakeScreenshotsOfEnemies>d__15(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown int num = <>1__state; ObjectScreenshotTaker objectScreenshotTaker = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; objectScreenshotTaker.screenshotType = ScreenshotTypes.Enemies; objectScreenshotTaker.ScreenshotStart(); <>2__current = (object)new WaitForSeconds(2f); <>1__state = 1; return true; case 1: { <>1__state = -1; List<GameObject> source = (from x in (from x in EnemyDirector.instance.enemiesDifficulty1.Concat(EnemyDirector.instance.enemiesDifficulty2).Concat(EnemyDirector.instance.enemiesDifficulty3) where Object.op_Implicit((Object)(object)x) && !((Object)x).name.Contains("Enemy Group - ") select x).Select(delegate(EnemySetup x) { PrefabRef? obj = ((IEnumerable<PrefabRef>)x.spawnObjects).FirstOrDefault((Func<PrefabRef, bool>)((PrefabRef o) => !o.PrefabName.Contains("Director"))); return (obj == null) ? null : obj.Prefab; }) where Object.op_Implicit((Object)(object)x) select x).ToList(); <>2__current = ((MonoBehaviour)objectScreenshotTaker).StartCoroutine(objectScreenshotTaker.TakeScreenshotsCoroutine((from x in source.Distinct() orderby ((Object)x).name select x).ToArray(), "Enemies", "Enemies")); <>1__state = 2; return true; } case 2: <>1__state = -1; objectScreenshotTaker.ScreenshotEnd(); 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 <TakeScreenshotsOfItems>d__16 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ObjectScreenshotTaker <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TakeScreenshotsOfItems>d__16(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown int num = <>1__state; ObjectScreenshotTaker objectScreenshotTaker = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; objectScreenshotTaker.screenshotType = ScreenshotTypes.Items; objectScreenshotTaker.ScreenshotStart(); <>2__current = (object)new WaitForSeconds(2f); <>1__state = 1; return true; case 1: { <>1__state = -1; List<Item> source = (from x in Resources.FindObjectsOfTypeAll<Item>() where Object.op_Implicit((Object)(object)x) && Object.op_Implicit((Object)(object)x.prefab.Prefab) select x).ToList(); <>2__current = ((MonoBehaviour)objectScreenshotTaker).StartCoroutine(objectScreenshotTaker.TakeScreenshotsCoroutine((from x in source orderby ((Object)x).name select x.prefab.Prefab).Distinct().ToArray(), "Items", "Items")); <>1__state = 2; return true; } case 2: <>1__state = -1; objectScreenshotTaker.ScreenshotEnd(); 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 <TakeScreenshotsOfModules>d__17 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ObjectScreenshotTaker <>4__this; private List<Level> <levels>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TakeScreenshotsOfModules>d__17(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <levels>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown int num = <>1__state; ObjectScreenshotTaker objectScreenshotTaker = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; objectScreenshotTaker.screenshotType = ScreenshotTypes.Modules; objectScreenshotTaker.ScreenshotStart(); <>2__current = (object)new WaitForSeconds(2f); <>1__state = 1; return true; case 1: <>1__state = -1; <levels>5__2 = (from x in Resources.FindObjectsOfTypeAll<Level>() where Object.op_Implicit((Object)(object)x) && ((Object)x).name != "Level - Lobby" && ((Object)x).name != "Level - Lobby Menu" && ((Object)x).name != "Level - Main Menu" && ((Object)x).name != "Level - Splash Screen" select x).ToList(); <>2__current = ((MonoBehaviour)objectScreenshotTaker).StartCoroutine(objectScreenshotTaker.TakeScreenshotsCoroutine((from x in (from x in <levels>5__2.SelectMany((Level x) => x.StartRooms) select x.Prefab).Distinct() orderby ((Object)x).name select x).ToArray(), "StartRoom", "Modules")); <>1__state = 2; return true; case 2: <>1__state = -1; <>2__current = ((MonoBehaviour)objectScreenshotTaker).StartCoroutine(objectScreenshotTaker.TakeScreenshotsCoroutine((from x in (from x in <levels>5__2.SelectMany((Level x) => x.ModulesNormal1.Concat(x.ModulesNormal2).Concat(x.ModulesNormal3)) select x.Prefab).Distinct() orderby ((Object)x).name select x).ToArray(), "Normal", "Modules")); <>1__state = 3; return true; case 3: <>1__state = -1; <>2__current = ((MonoBehaviour)objectScreenshotTaker).StartCoroutine(objectScreenshotTaker.TakeScreenshotsCoroutine((from x in (from x in <levels>5__2.SelectMany((Level x) => x.ModulesPassage1.Concat(x.ModulesPassage2).Concat(x.ModulesPassage3)) select x.Prefab).Distinct() orderby ((Object)x).name select x).ToArray(), "Passage", "Modules")); <>1__state = 4; return true; case 4: <>1__state = -1; <>2__current = ((MonoBehaviour)objectScreenshotTaker).StartCoroutine(objectScreenshotTaker.TakeScreenshotsCoroutine((from x in (from x in <levels>5__2.SelectMany((Level x) => x.ModulesDeadEnd1.Concat(x.ModulesDeadEnd2).Concat(x.ModulesDeadEnd3)) select x.Prefab).Distinct() orderby ((Object)x).name select x).ToArray(), "DeadEnd", "Modules")); <>1__state = 5; return true; case 5: <>1__state = -1; <>2__current = ((MonoBehaviour)objectScreenshotTaker).StartCoroutine(objectScreenshotTaker.TakeScreenshotsCoroutine((from x in (from x in <levels>5__2.SelectMany((Level x) => x.ModulesExtraction1.Concat(x.ModulesExtraction2).Concat(x.ModulesExtraction3)) select x.Prefab).Distinct() orderby ((Object)x).name select x).ToArray(), "Extraction", "Modules")); <>1__state = 6; return true; case 6: <>1__state = -1; objectScreenshotTaker.ScreenshotEnd(); 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 <TakeScreenshotsOfValuables>d__18 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ObjectScreenshotTaker <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TakeScreenshotsOfValuables>d__18(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown int num = <>1__state; ObjectScreenshotTaker objectScreenshotTaker = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; objectScreenshotTaker.screenshotType = ScreenshotTypes.Valuables; objectScreenshotTaker.ScreenshotStart(); <>2__current = (object)new WaitForSeconds(2f); <>1__state = 1; return true; case 1: { <>1__state = -1; List<ValuableObject> source = (from x in (from x in RunManager.instance.levels.SelectMany((Level x) => x.ValuablePresets.SelectMany((LevelValuables p) => p.tiny.Concat(p.small).Concat(p.medium).Concat(p.big) .Concat(p.wide) .Concat(p.tall) .Concat(p.veryTall))) select x.Prefab.GetComponent<ValuableObject>()).Concat(from item in Resources.FindObjectsOfTypeAll<ValuableObject>() where ((Object)item).name.StartsWith("Enemy Valuable - ") || ((Object)item).name.StartsWith("Surplus Valuable - ") select item) where Object.op_Implicit((Object)(object)x) && Object.op_Implicit((Object)(object)((Component)x).gameObject) select x).ToList(); <>2__current = ((MonoBehaviour)objectScreenshotTaker).StartCoroutine(objectScreenshotTaker.TakeScreenshotsCoroutine((from x in source orderby ((Object)x).name select ((Component)x).gameObject).Distinct().ToArray(), "Valuables", "Valuables")); <>1__state = 2; return true; } case 2: <>1__state = -1; objectScreenshotTaker.ScreenshotEnd(); 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 readonly string SavePath = "Screenshots"; internal static ObjectScreenshotTaker instance; internal bool isTakingScreenshots; private Camera ScreenshotCamera; private Light ScreenshotLight; private GameObject moduleObject; private RenderTexture renderTexture; private Texture2D screenshot; private Color? ambientLight; private ScreenshotTypes screenshotType; private void Awake() { //IL_00b2: 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_00e8: Expected O, but got Unknown //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)instance)) { Object.Destroy((Object)(object)((Component)this).gameObject); return; } instance = this; if ((Object)(object)ScreenshotCamera == (Object)null) { ScreenshotCamera = ((Component)this).gameObject.AddComponent<Camera>(); ScreenshotCamera.CopyFrom(Camera.main); ((Object)ScreenshotCamera).name = "ScreenshotCamera"; ScreenshotCamera.cullingMask = -4129; ScreenshotCamera.farClipPlane = 2000f; ((Behaviour)ScreenshotCamera).enabled = false; ScreenshotCamera.clearFlags = (CameraClearFlags)2; ScreenshotCamera.backgroundColor = new Color(0f, 0f, 0f, 0f); } if ((Object)(object)ScreenshotLight == (Object)null) { Light spotlight = PlayerAvatar.instance.flashlightController.spotlight; GameObject val = new GameObject("ScreenshotLight"); ScreenshotLight = val.AddComponent<Light>(); ScreenshotLight.type = spotlight.type; ScreenshotLight.color = spotlight.color; ScreenshotLight.intensity = spotlight.intensity; ScreenshotLight.range = 100f; ScreenshotLight.spotAngle = 100f; ScreenshotLight.shadows = spotlight.shadows; ScreenshotLight.cookie = spotlight.cookie; ScreenshotLight.cookieSize = spotlight.cookieSize; ScreenshotLight.renderMode = spotlight.renderMode; ((Behaviour)ScreenshotLight).enabled = false; } if (!Directory.Exists(SavePath)) { Directory.CreateDirectory(SavePath); } GameObject gameObject = ((Component)LevelGenerator.Instance.LevelParent.GetComponentInChildren<StartRoom>()).gameObject; PhysGrabObject[] array = Object.FindObjectsOfType<PhysGrabObject>(); for (int i = 0; i < array.Length; i++) { array[i].DestroyPhysGrabObject(); } Light[] componentsInChildren = ((Component)gameObject.transform).GetComponentsInChildren<Light>(); for (int i = 0; i < componentsInChildren.Length; i++) { ((Behaviour)componentsInChildren[i]).enabled = false; } Renderer[] componentsInChildren2 = ((Component)gameObject.transform).GetComponentsInChildren<Renderer>(); for (int i = 0; i < componentsInChildren2.Length; i++) { componentsInChildren2[i].enabled = false; } Canvas[] componentsInChildren3 = ((Component)gameObject.transform.Find("Truck/Truck Run")).GetComponentsInChildren<Canvas>(); for (int i = 0; i < componentsInChildren3.Length; i++) { ((Behaviour)componentsInChildren3[i]).enabled = false; } componentsInChildren = ((Component)PlayerAvatar.instance).GetComponentsInChildren<Light>(); for (int i = 0; i < componentsInChildren.Length; i++) { ((Behaviour)componentsInChildren[i]).enabled = false; } componentsInChildren2 = ((Component)PlayerAvatar.instance).GetComponentsInChildren<Renderer>(); for (int i = 0; i < componentsInChildren2.Length; i++) { componentsInChildren2[i].enabled = false; } } private void OnDestroy() { PluginLoader.StaticLogger.LogInfo((object)"[ModuleScreenshotTaker] Destroying..."); if (Object.op_Implicit((Object)(object)ScreenshotLight)) { Object.Destroy((Object)(object)((Component)ScreenshotLight).gameObject); } } private void ScreenshotStart() { isTakingScreenshots = true; PlayerAvatar.instance.flashlightController.hideFlashlight = true; PluginLoader.StaticLogger.LogInfo((object)"[ModuleScreenshotTaker] Starting"); } private void ScreenshotEnd() { if (Object.op_Implicit((Object)(object)ScreenshotLight)) { ((Behaviour)ScreenshotLight).enabled = false; } PlayerAvatar.instance.flashlightController.hideFlashlight = false; ambientLight = null; EnvironmentDirector.Instance.DarkAdaptationLerp = ((!FlashlightController.Instance.LightActive) ? 0.01f : 0.99f); isTakingScreenshots = false; PluginLoader.StaticLogger.LogInfo((object)"[ModuleScreenshotTaker] Finished"); if (Object.op_Implicit((Object)(object)ScreenshotLight)) { Object.Destroy((Object)(object)((Component)ScreenshotLight).gameObject); } Object.Destroy((Object)(object)((Component)this).gameObject); } [IteratorStateMachine(typeof(<TakeScreenshotsOfEnemies>d__15))] internal IEnumerator TakeScreenshotsOfEnemies() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TakeScreenshotsOfEnemies>d__15(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<TakeScreenshotsOfItems>d__16))] internal IEnumerator TakeScreenshotsOfItems() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TakeScreenshotsOfItems>d__16(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<TakeScreenshotsOfModules>d__17))] internal IEnumerator TakeScreenshotsOfModules() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TakeScreenshotsOfModules>d__17(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<TakeScreenshotsOfValuables>d__18))] internal IEnumerator TakeScreenshotsOfValuables() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TakeScreenshotsOfValuables>d__18(0) { <>4__this = this }; } private Bounds CalculateBounds(GameObject go, bool useColliders = false) { //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: 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_0040: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) if (useColliders) { Collider[] array = (from r in go.GetComponentsInChildren<Collider>(true) where r.enabled && ((Component)r).gameObject.activeInHierarchy && !r.isTrigger select r).ToArray(); if (array.Length != 0) { Bounds bounds = array[0].bounds; for (int i = 1; i < array.Length; i++) { ((Bounds)(ref bounds)).Encapsulate(array[i].bounds); } return bounds; } } Renderer[] array2 = (from r in go.GetComponentsInChildren<Renderer>(true) where r.enabled && ((Component)r).gameObject.activeInHierarchy select r).ToArray(); if (array2.Length != 0) { Bounds bounds2 = array2[0].bounds; for (int j = 1; j < array2.Length; j++) { ((Bounds)(ref bounds2)).Encapsulate(array2[j].bounds); } return bounds2; } PluginLoader.StaticLogger.LogWarning((object)("No renderers found for " + ((Object)go).name)); return new Bounds(go.transform.position, Vector3.one); } [IteratorStateMachine(typeof(<TakeScreenshotsCoroutine>d__20))] private IEnumerator TakeScreenshotsCoroutine(GameObject[] modules, string category, string ssType) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TakeScreenshotsCoroutine>d__20(0) { <>4__this = this, modules = modules, ssType = ssType }; } private void TakeScreenshot(string filePath) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_008a: Unknown result type (might be due to invalid IL or missing references) renderTexture = new RenderTexture(1920, 1920, 32, (RenderTextureFormat)0); ScreenshotCamera.targetTexture = renderTexture; ScreenshotCamera.Render(); RenderTexture.active = renderTexture; screenshot = new Texture2D(((Texture)renderTexture).width, ((Texture)renderTexture).height, (TextureFormat)4, false); screenshot.ReadPixels(new Rect(0f, 0f, (float)((Texture)renderTexture).width, (float)((Texture)renderTexture).height), 0, 0); screenshot.Apply(); byte[] bytes = ImageConversion.EncodeToPNG(screenshot); File.WriteAllBytes(filePath, bytes); ScreenshotCamera.targetTexture = null; RenderTexture.active = null; Object.Destroy((Object)(object)renderTexture); Object.Destroy((Object)(object)screenshot); } private void LateUpdate() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) if (isTakingScreenshots && ambientLight.HasValue) { RenderSettings.ambientLight = ambientLight.Value; } } } [BepInPlugin("uk.1a3.lobbyimprovements", "LobbyImprovements", "1.1.7")] [BepInDependency(/*Could not decode attribute arguments.*/)] internal class PluginLoader : BaseUnityPlugin { internal static List<string> modDevSteamIDs = new List<string>(2) { "76561198286895332", "76561199523762804" }; internal static Dictionary<string, string> namePrefixMap = new Dictionary<string, string> { { "developer", "<color=#ff0062>[DEV]</color> " }, { "tester", "<color=#ff8b00>[TESTER]</color> " } }; internal static Dictionary<string, string> nameSuffixMap = new Dictionary<string, string>(); private readonly Harmony harmony = new Harmony("uk.1a3.lobbyimprovements"); private static bool initialized; internal static ConfigEntry<string> playerNamePrefixSelected; internal static ConfigEntry<bool> singleplayerLobbyMenu; internal static ConfigEntry<bool> saveDeleteEnabled; internal static ConfigEntry<bool> savePublicEnabled; internal static ConfigEntry<bool> moonPhaseUIEnabled; internal static ConfigEntry<bool> splashScreenUIEnabled; internal static ConfigEntry<bool> testerOverlayEnabled; internal static ConfigEntry<bool> debugConsole; internal static ConfigEntry<bool> testerCommands; internal static ConfigEntry<bool> mainMenuOverhaulEnabled; internal static bool mainMenuOverhaul; internal static ManualLogSource StaticLogger { get; private set; } internal static ConfigFile StaticConfig { get; private set; } private void Awake() { //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown if (initialized) { return; } initialized = true; StaticLogger = ((BaseUnityPlugin)this).Logger; StaticConfig = ((BaseUnityPlugin)this).Config; try { harmony.PatchAll(typeof(ChatCommands)); } catch (Exception ex) { StaticLogger.LogError((object)("ChatCommands Patch Failed: " + ex)); } try { harmony.PatchAll(typeof(PlayerNamePrefix_SteamManager)); } catch (Exception ex2) { StaticLogger.LogError((object)("PlayerNamePrefix Patch Failed: " + ex2)); if (playerNamePrefixSelected == null) { playerNamePrefixSelected = StaticConfig.Bind<string>("Name Prefix", "Selected", "none", new ConfigDescription("Which prefix would you like to use?", (AcceptableValueBase)null, Array.Empty<object>())); playerNamePrefixSelected.SettingChanged += delegate { PlayerNamePrefix_SteamManager.WorldSpaceUIParent_UpdatePlayerName(PlayerAvatar.instance); if (GameManager.Multiplayer()) { PlayerNamePrefix_SemiFunc.PhotonSetCustomProperty(PhotonNetwork.LocalPlayer, "playerNamePrefix", playerNamePrefixSelected.Value); } }; } } saveDeleteEnabled = StaticConfig.Bind<bool>("Saves", "Deletion", true, "Should saves be automatically deleted when everyone dies?"); savePublicEnabled = StaticConfig.Bind<bool>("Saves", "Public Lobbies", true, "Should public lobbies have save files?"); try { harmony.PatchAll(typeof(PublicLobbySaves)); } catch (Exception ex3) { StaticLogger.LogError((object)("PublicLobbySaves Patch Failed: " + ex3)); } try { harmony.PatchAll(typeof(ServerListSearch)); } catch (Exception ex4) { StaticLogger.LogError((object)("ServerListSearch Patch Failed: " + ex4)); } singleplayerLobbyMenu = StaticConfig.Bind<bool>("Singleplayer", "Lobby Menu", false, "Should the lobby menu be enabled in singleplayer?"); try { harmony.PatchAll(typeof(MenuPageLobbySP)); } catch (Exception ex5) { StaticLogger.LogError((object)("MenuPageLobbySP Patch Failed: " + ex5)); } moonPhaseUIEnabled = StaticConfig.Bind<bool>("Fast Startup", "Moon Phase", true, "Should the moon phase animation be shown?"); splashScreenUIEnabled = StaticConfig.Bind<bool>("Fast Startup", "Splash Screen", true, "Should the splash screen be shown?"); try { harmony.PatchAll(typeof(FastStartup)); } catch (Exception ex6) { StaticLogger.LogError((object)("FastStartup Patch Failed: " + ex6)); } debugConsole = StaticConfig.Bind<bool>("Debug Console", "Enabled", false, "Enables the vanilla debug console. This requires a game restart!"); testerCommands = StaticConfig.Bind<bool>("Debug Console", "Tester Commands", false, "Enables vanilla debug commands for the debug console. This requires a game restart!"); testerOverlayEnabled = StaticConfig.Bind<bool>("Tester Overlay", "Enabled", false, "Should the tester overlay be shown?"); testerOverlayEnabled.SettingChanged += delegate { if (!Debug.isDebugBuild && Object.op_Implicit((Object)(object)DebugCommandHandler.instance)) { DebugCommandHandler.instance.debugOverlay = testerOverlayEnabled.Value; } }; try { harmony.PatchAll(typeof(TesterOverlayPatches)); } catch (Exception ex7) { StaticLogger.LogError((object)("TesterOverlay Patch Failed: " + ex7)); } mainMenuOverhaulEnabled = StaticConfig.Bind<bool>("Main Menu", "Improved Layout", false, "Reduces the number of clicks to access some parts of the main menu."); if (Chainloader.PluginInfos.ContainsKey("nickklmao.menulib")) { try { harmony.PatchAll(typeof(MenuPageV2)); } catch (Exception ex8) { StaticLogger.LogError((object)("MenuPageV2 Patch Failed: " + ex8)); } } else if (mainMenuOverhaulEnabled.Value) { StaticLogger.LogWarning((object)"The 'Improved Layout' of the main menu requires the MenuLib mod. Please install it if you wish to use that feature."); } StaticLogger.LogInfo((object)"Patches Loaded"); } } internal static class MyPluginInfo { public const string PLUGIN_GUID = "uk.1a3.lobbyimprovements"; public const string PLUGIN_NAME = "LobbyImprovements"; public const string PLUGIN_VERSION = "1.1.7"; } } namespace LobbyImprovements.Patches { [HarmonyPatch] public class ChatCommands { [HarmonyPatch(typeof(DebugCommandHandler), "Start")] [HarmonyPostfix] [HarmonyWrapSafe] private static void DebugCommandHandler_Start() { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Expected O, but got Unknown if (!Debug.isDebugBuild) { DebugCommandHandler.instance.debugOverlay = PluginLoader.testerOverlayEnabled.Value; } DebugCommandHandler.instance.Register(new ChatCommand("screenshot", "Screenshot all enemies, items, modules, or valuables in the current room.", (Action<bool, string[]>)delegate(bool isDebugConsole, string[] args) { //IL_0011: 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) if (!Object.op_Implicit((Object)(object)ObjectScreenshotTaker.instance)) { new GameObject("ObjectScreenshotTaker") { hideFlags = (HideFlags)61 }.AddComponent<ObjectScreenshotTaker>(); } switch (string.Join(' ', args).ToLower()) { case "enemies": if (!ObjectScreenshotTaker.instance.isTakingScreenshots) { ((MonoBehaviour)ObjectScreenshotTaker.instance).StartCoroutine(ObjectScreenshotTaker.instance.TakeScreenshotsOfEnemies()); DebugCommandHandler.instance.CommandSuccessEffect(); return; } break; case "items": if (!ObjectScreenshotTaker.instance.isTakingScreenshots) { ((MonoBehaviour)ObjectScreenshotTaker.instance).StartCoroutine(ObjectScreenshotTaker.instance.TakeScreenshotsOfItems()); DebugCommandHandler.instance.CommandSuccessEffect(); return; } break; case "modules": if (!ObjectScreenshotTaker.instance.isTakingScreenshots) { ((MonoBehaviour)ObjectScreenshotTaker.instance).StartCoroutine(ObjectScreenshotTaker.instance.TakeScreenshotsOfModules()); DebugCommandHandler.instance.CommandSuccessEffect(); return; } break; case "valuables": if (!ObjectScreenshotTaker.instance.isTakingScreenshots) { ((MonoBehaviour)ObjectScreenshotTaker.instance).StartCoroutine(ObjectScreenshotTaker.instance.TakeScreenshotsOfValuables()); DebugCommandHandler.instance.CommandSuccessEffect(); return; } break; } DebugCommandHandler.instance.CommandFailedEffect(); }, (Func<bool, string, string[], List<string>>)delegate(bool isDebugConsole, string partial, string[] args) { List<string> source = new List<string> { "enemies", "items", "modules", "valuables" }; return (args.Length > 1) ? new List<string>() : source.Where((string g) => args.Length == 0 || g.ToLower().StartsWith(args[0].ToLower())).ToList(); }, (Func<bool>)(() => SemiFunc.IsMasterClientOrSingleplayer() && SemiFunc.RunIsRecording()), true)); DebugCommandHandler.instance.Register(new ChatCommand("lobbymenu", "Return to the lobby menu. This may cause issues!", (Action<bool, string[]>)delegate { RunManager.instance.ChangeLevel(false, false, (ChangeLevelType)3); Debug.Log((object)"Command Used: /level lobby menu"); DebugCommandHandler.instance.CommandSuccessEffect(); }, (Func<bool, string, string[], List<string>>)null, (Func<bool>)(() => SemiFunc.IsMasterClientOrSingleplayer() && DebugCommandHandler.instance.IsInGame()), false)); } [HarmonyPatch(typeof(RunManager), "RestartScene")] [HarmonyPrefix] [HarmonyWrapSafe] private static void RunManager_RestartScene(RunManager __instance) { if (__instance.restarting && !__instance.restartingDone && Object.op_Implicit((Object)(object)GameDirector.instance) && GameDirector.instance.PlayerList.All((PlayerAvatar p) => p.outroDone) && !__instance.lobbyJoin && !__instance.waitToChangeScene && SemiFunc.RunIsLobbyMenu()) { NetworkManager.instance.DestroyAll(); } } [HarmonyPatch(typeof(SemiFunc), "DebugTester")] [HarmonyPostfix] [HarmonyWrapSafe] private static void SemiFunc_DebugTester(ref bool __result) { if (PluginLoader.debugConsole.Value && PluginLoader.testerCommands.Value) { __result = true; } } [HarmonyPatch(typeof(DebugConsoleUI), "Start")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool DebugConsoleUI_Start(DebugConsoleUI __instance) { if (PluginLoader.debugConsole.Value && !SemiFunc.DebugTester() && !SemiFunc.DebugDev()) { DebugConsoleUI.instance = __instance; return false; } return true; } } [HarmonyPatch] public class FastStartup { [HarmonyPatch(typeof(MoonUI), "Check")] [HarmonyPostfix] [HarmonyWrapSafe] private static void MoonUI_Check(MoonUI __instance) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Invalid comparison between Unknown and I4 if (!PluginLoader.moonPhaseUIEnabled.Value && (int)__instance.state > 0) { __instance.skip = true; __instance.SetState((State)8); } } [HarmonyPatch(typeof(SplashScreen), "Start")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool SplashScreen_Start(SplashScreen __instance) { if (PluginLoader.splashScreenUIEnabled.Value) { return true; } __instance.StateSet((State)3); return false; } } [HarmonyPatch] public class MenuPageLobbySP { [HarmonyPatch(typeof(DataDirector), "SaveDeleteCheck")] [HarmonyPrefix] [HarmonyPriority(800)] private static bool DataDirector_SaveDeleteCheck() { return PluginLoader.saveDeleteEnabled.Value; } [HarmonyPatch(typeof(RunManager), "ChangeLevel")] [HarmonyPrefix] [HarmonyWrapSafe] private static void RunManager_ChangeLevel_Prefix(RunManager __instance, bool _completedLevel, bool _levelFailed, ChangeLevelType _changeLevelType = 0) { if (PluginLoader.singleplayerLobbyMenu.Value && !SemiFunc.IsMultiplayer() && (SemiFunc.MenuLevel() || SemiFunc.IsMasterClientOrSingleplayer()) && !__instance.restarting && _levelFailed && (Object)(object)__instance.levelCurrent == (Object)(object)__instance.levelArena) { __instance.debugLevel = __instance.levelLobbyMenu; PluginLoader.StaticLogger.LogInfo((object)"Setting debug level"); } } [HarmonyPatch(typeof(RunManager), "ChangeLevel")] [HarmonyPostfix] [HarmonyWrapSafe] private static void RunManager_ChangeLevel_Postfix(RunManager __instance, bool _completedLevel, bool _levelFailed, ChangeLevelType _changeLevelType = 0) { if (!SemiFunc.IsMultiplayer() && __instance.gameOver && (Object)(object)__instance.debugLevel == (Object)(object)__instance.levelLobbyMenu) { __instance.debugLevel = null; PluginLoader.StaticLogger.LogInfo((object)"Resetting debug level"); } } [HarmonyPatch(typeof(SemiFunc), "MenuActionSingleplayerGame")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool SemiFunc_MenuActionSingleplayerGame(string saveFileName, List<string> saveFileBackups) { if (!PluginLoader.singleplayerLobbyMenu.Value) { return true; } RunManager.instance.ResetProgress(); GameManager.instance.SetConnectRandom(false); if (saveFileName != null) { PluginLoader.StaticLogger.LogInfo((object)"Loading save"); SemiFunc.SaveFileLoad(saveFileName, saveFileBackups); } else { SemiFunc.SaveFileCreate(); } RunManager.instance.ChangeLevel(true, false, (ChangeLevelType)3); return false; } [HarmonyPatch(typeof(MenuPageLobby), "Awake")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageLobby_Awake(MenuPageLobby __instance) { if (SemiFunc.IsMultiplayer()) { return true; } MenuPageLobby.instance = __instance; __instance.menuPage = ((Component)__instance).GetComponent<MenuPage>(); TextMeshProUGUI roomNameText = __instance.roomNameText; string cloudRegion = PhotonNetwork.CloudRegion; Room currentRoom = PhotonNetwork.CurrentRoom; ((TMP_Text)roomNameText).text = cloudRegion + " " + ((currentRoom != null) ? currentRoom.Name : null); ((TMP_Text)__instance.chatPromptText).text = InputManager.instance.InputDisplayReplaceTags("Press [chat] to use commands", "<u><b>", "</b></u>"); return false; } [HarmonyPatch(typeof(MenuPageLobby), "Start")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageLobby_Start(MenuPageLobby __instance) { if (SemiFunc.IsMultiplayer()) { return true; } ((Component)__instance.inviteButton).gameObject.SetActive(false); return false; } [HarmonyPatch(typeof(MenuPageLobby), "ButtonStart")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageLobby_ButtonStart(MenuPageLobby __instance) { if (SemiFunc.IsMultiplayer() || __instance.joiningPlayer) { return true; } SteamManager.instance.LockLobby(); DataDirector.instance.RunsPlayedAdd(); if (RunManager.instance.loadLevel == 0) { RunManager.instance.ChangeLevel(true, false, (ChangeLevelType)1); } else { RunManager.instance.ChangeLevel(true, false, (ChangeLevelType)5); } return false; } } [HarmonyPatch] public class MenuPageV2 { [CompilerGenerated] private static class <>O { public static UnityAction <0>__RefreshLobbies; } internal static void NewGame_Internal(MenuButton __instance) { //IL_002c: 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_0061: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown REPOPopupPage repoPage = MenuAPI.CreateREPOPopupPage(__instance.menuButtonPopUp?.headerText, false, true, 1.5f, (Vector2?)Vector2.zero); repoPage.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("Private", (Action)delegate { PublicLobbySaves.publicSavesMenuOpen = false; MenuPage parentPage3 = __instance.parentPage; object obj2 = ((parentPage3 != null) ? ((Component)parentPage3).GetComponent<MenuPageSaves>() : null); if (obj2 == null) { MenuPage parentPage4 = __instance.parentPage; if (parentPage4 == null) { obj2 = null; } else { MenuPage pageUnderThisPage2 = parentPage4.pageUnderThisPage; obj2 = ((pageUnderThisPage2 != null) ? ((Component)pageUnderThisPage2).GetComponent<MenuPageSaves>() : null); } } if (obj2 != null) { ((MenuPageSaves)obj2).OnNewGame(); } }, scrollView, Vector2.zero)).rectTransform), 0f, 0f); repoPage.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("Public (Server List)", (Action)delegate { PublicLobbySaves.publicSavesMenuOpen = true; MenuPage parentPage = __instance.parentPage; object obj = ((parentPage != null) ? ((Component)parentPage).GetComponent<MenuPageSaves>() : null); if (obj == null) { MenuPage parentPage2 = __instance.parentPage; if (parentPage2 == null) { obj = null; } else { MenuPage pageUnderThisPage = parentPage2.pageUnderThisPage; obj = ((pageUnderThisPage != null) ? ((Component)pageUnderThisPage).GetComponent<MenuPageSaves>() : null); } } if (obj != null) { ((MenuPageSaves)obj).OnNewGame(); } }, scrollView, Vector2.zero)).rectTransform), 0f, 0f); repoPage.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("Back", (Action)delegate { repoPage.ClosePage(false); }, scrollView, Vector2.zero)).rectTransform), 0f, 0f); repoPage.OpenPage(false); } internal static void LoadGame_Internal(MenuButton __instance) { //IL_002c: 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_0061: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown REPOPopupPage repoPage = MenuAPI.CreateREPOPopupPage(__instance.menuButtonPopUp?.headerText, false, true, 1.5f, (Vector2?)Vector2.zero); repoPage.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("Private", (Action)delegate { PublicLobbySaves.publicSavesMenuOpen = false; MenuPage parentPage3 = __instance.parentPage; object obj2 = ((parentPage3 != null) ? ((Component)parentPage3).GetComponent<MenuPageSaves>() : null); if (obj2 == null) { MenuPage parentPage4 = __instance.parentPage; if (parentPage4 == null) { obj2 = null; } else { MenuPage pageUnderThisPage2 = parentPage4.pageUnderThisPage; obj2 = ((pageUnderThisPage2 != null) ? ((Component)pageUnderThisPage2).GetComponent<MenuPageSaves>() : null); } } if (obj2 != null) { ((MenuPageSaves)obj2).OnLoadGame(); } }, scrollView, Vector2.zero)).rectTransform), 0f, 0f); repoPage.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("Public (Server List)", (Action)delegate { PublicLobbySaves.publicSavesMenuOpen = true; MenuPage parentPage = __instance.parentPage; object obj = ((parentPage != null) ? ((Component)parentPage).GetComponent<MenuPageSaves>() : null); if (obj == null) { MenuPage parentPage2 = __instance.parentPage; if (parentPage2 == null) { obj = null; } else { MenuPage pageUnderThisPage = parentPage2.pageUnderThisPage; obj = ((pageUnderThisPage != null) ? ((Component)pageUnderThisPage).GetComponent<MenuPageSaves>() : null); } } if (obj != null) { ((MenuPageSaves)obj).OnLoadGame(); } }, scrollView, Vector2.zero)).rectTransform), 0f, 0f); repoPage.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("Back", (Action)delegate { repoPage.ClosePage(false); }, scrollView, Vector2.zero)).rectTransform), 0f, 0f); repoPage.OpenPage(false); } [HarmonyPatch(typeof(MenuPageMain), "Start")] [HarmonyPostfix] [HarmonyWrapSafe] private static void MenuPageMain_Start(MenuPageMain __instance) { PluginLoader.mainMenuOverhaul = PluginLoader.mainMenuOverhaulEnabled.Value; if (PluginLoader.mainMenuOverhaul) { Transform obj = ((Component)__instance.rectTransform).transform.Find("Menu Button - Private Game/ButtonText"); TextMeshProUGUI val = ((obj != null) ? ((Component)obj).GetComponent<TextMeshProUGUI>() : null); if (Object.op_Implicit((Object)(object)val)) { ((TMP_Text)val).text = "Host Game"; } Transform obj2 = ((Component)__instance.rectTransform).transform.Find("Menu Button - Public Game/ButtonText"); TextMeshProUGUI val2 = ((obj2 != null) ? ((Component)obj2).GetComponent<TextMeshProUGUI>() : null); if (Object.op_Implicit((Object)(object)val2)) { ((TMP_Text)val2).text = "Join Game"; } } } [HarmonyPatch(typeof(MenuPageMain), "ButtonEventHostGame")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageMain_ButtonEventHostGame() { if (!PluginLoader.mainMenuOverhaul) { return true; } SemiFunc.MainMenuSetMultiplayer(); MenuManager.instance.PageCloseAll(); MenuManager.instance.PageOpen((MenuPageIndex)11, false); return false; } [HarmonyPatch(typeof(MenuPageMain), "ButtonEventPlayRandom")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageMain_ButtonEventPlayRandom() { if (!PluginLoader.mainMenuOverhaul) { return true; } MenuManager.instance.PageCloseAll(); MenuManager.instance.PageOpen((MenuPageIndex)14, false); return false; } [HarmonyPatch(typeof(MenuManager), "PageOpen")] [HarmonyPostfix] [HarmonyWrapSafe] private static void MenuManager_PageOpen(MenuManager __instance, MenuPage __result, MenuPageIndex menuPageIndex, bool addedPageOnTop = false) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_005a: Unknown result type (might be due to invalid IL or missing references) if (!PluginLoader.mainMenuOverhaul) { return; } if ((int)menuPageIndex != 11) { if ((int)menuPageIndex != 14) { if ((int)menuPageIndex == 16) { Transform obj = ((Component)__result).transform.Find("Header/Text (TMP)"); TextMeshProUGUI val = ((obj != null) ? ((Component)obj).GetComponent<TextMeshProUGUI>() : null); if (Object.op_Implicit((Object)(object)val)) { ((TMP_Text)val).text = "Join Game"; } AddRegionMenuButton(((Component)__result).transform, new Vector2(8f, 8f), (Type)1); } } else { AddRegionMenuButton(((Component)__result).transform, new Vector2(8f, 8f), (Type)1); } } else if (SemiFunc.MainMenuIsMultiplayer()) { AddRegionMenuButton(((Component)__result).transform, new Vector2(520f, 325f), (Type)0); } } private static void AddRegionMenuButton(Transform parent, Vector2 localPosition, Type pageType) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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) DataDirector.instance.networkRegion = PlayerPrefs.GetString("PUNSelectedRegion", ""); ServerSettings.ResetBestRegionCodeInPreferences(); MenuAPI.CreateREPOButton(GetRegionDisplayName(DataDirector.instance.networkRegion), (Action)delegate { //IL_001d: 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) MenuManager.instance.PageCloseAll(); ((Component)MenuManager.instance.PageOpen((MenuPageIndex)13, false)).GetComponent<MenuPageRegions>().type = pageType; }, parent, localPosition); } private static string GetRegionDisplayName(string regionCode) { return (regionCode?.ToUpper() ?? "") switch { "" => "Best Region", "ASIA" => "Asia", "AU" => "Australia", "CAE" => "Canada East", "CN" => "Chinese Mainland", "EU" => "Europe", "HK" => "Hong Kong", "IN" => "India", "JP" => "Japan", "ZA" => "South Africa", "SA" => "South America", "KR" => "South Korea", "TR" => "Turkey", "UAE" => "United Arab Emirates", "US" => "USA East", "USW" => "USA West", "USSC" => "USA South Central", _ => regionCode?.ToUpper(), }; } private static void RefreshLobbies() { //IL_003d: Unknown result type (might be due to invalid IL or missing references) MenuPageServerList component = ((Component)MenuManager.instance.currentMenuPage).GetComponent<MenuPageServerList>(); if (!Object.op_Implicit((Object)(object)component) || !component.receivedList || component.searchInProgress) { return; } foreach (Transform item in component.serverElementParent) { Object.Destroy((Object)(object)((Component)item).gameObject); } component.loadingGraphics.Reset(); component.roomListSearched.Clear(); component.receivedList = false; component.pageMax = 0; component.buttonNext.HideSetInstant(); component.buttonPrevious.HideSetInstant(); ((MonoBehaviour)component).StartCoroutine(component.GetServerList()); } [HarmonyPatch(typeof(MenuPageServerList), "Start")] [HarmonyPostfix] [HarmonyWrapSafe] private static void MenuPageServerList_Start(MenuPageServerList __instance) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Expected O, but got Unknown //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown if (!PluginLoader.mainMenuOverhaul) { return; } Transform val = ((Component)__instance).transform.Find("Panel/Create New"); object obj; if (val == null) { obj = null; } else { Transform obj2 = val.Find("Menu Button - CREATE NEW"); obj = ((obj2 != null) ? ((Component)obj2).GetComponent<MenuButton>() : null); } MenuButton val2 = (MenuButton)obj; if (Object.op_Implicit((Object)(object)val2)) { ((TMP_Text)val2.buttonText).text = "Refresh"; val2.button.onClick = new ButtonClickedEvent(); ButtonClickedEvent onClick = val2.button.onClick; object obj3 = <>O.<0>__RefreshLobbies; if (obj3 == null) { UnityAction val3 = RefreshLobbies; <>O.<0>__RefreshLobbies = val3; obj3 = (object)val3; } ((UnityEvent)onClick).AddListener((UnityAction)obj3); GameObject obj4 = Object.Instantiate<GameObject>(((Component)val).gameObject, val.parent); ((Object)obj4).name = "Random Server"; obj4.transform.localPosition = Vector2.op_Implicit(new Vector2(0f, val.localPosition.y)); MenuButton componentInChildren = obj4.GetComponentInChildren<MenuButton>(); ((TMP_Text)componentInChildren.buttonText).text = "Random"; componentInChildren.button.onClick = new ButtonClickedEvent(); componentInChildren.menuButtonPopUp = ((Component)componentInChildren).gameObject.AddComponent<MenuButtonPopUp>(); componentInChildren.menuButtonPopUp.headerText = "Join Server"; componentInChildren.menuButtonPopUp.bodyText = "Are you sure you want to join a random server?"; componentInChildren.menuButtonPopUp.option1Event = new UnityEvent(); componentInChildren.menuButtonPopUp.option1Event.AddListener(new UnityAction(__instance.ButtonCreateNew)); } } [HarmonyPatch(typeof(MenuPageServerList), "OnDestroy")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageServerList_OnDestroy() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Invalid comparison between Unknown and I4 if (Object.op_Implicit((Object)(object)MenuManager.instance)) { return (int)MenuManager.instance.currentMenuPageIndex != 13; } return true; } [HarmonyPatch(typeof(MenuPageServerList), "ButtonCreateNew")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageServerList_ButtonCreateNew() { if (!PluginLoader.mainMenuOverhaul) { return true; } RunManager.instance.ResetProgress(); StatsManager.instance.saveFileCurrent = ""; GameManager.instance.SetConnectRandom(true); GameManager.instance.localTest = false; RunManager.instance.ChangeLevel(true, false, (ChangeLevelType)3); RunManager.instance.lobbyJoin = true; return false; } [HarmonyPatch(typeof(MenuPageServerList), "ExitPage")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageServerList_ExitPage() { if (!PluginLoader.mainMenuOverhaul) { return true; } MenuManager.instance.PageCloseAll(); MenuManager.instance.PageOpen((MenuPageIndex)0, false); return false; } [HarmonyPatch(typeof(MenuPagePublicGameChoice), "ExitPage")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPagePublicGameChoice_ExitPage() { if (!PluginLoader.mainMenuOverhaul) { return true; } MenuManager.instance.PageCloseAll(); MenuManager.instance.PageOpen((MenuPageIndex)0, false); return false; } [HarmonyPatch(typeof(MenuPageRegions), "PickRegion")] [HarmonyPrefix] [HarmonyWrapSafe] [HarmonyPriority(800)] private static bool MenuPageRegions_PickRegion(MenuPageRegions __instance, string _region) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) PlayerPrefs.SetString("PUNSelectedRegion", _region); PlayerPrefs.Save(); if ((int)__instance.type != 0) { DataDirector.instance.networkRegion = _region; MenuManager.instance.PageCloseAll(); MenuManager.instance.PageOpen((MenuPageIndex)14, false); return false; } return true; } [HarmonyPatch(typeof(MenuPageRegions), "ExitPage")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageRegions_ExitPage(MenuPageRegions __instance) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Invalid comparison between Unknown and I4 if (!PluginLoader.mainMenuOverhaul) { return true; } MenuManager.instance.PageCloseAll(); MenuManager.instance.PageOpen((MenuPageIndex)(((int)__instance.type == 1) ? 14 : 11), false); return false; } [HarmonyPatch(typeof(MenuPageRegions), "OnDestroy")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageRegions_OnDestroy() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Invalid comparison between Unknown and I4 if (Object.op_Implicit((Object)(object)MenuManager.instance)) { return (int)MenuManager.instance.currentMenuPageIndex != 14; } return true; } } [HarmonyPatch] public class PlayerNamePrefix_SteamManager { [CompilerGenerated] private sealed class <DelayedUpdatePauseMenuSliders>d__13 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MenuPageEsc __instance; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedUpdatePauseMenuSliders>d__13(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; foreach (KeyValuePair<PlayerAvatar, MenuSliderPlayerMicGain> playerMicGainSlider in __instance.playerMicGainSliders) { PlayerAvatar key = playerMicGainSlider.Key; TextMeshProUGUI elementNameText = playerMicGainSlider.Value.menuSlider.elementNameText; string prefixStringForPlayer = PlayerNamePrefix_SemiFunc.GetPrefixStringForPlayer(key); if (!string.IsNullOrWhiteSpace(prefixStringForPlayer)) { ((TMP_Text)elementNameText).richText = true; ((TMP_Text)elementNameText).text = prefixStringForPlayer; } else { ((TMP_Text)elementNameText).richText = false; ((TMP_Text)elementNameText).text = key.playerName; } } 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 <GetPlayerNamePrefixes>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string[] steamIds; public string logType; private string <localSteamId>5__2; private bool <includesLocalPlayer>5__3; private UnityWebRequest <www>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetPlayerNamePrefixes>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <localSteamId>5__2 = null; <www>5__4 = null; <>1__state = -2; } private bool MoveNext() { //IL_02fd: Expected O, but got Unknown //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Invalid comparison between Unknown and I4 //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_0386: Expected O, but got Unknown //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: { <>1__state = -1; steamIds = (from x in steamIds where Regex.IsMatch(x, "^76[0-9]{15}$") orderby x select x).ToArray(); if (steamIds.Length == 0) { return false; } SteamId steamId = SteamClient.SteamId; <localSteamId>5__2 = ((object)(SteamId)(ref steamId)).ToString(); <includesLocalPlayer>5__3 = steamIds.Contains(<localSteamId>5__2); string text2 = playerPrefixUrl + "?" + string.Join("&", steamIds.Select((string id) => "id=" + id)); <www>5__4 = UnityWebRequest.Get(text2); <>2__current = <www>5__4.SendWebRequest(); <>1__state = 1; return true; } case 1: { <>1__state = -1; AcceptableValueList<string> val = null; if ((int)<www>5__4.result == 1) { try { Dictionary<string, List<string>> dictionary = JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(<www>5__4.downloadHandler.text); string[] array = steamIds; foreach (string text in array) { List<string> value2; if (text == <localSteamId>5__2) { if (dictionary.TryGetValue(text, out var value)) { localPrefixData = value; PluginLoader.StaticLogger.LogDebug((object)string.Format("[GetPlayerNamePrefixes | {0}] {1} has {2} prefixes: {3}", logType, text, value.Count, string.Join(", ", value))); } else { localPrefixData.Clear(); PluginLoader.StaticLogger.LogDebug((object)("[GetPlayerNamePrefixes | " + logType + "] " + text + " has 0 prefixes")); } } else if (dictionary.TryGetValue(text, out value2)) { playerPrefixData[text] = value2; PluginLoader.StaticLogger.LogDebug((object)string.Format("[GetPlayerNamePrefixes | {0}] {1} has {2} prefixes: {3}", logType, text, value2.Count, string.Join(", ", value2))); } else { playerPrefixData.Remove(text); PluginLoader.StaticLogger.LogDebug((object)("[GetPlayerNamePrefixes | " + logType + "] " + text + " has 0 prefixes")); } } if (<includesLocalPlayer>5__3) { val = new AcceptableValueList<string>(localPrefixData.Prepend("none").ToArray()); } } catch (JsonException val2) { JsonException val3 = val2; PluginLoader.StaticLogger.LogWarning((object)("[GetPlayerNamePrefixes | " + logType + "] Failed to parse prefixes: " + ((Exception)(object)val3).Message)); } } else { PluginLoader.StaticLogger.LogWarning((object)("[GetPlayerNamePrefixes | " + logType + "] Failed to fetch prefixes: " + <www>5__4.error)); } if (<includesLocalPlayer>5__3) { fetchedLocalPlayer = true; PluginLoader.playerNamePrefixSelected = PluginLoader.StaticConfig.Bind<string>("Name Prefix", "Selected", "none", new ConfigDescription("Which prefix would you like to use?", (AcceptableValueBase)(object)val, Array.Empty<object>())); PluginLoader.playerNamePrefixSelected.SettingChanged += delegate { WorldSpaceUIParent_UpdatePlayerName(PlayerAvatar.instance); if (GameManager.Multiplayer()) { PlayerNamePrefix_SemiFunc.PhotonSetCustomProperty(PhotonNetwork.LocalPlayer, "playerNamePrefix", PluginLoader.playerNamePrefixSelected?.Value); } }; } 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 string playerPrefixUrl = "https://api.1a3.uk/srv1/repo/prefixes.json"; private static bool fetchedLocalPlayer; public static List<string> localPrefixData = new List<string>(); public static Dictionary<string, List<string>> playerPrefixData = new Dictionary<string, List<string>>(); [IteratorStateMachine(typeof(<GetPlayerNamePrefixes>d__4))] private static IEnumerator GetPlayerNamePrefixes(string[] steamIds, string logType) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetPlayerNamePrefixes>d__4(0) { steamIds = steamIds, logType = logType }; } public static void WorldSpaceUIParent_UpdatePlayerName(PlayerAvatar _player) { if (Object.op_Implicit((Object)(object)_player?.worldSpaceUIPlayerName)) { string prefixStringForPlayer = PlayerNamePrefix_SemiFunc.GetPrefixStringForPlayer(_player); if (!string.IsNullOrWhiteSpace(prefixStringForPlayer)) { ((TMP_Text)_player.worldSpaceUIPlayerName.text).richText = true; ((TMP_Text)_player.worldSpaceUIPlayerName.text).text = prefixStringForPlayer; } else { ((TMP_Text)_player.worldSpaceUIPlayerName.text).richText = false; ((TMP_Text)_player.worldSpaceUIPlayerName.text).text = _player.playerName; } } } [HarmonyPatch(typeof(SteamManager), "Awake")] [HarmonyPostfix] [HarmonyWrapSafe] private static void SteamManager_Awake(SteamManager __instance) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) if (SteamClient.IsValid && !fetchedLocalPlayer) { string[] array = new string[1]; SteamId steamId = SteamClient.SteamId; array[0] = ((object)(SteamId)(ref steamId)).ToString(); ((MonoBehaviour)__instance).StartCoroutine(GetPlayerNamePrefixes(array, "SteamManager_Awake")); } } [HarmonyPatch(typeof(SteamManager), "OnLobbyEntered")] [HarmonyPostfix] [HarmonyWrapSafe] private static void SteamManager_OnLobbyEntered(SteamManager __instance, Lobby _lobby) { string[] array = ((Lobby)(ref _lobby)).Members.Select((Friend x) => ((object)(SteamId)(ref x.Id)).ToString()).Where(delegate(string x) { //IL_0001: 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) SteamId steamId = SteamClient.SteamId; return x != ((object)(SteamId)(ref steamId)).ToString(); }).ToArray(); if (array.Length != 0) { ((MonoBehaviour)__instance).StartCoroutine(GetPlayerNamePrefixes(array, "SteamManager_OnLobbyEntered")); } } [HarmonyPatch(typeof(SteamManager), "OnLobbyMemberJoined")] [HarmonyPostfix] [HarmonyWrapSafe] private static void SteamManager_OnLobbyMemberJoined(SteamManager __instance, Lobby _lobby, Friend _friend) { ((MonoBehaviour)__instance).StartCoroutine(GetPlayerNamePrefixes(new string[1] { ((object)(SteamId)(ref _friend.Id)).ToString() }, "SteamManager_OnLobbyMemberJoined")); } [HarmonyPatch(typeof(SteamManager), "OnLobbyMemberLeft")] [HarmonyPostfix] [HarmonyWrapSafe] private static void SteamManager_OnLobbyMemberLeft(Lobby _lobby, Friend _friend) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (playerPrefixData.ContainsKey(((object)(SteamId)(ref _friend.Id)).ToString())) { PluginLoader.StaticLogger.LogDebug((object)$"[playerPrefixData | SteamManager_OnLobbyMemberLeft] Removing 1 player ({_friend.Id})"); playerPrefixData.Remove(((object)(SteamId)(ref _friend.Id)).ToString()); } } [HarmonyPatch(typeof(SteamManager), "LeaveLobby")] [HarmonyPostfix] [HarmonyWrapSafe] private static void SteamManager_LeaveLobby() { if (playerPrefixData.Count > 0) { PluginLoader.StaticLogger.LogDebug((object)$"[playerPrefixData | SteamManager_LeaveLobby] Removing {playerPrefixData.Count} players"); playerPrefixData.Clear(); } } [HarmonyPatch(typeof(PlayerAvatar), "Awake")] [HarmonyPostfix] [HarmonyWrapSafe] private static void PlayerAvatar_Awake(PlayerAvatar __instance) { if (SemiFunc.IsMultiplayer() && __instance.isLocal) { PlayerNamePrefix_SemiFunc.PhotonSetCustomProperty(PhotonNetwork.LocalPlayer, "playerNamePrefix", PluginLoader.playerNamePrefixSelected?.Value); } } [HarmonyPatch(typeof(MenuPageLobby), "Update")] [HarmonyPostfix] [HarmonyWrapSafe] private static void MenuPageLobby_Update(MenuPageLobby __instance) { foreach (GameObject listObject in __instance.listObjects) { MenuPlayerListed component = listObject.GetComponent<MenuPlayerListed>(); PlayerAvatar playerAvatar = component.playerAvatar; if (Object.op_Implicit((Object)(object)playerAvatar)) { TextMeshProUGUI playerName = component.playerName; string prefixStringForPlayer = PlayerNamePrefix_SemiFunc.GetPrefixStringForPlayer(playerAvatar); if (!string.IsNullOrWhiteSpace(prefixStringForPlayer)) { ((TMP_Text)playerName).richText = true; ((TMP_Text)playerName).text = prefixStringForPlayer; } else { ((TMP_Text)playerName).richText = false; ((TMP_Text)playerName).text = playerAvatar.playerName; } } } } [IteratorStateMachine(typeof(<DelayedUpdatePauseMenuSliders>d__13))] private static IEnumerator DelayedUpdatePauseMenuSliders(MenuPageEsc __instance) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedUpdatePauseMenuSliders>d__13(0) { __instance = __instance }; } [HarmonyPatch(typeof(MenuPageEsc), "PlayerGainSlidersUpdate")] [HarmonyPostfix] [HarmonyWrapSafe] private static void MenuPageEsc_PlayerGainSlidersUpdate(MenuPageEsc __instance) { ((MonoBehaviour)__instance).StartCoroutine(DelayedUpdatePauseMenuSliders(__instance)); } [HarmonyPatch(typeof(WorldSpaceUIParent), "PlayerName")] [HarmonyPostfix] [HarmonyWrapSafe] private static void WorldSpaceUIParent_PlayerName(PlayerAvatar _player) { WorldSpaceUIParent_UpdatePlayerName(_player); } [HarmonyPatch(typeof(MonoBehaviourPunCallbacks), "OnPlayerPropertiesUpdate")] [HarmonyPostfix] [HarmonyWrapSafe] private static void OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps) { if (!((Dictionary<object, object>)(object)changedProps).ContainsKey((object)"playerNamePrefix")) { return; } foreach (PlayerAvatar player in GameDirector.instance.PlayerList) { if (player.photonView.Owner == targetPlayer) { WorldSpaceUIParent_UpdatePlayerName(player); break; } } } } public class PlayerNamePrefix_SemiFunc { public static List<string> GetPrefixDataForSteamId(string steamId) { //IL_0001: 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) SteamId steamId2 = SteamClient.SteamId; if (steamId == ((object)(SteamId)(ref steamId2)).ToString()) { return PlayerNamePrefix_SteamManager.localPrefixData; } if (PlayerNamePrefix_SteamManager.playerPrefixData.TryGetValue(steamId, out var value)) { return value; } return new List<string>(); } public static string GetPrefixStringForPlayer(PlayerAvatar playerAvatar) { //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: 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) if (!Object.op_Implicit((Object)(object)playerAvatar)) { return null; } string value = ""; string value2 = ""; string text = null; if (playerAvatar.isLocal) { text = PluginLoader.playerNamePrefixSelected?.Value; } else if (((Dictionary<object, object>)(object)playerAvatar.photonView.Owner.CustomProperties).ContainsKey((object)"playerNamePrefix")) { text = (string)playerAvatar.photonView.Owner.CustomProperties[(object)"playerNamePrefix"]; } List<string> prefixDataForSteamId = GetPrefixDataForSteamId(playerAvatar.steamID); SteamId steamId; if (string.IsNullOrWhiteSpace(text) || !PluginLoader.namePrefixMap.TryGetValue(text, out value)) { List<string> modDevSteamIDs = PluginLoader.modDevSteamIDs; steamId = SteamClient.SteamId; if (modDevSteamIDs.Contains(((object)(SteamId)(ref steamId)).ToString()) && prefixDataForSteamId.Count > 0 && PluginLoader.namePrefixMap.TryGetValue(prefixDataForSteamId.First(), out value)) { value += "<color=#7289da>[!]</color> "; } } if (string.IsNullOrWhiteSpace(text) || !PluginLoader.nameSuffixMap.TryGetValue(text, out value2)) { List<string> modDevSteamIDs2 = PluginLoader.modDevSteamIDs; steamId = SteamClient.SteamId; if (modDevSteamIDs2.Contains(((object)(SteamId)(ref steamId)).ToString()) && prefixDataForSteamId.Count > 0 && PluginLoader.nameSuffixMap.TryGetValue(prefixDataForSteamId.First(), out value2)) { value2 += " <color=#7289da>[!]</color>"; } } if (!string.IsNullOrWhiteSpace(value) || !string.IsNullOrWhiteSpace(value2)) { return value + Regex.Replace(playerAvatar.playerName ?? "", "<.*?>", string.Empty) + value2; } return null; } public static void PhotonSetCustomProperty(Player photonPlayer, object key, object value) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) Hashtable customProperties = PhotonNetwork.LocalPlayer.CustomProperties; Hashtable val = new Hashtable(); DictionaryEntryEnumerator enumerator = customProperties.GetEnumerator(); try { while (((DictionaryEntryEnumerator)(ref enumerator)).MoveNext()) { DictionaryEntry current = ((DictionaryEntryEnumerator)(ref enumerator)).Current; val[current.Key] = current.Value; } } finally { ((IDisposable)(DictionaryEntryEnumerator)(ref enumerator)).Dispose(); } val[key] = value; photonPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); } } [HarmonyPatch] public class PublicLobbySaves { internal static bool publicSavesMenuOpen; private static string currentSaveFileName; private static List<string> currentSaveFileBackups; private static bool connectRandomCached; [HarmonyPatch(typeof(MenuPageServerList), "ButtonCreateNew")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageServerList_ButtonCreateNew(MenuPageServerList __instance) { if (!PluginLoader.savePublicEnabled.Value || PluginLoader.mainMenuOverhaul) { return true; } SemiFunc.MainMenuSetMultiplayer(); publicSavesMenuOpen = true; MenuManager.instance.PageCloseAll(); MenuManager.instance.PageOpen((MenuPageIndex)11, false); return false; } [HarmonyPatch(typeof(MenuPageSaves), "Start")] [HarmonyPostfix] [HarmonyWrapSafe] private static void MenuPageSaves_Start(MenuPageSaves __instance) { if (SemiFunc.MainMenuIsMultiplayer() && !PluginLoader.mainMenuOverhaul) { ((TMP_Text)__instance.gameModeHeader).text = (publicSavesMenuOpen ? "Public Multiplayer" : "Private Multiplayer"); } } [MethodImpl(MethodImplOptions.NoInlining)] [HarmonyPatch(typeof(MenuButton), "OnSelect")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuButton_OnSelect(MenuButton __instance) { if (__instance.menuButtonPopUp?.headerText == "Start a new game?" && __instance.menuButtonPopUp?.bodyText == "Do you want to start a game?") { if (PluginLoader.mainMenuOverhaul && SemiFunc.MainMenuIsMultiplayer()) { MenuPageV2.NewGame_Internal(__instance); return false; } if (publicSavesMenuOpen) { MenuPage parentPage = __instance.parentPage; MenuPageSaves obj = ((parentPage != null) ? ((Component)parentPage).GetComponent<MenuPageSaves>() : null); if (obj != null) { obj.OnNewGame(); } return false; } } if (__instance.menuButtonPopUp?.headerText == "Load save?" && __instance.menuButtonPopUp?.bodyText == "Load this save file?") { if (PluginLoader.mainMenuOverhaul && SemiFunc.MainMenuIsMultiplayer()) { MenuPageV2.LoadGame_Internal(__instance); return false; } if (publicSavesMenuOpen) { MenuPage parentPage2 = __instance.parentPage; MenuPageSaves obj2 = ((parentPage2 != null) ? ((Component)parentPage2).GetComponent<MenuPageSaves>() : null); if (obj2 != null) { obj2.OnLoadGame(); } return false; } } return true; } [HarmonyPatch(typeof(MenuPageSaves), "OnNewGame")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageSaves_OnNewGame(MenuPageSaves __instance) { currentSaveFileName = null; currentSaveFileBackups = null; if (!publicSavesMenuOpen || __instance.saveFiles.Count >= 10) { return true; } MenuPage currentMenuPage = MenuManager.instance.currentMenuPage; MenuPageServerListCreateNew component = ((Component)MenuManager.instance.PageOpenOnTop((MenuPageIndex)15)).GetComponent<MenuPageServerListCreateNew>(); component.menuPageParent = currentMenuPage; component.menuTextInput.textCurrent = SteamClient.Name + "'s Lobby"; return false; } [HarmonyPatch(typeof(MenuPageSaves), "OnLoadGame")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageSaves_OnLoadGame(MenuPageSaves __instance) { if (!publicSavesMenuOpen) { currentSaveFileName = null; currentSaveFileBackups = null; return true; } currentSaveFileName = __instance.currentSaveFileName; currentSaveFileBackups = __instance.currentSaveFileBackups; MenuPage currentMenuPage = MenuManager.instance.currentMenuPage; MenuPageServerListCreateNew component = ((Component)MenuManager.instance.PageOpenOnTop((MenuPageIndex)15)).GetComponent<MenuPageServerListCreateNew>(); component.menuPageParent = currentMenuPage; component.menuTextInput.textCurrent = SteamClient.Name + "'s Lobby"; return false; } [HarmonyPatch(typeof(MenuPageServerListCreateNew), "ExitPage")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageServerListCreateNew_ExitPage(MenuPageServerListCreateNew __instance) { if (!publicSavesMenuOpen && !PluginLoader.mainMenuOverhaul) { return true; } MenuManager.instance.PageCloseAll(); MenuManager.instance.PageOpen((MenuPageIndex)11, false); return false; } [HarmonyPatch(typeof(MenuPageSaves), "OnGoBack")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageSaves_OnGoBack(MenuPageSaves __instance) { if (!publicSavesMenuOpen) { return true; } publicSavesMenuOpen = false; MenuManager.instance.PageCloseAll(); MenuManager.instance.PageOpen((MenuPageIndex)14, false); return false; } [HarmonyPatch(typeof(GameManager), "SetConnectRandom")] [HarmonyPostfix] [HarmonyWrapSafe] private static void GameManager_SetConnectRandom(bool _connectRandom) { connectRandomCached = GameManager.instance.connectRandom; } [HarmonyPatch(typeof(SemiFunc), "SaveFileCreate")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool SemiFunc_SaveFileCreate(NetworkConnect __instance) { if (!connectRandomCached) { return true; } if (string.IsNullOrWhiteSpace(currentSaveFileName)) { if (!string.IsNullOrWhiteSpace(DataDirector.instance.networkServerName)) { StatsManager.instance.teamName = DataDirector.instance.networkServerName; } return true; } PluginLoader.StaticLogger.LogInfo((object)("[Public Lobby] Loading Save File: " + currentSaveFileName)); SemiFunc.SaveFileLoad(currentSaveFileName, currentSaveFileBackups); return false; } [HarmonyPatch(typeof(SemiFunc), "SaveFileSave")] [HarmonyPostfix] [HarmonyWrapSafe] private static void SemiFunc_SaveFileSave() { if (PluginLoader.savePublicEnabled.Value && GameManager.instance.connectRandom) { StatsManager.instance.SaveFileSave(); } } [HarmonyPatch(typeof(DataDirector), "SaveDeleteCheck")] [HarmonyPrefix] [HarmonyPriority(800)] [HarmonyWrapSafe] private static void DataDirector_SaveDeleteCheck_Prefix() { if (PluginLoader.savePublicEnabled.Value && connectRandomCached) { GameManager.instance.connectRandom = false; } } [HarmonyPatch(typeof(DataDirector), "SaveDeleteCheck")] [HarmonyPostfix] [HarmonyPriority(0)] [HarmonyWrapSafe] private static void DataDirector_SaveDeleteCheck_Postfix() { if (connectRandomCached) { GameManager.instance.connectRandom = true; } } } [HarmonyPatch] public class ServerListSearch { [HarmonyPatch(typeof(MenuPageServerListSearch), "Update")] [HarmonyPrefix] [HarmonyWrapSafe] private static void MenuPageServerListSearch_Update(MenuPageServerListSearch __instance) { if (Input.GetKey((KeyCode)306) && Input.GetKeyDown((KeyCode)118)) { string systemCopyBuffer = GUIUtility.systemCopyBuffer; Match match = Regex.Match(systemCopyBuffer, "steam://joinlobby/\\d+/(\\d+)/\\d+"); if (match.Success) { MenuTextInput menuTextInput = __instance.menuTextInput; menuTextInput.textCurrent += match.Groups[1].Value; } else { MenuTextInput menuTextInput2 = __instance.menuTextInput; menuTextInput2.textCurrent += systemCopyBuffer; } } } [HarmonyPatch(typeof(MenuPageServerList), "SetSearch")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool MenuPageServerList_SetSearch(string _searchString) { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) if (!string.IsNullOrEmpty(_searchString) && Regex.IsMatch(_searchString, "^[0-9]{17,19}$") && ulong.TryParse(_searchString, out var result)) { if (SteamApps.BuildId <= 18995935) { MenuManager instance = MenuManager.instance; if (instance != null) { instance.PageCloseAll(); } MenuManager instance2 = MenuManager.instance; if (instance2 != null) { instance2.PageOpen((MenuPageIndex)0, false); } } SteamManager.instance.OnGameLobbyJoinRequested(new Lobby(SteamId.op_Implicit(result)), SteamClient.SteamId); return false; } return true; } } [HarmonyPatch] public class TesterOverlayPatches { [HarmonyPatch(typeof(DebugTesterUI), "Start")] [HarmonyPrefix] [HarmonyWrapSafe] private static bool DebugTesterUI_Start(DebugTesterUI __instance) { if (!Debug.isDebugBuild) { return SemiFunc.DebugDev(); } return true; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }