using System; using System.Collections.Generic; 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 BepInEx; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; 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(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("CheekyEntity")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Extracts all game item data")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+a7c309e846cb50fa6e998eb4e93d8fe058a1ab75")] [assembly: AssemblyProduct("ItemExtractor")] [assembly: AssemblyTitle("ItemExtractor")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ItemExtractor { [BepInPlugin("ItemExtractor", "ItemExtractor", "1.0.0")] public class Plugin : BasePlugin { internal static ManualLogSource Log; public override void Load() { Log = ((BasePlugin)this).Log; Log.LogInfo((object)"ItemExtractor loaded. Press F10 to export all item data."); ((BasePlugin)this).AddComponent(); } } public class ItemExtractorComponent : MonoBehaviour { private bool _extracted = false; public ItemExtractorComponent(IntPtr ptr) : base(ptr) { } private void Update() { if (Input.GetKeyDown((KeyCode)291) && !_extracted) { _extracted = true; ExtractItems(); } } private void ExtractItems() { //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: 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) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0fd1: Unknown result type (might be due to invalid IL or missing references) //IL_0fd8: Expected O, but got Unknown //IL_1034: Unknown result type (might be due to invalid IL or missing references) //IL_103b: Expected O, but got Unknown //IL_106a: Unknown result type (might be due to invalid IL or missing references) //IL_1071: Expected O, but got Unknown //IL_02ed: Unknown result type (might be due to invalid IL or missing references) //IL_02f2: Unknown result type (might be due to invalid IL or missing references) //IL_03b8: Unknown result type (might be due to invalid IL or missing references) //IL_03bd: Unknown result type (might be due to invalid IL or missing references) //IL_040f: Unknown result type (might be due to invalid IL or missing references) //IL_0415: Invalid comparison between Unknown and I4 //IL_043b: Unknown result type (might be due to invalid IL or missing references) Plugin.Log.LogInfo((object)"[ItemExtractor] Starting item extraction..."); if (ItemManager.AllItems == null) { Plugin.Log.LogError((object)"[ItemExtractor] ItemManager.AllItems is null!"); return; } List list = new List(); Enumerator enumerator = ItemManager.AllItems.GetEnumerator(); while (enumerator.MoveNext()) { Item current = enumerator.Current; if ((Object)(object)current == (Object)null || current.info == null) { continue; } string itemType = "Unknown"; if (current.info.itemTypes != null && current.info.itemTypes.Count > 0) { ItemType val = current.info.itemTypes[0]; itemType = ((object)(ItemType)(ref val)).ToString(); } ItemData obj = new ItemData { Name = (current.info.itemName ?? "Unknown"), Description = (current.itemDescription ?? "") }; Rarity rarity = current.info.rarity; obj.Rarity = ((object)(Rarity)(ref rarity)).ToString(); Sprite itemIcon = current.ItemIcon; obj.IconName = ((itemIcon != null) ? ((Object)itemIcon).name : null) ?? ""; obj.ItemType = itemType; obj.StatChanges = new List(); ItemData itemData = obj; if ((Object)(object)current.Weapon != (Object)null && current.Weapon.info != null) { itemData.WeaponStats = new WeaponStatsData { Damage = current.Weapon.info.damage, WeaponRange = current.Weapon.info.weaponRange, SwingSpeed = current.Weapon.info.swingSpeed, Knockback = current.Weapon.info.knockback, CriticalChance = current.Weapon.info.criticalChance, CriticalDamage = current.Weapon.info.criticalDamage, IsRanged = current.Weapon.info.isRanged, ReloadSpeed = current.Weapon.info.reloadSpeed }; } if ((Object)(object)current.FloorRange != (Object)null) { itemData.FloorRange = new FloorRangeData { StartFloor = current.FloorRange.startFloor, EndFloor = current.FloorRange.endFloor }; } StatType val2; if (current.StatChanges != null) { Enumerator enumerator2 = current.StatChanges.GetEnumerator(); while (enumerator2.MoveNext()) { StatChange current2 = enumerator2.Current; if (current2 != null) { List statChanges = itemData.StatChanges; StatChangeData statChangeData = new StatChangeData(); val2 = current2.stat; statChangeData.StatType = ((object)(StatType)(ref val2)).ToString(); statChangeData.Amount = current2.amount; statChanges.Add(statChangeData); } } } if (current.talentIDReferences != null) { Enumerator enumerator3 = current.talentIDReferences.GetEnumerator(); while (enumerator3.MoveNext()) { TalentScriptable current3 = enumerator3.Current; if (!((Object)(object)current3 == (Object)null)) { TalentData obj2 = new TalentData { Name = (((Object)current3).name ?? "Unknown"), TalentName = (current3.talentName ?? ""), Description = (current3.description ?? "") }; val2 = current3.statEffected; obj2.StatEffected = ((object)(StatType)(ref val2)).ToString(); obj2.StatChangePerPoint = current3.statChangePerPoint; obj2.MaxPoints = current3.maxPoints; TalentData item = obj2; itemData.Talents.Add(item); if (current3.statChangePerPoint != 0f && (int)current3.statEffected > 0) { itemData.StatChanges.Add(new StatChangeData { StatType = $"{current3.statEffected} (from {((Object)current3).name})", Amount = current3.statChangePerPoint }); } } } } list.Add(itemData); } list = (from i in list group i by i.Name into g select g.First()).ToList(); List> list2 = (from i in list group i by i.ItemType into g orderby g.Key select g).ToList(); string text = Path.Combine(Paths.PluginPath, "ItemExtractor", "items.txt"); Directory.CreateDirectory(Path.GetDirectoryName(text)); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("# Item Data Export"); StringBuilder stringBuilder2 = stringBuilder; StringBuilder stringBuilder3 = stringBuilder2; StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(13, 1, stringBuilder2); handler.AppendLiteral("# Generated: "); handler.AppendFormatted(DateTime.Now); stringBuilder3.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder4 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(15, 1, stringBuilder2); handler.AppendLiteral("# Total Items: "); handler.AppendFormatted(list.Count); stringBuilder4.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder5 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(14, 1, stringBuilder2); handler.AppendLiteral("# Categories: "); handler.AppendFormatted(list2.Count); stringBuilder5.AppendLine(ref handler); stringBuilder.AppendLine(); foreach (IGrouping item2 in list2) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder6 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(2, 1, stringBuilder2); handler.AppendLiteral("# "); handler.AppendFormatted(item2.Key); stringBuilder6.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder7 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(2, 1, stringBuilder2); handler.AppendLiteral("# "); handler.AppendFormatted(new string('=', item2.Key.Length)); stringBuilder7.AppendLine(ref handler); stringBuilder.AppendLine(); foreach (ItemData item3 in item2.OrderBy((ItemData i) => i.Name)) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder8 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(3, 1, stringBuilder2); handler.AppendLiteral("## "); handler.AppendFormatted(item3.Name); stringBuilder8.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder9 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(14, 1, stringBuilder2); handler.AppendLiteral("- **Rarity:** "); handler.AppendFormatted(item3.Rarity); stringBuilder9.AppendLine(ref handler); if (item3.FloorRange != null && (item3.FloorRange.StartFloor > 0 || item3.FloorRange.EndFloor > 0)) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder10 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(20, 2, stringBuilder2); handler.AppendLiteral("- **Floor Range:** "); handler.AppendFormatted(item3.FloorRange.StartFloor); handler.AppendLiteral("-"); handler.AppendFormatted(item3.FloorRange.EndFloor); stringBuilder10.AppendLine(ref handler); } stringBuilder2 = stringBuilder; StringBuilder stringBuilder11 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(19, 1, stringBuilder2); handler.AppendLiteral("- **Description:** "); handler.AppendFormatted(item3.Description); stringBuilder11.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder12 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(12, 1, stringBuilder2); handler.AppendLiteral("- **Icon:** "); handler.AppendFormatted(item3.IconName); stringBuilder12.AppendLine(ref handler); if (item3.WeaponStats != null) { stringBuilder.AppendLine("- **Weapon Stats:**"); stringBuilder2 = stringBuilder; StringBuilder stringBuilder13 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(12, 1, stringBuilder2); handler.AppendLiteral(" - Damage: "); handler.AppendFormatted(item3.WeaponStats.Damage); stringBuilder13.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder14 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(11, 1, stringBuilder2); handler.AppendLiteral(" - Range: "); handler.AppendFormatted(item3.WeaponStats.WeaponRange, "F1"); stringBuilder14.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder15 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(18, 1, stringBuilder2); handler.AppendLiteral(" - Attack Speed: "); handler.AppendFormatted(item3.WeaponStats.SwingSpeed, "F2"); stringBuilder15.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder16 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(15, 1, stringBuilder2); handler.AppendLiteral(" - Knockback: "); handler.AppendFormatted(item3.WeaponStats.Knockback, "F1"); stringBuilder16.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder17 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(22, 1, stringBuilder2); handler.AppendLiteral(" - Critical Chance: "); handler.AppendFormatted(item3.WeaponStats.CriticalChance, "F0"); handler.AppendLiteral("%"); stringBuilder17.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder18 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(22, 1, stringBuilder2); handler.AppendLiteral(" - Critical Damage: "); handler.AppendFormatted(item3.WeaponStats.CriticalDamage, "F0"); handler.AppendLiteral("%"); stringBuilder18.AppendLine(ref handler); if (item3.WeaponStats.IsRanged) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder19 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(18, 1, stringBuilder2); handler.AppendLiteral(" - Reload Speed: "); handler.AppendFormatted(item3.WeaponStats.ReloadSpeed, "F2"); stringBuilder19.AppendLine(ref handler); } } if (item3.StatChanges.Any()) { stringBuilder.AppendLine("- **Stats:**"); foreach (StatChangeData statChange in item3.StatChanges) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder20 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(6, 2, stringBuilder2); handler.AppendLiteral(" - "); handler.AppendFormatted(statChange.StatType); handler.AppendLiteral(": "); handler.AppendFormatted(statChange.Amount, "F1"); stringBuilder20.AppendLine(ref handler); } } if (item3.Talents.Any()) { stringBuilder.AppendLine("- **Talents:**"); foreach (TalentData talent in item3.Talents) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder21 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(8, 1, stringBuilder2); handler.AppendLiteral(" - **"); handler.AppendFormatted(talent.Name); handler.AppendLiteral("**"); stringBuilder21.AppendLine(ref handler); if (!string.IsNullOrEmpty(talent.TalentName)) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder22 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(20, 1, stringBuilder2); handler.AppendLiteral(" - Display Name: "); handler.AppendFormatted(talent.TalentName); stringBuilder22.AppendLine(ref handler); } if (!string.IsNullOrEmpty(talent.Description)) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder23 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(19, 1, stringBuilder2); handler.AppendLiteral(" - Description: "); handler.AppendFormatted(talent.Description); stringBuilder23.AppendLine(ref handler); } if (talent.StatChangePerPoint != 0f) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder24 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(29, 3, stringBuilder2); handler.AppendLiteral(" - Stat: "); handler.AppendFormatted(talent.StatEffected); handler.AppendLiteral(" = "); handler.AppendFormatted(talent.StatChangePerPoint, "F2"); handler.AppendLiteral(" (max "); handler.AppendFormatted(talent.MaxPoints); handler.AppendLiteral(" points)"); stringBuilder24.AppendLine(ref handler); } } } stringBuilder.AppendLine(); } } string text2 = Path.Combine(Paths.PluginPath, "ItemExtractor", "items.csv"); StringBuilder stringBuilder25 = new StringBuilder(); stringBuilder25.AppendLine("Name,Type,Rarity,StartFloor,EndFloor,Description,Stats,Talents,Icon"); foreach (IGrouping item4 in list2) { foreach (ItemData item5 in item4.OrderBy((ItemData i) => i.Name)) { string value = string.Join("; ", item5.StatChanges.Select((StatChangeData s) => $"{s.StatType}={s.Amount:F2}")); string value2 = string.Join("| ", item5.Talents.Select((TalentData tal) => (tal.StatChangePerPoint != 0f) ? $"{tal.Name}({tal.StatEffected}={tal.StatChangePerPoint:F2})" : tal.Name)); string value3 = item5.FloorRange?.StartFloor.ToString() ?? ""; string value4 = item5.FloorRange?.EndFloor.ToString() ?? ""; stringBuilder2 = stringBuilder25; StringBuilder stringBuilder26 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(26, 9, stringBuilder2); handler.AppendLiteral("\""); handler.AppendFormatted(item5.Name); handler.AppendLiteral("\",\""); handler.AppendFormatted(item5.ItemType); handler.AppendLiteral("\",\""); handler.AppendFormatted(item5.Rarity); handler.AppendLiteral("\",\""); handler.AppendFormatted(value3); handler.AppendLiteral("\",\""); handler.AppendFormatted(value4); handler.AppendLiteral("\",\""); handler.AppendFormatted(item5.Description.Replace("\"", "\"\"")); handler.AppendLiteral("\",\""); handler.AppendFormatted(value); handler.AppendLiteral("\",\""); handler.AppendFormatted(value2); handler.AppendLiteral("\",\""); handler.AppendFormatted(item5.IconName); handler.AppendLiteral("\""); stringBuilder26.AppendLine(ref handler); } } File.WriteAllText(text, stringBuilder.ToString()); File.WriteAllText(text2, stringBuilder25.ToString()); ManualLogSource log = Plugin.Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val3 = new BepInExInfoLogInterpolatedStringHandler(50, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("[ItemExtractor] Exported "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(list.Count); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" items in "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(list2.Count); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" categories to:"); } log.LogInfo(val3); ManualLogSource log2 = Plugin.Log; val3 = new BepInExInfoLogInterpolatedStringHandler(4, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" - "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(text); } log2.LogInfo(val3); ManualLogSource log3 = Plugin.Log; val3 = new BepInExInfoLogInterpolatedStringHandler(4, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" - "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(text2); } log3.LogInfo(val3); } } public class ItemData { public string Name { get; set; } public string Description { get; set; } public string Rarity { get; set; } public string IconName { get; set; } public string ItemType { get; set; } public List StatChanges { get; set; } = new List(); public List Talents { get; set; } = new List(); public WeaponStatsData WeaponStats { get; set; } public FloorRangeData FloorRange { get; set; } } public class WeaponStatsData { public int Damage { get; set; } public float WeaponRange { get; set; } public float SwingSpeed { get; set; } public float Knockback { get; set; } public float CriticalChance { get; set; } public float CriticalDamage { get; set; } public bool IsRanged { get; set; } public float ReloadSpeed { get; set; } } public class FloorRangeData { public int StartFloor { get; set; } public int EndFloor { get; set; } } public class TalentData { public string Name { get; set; } public string TalentName { get; set; } public string Description { get; set; } public string StatEffected { get; set; } public float StatChangePerPoint { get; set; } public int MaxPoints { get; set; } } public class StatChangeData { public string StatType { get; set; } public float Amount { get; set; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "ItemExtractor"; public const string PLUGIN_NAME = "ItemExtractor"; public const string PLUGIN_VERSION = "1.0.0"; } }