Decompiled source of ItemExtractor v1.0.0

ItemExtractor.dll

Decompiled a day ago
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<ItemExtractorComponent>();
		}
	}
	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<ItemData> list = new List<ItemData>();
			Enumerator<Item> 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<StatChangeData>();
				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<StatChange> enumerator2 = current.StatChanges.GetEnumerator();
					while (enumerator2.MoveNext())
					{
						StatChange current2 = enumerator2.Current;
						if (current2 != null)
						{
							List<StatChangeData> 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<TalentScriptable> 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<IGrouping<string, ItemData>> 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<string, ItemData> 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<string, ItemData> 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<int>(list.Count);
				((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" items in ");
				((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<int>(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<string>(text);
			}
			log2.LogInfo(val3);
			ManualLogSource log3 = Plugin.Log;
			val3 = new BepInExInfoLogInterpolatedStringHandler(4, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("  - ");
				((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(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<StatChangeData> StatChanges { get; set; } = new List<StatChangeData>();


		public List<TalentData> Talents { get; set; } = new List<TalentData>();


		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";
	}
}