Decompiled source of ConfigurableBenthic v1.1.0

plugins/ConfigurableBenthic.dll

Decompiled a month ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using BepInEx;
using On.RoR2;
using R2API;
using RoR2;
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 = "")]
[assembly: AssemblyCompany("ConfigurableBenthic")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ConfigurableBenthic")]
[assembly: AssemblyTitle("ConfigurableBenthic")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ConfigurableBenthic;

public enum OverspillBonus
{
	None,
	PlusOne,
	Duplicate
}
public enum SelectMethod
{
	Random,
	LeastStacks,
	MostStacks
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.kking117.ConfigurableBenthic", "ConfigurableBenthic", "1.1.0")]
public class MainPlugin : BaseUnityPlugin
{
	public const string MODUID = "com.kking117.ConfigurableBenthic";

	public const string MODNAME = "ConfigurableBenthic";

	public const string MODTOKEN = "KKING117_CONFIGBENTHIC_";

	public const string MODVERSION = "1.1.0";

	public static int Config_BaseCount = 3;

	public static int Config_StackCount = 3;

	public static string Config_BlackList = "";

	public static bool Config_WholeStack = true;

	public static SelectMethod Config_Select_Method = SelectMethod.Random;

	public static bool Config_Select_PreferScrap = false;

	public static bool Config_Select_AllowVoid = false;

	public static bool Config_Select_AllowSelf = true;

	public static bool Config_RefreshOnUpgrade;

	public static bool Config_Overspill_Enable = false;

	public static OverspillBonus Config_Overspill_Bonus = OverspillBonus.PlusOne;

	private static bool NewDesc = false;

	public static List<ItemDef> BanList;

	private void Awake()
	{
		ReadConfig();
		if (Config_BaseCount != 3 || Config_StackCount != 3)
		{
			UpdateText();
		}
		Hooks();
	}

	private static void Hooks()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Expected O, but got Unknown
		ItemCatalog.Init += new hook_Init(ItemCatalog_Init);
		CharacterMaster.TryCloverVoidUpgrades += new hook_TryCloverVoidUpgrades(CloverVoidUpgrade);
	}

	private static void UpdateText()
	{
		string text = $"<style=cIsUtility>Upgrades {Config_BaseCount}</style> <style=cStack>(+{Config_StackCount} per stack)</style> random items to items of the next <style=cIsUtility>higher rarity</style> at the <style=cIsUtility>start of each stage</style>. <style=cIsVoid>Corrupts all 57 Leaf Clovers</style>.";
		LanguageAPI.Add("KKING117_CONFIGBENTHIC_ITEM_CLOVERVOID_DESC", text);
		NewDesc = true;
	}

	private static void ItemCatalog_Init(orig_Init orig)
	{
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: Invalid comparison between Unknown and I4
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		orig.Invoke();
		if (NewDesc)
		{
			Items.CloverVoid.descriptionToken = "KKING117_CONFIGBENTHIC_ITEM_CLOVERVOID_DESC";
		}
		BanList = new List<ItemDef>();
		string[] array = Config_BlackList.Split(',');
		for (int i = 0; i < array.Length; i++)
		{
			array[i] = array[i].Trim();
			ItemIndex val = ItemCatalog.FindItemIndex(array[i]);
			if ((int)val > -1)
			{
				ItemDef itemDef = ItemCatalog.GetItemDef(val);
				if (Object.op_Implicit((Object)(object)itemDef))
				{
					BanList.Add(itemDef);
				}
			}
		}
	}

	private static void CloverVoidUpgrade(orig_TryCloverVoidUpgrades orig, CharacterMaster self)
	{
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0115: Unknown result type (might be due to invalid IL or missing references)
		//IL_011b: Invalid comparison between Unknown and I4
		//IL_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_012a: Invalid comparison between Unknown and I4
		//IL_0218: Unknown result type (might be due to invalid IL or missing references)
		//IL_021f: Unknown result type (might be due to invalid IL or missing references)
		if (!NetworkServer.active)
		{
			return;
		}
		int itemCount = self.inventory.GetItemCount(Items.CloverVoid);
		if (itemCount <= 0)
		{
			return;
		}
		int num = Config_BaseCount + Math.Max(0, itemCount - 1) * Config_StackCount;
		if (num <= 0)
		{
			return;
		}
		List<ItemIndex> andSortInventory = GetAndSortInventory(self);
		int num2 = 0;
		int num3 = 0;
		int num4 = 0;
		List<ItemIndex> list = new List<ItemIndex>();
		while (num2 < num && num3 < andSortInventory.Count)
		{
			bool flag = false;
			ItemDef itemDef = ItemCatalog.GetItemDef(andSortInventory[num3]);
			ItemDef val = null;
			List<ItemIndex> upgradeList = GetUpgradeList(itemDef);
			if (upgradeList != null && upgradeList.Count > 0)
			{
				Util.ShuffleList<ItemIndex>(upgradeList, self.cloverVoidRng);
				upgradeList.Sort(CompareTags);
				val = ItemCatalog.GetItemDef(upgradeList[0]);
			}
			if ((Object)(object)val != (Object)null)
			{
				num4 = 0;
				num2++;
				int num5 = 0;
				int num6 = 1;
				if ((int)itemDef.tier == 2 || (int)itemDef.tier == 8)
				{
					if (Config_Overspill_Bonus == OverspillBonus.PlusOne)
					{
						num5 = 1;
					}
					if (Config_Overspill_Bonus == OverspillBonus.Duplicate)
					{
						num6 = 2;
					}
				}
				if (Config_WholeStack)
				{
					int itemCount2 = self.inventory.GetItemCount(itemDef);
					int num7 = itemCount2 * num6 + num5;
					self.inventory.GiveItem(val, num7);
					self.inventory.RemoveItem(itemDef, itemCount2);
					andSortInventory.RemoveAt(num3);
				}
				else
				{
					int num8 = num6 + num5;
					self.inventory.GiveItem(val, num8);
					self.inventory.RemoveItem(itemDef, 1);
					if (self.inventory.GetItemCount(itemDef) < 1)
					{
						andSortInventory.RemoveAt(num3);
					}
				}
				num3 = -1;
				CharacterMasterNotificationQueue.PushItemTransformNotification(self, itemDef.itemIndex, val.itemIndex, (TransformationType)2);
				if (Config_Select_PreferScrap && (val.ContainsTag((ItemTag)10) || val.ContainsTag((ItemTag)14)))
				{
					flag = true;
				}
				if (Config_Select_Method > SelectMethod.Random && Config_WholeStack)
				{
					if (andSortInventory.Count < 1)
					{
						num4++;
						if (num4 > 3)
						{
							break;
						}
						flag = true;
					}
				}
				else
				{
					flag = true;
				}
				if (flag)
				{
					andSortInventory = GetAndSortInventory(self);
				}
			}
			num3++;
			int CompareTags(ItemIndex lhs, ItemIndex rhs)
			{
				//IL_0005: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				int num9 = 0;
				int num10 = 0;
				ItemDef itemDef2 = ItemCatalog.GetItemDef(lhs);
				ItemDef itemDef3 = ItemCatalog.GetItemDef(rhs);
				if (itemDef.ContainsTag((ItemTag)1))
				{
					if (itemDef2.ContainsTag((ItemTag)1))
					{
						num9 = 1;
					}
					if (itemDef3.ContainsTag((ItemTag)1))
					{
						num10 = 1;
					}
				}
				if (itemDef.ContainsTag((ItemTag)2))
				{
					if (itemDef2.ContainsTag((ItemTag)2))
					{
						num9 = 1;
					}
					if (itemDef3.ContainsTag((ItemTag)2))
					{
						num10 = 1;
					}
				}
				if (itemDef.ContainsTag((ItemTag)3))
				{
					if (itemDef2.ContainsTag((ItemTag)3))
					{
						num9 = 1;
					}
					if (itemDef3.ContainsTag((ItemTag)3))
					{
						num10 = 1;
					}
				}
				return num10 - num9;
			}
		}
		if (num2 > 0)
		{
			GameObject bodyInstanceObject = self.bodyInstanceObject;
			if (Object.op_Implicit((Object)(object)bodyInstanceObject))
			{
				Util.PlaySound("Play_item_proc_extraLife", bodyInstanceObject);
			}
		}
	}

	private static List<ItemIndex> GetAndSortInventory(CharacterMaster master)
	{
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Expected O, but got Unknown
		List<ItemIndex> itemList = new List<ItemIndex>(master.inventory.itemAcquisitionOrder);
		itemList = RemoveClutter(itemList);
		if (master.cloverVoidRng == null)
		{
			master.cloverVoidRng = new Xoroshiro128Plus(Run.instance.seed);
		}
		switch (Config_Select_Method)
		{
		case SelectMethod.LeastStacks:
			itemList = SortItemList_ByLowest(itemList, master);
			break;
		case SelectMethod.MostStacks:
			itemList = SortItemList_ByHighest(itemList, master);
			break;
		default:
			Util.ShuffleList<ItemIndex>(itemList, master.cloverVoidRng);
			break;
		}
		if (Config_Select_PreferScrap)
		{
			itemList = SortItemList_ByScrap(itemList);
		}
		return itemList;
	}

	private static List<ItemIndex> RemoveClutter(List<ItemIndex> itemList)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		for (int i = 0; i < itemList.Count; i++)
		{
			ItemDef itemDef = ItemCatalog.GetItemDef(itemList[i]);
			if (Object.op_Implicit((Object)(object)itemDef) && !IsItemUpgradeable(itemDef))
			{
				itemList.RemoveAt(i);
				i--;
			}
		}
		return itemList;
	}

	private static List<ItemIndex> RemoveClutter_PickupList(List<PickupIndex> pickupList)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: 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_004f: Unknown result type (might be due to invalid IL or missing references)
		List<ItemIndex> list = new List<ItemIndex>();
		for (int i = 0; i < pickupList.Count; i++)
		{
			PickupIndex val = pickupList[i];
			ItemDef itemDef = ItemCatalog.GetItemDef(((PickupIndex)(ref val)).itemIndex);
			if (Object.op_Implicit((Object)(object)itemDef) && (BanList == null || !BanList.Contains(itemDef)))
			{
				list.Add(itemDef.itemIndex);
			}
		}
		return list;
	}

	private static List<ItemIndex> GetUpgradeList(ItemDef oldItemDef)
	{
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		//IL_000a: Invalid comparison between Unknown and I4
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Invalid comparison between Unknown and I4
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Invalid comparison between Unknown and I4
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Invalid comparison between Unknown and I4
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Invalid comparison between Unknown and I4
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Invalid comparison between Unknown and I4
		List<ItemIndex> result = null;
		if ((int)oldItemDef.tier == 2)
		{
			return RemoveClutter_PickupList(Run.instance.availableTier1DropList);
		}
		if ((int)oldItemDef.tier == 1)
		{
			return RemoveClutter_PickupList(Run.instance.availableTier3DropList);
		}
		if ((int)oldItemDef.tier == 0)
		{
			return RemoveClutter_PickupList(Run.instance.availableTier2DropList);
		}
		if ((int)oldItemDef.tier == 8)
		{
			return RemoveClutter_PickupList(Run.instance.availableVoidTier1DropList);
		}
		if ((int)oldItemDef.tier == 7)
		{
			return RemoveClutter_PickupList(Run.instance.availableVoidTier3DropList);
		}
		if ((int)oldItemDef.tier == 6)
		{
			return RemoveClutter_PickupList(Run.instance.availableVoidTier2DropList);
		}
		return result;
	}

	private static bool IsItemUpgradeable(ItemDef item)
	{
		//IL_0023: 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_0031: Invalid comparison between Unknown and I4
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Invalid comparison between Unknown and I4
		//IL_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Invalid comparison between Unknown and I4
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Invalid comparison between Unknown and I4
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Invalid comparison between Unknown and I4
		if (!Config_Select_AllowSelf && (Object)(object)item == (Object)(object)Items.CloverVoid)
		{
			return false;
		}
		if ((int)item.tier == 0 || (int)item.tier == 1)
		{
			return true;
		}
		if ((int)item.tier == 2 && Config_Overspill_Enable)
		{
			return true;
		}
		if (Config_Select_AllowVoid)
		{
			if ((int)item.tier == 6 || (int)item.tier == 7)
			{
				return true;
			}
			if ((int)item.tier == 8 && Config_Overspill_Enable)
			{
				return true;
			}
		}
		return false;
	}

	private static List<ItemIndex> SortItemList_ByLowest(List<ItemIndex> itemList, CharacterMaster master)
	{
		itemList.Sort(CompareStackSize);
		return itemList;
		int CompareStackSize(ItemIndex lhs, ItemIndex rhs)
		{
			//IL_000c: 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)
			int itemCount = master.inventory.GetItemCount(lhs);
			int itemCount2 = master.inventory.GetItemCount(rhs);
			return itemCount - itemCount2;
		}
	}

	private static List<ItemIndex> SortItemList_ByHighest(List<ItemIndex> itemList, CharacterMaster master)
	{
		itemList.Sort(CompareStackSize);
		return itemList;
		int CompareStackSize(ItemIndex lhs, ItemIndex rhs)
		{
			//IL_000c: 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)
			int itemCount = master.inventory.GetItemCount(lhs);
			int itemCount2 = master.inventory.GetItemCount(rhs);
			return itemCount2 - itemCount;
		}
	}

	private static List<ItemIndex> SortItemList_ByScrap(List<ItemIndex> itemList)
	{
		itemList.Sort(ByIsScrap);
		return itemList;
		static int ByIsScrap(ItemIndex lhs, ItemIndex rhs)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			int num2 = 0;
			ItemDef itemDef = ItemCatalog.GetItemDef(lhs);
			ItemDef itemDef2 = ItemCatalog.GetItemDef(rhs);
			if (itemDef.ContainsTag((ItemTag)14))
			{
				num = 2;
			}
			else if (itemDef.ContainsTag((ItemTag)10))
			{
				num = 1;
			}
			if (itemDef2.ContainsTag((ItemTag)14))
			{
				num2 = 2;
			}
			else if (itemDef2.ContainsTag((ItemTag)10))
			{
				num2 = 1;
			}
			return num2 - num;
		}
	}

	private void ReadConfig()
	{
		Config_BaseCount = ((BaseUnityPlugin)this).Config.Bind<int>("Stacking", "Base Upgrade Count", 3, "How many items to upgrade at a single stack.").Value;
		Config_StackCount = ((BaseUnityPlugin)this).Config.Bind<int>("Stacking", "Stack Upgrade Count", 3, "How many items to upgrade for each additional stack.").Value;
		Config_BlackList = ((BaseUnityPlugin)this).Config.Bind<string>("Upgrading", "Upgrade Blacklist", "", "Prevents upgrading into these specific items. (Example = Clover, ExtraLife, MoreMissile)").Value;
		Config_WholeStack = ((BaseUnityPlugin)this).Config.Bind<bool>("Upgrading", "Upgrade Entire Stack", true, "Should the entire stack get upgraded or a single instance of the selected item?").Value;
		Config_Select_Method = ((BaseUnityPlugin)this).Config.Bind<SelectMethod>("Item Selection", "Selection Method", SelectMethod.Random, "The method to use when selecting items for upgrading.").Value;
		Config_Select_PreferScrap = ((BaseUnityPlugin)this).Config.Bind<bool>("Item Selection", "Prioritise Scrap", false, "Should Scrap have priority over the selection method?").Value;
		Config_Select_AllowVoid = ((BaseUnityPlugin)this).Config.Bind<bool>("Item Selection", "Allow Void", false, "Allow Void items to be selected for upgrading?").Value;
		Config_Select_AllowSelf = ((BaseUnityPlugin)this).Config.Bind<bool>("Item Selection", "Allow Self", false, "Allow Benthic Bloom to be selected for upgrading?").Value;
		Config_Overspill_Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Overflow", "Enable", false, "Allows Legendary items to be selected and 'upgraded' into Common items.").Value;
		Config_Overspill_Bonus = ((BaseUnityPlugin)this).Config.Bind<OverspillBonus>("Overflow", "Bonus Gain", OverspillBonus.PlusOne, "Gain extra items when 'upgrading' an item.").Value;
	}
}