using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.NET.Common; using BepInExResoniteShim; using Elements.Core; using FrooxEngine; using FrooxEngine.Store; using FrooxEngine.UIX; using HarmonyLib; using SkyFrost.Base; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(/*Could not decode attribute arguments.*/)] [assembly: TargetFramework(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] [assembly: AssemblyCompany("art0007i")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.0.3.0")] [assembly: AssemblyInformationalVersion("2.0.3+03688bde11730e3a6abe53130ec0fbd91cb20f1d")] [assembly: AssemblyProduct("SpecialItemsLib")] [assembly: AssemblyTitle("SpecialItemsLib")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/art0007i/SpecialItemsLib")] [assembly: AssemblyVersion("2.0.3.0")] [module: RefSafetyRules(11)] namespace SpecialItemsLib; public class CustomSpecialItem { private Uri? Uri; internal ConfigEntry UriConfig; [field: CompilerGenerated] public SpecialItemType ItemType { [CompilerGenerated] get; } [field: CompilerGenerated] public string ReadableName { [CompilerGenerated] get; [CompilerGenerated] set; } public Uri? ItemUri { get { return Uri; } set { Uri = value; UriConfig.Value = ((object)value)?.ToString(); } } internal CustomSpecialItem(int type, string readableName, ConfigEntry config) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) UriConfig = config; ReadableName = readableName; ItemType = (SpecialItemType)type; Uri uri = default(Uri); if (Uri.TryCreate(UriConfig.Value, (UriKind)1, ref uri)) { Uri = uri; } else { Uri = null; } } } [ResonitePlugin("art0007i.SpecialItemsLib", "SpecialItemsLib", "2.0.3", "art0007i", "https://github.com/art0007i/SpecialItemsLib")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class SpecialItemsLib : BasePlugin { [HarmonyPatch(typeof(InventoryBrowser))] private class InventoryBrowser_ChangeEvents_Patch { [HarmonyPostfix] [HarmonyPatch("ProcessItem")] public static void PostProcess(InventoryItemUI item) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_0052: 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_0060: 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_006f: 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: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: 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) Record val = (Record)AccessTools.Field(((object)item).GetType(), "Item").GetValue((object)item); if (val == null) { return; } Uri url = val.GetUrl(((SkyFrostInterface)((Worker)item).Cloud).Platform); if (url == (Uri)null) { return; } SpecialItemType val2 = InventoryBrowser.ClassifyItem(item); Enumerator enumerator = CustomItems.GetEnumerator(); try { while (enumerator.MoveNext()) { KeyValuePair current = enumerator.Current; if ((int)current.Value.ItemType != 0 && val2 == current.Value.ItemType && url == current.Value.ItemUri) { ((SyncField)(object)((BrowserItem)item).NormalColor).Value = InventoryBrowser.FAVORITE_COLOR; Sync selectedColor = ((BrowserItem)item).SelectedColor; colorX fAVORITE_COLOR = InventoryBrowser.FAVORITE_COLOR; ((SyncField)(object)selectedColor).Value = ((colorX)(ref fAVORITE_COLOR)).MulA(2f); break; } } } finally { ((global::System.IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } } [HarmonyPostfix] [HarmonyPatch("OnAwake")] public static void PostAwake(InventoryBrowser __instance) { ActiveBrowsers.Add(__instance); } [HarmonyPostfix] [HarmonyPatch("OnDispose")] public static void PostDispose(InventoryBrowser __instance) { ActiveBrowsers.Remove(__instance); } } [HarmonyPatch(typeof(InventoryBrowser), "ClassifyItem")] private class InventoryBrowser_ClassifyItem_Patch { public static void Postfix(InventoryItemUI? itemui, ref SpecialItemType __result) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_0037: 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_0041: 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_004e: 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_0077: Expected I4, but got Unknown if (__result || itemui == null) { return; } Record val = (Record)AccessTools.Field(((object)itemui).GetType(), "Item").GetValue((object)itemui); if (val == null || val.Tags == null) { return; } Enumerator enumerator = CustomItems.GetEnumerator(); try { while (enumerator.MoveNext()) { KeyValuePair current = enumerator.Current; if ((int)current.Value.ItemType != 0 && val.Tags.Contains(current.Key)) { __result = (SpecialItemType)(int)current.Value.ItemType; } } } finally { ((global::System.IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } } } [HarmonyPatch(typeof(InventoryBrowser), "OnItemSelected")] private class InventoryBrowser_OnItemSelected_Patch { public static void Prefix(InventoryBrowser __instance, out SpecialItemType __state) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected I4, but got Unknown __state = (SpecialItemType)(int)((SyncField)(object)(AccessTools.Field(typeof(InventoryBrowser), "_lastSpecialItemType").GetValue((object)__instance) as Sync)).Value; } public unsafe static void Postfix(InventoryBrowser __instance, BrowserItem currentItem, SpecialItemType __state) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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) //IL_006b: 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) //IL_0090: 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_00af: 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_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: 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_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Expected O, but got Unknown //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Expected O, but got Unknown SpecialItemType val = InventoryBrowser.ClassifyItem((InventoryItemUI)(object)((currentItem is InventoryItemUI) ? currentItem : null)); Slot val2 = (AccessTools.Field(typeof(InventoryBrowser), "_buttonsRoot").GetValue((object)__instance) as SyncRef).Target[0]; Log.LogDebug((object)("Classified item is " + ((object)(*(SpecialItemType*)(&val))/*cast due to .constrained prefix*/).ToString())); if (__state == val) { return; } Dictionary customItems = CustomItems; Log.LogDebug((object)customItems.Count); Enumerator enumerator = customItems.GetEnumerator(); try { while (enumerator.MoveNext()) { KeyValuePair item = enumerator.Current; Log.LogDebug((object)("checking against " + ((object)item.Value.ItemType/*cast due to .constrained prefix*/).ToString())); if ((int)item.Value.ItemType == 0 || val != item.Value.ItemType) { continue; } UIBuilder val3 = new UIBuilder(val2, (Slot)null); val3.Style.PreferredWidth = BrowserDialog.DEFAULT_ITEM_SIZE * 3; RadiantUI_Constants.SetupDefaultStyle(val3, false); colorX purple = colorX.Purple; colorX white = colorX.White; MathX.Lerp(ref purple, ref white, 0.5f, (ColorProfileAwareOperation)0); Button but = val3.Button(Inspector.Pin, LocaleString.op_Implicit("Set " + item.Value.ReadableName)); ((Component)but).Slot.OrderOffset = -1L; but.LocalPressed += (ButtonEventHandler)delegate { object value = AccessTools.Field(typeof(InventoryItemUI), "Item").GetValue((object)__instance.SelectedInventoryItem); Uri val4 = ((Record)((value is Record) ? value : null)).GetUrl(((SkyFrostInterface)((Worker)but).Cloud).Platform); if (item.Value.ItemUri == val4) { val4 = null; } item.Value.ItemUri = val4; config.Save(); RefreshItems(); }; break; } } finally { ((global::System.IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } } } internal static ManualLogSource Log; internal static ConfigFile config; internal static Dictionary customItems = new Dictionary(); private static int CurrentSpecialItem = 20; private static readonly List ActiveBrowsers = new List(); public static Dictionary CustomItems => customItems; public override void Load() { Log = ((BasePlugin)this).Log; config = ((BasePlugin)this).Config; ((BasePlugin)this).HarmonyInstance.PatchAll(); } public static void RefreshItems() { //IL_0005: 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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown Enumerator enumerator = ActiveBrowsers.GetEnumerator(); try { while (enumerator.MoveNext()) { InventoryBrowser browser = enumerator.Current; if (((BrowserDialog)browser).CanInteract(((Worker)browser).LocalUser)) { ((ComponentBase)(object)browser).RunSynchronously((Action)delegate { ((MethodBase)AccessTools.Method(typeof(InventoryBrowser), "ReprocessItems", (global::System.Type[])null, (global::System.Type[])null)).Invoke((object)browser, (object[])null); }, false); } } } finally { ((global::System.IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } } public static CustomSpecialItem RegisterItem(string item_tag, string readable_name) { //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_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Expected O, but got Unknown //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Expected O, but got Unknown //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Expected O, but got Unknown //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Expected O, but got Unknown if (config == null) { throw new global::System.Exception("Tried to register special item before SpecialItemsLib was initialized. Make sure you've specified the correct BepInDependency attribute on your mod."); } Dictionary val = CustomItems; bool flag = default(bool); CustomSpecialItem result = default(CustomSpecialItem); if (val.TryGetValue(item_tag, ref result)) { ManualLogSource log = Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(64, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Tried to register '"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(item_tag); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("' special item twice, this should not happen."); } log.LogWarning(val2); return result; } Enumerator enumerator = Traverse.Create((object)config).Property>("OrphanedEntries", (object[])null).Value.GetEnumerator(); try { while (enumerator.MoveNext()) { KeyValuePair current = enumerator.Current; ManualLogSource log2 = Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(16, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("PRphan -> $"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(current.Key); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" == $"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(current.Value); } log2.LogWarning(val2); } } finally { ((global::System.IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } ConfigEntry val3 = config.Bind("Items", item_tag, (string)null, "The uri for your custom " + readable_name); Uri val4 = default(Uri); if (val3.Value != null && !Uri.TryCreate(val3.Value, (UriKind)1, ref val4)) { ManualLogSource log3 = Log; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(47, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Config for "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(item_tag); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" contains invalid uri '"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(val3.Value); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("', resetting."); } log3.LogWarning(val2); val3.Value = null; } ManualLogSource log4 = Log; BepInExDebugLogInterpolatedStringHandler val5 = new BepInExDebugLogInterpolatedStringHandler(20, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val5).AppendLiteral("Config value for "); ((BepInExLogInterpolatedStringHandler)val5).AppendFormatted(item_tag); ((BepInExLogInterpolatedStringHandler)val5).AppendLiteral(" = "); ((BepInExLogInterpolatedStringHandler)val5).AppendFormatted(val3.Value); } log4.LogDebug(val5); result = new CustomSpecialItem(CurrentSpecialItem++, readable_name, val3); val.Add(item_tag, result); ManualLogSource log5 = Log; val5 = new BepInExDebugLogInterpolatedStringHandler(41, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val5).AppendLiteral("adding new item "); ((BepInExLogInterpolatedStringHandler)val5).AppendFormatted(readable_name); ((BepInExLogInterpolatedStringHandler)val5).AppendLiteral(" ("); ((BepInExLogInterpolatedStringHandler)val5).AppendFormatted(item_tag); ((BepInExLogInterpolatedStringHandler)val5).AppendLiteral(") with special item id "); ((BepInExLogInterpolatedStringHandler)val5).AppendFormatted(CurrentSpecialItem - 1); } log5.LogDebug(val5); Log.LogDebug((object)("Special items count " + CustomItems.Count)); return result; } } public static class PluginMetadata { public const string GUID = "art0007i.SpecialItemsLib"; public const string NAME = "SpecialItemsLib"; public const string VERSION = "2.0.3"; public const string AUTHORS = "art0007i"; public const string REPOSITORY_URL = "https://github.com/art0007i/SpecialItemsLib"; }