using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("MonsterHPBars")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.0.2")] [assembly: AssemblyInformationalVersion("2.0.2+48510df4983b60fe42faacb98f66ed8bea073730")] [assembly: AssemblyProduct("MonsterHPBars")] [assembly: AssemblyTitle("MonsterHPBars")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.0.2.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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; } } [CompilerGenerated] [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 MonsterHPBars { public sealed class HPBarManager : MonoBehaviour { private Canvas? _overlayCanvas; private Transform? _canvasTransform; private Camera? _mainCamera; private Transform? _localPlayerTransform; private readonly Dictionary _activeBars = new Dictionary(); private readonly Queue _freePool = new Queue(); private readonly List _allCreatedBars = new List(); private readonly HashSet _currentFrameUnits = new HashSet(); private readonly List _toRemoveUnits = new List(); private static readonly Dictionary _heightCache = new Dictionary(StringComparer.OrdinalIgnoreCase); private static readonly Dictionary _damageTimes = new Dictionary(); public static HPBarManager Instance { get; private set; } = null; public static void NotifyDamage(IDamageable damageable) { if (damageable != null) { _damageTimes[damageable] = Time.time; } } private void Awake() { Instance = this; BuildCanvas(); } private void BuildCanvas() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("MonsterHPBars_OverlayCanvas"); Object.DontDestroyOnLoad((Object)(object)val); _overlayCanvas = val.AddComponent(); _overlayCanvas.renderMode = (RenderMode)0; _overlayCanvas.sortingOrder = 2000; CanvasScaler obj = val.AddComponent(); obj.uiScaleMode = (ScaleMode)1; obj.referenceResolution = new Vector2(1920f, 1080f); val.AddComponent(); _canvasTransform = val.transform; } private HPBarUI GetFreeBar() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if (_freePool.Count > 0) { return _freePool.Dequeue(); } HPBarUI hPBarUI = new GameObject($"HPBarUI_{_allCreatedBars.Count}").AddComponent(); hPBarUI.BuildUI(_canvasTransform, MonsterHPBarsPlugin.BarWidth.Value, MonsterHPBarsPlugin.BarHeight.Value); _allCreatedBars.Add(hPBarUI); return hPBarUI; } private void LateUpdate() { //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: 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_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_0321: Unknown result type (might be due to invalid IL or missing references) if (!MonsterHPBarsPlugin.IsModEnabled) { HideAllBars(); return; } if ((Object)(object)_mainCamera == (Object)null || !((Component)_mainCamera).gameObject.activeInHierarchy) { _mainCamera = Camera.main; } if ((Object)(object)_mainCamera == (Object)null) { HideAllBars(); return; } if ((Object)(object)_localPlayerTransform == (Object)null || !((Component)_localPlayerTransform).gameObject.activeInHierarchy) { _localPlayerTransform = FindLocalPlayer(); } if ((Object)(object)UnitManager.I == (Object)null || UnitManager.I.ActiveUnits == null) { HideAllBars(); return; } Vector3 val = (((Object)(object)_localPlayerTransform != (Object)null) ? _localPlayerTransform.position : Vector3.zero); bool flag = (Object)(object)_localPlayerTransform != (Object)null; float num = MonsterHPBarsPlugin.ShowRadius.Value * MonsterHPBarsPlugin.ShowRadius.Value; bool value = MonsterHPBarsPlugin.ShowOnlyEnemies.Value; bool value2 = MonsterHPBarsPlugin.ShowBossOnly.Value; bool value3 = MonsterHPBarsPlugin.AlwaysVisible.Value; float value4 = MonsterHPBarsPlugin.VisibilityDuration.Value; float deltaTime = Time.deltaTime; float time = Time.time; _currentFrameUnits.Clear(); foreach (Unit activeUnit in UnitManager.I.ActiveUnits) { if ((Object)(object)activeUnit == (Object)null || activeUnit.isPlayerCharacter) { continue; } IDamageable damageable = activeUnit.Damageable; if (damageable == null || !damageable.IsAlive || activeUnit.IsDead || damageable.CurrentHealth <= 0f || (value2 && !activeUnit.isBoss) || (value && (int)activeUnit.Team != 0)) { continue; } Vector3 position = ((Component)activeUnit).transform.position; if (flag) { Vector3 val2 = position - val; if (((Vector3)(ref val2)).sqrMagnitude > num) { continue; } } float num2 = Mathf.Max(damageable.MaxHealth, 1f); float num3 = Mathf.Clamp(damageable.CurrentHealth, 0f, num2) / num2; if (!value3 && num3 >= 1f && (!_damageTimes.TryGetValue(damageable, out var value5) || time - value5 > value4)) { continue; } float unitHeightCached = GetUnitHeightCached(activeUnit); float num4 = MonsterHPBarsPlugin.BarHeightPadding.Value; if (activeUnit.isBoss) { num4 += MonsterHPBarsPlugin.BossHeightPadding.Value; } Vector3 val3 = position + Vector3.up * (unitHeightCached + num4); Vector3 val4 = _mainCamera.WorldToScreenPoint(val3); if (!(val4.z <= 0f)) { _currentFrameUnits.Add(activeUnit); if (!_activeBars.TryGetValue(activeUnit, out HPBarUI value6)) { value6 = GetFreeBar(); value6.ResetState(num3); string unitName = CleanUnitName(activeUnit.UnitName); value6.Setup(unitName, activeUnit.isBoss, activeUnit.isEliteUnit); _activeBars[activeUnit] = value6; } _damageTimes.TryGetValue(damageable, out var value7); value6.UpdateBar(num3, value7, deltaTime); ((Transform)value6.RectTransform).position = val4; value6.SetVisible(visible: true); } } _toRemoveUnits.Clear(); foreach (KeyValuePair activeBar in _activeBars) { Unit key = activeBar.Key; if (((Object)(object)key == (Object)null || !_currentFrameUnits.Contains(key)) && (Object)(object)key != (Object)null) { _toRemoveUnits.Add(key); } } foreach (Unit toRemoveUnit in _toRemoveUnits) { if (_activeBars.TryGetValue(toRemoveUnit, out HPBarUI value8)) { value8.SetVisible(visible: false); _freePool.Enqueue(value8); _activeBars.Remove(toRemoveUnit); } } } private Transform? FindLocalPlayer() { if ((Object)(object)UnitManager.I != (Object)null && UnitManager.I.ActiveUnits != null) { foreach (Unit activeUnit in UnitManager.I.ActiveUnits) { if ((Object)(object)activeUnit != (Object)null && activeUnit.isPlayerCharacter) { return ((Component)activeUnit).transform; } } } return null; } private static float GetUnitHeightCached(Unit unit) { string key = unit.UnitName ?? "Default"; if (_heightCache.TryGetValue(key, out var value)) { return value; } float num = CalculateUnitHeight(unit); _heightCache[key] = num; return num; } private static float CalculateUnitHeight(Unit unit) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: 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) //IL_0193: 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_019c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)unit.SpatialEntity != (Object)null) { float collisionCenterYFloat = unit.SpatialEntity.CollisionCenterYFloat; float collisionHeightFloat = unit.SpatialEntity.CollisionHeightFloat; if (collisionHeightFloat > 0.1f) { return collisionCenterYFloat + collisionHeightFloat / 2f; } } Renderer[] componentsInChildren = ((Component)unit).GetComponentsInChildren(true); if (componentsInChildren != null && componentsInChildren.Length != 0) { float num = 0f; float y = ((Component)unit).transform.position.y; bool flag = false; Renderer[] array = componentsInChildren; Bounds bounds; foreach (Renderer val in array) { if (val.enabled && ((Component)val).gameObject.activeInHierarchy && ((object)val).GetType().Name.Contains("SkinnedMeshRenderer")) { bounds = val.bounds; float num2 = ((Bounds)(ref bounds)).max.y - y; if (num2 > num) { num = num2; flag = true; } } } if (!flag) { array = componentsInChildren; foreach (Renderer val2 in array) { if (!val2.enabled || !((Component)val2).gameObject.activeInHierarchy || !((object)val2).GetType().Name.Contains("MeshRenderer")) { continue; } string text = ((Object)((Component)val2).gameObject).name.ToLower(); if (!text.Contains("shadow") && !text.Contains("decal") && !text.Contains("ui") && !text.Contains("outline") && !text.Contains("range") && !text.Contains("weapon")) { bounds = val2.bounds; float num3 = ((Bounds)(ref bounds)).max.y - y; if (num3 > num) { num = num3; flag = true; } } } } if (flag && num > 0.3f) { return num; } } return 2f; } private static string CleanUnitName(string rawName) { if (string.IsNullOrEmpty(rawName)) { return ""; } if (rawName.StartsWith("boss_", StringComparison.OrdinalIgnoreCase)) { rawName = rawName.Substring(5); } try { return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(rawName.Replace('_', ' ').Trim()); } catch { return rawName.Replace('_', ' ').Trim(); } } private void HideAllBars() { foreach (KeyValuePair activeBar in _activeBars) { if ((Object)(object)activeBar.Value != (Object)null) { activeBar.Value.SetVisible(visible: false); _freePool.Enqueue(activeBar.Value); } } _activeBars.Clear(); } } public sealed class HPBarUI : MonoBehaviour { private Image? _bgImage; private Image? _fillImage; private RectTransform? _fillRT; private Image? _delayedFillImage; private RectTransform? _delayedFillRT; private Text? _nameText; private Image? _borderImage; private float _delayedFill = 1f; private float _lastFillAmount = -99f; private float _lastDelayedFill = -99f; private bool _isBoss; private bool _isElite; private string _cachedName = ""; public RectTransform RectTransform { get; private set; } public void BuildUI(Transform parent, float width, float height) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Expected O, but got Unknown //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Expected O, but got Unknown //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Unknown result type (might be due to invalid IL or missing references) //IL_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Expected O, but got Unknown //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_030e: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Unknown result type (might be due to invalid IL or missing references) //IL_032e: Unknown result type (might be due to invalid IL or missing references) //IL_0346: Unknown result type (might be due to invalid IL or missing references) //IL_036a: Unknown result type (might be due to invalid IL or missing references) //IL_0371: Expected O, but got Unknown //IL_03db: Unknown result type (might be due to invalid IL or missing references) //IL_03f7: Unknown result type (might be due to invalid IL or missing references) //IL_040d: Unknown result type (might be due to invalid IL or missing references) ((Object)((Component)this).gameObject).name = "HPBarUI_Pooled"; ((Component)this).transform.SetParent(parent, false); RectTransform = ((Component)this).gameObject.AddComponent(); RectTransform.sizeDelta = new Vector2(width + 16f, 40f); float value = MonsterHPBarsPlugin.BarOpacity.Value; GameObject val = new GameObject("HPBg"); val.transform.SetParent(((Component)this).transform, false); _bgImage = val.AddComponent(); ((Graphic)_bgImage).color = new Color(0.04f, 0.04f, 0.06f, 0.5f * value); RectTransform component = val.GetComponent(); component.anchorMin = new Vector2(0.5f, 0.5f); component.anchorMax = new Vector2(0.5f, 0.5f); component.pivot = new Vector2(0.5f, 0.5f); component.anchoredPosition = Vector2.zero; component.sizeDelta = new Vector2(width + 3f, height + 3f); GameObject val2 = new GameObject("HPDelayFill"); val2.transform.SetParent(((Component)this).transform, false); _delayedFillImage = val2.AddComponent(); ((Graphic)_delayedFillImage).color = new Color(0.95f, 0.9f, 0.2f, 0.35f * value); _delayedFillRT = val2.GetComponent(); _delayedFillRT.anchorMin = new Vector2(0.5f, 0.5f); _delayedFillRT.anchorMax = new Vector2(0.5f, 0.5f); _delayedFillRT.pivot = new Vector2(0f, 0.5f); _delayedFillRT.anchoredPosition = new Vector2((0f - width) / 2f, 0f); _delayedFillRT.sizeDelta = new Vector2(width, height); GameObject val3 = new GameObject("HPFill"); val3.transform.SetParent(((Component)this).transform, false); _fillImage = val3.AddComponent(); Color value2 = MonsterHPBarsPlugin.HealthyColor.Value; value2.a *= value; ((Graphic)_fillImage).color = value2; _fillRT = val3.GetComponent(); _fillRT.anchorMin = new Vector2(0.5f, 0.5f); _fillRT.anchorMax = new Vector2(0.5f, 0.5f); _fillRT.pivot = new Vector2(0f, 0.5f); _fillRT.anchoredPosition = new Vector2((0f - width) / 2f, 0f); _fillRT.sizeDelta = new Vector2(width, height); GameObject val4 = new GameObject("HPBorder"); val4.transform.SetParent(((Component)this).transform, false); _borderImage = val4.AddComponent(); RectTransform component2 = val4.GetComponent(); component2.anchorMin = new Vector2(0.5f, 0.5f); component2.anchorMax = new Vector2(0.5f, 0.5f); component2.pivot = new Vector2(0.5f, 0.5f); component2.anchoredPosition = Vector2.zero; component2.sizeDelta = new Vector2(width + 6f, height + 6f); val4.transform.SetSiblingIndex(0); val4.SetActive(false); GameObject val5 = new GameObject("NameLabel"); val5.transform.SetParent(((Component)this).transform, false); _nameText = val5.AddComponent(); _nameText.fontSize = 12; _nameText.font = Resources.GetBuiltinResource("LegacyRuntime.ttf"); _nameText.alignment = (TextAnchor)4; ((Graphic)_nameText).color = new Color(1f, 1f, 1f, 0.8f * value); RectTransform component3 = val5.GetComponent(); component3.anchoredPosition = new Vector2(0f, 20f); component3.sizeDelta = new Vector2(width + 30f, 18f); } public void ResetState(float initialFill) { _delayedFill = Mathf.Clamp01(initialFill); _lastFillAmount = -99f; _lastDelayedFill = -99f; _cachedName = ""; } public void Setup(string unitName, bool isBoss, bool isElite) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) _isBoss = isBoss; _isElite = isElite; float value = MonsterHPBarsPlugin.BarOpacity.Value; if ((Object)(object)_borderImage != (Object)null) { if (isBoss || isElite) { ((Component)_borderImage).gameObject.SetActive(true); Color color = (isBoss ? MonsterHPBarsPlugin.BossColor.Value : MonsterHPBarsPlugin.EliteColor.Value); color.a = 0.65f * value; ((Graphic)_borderImage).color = color; } else { ((Component)_borderImage).gameObject.SetActive(false); } } if ((Object)(object)_nameText != (Object)null) { bool flag = MonsterHPBarsPlugin.ShowLabel.Value && !string.IsNullOrWhiteSpace(unitName) && !unitName.Equals("Unit", StringComparison.OrdinalIgnoreCase); ((Component)_nameText).gameObject.SetActive(flag); if (flag && _cachedName != unitName) { _nameText.text = unitName; _cachedName = unitName; Color color2 = (Color)(isBoss ? MonsterHPBarsPlugin.BossColor.Value : (isElite ? MonsterHPBarsPlugin.EliteColor.Value : new Color(1f, 1f, 1f, 0.8f))); color2.a *= value; ((Graphic)_nameText).color = color2; _nameText.fontStyle = (FontStyle)((isBoss || isElite) ? 1 : 0); } } } public void UpdateBar(float fill, float lastDamageTime, float deltaTime) { //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_018a: 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_0197: Unknown result type (might be due to invalid IL or missing references) fill = Mathf.Clamp01(fill); float value = MonsterHPBarsPlugin.BarOpacity.Value; if (fill < _delayedFill) { if (Time.time - lastDamageTime > 0.3f) { _delayedFill = Mathf.MoveTowards(_delayedFill, fill, 0.8f * deltaTime); } } else { _delayedFill = fill; } float value2 = MonsterHPBarsPlugin.BarWidth.Value; float value3 = MonsterHPBarsPlugin.BarHeight.Value; if ((Object)(object)_delayedFillRT != (Object)null && Mathf.Abs(_delayedFill - _lastDelayedFill) > 0.001f) { _delayedFillRT.sizeDelta = new Vector2(value2 * _delayedFill, value3); _lastDelayedFill = _delayedFill; } if ((Object)(object)_delayedFillImage != (Object)null) { ((Graphic)_delayedFillImage).color = new Color(0.95f, 0.9f, 0.2f, 0.35f * value); } if ((Object)(object)_fillRT != (Object)null && (Object)(object)_fillImage != (Object)null) { if (Mathf.Abs(fill - _lastFillAmount) > 0.001f) { _fillRT.sizeDelta = new Vector2(value2 * fill, value3); _lastFillAmount = fill; } Color val = ((fill <= MonsterHPBarsPlugin.CriticalThreshold.Value) ? MonsterHPBarsPlugin.CriticalColor.Value : ((!(fill <= MonsterHPBarsPlugin.DamagedThreshold.Value)) ? MonsterHPBarsPlugin.HealthyColor.Value : MonsterHPBarsPlugin.DamagedColor.Value)); val.a *= value; ((Graphic)_fillImage).color = Color.Lerp(((Graphic)_fillImage).color, val, deltaTime * 8f); } if ((Object)(object)_bgImage != (Object)null) { ((Graphic)_bgImage).color = new Color(0.04f, 0.04f, 0.06f, 0.5f * value); } } public void SetVisible(bool visible) { if (((Component)this).gameObject.activeSelf != visible) { ((Component)this).gameObject.SetActive(visible); } } } [BepInPlugin("com.sineusarena.monsterhpbars", "Monster HP Bars", "2.0.2")] public class MonsterHPBarsPlugin : BaseUnityPlugin { private Harmony _harmony; public static MonsterHPBarsPlugin Instance { get; private set; } = null; internal static ManualLogSource Log { get; private set; } = null; public static bool IsModEnabled { get; private set; } = true; public static ConfigEntry ToggleKey { get; private set; } = null; public static ConfigEntry ShowOnlyEnemies { get; private set; } = null; public static ConfigEntry ShowBossOnly { get; private set; } = null; public static ConfigEntry ShowRadius { get; private set; } = null; public static ConfigEntry BarWidth { get; private set; } = null; public static ConfigEntry BarHeight { get; private set; } = null; public static ConfigEntry BarOpacity { get; private set; } = null; public static ConfigEntry BarHeightPadding { get; private set; } = null; public static ConfigEntry BossHeightPadding { get; private set; } = null; public static ConfigEntry ShowLabel { get; private set; } = null; public static ConfigEntry HealthyColor { get; private set; } = null; public static ConfigEntry DamagedColor { get; private set; } = null; public static ConfigEntry CriticalColor { get; private set; } = null; public static ConfigEntry EliteColor { get; private set; } = null; public static ConfigEntry BossColor { get; private set; } = null; public static ConfigEntry DamagedThreshold { get; private set; } = null; public static ConfigEntry CriticalThreshold { get; private set; } = null; public static ConfigEntry AlwaysVisible { get; private set; } = null; public static ConfigEntry VisibilityDuration { get; private set; } = null; private void Awake() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown Instance = this; Log = ((BaseUnityPlugin)this).Logger; BindConfig(); _harmony = new Harmony("com.sineusarena.monsterhpbars"); _harmony.PatchAll(typeof(UnitPatches)); ((Component)this).gameObject.AddComponent(); Log.LogInfo((object)"Monster HP Bars v2.0.2 loaded successfully! Press F4 to toggle."); } private void Update() { //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) KeyboardShortcut value = ToggleKey.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { ToggleMod(); } } private void ToggleMod() { IsModEnabled = !IsModEnabled; Log.LogInfo((object)("Monster HP Bars toggled " + (IsModEnabled ? "ON" : "OFF"))); } private void BindConfig() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: 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_023e: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) ToggleKey = ((BaseUnityPlugin)this).Config.Bind("1 - General", "ToggleKey", new KeyboardShortcut((KeyCode)285, Array.Empty()), "Key to toggle the mod on/off."); ShowOnlyEnemies = ((BaseUnityPlugin)this).Config.Bind("1 - General", "ShowOnlyEnemies", true, "Only show HP bars on enemy (Neutral team) units."); ShowBossOnly = ((BaseUnityPlugin)this).Config.Bind("1 - General", "ShowBossOnly", false, "Only show HP bars on boss units."); ShowRadius = ((BaseUnityPlugin)this).Config.Bind("1 - General", "ShowRadius", 40f, "Only show HP bars within this distance (in units) from the player."); AlwaysVisible = ((BaseUnityPlugin)this).Config.Bind("1 - General", "AlwaysVisible", true, "Always show bars, even when unit is at full health."); VisibilityDuration = ((BaseUnityPlugin)this).Config.Bind("1 - General", "VisibilityDuration", 5f, "Seconds the bar stays visible after damage (when AlwaysVisible is false)."); BarWidth = ((BaseUnityPlugin)this).Config.Bind("2 - Appearance", "BarWidth", 90f, "Width of the HP bar in pixels."); BarHeight = ((BaseUnityPlugin)this).Config.Bind("2 - Appearance", "BarHeight", 7f, "Height of the HP bar in pixels."); BarOpacity = ((BaseUnityPlugin)this).Config.Bind("2 - Appearance", "BarOpacity", 0.65f, "Overall opacity/transparency of the HP bar (0.0 = invisible, 1.0 = fully opaque)."); BarHeightPadding = ((BaseUnityPlugin)this).Config.Bind("2 - Appearance", "BarHeightPadding", 1.5f, "Additional vertical padding above the unit's head."); BossHeightPadding = ((BaseUnityPlugin)this).Config.Bind("2 - Appearance", "BossHeightPadding", 0.5f, "Extra vertical padding added *only* to boss health bars."); ShowLabel = ((BaseUnityPlugin)this).Config.Bind("2 - Appearance", "ShowLabel", true, "Show unit name label above the bar."); HealthyColor = ((BaseUnityPlugin)this).Config.Bind("3 - Colors", "HealthyColor", new Color(0.15f, 0.85f, 0.25f, 0.65f), "Bar color at high HP."); DamagedColor = ((BaseUnityPlugin)this).Config.Bind("3 - Colors", "DamagedColor", new Color(0.95f, 0.75f, 0.1f, 0.65f), "Bar color at medium HP."); CriticalColor = ((BaseUnityPlugin)this).Config.Bind("3 - Colors", "CriticalColor", new Color(0.95f, 0.15f, 0.1f, 0.65f), "Bar color at low HP."); EliteColor = ((BaseUnityPlugin)this).Config.Bind("3 - Colors", "EliteColor", new Color(0.75f, 0.2f, 0.95f, 0.8f), "Accent color for elite units."); BossColor = ((BaseUnityPlugin)this).Config.Bind("3 - Colors", "BossColor", new Color(0.95f, 0.4f, 0.05f, 0.85f), "Accent color for boss units."); DamagedThreshold = ((BaseUnityPlugin)this).Config.Bind("3 - Colors", "DamagedThreshold", 0.6f, "HP fraction below which the 'DamagedColor' is used."); CriticalThreshold = ((BaseUnityPlugin)this).Config.Bind("3 - Colors", "CriticalThreshold", 0.25f, "HP fraction below which the 'CriticalColor' is used."); } private void OnDestroy() { _harmony.UnpatchSelf(); } } internal static class MyPluginInfo { public const string PLUGIN_GUID = "com.sineusarena.monsterhpbars"; public const string PLUGIN_NAME = "Monster HP Bars"; public const string PLUGIN_VERSION = "2.0.2"; } internal static class UnitPatches { [HarmonyPatch(typeof(SimpleDamageable), "TakeDamage")] [HarmonyPostfix] private static void SimpleDamageable_TakeDamage_Postfix(SimpleDamageable __instance) { if ((Object)(object)__instance != (Object)null) { HPBarManager.NotifyDamage((IDamageable)(object)__instance); } } } }