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 EvolutionEquipment v1.0.3
plugins/EvolutionEquipment.dll
Decompiled 2 years agousing System; 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.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using IL.RoR2; using IL.RoR2.Artifacts; using IL.RoR2.UI; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using On.RoR2.Artifacts; using On.RoR2.UI; using RoR2; using RoR2.Artifacts; using RoR2.CharacterAI; using RoR2.UI; using TMPro; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("Chinchi")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Enemies get an equipment with the Artifact of Evolution and in Simulacrum")] [assembly: AssemblyFileVersion("1.0.3.0")] [assembly: AssemblyInformationalVersion("1.0.3+435760dfc9a420a46979465fdddf85ecf6bf45af")] [assembly: AssemblyProduct("EvolutionEquipment")] [assembly: AssemblyTitle("EvolutionEquipment")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/schinchi/EvolutionEquipment")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.3.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 EvolutionEquipment { internal class Configuration { internal static ConfigEntry<bool> isSimulacrumEnabled; internal static ConfigEntry<bool> rerollLunar; internal static ConfigEntry<float> humanDistanceThreshold; internal static ConfigEntry<float> humanHealthThreshold; internal static ConfigEntry<float> golemDistanceThreshold; internal static ConfigEntry<float> golemHealthThreshold; internal static ConfigEntry<float> queenDistanceThreshold; internal static ConfigEntry<float> queenHealthThreshold; internal static ConfigEntry<int> minStagesCleared; internal static ConfigEntry<int> stepStagesCleared; internal static ConfigEntry<int> minWavesCleared; internal static ConfigEntry<int> stepWavesCleared; internal static ConfigEntry<int> humanUsesLimit; internal static ConfigEntry<int> golemUsesLimit; internal static ConfigEntry<int> queenUsesLimit; internal static ConfigEntry<string> blacklistedEquipment; internal static ConfigEntry<string> blacklistedEquipmentMoon; internal static ConfigEntry<string> blacklistedMonsters; internal static void Init(ConfigFile config) { humanDistanceThreshold = config.Bind<float>("AI.Basic", "humanDistanceThreshold", 50f, "The maximum distance for basic monsters to activate their equipment"); humanHealthThreshold = config.Bind<float>("AI.Basic", "humanHealthThreshold", 0.75f, "The maximum normalised health for basic monsters to activate their equipment"); humanUsesLimit = config.Bind<int>("AI.Basic", "humanUsesLimit", -1, "The number of times a basic monster can activate their equipment. -1 is for unlimited"); golemDistanceThreshold = config.Bind<float>("AI.Miniboss", "golemDistanceThreshold", 65f, "The maximum distance for minibosses to activate their equipment"); golemHealthThreshold = config.Bind<float>("AI.Miniboss", "golemHealthThreshold", 0.5f, "The maximum normalised health for minibosses to activate their equipment"); golemUsesLimit = config.Bind<int>("AI.Miniboss", "golemUsesLimit", -1, "The number of times a miniboss can activate their equipment. -1 is for unlimited"); queenDistanceThreshold = config.Bind<float>("AI.Champion", "queenDistanceThreshold", 80f, "The maximum distance for champions to activate their equipment"); queenHealthThreshold = config.Bind<float>("AI.Champion", "queenHealthThreshold", 0.25f, "The maximum normalised health for champions to activate their equipment"); queenUsesLimit = config.Bind<int>("AI.Champion", "queenUsesLimit", -1, "The number of times a champion can activate their equipment. -1 is for unlimited"); blacklistedEquipment = config.Bind<string>("Blacklist", "blacklistedEquipment", "BFG,Blackhole,CommandMissile,DroneBackup,FireBallDash,GoldGat,Lightning,Saw", "Blacklisted equipment. Use 'list_equip' from DebugToolkit for internal names"); blacklistedEquipmentMoon = config.Bind<string>("Blacklist", "blacklistedEquipmentMoon", "Fruit,PassiveHealing", "Additional blacklisted equipment for Commencement. Intended to avoid any softlocks with Mithrix."); blacklistedMonsters = config.Bind<string>("Blacklist", "blacklistedMonsters", "", "Monsters whose AI is not modified to use equipment. Use 'list_ai' from DebugToolkit for internal names"); minStagesCleared = config.Bind<int>("Evolution", "minStagesCleared", 0, "The minimum stages cleared required before selecting an equipment"); stepStagesCleared = config.Bind<int>("Evolution", "stepStagesCleared", 1, "The equipment will be rerolled every this many stages after 'minStagesCleared'"); rerollLunar = config.Bind<bool>("General", "rerollLunar", true, "Reroll for a Lunar Equipment if the player holds Eulogy of Zero."); isSimulacrumEnabled = config.Bind<bool>("Simulacrum", "isSimulacrumEnabled", true, "Enable equipment giving for Simulacrum. If enabled, it overrides any Evolution settings for the game mode"); minWavesCleared = config.Bind<int>("Simulacrum", "minWavesCleared", 4, "The minimum number of Simulacrum waves required before selecting an equipment"); stepWavesCleared = config.Bind<int>("Simulacrum", "stepWavesCleared", 5, "The equipment will be rerolled every this many Simulacrum waves after 'minWavesCleared'"); minStagesCleared.Value = Math.Max(minStagesCleared.Value, 0); stepStagesCleared.Value = Math.Max(stepStagesCleared.Value, 1); minWavesCleared.Value = Math.Max(minWavesCleared.Value, 0); stepWavesCleared.Value = Math.Max(stepWavesCleared.Value, 1); } } [BepInPlugin("Chinchi.EvolutionEquipment", "EvolutionEquipment", "1.0.3")] public class EvolutionEquipment : BaseUnityPlugin { public const string PluginGUID = "Chinchi.EvolutionEquipment"; public const string PluginAuthor = "Chinchi"; public const string PluginName = "EvolutionEquipment"; public const string PluginVersion = "1.0.3"; internal static ManualLogSource Logger; private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Configuration.Init(((BaseUnityPlugin)this).Config); Hooks.Init(); Language.collectLanguageRootFolders += AddLanguageFolder; RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(PatchAI)); } private void AddLanguageFolder(List<string> languageFolders) { string text = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "languages"); if (Directory.Exists(text)) { languageFolders.Add(text); } } private void PatchAI() { //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Invalid comparison between Unknown and I4 //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) HashSet<string> hashSet = new HashSet<string>(from x in Configuration.blacklistedMonsters.Value.Split(new char[1] { ',' }) select x.Trim()); foreach (CharacterMaster allAiMaster in MasterCatalog.allAiMasters) { if (hashSet.Contains(((Object)((Component)allAiMaster).gameObject).name) || (Object)(object)allAiMaster.bodyPrefab == (Object)null || (Object)(object)allAiMaster.bodyPrefab.GetComponent<EquipmentSlot>() == (Object)null) { continue; } AISkillDriver[] components = ((Component)allAiMaster).GetComponents<AISkillDriver>(); if (components.Any((AISkillDriver x) => x.shouldFireEquipment)) { continue; } HullClassification hullClassification = allAiMaster.bodyPrefab.GetComponent<CharacterBody>().hullClassification; float value; float value2; int value3; if ((int)hullClassification != 0) { if ((int)hullClassification == 1) { value = Configuration.golemHealthThreshold.Value; value2 = Configuration.golemDistanceThreshold.Value; value3 = Configuration.golemUsesLimit.Value; } else { value = Configuration.queenHealthThreshold.Value; value2 = Configuration.queenDistanceThreshold.Value; value3 = Configuration.queenUsesLimit.Value; } } else { value = Configuration.humanHealthThreshold.Value; value2 = Configuration.humanDistanceThreshold.Value; value3 = Configuration.humanUsesLimit.Value; } AISkillDriver obj = ((Component)allAiMaster).gameObject.AddComponent<AISkillDriver>(); obj.customName = "FireEquipment"; obj.skillSlot = (SkillSlot)(-1); obj.requireEquipmentReady = true; obj.maxUserHealthFraction = value; obj.maxDistance = value2; obj.selectionRequiresTargetLoS = true; obj.selectionRequiresAimTarget = true; obj.activationRequiresTargetLoS = true; obj.activationRequiresAimConfirmation = true; obj.shouldFireEquipment = true; obj.aimType = (AimType)1; obj.moveTargetType = (TargetType)0; obj.movementType = (MovementType)1; obj.noRepeat = true; obj.maxTimesSelected = value3; AISkillDriver[] array = components; foreach (AISkillDriver val in array) { Component obj2 = ((Component)allAiMaster).gameObject.AddComponent(((object)val).GetType()); FieldInfo[] fields = ((object)val).GetType().GetFields(); foreach (FieldInfo fieldInfo in fields) { fieldInfo.SetValue(obj2, fieldInfo.GetValue(val)); } Object.DestroyImmediate((Object)(object)val); } } } } internal static class Hooks { [CompilerGenerated] private static class <>O { public static Action<Run> <0>__FilterRunEquipment; public static hook_Awake <1>__CreateEquipmentPanel; public static Manipulator <2>__UpdateEquipmentPanel; public static hook_OnDestroy <3>__RemoveInfoPanel; public static hook_EnsureMonsterItemCountMatchesStageCount <4>__RollStageEquipment; public static hook_AdvanceWave <5>__RollWaveEquipment; public static Manipulator <6>__GiveMonsterEquipmentClassic; public static Manipulator <7>__GiveMonsterEquipmentSimulacrum; public static Action <8>__RefreshPanelPosition; } private static Sprite backgroundSprite; private static readonly List<EquipmentIndex> availableEquipment = new List<EquipmentIndex>(); private static readonly List<EquipmentIndex> availableLunarEquipment = new List<EquipmentIndex>(); private static readonly List<EquipmentIndex> availableEquipmentMoon = new List<EquipmentIndex>(); private static readonly List<EquipmentIndex> availableLunarEquipmentMoon = new List<EquipmentIndex>(); private static readonly Dictionary<EnemyInfoPanel, Tuple<GameObject, UIElementAllocator<RawImage>>> enemyInfoPanels = new Dictionary<EnemyInfoPanel, Tuple<GameObject, UIElementAllocator<RawImage>>>(); private static readonly Xoroshiro128Plus rng = new Xoroshiro128Plus(0uL); internal static void Init() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Expected O, but got Unknown //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Expected O, but got Unknown Run.onRunStartGlobal += FilterRunEquipment; object obj = <>O.<1>__CreateEquipmentPanel; if (obj == null) { hook_Awake val = CreateEquipmentPanel; <>O.<1>__CreateEquipmentPanel = val; obj = (object)val; } EnemyInfoPanel.Awake += (hook_Awake)obj; object obj2 = <>O.<2>__UpdateEquipmentPanel; if (obj2 == null) { Manipulator val2 = UpdateEquipmentPanel; <>O.<2>__UpdateEquipmentPanel = val2; obj2 = (object)val2; } EnemyInfoPanel.SetDisplayDataForViewer += (Manipulator)obj2; object obj3 = <>O.<3>__RemoveInfoPanel; if (obj3 == null) { hook_OnDestroy val3 = RemoveInfoPanel; <>O.<3>__RemoveInfoPanel = val3; obj3 = (object)val3; } EnemyInfoPanel.OnDestroy += (hook_OnDestroy)obj3; object obj4 = <>O.<4>__RollStageEquipment; if (obj4 == null) { hook_EnsureMonsterItemCountMatchesStageCount val4 = RollStageEquipment; <>O.<4>__RollStageEquipment = val4; obj4 = (object)val4; } MonsterTeamGainsItemsArtifactManager.EnsureMonsterItemCountMatchesStageCount += (hook_EnsureMonsterItemCountMatchesStageCount)obj4; object obj5 = <>O.<5>__RollWaveEquipment; if (obj5 == null) { hook_AdvanceWave val5 = RollWaveEquipment; <>O.<5>__RollWaveEquipment = val5; obj5 = (object)val5; } InfiniteTowerRun.AdvanceWave += (hook_AdvanceWave)obj5; object obj6 = <>O.<6>__GiveMonsterEquipmentClassic; if (obj6 == null) { Manipulator val6 = GiveMonsterEquipmentClassic; <>O.<6>__GiveMonsterEquipmentClassic = val6; obj6 = (object)val6; } MonsterTeamGainsItemsArtifactManager.OnServerCardSpawnedGlobal += (Manipulator)obj6; object obj7 = <>O.<7>__GiveMonsterEquipmentSimulacrum; if (obj7 == null) { Manipulator val7 = GiveMonsterEquipmentSimulacrum; <>O.<7>__GiveMonsterEquipmentSimulacrum = val7; obj7 = (object)val7; } InfiniteTowerWaveController.OnCombatSquadMemberDiscovered += (Manipulator)obj7; AsyncOperationHandle<Sprite> val8 = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/UI/texUICutOffCorner.png"); val8.Completed += delegate(AsyncOperationHandle<Sprite> operation) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 if ((int)operation.Status == 1) { backgroundSprite = operation.Result; } }; } private static void FilterRunEquipment(Run run) { HashSet<string> blacklist2 = new HashSet<string>(from x in Configuration.blacklistedEquipment.Value.Split(new char[1] { ',' }) select x.Trim()); InitAvailableEquipment(ToEquipmentIndex(run.availableEquipmentDropList), availableEquipment, blacklist2); InitAvailableEquipment(ToEquipmentIndex(run.availableLunarEquipmentDropList), availableLunarEquipment, blacklist2); HashSet<string> blacklist3 = new HashSet<string>(from x in Configuration.blacklistedEquipmentMoon.Value.Split(new char[1] { ',' }) select x.Trim()); InitAvailableEquipment(availableEquipment, availableEquipmentMoon, blacklist3); InitAvailableEquipment(availableLunarEquipment, availableLunarEquipmentMoon, blacklist3); static void InitAvailableEquipment(List<EquipmentIndex> original, List<EquipmentIndex> filtered, HashSet<string> blacklist) { //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) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) filtered.Clear(); foreach (EquipmentIndex item in original) { EquipmentDef equipmentDef = EquipmentCatalog.GetEquipmentDef(item); if ((Object)(object)equipmentDef != (Object)null && !blacklist.Contains(((Object)equipmentDef).name)) { filtered.Add(item); } } } static List<EquipmentIndex> ToEquipmentIndex(List<PickupIndex> droplist) { return droplist.Select((PickupIndex x) => PickupCatalog.GetPickupDef(x).equipmentIndex).ToList(); } } private static void CreateEquipmentPanel(orig_Awake orig, EnemyInfoPanel self) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: 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_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Expected O, but got Unknown //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_0293: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); Transform child = ((Component)self).transform.GetChild(0); GameObject val = new GameObject("EquipmentContainer"); val.SetActive(false); VerticalLayoutGroup val2 = val.AddComponent<VerticalLayoutGroup>(); ((LayoutGroup)val2).childAlignment = (TextAnchor)4; RectTransform rectTransform = ((LayoutGroup)val2).rectTransform; ((Transform)rectTransform).SetParent(child, false); ((Transform)rectTransform).localPosition = new Vector3(((Transform)rectTransform).localPosition.x, ((Transform)rectTransform).localPosition.y, 0f); ((Transform)rectTransform).localEulerAngles = Vector3.zero; ((Transform)rectTransform).localScale = Vector3.one; rectTransform.pivot = new Vector2(0.5f, 0.5f); rectTransform.anchoredPosition3D = new Vector3(73f, -99f, 0f); rectTransform.offsetMin = new Vector2(0f, -106f); rectTransform.offsetMax = new Vector2(146f, -93f); GameObject val3 = new GameObject("EquipmentLabel"); HGTextMeshProUGUI val4 = val3.AddComponent<HGTextMeshProUGUI>(); ((TMP_Text)val4).fontSize = 12f; ((TMP_Text)val4).alignment = (TextAlignmentOptions)514; val3.SetActive(false); val3.AddComponent<LanguageTextMeshController>().token = "HUD_MONSTER_EQUIPMENT_LABEL"; val3.SetActive(true); rectTransform = ((TMP_Text)val4).rectTransform; ((Transform)rectTransform).SetParent((Transform)(object)((LayoutGroup)val2).rectTransform, false); ((Transform)rectTransform).localPosition = new Vector3(((Transform)rectTransform).localPosition.x, ((Transform)rectTransform).localPosition.y, 0f); ((Transform)rectTransform).localEulerAngles = Vector3.zero; ((Transform)rectTransform).localScale = Vector3.one; GameObject val5 = new GameObject("EquipmentDisplay"); Image obj = val5.AddComponent<Image>(); ((Graphic)obj).color = new Color(0f, 0f, 0f, 0.5411f); obj.sprite = backgroundSprite; obj.type = (Type)1; GridLayoutGroup obj2 = val5.AddComponent<GridLayoutGroup>(); obj2.cellSize = new Vector2(32f, 32f); obj2.spacing = new Vector2(2f, 2f); ((LayoutGroup)obj2).childAlignment = (TextAnchor)4; ((LayoutGroup)obj2).padding = new RectOffset(2, 2, 2, 2); rectTransform = ((LayoutGroup)obj2).rectTransform; ((Transform)rectTransform).SetParent((Transform)(object)((LayoutGroup)val2).rectTransform, false); ((Transform)rectTransform).localPosition = new Vector3(((Transform)rectTransform).localPosition.x, ((Transform)rectTransform).localPosition.y, 0f); ((Transform)rectTransform).localEulerAngles = Vector3.zero; ((Transform)rectTransform).localScale = Vector3.one; rectTransform.pivot = new Vector2(0.5f, 1f); rectTransform.anchoredPosition3D = new Vector3(73f, -12f, 0f); rectTransform.offsetMin = new Vector2(0f, -84f); rectTransform.offsetMax = new Vector2(146f, -12f); enemyInfoPanels[self] = Tuple.Create<GameObject, UIElementAllocator<RawImage>>(val, new UIElementAllocator<RawImage>(rectTransform, self.iconPrefab, true, false)); } private static void UpdateEquipmentPanel(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_00b0: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdloc(x, 0) })) { EvolutionEquipment.Logger.LogError((object)"Failed to patch EnemyInfoPanel.SetDisplayDataForViewer #1"); return; } val.EmitDelegate<Func<bool, bool>>((Func<bool, bool>)delegate(bool shouldDisplay) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Invalid comparison between Unknown and I4 Inventory enemyInventory2 = GetEnemyInventory(); return shouldDisplay || (Object.op_Implicit((Object)(object)enemyInventory2) && (int)enemyInventory2.currentEquipmentIndex != -1); }); if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallvirt<EnemyInfoPanel>(x, "TrySetItems") })) { EvolutionEquipment.Logger.LogError((object)"Failed to patch EnemyInfoPanel.SetDisplayDataForViewer #2"); return; } val.Emit(OpCodes.Ldloc_1); val.EmitDelegate<Action<EnemyInfoPanel>>((Action<EnemyInfoPanel>)delegate(EnemyInfoPanel panel) { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Invalid comparison between Unknown and I4 //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) if (!enemyInfoPanels.TryGetValue(panel, out var value)) { EvolutionEquipment.Logger.LogWarning((object)("Equipment icon allocator not found: " + (object)panel.hud.targetMaster)); } else { UIElementAllocator<RawImage> item = value.Item2; Inventory enemyInventory = GetEnemyInventory(); EquipmentIndex val2 = (EquipmentIndex)((!((Object)(object)enemyInventory != (Object)null)) ? (-1) : ((int)enemyInventory.currentEquipmentIndex)); if ((int)val2 != -1) { EquipmentDef equipmentDef = EquipmentCatalog.GetEquipmentDef(val2); item.AllocateElements(1); item.elements[0].texture = equipmentDef.pickupIconTexture; TooltipProvider obj = ((Component)item.elements[0]).gameObject.AddComponent<TooltipProvider>(); obj.titleColor = Color32.op_Implicit(ColorCatalog.GetColor(equipmentDef.colorIndex)); obj.titleToken = equipmentDef.nameToken; obj.bodyToken = equipmentDef.descriptionToken; value.Item1.SetActive(true); RoR2Application.onNextUpdate += RefreshPanelPosition; } else { item.AllocateElements(0); value.Item1.SetActive(false); } } }); static Inventory GetEnemyInventory() { if (Run.instance is InfiniteTowerRun && Configuration.isSimulacrumEnabled.Value) { Run instance = Run.instance; return ((InfiniteTowerRun)((instance is InfiniteTowerRun) ? instance : null)).enemyInventory; } if (RunArtifactManager.instance.IsArtifactEnabled(Artifacts.MonsterTeamGainsItems)) { return MonsterTeamGainsItemsArtifactManager.monsterTeamInventory; } return null; } } private static void RefreshPanelPosition() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown foreach (Tuple<GameObject, UIElementAllocator<RawImage>> value in enemyInfoPanels.Values) { if (value.Item1.activeSelf) { LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform)value.Item1.transform.parent); } } } private static void RemoveInfoPanel(orig_OnDestroy orig, EnemyInfoPanel self) { orig.Invoke(self); enemyInfoPanels.Remove(self); } private static void RollStageEquipment(orig_EnsureMonsterItemCountMatchesStageCount orig) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(); if (Object.op_Implicit((Object)(object)Run.instance) && !(Run.instance is InfiniteTowerRun)) { int num = Run.instance.stageClearCount - Configuration.minStagesCleared.Value; EquipmentIndex val = (EquipmentIndex)(-1); if (num >= 0) { val = RollEquipment(num / Configuration.stepStagesCleared.Value); } Inventory monsterTeamInventory = MonsterTeamGainsItemsArtifactManager.monsterTeamInventory; if (monsterTeamInventory.currentEquipmentIndex != val) { monsterTeamInventory.SetEquipmentIndex(val); } } } private static void RollWaveEquipment(orig_AdvanceWave orig, InfiniteTowerRun self) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: 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_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Expected O, but got Unknown //IL_004c->IL004c: Incompatible stack types: O vs I4 //IL_003b->IL004c: Incompatible stack types: I4 vs O //IL_003b->IL004c: Incompatible stack types: O vs I4 orig.Invoke(self); if (!Configuration.isSimulacrumEnabled.Value) { return; } Run instance = Run.instance; object obj = ((instance is InfiniteTowerRun) ? instance : null); int num = ((InfiniteTowerRun)obj)._waveIndex - 1 - Configuration.minWavesCleared.Value; int num2; if (num >= 0) { obj = RollEquipment(num / Configuration.stepWavesCleared.Value); num2 = (int)obj; } else { num2 = -1; obj = num2; num2 = (int)obj; } EquipmentIndex val = (EquipmentIndex)obj; Inventory enemyInventory = ((InfiniteTowerRun)num2).enemyInventory; if (enemyInventory.currentEquipmentIndex != val) { enemyInventory.SetEquipmentIndex(val); PickupDef pickupDef = PickupCatalog.GetPickupDef(PickupCatalog.FindPickupIndex(val)); if (pickupDef != null) { Chat.SendBroadcastChat((ChatMessageBase)new PlayerPickupChatMessage { baseToken = "INFINITETOWER_ADD_ITEM", pickupToken = pickupDef.nameToken, pickupColor = Color32.op_Implicit(pickupDef.baseColor) }); } } } private static EquipmentIndex RollEquipment(int seedOffset) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_0077: 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_00c6: Unknown result type (might be due to invalid IL or missing references) rng.ResetSeed(Run.instance.seed + (ulong)seedOffset); string cachedName = SceneCatalog.currentSceneDef.cachedName; bool flag = cachedName == "moon2" || cachedName == "moon"; List<EquipmentIndex> list = ((!flag) ? availableEquipment : availableEquipmentMoon); EquipmentIndex result = (EquipmentIndex)((list.Count <= 0) ? (-1) : ((int)rng.NextElementUniform<EquipmentIndex>(list))); if (Configuration.rerollLunar.Value) { int itemCountGlobal = Util.GetItemCountGlobal(Items.RandomlyLunar.itemIndex, false, false); if (itemCountGlobal > 0 && rng.nextNormalizedFloat < 0.05f * (float)itemCountGlobal) { list = ((!flag) ? availableLunarEquipment : availableLunarEquipmentMoon); result = (EquipmentIndex)((list.Count <= 0) ? (-1) : ((int)rng.NextElementUniform<EquipmentIndex>(list))); } } return result; } private static void GiveMonsterEquipmentClassic(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallvirt<Inventory>(x, "AddItemsFrom") })) { EvolutionEquipment.Logger.LogError((object)"Failed to patch RoR2.Artifacts.MonsterTeamGainsItemsArtifactManager"); return; } val.Emit(OpCodes.Ldloc_0); val.EmitDelegate<Action<CharacterMaster>>((Action<CharacterMaster>)delegate(CharacterMaster master) { GiveMasterEquipment(master, MonsterTeamGainsItemsArtifactManager.monsterTeamInventory); }); } private static void GiveMonsterEquipmentSimulacrum(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallvirt<Inventory>(x, "AddItemsFrom") })) { EvolutionEquipment.Logger.LogError((object)"Failed to patch RoR2.InfiniteTowerWaveController.OnCombatSquadMemberDiscovered"); return; } val.Emit(OpCodes.Ldarg_0); val.Emit(OpCodes.Ldarg_1); val.EmitDelegate<Action<InfiniteTowerWaveController, CharacterMaster>>((Action<InfiniteTowerWaveController, CharacterMaster>)delegate(InfiniteTowerWaveController waveController, CharacterMaster master) { GiveMasterEquipment(master, waveController.enemyInventory); }); } private static void GiveMasterEquipment(CharacterMaster master, Inventory enemyInventory) { //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) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Invalid comparison between Unknown and I4 //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Invalid comparison between Unknown and I4 //IL_006a: Unknown result type (might be due to invalid IL or missing references) EquipmentIndex currentEquipmentIndex = enemyInventory.currentEquipmentIndex; if ((int)master.inventory.currentEquipmentIndex == -1 && (int)currentEquipmentIndex != -1 && (Object)(object)((Component)master).GetComponent<ScavengerItemGranter>() == (Object)null && master.inventory.GetItemCount(Items.GummyCloneIdentifier) == 0) { GivePickupsOnStart component = ((Component)master).GetComponent<GivePickupsOnStart>(); if ((Object)(object)component == (Object)null || (Object)(object)component.equipmentDef == (Object)null || string.IsNullOrEmpty(component.equipmentString)) { master.inventory.SetEquipmentIndex(currentEquipmentIndex); } } } } }