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 ItemLuck v1.0.1
ItemLuck.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.ComponentModel; 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; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.ScavBackpack; using Microsoft.CodeAnalysis; using On.EntityStates.ScavBackpack; using On.RoR2; using On.RoR2.Artifacts; using RiskOfOptions; using RiskOfOptions.Components.Options; using RiskOfOptions.Components.Panel; using RiskOfOptions.Components.RuntimePrefabs; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.Artifacts; using RoR2.UI; using TMPro; using UnityEngine; using UnityEngine.Events; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("ItemLuck")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+6828a68ef7c4460a8d7be2b6f8885d07f1597043")] [assembly: AssemblyProduct("ItemLuck")] [assembly: AssemblyTitle("ItemLuck")] [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.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; } } [EditorBrowsable(EditorBrowsableState.Never)] public static class IsExternalInit { } } namespace ItemLuck { public record Element(bool IsSelected, string Name, float Weigth); public class DescriptionBuilder { private readonly StringBuilder _sb; public DescriptionBuilder(StringBuilder sb) { _sb = sb; } public void AppendElements(List<Element> elements) { float num = elements.Sum((Element x) => x.Weigth); float num2 = 1f / (float)elements.Count; for (int i = 0; i < elements.Count; i++) { Element element = elements[i]; if (element.IsSelected) { _sb.Append("<color=\"yellow\">"); } _sb.Append(element.Name); if (element.IsSelected) { _sb.Append("</color>"); } _sb.Append(": "); float num3 = element.Weigth / num; float num4 = num3 - num2; bool num5 = Mathf.Abs(num4) <= 0.001f; if (!num5) { if (num3 > num2) { _sb.Append("<color=\"green\">"); } else { _sb.Append("<color=\"red\">"); } } _sb.Append($"{num3 * 100f:0.##}%"); if (!num5) { _sb.Append("</color>"); _sb.Append(" ("); if (num4 > 0f) { _sb.Append('+'); } _sb.Append($"{num4 * 100f:0.##}%"); _sb.Append(')'); } _sb.AppendLine(); } } } public static class ModOptionPanelControllerExtensions { private static readonly FieldInfo _panelField = typeof(ModOptionPanelController).GetField("_panel", BindingFlags.Instance | BindingFlags.NonPublic); public static ModOptionsPanelPrefab GetPanel(this ModOptionPanelController controller) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown return (ModOptionsPanelPrefab)_panelField.GetValue(controller); } } public class TierList { private readonly Dictionary<ItemIndex, ConfigEntry<Tier>> _itemConfigByItem; private readonly Dictionary<EquipmentIndex, ConfigEntry<Tier>> _equipmentConfigByItem; private TierList(Dictionary<ItemIndex, ConfigEntry<Tier>> itemConfigByItem, Dictionary<EquipmentIndex, ConfigEntry<Tier>> equipmentConfigByItem) { _itemConfigByItem = itemConfigByItem; _equipmentConfigByItem = equipmentConfigByItem; } public static TierList Create(ConfigFile config) { //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_028b: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) Log.Debug("Initializing TierList"); DefaultTierList defaultTierList = DefaultTierList.Create(); Dictionary<ItemIndex, Rank<ItemDef>> dictionary = defaultTierList.Items.ToDictionary((Rank<ItemDef> x) => x.Def.itemIndex); Dictionary<ItemIndex, ConfigEntry<Tier>> dictionary2 = new Dictionary<ItemIndex, ConfigEntry<Tier>>(); var items = from x in GetValidItems() select new { Name = NormaliseName(Language.GetString(x.nameToken)), ItemDef = x } into x orderby x.ItemDef.tier, x.Name select x; foreach (var item in items) { Tier tier = Tier.Unspecified; if (dictionary.TryGetValue(item.ItemDef.itemIndex, out var value)) { tier = value.Tier; } ConfigEntry<Tier> val = config.Bind<Tier>(item.ItemDef.tier.GetShortName(), item.Name, tier, "test2"); dictionary2[item.ItemDef.itemIndex] = val; Func<List<Element>> getElements = () => (from x in items where x.ItemDef.tier == item.ItemDef.tier select new Element((Object)(object)x.ItemDef == (Object)(object)item.ItemDef, x.Name, (ItemLuckPlugin.TierList.GetTier(x.ItemDef.itemIndex) ?? Tier.Unspecified).ApplyItemLuck(1f)) into x orderby x.Name select x).ToList(); UpdatableChoiceOption choiceOption2 = new UpdatableChoiceOption((ConfigEntryBase)(object)val, getElements); ModSettingsManager.AddOption((BaseOption)(object)choiceOption2); val.SettingChanged += delegate { UpdatableOptions.UpdateDescriptions(); choiceOption2.UpdatePanel(); }; } Dictionary<EquipmentIndex, Rank<EquipmentDef>> dictionary3 = defaultTierList.Equipments.ToDictionary((Rank<EquipmentDef> x) => x.Def.equipmentIndex); Dictionary<EquipmentIndex, ConfigEntry<Tier>> dictionary4 = new Dictionary<EquipmentIndex, ConfigEntry<Tier>>(); var equipements = from x in GetValidEquipments() select new { Name = NormaliseName(Language.GetString(x.nameToken)), EquipmentDef = x } into x orderby x.Name select x; foreach (var equipment in equipements) { Tier tier2 = Tier.Unspecified; if (dictionary3.TryGetValue(equipment.EquipmentDef.equipmentIndex, out var value2)) { tier2 = value2.Tier; } ConfigEntry<Tier> val2 = config.Bind<Tier>("Equipments", equipment.Name, tier2, (ConfigDescription)null); dictionary4[equipment.EquipmentDef.equipmentIndex] = val2; Func<List<Element>> getElements2 = () => (from x in equipements select new Element((Object)(object)x.EquipmentDef == (Object)(object)equipment.EquipmentDef, x.Name, (ItemLuckPlugin.TierList.GetTier(x.EquipmentDef.equipmentIndex) ?? Tier.Unspecified).ApplyItemLuck(1f)) into x orderby x.Name select x).ToList(); UpdatableChoiceOption choiceOption = new UpdatableChoiceOption((ConfigEntryBase)(object)val2, getElements2); ModSettingsManager.AddOption((BaseOption)(object)choiceOption); val2.SettingChanged += delegate { UpdatableOptions.UpdateDescriptions(); choiceOption.UpdatePanel(); }; } Log.Debug("TierList Initialized"); return new TierList(dictionary2, dictionary4); static string NormaliseName(string name) { return Regex.Replace(name, "[=\\n\\t\\\\\"'\\[\\]]", "").Trim(); } } public static IEnumerable<ItemDef> GetValidItems() { return from x in ItemCatalog.itemDefs where (int)x.tier != 5 where x.canRemove where !x.hidden where x.DoesNotContainTag((ItemTag)10) where x.DoesNotContainTag((ItemTag)9) select x; } public static IEnumerable<EquipmentDef> GetValidEquipments() { return EquipmentCatalog.equipmentDefs.Where((EquipmentDef x) => x.canDrop); } public Tier? GetTier(ItemIndex itemIndex) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (_itemConfigByItem.TryGetValue(itemIndex, out var value)) { return value.Value; } return null; } public Tier? GetTier(EquipmentIndex equipmentIndex) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (_equipmentConfigByItem.TryGetValue(equipmentIndex, out var value)) { return value.Value; } return null; } } public class UpdatableChoiceOption : ChoiceOption, IUpdatableOption { private DropDownController _dropdownController; private Func<List<Element>> _getElements; public UpdatableChoiceOption(ConfigEntryBase configEntry, Func<List<Element>> getElements) : base(configEntry) { _getElements = getElements; UpdatableOptions.Instances.Add(this); } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown GameObject val = ((ChoiceOption)this).CreateOptionGameObject(prefab, parent); _dropdownController = val.GetComponentInChildren<DropDownController>(); ((MPButton)val.GetComponentInChildren<HGButton>()).onSelect.AddListener(new UnityAction(UpdatePanel)); return val; } private string GetCurrentDescription() { List<Element> elements = _getElements(); StringBuilder stringBuilder = new StringBuilder(); new DescriptionBuilder(stringBuilder).AppendElements(elements); return stringBuilder.ToString(); } public void UpdateDescription() { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown string currentDescription = GetCurrentDescription(); ((BaseOption)this).SetDescription(currentDescription, new BaseOptionConfig()); } public void UpdatePanel() { ModOptionsPanelPrefab panel = ((ModSetting)_dropdownController).optionController.GetPanel(); string currentDescription = GetCurrentDescription(); ((TMP_Text)panel.ModOptionsDescriptionPanel.GetComponentInChildren<HGTextMeshProUGUI>()).SetText(currentDescription, true); } } public interface IUpdatableOption { void UpdateDescription(); void UpdatePanel(); } public static class UpdatableOptions { public static List<IUpdatableOption> Instances { get; } = new List<IUpdatableOption>(); public static void UpdateDescriptions() { foreach (IUpdatableOption instance in Instances) { instance.UpdateDescription(); } } } public class UpdatableStepSliderOption : StepSliderOption, IUpdatableOption { private ModSettingsStepSlider _silder; public UpdatableStepSliderOption(ConfigEntry<float> configEntry, StepSliderConfig config) : base(configEntry, config) { UpdatableOptions.Instances.Add(this); } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown GameObject val = ((StepSliderOption)this).CreateOptionGameObject(prefab, parent); _silder = val.GetComponentInChildren<ModSettingsStepSlider>(); ((MPButton)val.GetComponentInChildren<HGButton>()).onSelect.AddListener(new UnityAction(UpdatePanel)); return val; } private string GetCurrentDescription() { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) var list = (from x in TierList.GetValidItems() select new { Tier = x.tier, Element = new Element(IsSelected: false, Language.GetString(x.nameToken), (ItemLuckPlugin.TierList.GetTier(x.itemIndex) ?? Tier.Unspecified).ApplyItemLuck(1f)) } into x group x by x.Tier into x orderby x.Key select new { Color = ColorCatalog.GetColor(ItemTierCatalog.GetItemTierDef(x.Key).colorIndex), CategoryName = x.Key.GetFullName(), Elements = (from x in x select x.Element into x orderby x.Name select x).ToList() }).ToList(); list.Add(new { Color = ColorCatalog.GetColor((ColorIndex)5), CategoryName = "Equipments", Elements = (from x in TierList.GetValidEquipments() select new Element(IsSelected: false, Language.GetString(x.nameToken), (ItemLuckPlugin.TierList.GetTier(x.equipmentIndex) ?? Tier.Unspecified).ApplyItemLuck(1f))).ToList() }); StringBuilder stringBuilder = new StringBuilder(); DescriptionBuilder descriptionBuilder = new DescriptionBuilder(stringBuilder); foreach (var item in list) { stringBuilder.Append("<color=#" + ColorUtility.ToHtmlStringRGB(Color32.op_Implicit(item.Color)) + ">"); stringBuilder.Append(item.CategoryName); stringBuilder.Append(":</color>"); stringBuilder.AppendLine(); descriptionBuilder.AppendElements(item.Elements); stringBuilder.AppendLine(); } return stringBuilder.ToString(); } public void UpdateDescription() { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown string currentDescription = GetCurrentDescription(); ((BaseOption)this).SetDescription(currentDescription, new BaseOptionConfig()); } public void UpdatePanel() { ModOptionsPanelPrefab panel = ((ModSetting)_silder).optionController.GetPanel(); string currentDescription = GetCurrentDescription(); ((TMP_Text)panel.ModOptionsDescriptionPanel.GetComponentInChildren<HGTextMeshProUGUI>()).SetText(currentDescription, true); } } public class DefaultTierList { public List<Rank<ItemDef>> Items { get; } public List<Rank<EquipmentDef>> Equipments { get; } private DefaultTierList(List<Rank<ItemDef>> items, List<Rank<EquipmentDef>> equipments) { Items = items; Equipments = equipments; } public static DefaultTierList Create() { List<Rank<ItemDef>> items = new List<Rank<ItemDef>> { new Rank<ItemDef>(Items.Hoof, Tier.S), new Rank<ItemDef>(Items.CritGlasses, Tier.S), new Rank<ItemDef>(Items.SprintBonus, Tier.S), new Rank<ItemDef>(Items.FragileDamageBonus, Tier.S), new Rank<ItemDef>(Items.AttackSpeedAndMoveSpeed, Tier.A), new Rank<ItemDef>(Items.IgniteOnKill, Tier.A), new Rank<ItemDef>(Items.BleedOnHit, Tier.A), new Rank<ItemDef>(Items.Syringe, Tier.A), new Rank<ItemDef>(Items.Bear, Tier.A), new Rank<ItemDef>(Items.HealWhileSafe, Tier.A), new Rank<ItemDef>(Items.OutOfCombatArmor, Tier.A), new Rank<ItemDef>(Items.BossDamageBonus, Tier.A), new Rank<ItemDef>(Items.TreasureCache, Tier.B), new Rank<ItemDef>(Items.StickyBomb, Tier.B), new Rank<ItemDef>(Items.Crowbar, Tier.B), new Rank<ItemDef>(Items.ArmorPlate, Tier.B), new Rank<ItemDef>(Items.NearbyDamageBonus, Tier.B), new Rank<ItemDef>(Items.SecondarySkillMagazine, Tier.B), new Rank<ItemDef>(Items.BarrierOnKill, Tier.C), new Rank<ItemDef>(Items.PersonalShield, Tier.C), new Rank<ItemDef>(Items.HealingPotion, Tier.C), new Rank<ItemDef>(Items.Firework, Tier.C), new Rank<ItemDef>(Items.Tooth, Tier.C), new Rank<ItemDef>(Items.GoldOnHurt, Tier.D), new Rank<ItemDef>(Items.Mushroom, Tier.D), new Rank<ItemDef>(Items.Medkit, Tier.D), new Rank<ItemDef>(Items.StunChanceOnHit, Tier.D), new Rank<ItemDef>(Items.WardOnLevel, Tier.F), new Rank<ItemDef>(Items.FlatHealth, Tier.F), new Rank<ItemDef>(Items.Feather, Tier.S), new Rank<ItemDef>(Items.IceRing, Tier.S), new Rank<ItemDef>(Items.FireRing, Tier.S), new Rank<ItemDef>(Items.Missile, Tier.S), new Rank<ItemDef>(Items.ChainLightning, Tier.A), new Rank<ItemDef>(Items.ExplodeOnDeath, Tier.A), new Rank<ItemDef>(Items.PrimarySkillShuriken, Tier.A), new Rank<ItemDef>(Items.StrengthenBurn, Tier.B), new Rank<ItemDef>(Items.JumpBoost, Tier.B), new Rank<ItemDef>(Items.SprintArmor, Tier.B), new Rank<ItemDef>(Items.BonusGoldPackOnKill, Tier.C), new Rank<ItemDef>(Items.EquipmentMagazine, Tier.C), new Rank<ItemDef>(Items.FreeChest, Tier.C), new Rank<ItemDef>(Items.SlowOnHit, Tier.C), new Rank<ItemDef>(Items.AttackSpeedOnCrit, Tier.C), new Rank<ItemDef>(Items.SprintOutOfCombat, Tier.C), new Rank<ItemDef>(Items.ExecuteLowHealthElite, Tier.C), new Rank<ItemDef>(Items.DeathMark, Tier.C), new Rank<ItemDef>(Items.EnergizedOnEquipmentUse, Tier.D), new Rank<ItemDef>(Items.Bandolier, Tier.D), new Rank<ItemDef>(Items.RegeneratingScrap, Tier.D), new Rank<ItemDef>(Items.HealOnCrit, Tier.D), new Rank<ItemDef>(Items.Squid, Tier.F), new Rank<ItemDef>(Items.Thorns, Tier.F), new Rank<ItemDef>(Items.Infusion, Tier.F), new Rank<ItemDef>(Items.WarCryOnMultiKill, Tier.F), new Rank<ItemDef>(Items.Phasing, Tier.F), new Rank<ItemDef>(Items.MoveSpeedOnKill, Tier.F), new Rank<ItemDef>(Items.Seed, Tier.F), new Rank<ItemDef>(Items.TPHealingNova, Tier.F), new Rank<ItemDef>(Items.TreasureCacheVoid, Tier.S), new Rank<ItemDef>(Items.BearVoid, Tier.S), new Rank<ItemDef>(Items.ChainLightningVoid, Tier.S), new Rank<ItemDef>(Items.MissileVoid, Tier.S), new Rank<ItemDef>(Items.ExplodeOnDeathVoid, Tier.A), new Rank<ItemDef>(Items.MushroomVoid, Tier.A), new Rank<ItemDef>(Items.ExtraLifeVoid, Tier.A), new Rank<ItemDef>(Items.EquipmentMagazineVoid, Tier.A), new Rank<ItemDef>(Items.BleedOnHitVoid, Tier.B), new Rank<ItemDef>(Items.SlowOnHitVoid, Tier.B), new Rank<ItemDef>(Items.CritGlassesVoid, Tier.D), new Rank<ItemDef>(Items.CloverVoid, Tier.D), new Rank<ItemDef>(Items.VoidMegaCrabItem, Tier.F), new Rank<ItemDef>(Items.ElementalRingVoid, Tier.F), new Rank<ItemDef>(Items.ShieldOnly, Tier.S), new Rank<ItemDef>(Items.AutoCastEquipment, Tier.S), new Rank<ItemDef>(Items.LunarSpecialReplacement, Tier.S), new Rank<ItemDef>(Items.LunarDagger, Tier.S), new Rank<ItemDef>(Items.RandomlyLunar, Tier.A), new Rank<ItemDef>(Items.FocusConvergence, Tier.B), new Rank<ItemDef>(Items.LunarBadLuck, Tier.B), new Rank<ItemDef>(Items.LunarUtilityReplacement, Tier.B), new Rank<ItemDef>(Items.LunarSun, Tier.B), new Rank<ItemDef>(Items.LunarPrimaryReplacement, Tier.B), new Rank<ItemDef>(Items.LunarSecondaryReplacement, Tier.B), new Rank<ItemDef>(Items.RepeatHeal, Tier.C), new Rank<ItemDef>(Items.GoldOnHit, Tier.C), new Rank<ItemDef>(Items.RandomDamageZone, Tier.C), new Rank<ItemDef>(Items.LunarTrinket, Tier.D), new Rank<ItemDef>(Items.MonstersOnShrineUse, Tier.D), new Rank<ItemDef>(Items.HalfAttackSpeedHalfCooldowns, Tier.F), new Rank<ItemDef>(Items.HalfSpeedDoubleHealth, Tier.F), new Rank<ItemDef>(Items.LightningStrikeOnHit, Tier.S), new Rank<ItemDef>(Items.FireballsOnHit, Tier.S), new Rank<ItemDef>(Items.BleedOnHitAndExplode, Tier.S), new Rank<ItemDef>(Items.ShinyPearl, Tier.S), new Rank<ItemDef>(Items.SprintWisp, Tier.S), new Rank<ItemDef>(Items.RoboBallBuddy, Tier.A), new Rank<ItemDef>(Items.SiphonOnLowHealth, Tier.C), new Rank<ItemDef>(Items.BeetleGland, Tier.C), new Rank<ItemDef>(Items.NovaOnLowHealth, Tier.D), new Rank<ItemDef>(Items.TitanGoldDuringTP, Tier.D), new Rank<ItemDef>(Items.ParentEgg, Tier.D), new Rank<ItemDef>(Items.Pearl, Tier.D), new Rank<ItemDef>(Items.Knurl, Tier.D), new Rank<ItemDef>(Items.MinorConstructOnKill, Tier.F), new Rank<ItemDef>(Items.FallBoots, Tier.S), new Rank<ItemDef>(Items.Clover, Tier.S), new Rank<ItemDef>(Items.DroneWeapons, Tier.S), new Rank<ItemDef>(Items.ExtraLife, Tier.S), new Rank<ItemDef>(Items.BounceNearby, Tier.S), new Rank<ItemDef>(Items.PermanentDebuffOnHit, Tier.S), new Rank<ItemDef>(Items.Behemoth, Tier.S), new Rank<ItemDef>(Items.MoreMissile, Tier.A), new Rank<ItemDef>(Items.ShockNearby, Tier.A), new Rank<ItemDef>(Items.Dagger, Tier.A), new Rank<ItemDef>(Items.ArmorReductionOnHit, Tier.A), new Rank<ItemDef>(Items.CritDamage, Tier.A), new Rank<ItemDef>(Items.UtilitySkillMagazine, Tier.A), new Rank<ItemDef>(Items.Icicle, Tier.B), new Rank<ItemDef>(Items.Talisman, Tier.C), new Rank<ItemDef>(Items.LaserTurbine, Tier.C), new Rank<ItemDef>(Items.Plant, Tier.C), new Rank<ItemDef>(Items.AlienHead, Tier.C), new Rank<ItemDef>(Items.IncreaseHealing, Tier.D), new Rank<ItemDef>(Items.KillEliteFrenzy, Tier.D), new Rank<ItemDef>(Items.ImmuneToDebuff, Tier.D), new Rank<ItemDef>(Items.GhostOnKill, Tier.D), new Rank<ItemDef>(Items.RandomEquipmentTrigger, Tier.D), new Rank<ItemDef>(Items.HeadHunter, Tier.F), new Rank<ItemDef>(Items.NovaOnHeal, Tier.F), new Rank<ItemDef>(Items.BarrierOnOverHeal, Tier.F) }; List<Rank<EquipmentDef>> equipments = new List<Rank<EquipmentDef>> { new Rank<EquipmentDef>(Equipment.Tonic, Tier.S), new Rank<EquipmentDef>(Equipment.Recycle, Tier.S), new Rank<EquipmentDef>(Equipment.BossHunter, Tier.S), new Rank<EquipmentDef>(Equipment.MultiShopCard, Tier.S), new Rank<EquipmentDef>(Equipment.Lightning, Tier.A), new Rank<EquipmentDef>(Equipment.GoldGat, Tier.A), new Rank<EquipmentDef>(Equipment.Jetpack, Tier.A), new Rank<EquipmentDef>(Equipment.Saw, Tier.A), new Rank<EquipmentDef>(Equipment.CommandMissile, Tier.B), new Rank<EquipmentDef>(Equipment.FireBallDash, Tier.B), new Rank<EquipmentDef>(Equipment.Gateway, Tier.B), new Rank<EquipmentDef>(Equipment.BFG, Tier.C), new Rank<EquipmentDef>(Equipment.GummyClone, Tier.C), new Rank<EquipmentDef>(Equipment.Cleanse, Tier.C), new Rank<EquipmentDef>(Equipment.VendingMachine, Tier.C), new Rank<EquipmentDef>(Equipment.BurnNearby, Tier.C), new Rank<EquipmentDef>(Equipment.Blackhole, Tier.C), new Rank<EquipmentDef>(Equipment.DeathProjectile, Tier.C), new Rank<EquipmentDef>(Equipment.CritOnUse, Tier.C), new Rank<EquipmentDef>(Equipment.GainArmor, Tier.C), new Rank<EquipmentDef>(Equipment.Meteor, Tier.C), new Rank<EquipmentDef>(Equipment.TeamWarCry, Tier.C), new Rank<EquipmentDef>(Equipment.LifestealOnHit, Tier.D), new Rank<EquipmentDef>(Equipment.PassiveHealing, Tier.D), new Rank<EquipmentDef>(Equipment.Fruit, Tier.D), new Rank<EquipmentDef>(Equipment.DroneBackup, Tier.F), new Rank<EquipmentDef>(Equipment.Molotov, Tier.F), new Rank<EquipmentDef>(Equipment.Scanner, Tier.F), new Rank<EquipmentDef>(Equipment.CrippleWard, Tier.F) }; return new DefaultTierList(items, equipments); } } public class Disposable : IDisposable { private readonly Action _dispose; public static Disposable Empty { get; } = new Disposable(delegate { }); public Disposable(Action dispose) { _dispose = dispose; } public void Dispose() { _dispose(); } } public class CompositeDisposable : IDisposable { private readonly List<IDisposable> _disposables; public CompositeDisposable() { _disposables = new List<IDisposable>(); } public void Add(IDisposable disposable) { _disposables.Add(disposable); } public void AddRange(IEnumerable<IDisposable> disposables) { _disposables.AddRange(disposables); } public void Dispose() { foreach (IDisposable disposable in _disposables) { disposable.Dispose(); } } } public static class Hooks { [CompilerGenerated] private static class <>O { public static hook_Init <0>__ItemCatalog_Init; public static hook_Roll <1>__ChestBehavior_Roll; public static hook_GenerateNewPickupServer_bool <2>__ShopTerminalBehavior_GenerateNewPickupServer_bool; public static hook_GenerateEntriesServer <3>__RouletteChestController_GenerateEntriesServer; public static hook_AddShrineStack <4>__ShrineChanceBehavior_AddShrineStack; public static hook_GenerateDropPreReplacement <5>__FreeChestDropTable_GenerateDropPreReplacement; public static hook_Roll <6>__OptionChestBehavior_Roll; public static hook_DropRewards <7>__BossGroup_DropRewards; public static hook_FixedUpdate <8>__Opening_FixedUpdate; public static hook_RollItem <9>__ChestBehavior_RollItem; public static hook_GenerateDropPreReplacement <10>__DoppelgangerDropTable_GenerateDropPreReplacement; public static hook_OnServerCharacterDeath <11>__SacrificeArtifactManager_OnServerCharacterDeath; public static hook_DropRewards <12>__InfiniteTowerWaveController_DropRewards; public static hook_GenerateUniqueDropsPreReplacement <13>__ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement; public static hook_EndRound <14>__ArenaMissionController_EndRound; public static hook_FireRecycle <15>__EquipmentSlot_FireRecycle; } private static ConfigFile _config; public static void Init(ConfigFile config) { //IL_0016: 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_0021: Expected O, but got Unknown //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_0041: Expected O, but got Unknown //IL_0056: 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_0061: Expected O, but got Unknown //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Expected O, but got Unknown //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_00f6: 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) //IL_0101: Expected O, but got Unknown //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Expected O, but got Unknown //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Expected O, but got Unknown //IL_0156: 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_0161: Expected O, but got Unknown //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Expected O, but got Unknown //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Expected O, but got Unknown //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Expected O, but got Unknown //IL_01f6: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Expected O, but got Unknown _config = config; object obj = <>O.<0>__ItemCatalog_Init; if (obj == null) { hook_Init val = ItemCatalog_Init; <>O.<0>__ItemCatalog_Init = val; obj = (object)val; } ItemCatalog.Init += (hook_Init)obj; object obj2 = <>O.<1>__ChestBehavior_Roll; if (obj2 == null) { hook_Roll val2 = ChestBehavior_Roll; <>O.<1>__ChestBehavior_Roll = val2; obj2 = (object)val2; } ChestBehavior.Roll += (hook_Roll)obj2; object obj3 = <>O.<2>__ShopTerminalBehavior_GenerateNewPickupServer_bool; if (obj3 == null) { hook_GenerateNewPickupServer_bool val3 = ShopTerminalBehavior_GenerateNewPickupServer_bool; <>O.<2>__ShopTerminalBehavior_GenerateNewPickupServer_bool = val3; obj3 = (object)val3; } ShopTerminalBehavior.GenerateNewPickupServer_bool += (hook_GenerateNewPickupServer_bool)obj3; object obj4 = <>O.<3>__RouletteChestController_GenerateEntriesServer; if (obj4 == null) { hook_GenerateEntriesServer val4 = RouletteChestController_GenerateEntriesServer; <>O.<3>__RouletteChestController_GenerateEntriesServer = val4; obj4 = (object)val4; } RouletteChestController.GenerateEntriesServer += (hook_GenerateEntriesServer)obj4; object obj5 = <>O.<4>__ShrineChanceBehavior_AddShrineStack; if (obj5 == null) { hook_AddShrineStack val5 = ShrineChanceBehavior_AddShrineStack; <>O.<4>__ShrineChanceBehavior_AddShrineStack = val5; obj5 = (object)val5; } ShrineChanceBehavior.AddShrineStack += (hook_AddShrineStack)obj5; object obj6 = <>O.<5>__FreeChestDropTable_GenerateDropPreReplacement; if (obj6 == null) { hook_GenerateDropPreReplacement val6 = FreeChestDropTable_GenerateDropPreReplacement; <>O.<5>__FreeChestDropTable_GenerateDropPreReplacement = val6; obj6 = (object)val6; } FreeChestDropTable.GenerateDropPreReplacement += (hook_GenerateDropPreReplacement)obj6; object obj7 = <>O.<6>__OptionChestBehavior_Roll; if (obj7 == null) { hook_Roll val7 = OptionChestBehavior_Roll; <>O.<6>__OptionChestBehavior_Roll = val7; obj7 = (object)val7; } OptionChestBehavior.Roll += (hook_Roll)obj7; object obj8 = <>O.<7>__BossGroup_DropRewards; if (obj8 == null) { hook_DropRewards val8 = BossGroup_DropRewards; <>O.<7>__BossGroup_DropRewards = val8; obj8 = (object)val8; } BossGroup.DropRewards += (hook_DropRewards)obj8; object obj9 = <>O.<8>__Opening_FixedUpdate; if (obj9 == null) { hook_FixedUpdate val9 = Opening_FixedUpdate; <>O.<8>__Opening_FixedUpdate = val9; obj9 = (object)val9; } Opening.FixedUpdate += (hook_FixedUpdate)obj9; object obj10 = <>O.<9>__ChestBehavior_RollItem; if (obj10 == null) { hook_RollItem val10 = ChestBehavior_RollItem; <>O.<9>__ChestBehavior_RollItem = val10; obj10 = (object)val10; } ChestBehavior.RollItem += (hook_RollItem)obj10; object obj11 = <>O.<10>__DoppelgangerDropTable_GenerateDropPreReplacement; if (obj11 == null) { hook_GenerateDropPreReplacement val11 = DoppelgangerDropTable_GenerateDropPreReplacement; <>O.<10>__DoppelgangerDropTable_GenerateDropPreReplacement = val11; obj11 = (object)val11; } DoppelgangerDropTable.GenerateDropPreReplacement += (hook_GenerateDropPreReplacement)obj11; object obj12 = <>O.<11>__SacrificeArtifactManager_OnServerCharacterDeath; if (obj12 == null) { hook_OnServerCharacterDeath val12 = SacrificeArtifactManager_OnServerCharacterDeath; <>O.<11>__SacrificeArtifactManager_OnServerCharacterDeath = val12; obj12 = (object)val12; } SacrificeArtifactManager.OnServerCharacterDeath += (hook_OnServerCharacterDeath)obj12; object obj13 = <>O.<12>__InfiniteTowerWaveController_DropRewards; if (obj13 == null) { hook_DropRewards val13 = InfiniteTowerWaveController_DropRewards; <>O.<12>__InfiniteTowerWaveController_DropRewards = val13; obj13 = (object)val13; } InfiniteTowerWaveController.DropRewards += (hook_DropRewards)obj13; object obj14 = <>O.<13>__ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement; if (obj14 == null) { hook_GenerateUniqueDropsPreReplacement val14 = ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement; <>O.<13>__ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement = val14; obj14 = (object)val14; } ArenaMonsterItemDropTable.GenerateUniqueDropsPreReplacement += (hook_GenerateUniqueDropsPreReplacement)obj14; object obj15 = <>O.<14>__ArenaMissionController_EndRound; if (obj15 == null) { hook_EndRound val15 = ArenaMissionController_EndRound; <>O.<14>__ArenaMissionController_EndRound = val15; obj15 = (object)val15; } ArenaMissionController.EndRound += (hook_EndRound)obj15; object obj16 = <>O.<15>__EquipmentSlot_FireRecycle; if (obj16 == null) { hook_FireRecycle val16 = EquipmentSlot_FireRecycle; <>O.<15>__EquipmentSlot_FireRecycle = val16; obj16 = (object)val16; } EquipmentSlot.FireRecycle += (hook_FireRecycle)obj16; } private static void ItemCatalog_Init(orig_Init orig) { orig.Invoke(); ItemLuckPlugin.TierList = TierList.Create(_config); UpdatableOptions.UpdateDescriptions(); } private static void ChestBehavior_Roll(orig_Roll orig, ChestBehavior self) { if (ItemLuckPlugin.UpdateLuckEnabled && Object.op_Implicit((Object)(object)self.dropTable)) { using (ReplaceDropTable(self.dropTable, "ChestBehavior_Roll")) { orig.Invoke(self); return; } } orig.Invoke(self); } private static void ShopTerminalBehavior_GenerateNewPickupServer_bool(orig_GenerateNewPickupServer_bool orig, ShopTerminalBehavior self, bool newHidden) { if (ItemLuckPlugin.UpdateLuckEnabled) { using (ReplaceDropTable(self.dropTable, "ShopTerminalBehavior_GenerateNewPickupServer_bool")) { orig.Invoke(self, newHidden); return; } } orig.Invoke(self, newHidden); } private static void RouletteChestController_GenerateEntriesServer(orig_GenerateEntriesServer orig, RouletteChestController self, FixedTimeStamp startTime) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) if (ItemLuckPlugin.UpdateLuckEnabled) { using (ReplaceDropTable(self.dropTable, "RouletteChestController_GenerateEntriesServer")) { orig.Invoke(self, startTime); return; } } orig.Invoke(self, startTime); } private static void ShrineChanceBehavior_AddShrineStack(orig_AddShrineStack orig, ShrineChanceBehavior self, Interactor activator) { if (ItemLuckPlugin.UpdateLuckEnabled) { using (ReplaceDropTable(self.dropTable, "ShrineChanceBehavior_AddShrineStack")) { orig.Invoke(self, activator); return; } } orig.Invoke(self, activator); } private static void BossGroup_DropRewards(orig_DropRewards orig, BossGroup self) { if (ItemLuckPlugin.UpdateLuckEnabled) { using (CompositeDisposable compositeDisposable = new CompositeDisposable()) { if (Object.op_Implicit((Object)(object)self.dropTable)) { compositeDisposable.Add(ReplaceDropTable(self.dropTable, "BossGroup_DropRewards")); } else { Log.Info("dropTable is " + (((object)self.dropTable)?.GetType().Name ?? "null")); } foreach (PickupDropTable item in self.bossDropTables.Distinct()) { compositeDisposable.Add(ReplaceDropTable(item, "BossGroup_DropRewards")); } orig.Invoke(self); return; } } orig.Invoke(self); } private static void Opening_FixedUpdate(orig_FixedUpdate orig, Opening self) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) if (ItemLuckPlugin.UpdateLuckEnabled) { ChestBehavior component = ((EntityState)self).GetComponent<ChestBehavior>(); BasicPickupDropTable dropTable = (BasicPickupDropTable)component.dropTable; using (CreateSelectorCopy(dropTable.selector, delegate(WeightedSelection<PickupIndex> x) { dropTable.selector = x; })) { dropTable.selector.Clear(); List<PickupIndex> list = new List<PickupIndex> { PickupCatalog.FindPickupIndex(MiscPickups.LunarCoin.miscPickupIndex) }; dropTable.Add(Run.instance.availableTier1DropList, component.tier1Chance / (float)Run.instance.availableTier1DropList.Count); dropTable.Add(Run.instance.availableTier2DropList, component.tier2Chance / (float)Run.instance.availableTier2DropList.Count); dropTable.Add(Run.instance.availableTier3DropList, component.tier3Chance / (float)Run.instance.availableTier3DropList.Count); dropTable.Add(Run.instance.availableLunarCombinedDropList, component.lunarChance / (float)Run.instance.availableLunarCombinedDropList.Count); dropTable.Add(list, component.lunarCoinChance); using (ReplaceDropTable((PickupDropTable)(object)dropTable, "Opening_FixedUpdate")) { orig.Invoke(self); return; } } } orig.Invoke(self); } private static void ChestBehavior_RollItem(orig_RollItem orig, ChestBehavior self) { if (ItemLuckPlugin.UpdateLuckEnabled) { self.Roll(); } else { orig.Invoke(self); } } private static PickupIndex FreeChestDropTable_GenerateDropPreReplacement(orig_GenerateDropPreReplacement orig, FreeChestDropTable self, Xoroshiro128Plus rng) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_000a: 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_003e: Unknown result type (might be due to invalid IL or missing references) if (ItemLuckPlugin.UpdateLuckEnabled) { orig.Invoke(self, rng); using (ReplaceDropTable((PickupDropTable)(object)self, "FreeChestDropTable_GenerateDropPreReplacement")) { return PickupDropTable.GenerateDropFromWeightedSelection(rng, self.selector); } } return orig.Invoke(self, rng); } private static PickupIndex DoppelgangerDropTable_GenerateDropPreReplacement(orig_GenerateDropPreReplacement orig, DoppelgangerDropTable self, Xoroshiro128Plus rng) { //IL_002b: 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_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (ItemLuckPlugin.UpdateLuckEnabled) { using (ReplaceDropTable((PickupDropTable)(object)self, "DoppelgangerDropTable_GenerateDropPreReplacement")) { return orig.Invoke(self, rng); } } return orig.Invoke(self, rng); } private static void SacrificeArtifactManager_OnServerCharacterDeath(orig_OnServerCharacterDeath orig, DamageReport damageReport) { if (ItemLuckPlugin.UpdateLuckEnabled) { using (ReplaceDropTable(SacrificeArtifactManager.dropTable, "SacrificeArtifactManager_OnServerCharacterDeath")) { orig.Invoke(damageReport); return; } } orig.Invoke(damageReport); } private static void OptionChestBehavior_Roll(orig_Roll orig, OptionChestBehavior self) { if (ItemLuckPlugin.UpdateLuckEnabled) { using (ReplaceDropTable(self.dropTable, "OptionChestBehavior_Roll")) { orig.Invoke(self); return; } } orig.Invoke(self); } private static void InfiniteTowerWaveController_DropRewards(orig_DropRewards orig, InfiniteTowerWaveController self) { if (ItemLuckPlugin.UpdateLuckEnabled) { using (ReplaceDropTable(self.rewardDropTable, "InfiniteTowerWaveController_DropRewards")) { orig.Invoke(self); return; } } orig.Invoke(self); } private static PickupIndex[] ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement(orig_GenerateUniqueDropsPreReplacement orig, ArenaMonsterItemDropTable self, int maxDrops, Xoroshiro128Plus rng) { if (ItemLuckPlugin.UpdateLuckEnabled) { using (ReplaceDropTable((PickupDropTable)(object)self, "ArenaMonsterItemDropTable_GenerateUniqueDropsPreReplacement")) { return orig.Invoke(self, maxDrops, rng); } } return orig.Invoke(self, maxDrops, rng); } private static void ArenaMissionController_EndRound(orig_EndRound orig, ArenaMissionController self) { if (ItemLuckPlugin.UpdateLuckEnabled) { using (CompositeDisposable compositeDisposable = new CompositeDisposable()) { PickupDropTable[] playerRewardOrder = self.playerRewardOrder; foreach (PickupDropTable dropTable in playerRewardOrder) { compositeDisposable.Add(ReplaceDropTable(dropTable, "ArenaMissionController_EndRound")); } orig.Invoke(self); return; } } orig.Invoke(self); } private static bool EquipmentSlot_FireRecycle(orig_FireRecycle orig, EquipmentSlot self) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //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_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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_0110: Unknown result type (might be due to invalid IL or missing references) if (!ItemLuckPlugin.UpdateLuckEnabled) { return orig.Invoke(self); } self.UpdateTargets(Equipment.Recycle.equipmentIndex, false); GenericPickupController pickupController = self.currentTarget.pickupController; if (!Object.op_Implicit((Object)(object)pickupController) || pickupController.Recycled) { return false; } PickupIndex initialPickupIndex = pickupController.pickupIndex; self.subcooldownTimer = 0.2f; List<PickupIndex> list = (from pickupIndex in PickupTransmutationManager.GetAvailableGroupFromPickupIndex(pickupController.pickupIndex) where pickupIndex != initialPickupIndex select pickupIndex).ToList(); if (list == null || list.Count == 0) { return false; } WeightedSelection<PickupIndex> val = new WeightedSelection<PickupIndex>(list.Count); foreach (PickupIndex item in list) { val.AddChoice(item, 1f); } ReplaceSelector(val, "EquipmentSlot_FireRecycle", null); pickupController.NetworkpickupIndex = val.Evaluate(Run.instance.treasureRng.nextNormalizedFloat); EffectManager.SimpleEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/OmniEffect/OmniRecycleEffect"), ((Component)pickupController.pickupDisplay).transform.position, Quaternion.identity, true); pickupController.NetworkRecycled = true; self.InvalidateCurrentTarget(); return true; } private static IDisposable ReplaceDropTable(PickupDropTable dropTable, string caller) { BasicPickupDropTable basicDropTable = (BasicPickupDropTable)(object)((dropTable is BasicPickupDropTable) ? dropTable : null); if (basicDropTable != null) { IDisposable result = CreateSelectorCopy(basicDropTable.selector, delegate(WeightedSelection<PickupIndex> x) { basicDropTable.selector = x; }); ReplaceSelector(basicDropTable.selector, caller, dropTable); return result; } ExplicitPickupDropTable explicitDropTable = (ExplicitPickupDropTable)(object)((dropTable is ExplicitPickupDropTable) ? dropTable : null); if (explicitDropTable != null) { IDisposable result2 = CreateSelectorCopy(explicitDropTable.weightedSelection, delegate(WeightedSelection<PickupIndex> x) { explicitDropTable.weightedSelection = x; }); ReplaceSelector(explicitDropTable.weightedSelection, caller, dropTable); return result2; } FreeChestDropTable freeChestDropTable = (FreeChestDropTable)(object)((dropTable is FreeChestDropTable) ? dropTable : null); if (freeChestDropTable != null) { IDisposable result3 = CreateSelectorCopy(freeChestDropTable.selector, delegate(WeightedSelection<PickupIndex> x) { freeChestDropTable.selector = x; }); ReplaceSelector(freeChestDropTable.selector, caller, dropTable); return result3; } DoppelgangerDropTable doppelgangerDropTable = (DoppelgangerDropTable)(object)((dropTable is DoppelgangerDropTable) ? dropTable : null); if (doppelgangerDropTable != null) { IDisposable result4 = CreateSelectorCopy(doppelgangerDropTable.selector, delegate(WeightedSelection<PickupIndex> x) { doppelgangerDropTable.selector = x; }); ReplaceSelector(doppelgangerDropTable.selector, caller, dropTable); return result4; } ArenaMonsterItemDropTable arenaMonsterItemDropTable = (ArenaMonsterItemDropTable)(object)((dropTable is ArenaMonsterItemDropTable) ? dropTable : null); if (arenaMonsterItemDropTable != null) { IDisposable result5 = CreateSelectorCopy(arenaMonsterItemDropTable.selector, delegate(WeightedSelection<PickupIndex> x) { arenaMonsterItemDropTable.selector = x; }); ReplaceSelector(arenaMonsterItemDropTable.selector, caller, dropTable); return result5; } Log.Warning("Failed to override " + caller + " dropTable"); Log.Warning(caller + " dropTable is of type " + (((object)dropTable)?.GetType().FullName ?? "null")); return Disposable.Empty; } private static void ReplaceSelector(WeightedSelection<PickupIndex> selector, string caller, PickupDropTable dropTable) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < selector.Count; i++) { ref ChoiceInfo<PickupIndex> reference = ref selector.choices[i]; float weight = reference.weight; float num = (ItemLuckPlugin.TierList.GetTier(((PickupIndex)(ref reference.value)).itemIndex) ?? ItemLuckPlugin.TierList.GetTier(((PickupIndex)(ref reference.value)).equipmentIndex) ?? Tier.Unspecified).ApplyItemLuck(reference.weight); selector.ModifyChoiceWeight(i, num); Log.Debug($"{Language.GetString(((PickupIndex)(ref reference.value)).pickupDef.nameToken)} weight changed from {weight} to {num}"); } Log.Debug(caller + " " + ((object)dropTable)?.GetType()?.Name + " (" + ((dropTable != null) ? ((Object)dropTable).name : null) + ") replaced"); } private static IDisposable CreateSelectorCopy(WeightedSelection<PickupIndex> selector, Action<WeightedSelection<PickupIndex>> setSelector) { WeightedSelection<PickupIndex> oldSelector = selector; setSelector(new WeightedSelection<PickupIndex>(8) { Capacity = selector.Capacity, choices = selector.choices.ToArray(), totalWeight = selector.totalWeight, Count = selector.Count }); return new Disposable(delegate { setSelector(oldSelector); }); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("Lawlzee.ItemLuck", "ItemLuck", "1.0.1")] public class ItemLuckPlugin : BaseUnityPlugin { public const string PluginGUID = "Lawlzee.ItemLuck"; public const string PluginAuthor = "Lawlzee"; public const string PluginName = "ItemLuck"; public const string PluginVersion = "1.0.1"; public static ConfigEntry<bool> ModEnabled; public static ConfigEntry<float> ItemLuck; public static TierList TierList; public static bool UpdateLuckEnabled { get { if (ModEnabled.Value) { return ItemLuck.Value != 0f; } return false; } } public void Awake() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: 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_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) Log.Init(((BaseUnityPlugin)this).Logger); ModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Configuration", "Mod enabled", true, "Mod enabled"); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ModEnabled)); ItemLuck = ((BaseUnityPlugin)this).Config.Bind<float>("Configuration", "Item luck", 2f, "Controls the item luck"); UpdatableStepSliderOption option = new UpdatableStepSliderOption(ItemLuck, new StepSliderConfig { min = -8f, max = 8f, increment = 0.05f, formatString = "{0:+0.##;-0.##;0.##}" }); ModSettingsManager.AddOption((BaseOption)(object)option); ItemLuck.SettingChanged += delegate { UpdatableOptions.UpdateDescriptions(); option.UpdatePanel(); }; Texture2D val = LoadTexture("icon.png"); ModSettingsManager.SetModIcon(Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0f, 0f))); Hooks.Init(((BaseUnityPlugin)this).Config); } private Texture2D LoadTexture(string name) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_002a: Expected O, but got Unknown Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, File.ReadAllBytes(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), name))); return val; } } public static class ItemTierExtensions { public static string GetShortName(this ItemTier itemTier) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected I4, but got Unknown return (int)itemTier switch { 0 => "White items", 1 => "Green items", 2 => "Red items", 3 => "Lunar items", 4 => "Boss items", 6 => "Void items", 7 => "Void items", 8 => "Void items", 9 => "Void items", _ => "Other items", }; } public static string GetFullName(this ItemTier itemTier) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected I4, but got Unknown return (int)itemTier switch { 0 => "White items", 1 => "Green items", 2 => "Red items", 3 => "Lunar items", 4 => "Boss items", 6 => "Void white items", 7 => "Void green items", 8 => "Void red items", 9 => "Void boss items", _ => "Other items", }; } } 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 enum Tier { S, A, B, C, D, F, Unspecified } public static class TierExtensions { public static float ToMultiplier(this Tier tier) { return tier switch { Tier.S => 1f, Tier.A => 0.6f, Tier.B => 0.2f, Tier.C => -0.2f, Tier.D => -0.6f, Tier.F => -1f, _ => 0f, }; } public static float ApplyItemLuck(this Tier itemTier, float currentWeigth) { float num = itemTier.ToMultiplier(); return 2f * currentWeigth / (1f + Mathf.Exp(num * ItemLuckPlugin.ItemLuck.Value * -0.8f)); } } public class Rank<T> { public T Def { get; } public Tier Tier { get; } public Rank(T index, Tier tier) { Def = index; Tier = tier; } } }