using 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; using BepInEx; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PluginConfig.API; using PluginConfig.API.Fields; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.AddressableAssets.ResourceLocators; using UnityEngine.Events; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.SceneManagement; [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("meticulouslyrare.eggroom")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("meticulouslyrare.eggroom")] [assembly: AssemblyTitle("meticulouslyrare.eggroom")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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; } } } public class _EggRoomDoorAdd : MonoBehaviour { public Door parentDoor; public _EggRoomMain eggMain; public void Awake() { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown if ((Object)(object)parentDoor == (Object)null) { parentDoor = ((Component)this).gameObject.GetComponentInParent(); } if ((Object)(object)eggMain == (Object)null) { eggMain = _EggRoomMain.Instance; } if ((Object)(object)parentDoor != (Object)null && (Object)(object)eggMain != (Object)null) { parentDoor.onFullyOpened.AddListener(new UnityAction(TeleportToEggRoom)); } } public void TeleportToEggRoom() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) if (!eggMain.goneIntoEggRoom) { Debug.Log((object)$"TeleportToEggRoom called. Player at {((Component)MonoSingleton.Instance).transform.position}"); eggMain.goneIntoEggRoom = true; GameObject val = new GameObject("exitPos"); Vector3 position = ((Component)MonoSingleton.Instance).transform.position; val.transform.position = position; eggMain.roomDoorAdd = this; eggMain.exitPos = val; eggMain.lastCalmMusic = MonoSingleton.Instance.cleanTheme.clip; eggMain.lastCombatMusic = MonoSingleton.Instance.battleTheme.clip; eggMain.lastBossMusic = MonoSingleton.Instance.bossTheme.clip; eggMain.GenericTeleport(eggMain.enterPos); eggMain.OnEnterEggRoom(); } } } public class _EggRoomMain : MonoBehaviour { public ObjectActivator exitTrigger; public GameObject enterPos; [HideInInspector] public GameObject exitPos; public bool goneIntoEggRoom; [HideInInspector] public _EggRoomDoorAdd roomDoorAdd; public AudioClip lastCalmMusic; public AudioClip lastCombatMusic; public AudioClip lastBossMusic; public AudioClip eggRoomMusic; private bool previousFog; public static _EggRoomMain Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)((Component)this).gameObject); } else { Instance = this; } } public void OnEnterEggRoom() { //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Expected O, but got Unknown if ((Object)(object)eggRoomMusic != (Object)null) { MonoSingleton.Instance.StopMusic(); MonoSingleton.Instance.cleanTheme.clip = eggRoomMusic; MonoSingleton.Instance.battleTheme.clip = eggRoomMusic; MonoSingleton.Instance.bossTheme.clip = eggRoomMusic; MonoSingleton.Instance.cleanTheme.pitch = 1f; MonoSingleton.Instance.battleTheme.pitch = 1f; MonoSingleton.Instance.bossTheme.pitch = 1f; MonoSingleton.Instance.StartMusic(); } else { Debug.LogWarning((object)"Egg room music is not loaded."); } previousFog = RenderSettings.fog; RenderSettings.fog = false; MonoSingleton.Instance.currentCheckPoint.onRestart.AddListener(new UnityAction(OnCheckpointReload)); } public void OnExitEggRoom() { Object.Destroy((Object)(object)((Component)roomDoorAdd).gameObject); MonoSingleton.Instance.StopMusic(); MonoSingleton.Instance.cleanTheme.clip = lastCalmMusic; MonoSingleton.Instance.battleTheme.clip = lastCombatMusic; MonoSingleton.Instance.bossTheme.clip = lastBossMusic; MonoSingleton.Instance.cleanTheme.pitch = 1f; MonoSingleton.Instance.battleTheme.pitch = 1f; MonoSingleton.Instance.bossTheme.pitch = 1f; MonoSingleton.Instance.StartMusic(); RenderSettings.fog = previousFog; GenericTeleport(exitPos); } public void GenericTeleport(GameObject targetPos) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) NewMovement instance = MonoSingleton.Instance; if (Object.op_Implicit((Object)(object)instance.ridingRocket)) { instance.ridingRocket.PlayerRideEnd(); } instance.StopMovement(); instance.gc.heavyFall = false; ((Component)instance).transform.position = targetPos.transform.position; ((Component)instance).transform.rotation = targetPos.transform.rotation; instance.dodgeDirection = Vector3.forward; } private void OnDestroy() { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } public void OnCheckpointReload() { Object.Destroy((Object)(object)((Component)roomDoorAdd).gameObject); MonoSingleton.Instance.StopMusic(); MonoSingleton.Instance.cleanTheme.clip = lastCalmMusic; MonoSingleton.Instance.battleTheme.clip = lastCombatMusic; MonoSingleton.Instance.bossTheme.clip = lastBossMusic; MonoSingleton.Instance.StartMusic(); RenderSettings.fog = previousFog; } } namespace EggRoom { [BepInPlugin("meticulouslyrare.EggRoom", "Mysterious Man's Room", "1.0.0")] public class Plugin : BaseUnityPlugin { public static Plugin? Instance; public static string eggContent = Path.Combine(ModPath(), "EggContent"); public bool isContentLoaded; public List currentLevelDoors = new List(); public List currentDoorCandidates = new List(); public string eggRoomHash = "5d293bcd90f9e5041b0846d3a3970b97"; public string eggMusicHash = "67c1d91c51199fe44bc8d12dbba8479e"; public PluginConfigurator config; public bool modEnabled = true; public float behaviorSpawnChance = 5f; private static readonly HashSet forbiddenDoors = new HashSet { "DoorLeft", "DoorRight", "Halls Entrance" }; public static string ModPath() { return Assembly.GetExecutingAssembly().Location.Substring(0, Assembly.GetExecutingAssembly().Location.LastIndexOf(Path.DirectorySeparatorChar)); } private bool ShouldSpawnEggRoom() { if (modEnabled) { return Random.Range(0f, 100f) < behaviorSpawnChance; } return false; } private void Awake() { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Expected O, but got Unknown //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Expected O, but got Unknown Instance = this; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Egg Room loaded!"); if (!isContentLoaded) { ((MonoBehaviour)this).StartCoroutine(LoadCatalogAndBundle(forceReload: true)); isContentLoaded = true; } SceneManager.sceneLoaded += OnSceneLoaded; new Harmony("meticulouslyrare.EggRoom").PatchAll(); config = PluginConfigurator.Create("Mysterious Man's Room", "meticulouslyrare.EggRoom"); BoolField val = new BoolField(config.rootPanel, "Enable Mod", "meticulouslyrare.eggroom.enabled", true); FloatField val2 = new FloatField(config.rootPanel, "Behavior Spawn Chance", "meticulouslyrare.eggroom.spawnchance", 5f, 0f, 100f); modEnabled = val.value; behaviorSpawnChance = val2.value; val.onValueChange += (BoolValueChangeEventDelegate)delegate(BoolValueChangeEvent e) { modEnabled = e.value; }; val2.onValueChange += (FloatValueChangeEventDelegate)delegate(FloatValueChangeEvent e) { behaviorSpawnChance = e.value; }; } private T[] FindAllInstances() where T : Object { return Resources.FindObjectsOfTypeAll(); } private void SaveCatalogKeysToFile() { StringBuilder stringBuilder = new StringBuilder(); foreach (object item in Addressables.ResourceLocators.SelectMany((IResourceLocator locator) => locator.Keys)) { stringBuilder.AppendLine(item.ToString()); } string text = Path.Combine(ModPath(), "catalogInfo.txt"); try { File.WriteAllText(text, stringBuilder.ToString()); Debug.Log((object)("Catalog keys saved to: " + text)); } catch (Exception ex) { Debug.LogError((object)("Failed to save catalog keys: " + ex.Message)); } } public void OnSceneLoaded(Scene scene, LoadSceneMode mode) { ((MonoBehaviour)this).StartCoroutine(SetupDoors()); } private IEnumerator SetupDoors() { yield return null; currentLevelDoors.Clear(); currentDoorCandidates.Clear(); Door[] collection = Object.FindObjectsByType((FindObjectsInactive)1, (FindObjectsSortMode)0); currentLevelDoors.AddRange(collection); foreach (Door currentLevelDoor in currentLevelDoors) { Debug.LogError((object)("Door found: " + ((Object)currentLevelDoor).name)); if (forbiddenDoors.Contains(((Object)currentLevelDoor).name)) { Debug.LogError((object)("Skipping forbidden door: " + ((Object)currentLevelDoor).name)); continue; } GameObject[] activatedRooms = currentLevelDoor.activatedRooms; if (((activatedRooms != null && activatedRooms.Length != 0) ? 1 : 0) <= (false ? 1 : 0)) { GameObject[] deactivatedRooms = currentLevelDoor.deactivatedRooms; if (((deactivatedRooms != null && deactivatedRooms.Length != 0) ? 1 : 0) <= (false ? 1 : 0)) { continue; } } Debug.LogError((object)("Candidate: " + ((Object)currentLevelDoor).name)); currentDoorCandidates.Add(currentLevelDoor); } Debug.LogError((object)$"Candidates: {currentDoorCandidates.Count}"); if (currentDoorCandidates.Count == 0) { Debug.LogError((object)"No valid door candidates."); yield break; } bool flag = ShouldSpawnEggRoom(); Debug.LogError((object)$"ShouldSpawn = {flag}"); if (flag) { Debug.LogError((object)"Starting instantiate..."); AsyncOperationHandle handle = Addressables.InstantiateAsync((object)eggRoomHash, (Transform)null, false, true); yield return handle; Debug.LogError((object)$"Instantiate status: {handle.Status}"); if ((int)handle.Status != 1) { Debug.LogError((object)"Instantiate failed."); Debug.LogException(handle.OperationException); yield break; } _ = handle.Result; Debug.LogError((object)"Instantiate succeeded."); int index = Random.Range(0, currentDoorCandidates.Count); Door val = currentDoorCandidates[index]; Debug.LogError((object)("Door chosen: " + ((Object)val).name)); GameObject val2 = new GameObject("_EggRoomDoorAdd"); val2.transform.SetParent(((Component)val).transform, false); val2.AddComponent<_EggRoomDoorAdd>().parentDoor = val; Debug.LogError((object)"Finished SetupDoors."); } } private IEnumerator LoadCatalogAndBundle(bool forceReload) { string text = Path.Combine(eggContent, "catalog.json"); string text2 = Path.Combine(eggContent, "patched_catalog.json"); if (!File.Exists(text)) { Debug.LogError((object)("Catalog file not found at: " + text)); yield break; } try { JObject val = JObject.Parse(File.ReadAllText(text)); string text3 = "{AngryLevelLoader.Plugin.tempFolderPath}\\\\"; string newValue = "{EggRoom.Plugin.eggContent}\\"; JToken val2 = ((JToken)val).SelectToken("m_InternalIds"); if (val2 != null && (int)val2.Type == 2) { JArray val3 = (JArray)val2; for (int i = 0; i < ((JContainer)val3).Count; i++) { string text4 = ((object)val3[i]).ToString(); if (text4.Contains(text3)) { val3[i] = JToken.op_Implicit(text4.Replace(text3, newValue)); } } } File.WriteAllText(text2, ((JToken)val).ToString((Formatting)1, Array.Empty())); Debug.Log((object)"Patched catalog created successfully."); } catch (Exception ex) { Debug.LogError((object)("Error while patching catalog: " + ex.Message)); yield break; } AsyncOperationHandle addressableHandle = Addressables.LoadContentCatalogAsync(text2, false, (string)null); yield return (object)new WaitUntil((Func)(() => addressableHandle.IsDone || (int)addressableHandle.Status == 2)); if ((int)addressableHandle.Status == 1) { Debug.Log((object)"Patched catalog loaded successfully."); SaveCatalogKeysToFile(); } else { Debug.LogError((object)$"Failed to load patched catalog: {addressableHandle.OperationException}"); } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { internal IgnoresAccessChecksToAttribute(string assemblyName) { } } }