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 TTATweaks v1.1.0
TTATweaks.dll
Decompiled a day 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 EntityStates; using EntityStates.ArtifactShell; using HG; using IL.RoR2; using IL.RoR2.Items; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using MonoMod.RuntimeDetour.HookGen; using Newtonsoft.Json; using On.EntityStates.ArtifactShell; using On.RoR2; using R2API.Utils; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.Artifacts; using RoR2.Items; using TTATweaks.Tweaks; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TTATweaks")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+7446f2b9ac34a59aff285ee013e67ef66a29d9b5")] [assembly: AssemblyProduct("TTATweaks")] [assembly: AssemblyTitle("TTATweaks")] [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 TTATweaks { public class Assets { public static AssetBundle assetBundle; public static Sprite icon; public static void Init() { GetAssetBundle(); icon = assetBundle.LoadAsset<Sprite>("icon"); } private static void GetAssetBundle() { using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("TTATweaks.ttatweaks"); if (stream != null) { assetBundle = AssetBundle.LoadFromStream(stream); } } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } public class Options { private static bool? _rooEnabled; public static bool rooEnabled { get { if (!_rooEnabled.HasValue) { _rooEnabled = Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"); } return _rooEnabled.Value; } } public static ConfigEntry<bool> syncMinionItems { get; set; } public static ConfigEntry<bool> honorEliteMinions { get; set; } public static ConfigEntry<bool> honorEliteUrchins { get; set; } public static ConfigEntry<bool> honorEliteUmbras { get; set; } public static ConfigEntry<bool> honorElitePlayers { get; set; } public static ConfigEntry<bool> honorGildedAurelionite { get; set; } public static ConfigEntry<bool> honorGildedReliquary { get; set; } public static ConfigEntry<bool> minionEliteBuffs { get; set; } public static ConfigEntry<float> glacialSlowDurationMult { get; set; } public static ConfigEntry<bool> glacialExplosion { get; set; } public static ConfigEntry<string> blacklistJson { get; set; } public static ConfigEntry<string> allyAurelioniteItemsJson { get; set; } private static void BlacklistChanged() { try { Dictionary<string, string[]> jsonObject = JsonConvert.DeserializeObject<Dictionary<string, string[]>>("{" + blacklistJson.Value + "}"); SyncItems.blacklist = SyncItems.GenerateBlacklist(jsonObject); Log.Info("Blacklist valid!"); SyncItems.useCustomBlacklist = true; } catch (Exception ex) { if (ex is JsonReaderException || ex is JsonSerializationException) { Log.Warning("Blacklist currently invalid!"); } else { Log.Error(ex.ToString()); } SyncItems.useCustomBlacklist = false; } } private static void AllyAurelioniteItemsChanged() { try { Dictionary<string, int> jsonObject = JsonConvert.DeserializeObject<Dictionary<string, int>>("{" + allyAurelioniteItemsJson.Value + "}"); HonorTweaks.allyAurelioniteItems = HonorTweaks.GenerateAllyAurelioniteItems(jsonObject); Log.Info("Item list invalid!"); HonorTweaks.giveAurelioniteItems = true; } catch (Exception ex) { if (ex is JsonReaderException || ex is JsonSerializationException) { Log.Warning("Item list currently invalid!"); } else { Log.Error(ex.ToString()); } HonorTweaks.giveAurelioniteItems = false; } } public static void Init() { syncMinionItems = TTATweaks.config.Bind<bool>("General", "Sync Minion Items", true, "Whether or not minions share most of their owner's items (like Engi turrets)."); glacialSlowDurationMult = TTATweaks.config.Bind<float>("General", "Glacial Slow Duration Multiplier", 2f, "A multiplier for how long glacial elites inflict the slow debuff for. At a multiplier of 1, the slow lasts for 1.5s, scaled by proc coefficient."); glacialExplosion = TTATweaks.config.Bind<bool>("General", "Glacial Explosion", false, "Whether or not glacial elites should generate the freeze explosion on death."); honorEliteMinions = TTATweaks.config.Bind<bool>("Artifact of Honor", "Elite Minions", true, "Whether or not minions spawn as a tier 1 elite while the Artifact of Honor is active."); minionEliteBuffs = TTATweaks.config.Bind<bool>("Artifact of Honor", "Elite Minion Stat Buffs", true, "Whether or not minions spawning as a tier 1 elites also acquire the elite stat buff while the Artifact of Honor is active."); honorEliteUrchins = TTATweaks.config.Bind<bool>("Artifact of Honor", "Elite Urchins", true, "Whether or not malachite urchins spawn as a tier 1 elite while the Artifact of Honor is active."); honorEliteUmbras = TTATweaks.config.Bind<bool>("Artifact of Honor", "Elite Umbras", true, "Whether or not Artifact of Vengeance umbras are given a tier 1 elite equipment while the Artifact of Honor is active."); honorElitePlayers = TTATweaks.config.Bind<bool>("Artifact of Honor", "Elite Players", false, "Whether or not players start with a tier 1 elite equipment while the Artifact of Honor is active."); honorGildedAurelionite = TTATweaks.config.Bind<bool>("Artifact of Honor", "Gilded Aurelionite", true, "Whether or not ally Aurelionite spawns as a gilded elite while the Artifact of Honor is active."); honorGildedReliquary = TTATweaks.config.Bind<bool>("Artifact of Honor", "Gilded Artifact Reliquary", true, "Whether or not the Artifact Reliquary spawns as a gilded elite while the Artifact of Honor is active."); blacklistJson = TTATweaks.config.Bind<string>("General", "Minion Item Blacklist", "\"all\":[\"MinorConstructOnKill\", \"DroneWeapons\", \"RoboBallBuddy\", \"FocusConvergence\", \"TitanGoldDuringTP\", \"TPHealingNova\", \"VoidMegaCrabItem\", \"BeetleGland\", \"WardOnLevel\", \"PhysicsProjectile\", \"DronesDropDynamite\"]", "What items shouldn't be inherited by all or specific minions. Format example: `\"internal_enemy_name_1\":[\"internal_item_name_1\",\"internal_item_name_2\"], \"internal_enemy_name_2\":[\"internal_item_name_3\",\"internal_item_name_4\"]`"); blacklistJson.SettingChanged += delegate { BlacklistChanged(); AllyAurelioniteItemsChanged(); }; allyAurelioniteItemsJson = TTATweaks.config.Bind<string>("General", "Ally Aurelionite Items", "\"GoldOnHurt\": 1, \"BonusGoldPackOnKill\": 5, \"Knurl\": 1", "What items ally Aurelionite should spawn with. Format example: `\"item_1_name:\" item_1_count, \"item_2_name:\" item_2_count`.\n\nThe logic for finding items from names is copied from DebugToolkit - names are not strict, unlike with the minion item blacklist, and approximate names will work."); allyAurelioniteItemsJson.SettingChanged += delegate { AllyAurelioniteItemsChanged(); }; if (rooEnabled) { RoOInit(); } } private static void RoOInit() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Expected O, but got Unknown //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Expected O, but got Unknown //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Expected O, but got Unknown //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Expected O, but got Unknown //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Expected O, but got Unknown //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Expected O, but got Unknown //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Expected O, but got Unknown //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Expected O, but got Unknown //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Expected O, but got Unknown //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(syncMinionItems, new CheckBoxConfig())); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(glacialSlowDurationMult, new StepSliderConfig { min = 0f, max = 30f, increment = 1f })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(glacialExplosion, new CheckBoxConfig())); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(honorEliteMinions, new CheckBoxConfig())); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(minionEliteBuffs, new CheckBoxConfig())); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(honorEliteUrchins, new CheckBoxConfig())); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(honorEliteUmbras, new CheckBoxConfig())); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(honorElitePlayers, new CheckBoxConfig())); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(honorGildedAurelionite, new CheckBoxConfig())); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(honorGildedReliquary, new CheckBoxConfig())); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(blacklistJson, new InputFieldConfig())); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(allyAurelioniteItemsJson, new InputFieldConfig())); ModSettingsManager.SetModDescription("Various tweaks relating to elites, minions, and the Artifact of Honor."); ModSettingsManager.SetModIcon(Assets.icon); } public static void OnLoadFinished() { BlacklistChanged(); AllyAurelioniteItemsChanged(); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("mwmw.TTATweaks", "TTATweaks", "1.1.0")] public class TTATweaks : BaseUnityPlugin { public const string PluginGUID = "mwmw.TTATweaks"; public const string PluginAuthor = "mwmw"; public const string PluginName = "TTATweaks"; public const string PluginVersion = "1.1.0"; public static ConfigFile config; public static BaseUnityPlugin plugin; public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); config = ((BaseUnityPlugin)this).Config; plugin = (BaseUnityPlugin)(object)this; Assets.Init(); Options.Init(); HonorTweaks.Init(); SyncItems.Init(); RoR2Application.onLoadFinished = (Action)Delegate.Combine(RoR2Application.onLoadFinished, new Action(OnLoadFinished)); } private void OnLoadFinished() { Options.OnLoadFinished(); } } public static class Utils { private struct MatchSimilarity { public int similarity; public object item; } [CompilerGenerated] private sealed class <GetItemsFromPartial>d__2 : IEnumerable<ItemIndex>, IEnumerable, IEnumerator<ItemIndex>, IEnumerator, IDisposable { private int <>1__state; private ItemIndex <>2__current; private int <>l__initialThreadId; private string name; public string <>3__name; private int <i>5__1; private List<MatchSimilarity> <matches>5__2; private ItemIndex <index>5__3; private Enumerator<ItemDef> <>s__4; private ItemDef <item>5__5; private string <langInvar>5__6; private IEnumerator<MatchSimilarity> <>s__7; private MatchSimilarity <match>5__8; ItemIndex IEnumerator<ItemIndex>.Current { [DebuggerHidden] get { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return <>2__current; } } [DebuggerHidden] public <GetItemsFromPartial>d__2(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; if (num == -3 || num == 2) { try { } finally { <>m__Finally1(); } } <matches>5__2 = null; <>s__4 = default(Enumerator<ItemDef>); <item>5__5 = null; <langInvar>5__6 = null; <>s__7 = null; <match>5__8 = default(MatchSimilarity); <>1__state = -2; } private bool MoveNext() { //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) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: 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_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; if (TextSerialization.TryParseInvariant(name, ref <i>5__1)) { <index>5__3 = (ItemIndex)<i>5__1; if (ItemCatalog.IsIndexValid(ref <index>5__3)) { <>2__current = <index>5__3; <>1__state = 1; return true; } goto IL_0087; } name = name.ToUpperInvariant(); <matches>5__2 = new List<MatchSimilarity>(); <>s__4 = ItemCatalog.allItemDefs.GetEnumerator(); try { while (<>s__4.MoveNext()) { <item>5__5 = <>s__4.Current; <langInvar>5__6 = GetLangInvar(<item>5__5.nameToken).ToUpper(); if (((Object)<item>5__5).name.ToUpper().Contains(name) || <langInvar>5__6.Contains(name)) { <matches>5__2.Add(new MatchSimilarity { similarity = Math.Max(GetSimilarity(((Object)<item>5__5).name, name), GetSimilarity(<langInvar>5__6, name)), item = <item>5__5.itemIndex }); } <langInvar>5__6 = null; <item>5__5 = null; } } finally { ((IDisposable)<>s__4).Dispose(); } <>s__4 = default(Enumerator<ItemDef>); <>s__7 = <matches>5__2.OrderByDescending((MatchSimilarity m) => m.similarity).GetEnumerator(); <>1__state = -3; break; case 1: <>1__state = -1; goto IL_0087; case 2: { <>1__state = -3; <match>5__8 = default(MatchSimilarity); break; } IL_0087: return false; } if (<>s__7.MoveNext()) { <match>5__8 = <>s__7.Current; <>2__current = (ItemIndex)<match>5__8.item; <>1__state = 2; return true; } <>m__Finally1(); <>s__7 = null; return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>s__7 != null) { <>s__7.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<ItemIndex> IEnumerable<ItemIndex>.GetEnumerator() { <GetItemsFromPartial>d__2 <GetItemsFromPartial>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetItemsFromPartial>d__ = this; } else { <GetItemsFromPartial>d__ = new <GetItemsFromPartial>d__2(0); } <GetItemsFromPartial>d__.name = <>3__name; return <GetItemsFromPartial>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<ItemIndex>)this).GetEnumerator(); } } public static ItemIndex GetItemFromPartial(string name) { //IL_000d: 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: Unknown result type (might be due to invalid IL or missing references) return GetItemsFromPartial(name).DefaultIfEmpty((ItemIndex)(-1)).First(); } [IteratorStateMachine(typeof(<GetItemsFromPartial>d__2))] private static IEnumerable<ItemIndex> GetItemsFromPartial(string name) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetItemsFromPartial>d__2(-2) { <>3__name = name }; } private static string GetLangInvar(string baseToken) { if (baseToken == null) { return ""; } return RemoveSpacesAndAlike(Language.GetString(baseToken)); } private static int GetSimilarity(string s, string partial) { if (string.IsNullOrEmpty(partial) || !s.ToUpper().Contains(partial)) { return int.MinValue; } int num = (s.StartsWith(partial, StringComparison.InvariantCultureIgnoreCase) ? 1000 : 0); return num + partial.Length - s.Length; } private static string RemoveSpacesAndAlike(string input) { return Regex.Replace(input, "[ '(),-]|\\{\\d+\\}", string.Empty); } } } namespace TTATweaks.Tweaks { public class HonorTweaks { [CompilerGenerated] private static class <>O { public static Action<ILContext> <0>__DoppelgangersSpawnElite; public static Action<ILContext> <1>__AllyAurelioniteTweaks; public static Action<CharacterBody> <2>__MinionsSpawnElite; public static Manipulator <3>__UrchinsSpawnElite; public static Manipulator <4>__AdjustGlacialSlow; public static Manipulator <5>__SkipGlacialExplosion; public static Action<Run> <6>__PlayersSpawnElite; public static hook_OnEnter <7>__ArtifactReliquarySpawnsGilded; } public static bool giveAurelioniteItems; public static Dictionary<string, int> allyAurelioniteItems; public const string defaultAllyAurelioniteItemsString = "\"GoldOnHurt\": 1, \"BonusGoldPackOnKill\": 5, \"Knurl\": 1"; private static Xoroshiro128Plus rng; public static void Init() { //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Expected O, but got Unknown //IL_00d8: 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_00e3: Expected O, but got Unknown //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Expected O, but got Unknown //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Expected O, but got Unknown //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Expected O, but got Unknown BindingFlags bindingAttr = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; MethodInfo methodCached = Reflection.GetMethodCached(typeof(DoppelgangerInvasionManager).GetNestedTypes(bindingAttr)[0], "<CreateDoppelganger>b__0"); HookEndpointManager.Modify((MethodBase)methodCached, (Delegate)new Action<ILContext>(DoppelgangersSpawnElite)); MethodInfo method = typeof(GoldTitanManager).GetNestedType("<>c__DisplayClass24_0", bindingAttr).GetMethod("<TryStartChannelingTitansServer>g__OnSpawnedServer|0", bindingAttr); HookEndpointManager.Modify((MethodBase)method, (Delegate)new Action<ILContext>(AllyAurelioniteTweaks)); CharacterBody.onBodyStartGlobal += MinionsSpawnElite; object obj = <>O.<3>__UrchinsSpawnElite; if (obj == null) { Manipulator val = UrchinsSpawnElite; <>O.<3>__UrchinsSpawnElite = val; obj = (object)val; } GlobalEventManager.OnCharacterDeath += (Manipulator)obj; object obj2 = <>O.<4>__AdjustGlacialSlow; if (obj2 == null) { Manipulator val2 = AdjustGlacialSlow; <>O.<4>__AdjustGlacialSlow = val2; obj2 = (object)val2; } GlobalEventManager.ProcessHitEnemy += (Manipulator)obj2; object obj3 = <>O.<5>__SkipGlacialExplosion; if (obj3 == null) { Manipulator val3 = SkipGlacialExplosion; <>O.<5>__SkipGlacialExplosion = val3; obj3 = (object)val3; } GlobalEventManager.OnCharacterDeath += (Manipulator)obj3; Run.onRunStartGlobal += PlayersSpawnElite; object obj4 = <>O.<7>__ArtifactReliquarySpawnsGilded; if (obj4 == null) { hook_OnEnter val4 = ArtifactReliquarySpawnsGilded; <>O.<7>__ArtifactReliquarySpawnsGilded = val4; obj4 = (object)val4; } WaitForKey.OnEnter += (hook_OnEnter)obj4; rng = new Xoroshiro128Plus(RoR2Application.rng.nextUlong); } public static Dictionary<string, int> GenerateAllyAurelioniteItems(Dictionary<string, int> jsonObject) { Dictionary<string, int> dictionary = new Dictionary<string, int>(); foreach (KeyValuePair<string, int> item in jsonObject) { dictionary[item.Key] = item.Value; } return dictionary; } private static void AdjustGlacialSlow(ILContext il) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown Func<int, int> func = (int hasBuff) => (hasBuff > 0) ? ((int)Options.glacialSlowDurationMult.Value * hasBuff) : 0; ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Buffs), "AffixWhite") }) && val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 1) })) { val.EmitDelegate<Func<int, int>>(func); } else { Log.Error("DoubleGlacialSlow IL hook failed! Glacial elite slow duration is unchanged."); } } private static void SkipGlacialExplosion(ILContext il) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown Func<bool, bool> func = (bool hasGlacial) => hasGlacial && Options.glacialExplosion.Value; ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Buffs), "AffixWhite") }) && val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<CharacterBody>(x, "HasBuff") })) { val.EmitDelegate<Func<bool, bool>>(func); } else { Log.Error("SkipGlacialExplosion IL hook failed! Glacial elite explosion behaviour will always occur."); } } private static void ArtifactReliquarySpawnsGilded(orig_OnEnter orig, WaitForKey self) { //IL_0055: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (NetworkServer.active && ((EntityState)self).healthComponent.combinedHealthFraction >= 1f && CombatDirector.IsEliteOnlyArtifactActive() && Options.honorGildedReliquary.Value) { ((EntityState)self).characterBody.master.inventory.SetEquipmentIndex(Elites.AurelioniteHonor.eliteEquipmentDef.equipmentIndex, true); } } private static void AllyAurelioniteTweaks(ILContext il) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) Action<SpawnResult> action = delegate(SpawnResult result) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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_008d: Invalid comparison between Unknown and I4 //IL_00c2: Unknown result type (might be due to invalid IL or missing references) GameObject spawnedInstance = result.spawnedInstance; CharacterMaster val2 = ((spawnedInstance != null) ? spawnedInstance.GetComponent<CharacterMaster>() : null); if (val2 != null) { if (CombatDirector.IsEliteOnlyArtifactActive() && Options.honorGildedAurelionite.Value) { val2.inventory.SetEquipmentIndex(Elites.AurelioniteHonor.eliteEquipmentDef.equipmentIndex, true); } if (giveAurelioniteItems) { foreach (string key in allyAurelioniteItems.Keys) { ItemIndex itemFromPartial = Utils.GetItemFromPartial(key); if ((int)itemFromPartial != -1) { Log.Info($"Giving {key}x{allyAurelioniteItems[key]} to Aurelionite"); val2.inventory.GiveItemPermanent(itemFromPartial, allyAurelioniteItems[key]); } else { Log.Warning("Couldn't find an item from item name '" + key + "'!"); } } } } }; Type displayClass = typeof(GoldTitanManager).GetNestedType("<>c__DisplayClass24_0", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdfld(x, displayClass, "currentBoostHpCoefficient") })) { val.Emit(OpCodes.Ldc_R4, 3.5f); val.Emit(OpCodes.Mul); if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdfld(x, displayClass, "currentBoostDamageCoefficient") })) { val.Emit(OpCodes.Ldc_R4, 2f); val.Emit(OpCodes.Mul); val.Emit(OpCodes.Ldarg_1); val.EmitDelegate<Action<SpawnResult>>(action); } else { Log.Error("Part 2 of AurelioniteSpawnsGilded IL hook failed! Aurelionite will not correctly spawn as gilded in Artifact of Honor."); } } else { Log.Error("Part 1 of AurelioniteSpawnsGilded IL hook failed! Aurelionite will not correctly spawn as gilded in Artifact of Honor."); } } private static void PlayersSpawnElite(Run run) { //IL_0074: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { return; } foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { object obj; if (instance == null) { obj = null; } else { CharacterMaster master = instance.master; obj = ((master != null) ? master.inventory : null); } Inventory val = (Inventory)obj; if (val != null && CombatDirector.IsEliteOnlyArtifactActive() && Options.honorElitePlayers.Value) { EliteDef randomAvailableT1EliteDefUnconditional = GetRandomAvailableT1EliteDefUnconditional(rng); val.SetEquipmentIndex(randomAvailableT1EliteDefUnconditional.eliteEquipmentDef.equipmentIndex, true); } } } private static void DoppelgangersSpawnElite(ILContext il) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) Action<SpawnResult> action = delegate(SpawnResult result) { //IL_0001: 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) GameObject spawnedInstance = result.spawnedInstance; CharacterMaster val2 = ((spawnedInstance != null) ? spawnedInstance.GetComponent<CharacterMaster>() : null); if (val2 != null && CombatDirector.IsEliteOnlyArtifactActive() && Options.honorEliteUmbras.Value) { EliteDef randomAvailableT1EliteDef = GetRandomAvailableT1EliteDef(rng); val2.inventory.SetEquipmentIndex(randomAvailableT1EliteDef.eliteEquipmentDef.equipmentIndex, true); } }; ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<CombatSquad>(x, "AddMember") })) { val.Emit(OpCodes.Ldarg_1); val.EmitDelegate<Action<SpawnResult>>(action); } else { Log.Error("DoppelgangersSpawnElite IL hook failed! Vengeance doppelgangers will be unchanged in Artifact of Honor."); } } private static void MinionsSpawnElite(CharacterBody body) { //IL_0098: Unknown result type (might be due to invalid IL or missing references) if (!Options.honorEliteMinions.Value || !NetworkServer.active || !CombatDirector.IsEliteOnlyArtifactActive() || !Object.op_Implicit((Object)(object)body) || !(((Object)((Component)body).gameObject).name != "EquipmentDroneBody(Clone)")) { return; } CharacterMaster master = body.master; MinionOwnership val = ((master != null) ? ((Component)master).GetComponent<MinionOwnership>() : null); if ((Object)(object)val != (Object)null && !body.isElite && (Object)(object)val.ownerMaster != (Object)null) { EliteDef randomAvailableT1HonorEliteDef = GetRandomAvailableT1HonorEliteDef(rng); master.inventory.SetEquipmentIndex(randomAvailableT1HonorEliteDef.eliteEquipmentDef.equipmentIndex, false); if (Options.minionEliteBuffs.Value) { master.inventory.GiveItemPermanent(Items.BoostHp, Mathf.RoundToInt((randomAvailableT1HonorEliteDef.healthBoostCoefficient - 1f) * 10f)); master.inventory.GiveItemPermanent(Items.BoostDamage, Mathf.RoundToInt(randomAvailableT1HonorEliteDef.damageBoostCoefficient - 1f) * 10); } } } private static void UrchinsSpawnElite(ILContext il) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown //IL_00ba: Unknown result type (might be due to invalid IL or missing references) Action<CharacterMaster> action = delegate(CharacterMaster master) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)master) && CombatDirector.IsEliteOnlyArtifactActive() && Options.honorEliteUrchins.Value) { EliteDef randomAvailableT1HonorEliteDef = GetRandomAvailableT1HonorEliteDef(rng); master.inventory.SetEquipmentIndex(randomAvailableT1HonorEliteDef.eliteEquipmentDef.equipmentIndex, false); master.inventory.GiveItemPermanent(Items.BoostHp, Mathf.RoundToInt((randomAvailableT1HonorEliteDef.healthBoostCoefficient - 1f) * 10f)); master.inventory.GiveItemPermanent(Items.BoostDamage, Mathf.RoundToInt(randomAvailableT1HonorEliteDef.damageBoostCoefficient - 1f) * 10); } }; int characterMasterLoc = 0; ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdstr(x, "Prefabs/CharacterMasters/UrchinTurretMaster") }) && val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<GameObject>(x, "GetComponent") }) && val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref characterMasterLoc) })) { val.Emit(OpCodes.Ldloc, characterMasterLoc); val.EmitDelegate<Action<CharacterMaster>>(action); } else { Log.Error("UrchinsSpawnElite IL hook failed! Malachite urchins will be unchanged in Artifact of Honor."); } } private static EliteDef GetRandomAvailableT1EliteDef(Xoroshiro128Plus rng) { EliteTierDef val = ((Run.instance.stageClearCount >= 2) ? CombatDirector.eliteTiers[4] : CombatDirector.eliteTiers[1]); return val.GetRandomAvailableEliteDef(rng); } private static EliteDef GetRandomAvailableT1EliteDefUnconditional(Xoroshiro128Plus rng) { return CombatDirector.eliteTiers[4].GetRandomAvailableEliteDef(rng); } private static EliteDef GetRandomAvailableT1HonorEliteDef(Xoroshiro128Plus rng) { EliteTierDef val = ((Run.instance.stageClearCount >= 2) ? CombatDirector.eliteTiers[3] : CombatDirector.eliteTiers[2]); return val.GetRandomAvailableEliteDef(rng); } } public static class SyncItems { private class MirrorSource : MonoBehaviour { public event Action<ItemIndex, int> onItemGiven; public event Action<EquipmentState> onEquipmentGiven; public void InvokeItemGivenEvent(ItemIndex item, int count) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) this.onItemGiven?.Invoke(item, count); } public void InvokeEquipGivenEvent(EquipmentState equipmentState) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) this.onEquipmentGiven?.Invoke(equipmentState); } } private class MirrorLink : MonoBehaviour { private MirrorSource mirrorSource; private Inventory droneInventory; public void Init(MirrorSource mirrorSource, Inventory droneInventory) { this.droneInventory = droneInventory; this.mirrorSource = mirrorSource; if (Object.op_Implicit((Object)(object)mirrorSource)) { mirrorSource.onItemGiven += OnOwnerGetItem; mirrorSource.onEquipmentGiven += OnOwnerGetEquip; } } private void OnOwnerGetItem(ItemIndex item, int amount) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active && Object.op_Implicit((Object)(object)mirrorSource) && Object.op_Implicit((Object)(object)droneInventory)) { droneInventory.ChangeItemStacksCount<GiveItemPermanentImpl>(new GiveItemPermanentImpl { inventory = droneInventory }, item, ItemFilter(item, ((Object)droneInventory).name) ? amount : 0); } } private void OnOwnerGetEquip(EquipmentState equipmentState) { if (NetworkServer.active && Object.op_Implicit((Object)(object)mirrorSource) && Object.op_Implicit((Object)(object)droneInventory)) { SetToOwnerEquip(((Component)mirrorSource).GetComponent<Inventory>(), droneInventory); } } private void OnDestroy() { if (Object.op_Implicit((Object)(object)mirrorSource)) { mirrorSource.onItemGiven -= OnOwnerGetItem; } } } [CompilerGenerated] private static class <>O { public static Action<CharacterMaster> <0>__LinkAllies; public static hook_Add <1>__FireItemGetEvent; public static hook_SetEquipmentInternal_EquipmentState_uint_uint <2>__FireEquipmentGetEvent; public static hook_UpdateMinionInventory <3>__AddDevotionInventoryBack; public static Manipulator <4>__SkipFriendUnitItemUpdate; public static Func<ItemIndex, string, bool> <5>__ItemFilter; } [CompilerGenerated] private sealed class <DeferredLink>d__10 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public CharacterMaster master; private CharacterMaster <ownerMaster>5__1; private Inventory <ownerInventory>5__2; private Inventory <droneInventory>5__3; private MirrorSource <mirrorSource>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DeferredLink>d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <ownerMaster>5__1 = null; <ownerInventory>5__2 = null; <droneInventory>5__3 = null; <mirrorSource>5__4 = null; <>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; CharacterMaster obj = master; object obj2; if (obj == null) { obj2 = null; } else { MinionOwnership component = ((Component)obj).GetComponent<MinionOwnership>(); obj2 = ((component != null) ? component.ownerMaster : null); } <ownerMaster>5__1 = (CharacterMaster)obj2; CharacterMaster obj3 = <ownerMaster>5__1; <ownerInventory>5__2 = ((obj3 != null) ? obj3.inventory : null); <droneInventory>5__3 = master.inventory; if ((Object)(object)<ownerInventory>5__2 == (Object)null || (Object)(object)<droneInventory>5__3 == (Object)null) { return false; } Inventory obj4 = <ownerInventory>5__2; <mirrorSource>5__4 = ((obj4 != null) ? ((Component)obj4).GetComponent<MirrorSource>() : null); if ((Object)(object)<mirrorSource>5__4 == (Object)null) { <mirrorSource>5__4 = ((Component)<ownerInventory>5__2).gameObject.AddComponent<MirrorSource>(); } ((Component)master).gameObject.AddComponent<MirrorLink>().Init(<mirrorSource>5__4, <droneInventory>5__3); if (!((Object)((Component)master).gameObject).name.Contains("EngiTurret")) { AddFullOwnerInventory(<ownerInventory>5__2, <droneInventory>5__3); } 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(); } } public static Dictionary<string, HashSet<string>> blacklist; public static Dictionary<string, HashSet<string>> defaultBlacklist; public const string defaultBlacklistString = "\"all\":[\"MinorConstructOnKill\", \"DroneWeapons\", \"RoboBallBuddy\", \"FocusConvergence\", \"TitanGoldDuringTP\", \"TPHealingNova\", \"VoidMegaCrabItem\", \"BeetleGland\", \"WardOnLevel\", \"PhysicsProjectile\", \"DronesDropDynamite\"]"; public static bool useCustomBlacklist; private const BindingFlags allFlags = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; public static void Init() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //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_005e: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown //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_00a0: Expected O, but got Unknown CharacterMaster.onStartGlobal += LinkAllies; object obj = <>O.<1>__FireItemGetEvent; if (obj == null) { hook_Add val = FireItemGetEvent; <>O.<1>__FireItemGetEvent = val; obj = (object)val; } GiveItemPermanentImpl.Add += (hook_Add)obj; object obj2 = <>O.<2>__FireEquipmentGetEvent; if (obj2 == null) { hook_SetEquipmentInternal_EquipmentState_uint_uint val2 = FireEquipmentGetEvent; <>O.<2>__FireEquipmentGetEvent = val2; obj2 = (object)val2; } Inventory.SetEquipmentInternal_EquipmentState_uint_uint += (hook_SetEquipmentInternal_EquipmentState_uint_uint)obj2; object obj3 = <>O.<3>__AddDevotionInventoryBack; if (obj3 == null) { hook_UpdateMinionInventory val3 = AddDevotionInventoryBack; <>O.<3>__AddDevotionInventoryBack = val3; obj3 = (object)val3; } DevotionInventoryController.UpdateMinionInventory += (hook_UpdateMinionInventory)obj3; object obj4 = <>O.<4>__SkipFriendUnitItemUpdate; if (obj4 == null) { Manipulator val4 = SkipFriendUnitItemUpdate; <>O.<4>__SkipFriendUnitItemUpdate = val4; obj4 = (object)val4; } PhysicsProjectileBehavior.UpdateFriendUnitMovementItems += (Manipulator)obj4; defaultBlacklist = GenerateBlacklist(JsonConvert.DeserializeObject<Dictionary<string, string[]>>("{\"all\":[\"MinorConstructOnKill\", \"DroneWeapons\", \"RoboBallBuddy\", \"FocusConvergence\", \"TitanGoldDuringTP\", \"TPHealingNova\", \"VoidMegaCrabItem\", \"BeetleGland\", \"WardOnLevel\", \"PhysicsProjectile\", \"DronesDropDynamite\"]}")); } public static Dictionary<string, HashSet<string>> GenerateBlacklist(Dictionary<string, string[]> jsonObject) { Dictionary<string, HashSet<string>> dictionary = new Dictionary<string, HashSet<string>>(); foreach (KeyValuePair<string, string[]> item in jsonObject) { dictionary[item.Key] = new HashSet<string>(item.Value); } return dictionary; } private static void LinkAllies(CharacterMaster master) { if (NetworkServer.active && Options.syncMinionItems.Value && NetworkServer.active && Object.op_Implicit((Object)(object)master) && Object.op_Implicit((Object)(object)master.inventory)) { MinionOwnership component = ((Component)master).GetComponent<MinionOwnership>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.ownerMaster) && (Object)(object)component.ownerMaster.playerCharacterMasterController != (Object)null && !Object.op_Implicit((Object)(object)((Component)master).GetComponent<MirrorLink>())) { ((MonoBehaviour)TTATweaks.plugin).StartCoroutine(DeferredLink(master)); } } } [IteratorStateMachine(typeof(<DeferredLink>d__10))] private static IEnumerator DeferredLink(CharacterMaster master) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DeferredLink>d__10(0) { master = master }; } private static void FireItemGetEvent(orig_Add orig, ref GiveItemPermanentImpl self, ItemIndex itemIndex, int countToAdd) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(ref self, itemIndex, countToAdd); MirrorSource component = ((Component)self.inventory).GetComponent<MirrorSource>(); if (Object.op_Implicit((Object)(object)component)) { component.InvokeItemGivenEvent(itemIndex, countToAdd); } } private static bool FireEquipmentGetEvent(orig_SetEquipmentInternal_EquipmentState_uint_uint orig, Inventory self, EquipmentState equipmentState, uint slot, uint set) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) bool result = orig.Invoke(self, equipmentState, slot, set); MirrorSource component = ((Component)self).GetComponent<MirrorSource>(); if (Object.op_Implicit((Object)(object)component)) { component.InvokeEquipGivenEvent(equipmentState); } return result; } private static void AddDevotionInventoryBack(orig_UpdateMinionInventory orig, DevotionInventoryController self, DevotedLemurianController devotedLemurianController, bool shouldEvolve) { orig.Invoke(self, devotedLemurianController, shouldEvolve); MirrorLink component = ((Component)devotedLemurianController).GetComponent<MirrorLink>(); CharacterMaster lemurianMaster = devotedLemurianController._lemurianMaster; object obj; if (lemurianMaster == null) { obj = null; } else { MinionOwnership minionOwnership = lemurianMaster.minionOwnership; if (minionOwnership == null) { obj = null; } else { CharacterMaster ownerMaster = minionOwnership.ownerMaster; obj = ((ownerMaster != null) ? ownerMaster.inventory : null); } } Inventory ownerInventory = (Inventory)obj; if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)devotedLemurianController.LemurianInventory)) { AddFullOwnerInventory(ownerInventory, devotedLemurianController.LemurianInventory); } } private static void SkipFriendUnitItemUpdate(ILContext il) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_006c: Unknown result type (might be due to invalid IL or missing references) Func<bool> func = () => Options.syncMinionItems.Value; ILCursor val = new ILCursor(il); ILLabel val2 = val.DefineLabel(); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0) })) { val.EmitDelegate<Func<bool>>(func); val.Emit(OpCodes.Brtrue, (object)val2); if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<PhysicsProjectileBehavior>(x, "UpdateFriendUnit") })) { val.MarkLabel(val2); } } } private static void AddFullOwnerInventory(Inventory ownerInventory, Inventory minionInventory) { SetToOwnerEquip(ownerInventory, minionInventory); minionInventory.AddItemsFrom(ownerInventory, ItemFilter); } private static void SetToOwnerEquip(Inventory ownerInventory, Inventory minionInventory) { if (Object.op_Implicit((Object)(object)ownerInventory) && Object.op_Implicit((Object)(object)minionInventory) && !CombatDirector.IsEliteOnlyArtifactActive() && ((Object)((Component)minionInventory).gameObject).name != "EquipmentDroneMaster(Clone)") { minionInventory.CopyEquipmentFrom(ownerInventory, true); } } public static void AddItemsFrom(this Inventory owner, Inventory other, Func<ItemIndex, string, bool> bodyFilter) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_004f: 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_0063: 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_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogWarning((object)"[Server] function 'System.Void RoR2.Inventory::AddItemsFrom(RoR2.Inventory,System.Func`2<RoR2.ItemIndex,System.Boolean>)' called on client"); return; } InventoryChangeScope val = default(InventoryChangeScope); ((InventoryChangeScope)(ref val))..ctor(owner); try { List<ItemIndex> list = default(List<ItemIndex>); DisposableRental<ItemIndex, List<ItemIndex>> val2 = CollectionPool<ItemIndex, List<ItemIndex>>.RentCollection(ref list); try { ((ItemCollection)(ref other.permanentItemStacks)).GetNonZeroIndices(list); foreach (ItemIndex item in list) { owner.ChangeItemStacksCount<GiveItemPermanentImpl>(new GiveItemPermanentImpl { inventory = owner }, item, bodyFilter(item, ((Object)owner).name) ? ((ItemCollection)(ref other.permanentItemStacks)).GetStackValue(item) : 0); } } finally { val2.Dispose(); } } finally { ((InventoryChangeScope)(ref val)).Dispose(); } } public static bool ItemFilter(ItemIndex itemIndex, string masterName) { //IL_00b0: 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_007f: Unknown result type (might be due to invalid IL or missing references) if (masterName.EndsWith("Master(Clone)")) { masterName = masterName.Substring(0, masterName.Length - "Master(Clone)".Length); } if (useCustomBlacklist) { if (blacklist.TryGetValue("all", out var value) && value.Contains(((Object)ItemCatalog.GetItemDef(itemIndex)).name)) { return false; } if (blacklist.TryGetValue(masterName, out value) && value.Contains(((Object)ItemCatalog.GetItemDef(itemIndex)).name)) { return false; } return true; } return !defaultBlacklist["all"].Contains(((Object)ItemCatalog.GetItemDef(itemIndex)).name); } } }