Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of FPSCounter v1.4.0
BepInEx/plugins/FPSCounter.dll
Decompiled 2 years agousing System.Collections; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using FPSCounter.Compatibility; using FPSCounter.Config; using FPSCounter.Patches; using HarmonyLib; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("FPSCounter")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FPSCounter")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("68bc4741-12ed-4a19-80ea-9a379b167c12")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace FPSCounter { internal class FPSCounterGUI : MonoBehaviour { public static GUIStyle style; [SerializeField] [Range(0f, 1f)] private static float _expSmoothingFactor = 0.1f; [SerializeField] public static float _refreshFrequency = General.refreshFrequency.Value; private static float _timeSinceUpdate = 0f; private static float _averageFps = 1f; private float count; public int XPosition = PersistantCounter.XPosition.Value; public int YPosition = PersistantCounter.YPosition.Value; private IEnumerator Start() { style = new GUIStyle(); UpdateGUISize(); UpdateGUIColor(); GUI.depth = 2; while (true) { getAverageFPS(); yield return (object)new WaitForSeconds(0.1f); } } private void getAverageFPS() { _averageFps = _expSmoothingFactor * _averageFps + (1f - _expSmoothingFactor) * 1f / Time.unscaledDeltaTime; if (_timeSinceUpdate < _refreshFrequency) { _timeSinceUpdate += Time.deltaTime; } else { count = Mathf.RoundToInt(_averageFps); } } public static void UpdateGUISize() { FPSCounterBase.debugLog("Updating GUI size to " + PersistantCounter.Size.Value); style.fontSize = PersistantCounter.Size.Value; } public static void UpdateGUIColor() { //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) FPSCounterBase.debugLog("Updating GUI color to: " + PersistantCounter.Color.Value); if (PersistantCounter.Color.Value != PersistantCounter.PersistentCounterColors.custom) { style.normal.textColor = (Color)typeof(Color).GetProperty(PersistantCounter.Color.Value.ToString()).GetValue(null, null); style.hover.textColor = (Color)typeof(Color).GetProperty(PersistantCounter.Color.Value.ToString()).GetValue(null, null); } else { Color textColor = default(Color); ((Color)(ref textColor))..ctor(PersistantCounter.R.Value / 255f, PersistantCounter.G.Value / 255f, PersistantCounter.B.Value / 255f); style.normal.textColor = textColor; style.hover.textColor = textColor; } } private void OnGUI() { //IL_0038: Unknown result type (might be due to invalid IL or missing references) if (!General.disableFPS.Value && General.persistentCounter.Value) { GUI.Label(new Rect((float)PersistantCounter.XPosition.Value, (float)PersistantCounter.YPosition.Value, 100f, 25f), "FPS: " + Mathf.Round(count), style); } } } [BepInPlugin("bctix.FPSCounter", "FPS_Counter", "1.4.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class FPSCounterBase : BaseUnityPlugin { private const string modGUID = "bctix.FPSCounter"; private const string modName = "FPS_Counter"; private const string modVersion = "1.4.0"; private readonly Harmony harmony = new Harmony("bctix.FPSCounter"); private static FPSCounterBase Instance; public static ManualLogSource mls; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } mls = Logger.CreateLogSource("bctix.FPSCounter"); mls.LogInfo((object)"Hello World!"); Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); FPSCounter.Config.Config.init(((BaseUnityPlugin)this).Config); if (Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig")) { LethalConfig.init(); } harmony.PatchAll(typeof(FPSCounterBase)); harmony.PatchAll(typeof(HUDPatch)); } public static void debugLog(object data) { } private void OnDestroy() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) Object.DontDestroyOnLoad((Object)(object)new GameObject("FPSCounterGUI").AddComponent<FPSCounterGUI>()); } } } namespace FPSCounter.Patches { [HarmonyPatch(typeof(HUDManager))] internal class HUDPatch { public static TextMeshProUGUI _textMesh; [SerializeField] [Range(0f, 1f)] private static float _expSmoothingFactor = 0.1f; [SerializeField] public static float _refreshFrequency = General.refreshFrequency.Value; private static float _timeSinceUpdate = 0f; private static float _averageFps = 1f; [HarmonyPatch("Start")] [HarmonyPostfix] private static void Start(ref HUDManager __instance) { //IL_0005: 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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("HealthHUDDisplay"); val.AddComponent<RectTransform>(); _textMesh = val.AddComponent<TextMeshProUGUI>(); RectTransform rectTransform = ((TMP_Text)_textMesh).rectTransform; ((Transform)rectTransform).SetParent(((Component)__instance.PTTIcon).transform, false); rectTransform.anchoredPosition = new Vector2(0f, -20f); ((TMP_Text)_textMesh).font = ((TMP_Text)__instance.controlTipLines[0]).font; ((TMP_Text)_textMesh).fontSize = 10f; ((Graphic)_textMesh).color = ((Graphic)HUDManager.Instance.weightCounter).color; ((TMP_Text)_textMesh).overflowMode = (TextOverflowModes)0; if (General.persistentCounter.Value) { ((Behaviour)_textMesh).enabled = false; } else { ((Behaviour)_textMesh).enabled = !General.disableFPS.Value; } } [HarmonyPatch("Update")] [HarmonyPrefix] private static void updateFPS() { _averageFps = _expSmoothingFactor * _averageFps + (1f - _expSmoothingFactor) * 1f / Time.unscaledDeltaTime; if (_timeSinceUpdate < _refreshFrequency) { _timeSinceUpdate += Time.deltaTime; return; } int num = Mathf.RoundToInt(_averageFps); ((TMP_Text)_textMesh).text = "FPS " + num; _timeSinceUpdate = 0f; } } } namespace FPSCounter.Config { internal class Config { public static void init(ConfigFile Config) { General.init(Config); PersistantCounter.init(Config); } } internal class PersistantCounter { public enum PersistentCounterColors { green, blue, red, yellow, white, cyan, custom } public enum PersistentCounterFonts { arial, montserrat, impact, sans, papyrus, standard_galactic, braille } public static ConfigEntry<PersistentCounterColors> Color; public static ConfigEntry<int> Size; public static ConfigEntry<int> XPosition; public static ConfigEntry<int> YPosition; public static ConfigEntry<float> R; public static ConfigEntry<float> G; public static ConfigEntry<float> B; public static void init(ConfigFile Config) { Color = Config.Bind<PersistentCounterColors>("Persistant Counter", "PersistentCounterColor", PersistentCounterColors.green, "The color of the persistent counter."); Color.SettingChanged += delegate { FPSCounterGUI.UpdateGUIColor(); }; Size = Config.Bind<int>("Persistant Counter", "PersistentCounterSize", 24, "The Size of the persistent counter. The max is 500"); Size.SettingChanged += delegate { if (Size.Value > 500) { Size.Value = 500; Config.Save(); } if (Size.Value < 1) { Size.Value = 1; Config.Save(); } FPSCounterGUI.UpdateGUISize(); }; XPosition = Config.Bind<int>("Persistant Counter", "PersistentCounterXPosition", 10, "The X Position of the persistent counter"); YPosition = Config.Bind<int>("Persistant Counter", "PersistentCounterYPosition", 10, "The Y Position of the persistent counter"); R = Config.Bind<float>("Persistant Counter Color", "PersistentCounterColorR", 255f, "The R Value of the persistent counter"); G = Config.Bind<float>("Persistant Counter Color", "PersistentCounterColorG", 255f, "The G Value of the persistent counter"); B = Config.Bind<float>("Persistant Counter Color", "PersistentCounterColorB", 255f, "The B Value of the persistent counter"); ConfigEntry<float>[] array = new ConfigEntry<float>[3] { R, G, B }; foreach (ConfigEntry<float> setting in array) { setting.SettingChanged += delegate { if (setting.Value > 255f) { setting.Value = 255f; } if (setting.Value < 0f) { setting.Value = 0f; } Config.Save(); FPSCounterGUI.UpdateGUIColor(); }; } } } internal class General { public static ConfigEntry<bool> disableFPS; public static ConfigEntry<bool> persistentCounter; public static ConfigEntry<float> refreshFrequency; public static void init(ConfigFile Config) { disableFPS = Config.Bind<bool>("General", "HideCounter", false, "Hides the FPS counter."); disableFPS.SettingChanged += delegate { if (disableFPS.Value) { if (Object.op_Implicit((Object)(object)HUDPatch._textMesh)) { ((Behaviour)HUDPatch._textMesh).enabled = false; } } else if (Object.op_Implicit((Object)(object)HUDPatch._textMesh)) { if (persistentCounter.Value) { ((Behaviour)HUDPatch._textMesh).enabled = false; } else { ((Behaviour)HUDPatch._textMesh).enabled = true; } } }; persistentCounter = Config.Bind<bool>("General", "PersistentCounter", false, "The counter is always showed in the corner, although it can be a bit more intrusive like this.\n\n(may not work with all mods)"); persistentCounter.SettingChanged += delegate { if (persistentCounter.Value) { if (Object.op_Implicit((Object)(object)HUDPatch._textMesh)) { ((Behaviour)HUDPatch._textMesh).enabled = false; } } else if (Object.op_Implicit((Object)(object)HUDPatch._textMesh) && !disableFPS.Value) { ((Behaviour)HUDPatch._textMesh).enabled = true; } }; refreshFrequency = Config.Bind<float>("General", "RefreshFrequency", 0.4f, "The frequency (seconds) that the fps counter updates"); refreshFrequency.SettingChanged += delegate { HUDPatch._refreshFrequency = refreshFrequency.Value; FPSCounterGUI._refreshFrequency = refreshFrequency.Value; }; } } } namespace FPSCounter.Compatibility { internal class LethalConfig { public static void init() { //IL_000f: 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_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Expected O, but got Unknown //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Expected O, but got Unknown //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Expected O, but got Unknown //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Expected O, but got Unknown //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Expected O, but got Unknown //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Expected O, but got Unknown //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Expected O, but got Unknown //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Expected O, but got Unknown //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Expected O, but got Unknown //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Expected O, but got Unknown //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Expected O, but got Unknown //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Expected O, but got Unknown FPSCounterBase.debugLog("Lethal Config spotted, loading LCManager stuff"); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(General.disableFPS, new BoolCheckBoxOptions { RequiresRestart = false, Name = "Disable Counter" })); LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatInputFieldConfigItem(General.refreshFrequency, new FloatInputFieldOptions { RequiresRestart = false, Min = 0f, Max = float.PositiveInfinity, Name = "Refresh Frequency" })); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(General.persistentCounter, new BoolCheckBoxOptions { RequiresRestart = false, Name = "Persistant Counter" })); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)new EnumDropDownConfigItem<PersistantCounter.PersistentCounterColors>(PersistantCounter.Color, new EnumDropDownOptions { RequiresRestart = false, Name = "Color" })); LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(PersistantCounter.Size, new IntSliderOptions { Min = 1, Max = 500, RequiresRestart = false, Name = "Font Size" })); LethalConfigManager.AddConfigItem((BaseConfigItem)new IntInputFieldConfigItem(PersistantCounter.XPosition, new IntInputFieldOptions { Min = -10000, Max = 10000, RequiresRestart = false, Name = "X Position" })); LethalConfigManager.AddConfigItem((BaseConfigItem)new IntInputFieldConfigItem(PersistantCounter.YPosition, new IntInputFieldOptions { Min = -10000, Max = 10000, RequiresRestart = false, Name = "Y Position" })); FloatSliderConfigItem val = new FloatSliderConfigItem(PersistantCounter.R, new FloatSliderOptions { Min = 1f, Max = 255f, RequiresRestart = false, Name = "R" }); FloatSliderConfigItem val2 = new FloatSliderConfigItem(PersistantCounter.G, new FloatSliderOptions { Min = 1f, Max = 255f, RequiresRestart = false, Name = "G" }); FloatSliderConfigItem val3 = new FloatSliderConfigItem(PersistantCounter.B, new FloatSliderOptions { Min = 1f, Max = 255f, RequiresRestart = false, Name = "B" }); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2); LethalConfigManager.AddConfigItem((BaseConfigItem)val3); } } }