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