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