using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HG.Reflection;
using Microsoft.CodeAnalysis;
using On.RoR2.UI;
using RoR2;
using RoR2.Stats;
using RoR2.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: OptIn]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("MoreStatistics")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+f9a324a8467463fdc075018d9154b9f88d58028d")]
[assembly: AssemblyProduct("MoreStatistics")]
[assembly: AssemblyTitle("MoreStatistics")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace MoreStatistics
{
public static class Assets
{
public static AssetBundle mainBundle;
public const string bundleName = "morebundles";
public const string assetBundleFolder = "assetbundles";
public static string AssetBundlePath => Path.Combine(Path.GetDirectoryName(MoreStatistics.PInfo.Location), "assetbundles", "morebundles");
public static void Init()
{
mainBundle = AssetBundle.LoadFromFile(AssetBundlePath);
}
}
internal static class Log
{
private static ManualLogSource _logSource;
internal static void Init(ManualLogSource logSource)
{
_logSource = logSource;
}
internal static void Debug(object data)
{
_logSource.LogDebug(data);
}
internal static void Error(object data)
{
_logSource.LogError(data);
}
internal static void Fatal(object data)
{
_logSource.LogFatal(data);
}
internal static void Info(object data)
{
_logSource.LogInfo(data);
}
internal static void Message(object data)
{
_logSource.LogMessage(data);
}
internal static void Warning(object data)
{
_logSource.LogWarning(data);
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.Nullos.MoreStatistics", "MoreStatistics", "2.0.2")]
public class MoreStatistics : BaseUnityPlugin
{
public const string PluginGUID = "com.Nullos.MoreStatistics";
public const string PluginName = "MoreStatistics";
public const string PluginVersion = "2.0.2";
private string[] statsToDisplay = new string[7] { "totalHealthHealed", "totalDistanceTraveled", "totalBloodPurchases", "totalLunarPurchases", "totalDronesPurchased", "totalTurretsPurchased", "totalEliteKills" };
private Transform gameEndReportPanel;
private GameObject moreButtonsPrefab;
private GameObject mobStatsPanelPrefab;
private GameObject mobStatsStripPrefab;
private Transform parentTransform;
private GameObject mobStatsPanel = null;
private List<string> mobBlacklist;
private string[] statPrefix = new string[3] { "damageDealtTo", "damageTakenFrom", "killsAgainst" };
private TMP_FontAsset font = null;
public static PluginInfo PInfo { get; private set; }
private void OnEnable()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
GameEndReportPanelController.SetPlayerInfo += new hook_SetPlayerInfo(PlayerInfoHook);
GameEndReportPanelController.Awake += new hook_Awake(EndMenuHook);
}
private void OnDisable()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
GameEndReportPanelController.SetPlayerInfo -= new hook_SetPlayerInfo(PlayerInfoHook);
GameEndReportPanelController.Awake -= new hook_Awake(EndMenuHook);
}
public void Awake()
{
Log.Init(((BaseUnityPlugin)this).Logger);
PInfo = ((BaseUnityPlugin)this).Info;
string path = Path.Combine(Path.GetDirectoryName(PInfo.Location), "mobNames.txt");
populateMobList(path);
Assets.Init();
if ((Object)(object)Assets.mainBundle == (Object)null)
{
Log.Error("Bundle is null");
}
mobStatsPanelPrefab = Assets.mainBundle.LoadAsset<GameObject>("MobStats");
mobStatsStripPrefab = Assets.mainBundle.LoadAsset<GameObject>("StatStrip");
moreButtonsPrefab = Assets.mainBundle.LoadAsset<GameObject>("MoreButtonsArea");
}
private void EndMenuHook(orig_Awake orig, GameEndReportPanelController self)
{
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Expected O, but got Unknown
orig.Invoke(self);
parentTransform = ((Component)self).transform.Find("SafeArea (JUICED)/BodyArea");
GameObject val = Object.Instantiate<GameObject>(moreButtonsPrefab, parentTransform);
GameObject gameObject = ((Component)val.transform.Find("MobStatsButton")).gameObject;
Button component = gameObject.GetComponent<Button>();
((UnityEvent)component.onClick).AddListener(new UnityAction(openStatPanel));
setFont(((Component)self).transform);
}
private void PlayerInfoHook(orig_SetPlayerInfo orig, GameEndReportPanelController self, PlayerInfo playerInfo, int playerIndex)
{
if (!self.statsToDisplay.Contains(statsToDisplay[0]))
{
self.statsToDisplay = self.statsToDisplay.Concat(statsToDisplay).ToArray();
}
orig.Invoke(self, playerInfo, playerIndex);
List<string> enemiesNamesPlayerInteractedWith = GetEnemiesNamesPlayerInteractedWith(playerInfo.statSheet);
createMobStatPanel();
Transform val = mobStatsPanel.transform.Find("Panel/Scroll View/Viewport/Container");
StatSheet statSheet = playerInfo.statSheet;
ulong num = 0uL;
ulong num2 = 0uL;
ulong num3 = 0uL;
GameObject val2 = null;
foreach (string item in enemiesNamesPlayerInteractedWith)
{
GameObject val3 = BodyCatalog.FindBodyPrefab(item);
CharacterBody component = val3.GetComponent<CharacterBody>();
Texture portraitIcon = component.portraitIcon;
StatDef val4 = StatDef.Find("killsAgainst." + item);
ulong statValueULong = statSheet.GetStatValueULong(val4);
val4 = StatDef.Find("damageDealtTo." + item);
ulong statValueULong2 = statSheet.GetStatValueULong(val4);
val4 = StatDef.Find("damageTakenFrom." + item);
ulong statValueULong3 = statSheet.GetStatValueULong(val4);
switch (item)
{
default:
if (!(item == "BrotherHurtBody"))
{
GameObject statStrip = Object.Instantiate<GameObject>(mobStatsStripPrefab, val);
fillStatStrip(statStrip, portraitIcon, statValueULong, statValueULong2, statValueULong3);
break;
}
goto case "BrotherBody";
case "BrotherBody":
case "BrotherGlassBody":
case "BrotherHauntBody":
if ((Object)(object)val2 == (Object)null)
{
val2 = Object.Instantiate<GameObject>(mobStatsStripPrefab, val);
}
num += statValueULong;
num2 += statValueULong2;
num3 += statValueULong3;
fillStatStrip(val2, portraitIcon, num, num2, num3);
break;
}
}
}
private void fillStatStrip(GameObject statStrip, Texture icon, ulong kills, ulong damageDealt, ulong damageTaken)
{
if ((Object)(object)icon != (Object)null)
{
((Component)statStrip.transform.Find("Image/Image")).GetComponent<RawImage>().texture = icon;
}
((TMP_Text)((Component)statStrip.transform.Find("Killed/Value")).GetComponent<TextMeshProUGUI>()).text = TextSerialization.ToStringNumeric(kills);
((TMP_Text)((Component)statStrip.transform.Find("DamageDealt/Value")).GetComponent<TextMeshProUGUI>()).text = TextSerialization.ToStringNumeric(damageDealt);
((TMP_Text)((Component)statStrip.transform.Find("DamageTaken/Value")).GetComponent<TextMeshProUGUI>()).text = TextSerialization.ToStringNumeric(damageTaken);
}
private List<string> GetEnemiesNamesPlayerInteractedWith(StatSheet statSheet)
{
List<string> list = new List<string>();
string[] bodyNames = BodyCatalog.bodyNames;
foreach (string text in bodyNames)
{
if (mobBlacklist.Contains(text))
{
continue;
}
string[] array = statPrefix;
foreach (string text2 in array)
{
string text3 = text2 + "." + text;
StatDef val = StatDef.Find(text3);
string statDisplayValue = statSheet.GetStatDisplayValue(val);
if (int.TryParse(statDisplayValue, out var result) && result != 0)
{
list.Add(text);
break;
}
}
}
return list;
}
private void populateMobList(string path)
{
char[] trimChars = new char[2] { ' ', '\n' };
mobBlacklist = new List<string>();
IEnumerable<string> enumerable = File.ReadLines(path);
foreach (string item in enumerable)
{
mobBlacklist.Add(item.Trim(trimChars));
}
}
private void createMobStatPanel()
{
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Expected O, but got Unknown
if ((Object)(object)mobStatsPanel != (Object)null)
{
Object.Destroy((Object)(object)mobStatsPanel);
}
mobStatsPanel = Object.Instantiate<GameObject>(mobStatsPanelPrefab, parentTransform);
((UnityEvent)((Component)mobStatsPanel.transform.Find("Panel/Top/Close")).GetComponent<Button>().onClick).AddListener(new UnityAction(closeStatPanel));
mobStatsPanel.SetActive(false);
}
private void closeStatPanel()
{
if (!((Object)(object)mobStatsPanel == (Object)null))
{
mobStatsPanel.SetActive(false);
}
}
private void openStatPanel()
{
if ((Object)(object)mobStatsPanel != (Object)null)
{
mobStatsPanel.SetActive(true);
}
}
private void setFont(Transform gameEndReportPanel)
{
font = ((TMP_Text)((Component)gameEndReportPanel.Find("SafeArea (JUICED)/HeaderArea/DeathFlavorText")).GetComponent<HGTextMeshProUGUI>()).font;
((TMP_Text)((Component)mobStatsPanelPrefab.transform.Find("Panel/Header/Killed/Value")).GetComponent<TextMeshProUGUI>()).font = font;
((TMP_Text)((Component)mobStatsPanelPrefab.transform.Find("Panel/Header/DamageDealt/Value")).GetComponent<TextMeshProUGUI>()).font = font;
((TMP_Text)((Component)mobStatsPanelPrefab.transform.Find("Panel/Header/DamageTaken/Value")).GetComponent<TextMeshProUGUI>()).font = font;
((TMP_Text)((Component)mobStatsStripPrefab.transform.Find("Killed/Value")).GetComponent<TextMeshProUGUI>()).font = font;
((TMP_Text)((Component)mobStatsStripPrefab.transform.Find("DamageDealt/Value")).GetComponent<TextMeshProUGUI>()).font = font;
((TMP_Text)((Component)mobStatsStripPrefab.transform.Find("DamageTaken/Value")).GetComponent<TextMeshProUGUI>()).font = font;
}
private void Update()
{
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
if (Input.GetKeyDown((KeyCode)283))
{
StatSheet currentStats = ((Component)PlayerCharacterMasterController.instances[0].master).GetComponent<PlayerStatsComponent>().currentStats;
Log.Info("STAT FIELDS\n");
StatField[] fields = currentStats.fields;
for (int i = 0; i < fields.Length; i++)
{
StatField val = fields[i];
Log.Info(((StatField)(ref val)).name ?? "");
}
}
else if (Input.GetKeyDown((KeyCode)284))
{
CharacterBody body = PlayerCharacterMasterController.instances[0].master.GetBody();
body.healthComponent.Die(false);
}
}
[ConCommand(/*Could not decode attribute arguments.*/)]
private static void cmd_bodyPortraits(ConCommandArgs args)
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
foreach (CharacterBody allBodyPrefabBodyBodyComponent in BodyCatalog.allBodyPrefabBodyBodyComponents)
{
string bodyName = BodyCatalog.GetBodyName(BodyCatalog.FindBodyIndex(allBodyPrefabBodyBodyComponent));
string name = ((Object)allBodyPrefabBodyBodyComponent.portraitIcon).name;
Log.Info(bodyName + " - " + name);
}
}
}
}