using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using Microsoft.CodeAnalysis; using PerfectRandom.Sulfur.Core; using PerfectRandom.Sulfur.Core.CharacterStats; using PerfectRandom.Sulfur.Core.Items; using PerfectRandom.Sulfur.Core.Stats; using PerfectRandom.Sulfur.Core.UI; using PerfectRandom.Sulfur.Core.UI.Inventory; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("EnchantmentsUnbound")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+b30d3b45cbadd719ff2622c0f44f708547039289")] [assembly: AssemblyProduct("EnchantmentsUnbound")] [assembly: AssemblyTitle("EnchantmentsUnbound")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 EnchantmentsUnbound { public static class ModInfo { public const string Id = "lingyun67.enchantments_unbound"; public const string Name = "Enchantments Unbound"; public const string Version = "0.1.0"; } [BepInPlugin("lingyun67.enchantments_unbound", "Enchantments Unbound", "0.1.0")] public sealed class Plugin : BaseUnityPlugin { private Harmony harmony; private void Awake() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown harmony = new Harmony("lingyun67.enchantments_unbound"); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Enchantments Unbound loaded."); } private void OnDestroy() { if (harmony != null) { harmony.UnpatchSelf(); } } } } namespace EnchantmentsUnbound.Patches { [HarmonyPatch(typeof(InventoryItem))] internal static class InventoryItemPatches { [HarmonyPatch("IsEnchantmentCompatible", new Type[] { typeof(EnchantmentDefinition) })] [HarmonyPrefix] private static bool IsEnchantmentCompatiblePrefix(InventoryItem __instance, EnchantmentDefinition enchantment, ref bool __result) { __result = (Object)(object)enchantment != (Object)null && __instance.HasFreeEnchantmentSlot; return false; } [HarmonyPatch("GetRankLevelProgress")] [HarmonyPrefix] private static bool GetRankLevelProgressPrefix(InventoryItem __instance, ref float __result) { __result = CalculateUnlimitedRankProgress(__instance.GetExperience()); return false; } [HarmonyPatch("AddEnchantment")] [HarmonyPrefix] private static bool AddEnchantmentPrefix(InventoryItem __instance, ItemDefinition enchantmentItem, bool announce) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)enchantmentItem == (Object)null || !((EnchantmentId)(ref enchantmentItem.appliesEnchantment)).IsValid) { Debug.LogError((object)"Trying to add invalid enchantment item."); return false; } EnchantmentDefinition asset = AssetAccess.GetAsset(enchantmentItem.appliesEnchantment); if ((Object)(object)asset == (Object)null) { Debug.LogError((object)"Trying to add null enchantment."); return false; } asset.RegisterAppliedBy(enchantmentItem); __instance.enchantments.Add(asset); StaticInstance.Instance.EnchantmentAppliedToItem(asset, __instance.itemDefinition, __instance.enchantments.Count); if (HasRandomOilAttribute(asset)) { for (int i = 0; i < asset.modifiersApplied.Count; i++) { AddRandomOilAttributes(__instance, asset.modifiersApplied[i].attribute, asset); } } else { AddEnchantmentModifiers(__instance, asset, GlobalId.op_Implicit(((EnchantmentId)(ref asset.id)).AsGlobalId())); } if (announce) { StaticInstance.Instance.PlayClip((UISounds)6); } __instance.SyncWithInstancedVersion(); return false; } private static float CalculateUnlimitedRankProgress(float experience) { if (experience <= 0f) { return 0f; } float num = 0f; float num2 = 50f; int num3 = 0; while (experience >= num2 && num3 < 200) { num3++; num = num2; num2 *= 2.5f; } if (num2 <= num) { return num3; } return (float)num3 + (experience - num) / (num2 - num); } private static bool HasRandomOilAttribute(EnchantmentDefinition enchantment) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Invalid comparison between Unknown and I4 if (enchantment.modifiersApplied == null) { return false; } for (int i = 0; i < enchantment.modifiersApplied.Count; i++) { if ((int)enchantment.modifiersApplied[i].attribute == 84) { return true; } } return false; } private static void AddRandomOilAttributes(InventoryItem inventoryItem, ItemAttributes attribute, EnchantmentDefinition randomOilEnchantment) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Invalid comparison between Unknown and I4 //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) if ((int)attribute != 84) { return; } inventoryItem.enchantments.Remove(randomOilEnchantment); ItemDefinition val = null; EnchantmentDefinition val2 = null; LootTable enchantmentOilLootTable = StaticInstance.Instance.Settings.LootSettings.enchantmentOilLootTable; if ((Object)(object)enchantmentOilLootTable == (Object)null || enchantmentOilLootTable.entries == null) { return; } bool flag = false; int count = enchantmentOilLootTable.entries.Count; for (int i = 0; i < count; i++) { val = enchantmentOilLootTable.SelectOneItem(); if (!((Object)(object)val == (Object)null) && ((EnchantmentId)(ref val.appliesEnchantment)).IsValid) { val2 = AssetAccess.GetAsset(val.appliesEnchantment); if ((Object)(object)val2 != (Object)null && val2.modifiersApplied != null && randomOilEnchantment.id != val.appliesEnchantment && val2.modifiersApplied.Count > 0) { flag = true; break; } } } if (flag && !((Object)(object)val == (Object)null) && !((Object)(object)val2 == (Object)null)) { val2.RegisterAppliedBy(val); inventoryItem.enchantments.Add(val2); AddEnchantmentModifiers(inventoryItem, val2, GlobalId.op_Implicit(((EnchantmentId)(ref val.appliesEnchantment)).AsGlobalId())); } } private static void AddEnchantmentModifiers(InventoryItem inventoryItem, EnchantmentDefinition enchantment, uint sourceId) { //IL_002a: 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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown if (enchantment.modifiersApplied != null) { for (int i = 0; i < enchantment.modifiersApplied.Count; i++) { ItemModifierContainer val = enchantment.modifiersApplied[i]; inventoryItem.stats.AddModifier(val.attribute, new StatModifier(val.value, val.modType, sourceId)); } } } } [HarmonyPatch(typeof(Paperdoll), "GetItemsCompatibleWithEnchantment")] internal static class PaperdollEnchantmentHighlightPatch { private static bool Prefix(Paperdoll __instance, EnchantmentDefinition enchantment, ref List __result) { List list = new List(); List slots = __instance.GetSlots(); for (int i = 0; i < slots.Count; i++) { InventoryItem itemInSlot = slots[i].itemInSlot; if ((Object)(object)itemInSlot != (Object)null && itemInSlot.IsEnchantmentCompatible(enchantment)) { list.Add(itemInSlot); } } __result = list; return false; } } [HarmonyPatch(typeof(ItemGrid), "GetItemsCompatibleWithEnchantment")] internal static class ItemGridEnchantmentHighlightPatch { private static bool Prefix(ItemGrid __instance, EnchantmentDefinition enchantment, ref List __result) { List list = new List(); GridSlot[,] slots = __instance.Slots; int upperBound = slots.GetUpperBound(0); int upperBound2 = slots.GetUpperBound(1); for (int i = slots.GetLowerBound(0); i <= upperBound; i++) { for (int j = slots.GetLowerBound(1); j <= upperBound2; j++) { InventoryItem itemInSlot = slots[i, j].ItemInSlot; if ((Object)(object)itemInSlot != (Object)null && itemInSlot.IsEnchantmentCompatible(enchantment) && !list.Contains(itemInSlot)) { list.Add(itemInSlot); } } } if ((Object)(object)StaticInstance.Instance != (Object)null && (Object)(object)StaticInstance.Instance.Paperdoll != (Object)null) { list.AddRange(StaticInstance.Instance.Paperdoll.GetItemsCompatibleWithEnchantment(enchantment)); } __result = list; return false; } } }