Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of LootPoolLimiter v1.1.3
LootPoolLimiter.dll
Decompiled 4 months 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; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HG; using Microsoft.CodeAnalysis; using On.RoR2; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using UnityEngine; using UnityEngine.AddressableAssets; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ExamplePlugin")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+596abb38171c1972d190bdfb1077a7dcd25be4b5")] [assembly: AssemblyProduct("ExamplePlugin")] [assembly: AssemblyTitle("ExamplePlugin")] [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 LootPoolLimiter { public static class LootPoolLimiterConfig { public static ConfigEntry<string> ConfigWhites { get; set; } public static ConfigEntry<string> ConfigGreens { get; set; } public static ConfigEntry<string> ConfigReds { get; set; } public static ConfigEntry<bool> speedCategory { get; set; } public static ConfigEntry<string> SpeedIncluded { get; set; } public static ConfigEntry<float> categoryVariance { get; set; } public static ConfigEntry<float> blacklistWeight { get; set; } public static ConfigEntry<bool> affectPrinters { get; set; } public static ConfigEntry<bool> affectCradles { get; set; } public static ConfigEntry<bool> affectVoidKey { get; set; } public static void InitConfig(ConfigFile config) { //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Expected O, but got Unknown //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Expected O, but got Unknown //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Expected O, but got Unknown //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0167: 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) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Expected O, but got Unknown //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Expected O, but got Unknown //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Expected O, but got Unknown //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Expected O, but got Unknown //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Expected O, but got Unknown //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Expected O, but got Unknown //IL_01ea: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Expected O, but got Unknown //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Expected O, but got Unknown //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Expected O, but got Unknown ConfigWhites = config.Bind<string>("General", "White Items", "15-25", "How many white items are in the loot pool. write 2 numbers seperated by \"-\" to limit the pool a random amount in that range (5-10). -1 for no limit"); ConfigGreens = config.Bind<string>("General", "Green Items", "10-15", "How many green items are in the loot pool. write 2 numbers seperated by \"-\" to limit the pool a random amount in that range (5-10). -1 for no limit"); ConfigReds = config.Bind<string>("General", "Red Items", "-1", "How many red items are in the loot pool. write 2 numbers seperated by \"-\" to limit the pool a random amount in that range (5-10). -1 for no limit"); blacklistWeight = config.Bind<float>("General", "blacklistWeight", 0f, "The & chance of getting a blacklisted item. If you don't want to remove items, but want to make them less common instead. (0 to completely remove blacklisted items, 100 disables the mod"); affectPrinters = config.Bind<bool>("General", "Affect printers", false, "Limits the loot pool of printers and cauldrons as well"); affectCradles = config.Bind<bool>("General", "Affect cradles", false, "Only allow voided variants of whitelisted items from cradles"); affectVoidKey = config.Bind<bool>("General", "Affect voidKey", false, "Only allow voided variants of whitelisted items from void keyboxes"); speedCategory = config.Bind<bool>("Categories", "Speed Category", false, "Add a subcategory for speed items, which in combination with low Category ratio variance will ensure that there are always at least some available"); SpeedIncluded = config.Bind<string>("Categories", "Speed Category Contents", "SpeedBoostPickup, SprintBonus, AttackSpeedAndMoveSpeed, Hoof, Feather, MoveSpeedOnKill, SprintOutOfCombat, JumpBoost, BoostAllStats", "Items that should belong in the speed category, seperated by \", \" (SpeedBoostPickup, SprintBonus)"); categoryVariance = config.Bind<float>("Categories", "Category ratio variance", 10f, "Determines how much the ratios can differ from the base game. \nEnsures that you can't get a build with only healing etc.\n Higher values equals more randomness.\n (min:0, max:100)"); ModSettingsManager.SetModDescription("Randomly remove a set amount of items from the itempool"); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(ConfigWhites)); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(ConfigGreens)); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(ConfigReds)); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(blacklistWeight, new StepSliderConfig { min = 0f, max = 100f, increment = 1f })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(speedCategory)); ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(SpeedIncluded)); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(categoryVariance, new StepSliderConfig { min = 0f, max = 100f, increment = 1f })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(affectPrinters)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(affectCradles)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(affectVoidKey)); SetSpriteDefaultIcon(); } private static void SetSpriteDefaultIcon() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_005b: 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) try { string fullName = new DirectoryInfo(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)).FullName; Texture2D val = new Texture2D(256, 256); if (ImageConversion.LoadImage(val, File.ReadAllBytes(Path.Combine(fullName, "icon.png")))) { ModSettingsManager.SetModIcon(Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f))); } else { Log.Error("Failed to load icon.png"); } } catch (Exception ex) { Log.Error("Failed to load icon.png\n" + ex); } } public static void printConfig() { Log.Warning("ConfigWhites: " + (object)ConfigWhites); Log.Warning("ConfigGreens: " + (object)ConfigGreens); Log.Warning("ConfigReds: " + (object)ConfigReds); Log.Warning("speedCategory: " + (object)speedCategory); Log.Warning("SpeedIncluded: " + (object)SpeedIncluded); Log.Warning("categoryVariance: " + (object)categoryVariance); Log.Warning("blacklistWeight: " + (object)blacklistWeight); Log.Warning("affectPrinters: " + (object)affectPrinters); Log.Warning("affectCradles: " + (object)affectCradles); Log.Warning("affectVoidKey: " + (object)affectVoidKey); } } 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); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("Onyx.LootPoolLimiter", "LootPoolLimiter", "1.1.2")] public class LootPoolLimiter : BaseUnityPlugin { public const string PluginGUID = "Onyx.LootPoolLimiter"; public const string PluginAuthor = "Onyx"; public const string PluginName = "LootPoolLimiter"; public const string PluginVersion = "1.1.2"; public static string[] affectedPools = new string[22] { "dtChest1", "dtChest2", "dtSonorousEcho", "dtSmallChestDamage", "dtSmallChestHealing", "dtSmallChestUtility", "dtCategoryChest2Damage", "dtCategoryChest2Healing", "dtCategoryChest2Utility", "dtCasinoChest", "dtShrineChance", "dtChanceDoll", "dtLockbox", "dtSacrificeArtifact", "dtVoidTriple", "dtTier1Item", "dtTier2Item", "dtTier3Item", "GeodeRewardDropTable", "dtShrineHalcyoniteTier1", "dtShrineHalcyoniteTier2", "dtShrineHalcyoniteTier3" }; public static BasicPickupDropTable dtDuplicatorTier1; public static BasicPickupDropTable dtDuplicatorTier2; public static BasicPickupDropTable dtDuplicatorTier3; public static BasicPickupDropTable dtChest1; public static int numWhites; public static int numGreens; public static int numReds; public static List<PickupIndex> blockedWhites; public static List<PickupIndex> blockedGreens; public static List<PickupIndex> blockedReds; private Dictionary<ItemDef, ItemDef> voidPairs; public static int SotsItemCount; public static float[] categoryWeightsWhite = new float[4]; public static float[] categoryWeightsGreen = new float[4]; public static float[] categoryWeightsRed = new float[4]; public static ItemTag[] categoryTags; public void Awake() { //IL_0010: 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) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_003b: 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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Expected O, but got Unknown //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected O, but got Unknown //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Expected O, but got Unknown Log.Init(((BaseUnityPlugin)this).Logger); Addressables.LoadAssetAsync<BasicPickupDropTable>((object)"RoR2/Base/Duplicator/dtDuplicatorTier1.asset").WaitForCompletion(); Addressables.LoadAssetAsync<BasicPickupDropTable>((object)"RoR2/Base/DuplicatorLarge/dtDuplicatorTier2.asset").WaitForCompletion(); Addressables.LoadAssetAsync<BasicPickupDropTable>((object)"RoR2/Base/Duplicator/dtDuplicatorTier3.asset").WaitForCompletion(); Addressables.LoadAssetAsync<BasicPickupDropTable>((object)"RoR2/Base/Chest1/dtChest1.asset").WaitForCompletion(); LootPoolLimiterConfig.InitConfig(((BaseUnityPlugin)this).Config); Run.onRunStartGlobal += start_blacklist; BasicPickupDropTable.GenerateWeightedSelection += new hook_GenerateWeightedSelection(filter_basic_loot); PickupPickerController.GenerateOptionsFromDropTablePlusForcedStorm += new hook_GenerateOptionsFromDropTablePlusForcedStorm(fix_halc_loot); PickupTransmutationManager.RebuildAvailablePickupGroups += new hook_RebuildAvailablePickupGroups(filter_printers); ShopTerminalBehavior.Start += new hook_Start(fix_soup_always_affected); ChestBehavior.BaseItemDrop += new hook_BaseItemDrop(fix_scavbag_droptable); } private void fix_scavbag_droptable(orig_BaseItemDrop orig, ChestBehavior self) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (((Object)self).name.Contains("ScavBackpack")) { self.dropPickup = self.dropTable.GenerateDrop(self.rng); } orig.Invoke(self); } private void start_blacklist(Run run) { load_config(); get_category_weights((ItemTier)0, run); get_category_weights((ItemTier)1, run); get_category_weights((ItemTier)2, run); SotsItemCount = 0; init_void_relationships(); blockedWhites = create_blacklist(run.availableTier1DropList, numWhites, categoryWeightsWhite); blockedGreens = create_blacklist(run.availableTier2DropList, numGreens, categoryWeightsGreen); blockedReds = create_blacklist(run.availableTier3DropList, numReds, categoryWeightsRed); PickupDropTable.RegenerateAll(run); } private void init_void_relationships() { //IL_0010: 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) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0057: 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) voidPairs = new Dictionary<ItemDef, ItemDef>(); Enumerator<Pair> enumerator = ItemCatalog.GetItemPairsForRelationship(Addressables.LoadAssetAsync<ItemRelationshipType>((object)"RoR2/DLC1/Common/ContagiousItem.asset").WaitForCompletion()).GetEnumerator(); try { while (enumerator.MoveNext()) { Pair current = enumerator.Current; if ((Object)(object)current.itemDef1 != (Object)null && (Object)(object)current.itemDef2 != (Object)null) { voidPairs.Add(current.itemDef1, current.itemDef2); } } } finally { ((IDisposable)enumerator).Dispose(); } } private List<PickupIndex> create_blacklist(List<PickupIndex> itemList, int allowedCount, float[] categoryWeights) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: 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) //IL_00c8: 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) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) if (allowedCount <= 0) { return new List<PickupIndex>(); } List<PickupIndex> blockedItems = new List<PickupIndex>(itemList); foreach (ItemDef value in voidPairs.Values) { blockedItems.Add(PickupCatalog.FindPickupIndex(value.itemIndex)); } List<PickupIndex>[] categoryItems = new List<PickupIndex>[4] { new List<PickupIndex>(), new List<PickupIndex>(), new List<PickupIndex>(), new List<PickupIndex>() }; foreach (PickupIndex item in itemList) { if (LootPoolLimiterConfig.SpeedIncluded.Value.Split(", ").Contains(PickupCatalog.GetPickupDef(item).internalName.Substring(10)) && LootPoolLimiterConfig.speedCategory.Value) { categoryItems[3].Add(item); continue; } for (int i = 0; i < categoryTags.Length; i++) { if (ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(item).itemIndex).ContainsTag(categoryTags[i])) { categoryItems[i].Add(item); } } } blacklistItem(Random.Range(0, 4)); for (int j = 1; j < allowedCount && j < itemList.Count; j++) { if (categoryWeights.Max() <= -1000f) { Log.Error("endless loop.\nIf you can see this message, something went wrong. Please report it"); LootPoolLimiterConfig.printConfig(); } int num = Array.IndexOf(categoryWeights, categoryWeights.Max()); if (categoryItems[num].Count <= 0) { j--; categoryWeights[num] = -1000f; } else { blacklistItem(num); } } return blockedItems; void blacklistItem(int category) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: 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_0063: 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) if (categoryItems[category].Count > 0) { int index = Random.Range(0, categoryItems[category].Count); ItemDef itemDef = ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(categoryItems[category][index]).itemIndex); if (voidPairs.ContainsKey(itemDef)) { blockedItems.Remove(PickupCatalog.FindPickupIndex(voidPairs[itemDef].itemIndex)); } blockedItems.Remove(categoryItems[category][index]); if (itemDef.ContainsTag((ItemTag)21)) { SotsItemCount = Math.Min(SotsItemCount + 1, 2); } categoryItems[category].RemoveAt(index); categoryWeights[category] -= Random.Range(1f - LootPoolLimiterConfig.categoryVariance.Value / 100f, 1f); } } } private void get_category_weights(ItemTier tier, Run run) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected I4, but got Unknown //IL_005e: 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_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) List<PickupIndex> list; int num; float[] array; switch ((int)tier) { default: return; case 0: list = run.availableTier1DropList; num = numWhites; array = categoryWeightsWhite; break; case 1: list = run.availableTier2DropList; num = numGreens; array = categoryWeightsGreen; break; case 2: list = run.availableTier3DropList; num = numReds; array = categoryWeightsRed; break; } foreach (PickupIndex item in list) { PickupIndex current = item; if (LootPoolLimiterConfig.SpeedIncluded.Value.Split(", ").Contains(((PickupIndex)(ref current)).pickupDef.internalName.Substring(10)) && LootPoolLimiterConfig.speedCategory.Value) { array[3] += 1f; continue; } for (int num2 = Random.Range(3, 6); num2 >= 0; num2--) { if (ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(current).itemIndex).ContainsTag(categoryTags[num2 % 3])) { array[num2 % 3] += 1f; break; } } } for (int i = 0; i < categoryTags.Length; i++) { array[i] = array[i] / (float)list.Count * (float)num; } array[3] = array[3] / (float)list.Count * (float)num; } public void fix_soup_always_affected(orig_Start orig, ShopTerminalBehavior self) { if (!LootPoolLimiterConfig.affectPrinters.Value) { if (((Object)self).name.Contains("LunarCauldron, WhiteToGreen")) { self.dropTable = (PickupDropTable)(object)dtDuplicatorTier2; } if (((Object)self).name.Contains("LunarCauldron, GreenToRed")) { self.dropTable = (PickupDropTable)(object)dtDuplicatorTier3; } if (((Object)self).name.Contains("LunarCauldron, RedToWhite")) { self.dropTable = (PickupDropTable)(object)dtDuplicatorTier1; } } orig.Invoke(self); } private void load_config() { ((BaseUnityPlugin)this).Config.Reload(); numWhites = parse_itemnum(LootPoolLimiterConfig.ConfigWhites.Value); numGreens = parse_itemnum(LootPoolLimiterConfig.ConfigGreens.Value); numReds = parse_itemnum(LootPoolLimiterConfig.ConfigReds.Value); static int parse_itemnum(string configString) { string[] array = configString.Split('-'); int result; int result2; if (array.Length > 1) { if (array[0].Length > 0) { int.TryParse(array[0], out result); int.TryParse(array[1], out result2); } else { result = -1; result2 = -1; } } else { int.TryParse(configString, out result); result2 = result; } return Random.Range(result, result2 + 1); } } private void filter_basic_loot(orig_GenerateWeightedSelection orig, BasicPickupDropTable self, Run run) { //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: 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_01da: 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_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, run); if (blockedWhites == null || blockedGreens == null || blockedReds == null || (!affectedPools.Contains(((Object)self).name) && (!LootPoolLimiterConfig.affectPrinters.Value || !((Object)self).name.Contains("dtDuplicator")) && (!LootPoolLimiterConfig.affectCradles.Value || !((Object)self).name.Contains("dtVoidChest")) && (!LootPoolLimiterConfig.affectVoidKey.Value || !((Object)self).name.Contains("dtVoidLockbox")))) { return; } Dictionary<ItemTier, float> prevTierAmount = get_tier_weights(self); int num = self.selector.Count; for (int num2 = self.selector.Count - 1; num2 >= 0; num2--) { if (blockedWhites.Contains(self.selector.choices[num2].value) || blockedGreens.Contains(self.selector.choices[num2].value) || blockedReds.Contains(self.selector.choices[num2].value)) { num--; } } for (int num3 = self.selector.Count - 1; num3 >= 0; num3--) { if (LootPoolLimiterConfig.blacklistWeight.Value == 0f) { if (blockedWhites.Contains(self.selector.choices[num3].value) || blockedGreens.Contains(self.selector.choices[num3].value) || blockedReds.Contains(self.selector.choices[num3].value)) { self.selector.ModifyChoiceWeight(num3, 0f); } } else if (!blockedWhites.Contains(self.selector.choices[num3].value) && !blockedGreens.Contains(self.selector.choices[num3].value) && !blockedReds.Contains(self.selector.choices[num3].value)) { self.selector.ModifyChoiceWeight(num3, self.selector.choices[num3].weight * ((float)((self.selector.Count - num) / num) / (LootPoolLimiterConfig.blacklistWeight.Value / 100f) - (float)((self.selector.Count - num) / num) + 1f)); } } balance_item_weight(self, prevTierAmount); PickupTransmutationManager.RebuildPickupGroups(); } private void filter_printers(orig_RebuildAvailablePickupGroups orig, Run run) { //IL_0026: 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_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004e: 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) orig.Invoke(run); for (int i = 0; i < PickupTransmutationManager.availablePickupGroups.Length; i++) { PickupIndex[] array = PickupTransmutationManager.pickupGroups[i]; List<PickupIndex> list = new List<PickupIndex>(); PickupIndex[] array2 = array; foreach (PickupIndex item in array2) { if (!blockedWhites.Contains(item) && !blockedGreens.Contains(item) && !blockedReds.Contains(item)) { list.Add(item); } } array = list.ToArray(); PickupTransmutationManager.availablePickupGroups[i] = array; for (int k = 0; k < array.Length; k++) { PickupTransmutationManager.availablePickupGroupMap[array[k].value] = array; } } } private Option[] fix_halc_loot(orig_GenerateOptionsFromDropTablePlusForcedStorm orig, int numOptions, PickupDropTable dropTable, PickupDropTable stormDropTable, Xoroshiro128Plus rng) { //IL_0042: 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_005a: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: 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_00a9: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)stormDropTable == (Object)(object)dropTable) { dropTable = (PickupDropTable)(object)dtChest1; } Option[] array = orig.Invoke(numOptions, dropTable, stormDropTable, rng); PickupIndex[] array2 = stormDropTable.GenerateUniqueDrops(2, rng); PickupIndex[] array3 = dropTable.GenerateUniqueDrops(numOptions, rng); int num = 0; for (int i = 0; i < numOptions; i++) { array[i] = new Option { available = true, pickupIndex = array3[i] }; if (ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(array3[i]).itemIndex).ContainsTag((ItemTag)21)) { num++; if (array3[i] == array2[1]) { array2[1] = array2[0]; } } if (i + SotsItemCount - num >= numOptions) { array[i].pickupIndex = array2[num]; } } PickupPickerController.Shuffle<Option>(new Random(), array); return array; } private Dictionary<ItemTier, float> get_tier_weights(BasicPickupDropTable self) { //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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Invalid comparison between Unknown and I4 //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0094: 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_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: 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) //IL_005d: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) Dictionary<ItemTier, float> dictionary = new Dictionary<ItemTier, float>(); ChoiceInfo<PickupIndex>[] choices = self.selector.choices; for (int i = 0; i < choices.Length; i++) { ChoiceInfo<PickupIndex> val = choices[i]; if ((int)PickupCatalog.GetPickupDef(val.value).itemIndex != -1) { if (dictionary.ContainsKey(ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(val.value).itemIndex).tier)) { dictionary[ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(val.value).itemIndex).tier] += val.weight; } else { dictionary.Add(ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(val.value).itemIndex).tier, val.weight); } } } return dictionary; } private void balance_item_weight(BasicPickupDropTable self, Dictionary<ItemTier, float> prevTierAmount) { //IL_001e: 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) //IL_0025: 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_0055: 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_005b: 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_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Invalid comparison between Unknown and I4 //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) Dictionary<ItemTier, float> dictionary = get_tier_weights(self); List<ItemTier> list = new List<ItemTier>(); foreach (ItemTier key in dictionary.Keys) { list.Add(key); } foreach (ItemTier item in list) { dictionary[item] = prevTierAmount[item] / dictionary[item]; } for (int i = 0; i < self.selector.Count; i++) { if ((int)PickupCatalog.GetPickupDef(self.selector.choices[i].value).itemIndex != -1) { self.selector.ModifyChoiceWeight(i, self.selector.choices[i].weight * dictionary[ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(self.selector.choices[i].value).itemIndex).tier]); } } } static LootPoolLimiter() { ItemTag[] array = new ItemTag[3]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); categoryTags = (ItemTag[])(object)array; } } }