Please disclose if your mod was created primarily 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 Recipe Description Expansion v1.1.7
RecipeDescriptionExpansion.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("RecipeDescriptionExpansion")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Azumatt")] [assembly: AssemblyProduct("RecipeDescriptionExpansion")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")] [assembly: AssemblyFileVersion("1.1.7")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.7.0")] [module: UnverifiableCode] 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; } } } namespace RecipeDescriptionExpansion { public static class PlayerExtentions { public static IEnumerable<ItemData> GetEquipment(this Player player) { List<ItemData> list = new List<ItemData>(); if (((Humanoid)player).m_rightItem != null) { list.Add(((Humanoid)player).m_rightItem); } if (((Humanoid)player).m_leftItem != null) { list.Add(((Humanoid)player).m_leftItem); } if (((Humanoid)player).m_chestItem != null) { list.Add(((Humanoid)player).m_chestItem); } if (((Humanoid)player).m_legItem != null) { list.Add(((Humanoid)player).m_legItem); } if (((Humanoid)player).m_helmetItem != null) { list.Add(((Humanoid)player).m_helmetItem); } if (((Humanoid)player).m_shoulderItem != null) { list.Add(((Humanoid)player).m_shoulderItem); } if (((Humanoid)player).m_utilityItem != null) { list.Add(((Humanoid)player).m_utilityItem); } return list; } } public class Functions { internal static void RecipeDescTweaks(ref TMP_Text? recipeDesc) { //IL_0032: 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_0068: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)recipeDesc != (Object)null) { recipeDesc.enableAutoSizing = false; recipeDesc.fontSize = 18f; recipeDesc.rectTransform.anchorMin = new Vector2(0f, 1f); recipeDesc.rectTransform.anchorMax = new Vector2(1f, 1f); recipeDesc.rectTransform.pivot = new Vector2(0f, 1f); recipeDesc.textWrappingMode = (TextWrappingModes)1; recipeDesc.rectTransform.anchoredPosition = new Vector2(4f, 4f); ((Graphic)recipeDesc).raycastTarget = false; } } public static string CustomSetTooltip(ItemData itemData, SharedData sharedData) { //IL_0182: Unknown result type (might be due to invalid IL or missing references) string setName = (string.IsNullOrWhiteSpace(sharedData.m_setName) ? null : sharedData.m_setName); List<ItemData> list = ((setName != null) ? (from x in Player.m_localPlayer.GetEquipment() where (Object)(object)x.m_dropPrefab != (Object)null && x.m_shared.m_setName == setName select x).ToList() : new List<ItemData>()); int setSize = sharedData.m_setSize; string text = FormatSetName(itemData); string text2 = ((list.Count == setSize) ? "#96d4fd" : "#808080ff"); StringBuilder stringBuilder = new StringBuilder($"\n\n<color={text2}>{text} ({list.Count}/{setSize}):</color>\n"); if (setName != null) { foreach (string pieceName in RetrieveSetPieces(setName)) { bool num = list.Any((ItemData x) => ((Object)x.m_dropPrefab).name == pieceName); string text3 = (num ? "#FDFD96" : "#808080ff"); string text4 = (num ? "✔\ufe0f" : "❌"); stringBuilder.AppendLine("<color=#008000ff>" + text4 + "</color>\t├> <color=" + text3 + ">" + pieceName + "</color>"); } } float skillLevel = ((Character)Player.m_localPlayer).GetSkillLevel(sharedData.m_skillType); string text5 = itemData.GetSetStatusEffectTooltip(itemData.m_quality, skillLevel).Replace("\n", " "); stringBuilder.AppendLine("<color=" + text2 + ">└> [" + sharedData.m_setStatusEffect.m_name + "]" + Environment.NewLine + text5 + "</color>"); return stringBuilder.ToString(); } private static string FormatSetName(ItemData item) { string text = item.m_shared.m_setName ?? string.Empty; return string.Join(" ", from i in text.Split(new char[1] { ' ' }) select char.ToUpper(i[0]) + i.Substring(1).ToLower()); } private static List<string> RetrieveSetPieces(string setName) { if (!RecipeDescriptionExpansionPlugin.piecesWithSets.TryGetValue(setName, out List<string> value)) { return new List<string>(); } return new List<string>(value); } internal static GameObject GenScrollView(ref InventoryGui __instance) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: 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_0106: Expected O, but got Unknown //IL_0080: 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_00aa: 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) GameObject val = new GameObject("RecipeExpansionScrollView", new Type[3] { typeof(RectTransform), typeof(ScrollRect), typeof(Image) }); val.transform.SetParent(__instance.m_recipeDecription.transform.parent, false); val.transform.SetSiblingIndex(0); Transform transform = val.transform; RectTransform val2 = (RectTransform)(object)((transform is RectTransform) ? transform : null); if ((Object)(object)val2 != (Object)null) { val2.anchorMin = new Vector2(0f, 1f); val2.anchorMax = new Vector2(0f, 1f); val2.pivot = new Vector2(0f, 1f); val2.anchoredPosition = new Vector2(11f, -74f); val2.SetSizeWithCurrentAnchors((Axis)0, 330f); val2.SetSizeWithCurrentAnchors((Axis)1, 300f); } ((Graphic)val.GetComponent<Image>()).color = new Color(0f, 0f, 0f, 0.2f); return val; } internal static RectTransform GenViewPort(ref GameObject scrollRectGo, ref TMP_Text? recipeDesc) { //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_0053: 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) //IL_007d: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("RecipeExpansionViewport", new Type[2] { typeof(RectTransform), typeof(RectMask2D) }); val.transform.SetParent(scrollRectGo.transform, false); Transform transform = val.transform; RectTransform val2 = (RectTransform)(object)((transform is RectTransform) ? transform : null); val2.anchorMin = new Vector2(0f, 0f); val2.anchorMax = new Vector2(1f, 1f); val2.sizeDelta = new Vector2(0f, 0f); TMP_Text? obj = recipeDesc; if (obj != null) { obj.transform.SetParent((Transform)(object)val2, false); } return val2; } internal static ScrollRect GenScrollRect(ref GameObject scrollRectGo, ref TMP_Text? recipeDesc, ref RectTransform vrt) { ScrollRect component = scrollRectGo.GetComponent<ScrollRect>(); component.viewport = vrt; TMP_Text? obj = recipeDesc; component.content = ((obj != null) ? obj.rectTransform : null); component.horizontal = false; component.vertical = true; component.verticalScrollbarVisibility = (ScrollbarVisibility)1; component.scrollSensitivity = 40f; component.inertia = true; component.movementType = (MovementType)2; ((UnityEventBase)component.onValueChanged).RemoveAllListeners(); return component; } internal static void GenScrollBar(ref InventoryGui __instance, ref GameObject scrollRectGo, ref ScrollRect scrollRect) { Scrollbar newScrollbar = Object.Instantiate<Scrollbar>(__instance.m_recipeListScroll, scrollRectGo.transform); newScrollbar.size = 0.4f; ((UnityEvent<Vector2>)(object)scrollRect.onValueChanged).AddListener((UnityAction<Vector2>)delegate { newScrollbar.size = 0.4f; }); scrollRect.verticalScrollbar = newScrollbar; } } [BepInPlugin("Azumatt.RecipeDescriptionExpansion", "RecipeDescriptionExpansion", "1.1.7")] public class RecipeDescriptionExpansionPlugin : BaseUnityPlugin { internal const string ModName = "RecipeDescriptionExpansion"; internal const string ModVersion = "1.1.7"; internal const string Author = "Azumatt"; private const string ModGUID = "Azumatt.RecipeDescriptionExpansion"; public static bool EpicLootPluginInstalled; private readonly Harmony _harmony = new Harmony("Azumatt.RecipeDescriptionExpansion"); public static readonly ManualLogSource RecipeDescriptionExpansionLogger = Logger.CreateLogSource("RecipeDescriptionExpansion"); public static Dictionary<string, List<string>> piecesWithSets = new Dictionary<string, List<string>>(); public void Awake() { Assembly executingAssembly = Assembly.GetExecutingAssembly(); _harmony.PatchAll(executingAssembly); } public void Start() { Chainloader.PluginInfos.TryGetValue("randyknapp.mods.epicloot", out var value); if (value != null && (Object)(object)value.Instance != (Object)null) { EpicLootPluginInstalled = true; } } private void OnDestroy() { ((BaseUnityPlugin)this).Config.Save(); } } [HarmonyPatch(typeof(InventoryGui), "UpdateRecipe")] [HarmonyAfter(new string[] { "org.bepinex.plugins.jewelcrafting" })] [HarmonyPriority(700)] public static class InventoryGuiUpdateRecipePatch { public static void Postfix(InventoryGui __instance) { TMP_Text recipeDesc = __instance.m_recipeDecription; if ((Object)(object)recipeDesc == (Object)null) { return; } Chainloader.PluginInfos.TryGetValue("org.bepinex.plugins.jewelcrafting", out var value); if (value != null && __instance.InCraftTab() && (Object)(object)value.Instance != (Object)null) { if (__instance.m_itemCraftType.text.Length > 0) { recipeDesc.text = recipeDesc.text + Environment.NewLine + Environment.NewLine + "<color=yellow>" + __instance.m_itemCraftType.text + "</color>"; } __instance.m_itemCraftType.text = ""; } if (!((Object)(object)((Component)recipeDesc).GetComponent<ContentSizeFitter>() != (Object)null)) { ((Component)recipeDesc).gameObject.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2; Functions.RecipeDescTweaks(ref recipeDesc); GameObject scrollRectGo = Functions.GenScrollView(ref __instance); RectTransform vrt = Functions.GenViewPort(ref scrollRectGo, ref recipeDesc); ScrollRect scrollRect = Functions.GenScrollRect(ref scrollRectGo, ref recipeDesc, ref vrt); Functions.GenScrollBar(ref __instance, ref scrollRectGo, ref scrollRect); } } } [HarmonyPatch(typeof(ItemData), "GetTooltip", new Type[] { typeof(ItemData), typeof(int), typeof(bool), typeof(float), typeof(int) })] [HarmonyBefore(new string[] { "Azumatt.BindOnEquip" })] internal static class ItemDropItemDataPatch { [UsedImplicitly] [HarmonyPriority(0)] private static void Postfix(ItemData item, int qualityLevel, bool crafting, ref string __result) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) if (RecipeDescriptionExpansionPlugin.EpicLootPluginInstalled || item == null || (Object)(object)Player.m_localPlayer == (Object)null) { return; } float skillLevel = ((Character)Player.m_localPlayer).GetSkillLevel(item.m_shared.m_skillType); if (item.GetSetStatusEffectTooltip(qualityLevel, skillLevel).Length > 0) { int num = __result.IndexOf("\n\n$item_seteffect", StringComparison.InvariantCulture); if (num >= 0) { __result = __result.Remove(num); __result = __result.Insert(num, Functions.CustomSetTooltip(item, item.m_shared)); } } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] internal static class GrabItemsFromDBObjectDBAwakePatch { [HarmonyPriority(0)] private static void Postfix(ObjectDB __instance) { RecipeDescriptionExpansionPlugin.piecesWithSets.Clear(); ItemDrop val = default(ItemDrop); foreach (GameObject item in __instance.m_items) { if (!((Object)(object)item == (Object)null) && item.TryGetComponent<ItemDrop>(ref val) && val.m_itemData?.m_shared != null && !string.IsNullOrEmpty(val.m_itemData.m_shared.m_setName)) { if (!RecipeDescriptionExpansionPlugin.piecesWithSets.TryGetValue(val.m_itemData.m_shared.m_setName, out List<string> value)) { value = new List<string>(); RecipeDescriptionExpansionPlugin.piecesWithSets[val.m_itemData.m_shared.m_setName] = value; } value.Add(((Object)val).name); } } } } }