Decompiled source of DescriptiveWeaponStatShower v1.5.1

WeaponStatShower.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
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 System.Text.Json;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using CellMenu;
using GameData;
using Gear;
using HarmonyLib;
using Localization;
using Microsoft.CodeAnalysis;
using Player;
using UnityEngine;
using WeaponStatShower.Patches;
using WeaponStatShower.Utils;
using WeaponStatShower.Utils.Language;
using WeaponStatShower.Utils.Language.Models;

[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("WeaponStatShower")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+db84e45b9cd297f0140f6524308baafe188b06fd")]
[assembly: AssemblyProduct("WeaponStatShower")]
[assembly: AssemblyTitle("WeaponStatShower")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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 WeaponStatShower
{
	public static class BIEExtensions
	{
		public static ConfigEntry<T> GetConfigEntry<T>(this ConfigFile configFile, ConfigDefinition definition)
		{
			ConfigEntry<T> result = default(ConfigEntry<T>);
			if (!configFile.TryGetEntry<T>(definition, ref result))
			{
				throw new InvalidOperationException("Config entry has not been added yet.");
			}
			return result;
		}
	}
	[BepInPlugin("WeaponStatShower", "Weapon Stat Shower", "1.5.1")]
	[BepInProcess("GTFO.exe")]
	public class WeaponStatShowerPlugin : BasePlugin
	{
		internal const string ModName = "Weapon Stat Shower";

		internal const string GUID = "WeaponStatShower";

		private const string SectionMain = "Config";

		private static readonly ConfigDefinition configDefinition = new ConfigDefinition("Config", "Version");

		private static readonly ConfigDefinition ConfigGameVersion = new ConfigDefinition("Config", "GameVersion");

		private static Harmony HarmonyInstance;

		private static readonly Dictionary<Type, Patch> RegisteredPatches = new Dictionary<Type, Patch>();

		public static WeaponStatShowerPlugin Instance { get; private set; }

		public WeaponStatShowerPlugin()
		{
			((BasePlugin)this).Config.SaveOnConfigSet = false;
		}

		public override void Load()
		{
			Instance = this;
			((BasePlugin)this).Config.SaveOnConfigSet = true;
			LogInfo("STARTED");
			RegisterPatch<ShowStat>();
			((BasePlugin)this).Config.Save();
		}

		public static void RegisterPatch<T>() where T : Patch, new()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			if (HarmonyInstance == null)
			{
				HarmonyInstance = new Harmony("WeaponStatShower");
			}
			if (RegisteredPatches.ContainsKey(typeof(T)))
			{
				LogDebug("Ignoring duplicate patch: " + typeof(T).Name);
				return;
			}
			T val = new T
			{
				Harmony = HarmonyInstance
			};
			val.Initialize();
			if (val.Enabled)
			{
				LogInfo("Applying patch: " + val.Name);
				val.Execute();
			}
			RegisteredPatches[typeof(T)] = val;
		}

		public static void LogDebug(object data)
		{
			((BasePlugin)Instance).Log.LogDebug(data);
		}

		public static void LogError(object data)
		{
			((BasePlugin)Instance).Log.LogError(data);
		}

		public static void LogFatal(object data)
		{
			((BasePlugin)Instance).Log.LogFatal(data);
		}

		public static void LogInfo(object data)
		{
			((BasePlugin)Instance).Log.LogInfo(data);
		}

		public static void LogMessage(object data)
		{
			((BasePlugin)Instance).Log.LogMessage(data);
		}

		public static void LogWarning(object data)
		{
			((BasePlugin)Instance).Log.LogWarning(data);
		}
	}
}
namespace WeaponStatShower.Utils
{
	internal class SleepersDatas
	{
		private readonly Dictionary<string, float[]> EnemyDatas = new Dictionary<string, float[]>();

		private SleepersLanguageModel sleepersLanguageDatas;

		public SleepersDatas(string[] activatedSleepers, SleepersLanguageModel sleepersLanguageDatas)
		{
			this.sleepersLanguageDatas = sleepersLanguageDatas;
			foreach (string text in activatedSleepers)
			{
				switch (text.Trim())
				{
				case "DETAILS_ONLY":
				case "NONE":
					EnemyDatas.Clear();
					return;
				case "ALL":
					EnemyDatas.TryAdd(sleepersLanguageDatas.striker, new float[4] { 20f, 3f, 2f, 0f });
					EnemyDatas.TryAdd(sleepersLanguageDatas.shooter, new float[4] { 30f, 5f, 2f, 0f });
					EnemyDatas.TryAdd(sleepersLanguageDatas.scout, new float[4] { 42f, 3f, 2f, 0f });
					EnemyDatas.TryAdd(sleepersLanguageDatas.bigStriker, new float[4] { 120f, 1.5f, 2f, 0f });
					EnemyDatas.TryAdd(sleepersLanguageDatas.bigShooter, new float[4] { 150f, 2f, 2f, 0f });
					EnemyDatas.TryAdd(sleepersLanguageDatas.charger, new float[4] { 30f, 1f, 2f, 1f });
					EnemyDatas.TryAdd(sleepersLanguageDatas.chargerScout, new float[4] { 60f, 1f, 2f, 1f });
					return;
				case "STRIKER":
					EnemyDatas.TryAdd(sleepersLanguageDatas.striker, new float[4] { 20f, 3f, 2f, 0f });
					break;
				case "SHOOTER":
					EnemyDatas.TryAdd(sleepersLanguageDatas.shooter, new float[4] { 30f, 5f, 2f, 0f });
					break;
				case "SCOUT":
					EnemyDatas.TryAdd(sleepersLanguageDatas.scout, new float[4] { 42f, 3f, 2f, 0f });
					break;
				case "BIG_STRIKER":
					EnemyDatas.TryAdd(sleepersLanguageDatas.bigStriker, new float[4] { 120f, 1.5f, 2f, 0f });
					break;
				case "BIG_SHOOTER":
					EnemyDatas.TryAdd(sleepersLanguageDatas.bigShooter, new float[4] { 150f, 2f, 2f, 0f });
					break;
				case "CHARGER":
					EnemyDatas.TryAdd(sleepersLanguageDatas.charger, new float[4] { 30f, 1f, 2f, 1f });
					break;
				case "CHARGER_SCOUT":
					EnemyDatas.TryAdd(sleepersLanguageDatas.chargerScout, new float[4] { 60f, 1f, 2f, 1f });
					break;
				default:
					WeaponStatShowerPlugin.LogWarning("You inserted an incorrect value in the config: " + text.Trim());
					break;
				}
			}
		}

		public string VerboseKill(ArchetypeDataBlock archetypeDataBlock)
		{
			StringBuilder stringBuilder = new StringBuilder();
			float damage = archetypeDataBlock.Damage * (float)((archetypeDataBlock.ShotgunBulletCount <= 0) ? 1 : archetypeDataBlock.ShotgunBulletCount);
			float precisionDamageMulti = archetypeDataBlock.PrecisionDamageMulti;
			int num = 0;
			for (int i = 0; i < EnemyDatas.Count; i++)
			{
				string text = EnemyDatas.Keys.ElementAt(i);
				List<string> list = new List<string>();
				float[] currEnemyDatas = EnemyDatas[text];
				if (canKillOnOccipit(damage, precisionDamageMulti, currEnemyDatas))
				{
					list.Add(sleepersLanguageDatas.occipit);
				}
				if (canKillOnHead(damage, precisionDamageMulti, currEnemyDatas))
				{
					list.Add(sleepersLanguageDatas.head);
				}
				if (canKillOnBack(damage, currEnemyDatas))
				{
					list.Add(sleepersLanguageDatas.back);
				}
				if (canKillOnChest(damage, currEnemyDatas))
				{
					list.Add(sleepersLanguageDatas.chest);
				}
				if (list.Count > 0)
				{
					if (num % 2 == 1)
					{
						stringBuilder.Append(" | ");
					}
					list.Reverse();
					stringBuilder.Append(text + ": [" + string.Join(",", list.ToArray()) + "]");
					if (num++ % 2 == 1 && i != EnemyDatas.Count - 1)
					{
						stringBuilder.Append('\n');
					}
				}
			}
			return stringBuilder.ToString();
		}

		internal string? VerboseKill(MeleeArchetypeDataBlock archeTypeDataBlock)
		{
			StringBuilder stringBuilder = new StringBuilder();
			float num = archeTypeDataBlock.ChargedAttackDamage * archeTypeDataBlock.ChargedSleeperMulti;
			float chargedPrecisionMulti = archeTypeDataBlock.ChargedPrecisionMulti;
			int num2 = 0;
			for (int i = 0; i < EnemyDatas.Count; i++)
			{
				string text = EnemyDatas.Keys.ElementAt(i);
				if (text.Contains("SCOUT") || text.Contains("哨兵") || text.Contains("黑触"))
				{
					num /= archeTypeDataBlock.ChargedSleeperMulti;
				}
				List<string> list = new List<string>();
				float[] currEnemyDatas = EnemyDatas[text];
				if (canKillOnOccipit(num, chargedPrecisionMulti, currEnemyDatas))
				{
					list.Add(sleepersLanguageDatas.occipit);
				}
				if (canKillOnHead(num, chargedPrecisionMulti, currEnemyDatas))
				{
					list.Add(sleepersLanguageDatas.head);
				}
				if (canKillOnBack(num, currEnemyDatas))
				{
					list.Add(sleepersLanguageDatas.back);
				}
				if (canKillOnChest(num, currEnemyDatas))
				{
					list.Add(sleepersLanguageDatas.chest);
				}
				if (list.Count > 0)
				{
					if (num2 % 2 == 1)
					{
						stringBuilder.Append(" | ");
					}
					list.Reverse();
					stringBuilder.Append(text + ": [" + string.Join(",", list.ToArray()) + "]");
					if (num2++ % 2 == 1 && i != EnemyDatas.Count - 1)
					{
						stringBuilder.Append('\n');
					}
				}
			}
			return stringBuilder.ToString();
		}

		private bool canKillOnChest(float damage, float[] currEnemyDatas)
		{
			return damage >= currEnemyDatas[0];
		}

		private bool canKillOnBack(float damage, float[] currEnemyDatas)
		{
			return damage * currEnemyDatas[2] >= currEnemyDatas[0];
		}

		private bool canKillOnHead(float damage, float prcsnMultiplier, float[] currEnemyDatas)
		{
			if (isArmored(currEnemyDatas))
			{
				return damage * currEnemyDatas[1] >= currEnemyDatas[0];
			}
			return damage * prcsnMultiplier * currEnemyDatas[1] >= currEnemyDatas[0];
		}

		private bool canKillOnOccipit(float damage, float prcsnMultiplier, float[] currEnemyDatas)
		{
			if (isArmored(currEnemyDatas))
			{
				return damage * currEnemyDatas[2] * currEnemyDatas[1] >= currEnemyDatas[0];
			}
			return damage * prcsnMultiplier * currEnemyDatas[2] * currEnemyDatas[1] >= currEnemyDatas[0];
		}

		private bool isArmored(float[] currEnemyDatas)
		{
			return currEnemyDatas[3] == 1f;
		}
	}
	internal class WeaponDescriptionBuilder
	{
		private SleepersDatas sleepersDatas;

		private PlayerDataBlock _playerDataBlock;

		private GearIDRange idRange;

		private uint categoryID;

		private GearCategoryDataBlock gearCatBlock;

		private ItemDataBlock itemDataBlock;

		private LanguageDatas languageDatas;

		private const string DIVIDER = " | ";

		private const string CLOSE_COLOR_TAG = "</color>";

		internal void Inizialize(GearIDRange idRange, PlayerDataBlock playerDataBlock, LanguageEnum language)
		{
			this.idRange = idRange;
			_playerDataBlock = playerDataBlock;
			categoryID = idRange.GetCompID((eGearComponent)2);
			gearCatBlock = GameDataBlockBase<GearCategoryDataBlock>.GetBlock(categoryID);
			itemDataBlock = GameDataBlockBase<ItemDataBlock>.GetBlock(gearCatBlock.BaseItem);
			languageDatas = desirializeLanguageJson(language);
		}

		public void UpdateSleepersDatas(string[] activatedSleepers, LanguageEnum language)
		{
			if (activatedSleepers[0].Trim().Length == 0)
			{
				WeaponStatShowerPlugin.LogWarning("Empty String in the config file, applying Default values");
				activatedSleepers = new string[1] { "ALL" };
			}
			sleepersDatas = new SleepersDatas(activatedSleepers, desirializeLanguageJson(language).sleepers);
		}

		private LanguageDatas desirializeLanguageJson(LanguageEnum language)
		{
			LanguageDatasClass languageDatasClass = JsonSerializer.Deserialize<LanguageDatasClass>(LocalizedString.JsonString);
			return language.Equals(LanguageEnum.English) ? languageDatasClass.english : languageDatasClass.chinese;
		}

		public string DescriptionFormatter(string GearDescription)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Invalid comparison between Unknown and I4
			//IL_0057: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			if ((int)itemDataBlock.inventorySlot == 10)
			{
				MeleeArchetypeDataBlock block = GameDataBlockBase<MeleeArchetypeDataBlock>.GetBlock(GearBuilder.GetMeleeArchetypeID(gearCatBlock));
				GearDescription = VerboseDescriptionFormatter(block);
				return GearDescription + "\n\n" + GetFormatedWeaponStats(block, itemDataBlock);
			}
			eWeaponFireMode val = (eWeaponFireMode)idRange.GetCompID((eGearComponent)1);
			bool flag = categoryID == 12;
			ArchetypeDataBlock val2 = (flag ? SentryGunInstance_Firing_Bullets.GetArchetypeDataForFireMode(val) : GameDataBlockBase<ArchetypeDataBlock>.GetBlock(GearBuilder.GetArchetypeID(gearCatBlock, val)));
			if (val2 == null)
			{
				return GearDescription;
			}
			GearDescription = VerboseDescriptionFormatter(val2, flag);
			return GearDescription + GetFormatedWeaponStats(val2, flag);
		}

		internal string FireRateFormatter(string gearPublicName)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Invalid comparison between Unknown and I4
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: 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)
			if ((int)itemDataBlock.inventorySlot == 10)
			{
				MeleeArchetypeDataBlock block = GameDataBlockBase<MeleeArchetypeDataBlock>.GetBlock(GearBuilder.GetMeleeArchetypeID(gearCatBlock));
				return VerbosePublicNameMelee(block);
			}
			eWeaponFireMode val = (eWeaponFireMode)idRange.GetCompID((eGearComponent)1);
			ArchetypeDataBlock val2 = ((categoryID == 12) ? SentryGunInstance_Firing_Bullets.GetArchetypeDataForFireMode(val) : GameDataBlockBase<ArchetypeDataBlock>.GetBlock(GearBuilder.GetArchetypeID(gearCatBlock, val)));
			if (val2 == null)
			{
				return gearPublicName;
			}
			return VerbosePublicNameFireMode(val2);
		}

		private string VerbosePublicNameMelee(MeleeArchetypeDataBlock meleeArchetypeDataBlock)
		{
			MeleeLanguageModel melee = languageDatas.melee;
			return ((GameDataBlockBase<MeleeArchetypeDataBlock>)(object)meleeArchetypeDataBlock).persistentID switch
			{
				1u => melee.hammer, 
				2u => melee.knife, 
				4u => melee.bat, 
				3u => melee.spear, 
				_ => "", 
			};
		}

		private string VerbosePublicNameFireMode(ArchetypeDataBlock archetypeDataBlock)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected I4, but got Unknown
			//IL_0110: 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_0326: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			FiremodeLanguageModel firemode = languageDatas.firemode;
			eWeaponFireMode fireMode = archetypeDataBlock.FireMode;
			StringBuilder stringBuilder = new StringBuilder();
			eWeaponFireMode val = fireMode;
			eWeaponFireMode val2 = val;
			switch ((int)val2)
			{
			case 2:
			case 11:
				stringBuilder.Append(firemode.fullA + " (");
				stringBuilder.Append("<#12FF50>");
				stringBuilder.Append(languageDatas.rateOfFire + " ");
				stringBuilder.Append(GetRateOfFire(archetypeDataBlock, fireMode));
				stringBuilder.Append("</color>");
				stringBuilder.Append(")");
				break;
			case 0:
			case 10:
				stringBuilder.Append(firemode.semiA + " (");
				stringBuilder.Append("<#12FF50>");
				stringBuilder.Append(languageDatas.rateOfFire + " ");
				stringBuilder.Append(GetRateOfFire(archetypeDataBlock, fireMode));
				stringBuilder.Append("</color>");
				stringBuilder.Append(")");
				break;
			case 1:
			case 12:
				if (archetypeDataBlock.BurstShotCount != 1)
				{
					stringBuilder.Append(firemode.burst + " (");
					stringBuilder.Append("<#704dfa>");
					stringBuilder.Append("#" + archetypeDataBlock.BurstShotCount);
					stringBuilder.Append("</color>");
					stringBuilder.Append(" | ");
					stringBuilder.Append("<#12FF50>");
					stringBuilder.Append(languageDatas.rateOfFire + " ");
					stringBuilder.Append(GetRateOfFire(archetypeDataBlock, fireMode));
					stringBuilder.Append("</color>");
					stringBuilder.Append(")");
				}
				else
				{
					stringBuilder.Append(firemode.semiA + " (");
					stringBuilder.Append("<#12FF50>");
					stringBuilder.Append(languageDatas.rateOfFire + " ");
					stringBuilder.Append(GetRateOfFire(archetypeDataBlock, (eWeaponFireMode)0));
					stringBuilder.Append("</color>");
					stringBuilder.Append(")");
				}
				break;
			case 3:
				stringBuilder.Append("S-Burst (");
				stringBuilder.Append("<#12FF50>");
				stringBuilder.Append("#" + archetypeDataBlock.BurstShotCount);
				stringBuilder.Append(" every " + archetypeDataBlock.SpecialSemiBurstCountTimeout + "'");
				stringBuilder.Append("</color>");
				stringBuilder.Append(")");
				break;
			case 13:
				stringBuilder.Append(firemode.shotgunSentry + " (");
				stringBuilder.Append("<#12FF50>");
				stringBuilder.Append(languageDatas.rateOfFire + " ");
				stringBuilder.Append(GetRateOfFire(archetypeDataBlock, fireMode));
				stringBuilder.Append("</color>");
				stringBuilder.Append(")");
				break;
			default:
				WeaponStatShowerPlugin.LogError("FireMode not found");
				break;
			}
			return stringBuilder.ToString();
		}

		private string VerboseDescriptionFormatter(MeleeArchetypeDataBlock meleeArchetypeDataBlock)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.AppendLine(((double)meleeArchetypeDataBlock.CameraDamageRayLength < 1.76) ? languageDatas.melee.shortRange : (((double)meleeArchetypeDataBlock.CameraDamageRayLength < 2.5) ? languageDatas.melee.mediumRange : languageDatas.melee.longRange));
			stringBuilder.Append(meleeArchetypeDataBlock.CanHitMultipleEnemies ? (languageDatas.melee.canPierce + "\n") : "");
			return "".Equals(stringBuilder.ToString()) ? "" : (stringBuilder.ToString() + "\n");
		}

		private string VerboseDescriptionFormatter(ArchetypeDataBlock archetypeDataBlock, bool isSentryGun)
		{
			StringBuilder stringBuilder = new StringBuilder();
			SpreadLanguageModel spread = languageDatas.spread;
			if (isSentryGun)
			{
				stringBuilder.AppendLine(languageDatas.deployable);
			}
			switch (archetypeDataBlock.ShotgunBulletSpread + archetypeDataBlock.ShotgunConeSize)
			{
			case 1:
				stringBuilder.AppendLine(spread.chocked);
				break;
			case 4:
				stringBuilder.AppendLine(spread.small);
				break;
			case 5:
				stringBuilder.AppendLine(spread.medium);
				break;
			case 7:
				stringBuilder.AppendLine(spread.medium);
				break;
			case 9:
				stringBuilder.AppendLine(spread.huge);
				break;
			default:
				WeaponStatShowerPlugin.LogError(LocalizedText.op_Implicit(archetypeDataBlock.PublicName) + ": spread not considered{" + archetypeDataBlock.ShotgunBulletSpread + "/" + archetypeDataBlock.ShotgunConeSize + "}");
				break;
			case 0:
				break;
			}
			if (archetypeDataBlock.SpecialChargetupTime > 0f)
			{
				stringBuilder.AppendLine(((double)archetypeDataBlock.SpecialChargetupTime > 0.4) ? $"{languageDatas.longChargeUp} ({FormatFloat(archetypeDataBlock.SpecialChargetupTime, 2)})" : $"{languageDatas.shortChargeUp} ({FormatFloat(archetypeDataBlock.SpecialChargetupTime, 2)})");
			}
			return "".Equals(stringBuilder.ToString()) ? "" : (stringBuilder.ToString() + "\n");
		}

		private string GetFormatedWeaponStats(ArchetypeDataBlock archeTypeDataBlock, bool isSentryGun = false)
		{
			//IL_0322: Unknown result type (might be due to invalid IL or missing references)
			if (archeTypeDataBlock == null)
			{
				return string.Empty;
			}
			bool isChinese = !languageDatas.damage.Equals("Dmg");
			StringBuilder stringBuilder = new StringBuilder();
			int num = 0;
			stringBuilder.Append("<#9D2929>");
			StringBuilder stringBuilder2 = stringBuilder;
			StringBuilder stringBuilder3 = stringBuilder2;
			StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
			handler.AppendFormatted(languageDatas.damage);
			handler.AppendLiteral(" ");
			stringBuilder3.Append(ref handler);
			stringBuilder.Append(FormatFloat(archeTypeDataBlock.Damage, 2));
			stringBuilder.Append((archeTypeDataBlock.ShotgunBulletCount > 0) ? ("(x" + archeTypeDataBlock.ShotgunBulletCount + ")") : "");
			stringBuilder.Append("</color>");
			num++;
			if (!isSentryGun)
			{
				stringBuilder.Append(" | ");
				stringBuilder.Append("<color=orange>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder4 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
				handler.AppendFormatted(languageDatas.clip);
				handler.AppendLiteral(" ");
				stringBuilder4.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.DefaultClipSize);
				stringBuilder.Append("</color>");
				num++;
			}
			stringBuilder.Append(" | ");
			stringBuilder.Append("<#FFD306>");
			stringBuilder2 = stringBuilder;
			StringBuilder stringBuilder5 = stringBuilder2;
			handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
			handler.AppendFormatted(languageDatas.maxAmmo);
			handler.AppendLiteral(" ");
			stringBuilder5.Append(ref handler);
			stringBuilder.Append(GetTotalAmmo(archeTypeDataBlock, itemDataBlock, isSentryGun));
			stringBuilder.Append("</color>");
			num++;
			if (!isSentryGun)
			{
				Divider(ref num, stringBuilder);
				stringBuilder.Append("<#C0FF00>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder6 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
				handler.AppendFormatted(languageDatas.reload);
				handler.AppendLiteral(" ");
				stringBuilder6.Append(ref handler);
				stringBuilder.Append(FormatFloat(archeTypeDataBlock.DefaultReloadTime, 2));
				stringBuilder.Append("</color>");
				num++;
			}
			if (archeTypeDataBlock.PrecisionDamageMulti != 1f)
			{
				Divider(ref num, stringBuilder);
				stringBuilder.Append("<#18A4A9>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder7 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
				handler.AppendFormatted(languageDatas.precision);
				handler.AppendLiteral(" ");
				stringBuilder7.Append(ref handler);
				stringBuilder.Append(FormatFloat(archeTypeDataBlock.PrecisionDamageMulti, 2));
				stringBuilder.Append("</color>");
				num++;
			}
			Divider(ref num, stringBuilder);
			stringBuilder.Append("<#6764de>");
			stringBuilder2 = stringBuilder;
			StringBuilder stringBuilder8 = stringBuilder2;
			handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
			handler.AppendFormatted(languageDatas.falloff);
			handler.AppendLiteral(" ");
			stringBuilder8.Append(ref handler);
			stringBuilder.Append((int)archeTypeDataBlock.DamageFalloff.x + "m");
			stringBuilder.Append("</color>");
			num++;
			if (archeTypeDataBlock.StaggerDamageMulti != 1f)
			{
				Divider(ref num, stringBuilder);
				stringBuilder.Append("<color=green>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder9 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
				handler.AppendFormatted(languageDatas.stagger);
				handler.AppendLiteral(" ");
				stringBuilder9.Append(ref handler);
				stringBuilder.Append(FormatFloat(archeTypeDataBlock.StaggerDamageMulti, 2));
				stringBuilder.Append("</color>");
				num++;
			}
			if (archeTypeDataBlock.HipFireSpread != 0f && archeTypeDataBlock.ShotgunBulletCount == 0)
			{
				Divider(ref num, stringBuilder);
				stringBuilder.Append("<#cc9347>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder10 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
				handler.AppendFormatted(languageDatas.hipSpread);
				handler.AppendLiteral(" ");
				stringBuilder10.Append(ref handler);
				stringBuilder.Append(FormatFloat(archeTypeDataBlock.HipFireSpread, 2));
				stringBuilder.Append("</color>");
				num++;
			}
			if (archeTypeDataBlock.AimSpread != 0f && archeTypeDataBlock.ShotgunBulletCount == 0)
			{
				Divider(ref num, stringBuilder);
				stringBuilder.Append("<#e6583c>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder11 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
				handler.AppendFormatted(languageDatas.aimDSpread);
				handler.AppendLiteral(" ");
				stringBuilder11.Append(ref handler);
				stringBuilder.Append(FormatFloat(archeTypeDataBlock.AimSpread, 2));
				stringBuilder.Append("</color>");
				num++;
			}
			if (archeTypeDataBlock.PiercingBullets)
			{
				Divider(ref num, stringBuilder);
				stringBuilder.Append("<#097345>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder12 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(1, 1, stringBuilder2);
				handler.AppendFormatted(languageDatas.pierceCount);
				handler.AppendLiteral(" ");
				stringBuilder12.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.PiercingDamageCountLimit);
				stringBuilder.Append("</color>");
				num++;
			}
			stringBuilder.AppendLine("\n");
			stringBuilder.Append(sleepersDatas.VerboseKill(archeTypeDataBlock));
			return stringBuilder.ToString();
			void Divider(ref int count, StringBuilder builder)
			{
				if (count >= 4 || (isChinese && count >= 3))
				{
					builder.Append("\n");
					count = 0;
				}
				else if (count > 0)
				{
					builder.Append(" | ");
				}
			}
		}

		private string GetFormatedWeaponStats(MeleeArchetypeDataBlock archeTypeDataBlock, ItemDataBlock itemDataBlock)
		{
			MeleeLanguageModel melee = languageDatas.melee;
			if (archeTypeDataBlock == null)
			{
				return string.Empty;
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append("<#9D2929>");
			StringBuilder stringBuilder2 = stringBuilder;
			StringBuilder stringBuilder3 = stringBuilder2;
			StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
			handler.AppendFormatted(languageDatas.damage);
			handler.AppendLiteral(".");
			handler.AppendFormatted(melee.light);
			handler.AppendLiteral(" ");
			stringBuilder3.Append(ref handler);
			stringBuilder.Append(archeTypeDataBlock.LightAttackDamage);
			stringBuilder.Append("</color>");
			stringBuilder.Append(" | ");
			stringBuilder.Append("<color=orange>");
			stringBuilder2 = stringBuilder;
			StringBuilder stringBuilder4 = stringBuilder2;
			handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
			handler.AppendFormatted(languageDatas.damage);
			handler.AppendLiteral(".");
			handler.AppendFormatted(melee.heavy);
			handler.AppendLiteral(" ");
			stringBuilder4.Append(ref handler);
			stringBuilder.Append(archeTypeDataBlock.ChargedAttackDamage);
			stringBuilder.Append("</color>");
			int count2 = 2;
			if (!archeTypeDataBlock.AllowRunningWhenCharging)
			{
				Divider(ref count2, stringBuilder);
				stringBuilder.Append("<#FFD306>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder5 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(0, 1, stringBuilder2);
				handler.AppendFormatted(melee.canRunWhileCharging);
				stringBuilder5.Append(ref handler);
				stringBuilder.Append("</color>");
				count2++;
			}
			if (archeTypeDataBlock.LightStaggerMulti != 1f)
			{
				Divider(ref count2, stringBuilder);
				stringBuilder.Append("<#C0FF00>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder6 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
				handler.AppendFormatted(languageDatas.stagger);
				handler.AppendLiteral(".");
				handler.AppendFormatted(melee.light);
				handler.AppendLiteral(" ");
				stringBuilder6.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.LightStaggerMulti);
				stringBuilder.Append("</color>");
				count2++;
			}
			if (archeTypeDataBlock.ChargedStaggerMulti != 1f)
			{
				Divider(ref count2, stringBuilder);
				stringBuilder.Append("<color=green>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder7 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
				handler.AppendFormatted(languageDatas.stagger);
				handler.AppendLiteral(".");
				handler.AppendFormatted(melee.heavy);
				handler.AppendLiteral(" ");
				stringBuilder7.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.ChargedStaggerMulti);
				stringBuilder.Append("</color>");
				count2++;
			}
			if (archeTypeDataBlock.LightPrecisionMulti != 1f)
			{
				Divider(ref count2, stringBuilder);
				stringBuilder.Append("<#004E2C>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder8 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
				handler.AppendFormatted(languageDatas.precision);
				handler.AppendLiteral(".");
				handler.AppendFormatted(melee.light);
				handler.AppendLiteral(" ");
				stringBuilder8.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.LightPrecisionMulti);
				stringBuilder.Append("</color>");
				count2++;
			}
			if (archeTypeDataBlock.ChargedPrecisionMulti != 1f)
			{
				Divider(ref count2, stringBuilder);
				stringBuilder.Append("<#55022B>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder9 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
				handler.AppendFormatted(languageDatas.precision);
				handler.AppendLiteral(".");
				handler.AppendFormatted(melee.heavy);
				handler.AppendLiteral(" ");
				stringBuilder9.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.ChargedPrecisionMulti);
				stringBuilder.Append("</color>");
				count2++;
			}
			if (archeTypeDataBlock.LightSleeperMulti != 1f)
			{
				Divider(ref count2, stringBuilder);
				stringBuilder.Append("<#A918A7>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder10 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
				handler.AppendFormatted(melee.sleepingEnemiesMultiplier);
				handler.AppendLiteral(".");
				handler.AppendFormatted(melee.light);
				handler.AppendLiteral(" ");
				stringBuilder10.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.LightSleeperMulti);
				stringBuilder.Append("</color>");
				count2++;
			}
			if (archeTypeDataBlock.ChargedSleeperMulti != 1f)
			{
				Divider(ref count2, stringBuilder);
				stringBuilder.Append("<#025531>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder11 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
				handler.AppendFormatted(melee.sleepingEnemiesMultiplier);
				handler.AppendLiteral(".");
				handler.AppendFormatted(melee.heavy);
				handler.AppendLiteral(" ");
				stringBuilder11.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.ChargedSleeperMulti);
				stringBuilder.Append("</color>");
				count2++;
			}
			if (archeTypeDataBlock.LightEnvironmentMulti != 1f)
			{
				Divider(ref count2, stringBuilder);
				stringBuilder.Append("<#18A4A9>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder12 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
				handler.AppendFormatted(melee.environmentMultiplier);
				handler.AppendLiteral(".");
				handler.AppendFormatted(melee.light);
				handler.AppendLiteral(" ");
				stringBuilder12.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.LightEnvironmentMulti);
				stringBuilder.Append("</color>");
				count2++;
			}
			if (archeTypeDataBlock.ChargedEnvironmentMulti != 1f)
			{
				Divider(ref count2, stringBuilder);
				stringBuilder.Append("<#75A2AA>");
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder13 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2);
				handler.AppendFormatted(melee.environmentMultiplier);
				handler.AppendLiteral(".");
				handler.AppendFormatted(melee.heavy);
				handler.AppendLiteral(" ");
				stringBuilder13.Append(ref handler);
				stringBuilder.Append(archeTypeDataBlock.ChargedEnvironmentMulti);
				stringBuilder.Append("</color>");
				count2++;
			}
			stringBuilder.AppendLine("\n");
			stringBuilder.Append(sleepersDatas.VerboseKill(archeTypeDataBlock));
			return stringBuilder.ToString();
			static void Divider(ref int count, StringBuilder builder)
			{
				if (count >= 3)
				{
					builder.Append("\n");
					count = 0;
				}
				else if (count > 0)
				{
					builder.Append(" | ");
				}
			}
		}

		private static float FormatFloat(float value, int v)
		{
			return (float)Math.Round((decimal)value, v);
		}

		private int GetAmmoMax(ItemDataBlock itemDataBlock)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected I4, but got Unknown
			AmmoType ammoTypeFromSlot = PlayerAmmoStorage.GetAmmoTypeFromSlot(itemDataBlock.inventorySlot);
			AmmoType val = ammoTypeFromSlot;
			AmmoType val2 = val;
			return (int)val2 switch
			{
				0 => _playerDataBlock.AmmoStandardMaxCap, 
				1 => _playerDataBlock.AmmoSpecialMaxCap, 
				2 => _playerDataBlock.AmmoClassMaxCap, 
				5 => itemDataBlock.ConsumableAmmoMax, 
				_ => -1, 
			};
		}

		private int GetTotalAmmo(ArchetypeDataBlock archetypeDataBlock, ItemDataBlock itemDataBlock, bool isSentryGun = false)
		{
			int ammoMax = GetAmmoMax(itemDataBlock);
			float num = archetypeDataBlock.CostOfBullet;
			if (isSentryGun)
			{
				num *= itemDataBlock.ClassAmmoCostFactor;
				if ((float)archetypeDataBlock.ShotgunBulletCount > 0f)
				{
					num *= (float)archetypeDataBlock.ShotgunBulletCount;
				}
			}
			int num2 = (int)((float)ammoMax / num);
			if (isSentryGun)
			{
				return num2;
			}
			return num2 + archetypeDataBlock.DefaultClipSize;
		}

		private string GetRateOfFire(ArchetypeDataBlock archetypeDataBlock, eWeaponFireMode fireMode)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: 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_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected I4, but got Unknown
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected I4, but got Unknown
			float value = -1f;
			float num;
			switch ((int)fireMode)
			{
			default:
				switch (fireMode - 11)
				{
				case 0:
					break;
				case 2:
					goto IL_0045;
				case 1:
					goto IL_005b;
				default:
					goto end_IL_000c;
				}
				goto case 2;
			case 2:
				value = 1f / archetypeDataBlock.ShotDelay;
				break;
			case 0:
				goto IL_0045;
			case 1:
				goto IL_005b;
				IL_005b:
				num = 1f / (archetypeDataBlock.BurstDelay + archetypeDataBlock.SpecialChargetupTime + archetypeDataBlock.ShotDelay * (float)(archetypeDataBlock.BurstShotCount - 1));
				value = num * (float)archetypeDataBlock.BurstShotCount;
				break;
				IL_0045:
				value = 1f / (archetypeDataBlock.ShotDelay + archetypeDataBlock.SpecialChargetupTime);
				break;
				end_IL_000c:
				break;
			}
			return FormatFloat(value, 1).ToString();
		}
	}
}
namespace WeaponStatShower.Utils.Language
{
	public class LanguageDatas
	{
		public FiremodeLanguageModel firemode { get; set; }

		public MeleeLanguageModel melee { get; set; }

		public SpreadLanguageModel spread { get; set; }

		public SleepersLanguageModel sleepers { get; set; }

		public string damage { get; set; }

		public string clip { get; set; }

		public string maxAmmo { get; set; }

		public string falloff { get; set; }

		public string reload { get; set; }

		public string stagger { get; set; }

		public string precision { get; set; }

		public string pierceCount { get; set; }

		public string rateOfFire { get; set; }

		public string aimDSpread { get; set; }

		public string hipSpread { get; set; }

		public string deployable { get; set; }

		public string longChargeUp { get; set; }

		public string shortChargeUp { get; set; }
	}
	internal class LanguageDatasClass
	{
		public LanguageDatas english { get; set; }

		public LanguageDatas chinese { get; set; }
	}
	internal enum LanguageEnum
	{
		English,
		Chinese
	}
	internal class LocalizedString
	{
		public static readonly string JsonString = "{\r\n\t\t\t\"english\": {\r\n\t\t\t\t\"firemode\": {\r\n\t\t\t\t\t\"fullA\": \"Full-A\",\r\n\t\t\t\t\t\"semiA\": \"Semi-A\",\r\n\t\t\t\t\t\"burst\": \"Burst\",\r\n\t\t\t\t\t\"shotgunSentry\": \"Shotgun-S\"\r\n\t\t\t\t},\r\n\t\t\t\t\"melee\": {\r\n\t\t\t\t\t\"light\": \"Lgt\",\r\n\t\t\t\t\t\"heavy\": \"Hvy\",\r\n\t\t\t\t\t\"canRunWhileCharging\": \"Can't run\",\r\n\t\t\t\t\t\"sleepingEnemiesMultiplier\": \"Slp\",\r\n\t\t\t\t\t\"environmentMultiplier\": \"Env\",\r\n\t\t\t\t\t\"canPierce\": \"Piercing\",\r\n\t\t\t\t\t\"shortRange\": \"Short Range\",\r\n\t\t\t\t\t\"mediumRange\": \"Medium Range\",\r\n\t\t\t\t\t\"longRange\": \"Long Range\",\r\n\t\t\t\t\t\"hammer\": \"Hammer - Balanced\",\r\n\t\t\t\t\t\"knife\": \"Knife - Fast\",\r\n\t\t\t\t\t\"bat\": \"Bat - Fast\",\r\n\t\t\t\t\t\"spear\": \"Spear - Slow\"\r\n\t\t\t\t},\r\n\t\t\t\t\"spread\": {\r\n\t\t\t\t\t\"chocked\": \"Chocked Spread\",\r\n\t\t\t\t\t\"small\": \"Small Spread\",\r\n\t\t\t\t\t\"medium\": \"Medium Spread\",\r\n\t\t\t\t\t\"large\": \"Large Spread\",\r\n\t\t\t\t\t\"huge\": \"Huge Spread\"\r\n\t\t\t\t},\r\n\t\t\t\t\"sleepers\": {\r\n\t\t\t\t\t\"striker\": \"STRK\",\r\n\t\t\t\t\t\"shooter\": \"SHTR\",\r\n\t\t\t\t\t\"scout\": \"SCOUT\",\r\n\t\t\t\t\t\"bigStriker\": \"B-STRK\",\r\n\t\t\t\t\t\"bigShooter\": \"B-SHTR\",\r\n\t\t\t\t\t\"charger\": \"CHRG\",\r\n\t\t\t\t\t\"chargerScout\": \"C-SCOUT\",\r\n\t\t\t\t\t\"occipit\": \"o\",\r\n\t\t\t\t\t\"head\": \"h\",\r\n\t\t\t\t\t\"back\": \"b\",\r\n\t\t\t\t\t\"chest\": \"c\"\r\n\t\t\t\t},\r\n\t\t\t\t\"damage\": \"Dmg\",\r\n\t\t\t\t\"clip\": \"Clp\",\r\n\t\t\t\t\"maxAmmo\": \"Max\",\r\n\t\t\t\t\"falloff\": \"Dist\",\r\n\t\t\t\t\"reload\": \"Rld\",\r\n\t\t\t\t\"stagger\": \"Stgr\",\r\n\t\t\t\t\"precision\": \"Prcn\",\r\n\t\t\t\t\"pierceCount\": \"Pierc\",\r\n\t\t\t\t\"rateOfFire\": \"RoF\",\r\n\t\t\t\t\"aimDSpread\": \"ADS\",\r\n\t\t\t\t\"hipSpread\": \"HIP\",\r\n\t\t\t\t\"deployable\": \"Deployable\",\r\n\t\t\t\t\"longChargeUp\": \"Long Charge-up\",\r\n\t\t\t\t\"shortChargeUp\": \"short Charge-up\"\r\n\t\t\t},\r\n\r\n\t\t\t\"chinese\": {\r\n\t\t\t\t\"firemode\": {\r\n\t\t\t\t\t\"fullA\": \"全自动\",\r\n\t\t\t\t\t\"semiA\": \"半自动\",\r\n\t\t\t\t\t\"burst\": \"连发\",\r\n\t\t\t\t\t\"shotgunSentry\": \"半自动霰弹射击\"\r\n\t\t\t\t},\r\n\t\t\t\t\"melee\": {\r\n\t\t\t\t\t\"light\": \"轻击\",\r\n\t\t\t\t\t\"heavy\": \"重击\",\r\n\t\t\t\t\t\"canRunWhileCharging\": \"不能冲刺\",\r\n\t\t\t\t\t\"sleepingEnemiesMultiplier\": \"沉睡倍率\",\r\n\t\t\t\t\t\"environmentMultiplier\": \"环境倍率\",\r\n\t\t\t\t\t\"canPierce\": \"穿刺\",\r\n\t\t\t\t\t\"shortRange\": \"短距离\",\r\n\t\t\t\t\t\"mediumRange\": \"中距离\",\r\n\t\t\t\t\t\"longRange\": \"长距离\",\r\n\t\t\t\t\t\"hammer\": \"大锤 - 均衡\",\r\n\t\t\t\t\t\"knife\": \"刀 - 快速\",\r\n\t\t\t\t\t\"bat\": \"棍棒 - 快速\",\r\n\t\t\t\t\t\"spear\": \"矛 - 慢速\"\r\n\t\t\t\t},\r\n\t\t\t\t\"spread\": {\r\n\t\t\t\t\t\"chocked\": \"收束扩散\",\r\n\t\t\t\t\t\"small\": \"扩散小\",\r\n\t\t\t\t\t\"medium\": \"中度扩散\",\r\n\t\t\t\t\t\"large\": \"扩散大\",\r\n\t\t\t\t\t\"huge\": \"超大扩散\"\r\n\t\t\t\t},\r\n\t\t\t\t\"sleepers\": {\r\n\t\t\t\t\t\"striker\": \"前锋\",\r\n\t\t\t\t\t\"shooter\": \"射手\",\r\n\t\t\t\t\t\"scout\": \"哨兵\",\r\n\t\t\t\t\t\"bigStriker\": \"大壮\",\r\n\t\t\t\t\t\"bigShooter\": \"大姐\",\r\n\t\t\t\t\t\"charger\": \"黑刺\",\r\n\t\t\t\t\t\"chargerScout\": \"黑触\",\r\n\t\t\t\t\t\"occipit\": \"后脑\",\r\n\t\t\t\t\t\"head\": \"头\",\r\n\t\t\t\t\t\"back\": \"背\",\r\n\t\t\t\t\t\"chest\": \"胸\"\r\n\t\t\t\t},\r\n\r\n\t\t\t\t\"damage\": \"伤害\",\r\n\t\t\t\t\"clip\": \"弹容量\",\r\n\t\t\t\t\"maxAmmo\": \"总弹量\",\r\n\t\t\t\t\"falloff\": \"衰减距离\",\r\n\t\t\t\t\"reload\": \"换弹时间\",\r\n\t\t\t\t\"stagger\": \"硬直倍率\",\r\n\t\t\t\t\"precision\": \"精准倍率\",\r\n\t\t\t\t\"pierceCount\": \"穿透\",\r\n\t\t\t\t\"rateOfFire\": \"射速\",\r\n\t\t\t\t\"aimDSpread\": \"倍镜\",\r\n\t\t\t\t\"hipSpread\": \"后坐力\",\r\n\t\t\t\t\"deployable\": \"可部署\",\r\n\t\t\t\t\"longChargeUp\": \"长蓄力\",\r\n\t\t\t\t\"shortChargeUp\": \"短蓄力\"\r\n\t\t\t}\r\n\t\t}";
	}
}
namespace WeaponStatShower.Utils.Language.Models
{
	public class FiremodeLanguageModel
	{
		public string fullA { get; set; }

		public string semiA { get; set; }

		public string burst { get; set; }

		public string shotgunSentry { get; set; }
	}
	public class MeleeLanguageModel
	{
		public string light { get; set; }

		public string heavy { get; set; }

		public string canRunWhileCharging { get; set; }

		public string sleepingEnemiesMultiplier { get; set; }

		public string environmentMultiplier { get; set; }

		public string canPierce { get; set; }

		public string shortRange { get; set; }

		public string mediumRange { get; set; }

		public string longRange { get; set; }

		public string hammer { get; set; }

		public string knife { get; set; }

		public string bat { get; set; }

		public string spear { get; set; }
	}
	public class SleepersLanguageModel
	{
		public string striker { get; set; }

		public string shooter { get; set; }

		public string scout { get; set; }

		public string bigStriker { get; set; }

		public string bigShooter { get; set; }

		public string charger { get; set; }

		public string chargerScout { get; set; }

		public string occipit { get; set; }

		public string head { get; set; }

		public string back { get; set; }

		public string chest { get; set; }
	}
	public class SpreadLanguageModel
	{
		public string chocked { get; set; }

		public string small { get; set; }

		public string medium { get; set; }

		public string large { get; set; }

		public string huge { get; set; }
	}
}
namespace WeaponStatShower.Patches
{
	public abstract class Patch
	{
		protected internal Harmony? Harmony { get; set; }

		public virtual string Name { get; }

		public virtual bool Enabled => true;

		public virtual void Initialize()
		{
		}

		public abstract void Execute();

		public void PatchConstructor<TClass>(PatchType patchType, string? prefixMethodName = null, string? postfixMethodName = null) where TClass : class
		{
			PatchConstructor<TClass>(null, patchType, prefixMethodName, postfixMethodName);
		}

		public void PatchConstructor<TClass>(Type[]? parameters, PatchType patchType, string? prefixMethodName = null, string? postfixMethodName = null) where TClass : class
		{
			ConstructorInfo methodBase = AccessTools.Constructor(typeof(TClass), parameters, false);
			PatchMethod<TClass>(methodBase, patchType, prefixMethodName, postfixMethodName);
		}

		public void PatchMethod<TClass>(string methodName, PatchType patchType, Type[] generics = null, string prefixMethodName = null, string postfixMethodName = null) where TClass : class
		{
			PatchMethod<TClass>(methodName, null, patchType, generics, prefixMethodName, postfixMethodName);
		}

		public void PatchMethod<TClass>(string methodName, Type[] parameters, PatchType patchType, Type[] generics = null, string prefixMethodName = null, string postfixMethodName = null) where TClass : class
		{
			MethodInfo methodBase = AccessTools.Method(typeof(TClass), methodName, parameters, generics);
			PatchMethod<TClass>(methodBase, patchType, prefixMethodName, postfixMethodName);
		}

		public void PatchMethod<TClass>(MethodBase methodBase, PatchType patchType, string prefixMethodName = null, string postfixMethodName = null) where TClass : class
		{
			PatchMethod(typeof(TClass), methodBase, patchType, prefixMethodName, postfixMethodName);
		}

		public void PatchMethod(Type classType, string methodName, PatchType patchType, Type[] generics = null, string prefixMethodName = null, string postfixMethodName = null)
		{
			PatchMethod(classType, methodName, null, patchType, generics, prefixMethodName, postfixMethodName);
		}

		public void PatchMethod(Type classType, string methodName, Type[] parameters, PatchType patchType, Type[] generics = null, string prefixMethodName = null, string postfixMethodName = null)
		{
			MethodInfo methodBase = AccessTools.Method(classType, methodName, parameters, generics);
			PatchMethod(classType, methodBase, patchType, prefixMethodName, postfixMethodName);
		}

		public void PatchMethod(Type classType, MethodBase methodBase, PatchType patchType, string? prefixMethodName = null, string? postfixMethodName = null)
		{
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Expected O, but got Unknown
			//IL_0177: Expected O, but got Unknown
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Expected O, but got Unknown
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Expected O, but got Unknown
			string text = classType.Name.Replace("`", "__");
			string value = methodBase.ToString();
			string text2 = (methodBase.IsConstructor ? "ctor" : methodBase.Name);
			MethodInfo methodInfo = null;
			MethodInfo methodInfo2 = null;
			if ((patchType & PatchType.Prefix) != 0)
			{
				try
				{
					methodInfo2 = AccessTools.Method(GetType(), prefixMethodName ?? (text + "__" + text2 + "__Prefix"), (Type[])null, (Type[])null);
				}
				catch (Exception value2)
				{
					LogFatal($"Failed to obtain the prefix patch method for {value}): {value2}");
				}
			}
			if ((patchType & PatchType.Postfix) != 0)
			{
				try
				{
					methodInfo = AccessTools.Method(GetType(), postfixMethodName ?? (text + "__" + text2 + "__Postfix"), (Type[])null, (Type[])null);
				}
				catch (Exception value3)
				{
					LogFatal($"Failed to obtain the postfix patch method for {value}): {value3}");
				}
			}
			try
			{
				if (methodInfo2 != null && methodInfo != null)
				{
					Harmony.Patch(methodBase, new HarmonyMethod(methodInfo2), new HarmonyMethod(methodInfo), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
				else if (methodInfo2 != null)
				{
					Harmony.Patch(methodBase, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
				else if (methodInfo != null)
				{
					Harmony.Patch(methodBase, (HarmonyMethod)null, new HarmonyMethod(methodInfo), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
			}
			catch (Exception value4)
			{
				LogError($"Failed to patch method {value}: {value4}");
			}
		}

		public void Log(LogLevel level, object data)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			ManualLogSource log = ((BasePlugin)WeaponStatShowerPlugin.Instance).Log;
			bool flag = default(bool);
			BepInExLogInterpolatedStringHandler val = new BepInExLogInterpolatedStringHandler(3, 2, level, ref flag);
			if (flag)
			{
				val.AppendLiteral("<");
				val.AppendFormatted<string>(Name);
				val.AppendLiteral("> ");
				val.AppendFormatted<object>(data);
			}
			log.Log(level, val);
		}

		public void LogDebug(object data)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			ManualLogSource log = ((BasePlugin)WeaponStatShowerPlugin.Instance).Log;
			bool flag = default(bool);
			BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(3, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("<");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(Name);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("> ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<object>(data);
			}
			log.LogDebug(val);
		}

		public void LogError(object data)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			ManualLogSource log = ((BasePlugin)WeaponStatShowerPlugin.Instance).Log;
			bool flag = default(bool);
			BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(3, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("<");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(Name);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("> ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<object>(data);
			}
			log.LogError(val);
		}

		public void LogFatal(object data)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			ManualLogSource log = ((BasePlugin)WeaponStatShowerPlugin.Instance).Log;
			bool flag = default(bool);
			BepInExFatalLogInterpolatedStringHandler val = new BepInExFatalLogInterpolatedStringHandler(3, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("<");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(Name);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("> ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<object>(data);
			}
			log.LogFatal(val);
		}

		public void LogInfo(object data)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			ManualLogSource log = ((BasePlugin)WeaponStatShowerPlugin.Instance).Log;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(3, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("<");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(Name);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("> ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<object>(data);
			}
			log.LogInfo(val);
		}

		public void LogMessage(object data)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			ManualLogSource log = ((BasePlugin)WeaponStatShowerPlugin.Instance).Log;
			bool flag = default(bool);
			BepInExMessageLogInterpolatedStringHandler val = new BepInExMessageLogInterpolatedStringHandler(3, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("<");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(Name);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("> ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<object>(data);
			}
			log.LogMessage(val);
		}

		public void LogWarning(object data)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			ManualLogSource log = ((BasePlugin)WeaponStatShowerPlugin.Instance).Log;
			bool flag = default(bool);
			BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(3, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("<");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(Name);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("> ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<object>(data);
			}
			log.LogWarning(val);
		}
	}
	[Flags]
	public enum PatchType : byte
	{
		Prefix = 1,
		Postfix = 2,
		Both = 3
	}
	internal class ShowStat : Patch
	{
		private const string PatchName = "ShowStat";

		private const PatchType patchType = PatchType.Postfix;

		private static readonly ConfigDefinition ConfigEnabled = new ConfigDefinition("ShowStat", "Enabled");

		private static readonly ConfigDefinition Language = new ConfigDefinition("ShowStat", "Language");

		private static readonly ConfigDefinition ConfigSleepers = new ConfigDefinition("ShowStat", "SleepersShown");

		private static LanguageEnum PrevLanguageEnum = LanguageEnum.English;

		private static string PrevShownSleepers = "PLACEHOLDER";

		private static WeaponDescriptionBuilder? _weaponDescriptionBuilder;

		public static Patch Instance { get; private set; }

		public override string Name { get; } = "ShowStat";


		public override void Initialize()
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Expected O, but got Unknown
			Instance = this;
			((BasePlugin)WeaponStatShowerPlugin.Instance).Config.Bind<bool>(ConfigEnabled, true, new ConfigDescription("Show the stats of a weapon.", (AcceptableValueBase)null, Array.Empty<object>()));
			((BasePlugin)WeaponStatShowerPlugin.Instance).Config.Bind<LanguageEnum>(Language, LanguageEnum.English, new ConfigDescription("Select the mod language.", (AcceptableValueBase)null, Array.Empty<object>()));
			((BasePlugin)WeaponStatShowerPlugin.Instance).Config.Bind<string>(ConfigSleepers, "DESCRIPTION_ONLY", new ConfigDescription("Select which Sleepers are shown, separeted by a comma.\nAcceptable values: ALL, NONE, STRIKER, SHOOTER, SCOUT, BIG_STRIKER, BIG_SHOOTER, CHARGER, CHARGER_SCOUT, DESCRIPTION_ONLY", (AcceptableValueBase)null, Array.Empty<object>()));
			_weaponDescriptionBuilder = new WeaponDescriptionBuilder();
		}

		public override void Execute()
		{
			PatchMethod<CM_InventorySlotItem>("LoadData", PatchType.Postfix);
		}

		public static void CM_InventorySlotItem__LoadData__Postfix(CM_InventorySlotItem __instance, GearIDRange idRange, bool clickable, bool detailedInfo)
		{
			if ((Object)(object)__instance == (Object)null || !detailedInfo)
			{
				return;
			}
			if (_weaponDescriptionBuilder == null)
			{
				WeaponStatShowerPlugin.LogError("Something went wrong with the DescriptionBuilder");
				return;
			}
			((BasePlugin)WeaponStatShowerPlugin.Instance).Config.Reload();
			string text = ((BasePlugin)WeaponStatShowerPlugin.Instance).Config.GetConfigEntry<string>(ConfigSleepers).Value.Trim().ToUpper();
			LanguageEnum value = ((BasePlugin)WeaponStatShowerPlugin.Instance).Config.GetConfigEntry<LanguageEnum>(Language).Value;
			if (!PrevShownSleepers.Equals(text) || !value.Equals(PrevLanguageEnum))
			{
				_weaponDescriptionBuilder.UpdateSleepersDatas(text.Split(','), value);
				PrevShownSleepers = text;
				PrevLanguageEnum = value;
			}
			_weaponDescriptionBuilder.Inizialize(idRange, GameDataBlockBase<PlayerDataBlock>.GetBlock(1u), value);
			string text2 = _weaponDescriptionBuilder.DescriptionFormatter(__instance.GearDescription);
			__instance.GearDescription = (text.Equals("DESCRIPTION_ONLY") ? (text2 + "\n" + __instance.GearDescription) : text2);
			__instance.GearPublicName = _weaponDescriptionBuilder.FireRateFormatter(__instance.GearPublicName);
		}
	}
}