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 ItemMultiplier v1.0.4
plugins/ItemMultiplier.dll
Decompiled 5 hours agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates.Missions.BrotherEncounter; using Microsoft.CodeAnalysis; using On.EntityStates.Missions.BrotherEncounter; using On.RoR2; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 ItemMultiplier { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("HIFU.ItemMultiplier", "ItemMultiplier", "1.0.3")] public class Main : BaseUnityPlugin { [CompilerGenerated] private sealed class <FixMithrixItems>d__25 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Main <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <FixMithrixItems>d__25(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //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_00ab: 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_00f6: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; Main main = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; case 1: <>1__state = -1; if (multiplier.Value <= 1) { return false; } foreach (CharacterBody readOnlyInstances in CharacterBody.readOnlyInstancesList) { if ((Object)(object)readOnlyInstances == (Object)null) { continue; } Inventory inventory = readOnlyInstances.inventory; if ((Object)(object)inventory == (Object)null || !readOnlyInstances.isPlayerControlled) { continue; } foreach (ItemIndex item in inventory.itemAcquisitionOrder) { int itemCountPermanent = inventory.GetItemCountPermanent(item); if (itemCountPermanent <= 0) { continue; } ItemDef itemDef = ItemCatalog.GetItemDef(item); if (!((Object)(object)itemDef == (Object)null) && main.ShouldMultiply(itemDef)) { int num2 = itemCountPermanent - Mathf.CeilToInt((float)itemCountPermanent / (float)multiplier.Value); if (num2 > 0) { inventory.RemoveItemPermanent(item, num2); } } } } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <GiveGradually>d__17 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Inventory inventory; public int total; public Main <>4__this; public ItemIndex itemIndex; private int <batchSize>5__2; private int <given>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GiveGradually>d__17(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0069: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; Main main = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <batchSize>5__2 = 50; <given>5__3 = 0; break; case 1: <>1__state = -1; break; } if (<given>5__3 < total) { if ((Object)(object)inventory == (Object)null) { return false; } int num2 = Mathf.Min(<batchSize>5__2, total - <given>5__3); main._givingBonus = true; inventory.GiveItemPermanent(itemIndex, num2); main._givingBonus = false; <given>5__3 += num2; <>2__current = null; <>1__state = 1; return true; } 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 const string PluginGUID = "HIFU.ItemMultiplier"; public const string PluginAuthor = "HIFU"; public const string PluginName = "ItemMultiplier"; public const string PluginVersion = "1.0.3"; internal static ManualLogSource? Log; public static ConfigEntry<int>? multiplier; public static ConfigEntry<bool>? fixScrappers; public static ConfigEntry<bool>? fixCauldrons; public static ConfigEntry<bool>? fixMithrix; public static ConfigEntry<bool>? multiplyRemoval; private bool _givingBonus; private bool _removingBonus; private void Awake() { Log = ((BaseUnityPlugin)this).Logger; BindConfig(); if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions")) { RegisterRiskOfOptions(); } HookEvents(); Log.LogInfo((object)"ItemMultiplier v1.0.3 loaded!"); } private void BindConfig() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown multiplier = ((BaseUnityPlugin)this).Config.Bind<int>("General", "Multiplier", 10, new ConfigDescription("How many copies of each item you receive on pickup.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 1000), Array.Empty<object>())); multiplyRemoval = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Multiply Removal", true, "When true, item removals (scrapper, printer) are also multiplied."); fixScrappers = ((BaseUnityPlugin)this).Config.Bind<bool>("Fixes", "Fix Scrappers", true, "Prevents the scrapper from consuming more than one item at a time."); fixCauldrons = ((BaseUnityPlugin)this).Config.Bind<bool>("Fixes", "Fix Cauldrons", true, "Corrects the cost display on cauldrons/printers to show x1 instead of the multiplied amount."); fixMithrix = ((BaseUnityPlugin)this).Config.Bind<bool>("Fixes", "Fix Mithrix", true, "Prevents Mithrix Phase 4 from giving back multiplied stolen items."); } private void RegisterRiskOfOptions() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //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_005f: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown //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_00bc: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Expected O, but got Unknown ModSettingsManager.SetModDescription("Multiplies all item gains. Configure the multiplier and various fixes.", "HIFU.ItemMultiplier", "ItemMultiplier"); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(multiplier, new IntSliderConfig { description = "How many copies of each item you receive per pickup.", min = 1, max = 1000 })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(multiplyRemoval, new CheckBoxConfig { description = "Also multiply item removals (scrapper, printer input)." })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(fixScrappers, new CheckBoxConfig { description = "Fix scrappers so they only consume one item." })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(fixCauldrons, new CheckBoxConfig { description = "Fix cauldron/printer cost display." })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(fixMithrix, new CheckBoxConfig { description = "Prevent Mithrix Phase 4 from returning multiplied items." })); } private void HookEvents() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown Inventory.GiveItem_ItemIndex_int += new hook_GiveItem_ItemIndex_int(OnGiveItem); Inventory.RemoveItem_ItemIndex_int += new hook_RemoveItem_ItemIndex_int(OnRemoveItem); PurchaseInteraction.CanBeAffordedByInteractor += new hook_CanBeAffordedByInteractor(OnCanBeAfforded); CostHologramContent.FixedUpdate += new hook_FixedUpdate(OnCostHologramFixedUpdate); PurchaseInteraction.GetContextString += new hook_GetContextString(OnGetContextString); BossDeath.OnEnter += new hook_OnEnter(OnBossDeathEnter); Run.Start += new hook_Start(OnRunStart); Run.BeginStage += new hook_BeginStage(OnBeginStage); } private void OnGiveItem(orig_GiveItem_ItemIndex_int orig, Inventory self, ItemIndex itemIndex, int count) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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) orig.Invoke(self, itemIndex, count); if (_givingBonus || !NetworkServer.active) { return; } ItemDef itemDef = ItemCatalog.GetItemDef(itemIndex); if ((Object)(object)itemDef == (Object)null || !ShouldMultiply(itemDef)) { return; } int num = (multiplier.Value - 1) * count; if (num <= 0) { return; } _givingBonus = true; try { ((MonoBehaviour)this).StartCoroutine(GiveGradually(self, itemIndex, num)); } finally { _givingBonus = false; } } [IteratorStateMachine(typeof(<GiveGradually>d__17))] private IEnumerator GiveGradually(Inventory inventory, ItemIndex itemIndex, int total) { //IL_0015: 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) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GiveGradually>d__17(0) { <>4__this = this, inventory = inventory, itemIndex = itemIndex, total = total }; } private bool ShouldMultiply(ItemDef item) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)item.tier == 5) { return false; } if (item.hidden) { return false; } return true; } private void OnRemoveItem(orig_RemoveItem_ItemIndex_int orig, Inventory self, ItemIndex itemIndex, int count) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) if (_removingBonus) { orig.Invoke(self, itemIndex, count); return; } if (!NetworkServer.active) { orig.Invoke(self, itemIndex, count); return; } if (fixScrappers.Value && count > 1) { _removingBonus = true; try { orig.Invoke(self, itemIndex, 1); return; } finally { _removingBonus = false; } } orig.Invoke(self, itemIndex, count); } private bool OnCanBeAfforded(orig_CanBeAffordedByInteractor orig, PurchaseInteraction self, Interactor activator) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (!fixCauldrons.Value) { return orig.Invoke(self, activator); } int cost = self.cost; if (IsItemCost(self.costType) && multiplier.Value > 1) { self.cost = Mathf.Max(1, cost / multiplier.Value); } bool result = orig.Invoke(self, activator); self.cost = cost; return result; } private void OnCostHologramFixedUpdate(orig_FixedUpdate orig, CostHologramContent self) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) if (!fixCauldrons.Value) { orig.Invoke(self); return; } PurchaseInteraction componentInParent = ((Component)self).GetComponentInParent<PurchaseInteraction>(); if ((Object)(object)componentInParent != (Object)null && IsItemCost(componentInParent.costType) && multiplier.Value > 1) { int cost = componentInParent.cost; componentInParent.cost = Mathf.Max(1, cost / multiplier.Value); orig.Invoke(self); componentInParent.cost = cost; } else { orig.Invoke(self); } } private string OnGetContextString(orig_GetContextString orig, PurchaseInteraction self, Interactor activator) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (!fixCauldrons.Value) { return orig.Invoke(self, activator); } int cost = self.cost; if (IsItemCost(self.costType) && multiplier.Value > 1) { self.cost = Mathf.Max(1, cost / multiplier.Value); } string result = orig.Invoke(self, activator); self.cost = cost; return result; } private static bool IsItemCost(CostTypeIndex costType) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Invalid comparison between Unknown and I4 //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 if ((int)costType != 0 && (int)costType != 1 && (int)costType != 2 && (int)costType != 3) { return (int)costType != 14; } return false; } private void OnBossDeathEnter(orig_OnEnter orig, BossDeath self) { orig.Invoke(self); if (fixMithrix.Value && NetworkServer.active) { ((MonoBehaviour)this).StartCoroutine(FixMithrixItems()); } } [IteratorStateMachine(typeof(<FixMithrixItems>d__25))] private IEnumerator FixMithrixItems() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <FixMithrixItems>d__25(0) { <>4__this = this }; } private void OnRunStart(orig_Start orig, Run self) { orig.Invoke(self); } private void OnBeginStage(orig_BeginStage orig, Run self) { orig.Invoke(self); } } }