using 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);
}
}
}
}
}