using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyVersion("0.0.0.0")] [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 Empress.SpawnManagerFix { [BepInPlugin("0.empress.spawnmanagerfix", "Empress Spawn Manager Fix", "1.0.0")] public sealed class EmpressSpawnManagerFixPlugin : BaseUnityPlugin { private delegate void LevelGeneratorItemSetupPrefixDelegate(); private delegate void ValuableDirectorSpawnPrefixDelegate(GameObject valuable, ValuableVolume volume, ref string path); private const string PluginGuid = "0.empress.spawnmanagerfix"; private const string PluginName = "Empress Spawn Manager Fix"; private const string PluginVersion = "1.0.0"; private const string SpawnManagerAssemblyName = "SpawnManager"; private const string SpawnManagerBaseTypeName = "SpawnManager.SpawnManagerBase"; private const string SpawnManagerSettingsTypeName = "SpawnManager.Settings"; private const string SpawnManagerPluginManagerTypeName = "SpawnManager.Managers.PluginManager"; private const string SpawnManagerMenuManagerTypeName = "SpawnManager.Managers.MenuModManager"; private static readonly Harmony BootstrapHarmony = new Harmony("0.empress.spawnmanagerfix.bootstrap"); private static readonly Harmony PatchHarmony = new Harmony("0.empress.spawnmanagerfix.patches"); private static ManualLogSource EmpressLogger; private static bool AwakeHookApplied; private static bool SpawnManagerPatchesApplied; private static bool SpawnManagerItemSetupWarningLogged; private static LevelGeneratorItemSetupPrefixDelegate LevelGeneratorItemSetupDelegate; private static ValuableDirectorSpawnPrefixDelegate ValuableDirectorSpawnDelegate; private void Awake() { EmpressLogger = ((BaseUnityPlugin)this).Logger; AppDomain.CurrentDomain.AssemblyLoad += OnAssemblyLoad; Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { TryHookSpawnManagerAwake(assemblies[i]); } } private static void OnAssemblyLoad(object sender, AssemblyLoadEventArgs args) { TryHookSpawnManagerAwake(args.LoadedAssembly); } private static void TryHookSpawnManagerAwake(Assembly assembly) { //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown if (AwakeHookApplied || assembly == null || !string.Equals(assembly.GetName().Name, "SpawnManager", StringComparison.OrdinalIgnoreCase)) { return; } Type type = assembly.GetType("SpawnManager.SpawnManagerBase", throwOnError: false); if (type == null) { return; } MethodInfo methodInfo = AccessTools.Method(type, "Awake", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(EmpressSpawnManagerFixPlugin), "SpawnManagerBaseAwakePrefix", (Type[])null, (Type[])null); if (!(methodInfo == null) && !(methodInfo2 == null)) { BootstrapHarmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); AwakeHookApplied = true; ManualLogSource empressLogger = EmpressLogger; if (empressLogger != null) { empressLogger.LogInfo((object)"Empress Spawn Manager Fix hooked SpawnManager startup."); } } } private static bool SpawnManagerBaseAwakePrefix(object __instance) { try { BaseUnityPlugin val = (BaseUnityPlugin)((__instance is BaseUnityPlugin) ? __instance : null); if ((Object)(object)val == (Object)null) { return false; } Assembly assembly = __instance.GetType().Assembly; InitializeSettings(assembly, val.Config); InitializeMenuManager(assembly); ApplySpawnManagerPatches(assembly); ManualLogSource empressLogger = EmpressLogger; if (empressLogger != null) { empressLogger.LogInfo((object)"Enemy/Valuable Spawn Manager Empress compatibility loaded."); } } catch (Exception ex) { ManualLogSource empressLogger2 = EmpressLogger; if (empressLogger2 != null) { empressLogger2.LogError((object)("Enemy/Valuable Spawn Manager Empress compatibility failed: " + ex)); } } return false; } private static void InitializeSettings(Assembly assembly, ConfigFile config) { Type type = assembly.GetType("SpawnManager.Settings", throwOnError: false); if (!(type == null)) { MethodInfo methodInfo = AccessTools.Method(type, "Initialize", new Type[2] { typeof(ConfigFile), typeof(ManualLogSource) }, (Type[])null); if (!(methodInfo == null)) { ((Action)Delegate.CreateDelegate(typeof(Action), methodInfo))(config, EmpressLogger); } } } private static void InitializeMenuManager(Assembly assembly) { Type type = assembly.GetType("SpawnManager.Managers.PluginManager", throwOnError: false); if (type == null) { return; } MethodInfo methodInfo = AccessTools.Method(type, "IsPluginInstalled", new Type[1] { typeof(string) }, (Type[])null); if (methodInfo == null) { return; } if (!((Func)Delegate.CreateDelegate(typeof(Func), methodInfo))("nickklmao.menulib")) { ManualLogSource empressLogger = EmpressLogger; if (empressLogger != null) { empressLogger.LogWarning((object)"MenuLib not loaded. Cannot add button to main menu."); } return; } Type type2 = assembly.GetType("SpawnManager.Managers.MenuModManager", throwOnError: false); MethodInfo methodInfo2 = ((type2 != null) ? AccessTools.Method(type2, "Initialize", (Type[])null, (Type[])null) : null); if (!(methodInfo2 == null)) { ((Action)Delegate.CreateDelegate(typeof(Action), methodInfo2))(); } } private static void ApplySpawnManagerPatches(Assembly assembly) { //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Expected O, but got Unknown //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Expected O, but got Unknown //IL_02e0: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: Expected O, but got Unknown if (SpawnManagerPatchesApplied) { return; } PatchOriginalPrefix(assembly, "SpawnManager.Patches.RunManagerPatches", "RunManagerAwakePrefix", AccessTools.Method(typeof(RunManager), "Awake", Type.EmptyTypes, (Type[])null)); PatchOriginalPrefix(assembly, "SpawnManager.Patches.RunManagerPatches", "RunManagerChangeLevelPrefix", AccessTools.Method(typeof(RunManager), "ChangeLevel", new Type[3] { typeof(bool), typeof(bool), typeof(ChangeLevelType) }, (Type[])null)); PatchOriginalPostfix(assembly, "SpawnManager.Patches.EnemyDirectorPatches", "EnemyDirectorStartPostfix", AccessTools.Method(typeof(EnemyDirector), "Start", Type.EmptyTypes, (Type[])null)); PatchOriginalPostfix(assembly, "SpawnManager.Patches.EnemyDirectorPatches", "EnemyDirectorPickEnemiesPostfix", AccessTools.Method(typeof(EnemyDirector), "PickEnemies", new Type[1] { typeof(List) }, (Type[])null)); PatchOriginalPrefix(assembly, "SpawnManager.Patches.EnemyDirectorPatches", "EnemyDirectorGetEnemyPrefix", AccessTools.Method(typeof(EnemyDirector), "GetEnemy", Type.EmptyTypes, (Type[])null)); Type type = assembly.GetType("SpawnManager.Settings", throwOnError: false); MethodInfo methodInfo = ((type != null) ? AccessTools.Method(type, "InitializeItemsLevels", (Type[])null, (Type[])null) : null); MethodInfo methodInfo2 = AccessTools.Method(typeof(EmpressSpawnManagerFixPlugin), "SettingsInitializeItemsLevelsPrefix", (Type[])null, (Type[])null); if (methodInfo != null && methodInfo2 != null) { PatchHarmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } Type type2 = assembly.GetType("SpawnManager.Patches.LevelGeneratorPatches", throwOnError: false); MethodInfo methodInfo3 = ((type2 != null) ? AccessTools.Method(type2, "LevelGeneratorItemSetupPrefix", (Type[])null, (Type[])null) : null); if (methodInfo3 != null) { LevelGeneratorItemSetupDelegate = AccessTools.MethodDelegate(methodInfo3, (object)null, true); MethodInfo methodInfo4 = AccessTools.Method(typeof(LevelGenerator), "ItemSetup", new Type[1] { typeof(PhotonMessageInfo) }, (Type[])null); MethodInfo methodInfo5 = AccessTools.Method(typeof(EmpressSpawnManagerFixPlugin), "LevelGeneratorItemSetupSafePrefix", (Type[])null, (Type[])null); if (methodInfo4 != null && methodInfo5 != null) { PatchHarmony.Patch((MethodBase)methodInfo4, new HarmonyMethod(methodInfo5), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } Type type3 = assembly.GetType("SpawnManager.Patches.ValuableDirectorPatches", throwOnError: false); MethodInfo methodInfo6 = ((type3 != null) ? AccessTools.Method(type3, "ValuableDirectorSpawnPrefix", (Type[])null, (Type[])null) : null); if (methodInfo6 != null) { ValuableDirectorSpawnDelegate = AccessTools.MethodDelegate(methodInfo6, (object)null, true); } MethodInfo methodInfo7 = AccessTools.Method(typeof(ValuableDirector), "SpawnValuable", new Type[3] { typeof(PrefabRef), typeof(ValuableVolume), typeof(string) }, (Type[])null); MethodInfo methodInfo8 = AccessTools.Method(typeof(EmpressSpawnManagerFixPlugin), "ValuableDirectorSpawnValuablePrefix", (Type[])null, (Type[])null); if (methodInfo7 != null && methodInfo8 != null) { PatchHarmony.Patch((MethodBase)methodInfo7, new HarmonyMethod(methodInfo8), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } SpawnManagerPatchesApplied = true; } private static bool SettingsInitializeItemsLevelsPrefix() { //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Expected O, but got Unknown Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly candidate) => candidate != null && string.Equals(candidate.GetName().Name, "SpawnManager", StringComparison.OrdinalIgnoreCase)); if (assembly == null) { return false; } Type type = assembly.GetType("SpawnManager.Settings", throwOnError: false); if (type == null) { return false; } MethodInfo methodInfo = AccessTools.PropertyGetter(type, "Config"); MethodInfo methodInfo2 = AccessTools.PropertyGetter(type, "DisabledLevelItems"); if (methodInfo == null || methodInfo2 == null) { return false; } object? obj = methodInfo.Invoke(null, null); ConfigFile val = (ConfigFile)((obj is ConfigFile) ? obj : null); IDictionary> disabledLevelItems = methodInfo2.Invoke(null, null) as IDictionary>; if (val == null || disabledLevelItems == null) { return false; } List list = new List(); if (RunManager.instance?.levels != null) { list.AddRange(RunManager.instance.levels.Where((Level level) => (Object)(object)level != (Object)null)); } if (RunManager.instance?.levelShop != null) { list.AddRange(RunManager.instance.levelShop.Where((Level level) => (Object)(object)level != (Object)null)); } foreach (Level item in list.Where((Level level) => (Object)(object)level != (Object)null && !disabledLevelItems.ContainsKey(((Object)level).name))) { ConfigEntry value = val.Bind("Items", ((Object)item).name + " - Disabled Items", "", new ConfigDescription("Comma-separated list of item names to disable in this level. (e.g. \"Cart Medium\")", (AcceptableValueBase)null, new object[1] { "HideREPOConfig" })); disabledLevelItems.Add(((Object)item).name, value); } return false; } private static void LevelGeneratorItemSetupSafePrefix() { if (LevelGeneratorItemSetupDelegate == null) { return; } try { LevelGeneratorItemSetupDelegate(); } catch (MissingFieldException ex) { if (!SpawnManagerItemSetupWarningLogged) { SpawnManagerItemSetupWarningLogged = true; ManualLogSource empressLogger = EmpressLogger; if (empressLogger != null) { empressLogger.LogWarning((object)("Enemy/Valuable Spawn Manager item/level setup is skipping an outdated field path on current REPO: " + ex.Message)); } } } catch (MissingMemberException ex2) { if (!SpawnManagerItemSetupWarningLogged) { SpawnManagerItemSetupWarningLogged = true; ManualLogSource empressLogger2 = EmpressLogger; if (empressLogger2 != null) { empressLogger2.LogWarning((object)("Enemy/Valuable Spawn Manager item/level setup is skipping an outdated member path on current REPO: " + ex2.Message)); } } } } private static void PatchOriginalPrefix(Assembly assembly, string typeName, string methodName, MethodInfo targetMethod) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown if (!(targetMethod == null)) { Type type = assembly.GetType(typeName, throwOnError: false); MethodInfo methodInfo = ((type != null) ? AccessTools.Method(type, methodName, (Type[])null, (Type[])null) : null); if (!(methodInfo == null)) { PatchHarmony.Patch((MethodBase)targetMethod, new HarmonyMethod(methodInfo), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } private static void PatchOriginalPostfix(Assembly assembly, string typeName, string methodName, MethodInfo targetMethod) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown if (!(targetMethod == null)) { Type type = assembly.GetType(typeName, throwOnError: false); MethodInfo methodInfo = ((type != null) ? AccessTools.Method(type, methodName, (Type[])null, (Type[])null) : null); if (!(methodInfo == null)) { PatchHarmony.Patch((MethodBase)targetMethod, (HarmonyMethod)null, new HarmonyMethod(methodInfo), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } private static void ValuableDirectorSpawnValuablePrefix(PrefabRef _valuable, ValuableVolume _volume, ref string _path) { if (_valuable != null && ValuableDirectorSpawnDelegate != null) { GameObject prefab = _valuable.Prefab; if (!((Object)(object)prefab == (Object)null)) { ValuableDirectorSpawnDelegate(prefab, _volume, ref _path); } } } } }