using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using TMPro; using UnityEngine; 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: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyVersion("1.0.0.0")] public class AedenthornUtils { public static bool IgnoreKeyPresses(bool extra = false) { if (!extra) { int result; if (!((Object)(object)ZNetScene.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null) && !Minimap.IsOpen() && !Console.IsVisible() && !TextInput.IsVisible() && !ZNet.instance.InPasswordDialog()) { Chat instance = Chat.instance; result = ((instance != null && instance.HasFocus()) ? 1 : 0); } else { result = 1; } return (byte)result != 0; } int result2; if (!((Object)(object)ZNetScene.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null) && !Minimap.IsOpen() && !Console.IsVisible() && !TextInput.IsVisible() && !ZNet.instance.InPasswordDialog()) { Chat instance2 = Chat.instance; if ((instance2 == null || !instance2.HasFocus()) && !StoreGui.IsVisible() && !InventoryGui.IsVisible() && !Menu.IsVisible()) { TextViewer instance3 = TextViewer.instance; result2 = ((instance3 != null && instance3.IsVisible()) ? 1 : 0); goto IL_00d2; } } result2 = 1; goto IL_00d2; IL_00d2: return (byte)result2 != 0; } public static bool CheckKeyDown(string value) { try { return Input.GetKeyDown(value.ToLower()); } catch { return false; } } public static bool CheckKeyHeld(string value, bool req = true) { try { return Input.GetKey(value.ToLower()); } catch { return !req; } } } namespace AmmoCount; [BepInPlugin("aedenthorn.AmmoCount", "Ammo Count", "0.4.0")] public class BepInExPlugin : BaseUnityPlugin { [HarmonyPatch(typeof(HotkeyBar), "Update")] private static class HotkeyBar_Update_Patch { private static void Postfix(HotkeyBar __instance, List ___m_items) { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Expected O, but got Unknown //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Expected O, but got Unknown //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Expected O, but got Unknown //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Expected O, but got Unknown //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0284: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Expected O, but got Unknown //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_030f: Unknown result type (might be due to invalid IL or missing references) if (!modEnabled.Value || !Object.op_Implicit((Object)(object)Player.m_localPlayer)) { return; } IEnumerable enumerable = elementsAmmo.GetValue(__instance) as IEnumerable; if (reset) { currentFont = GetFont(ammoStringFont.Value, ammoStringSize.Value); } using (IEnumerator enumerator = enumerable.GetEnumerator()) { while (enumerator.MoveNext()) { if (enumerator.Current != null) { GameObject val = (GameObject)AccessTools.Field(enumerator.Current.GetType(), "m_go").GetValue(enumerator.Current); Transform val2 = val.transform.Find("AmmoCount"); if ((Object)(object)val2 != (Object)null && (reset || !(bool)AccessTools.Field(enumerator.Current.GetType(), "m_used").GetValue(enumerator.Current))) { Object.Destroy((Object)(object)((Component)val2).gameObject); } } } } reset = false; for (int i = 0; i < ___m_items.Count(); i++) { int x = ___m_items[i].m_gridPos.x; if (x < 0 || x >= enumerable.Count() || enumerable.ElementAt(x) == null) { continue; } GameObject val3 = (GameObject)AccessTools.Field(enumerable.ElementAt(x).GetType(), "m_go").GetValue(enumerable.ElementAt(x)); Transform val4 = val3.transform.Find("AmmoCount"); if (val4 == null) { GameObject val5 = new GameObject("AmmoCount"); val5.transform.SetParent(val3.transform); val5.AddComponent().anchoredPosition = Vector2.zero; val4 = val5.transform; GameObject val6 = new GameObject("Text"); val6.transform.SetParent(val5.transform); TextMeshProUGUI val7 = val6.AddComponent(); val6.GetComponent().anchoredPosition = ammoStringPosition.Value; val6.GetComponent().sizeDelta = new Vector2(90f, 90f); ((TMP_Text)val7).font = currentFont; ((TMP_Text)val7).fontSize = ammoStringSize.Value; ((TMP_Text)val7).fontStyle = ammoStringFontStyle.Value; ((TMP_Text)val7).alignment = ammoStringAlignment.Value; ((Graphic)val7).color = ammoStringColor.Value; if (showIcon.Value) { GameObject val8 = new GameObject("Icon"); val8.transform.SetParent(val5.transform); val8.AddComponent(); val8.GetComponent().anchoredPosition = iconPosition.Value; val8.GetComponent().sizeDelta = iconSize.Value; } } CheckAmmo(___m_items[i], ((Component)val4).gameObject); } } private static void CheckAmmo(ItemData itemData, GameObject go) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Invalid comparison between Unknown and I4 if (string.IsNullOrEmpty(itemData.m_shared.m_ammoType) || (int)itemData.m_shared.m_itemType == 9) { go.SetActive(false); return; } ItemData val = FindAmmo(itemData); if (val == null) { go.SetActive(false); return; } go.SetActive(true); if (!string.IsNullOrEmpty(ammoStringFormat.Value)) { ((TMP_Text)((Component)go.transform.Find("Text")).GetComponent()).text = ammoStringFormat.Value.Replace("{amount}", val.m_stack.ToString()).Replace("{name}", Localization.instance.Localize(val.m_shared.m_name)); } if (showIcon.Value) { ((Component)go.transform.Find("Icon")).GetComponent().sprite = val.GetIcon(); } } private static ItemData FindAmmo(ItemData weapon) { if (string.IsNullOrEmpty(weapon.m_shared.m_ammoType)) { return null; } ItemData val = ((Humanoid)Player.m_localPlayer).GetAmmoItem(); if (val != null && (!((Humanoid)Player.m_localPlayer).GetInventory().ContainsItem(val) || val.m_shared.m_ammoType != weapon.m_shared.m_ammoType)) { val = null; } if (val == null) { val = ((Humanoid)Player.m_localPlayer).GetInventory().GetAmmoItem(weapon.m_shared.m_ammoType, (string)null); } return val; } } [HarmonyPatch(typeof(Terminal), "InputText")] private static class InputText_Patch { private static bool Prefix(Terminal __instance) { if (!modEnabled.Value) { return true; } string text = ((TMP_InputField)__instance.m_input).text; if (text.ToLower().Equals(typeof(BepInExPlugin).Namespace.ToLower() + " reset")) { ((BaseUnityPlugin)context).Config.Reload(); ((BaseUnityPlugin)context).Config.Save(); currentFont = GetFont(ammoStringFont.Value, ammoStringSize.Value); reset = true; Traverse.Create((object)__instance).Method("AddString", new object[1] { text }).GetValue(); Traverse.Create((object)__instance).Method("AddString", new object[1] { ((BaseUnityPlugin)context).Info.Metadata.Name + " config reloaded" }).GetValue(); return false; } return true; } } private static readonly bool isDebug = true; private static BepInExPlugin context; private Harmony harmony; public static ConfigEntry modEnabled; public static ConfigEntry nexusID; public static ConfigEntry showIcon; public static ConfigEntry iconPosition; public static ConfigEntry iconSize; public static ConfigEntry ammoStringFormat; public static ConfigEntry ammoStringSize; public static ConfigEntry ammoStringFont; public static ConfigEntry ammoStringFontStyle; public static ConfigEntry ammoStringAlignment; public static ConfigEntry ammoStringColor; public static ConfigEntry ammoStringPosition; public static FieldInfo elementsAmmo; public static TMP_FontAsset currentFont; public static bool reset = true; public static void Dbgl(object obj, bool pref = true) { if (isDebug) { ((BaseUnityPlugin)context).Logger.Log((LogLevel)16, (object)((pref ? (typeof(BepInExPlugin).Namespace + " ") : "") + obj)); } } private void Awake() { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_02ea: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Expected O, but got Unknown context = this; modEnabled = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Enable this mod"); nexusID = ((BaseUnityPlugin)this).Config.Bind("General", "NexusID", 2273, "Nexus mod ID for updates"); showIcon = ((BaseUnityPlugin)this).Config.Bind("Options", "ShowIcon", true, "Show Ammo Icon"); iconPosition = ((BaseUnityPlugin)this).Config.Bind("Options", "IconPosition", new Vector2(0f, 32f), "Icon position"); iconSize = ((BaseUnityPlugin)this).Config.Bind("Options", "IconSize", new Vector2(20f, 20f), "Icon Size"); ammoStringFormat = ((BaseUnityPlugin)this).Config.Bind("Options", "AmmoTextFormat", "{amount}", "Ammo string. Use {amount} and/or {name}"); ammoStringSize = ((BaseUnityPlugin)this).Config.Bind("Options", "AmmoTextSize", 16, "Ammo count size."); ammoStringFont = ((BaseUnityPlugin)this).Config.Bind("Options", "AmmoTextFont", "AveriaSansLibre-Bold", "Ammo count font"); ammoStringFontStyle = ((BaseUnityPlugin)this).Config.Bind("Options", "AmmoTextFontStyle", (FontStyles)1, "Ammo count font style"); ammoStringAlignment = ((BaseUnityPlugin)this).Config.Bind("Options", "AmmoTextAlignment", (TextAlignmentOptions)260, "Ammo count alignment"); ammoStringColor = ((BaseUnityPlugin)this).Config.Bind("Options", "AmmoTextColor", new Color(1f, 1f, 1f, 1f), "Ammo count color"); ammoStringPosition = ((BaseUnityPlugin)this).Config.Bind("Options", "AmmoTextPosition", new Vector2(-6f, -4f), "Ammo count position offset"); elementsAmmo = AccessTools.Field(typeof(HotkeyBar), "m_elements"); ammoStringFont.SettingChanged += SettingChanged; showIcon.SettingChanged += SettingChanged; iconPosition.SettingChanged += SettingChanged; iconSize.SettingChanged += SettingChanged; ammoStringFormat.SettingChanged += SettingChanged; ammoStringSize.SettingChanged += SettingChanged; ammoStringFontStyle.SettingChanged += SettingChanged; ammoStringAlignment.SettingChanged += SettingChanged; ammoStringColor.SettingChanged += SettingChanged; ammoStringPosition.SettingChanged += SettingChanged; harmony = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); harmony.PatchAll(); } private void SettingChanged(object sender, EventArgs e) { reset = true; } private void OnDestroy() { Dbgl("Destroying plugin"); Harmony obj = harmony; if (obj != null) { obj.UnpatchAll((string)null); } } private static TMP_FontAsset GetFont(string fontName, int fontSize) { try { TMP_FontAsset[] array = Resources.FindObjectsOfTypeAll(); TMP_FontAsset[] array2 = array; foreach (TMP_FontAsset val in array2) { if (((Object)val).name == fontName) { return val; } } } catch { } return currentFont; } }