using System; using System.Globalization; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using BepInEx.Configuration; using FishNet.Connection; using FishNet.Object; using HarmonyLib; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: AssemblyCompany("evansvl")] [assembly: AssemblyDescription("Shows a native-style health bar for the last non-boss creature damaged by the local player.")] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyVersion("0.0.0.0")] namespace HowToFish.FishHP; [BepInPlugin("community.howtofish.fishhp", "Fish HP", "0.1.3")] public sealed class Plugin : BaseUnityPlugin { [HarmonyPatch(typeof(Creature), "LocalHit")] private static class LocalCreatureHitPatch { private static void Postfix(Creature __instance, Player player, int damage, bool fromNpc) { if ((Object)(object)_instance == (Object)null || (Object)(object)__instance == (Object)null || (Object)(object)player == (Object)null || fromNpc || damage <= 0) { return; } try { if (((NetworkBehaviour)player).Owner == (NetworkConnection)null || !((NetworkBehaviour)player).Owner.IsLocalClient) { return; } } catch { return; } _instance.SelectTarget(__instance, damage); } } public const string PluginGuid = "community.howtofish.fishhp"; public const string PluginName = "Fish HP"; public const string PluginVersion = "0.1.3"; private const float ShakeForce = 750f; private const float PositionSpring = 1200f; private const float PositionDamping = 12f; private const float AngularShakeForce = 10f; private const float RotationSpring = 120f; private const float RotationDamping = 20f; private static readonly FieldInfo MainCanvasField = typeof(PlayerUI).GetField("_mainCanvas", BindingFlags.Instance | BindingFlags.NonPublic); private static readonly FieldInfo BossNameField = typeof(BossUI).GetField("_bossNameText", BindingFlags.Instance | BindingFlags.NonPublic); private static readonly FieldInfo BossMoveField = typeof(BossUI).GetField("_bossHpToMove", BindingFlags.Instance | BindingFlags.NonPublic); private static readonly FieldInfo BossRotateField = typeof(BossUI).GetField("_bossHpToRotate", BindingFlags.Instance | BindingFlags.NonPublic); private static readonly FieldInfo BossHealthField = typeof(BossUI).GetField("_bossHealth", BindingFlags.Instance | BindingFlags.NonPublic); private static readonly FieldInfo BossHealthLerpedField = typeof(BossUI).GetField("_bossHealthLerped", BindingFlags.Instance | BindingFlags.NonPublic); private static readonly FieldInfo TimeLeftImageField = typeof(BossUI).GetField("_timeLeftImage", BindingFlags.Instance | BindingFlags.NonPublic); private static readonly FieldInfo LocalHpField = typeof(Creature).GetField("_localHp", BindingFlags.Instance | BindingFlags.NonPublic); private static Plugin _instance; private ConfigEntry _enabled; private ConfigEntry _scale; private ConfigEntry _opacity; private ConfigEntry _leftOffset; private ConfigEntry _topOffset; private Harmony _harmony; private Creature _target; private int _shownHp = -1; private int _shownMaxHp = -1; private float _predictionUntil; private CanvasGroup _mainCanvas; private RectTransform _wrapper; private CanvasGroup _group; private RectTransform _moveRoot; private RectTransform _rotateRoot; private TextMeshProUGUI _nameText; private TextMeshProUGUI _hpText; private Image _health; private Image _healthLerped; private Vector3 _startPosition; private Vector3 _velocity; private Vector3 _angularVelocity; private readonly Vector3[] _barCorners = (Vector3[])(object)new Vector3[4]; private bool _isFadingOut; private void Awake() { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Expected O, but got Unknown //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Expected O, but got Unknown _instance = this; _enabled = ((BaseUnityPlugin)this).Config.Bind("HUD", "Enabled", true, "Show the last non-boss creature damaged by the local player."); _scale = ((BaseUnityPlugin)this).Config.Bind("HUD", "Scale", 0.58f, new ConfigDescription("HUD scale relative to the native boss bar.", (AcceptableValueBase)(object)new AcceptableValueRange(0.35f, 1f), new object[0])); _opacity = ((BaseUnityPlugin)this).Config.Bind("HUD", "Opacity", 1f, new ConfigDescription("HUD opacity.", (AcceptableValueBase)(object)new AcceptableValueRange(0.2f, 1f), new object[0])); _leftOffset = ((BaseUnityPlugin)this).Config.Bind("Position", "LeftOffset", 36f, new ConfigDescription("Distance from the left edge of the screen.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 600f), new object[0])); _topOffset = ((BaseUnityPlugin)this).Config.Bind("Position", "TopOffset", 54f, new ConfigDescription("Distance from the top edge of the screen.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 500f), new object[0])); _harmony = new Harmony("community.howtofish.fishhp"); _harmony.PatchAll(typeof(LocalCreatureHitPatch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded. Fish HP follows local confirmed hits and reproduces the native boss-bar spring response."); } private void Update() { if (!_enabled.Value || !IsGameplayHudVisible()) { SetRootVisible(visible: false); return; } if ((Object)(object)_target == (Object)null) { ClearTarget(destroyHud: false); return; } if (_target.IsDead || _target.Hp <= 0) { BeginDeathFade(); return; } if (!EnsureHud()) { SetRootVisible(visible: false); return; } ApplyLiveSettings(); UpdateTargetValues(); SetRootVisible(visible: true); } private void LateUpdate() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0079: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: 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_00ab: 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_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: 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_00ee: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_moveRoot == (Object)null) && !((Object)(object)_rotateRoot == (Object)null) && ((Component)_moveRoot).gameObject.activeInHierarchy) { float deltaTime = Time.deltaTime; if (!(deltaTime <= 0f)) { Vector3 val = _startPosition - ((Transform)_moveRoot).localPosition; _velocity += val * 1200f * deltaTime; _velocity -= _velocity * 12f * deltaTime; RectTransform moveRoot = _moveRoot; ((Transform)moveRoot).localPosition = ((Transform)moveRoot).localPosition + _velocity * deltaTime; Quaternion localRotation = ((Transform)_rotateRoot).localRotation; DazedUtils.SimulateSpringRotation(ref localRotation, ref _angularVelocity, Quaternion.identity, 120f, 20f); ((Transform)_rotateRoot).localRotation = localRotation; } } } private static bool IsGameplayHudVisible() { if (MainMenuManager.IsInMenu || PauseManager.IsPaused || (Object)(object)Player.LocalPlayer == (Object)null) { return false; } try { return !PlayerUI.UIDisabled; } catch { return true; } } private void SelectTarget(Creature creature, int damage) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) if (!_enabled.Value || (Object)(object)creature == (Object)null || creature.IsDead || damage <= 0 || (int)creature.BossType != 0) { return; } bool flag = (Object)(object)_target != (Object)(object)creature; _target = creature; _isFadingOut = false; if (EnsureHud()) { LeanTween.cancel(((Component)_group).gameObject); _group.alpha = _opacity.Value; SetRootVisible(visible: true); int num = Math.Max(1, creature.MaxHp); int num2 = Math.Max(0, Math.Min(creature.Hp, num)); int val = ReadLocalHp(creature, num2 - damage); val = Math.Max(0, Math.Min(val, num)); if (flag) { ((TMP_Text)_nameText).text = SafeName(creature); float fillAmount = (float)num2 / (float)num; _health.fillAmount = fillAmount; _healthLerped.fillAmount = fillAmount; _shownHp = val; _shownMaxHp = num; } _predictionUntil = Time.unscaledTime + 1f; ApplyHealth(val, num, shake: true); } } private static int ReadLocalHp(Creature creature, int fallback) { if (LocalHpField == null) { return fallback; } try { return (int)LocalHpField.GetValue(creature); } catch { return fallback; } } private void UpdateTargetValues() { int num = Math.Max(1, _target.MaxHp); int num2 = Math.Max(0, Math.Min(_target.Hp, num)); ((TMP_Text)_nameText).text = SafeName(_target); if (!(Time.unscaledTime < _predictionUntil) || num2 <= _shownHp) { if (_shownMaxHp != num) { _shownMaxHp = num; _shownHp = num2; UpdateHpText(num2, num); float fillAmount = (float)num2 / (float)num; _health.fillAmount = fillAmount; _healthLerped.fillAmount = fillAmount; } else if (_shownHp != num2) { ApplyHealth(num2, num, num2 < _shownHp); } } } private void ApplyHealth(int current, int maximum, bool shake) { float num = Mathf.Clamp01((float)current / (float)Math.Max(1, maximum)); float fillAmount = _health.fillAmount; _health.fillAmount = num; _shownHp = current; _shownMaxHp = maximum; UpdateHpText(current, maximum); LeanTween.cancel(((Component)_healthLerped).gameObject); LeanTween.value(((Component)_healthLerped).gameObject, _healthLerped.fillAmount, num, 0.5f).setDelay(0.25f).setEase((LeanTweenType)9) .setOnUpdate((Action)UpdateLerpedHealth); if (shake && num < fillAmount) { ApplyDamageShake(fillAmount - num); } } private void UpdateLerpedHealth(float value) { if ((Object)(object)_healthLerped != (Object)null) { _healthLerped.fillAmount = value; } } private void ApplyDamageShake(float healthLostRatio) { //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_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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_0043: 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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) float num = Mathf.Clamp(healthLostRatio, 0.025f, 1f); Vector3 insideUnitSphere = Random.insideUnitSphere; Vector3 val = ((Vector3)(ref insideUnitSphere)).normalized * num; val *= ((Random.Range(0, 2) == 1) ? 1f : (-1f)); _velocity = val * 750f; float num2 = ((Random.Range(0, 2) == 1) ? 1f : (-1f)); _angularVelocity += new Vector3(0f, 0f, num2 * num * 10f); } private bool EnsureHud() { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Expected O, but got Unknown //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0180: 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) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: 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_026d: 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_0275: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_02bc: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_02d4: Unknown result type (might be due to invalid IL or missing references) //IL_0364: Unknown result type (might be due to invalid IL or missing references) //IL_0369: 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: Unknown result type (might be due to invalid IL or missing references) //IL_0384: Unknown result type (might be due to invalid IL or missing references) //IL_039c: Unknown result type (might be due to invalid IL or missing references) //IL_03b2: Unknown result type (might be due to invalid IL or missing references) //IL_03be: Unknown result type (might be due to invalid IL or missing references) //IL_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_03f4: Unknown result type (might be due to invalid IL or missing references) //IL_03f9: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Unknown result type (might be due to invalid IL or missing references) //IL_0414: Unknown result type (might be due to invalid IL or missing references) //IL_042a: Unknown result type (might be due to invalid IL or missing references) //IL_0436: Unknown result type (might be due to invalid IL or missing references) //IL_045f: Unknown result type (might be due to invalid IL or missing references) //IL_046e: Unknown result type (might be due to invalid IL or missing references) //IL_048e: Unknown result type (might be due to invalid IL or missing references) //IL_04af: Unknown result type (might be due to invalid IL or missing references) //IL_04b4: Unknown result type (might be due to invalid IL or missing references) //IL_04d4: Unknown result type (might be due to invalid IL or missing references) //IL_04fe: Unknown result type (might be due to invalid IL or missing references) //IL_0503: Unknown result type (might be due to invalid IL or missing references) //IL_0515: Unknown result type (might be due to invalid IL or missing references) //IL_053e: Unknown result type (might be due to invalid IL or missing references) //IL_0543: Unknown result type (might be due to invalid IL or missing references) //IL_0553: Unknown result type (might be due to invalid IL or missing references) //IL_0592: Unknown result type (might be due to invalid IL or missing references) //IL_0597: Unknown result type (might be due to invalid IL or missing references) //IL_059d: Unknown result type (might be due to invalid IL or missing references) //IL_05a2: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_wrapper != (Object)null && (Object)(object)_health != (Object)null && (Object)(object)_healthLerped != (Object)null && (Object)(object)_nameText != (Object)null && (Object)(object)_hpText != (Object)null) { return true; } DestroyHud(); if (!TryFindTemplates(out var bossUi, out var mainCanvas)) { return false; } object? value = BossNameField.GetValue(bossUi); TextMeshProUGUI val = (TextMeshProUGUI)((value is TextMeshProUGUI) ? value : null); object? value2 = BossHealthField.GetValue(bossUi); Image val2 = (Image)((value2 is Image) ? value2 : null); object? value3 = BossHealthLerpedField.GetValue(bossUi); Image val3 = (Image)((value3 is Image) ? value3 : null); if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null || (Object)(object)val3 == (Object)null) { return false; } Rect rect = ((Graphic)val2).rectTransform.rect; Vector2 size = ((Rect)(ref rect)).size; if (size.x < 100f) { size.x = 1065f; } if (size.y < 12f) { size.y = 38f; } _mainCanvas = mainCanvas; GameObject val4 = new GameObject("FishHPHUD", new Type[2] { typeof(RectTransform), typeof(CanvasGroup) }); val4.transform.SetParent(((Component)mainCanvas).transform, false); _wrapper = val4.GetComponent(); _group = val4.GetComponent(); RectTransform wrapper = _wrapper; Vector2 anchorMin = (_wrapper.anchorMax = new Vector2(0f, 1f)); wrapper.anchorMin = anchorMin; _wrapper.pivot = new Vector2(0f, 1f); _wrapper.sizeDelta = new Vector2(1200f, 150f); _moveRoot = CreateRect("FishHPMove", (Transform)(object)_wrapper); StretchToParent(_moveRoot); _startPosition = ((Transform)_moveRoot).localPosition; _rotateRoot = CreateRect("FishHPRotate", (Transform)(object)_moveRoot); StretchToParent(_rotateRoot); _nameText = Object.Instantiate(val, (Transform)(object)_rotateRoot); ((Object)_nameText).name = "FishName"; ((Component)_nameText).gameObject.SetActive(true); ((Behaviour)_nameText).enabled = true; RectTransform rectTransform = ((TMP_Text)_nameText).rectTransform; Vector2 anchorMin2 = (rectTransform.anchorMax = new Vector2(0f, 1f)); rectTransform.anchorMin = anchorMin2; rectTransform.pivot = new Vector2(0f, 1f); rectTransform.anchoredPosition = Vector2.zero; rectTransform.sizeDelta = new Vector2(Mathf.Max(200f, size.x - 340f), 48f); ((Transform)rectTransform).localScale = Vector3.one; ((Transform)rectTransform).localRotation = Quaternion.identity; _hpText = Object.Instantiate(val, (Transform)(object)_rotateRoot); ((Object)_hpText).name = "FishHPText"; ((Component)_hpText).gameObject.SetActive(true); ((Behaviour)_hpText).enabled = true; ((TMP_Text)_hpText).alignment = (TextAlignmentOptions)260; ((Graphic)_hpText).raycastTarget = false; ((TMP_Text)_hpText).text = string.Empty; RectTransform rectTransform2 = ((TMP_Text)_hpText).rectTransform; Vector2 anchorMin3 = (rectTransform2.anchorMax = new Vector2(0f, 1f)); rectTransform2.anchorMin = anchorMin3; rectTransform2.pivot = new Vector2(1f, 1f); rectTransform2.anchoredPosition = new Vector2(size.x, 0f); rectTransform2.sizeDelta = new Vector2(320f, 48f); ((Transform)rectTransform2).localScale = Vector3.one; ((Transform)rectTransform2).localRotation = Quaternion.identity; RectTransform val8 = CreateRect("FishHealthBar", (Transform)(object)_rotateRoot); Vector2 anchorMin4 = (val8.anchorMax = new Vector2(0f, 1f)); val8.anchorMin = anchorMin4; val8.pivot = new Vector2(0f, 1f); val8.anchoredPosition = new Vector2(0f, -52f); val8.sizeDelta = size; Image val10 = CreateNativeImage("Border", (Transform)(object)val8, val3, filled: false); SetImageRect(((Graphic)val10).rectTransform, new Vector2(-4f, -4f), new Vector2(4f, 4f)); ((Graphic)val10).color = new Color(1f, 1f, 1f, 1f); Image val11 = CreateNativeImage("Background", (Transform)(object)val8, val2, filled: false); SetImageRect(((Graphic)val11).rectTransform, Vector2.zero, Vector2.zero); ((Graphic)val11).color = new Color(0.055f, 0.075f, 0.12f, 0.9f); _healthLerped = CreateNativeImage("DamageTrail", (Transform)(object)val8, val3, filled: true); SetImageRect(((Graphic)_healthLerped).rectTransform, Vector2.zero, Vector2.zero); ((Graphic)_healthLerped).color = ((Graphic)val3).color; _health = CreateNativeImage("Health", (Transform)(object)val8, val2, filled: true); SetImageRect(((Graphic)_health).rectTransform, Vector2.zero, Vector2.zero); ((Graphic)_health).color = GameInfo.RedColor; ((TMP_Text)_nameText).text = string.Empty; ((Graphic)_nameText).raycastTarget = false; ((Graphic)_health).raycastTarget = false; ((Graphic)_healthLerped).raycastTarget = false; _velocity = Vector3.zero; _angularVelocity = Vector3.zero; ApplyLiveSettings(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Created independent Fish HP bar from the game's native sprites and text style."); return true; } private void UpdateHpText(int current, int maximum) { if (!((Object)(object)_hpText == (Object)null)) { ((TMP_Text)_hpText).text = FormatHp(current) + " / " + FormatHp(maximum); } } private static string FormatHp(int value) { return value.ToString("N0", CultureInfo.InvariantCulture); } private static RectTransform CreateRect(string name, Transform parent) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown GameObject val = new GameObject(name, new Type[1] { typeof(RectTransform) }); val.transform.SetParent(parent, false); return val.GetComponent(); } private static void StretchToParent(RectTransform rect) { //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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_004d: Unknown result type (might be due to invalid IL or missing references) rect.anchorMin = Vector2.zero; rect.anchorMax = Vector2.one; rect.pivot = new Vector2(0.5f, 0.5f); rect.offsetMin = Vector2.zero; rect.offsetMax = Vector2.zero; ((Transform)rect).localScale = Vector3.one; ((Transform)rect).localRotation = Quaternion.identity; } private static Image CreateNativeImage(string name, Transform parent, Image template, bool filled) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name, new Type[3] { typeof(RectTransform), typeof(CanvasRenderer), typeof(Image) }); val.transform.SetParent(parent, false); Image component = val.GetComponent(); component.sprite = template.sprite; component.overrideSprite = template.overrideSprite; ((Graphic)component).material = ((Graphic)template).material; component.preserveAspect = false; ((Graphic)component).raycastTarget = false; component.type = (Type)(filled ? 3 : ((int)BorderImageType(template))); if (filled) { component.fillMethod = (FillMethod)0; component.fillOrigin = 0; component.fillClockwise = true; component.fillAmount = 1f; } return component; } private static Type BorderImageType(Image template) { //IL_0014: 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) if ((Object)(object)template.sprite != (Object)null) { Vector4 border = template.sprite.border; if (((Vector4)(ref border)).sqrMagnitude > 0f) { return (Type)1; } } return (Type)0; } private static void SetImageRect(RectTransform rect, Vector2 minimumOffset, Vector2 maximumOffset) { //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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) rect.anchorMin = Vector2.zero; rect.anchorMax = Vector2.one; rect.offsetMin = minimumOffset; rect.offsetMax = maximumOffset; ((Transform)rect).localScale = Vector3.one; ((Transform)rect).localRotation = Quaternion.identity; } private static bool TryFindTemplates(out BossUI bossUi, out CanvasGroup mainCanvas) { bossUi = null; mainCanvas = null; if (MainCanvasField == null || BossNameField == null || BossHealthField == null || BossHealthLerpedField == null) { return false; } PlayerUI[] array = Resources.FindObjectsOfTypeAll(); PlayerUI[] array2 = array; foreach (PlayerUI val in array2) { if (!((Object)(object)val == (Object)null) && ((Component)val).gameObject.activeInHierarchy) { object? value = MainCanvasField.GetValue(val); CanvasGroup val2 = (CanvasGroup)((value is CanvasGroup) ? value : null); if ((Object)(object)val2 != (Object)null) { mainCanvas = val2; break; } } } if ((Object)(object)mainCanvas == (Object)null) { return false; } BossUI[] array3 = Resources.FindObjectsOfTypeAll(); BossUI[] array4 = array3; foreach (BossUI val3 in array4) { if (!((Object)(object)val3 == (Object)null) && ((Component)val3).gameObject.activeInHierarchy && BossNameField.GetValue(val3) != null && BossHealthField.GetValue(val3) != null && BossHealthLerpedField.GetValue(val3) != null) { bossUi = val3; break; } } return (Object)(object)bossUi != (Object)null; } private void DisableNonHealthVisuals(RectTransform originalMove, Image originalHealth, Image originalLerped, Image originalTime) { Transform original = FindCommonAncestor(((Component)originalHealth).transform, ((Component)originalLerped).transform, (Transform)(object)originalMove); Transform val = FindCloneTransform((Transform)(object)originalMove, original, (Transform)(object)_moveRoot); TextMeshProUGUI[] componentsInChildren = ((Component)_moveRoot).GetComponentsInChildren(true); TextMeshProUGUI[] array = componentsInChildren; foreach (TextMeshProUGUI val2 in array) { if ((Object)(object)val2 != (Object)(object)_nameText) { ((Behaviour)val2).enabled = false; } } Image[] componentsInChildren2 = ((Component)_moveRoot).GetComponentsInChildren(true); Image[] array2 = componentsInChildren2; foreach (Image val3 in array2) { if (!((Object)(object)val != (Object)null) || (!((Object)(object)((Component)val3).transform == (Object)(object)val) && !((Component)val3).transform.IsChildOf(val))) { ((Behaviour)val3).enabled = false; } } if ((Object)(object)originalTime != (Object)null) { Transform val4 = FindCloneTransform((Transform)(object)originalMove, ((Component)originalTime).transform, (Transform)(object)_moveRoot); if ((Object)(object)val4 != (Object)null && (Object)(object)val4.parent != (Object)null && (Object)(object)val4.parent != (Object)(object)_moveRoot && !ContainsTransform(val4.parent, ((Component)_health).transform) && !ContainsTransform(val4.parent, ((Component)_healthLerped).transform)) { ((Component)val4.parent).gameObject.SetActive(false); } else if ((Object)(object)val4 != (Object)null) { ((Component)val4).gameObject.SetActive(false); } } } private void AlignCloneToTopLeft() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_wrapper == (Object)null) && !((Object)(object)_moveRoot == (Object)null) && !((Object)(object)_health == (Object)null)) { ((Graphic)_health).rectTransform.GetWorldCorners(_barCorners); Vector3 val = ((Transform)_wrapper).InverseTransformPoint(_barCorners[1]); RectTransform moveRoot = _moveRoot; ((Transform)moveRoot).localPosition = ((Transform)moveRoot).localPosition + new Vector3(0f - val.x, -52f - val.y, 0f); _startPosition = ((Transform)_moveRoot).localPosition; } } private static void SetActivePath(Transform child, Transform root) { Transform val = child; while ((Object)(object)val != (Object)null) { ((Component)val).gameObject.SetActive(true); if ((Object)(object)val == (Object)(object)root) { break; } val = val.parent; } } private static Transform FindCommonAncestor(Transform first, Transform second, Transform limit) { Transform val = first; while ((Object)(object)val != (Object)null) { if ((Object)(object)second == (Object)(object)val || second.IsChildOf(val)) { return val; } if ((Object)(object)val == (Object)(object)limit) { break; } val = val.parent; } return limit; } private static bool ContainsTransform(Transform parent, Transform child) { if (!((Object)(object)child == (Object)(object)parent)) { return child.IsChildOf(parent); } return true; } private static T FindCloneComponent(RectTransform originalRoot, RectTransform original, RectTransform cloneRoot) where T : Component { Transform val = FindCloneTransform((Transform)(object)originalRoot, (Transform)(object)original, (Transform)(object)cloneRoot); if (!((Object)(object)val == (Object)null)) { return ((Component)val).GetComponent(); } return default(T); } private static Transform FindCloneTransform(Transform originalRoot, Transform original, Transform cloneRoot) { if ((Object)(object)original == (Object)null) { return null; } if ((Object)(object)original == (Object)(object)originalRoot) { return cloneRoot; } string text = RelativePath(originalRoot, original); if (!string.IsNullOrEmpty(text)) { return cloneRoot.Find(text); } return cloneRoot; } private static string RelativePath(Transform root, Transform child) { string text = ((Object)child).name; Transform parent = child.parent; while ((Object)(object)parent != (Object)null && (Object)(object)parent != (Object)(object)root) { text = ((Object)parent).name + "/" + text; parent = parent.parent; } if (!((Object)(object)parent == (Object)(object)root)) { return string.Empty; } return text; } private static string SafeName(Creature creature) { try { string name = ((Item)creature).GetName(); return string.IsNullOrEmpty(name) ? "Fish" : name; } catch { return "Fish"; } } private void ApplyLiveSettings() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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) if (!((Object)(object)_wrapper == (Object)null) && !((Object)(object)_group == (Object)null)) { _wrapper.anchoredPosition = new Vector2(_leftOffset.Value, 0f - _topOffset.Value); ((Transform)_wrapper).localScale = Vector3.one * _scale.Value; if (!_isFadingOut) { _group.alpha = _opacity.Value; } } } private void BeginDeathFade() { if ((Object)(object)_group == (Object)null) { ClearTarget(destroyHud: false); } else if (!_isFadingOut) { _isFadingOut = true; LeanTween.cancel(((Component)_group).gameObject); LeanTween.value(((Component)_group).gameObject, _group.alpha, 0f, 0.5f).setEase((LeanTweenType)2).setOnUpdate((Action)SetGroupAlpha) .setOnComplete((Action)FinishDeathFade); } } private void SetGroupAlpha(float value) { if ((Object)(object)_group != (Object)null) { _group.alpha = value; } } private void FinishDeathFade() { ClearTarget(destroyHud: false); } private void ClearTarget(bool destroyHud) { _target = null; _shownHp = -1; _shownMaxHp = -1; _predictionUntil = 0f; _isFadingOut = false; SetRootVisible(visible: false); if (destroyHud) { DestroyHud(); } } private void SetRootVisible(bool visible) { if ((Object)(object)_wrapper != (Object)null && ((Component)_wrapper).gameObject.activeSelf != visible) { ((Component)_wrapper).gameObject.SetActive(visible); } } private void DestroyHud() { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: 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) if ((Object)(object)_wrapper != (Object)null) { Object.Destroy((Object)(object)((Component)_wrapper).gameObject); } _mainCanvas = null; _wrapper = null; _group = null; _moveRoot = null; _rotateRoot = null; _nameText = null; _hpText = null; _health = null; _healthLerped = null; _velocity = Vector3.zero; _angularVelocity = Vector3.zero; } private void OnDestroy() { if (_harmony != null) { _harmony.UnpatchSelf(); } ClearTarget(destroyHud: true); if ((Object)(object)_instance == (Object)(object)this) { _instance = null; } } }