Please disclose if any significant portion of your mod was created 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 AnotherEnemyHealthBars v1.1.3
AnotherEnemyHealthBars\AnotherEnemyHealthBars.dll
Decompiled 2 days agousing System; using System.Diagnostics; 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 TMPro; 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: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: AssemblyCompany("AnotherEnemyHealthBars")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.3.0")] [assembly: AssemblyInformationalVersion("1.1.3+67a17c07d83219143096295278d9339c836bb50d")] [assembly: AssemblyProduct("AnotherEnemyHealthBars")] [assembly: AssemblyTitle("AnotherEnemyHealthBars")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.3.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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 AnotherEnemyHealthBars { internal sealed class HealthBarView : MonoBehaviour { private EnemyHealth health; private Enemy enemy; private GameObject root; private Canvas canvas; private RectTransform canvasRect; private Image fill; private Image frame; private TextMeshProUGUI label; private float hideAt; private float headOffset = 1.6f; private float nextHeadProbe; private float smoothedFill = 1f; private int predictedMaxHealth = -1; private int predictedCurrentHealth = -1; private const float BaseScale = 0.0065f; private static Sprite whiteSprite; private static Sprite White() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)whiteSprite == (Object)null) { Texture2D whiteTexture = Texture2D.whiteTexture; whiteSprite = Sprite.Create(whiteTexture, new Rect(0f, 0f, (float)((Texture)whiteTexture).width, (float)((Texture)whiteTexture).height), new Vector2(0.5f, 0.5f), 100f); } return whiteSprite; } private void Awake() { health = ((Component)this).GetComponent<EnemyHealth>(); if ((Object)(object)health != (Object)null) { enemy = health.enemy; } } internal void Reveal() { hideAt = Time.time + Mathf.Max(0.5f, Plugin.DisplaySeconds.Value); } internal void ObserveDamage(int amount) { if (amount > 0) { int num = ReadActualMaxHealth(); int num2 = ReadActualCurrentHealth(num); if (predictedMaxHealth < 1) { predictedMaxHealth = num; } else if (num > 0) { predictedMaxHealth = Mathf.Max(predictedMaxHealth, num); } if (predictedCurrentHealth < 0) { predictedCurrentHealth = num2; } else if (num2 >= 0 && num2 < predictedCurrentHealth) { predictedCurrentHealth = num2; } if (predictedCurrentHealth < 0) { predictedCurrentHealth = num2; } predictedCurrentHealth = Mathf.Clamp(predictedCurrentHealth - amount, 0, Mathf.Max(1, predictedMaxHealth)); smoothedFill = Mathf.Min(smoothedFill, (float)predictedCurrentHealth / (float)Mathf.Max(1, predictedMaxHealth)); } } internal void PopDamage(int amount) { //IL_0006: 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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) DamagePopup.Spawn(BarAnchor().position + Vector3.up * (headOffset + 0.2f), amount); } private Transform BarAnchor() { if ((Object)(object)enemy == (Object)null && (Object)(object)health != (Object)null) { enemy = health.enemy; } if ((Object)(object)enemy != (Object)null) { if ((Object)(object)enemy.CenterTransform != (Object)null) { return enemy.CenterTransform; } if (enemy.HasRigidbody && (Object)(object)enemy.Rigidbody != (Object)null) { return ((Component)enemy.Rigidbody).transform; } } return ((Component)this).transform; } private bool Grabbed() { if ((Object)(object)enemy != (Object)null && enemy.HasRigidbody && (Object)(object)enemy.Rigidbody != (Object)null) { return enemy.Rigidbody.grabbed; } return false; } private void Build() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Expected O, but got Unknown //IL_016e: Unknown result type (might be due to invalid IL or missing references) root = new GameObject("AEHB_HealthBar"); root.transform.SetParent(((Component)this).transform, false); canvas = root.AddComponent<Canvas>(); canvas.renderMode = (RenderMode)2; canvasRect = ((Component)canvas).GetComponent<RectTransform>(); canvasRect.sizeDelta = new Vector2(220f, 30f); ((Transform)canvasRect).localScale = Vector3.one * 0.0065f; frame = NewImage((Transform)(object)canvasRect, Palette.Background); Stretch(((Graphic)frame).rectTransform, 0f); fill = NewImage((Transform)(object)canvasRect, Palette.BarHigh); Stretch(((Graphic)fill).rectTransform, 3f); fill.type = (Type)3; fill.fillMethod = (FillMethod)0; fill.fillOrigin = 0; fill.fillAmount = 1f; GameObject val = new GameObject("Text"); val.transform.SetParent((Transform)(object)canvasRect, false); label = val.AddComponent<TextMeshProUGUI>(); ((TMP_Text)label).alignment = (TextAlignmentOptions)514; ((TMP_Text)label).enableAutoSizing = false; ((TMP_Text)label).fontSize = 14f; ((Graphic)label).color = Color.white; Stretch(((TMP_Text)label).rectTransform, 0f); } private static Image NewImage(Transform parent, Color color) { //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_0028: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Img"); val.transform.SetParent(parent, false); Image obj = val.AddComponent<Image>(); obj.sprite = White(); ((Graphic)obj).color = color; ((Graphic)obj).raycastTarget = false; return obj; } private static void Stretch(RectTransform rt, float inset) { //IL_0001: 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_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) rt.anchorMin = Vector2.zero; rt.anchorMax = Vector2.one; rt.offsetMin = new Vector2(inset, inset); rt.offsetMax = new Vector2(0f - inset, 0f - inset); } private void ProbeHeadOffset(Transform anchor) { //IL_009c: Unknown result type (might be due to invalid IL or missing references) if (!(Time.time < nextHeadProbe)) { nextHeadProbe = Time.time + 0.5f; if (TryGetTop(((Object)(object)enemy != (Object)null && (Object)(object)enemy.EnemyParent != (Object)null) ? ((Component)enemy.EnemyParent).transform : (((Object)(object)health != (Object)null && (Object)(object)((Component)health).transform.parent != (Object)null) ? ((Component)health).transform.parent : ((Component)this).transform), out var topY)) { headOffset = Mathf.Clamp(topY - anchor.position.y + 0.15f, 0.3f, 18f); } } } private static bool TryGetTop(Transform node, out float topY) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) topY = 0f; bool flag = false; Renderer[] componentsInChildren = ((Component)node).GetComponentsInChildren<Renderer>(false); foreach (Renderer val in componentsInChildren) { if (!((Object)(object)val == (Object)null) && !(((object)val).GetType().Name == "ParticleSystemRenderer")) { Bounds bounds = val.bounds; float y = ((Bounds)(ref bounds)).max.y; if (!flag || y > topY) { topY = y; flag = true; } } } return flag; } private void LateUpdate() { //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: 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_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02ad: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Unknown result type (might be due to invalid IL or missing references) //IL_02e8: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_0317: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)health == (Object)null) { if ((Object)(object)root != (Object)null) { Object.Destroy((Object)(object)root); } Object.Destroy((Object)(object)this); return; } bool flag = Plugin.ShowOnGrab.Value && Grabbed(); if (!(Plugin.AlwaysVisible.Value || flag) && !(Time.time < hideAt)) { if ((Object)(object)root != (Object)null && root.activeSelf) { root.SetActive(false); } return; } if ((Object)(object)root == (Object)null) { Build(); } if (!root.activeSelf) { root.SetActive(true); } Camera main = Camera.main; if ((Object)(object)main == (Object)null) { return; } Transform val = BarAnchor(); ProbeHeadOffset(val); Vector3 val2 = default(Vector3); ((Vector3)(ref val2))..ctor(val.position.x, val.position.y + headOffset + Plugin.HeightOffset.Value, val.position.z); root.transform.position = val2; root.transform.rotation = ((Component)main).transform.rotation; ((Transform)canvasRect).localScale = Vector3.one * (0.0065f * Mathf.Max(0.05f, Plugin.BarScale.Value)); int num = ReadActualMaxHealth(); int num2 = ReadActualCurrentHealth(num); if (predictedMaxHealth > 0) { num = Mathf.Max(num, predictedMaxHealth); } if (predictedCurrentHealth >= 0) { num2 = Mathf.Min(num2, predictedCurrentHealth); if (actualCurrentLooksStale(num2, num)) { num2 = predictedCurrentHealth; } } predictedMaxHealth = num; predictedCurrentHealth = num2; float num3 = (float)num2 / (float)num; smoothedFill = Mathf.Lerp(smoothedFill, num3, Time.deltaTime * 12f); fill.fillAmount = smoothedFill; float num4 = Mathf.Clamp01(1f - Vector3.Distance(((Component)main).transform.position, val2) / Mathf.Max(1f, Plugin.FadeDistance.Value)); if (Plugin.RequireLineOfSight.Value && !HasLineOfSight(((Component)main).transform.position, val.position)) { num4 = 0f; } if (!Plugin.AlwaysVisible.Value && !flag) { float num5 = hideAt - Time.time; if (num5 < 0.5f) { num4 *= Mathf.Clamp01(num5 / 0.5f); } } Color color = Color.Lerp(Palette.BarLow, Palette.BarHigh, num3); color.a *= num4; ((Graphic)fill).color = color; Color background = Palette.Background; background.a *= num4; ((Graphic)frame).color = background; ((TMP_Text)label).text = num2 + " / " + num; Color text = Palette.Text; text.a *= num4; ((Graphic)label).color = text; } private int ReadActualMaxHealth() { return Mathf.Max(1, (!((Object)(object)health != (Object)null)) ? 1 : health.health); } private int ReadActualCurrentHealth(int max) { return Mathf.Clamp(((Object)(object)health != (Object)null) ? health.healthCurrent : max, 0, max); } private bool actualCurrentLooksStale(int actualCurrent, int max) { if (actualCurrent >= max && predictedCurrentHealth >= 0) { return predictedCurrentHealth < max; } return false; } private bool HasLineOfSight(Vector3 from, Vector3 to) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //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_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: 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_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) Vector3 val = to - from; float magnitude = ((Vector3)(ref val)).magnitude; if (magnitude <= 0.01f) { return true; } Vector3 val2 = val / magnitude; Vector3 val3 = from + val2 * 0.05f; float num = Mathf.Max(0f, magnitude - 0.05f); RaycastHit[] array = Physics.RaycastAll(val3, val2, num, -5, (QueryTriggerInteraction)1); if (array.Length == 0) { return true; } Array.Sort(array, (RaycastHit a, RaycastHit b) => ((RaycastHit)(ref a)).distance.CompareTo(((RaycastHit)(ref b)).distance)); Transform val4 = (((Object)(object)PlayerAvatar.instance != (Object)null) ? ((Component)PlayerAvatar.instance).transform.root : null); Transform val5 = ((Component)this).transform.root; RaycastHit[] array2 = array; for (int num2 = 0; num2 < array2.Length; num2++) { RaycastHit val6 = array2[num2]; if ((Object)(object)((RaycastHit)(ref val6)).collider == (Object)null) { continue; } Transform val7 = ((Component)((RaycastHit)(ref val6)).collider).transform.root; if (!((Object)(object)val4 != (Object)null) || !((Object)(object)val7 == (Object)(object)val4)) { if ((Object)(object)val7 == (Object)(object)val5) { return true; } return false; } } return true; } private void OnDestroy() { if ((Object)(object)root != (Object)null) { Object.Destroy((Object)(object)root); } } } internal sealed class DamagePopup : MonoBehaviour { private TextMeshProUGUI text; private float age; private const float Life = 1.15f; private Vector3 start; internal static void Spawn(Vector3 worldPos, int amount) { //IL_0005: 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) new GameObject("AEHB_Damage").AddComponent<DamagePopup>().Setup(worldPos, amount); } private void Setup(Vector3 worldPos, int amount) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: 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_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: 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_011b: 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_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) start = worldPos + Random.insideUnitSphere * 0.25f; Canvas obj = ((Component)this).gameObject.AddComponent<Canvas>(); obj.renderMode = (RenderMode)2; RectTransform component = ((Component)obj).GetComponent<RectTransform>(); component.sizeDelta = new Vector2(140f, 70f); ((Transform)component).localScale = Vector3.one * (0.01f * Mathf.Max(0.05f, Plugin.DamageNumberScale.Value)); GameObject val = new GameObject("Text"); val.transform.SetParent((Transform)(object)component, false); text = val.AddComponent<TextMeshProUGUI>(); ((TMP_Text)text).alignment = (TextAlignmentOptions)514; ((TMP_Text)text).enableAutoSizing = false; ((TMP_Text)text).fontStyle = (FontStyles)1; RectTransform rectTransform = ((TMP_Text)text).rectTransform; rectTransform.anchorMin = Vector2.zero; rectTransform.anchorMax = Vector2.one; rectTransform.offsetMin = Vector2.zero; rectTransform.offsetMax = Vector2.zero; ((TMP_Text)text).text = "-" + amount; if (amount >= 50) { ((Graphic)text).color = Palette.DmgLarge; ((TMP_Text)text).fontSize = 44f; } else if (amount >= 20) { ((Graphic)text).color = Palette.DmgMedium; ((TMP_Text)text).fontSize = 36f; } else { ((Graphic)text).color = Palette.DmgSmall; ((TMP_Text)text).fontSize = 28f; } ((Component)this).transform.position = start; } private void LateUpdate() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) age += Time.deltaTime; float num = age / 1.15f; if (num >= 1f) { Object.Destroy((Object)(object)((Component)this).gameObject); return; } ((Component)this).transform.position = start + Vector3.up * (num * 1.1f); Camera main = Camera.main; if ((Object)(object)main != (Object)null) { ((Component)this).transform.rotation = ((Component)main).transform.rotation; } if ((Object)(object)text != (Object)null) { ((TMP_Text)text).alpha = 1f - num * num; } } } [BepInPlugin("com.riggola.anotherenemyhealthbars", "AnotherEnemyHealthBars", "1.1.3")] public class Plugin : BaseUnityPlugin { public const string Guid = "com.riggola.anotherenemyhealthbars"; public const string Name = "AnotherEnemyHealthBars"; public const string Version = "1.1.3"; internal static ManualLogSource Log; internal static ConfigEntry<float> HeightOffset; internal static ConfigEntry<float> DisplaySeconds; internal static ConfigEntry<float> FadeDistance; internal static ConfigEntry<bool> ShowOnGrab; internal static ConfigEntry<bool> ShowDamageNumbers; internal static ConfigEntry<bool> AlwaysVisible; internal static ConfigEntry<bool> RequireLineOfSight; internal static ConfigEntry<float> BarScale; internal static ConfigEntry<float> DamageNumberScale; internal static ConfigEntry<string> BarColorHigh; internal static ConfigEntry<string> BarColorLow; internal static ConfigEntry<string> BarBackground; internal static ConfigEntry<string> TextColor; internal static ConfigEntry<string> DamageColorSmall; internal static ConfigEntry<string> DamageColorMedium; internal static ConfigEntry<string> DamageColorLarge; private void Awake() { //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Expected O, but got Unknown //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Expected O, but got Unknown //IL_02a1: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; HeightOffset = ((BaseUnityPlugin)this).Config.Bind<float>("Bar", "HeightOffset", 0.6f, "Extra height (meters) added above the auto-detected top of the enemy."); DisplaySeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Bar", "DisplaySeconds", 8f, "How long the bar stays visible after the enemy was last hit or grabbed."); FadeDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Bar", "FadeDistance", 40f, "Distance (meters) at which the bar fully fades out."); ShowOnGrab = ((BaseUnityPlugin)this).Config.Bind<bool>("Bar", "ShowOnGrab", true, "Also show the bar while you are grabbing the enemy."); AlwaysVisible = ((BaseUnityPlugin)this).Config.Bind<bool>("Bar", "AlwaysVisible", false, "Keep every enemy's bar visible at all times (ignores DisplaySeconds)."); RequireLineOfSight = ((BaseUnityPlugin)this).Config.Bind<bool>("Bar", "RequireLineOfSight", true, "Hide the bar when a wall or solid object blocks direct view to the enemy."); ShowDamageNumbers = ((BaseUnityPlugin)this).Config.Bind<bool>("Damage Numbers", "Enabled", true, "Show floating damage numbers when an enemy is hit."); BarScale = ((BaseUnityPlugin)this).Config.Bind<float>("Size", "BarScale", 1f, new ConfigDescription("Overall size multiplier for the health bar (and its text). 1 = default.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.25f, 5f), Array.Empty<object>())); DamageNumberScale = ((BaseUnityPlugin)this).Config.Bind<float>("Size", "DamageNumberScale", 1f, new ConfigDescription("Size multiplier for the floating damage numbers. 1 = default.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.25f, 5f), Array.Empty<object>())); BarColorHigh = ((BaseUnityPlugin)this).Config.Bind<string>("Colors", "BarColorHigh", "#33D933", "Bar color at full health. Hex #RRGGBB or #RRGGBBAA."); BarColorLow = ((BaseUnityPlugin)this).Config.Bind<string>("Colors", "BarColorLow", "#D91A1A", "Bar color at (near) zero health. The fill blends between this and BarColorHigh. Hex #RRGGBB or #RRGGBBAA."); BarBackground = ((BaseUnityPlugin)this).Config.Bind<string>("Colors", "BarBackground", "#000000A6", "Bar background / frame color. The alpha channel sets its transparency. Hex #RRGGBB or #RRGGBBAA."); TextColor = ((BaseUnityPlugin)this).Config.Bind<string>("Colors", "TextColor", "#FFFFFF", "Color of the \"current / max\" text on the bar. Hex #RRGGBB or #RRGGBBAA."); DamageColorSmall = ((BaseUnityPlugin)this).Config.Bind<string>("Damage Numbers", "ColorSmall", "#FF8C26", "Color of small hits (damage < 20). Hex #RRGGBB or #RRGGBBAA."); DamageColorMedium = ((BaseUnityPlugin)this).Config.Bind<string>("Damage Numbers", "ColorMedium", "#FFCC33", "Color of medium hits (damage 20-49). Hex #RRGGBB or #RRGGBBAA."); DamageColorLarge = ((BaseUnityPlugin)this).Config.Bind<string>("Damage Numbers", "ColorLarge", "#FF4033", "Color of large hits (damage >= 50). Hex #RRGGBB or #RRGGBBAA."); Palette.Refresh(); ((BaseUnityPlugin)this).Config.SettingChanged += delegate { Palette.Refresh(); }; new Harmony("com.riggola.anotherenemyhealthbars").PatchAll(typeof(Hooks)); Log.LogInfo((object)"AnotherEnemyHealthBars 1.1.3 loaded."); } } internal static class Palette { internal static Color BarHigh = new Color(0.2f, 0.85f, 0.2f); internal static Color BarLow = new Color(0.85f, 0.1f, 0.1f); internal static Color Background = new Color(0f, 0f, 0f, 0.65f); internal static Color Text = Color.white; internal static Color DmgSmall = new Color(1f, 0.55f, 0.15f); internal static Color DmgMedium = new Color(1f, 0.8f, 0.2f); internal static Color DmgLarge = new Color(1f, 0.25f, 0.2f); internal static void Refresh() { //IL_000a: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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_005f: 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) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: 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_00aa: Unknown result type (might be due to invalid IL or missing references) BarHigh = Parse(Plugin.BarColorHigh.Value, BarHigh); BarLow = Parse(Plugin.BarColorLow.Value, BarLow); Background = Parse(Plugin.BarBackground.Value, Background); Text = Parse(Plugin.TextColor.Value, Text); DmgSmall = Parse(Plugin.DamageColorSmall.Value, DmgSmall); DmgMedium = Parse(Plugin.DamageColorMedium.Value, DmgMedium); DmgLarge = Parse(Plugin.DamageColorLarge.Value, DmgLarge); } private static Color Parse(string hex, Color fallback) { //IL_000c: 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) Color result = default(Color); if (!ColorUtility.TryParseHtmlString(hex, ref result)) { return fallback; } return result; } } [HarmonyPatch] internal static class Hooks { [HarmonyPatch(typeof(EnemyHealth), "Awake")] [HarmonyPostfix] private static void Attach(EnemyHealth __instance) { if ((Object)(object)((Component)__instance).GetComponent<HealthBarView>() == (Object)null) { ((Component)__instance).gameObject.AddComponent<HealthBarView>(); } } [HarmonyPatch(typeof(EnemyHealth), "HurtRPC")] [HarmonyPostfix] private static void OnHurt(EnemyHealth __instance, int _damage) { if (_damage > 0 && !((Object)(object)__instance == (Object)null)) { HealthBarView healthBarView = ((Component)__instance).GetComponent<HealthBarView>(); if ((Object)(object)healthBarView == (Object)null) { healthBarView = ((Component)__instance).gameObject.AddComponent<HealthBarView>(); } healthBarView.ObserveDamage(_damage); healthBarView.Reveal(); if (Plugin.ShowDamageNumbers.Value) { healthBarView.PopDamage(_damage); } } } [HarmonyPatch(typeof(EnemyHealth), "Death")] [HarmonyPostfix] private static void OnDeath(EnemyHealth __instance) { HealthBarView component = ((Component)__instance).GetComponent<HealthBarView>(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { internal IgnoresAccessChecksToAttribute(string assemblyName) { } } }