using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("TrophyTooltip")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("TrophyTooltip")]
[assembly: AssemblyTitle("TrophyTooltip")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.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 TrofeusInfo
{
[BepInPlugin("com.vaSto.trofeusinfo", "TrofeusInfo", "0.1.2")]
public sealed class TrofeusInfoPlugin : BaseUnityPlugin
{
internal const string ModGuid = "com.vaSto.trofeusinfo";
internal const string ModName = "TrofeusInfo";
internal const string ModVersion = "0.1.2";
private Harmony _harmony;
private void Awake()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
_harmony = new Harmony("com.vaSto.trofeusinfo");
TrophyTooltip.Init((BaseUnityPlugin)(object)this, _harmony, ((BaseUnityPlugin)this).Logger);
((BaseUnityPlugin)this).Logger.LogInfo((object)"[TrofeusInfo] carregado.");
}
private void OnDestroy()
{
Harmony harmony = _harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
}
}
internal static class TrophyTooltip
{
private class TrophyEntry
{
public string trophyDisplayName = string.Empty;
public string creatureDisplayName = string.Empty;
public string prefabName = string.Empty;
public float baseHp;
public bool isBoss;
public DamageModifiers damageModifiers;
public DamageType bestDamageType;
public float bestDamageMultiplier;
public readonly List<TrophyDropEntry> drops = new List<TrophyDropEntry>();
}
private class TrophyDropEntry
{
public string displayName = string.Empty;
public Sprite icon;
public int amountMin = 1;
public int amountMax = 1;
public float chance = 1f;
public bool levelMultiplier;
public bool onePerPlayer;
}
private sealed class TrophyHoverBridge : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler
{
private TrophyEntry _entry;
private string _tooltipText = string.Empty;
private bool _hovering;
internal void Bind(TrophyEntry entry)
{
_entry = entry;
_tooltipText = BuildTooltipText(entry);
}
public void OnPointerEnter(PointerEventData eventData)
{
if (_entry != null)
{
_hovering = true;
ShowTooltip(_entry, _tooltipText);
}
}
public void OnPointerExit(PointerEventData eventData)
{
_hovering = false;
HideTooltip();
}
private void OnDisable()
{
if (_hovering)
{
_hovering = false;
HideTooltip();
}
}
private void Update()
{
if (_hovering)
{
UpdateTooltipPosition();
}
}
}
private struct BestDamageInfo
{
public DamageType Type;
public DamageModifier Modifier;
public float Multiplier;
}
private static readonly Dictionary<int, TrophyEntry> TrophyBySpriteId = new Dictionary<int, TrophyEntry>();
private static readonly List<GameObject> CreaturePrefabs = new List<GameObject>();
private static int _lastObjectDbItemCount = -1;
private static ManualLogSource _log;
private static GameObject _tooltipRoot;
private static RectTransform _tooltipRect;
private static Text _tooltipText;
private static RectTransform _tooltipTextRect;
private static RectTransform _dropIconsRect;
private static Image _bestDamageIconImage;
private static readonly List<GameObject> _dropIconObjects = new List<GameObject>();
private static float _dropIconsHeight;
private static float _dropIconsPreferredWidth;
private static Font _font;
private static FieldInfo _hudRootField;
private static FieldInfo _inventoryGuiTrophyListField;
private static int _lastConfiguredGridContainerId = -1;
private static bool _localizationResolved;
private static MethodInfo _localizeMethod;
private static PropertyInfo _localizationInstanceProperty;
private static FieldInfo _localizationInstanceField;
private static bool _damageIconsLoaded;
private static AssetBundle _damageIconsBundle;
private static readonly Dictionary<DamageType, Sprite> DamageIconByType = new Dictionary<DamageType, Sprite>();
private static readonly Dictionary<string, string> EnglishTranslations = new Dictionary<string, string>();
private static readonly Dictionary<string, string> PortugueseTranslations = new Dictionary<string, string>();
private static bool _translationsLoaded;
private const string BoldColor = "#98c2ed";
private const string HeaderColor = "#FFFFFF";
private const string ValueColor = "#FFA03D";
private const string MutedColor = "#9A9A9A";
internal static void Init(BaseUnityPlugin plugin, Harmony harmony, ManualLogSource log)
{
_log = log;
EnsureTranslationFilesAndLoad();
harmony.PatchAll(typeof(TrophyTooltip));
ManualLogSource log2 = _log;
if (log2 != null)
{
log2.LogInfo((object)"[TrofeusInfo][TrophyTooltip] Modulo carregado.");
}
}
private static Transform ResolveHudParent(Hud hud)
{
if ((Object)(object)hud == (Object)null)
{
return null;
}
if (_hudRootField == null)
{
_hudRootField = AccessTools.Field(typeof(Hud), "m_rootObject");
}
object? obj = _hudRootField?.GetValue(hud);
GameObject val = (GameObject)((obj is GameObject) ? obj : null);
if ((Object)(object)val != (Object)null)
{
return val.transform;
}
return ((Component)hud).transform;
}
private static Transform ResolveTooltipParent()
{
if ((Object)(object)InventoryGui.instance != (Object)null)
{
return ((Component)InventoryGui.instance).transform;
}
if ((Object)(object)Hud.instance != (Object)null)
{
return ResolveHudParent(Hud.instance);
}
return null;
}
private static void EnsureTooltipCreated()
{
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Expected O, but got Unknown
//IL_0108: 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_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_0181: 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_01e5: Unknown result type (might be due to invalid IL or missing references)
//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
//IL_01fc: Expected O, but got Unknown
//IL_0229: Unknown result type (might be due to invalid IL or missing references)
//IL_0240: Unknown result type (might be due to invalid IL or missing references)
//IL_0257: 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_02f2: 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_0319: Expected O, but got Unknown
//IL_034c: Unknown result type (might be due to invalid IL or missing references)
//IL_0366: Unknown result type (might be due to invalid IL or missing references)
//IL_0380: Unknown result type (might be due to invalid IL or missing references)
//IL_039a: Unknown result type (might be due to invalid IL or missing references)
//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
//IL_03c4: Unknown result type (might be due to invalid IL or missing references)
//IL_03cb: Expected O, but got Unknown
//IL_03f8: Unknown result type (might be due to invalid IL or missing references)
//IL_040f: Unknown result type (might be due to invalid IL or missing references)
//IL_0426: Unknown result type (might be due to invalid IL or missing references)
//IL_043d: Unknown result type (might be due to invalid IL or missing references)
//IL_0454: Unknown result type (might be due to invalid IL or missing references)
Transform val = ResolveTooltipParent();
if ((Object)(object)val == (Object)null)
{
return;
}
if ((Object)(object)_tooltipRoot != (Object)null)
{
if ((Object)(object)_tooltipRoot.transform.parent != (Object)(object)val)
{
_tooltipRoot.transform.SetParent(val, false);
}
return;
}
if ((Object)(object)_font == (Object)null)
{
_font = Resources.GetBuiltinResource<Font>("Arial.ttf");
if ((Object)(object)_font == (Object)null && (Object)(object)GUI.skin != (Object)null)
{
_font = GUI.skin.font;
}
}
if (!((Object)(object)_font == (Object)null))
{
_tooltipRoot = new GameObject("Arise_TrophyHpTooltip");
_tooltipRoot.transform.SetParent(val, false);
_tooltipRect = _tooltipRoot.AddComponent<RectTransform>();
_tooltipRect.anchorMin = new Vector2(0f, 0f);
_tooltipRect.anchorMax = new Vector2(0f, 0f);
_tooltipRect.pivot = new Vector2(0f, 0f);
_tooltipRect.sizeDelta = new Vector2(300f, 250f);
Image val2 = _tooltipRoot.AddComponent<Image>();
((Graphic)val2).color = new Color(0f, 0f, 0f, 0.9f);
((Graphic)val2).raycastTarget = false;
CanvasGroup val3 = _tooltipRoot.AddComponent<CanvasGroup>();
val3.interactable = false;
val3.blocksRaycasts = false;
Outline val4 = _tooltipRoot.AddComponent<Outline>();
((Shadow)val4).effectColor = new Color(0f, 0f, 0f, 0.9f);
((Shadow)val4).effectDistance = new Vector2(1f, -1f);
GameObject val5 = new GameObject("Text");
val5.transform.SetParent(_tooltipRoot.transform, false);
RectTransform val6 = val5.AddComponent<RectTransform>();
val6.anchorMin = new Vector2(0f, 0f);
val6.anchorMax = new Vector2(1f, 1f);
val6.offsetMin = new Vector2(10f, 8f);
val6.offsetMax = new Vector2(-10f, -8f);
_tooltipTextRect = val6;
_tooltipText = val5.AddComponent<Text>();
_tooltipText.font = _font;
_tooltipText.fontSize = 16;
_tooltipText.alignment = (TextAnchor)0;
_tooltipText.horizontalOverflow = (HorizontalWrapMode)0;
_tooltipText.verticalOverflow = (VerticalWrapMode)1;
_tooltipText.supportRichText = true;
((Graphic)_tooltipText).color = new Color(1f, 1f, 1f, 0.98f);
_tooltipText.text = string.Empty;
GameObject val7 = new GameObject("DropIcons");
val7.transform.SetParent(_tooltipRoot.transform, false);
_dropIconsRect = val7.AddComponent<RectTransform>();
_dropIconsRect.anchorMin = new Vector2(0f, 0f);
_dropIconsRect.anchorMax = new Vector2(1f, 0f);
_dropIconsRect.pivot = new Vector2(0f, 0f);
_dropIconsRect.anchoredPosition = new Vector2(0f, 8f);
_dropIconsRect.sizeDelta = new Vector2(0f, 0f);
GameObject val8 = new GameObject("BestDamageIcon");
val8.transform.SetParent(_tooltipRoot.transform, false);
RectTransform val9 = val8.AddComponent<RectTransform>();
val9.anchorMin = new Vector2(1f, 1f);
val9.anchorMax = new Vector2(1f, 1f);
val9.pivot = new Vector2(1f, 1f);
val9.anchoredPosition = new Vector2(-10f, -10f);
val9.sizeDelta = new Vector2(22f, 22f);
_bestDamageIconImage = val8.AddComponent<Image>();
_bestDamageIconImage.preserveAspect = true;
((Graphic)_bestDamageIconImage).raycastTarget = false;
((Behaviour)_bestDamageIconImage).enabled = false;
_tooltipRoot.SetActive(false);
}
}
private static void DestroyTooltip()
{
if ((Object)(object)_tooltipRoot != (Object)null)
{
Object.Destroy((Object)(object)_tooltipRoot);
_tooltipRoot = null;
}
_tooltipRect = null;
_tooltipText = null;
_tooltipTextRect = null;
_dropIconsRect = null;
_bestDamageIconImage = null;
_dropIconObjects.Clear();
_dropIconsHeight = 0f;
_dropIconsPreferredWidth = 0f;
if ((Object)(object)_damageIconsBundle != (Object)null)
{
_damageIconsBundle.Unload(false);
_damageIconsBundle = null;
}
DamageIconByType.Clear();
_damageIconsLoaded = false;
}
private static void HideTooltip()
{
if ((Object)(object)_tooltipRoot != (Object)null && _tooltipRoot.activeSelf)
{
_tooltipRoot.SetActive(false);
}
}
private static void ShowTooltip(TrophyEntry entry, string text)
{
EnsureTooltipCreated();
if (!((Object)(object)_tooltipRoot == (Object)null) && !((Object)(object)_tooltipRect == (Object)null) && !((Object)(object)_tooltipText == (Object)null))
{
_tooltipText.text = text ?? string.Empty;
RefreshDropIcons(entry);
RefreshBestDamageIcon(entry);
ResizeTooltipToContent();
UpdateTooltipPosition();
_tooltipRoot.transform.SetAsLastSibling();
if (!_tooltipRoot.activeSelf)
{
_tooltipRoot.SetActive(true);
}
}
}
private static void ResizeTooltipToContent()
{
//IL_0090: 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_00fa: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)_tooltipRect == (Object)null) && !((Object)(object)_tooltipText == (Object)null) && !((Object)(object)_tooltipTextRect == (Object)null))
{
float num = Mathf.Max(280f, (float)Screen.width - 24f);
float num2 = _tooltipText.preferredWidth + 20f;
float num3 = _dropIconsPreferredWidth + 20f;
float num4 = Mathf.Clamp(Mathf.Max(num2, num3), 280f, Mathf.Min(460f, num));
_tooltipRect.sizeDelta = new Vector2(num4, _tooltipRect.sizeDelta.y);
Canvas.ForceUpdateCanvases();
LayoutRebuilder.ForceRebuildLayoutImmediate(_tooltipTextRect);
float num5 = Mathf.Max(120f, (float)Screen.height - 24f);
float num6 = Mathf.Clamp(_tooltipText.preferredHeight + 16f + _dropIconsHeight, 120f, num5);
_tooltipRect.sizeDelta = new Vector2(num4, num6);
}
}
private static void ClearDropIcons()
{
for (int i = 0; i < _dropIconObjects.Count; i++)
{
GameObject val = _dropIconObjects[i];
if ((Object)(object)val != (Object)null)
{
Object.Destroy((Object)(object)val);
}
}
_dropIconObjects.Clear();
}
private static void RefreshDropIcons(TrophyEntry entry)
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_020d: Unknown result type (might be due to invalid IL or missing references)
//IL_023f: 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_00cd: Expected O, but got Unknown
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: 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_015a: Unknown result type (might be due to invalid IL or missing references)
ClearDropIcons();
_dropIconsHeight = 0f;
_dropIconsPreferredWidth = 0f;
if ((Object)(object)_tooltipTextRect != (Object)null)
{
_tooltipTextRect.offsetMin = new Vector2(10f, 8f);
}
if ((Object)(object)_dropIconsRect == (Object)null || entry == null || entry.drops == null || entry.drops.Count == 0)
{
return;
}
int num = 0;
for (int i = 0; i < entry.drops.Count; i++)
{
TrophyDropEntry trophyDropEntry = entry.drops[i];
if (trophyDropEntry != null && !((Object)(object)trophyDropEntry.icon == (Object)null))
{
GameObject val = new GameObject("DropIcon_" + i.ToString(CultureInfo.InvariantCulture));
val.transform.SetParent((Transform)(object)_dropIconsRect, false);
RectTransform val2 = val.AddComponent<RectTransform>();
val2.anchorMin = new Vector2(0f, 0f);
val2.anchorMax = new Vector2(0f, 0f);
val2.pivot = new Vector2(0f, 0f);
val2.anchoredPosition = new Vector2(10f + (float)num * 34f, 0f);
val2.sizeDelta = new Vector2(30f, 30f);
Image val3 = val.AddComponent<Image>();
val3.sprite = trophyDropEntry.icon;
val3.preserveAspect = true;
((Graphic)val3).raycastTarget = false;
_dropIconObjects.Add(val);
num++;
if (num >= 12)
{
break;
}
}
}
if (num > 0)
{
_dropIconsHeight = 38f;
_dropIconsPreferredWidth = 10f + (float)num * 34f + 10f;
_dropIconsRect.sizeDelta = new Vector2(0f, _dropIconsHeight);
if ((Object)(object)_tooltipTextRect != (Object)null)
{
_tooltipTextRect.offsetMin = new Vector2(10f, 8f + _dropIconsHeight);
}
}
}
private static void UpdateTooltipPosition()
{
//IL_0027: 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)
//IL_0040: 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)
if (!((Object)(object)_tooltipRect == (Object)null) && !((Object)(object)_tooltipRoot == (Object)null))
{
_tooltipRect.anchoredPosition = ClampTooltipPosition(Input.mousePosition + new Vector3(18f, 18f, 0f));
_tooltipRoot.transform.SetAsLastSibling();
}
}
private static Vector2 ClampTooltipPosition(Vector3 desiredScreenPos)
{
//IL_001a: 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_007b: 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)
//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)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
float num = (((Object)(object)_tooltipRect != (Object)null) ? _tooltipRect.sizeDelta.x : 300f);
float num2 = (((Object)(object)_tooltipRect != (Object)null) ? _tooltipRect.sizeDelta.y : 250f);
float num3 = Mathf.Max(0f, (float)Screen.width - num - 8f);
float num4 = Mathf.Max(0f, (float)Screen.height - num2 - 8f);
float num5 = Mathf.Clamp(desiredScreenPos.x, 8f, num3);
float num6 = Mathf.Clamp(desiredScreenPos.y, 8f, num4);
return new Vector2(num5, num6);
}
private static void EnsureTrophyCache()
{
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
//IL_0183: Invalid comparison between Unknown and I4
//IL_0254: Unknown result type (might be due to invalid IL or missing references)
//IL_02bb: 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_02c8: Unknown result type (might be due to invalid IL or missing references)
//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)ObjectDB.instance == (Object)null || (Object)(object)ZNetScene.instance == (Object)null)
{
return;
}
int num = ((ObjectDB.instance.m_items != null) ? ObjectDB.instance.m_items.Count : 0);
if (num == _lastObjectDbItemCount && TrophyBySpriteId.Count > 0)
{
return;
}
TrophyBySpriteId.Clear();
_lastObjectDbItemCount = num;
CreaturePrefabs.Clear();
List<GameObject> prefabs = ZNetScene.instance.m_prefabs;
if (prefabs != null)
{
for (int i = 0; i < prefabs.Count; i++)
{
GameObject val = prefabs[i];
if (!((Object)(object)val == (Object)null))
{
Character component = val.GetComponent<Character>();
if (!((Object)(object)component == (Object)null))
{
CreaturePrefabs.Add(val);
}
}
}
}
List<GameObject> items = ObjectDB.instance.m_items;
if (items == null)
{
return;
}
for (int j = 0; j < items.Count; j++)
{
GameObject val2 = items[j];
if ((Object)(object)val2 == (Object)null)
{
continue;
}
ItemDrop component2 = val2.GetComponent<ItemDrop>();
if ((Object)(object)component2 == (Object)null || component2.m_itemData == null || component2.m_itemData.m_shared == null || (int)component2.m_itemData.m_shared.m_itemType != 13)
{
continue;
}
Sprite icon = component2.m_itemData.GetIcon();
if ((Object)(object)icon == (Object)null)
{
continue;
}
string prefabName = Utils.GetPrefabName(val2);
GameObject val3 = ResolveCreaturePrefabFromTrophyItem(val2, prefabName);
if ((Object)(object)val3 == (Object)null)
{
continue;
}
Character component3 = val3.GetComponent<Character>();
if (!((Object)(object)component3 == (Object)null))
{
string text = component2.m_itemData.m_shared.m_name;
if (!string.IsNullOrWhiteSpace(text) && text.StartsWith("$"))
{
text = LocalizeToken(text);
}
string text2 = Utils.GetPrefabName(val3);
if (string.IsNullOrWhiteSpace(text2))
{
text2 = ((Object)val3).name;
}
BestDamageInfo bestDamageInfo = ComputeBestDamageInfo(component3.m_damageModifiers);
TrophyEntry trophyEntry = new TrophyEntry
{
trophyDisplayName = (text ?? prefabName),
creatureDisplayName = FormatEnemyDisplayName(component3.m_name, text2),
prefabName = text2,
baseHp = Mathf.Max(1f, component3.m_health),
isBoss = IsBossPrefabName(text2),
damageModifiers = ((DamageModifiers)(ref component3.m_damageModifiers)).Clone(),
bestDamageType = bestDamageInfo.Type,
bestDamageMultiplier = bestDamageInfo.Multiplier
};
trophyEntry.drops.AddRange(BuildDropEntries(val3));
TrophyBySpriteId[((Object)icon).GetInstanceID()] = trophyEntry;
}
}
}
private static GameObject ResolveCreaturePrefabFromTrophyItem(GameObject trophyItemPrefab, string trophyItemName)
{
if ((Object)(object)trophyItemPrefab == (Object)null)
{
return null;
}
string value = Utils.GetPrefabName(trophyItemPrefab);
if (string.IsNullOrWhiteSpace(value))
{
value = ((Object)trophyItemPrefab).name;
}
string text = NormalizeKey(value);
for (int i = 0; i < CreaturePrefabs.Count; i++)
{
GameObject val = CreaturePrefabs[i];
if ((Object)(object)val == (Object)null)
{
continue;
}
CharacterDrop component = val.GetComponent<CharacterDrop>();
if ((Object)(object)component == (Object)null || component.m_drops == null)
{
continue;
}
for (int j = 0; j < component.m_drops.Count; j++)
{
Drop val2 = component.m_drops[j];
if (val2 != null && !((Object)(object)val2.m_prefab == (Object)null))
{
if ((Object)(object)val2.m_prefab == (Object)(object)trophyItemPrefab)
{
return val;
}
string value2 = Utils.GetPrefabName(val2.m_prefab);
if (string.IsNullOrWhiteSpace(value2))
{
value2 = ((Object)val2.m_prefab).name;
}
if (NormalizeKey(value2) == text)
{
return val;
}
}
}
}
return ResolveCreaturePrefabFromTrophyName(trophyItemName);
}
private static List<TrophyDropEntry> BuildDropEntries(GameObject creaturePrefab)
{
List<TrophyDropEntry> list = new List<TrophyDropEntry>();
if ((Object)(object)creaturePrefab == (Object)null)
{
return list;
}
CharacterDrop component = creaturePrefab.GetComponent<CharacterDrop>();
if ((Object)(object)component == (Object)null || component.m_drops == null)
{
return list;
}
for (int i = 0; i < component.m_drops.Count; i++)
{
Drop val = component.m_drops[i];
if (val != null && !((Object)(object)val.m_prefab == (Object)null))
{
ItemDrop component2 = val.m_prefab.GetComponent<ItemDrop>();
string text = Utils.GetPrefabName(val.m_prefab);
if (string.IsNullOrWhiteSpace(text))
{
text = ((Object)val.m_prefab).name;
}
string displayName = text;
Sprite icon = null;
if ((Object)(object)component2 != (Object)null && component2.m_itemData != null && component2.m_itemData.m_shared != null)
{
string name = component2.m_itemData.m_shared.m_name;
displayName = ((!string.IsNullOrWhiteSpace(name)) ? LocalizeLabel(name, text) : text);
icon = component2.m_itemData.GetIcon();
}
TrophyDropEntry trophyDropEntry = new TrophyDropEntry
{
displayName = displayName,
icon = icon,
amountMin = Mathf.Max(1, val.m_amountMin),
amountMax = Mathf.Max(1, val.m_amountMax),
chance = Mathf.Max(0f, val.m_chance),
levelMultiplier = val.m_levelMultiplier,
onePerPlayer = val.m_onePerPlayer
};
if (trophyDropEntry.amountMax < trophyDropEntry.amountMin)
{
trophyDropEntry.amountMax = trophyDropEntry.amountMin;
}
list.Add(trophyDropEntry);
}
}
return list;
}
private static List<GameObject> GetTrophyUiElements(InventoryGui gui)
{
if ((Object)(object)gui == (Object)null)
{
return null;
}
if (_inventoryGuiTrophyListField == null)
{
_inventoryGuiTrophyListField = AccessTools.Field(typeof(InventoryGui), "m_trophyList");
}
return _inventoryGuiTrophyListField?.GetValue(gui) as List<GameObject>;
}
private static void BindTooltipToTrophyElements(InventoryGui gui)
{
List<GameObject> trophyUiElements = GetTrophyUiElements(gui);
if (trophyUiElements == null || trophyUiElements.Count == 0)
{
return;
}
EnsureTrophyGridLayout(trophyUiElements);
for (int i = 0; i < trophyUiElements.Count; i++)
{
GameObject val = trophyUiElements[i];
if ((Object)(object)val == (Object)null)
{
continue;
}
NormalizeTrophyElementText(val);
Transform val2 = val.transform.Find("icon_bkg/icon");
if ((Object)(object)val2 == (Object)null)
{
continue;
}
Image component = ((Component)val2).GetComponent<Image>();
if (!((Object)(object)component == (Object)null) && !((Object)(object)component.sprite == (Object)null) && TrophyBySpriteId.TryGetValue(((Object)component.sprite).GetInstanceID(), out var value) && value != null)
{
TrophyHoverBridge trophyHoverBridge = ((Component)val2).GetComponent<TrophyHoverBridge>();
if ((Object)(object)trophyHoverBridge == (Object)null)
{
trophyHoverBridge = ((Component)val2).gameObject.AddComponent<TrophyHoverBridge>();
}
trophyHoverBridge.Bind(value);
((Graphic)component).raycastTarget = true;
}
}
}
private static void EnsureTrophyGridLayout(List<GameObject> trophyElements)
{
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_0108: 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_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: 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_014d: Unknown result type (might be due to invalid IL or missing references)
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
//IL_01e5: 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_025b: Unknown result type (might be due to invalid IL or missing references)
//IL_0272: 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_0296: Unknown result type (might be due to invalid IL or missing references)
//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
if (trophyElements == null || trophyElements.Count == 0)
{
return;
}
GameObject val = trophyElements[0];
if ((Object)(object)val == (Object)null || (Object)(object)val.transform == (Object)null || (Object)(object)val.transform.parent == (Object)null)
{
return;
}
Transform parent = val.transform.parent;
RectTransform val2 = (RectTransform)(object)((parent is RectTransform) ? parent : null);
if ((Object)(object)val2 == (Object)null)
{
return;
}
int instanceID = ((Object)val2).GetInstanceID();
if (instanceID == _lastConfiguredGridContainerId)
{
return;
}
GridLayoutGroup val3 = ((Component)val2).GetComponent<GridLayoutGroup>();
if ((Object)(object)val3 == (Object)null)
{
val3 = ((Component)val2).gameObject.AddComponent<GridLayoutGroup>();
}
ContentSizeFitter val4 = ((Component)val2).GetComponent<ContentSizeFitter>();
if ((Object)(object)val4 == (Object)null)
{
val4 = ((Component)val2).gameObject.AddComponent<ContentSizeFitter>();
}
RectTransform component = val.GetComponent<RectTransform>();
Vector2 val5 = default(Vector2);
((Vector2)(ref val5))..ctor(170f, 190f);
Rect rect;
if ((Object)(object)component != (Object)null)
{
rect = component.rect;
if (((Rect)(ref rect)).width > 20f)
{
rect = component.rect;
if (((Rect)(ref rect)).height > 20f)
{
rect = component.rect;
float width = ((Rect)(ref rect)).width;
rect = component.rect;
((Vector2)(ref val5))..ctor(width, ((Rect)(ref rect)).height);
}
}
}
float num = 18f;
float num2 = 16f;
rect = val2.rect;
float width2 = ((Rect)(ref rect)).width;
int constraintCount = 4;
if (width2 > 10f)
{
float num3 = Mathf.Max(1f, val5.x + num);
constraintCount = Mathf.Max(1, Mathf.FloorToInt((width2 + num) / num3));
}
val3.startCorner = (Corner)0;
val3.startAxis = (Axis)0;
((LayoutGroup)val3).childAlignment = (TextAnchor)1;
val3.cellSize = val5;
val3.spacing = new Vector2(num, num2);
val3.constraint = (Constraint)1;
val3.constraintCount = constraintCount;
val4.horizontalFit = (FitMode)0;
val4.verticalFit = (FitMode)2;
for (int i = 0; i < trophyElements.Count; i++)
{
GameObject val6 = trophyElements[i];
if (!((Object)(object)val6 == (Object)null))
{
RectTransform component2 = val6.GetComponent<RectTransform>();
if (!((Object)(object)component2 == (Object)null))
{
component2.anchorMin = new Vector2(0f, 1f);
component2.anchorMax = new Vector2(0f, 1f);
component2.pivot = new Vector2(0f, 1f);
component2.anchoredPosition3D = Vector3.zero;
((Transform)component2).localScale = Vector3.one;
}
}
}
LayoutRebuilder.ForceRebuildLayoutImmediate(val2);
_lastConfiguredGridContainerId = instanceID;
}
private static void NormalizeTrophyElementText(GameObject element)
{
if ((Object)(object)element == (Object)null)
{
return;
}
Text[] componentsInChildren = element.GetComponentsInChildren<Text>(true);
if (componentsInChildren == null || componentsInChildren.Length == 0)
{
return;
}
foreach (Text val in componentsInChildren)
{
if ((Object)(object)val == (Object)null)
{
continue;
}
val.resizeTextForBestFit = true;
val.resizeTextMinSize = 9;
val.resizeTextMaxSize = Mathf.Max(12, val.fontSize);
val.horizontalOverflow = (HorizontalWrapMode)1;
val.verticalOverflow = (VerticalWrapMode)1;
if (!string.IsNullOrWhiteSpace(val.text))
{
string text = SanitizeTrophyListLabel(val.text);
if (!string.Equals(text, val.text, StringComparison.Ordinal))
{
val.text = text;
}
}
}
}
private static string SanitizeTrophyListLabel(string text)
{
if (string.IsNullOrWhiteSpace(text))
{
return string.Empty;
}
string text2 = text.Replace("\r", string.Empty).Trim();
if (text2.Length == 0)
{
return text2;
}
string[] array = text2.Split(new char[1] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
if (array.Length <= 1)
{
return StripBracketToken(text2);
}
for (int i = 0; i < array.Length; i++)
{
string text3 = StripBracketToken(array[i].Trim());
if (!string.IsNullOrWhiteSpace(text3))
{
return text3;
}
}
return StripBracketToken(array[0].Trim());
}
private static string StripBracketToken(string text)
{
if (string.IsNullOrWhiteSpace(text))
{
return string.Empty;
}
string text2 = text.Trim();
if (text2.StartsWith("[", StringComparison.Ordinal) && text2.EndsWith("]", StringComparison.Ordinal))
{
return string.Empty;
}
return text2;
}
private static GameObject ResolveCreaturePrefabFromTrophyName(string trophyItemName)
{
if (string.IsNullOrWhiteSpace(trophyItemName))
{
return null;
}
if (CreaturePrefabs.Count == 0)
{
return null;
}
HashSet<string> hashSet = CreateSearchKeysFromTrophyName(trophyItemName);
if (hashSet.Count == 0)
{
return null;
}
GameObject result = null;
int num = int.MaxValue;
for (int i = 0; i < CreaturePrefabs.Count; i++)
{
GameObject val = CreaturePrefabs[i];
if ((Object)(object)val == (Object)null)
{
continue;
}
string value = Utils.GetPrefabName(val);
if (string.IsNullOrWhiteSpace(value))
{
value = ((Object)val).name;
}
string text = NormalizeKey(value);
if (string.IsNullOrWhiteSpace(text))
{
continue;
}
if (hashSet.Contains(text))
{
return val;
}
foreach (string item in hashSet)
{
if (!string.IsNullOrWhiteSpace(item) && text.Contains(item))
{
int length = text.Length;
if (length < num)
{
num = length;
result = val;
}
}
}
}
return result;
}
private static HashSet<string> CreateSearchKeysFromTrophyName(string trophyItemName)
{
HashSet<string> hashSet = new HashSet<string>();
string text = NormalizeKey(trophyItemName);
if (string.IsNullOrWhiteSpace(text))
{
return hashSet;
}
hashSet.Add(text);
switch (text)
{
case "elder":
case "theelder":
hashSet.Add("gdking");
break;
case "moder":
hashSet.Add("dragon");
break;
case "yagluth":
hashSet.Add("goblinking");
break;
case "queen":
case "thequeen":
hashSet.Add("seekerqueen");
break;
}
return hashSet;
}
private static string NormalizeKey(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
return string.Empty;
}
string text = value.Trim().ToLowerInvariant();
text = text.Replace("(clone)", "");
text = text.Replace("trophy", "");
text = text.Replace("boss", "");
text = text.Replace("_", "");
text = text.Replace("-", "");
return text.Replace(" ", "");
}
private static string BuildTooltipText(TrophyEntry entry)
{
//IL_0210: Unknown result type (might be due to invalid IL or missing references)
//IL_022c: Unknown result type (might be due to invalid IL or missing references)
//IL_0263: Unknown result type (might be due to invalid IL or missing references)
//IL_029a: Unknown result type (might be due to invalid IL or missing references)
//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
if (entry == null)
{
return string.Empty;
}
StringBuilder stringBuilder = new StringBuilder(640);
string text = LocalizeToken(entry.trophyDisplayName);
if (string.IsNullOrWhiteSpace(text))
{
text = entry.trophyDisplayName;
}
stringBuilder.Append(Bold(text));
if (!string.IsNullOrWhiteSpace(entry.creatureDisplayName))
{
stringBuilder.Append("\n<color=#dcdcdc>").Append(entry.creatureDisplayName).Append("</color>");
}
if (entry.isBoss)
{
stringBuilder.Append("\n\n").Append(Bold(Tr("Base HP", "HP Base")));
stringBuilder.Append("\n<color=").Append("#FFA03D").Append(">")
.Append(entry.baseHp.ToString("0.##", CultureInfo.InvariantCulture))
.Append("</color> <color=")
.Append("#9A9A9A")
.Append(">")
.Append(Tr("(scales with nearby players)", "(escala com jogadores proximos)"))
.Append("</color>");
}
else
{
stringBuilder.Append("\n\n").Append(Bold(Tr("HP (by stars)", "HP (por estrelas)")));
for (int i = 1; i <= 3; i++)
{
float num = entry.baseHp * (float)i;
int num2 = i - 1;
string value = ((num2 <= 0) ? "0★" : new string('★', num2));
stringBuilder.Append("\n<color=").Append("#FFFFFF").Append(">")
.Append(value)
.Append(":</color> <color=")
.Append("#FFA03D")
.Append(">")
.Append(num.ToString("0.##", CultureInfo.InvariantCulture))
.Append("</color>");
}
}
AppendBestDamageTypeSection(stringBuilder, entry.damageModifiers);
AppendModifierBlock(stringBuilder, Tr("Weaknesses", "Fraquezas"), entry.damageModifiers, IsWeakModifier);
AppendModifierBlock(stringBuilder, Tr("Resistances", "Resistencias"), entry.damageModifiers, IsResistantModifier);
AppendModifierBlock(stringBuilder, Tr("Immunities and Ignore", "Imunidades e Ignora"), entry.damageModifiers, IsImmuneOrIgnoreModifier);
AppendModifierBlock(stringBuilder, Tr("Normal damage", "Dano normal"), entry.damageModifiers, IsNormalModifier);
AppendDropsSection(stringBuilder, entry.drops);
return stringBuilder.ToString();
}
private static void AppendModifierBlock(StringBuilder sb, string title, DamageModifiers mods, Func<DamageModifier, bool> include)
{
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: 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_0041: 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_0055: Unknown result type (might be due to invalid IL or missing references)
sb.Append("\n\n").Append(Bold(title));
DamageType[] array = new DamageType[10];
RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
DamageType[] array2 = (DamageType[])(object)array;
bool flag = false;
foreach (DamageType val in array2)
{
DamageModifier modifier = ((DamageModifiers)(ref mods)).GetModifier(val);
if (include(modifier))
{
AppendDamageModifierLine(sb, val, modifier);
flag = true;
}
}
if (!flag)
{
sb.Append("\n<color=").Append("#9A9A9A").Append(">")
.Append(Tr("None", "Nenhuma"))
.Append("</color>");
}
}
private static void RefreshBestDamageIcon(TrophyEntry entry)
{
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_bestDamageIconImage == (Object)null)
{
return;
}
if (entry == null || entry.bestDamageMultiplier <= 1f)
{
((Behaviour)_bestDamageIconImage).enabled = false;
_bestDamageIconImage.sprite = null;
return;
}
EnsureDamageIconsLoaded();
if (!DamageIconByType.TryGetValue(entry.bestDamageType, out var value) || (Object)(object)value == (Object)null)
{
((Behaviour)_bestDamageIconImage).enabled = false;
_bestDamageIconImage.sprite = null;
}
else
{
_bestDamageIconImage.sprite = value;
((Behaviour)_bestDamageIconImage).enabled = true;
}
}
private static void EnsureDamageIconsLoaded()
{
if (_damageIconsLoaded)
{
return;
}
_damageIconsLoaded = true;
try
{
Assembly assembly = typeof(TrophyTooltip).Assembly;
string[] manifestResourceNames = assembly.GetManifestResourceNames();
string text = null;
foreach (string text2 in manifestResourceNames)
{
if (text2.IndexOf("iconsbundle", StringComparison.OrdinalIgnoreCase) >= 0)
{
text = text2;
break;
}
}
if (string.IsNullOrWhiteSpace(text))
{
ManualLogSource log = _log;
if (log != null)
{
log.LogWarning((object)"[TrofeusInfo][TrophyTooltip] iconsbundle nao encontrado nos recursos.");
}
return;
}
using (Stream stream = assembly.GetManifestResourceStream(text))
{
if (stream == null)
{
ManualLogSource log2 = _log;
if (log2 != null)
{
log2.LogWarning((object)"[TrofeusInfo][TrophyTooltip] stream do iconsbundle veio nulo.");
}
return;
}
byte[] array = new byte[stream.Length];
int num;
for (int j = 0; j < array.Length; j += num)
{
num = stream.Read(array, j, array.Length - j);
if (num <= 0)
{
break;
}
}
_damageIconsBundle = AssetBundle.LoadFromMemory(array);
}
if ((Object)(object)_damageIconsBundle == (Object)null)
{
ManualLogSource log3 = _log;
if (log3 != null)
{
log3.LogWarning((object)"[TrofeusInfo][TrophyTooltip] falha ao carregar iconsbundle.");
}
return;
}
Sprite[] array2 = _damageIconsBundle.LoadAllAssets<Sprite>();
Dictionary<string, Sprite> dictionary = new Dictionary<string, Sprite>(StringComparer.OrdinalIgnoreCase);
foreach (Sprite val in array2)
{
if (!((Object)(object)val == (Object)null) && !string.IsNullOrWhiteSpace(((Object)val).name))
{
dictionary[((Object)val).name.Trim()] = val;
}
}
MapDamageIcon((DamageType)2, "cortante", dictionary);
MapDamageIcon((DamageType)8, "cortar", dictionary);
MapDamageIcon((DamageType)1, "esmagador", dictionary);
MapDamageIcon((DamageType)512, "espirito", dictionary);
MapDamageIcon((DamageType)32, "fogo", dictionary);
MapDamageIcon((DamageType)64, "gelo", dictionary);
MapDamageIcon((DamageType)4, "perfurante", dictionary);
MapDamageIcon((DamageType)16, "picareta", dictionary);
MapDamageIcon((DamageType)128, "raio", dictionary);
MapDamageIcon((DamageType)256, "veneno", dictionary);
}
catch (Exception ex)
{
ManualLogSource log4 = _log;
if (log4 != null)
{
log4.LogWarning((object)("[TrofeusInfo][TrophyTooltip] erro carregando iconsbundle: " + ex.Message));
}
}
}
private static void MapDamageIcon(DamageType type, string spriteName, Dictionary<string, Sprite> byName)
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
if (byName != null && !string.IsNullOrWhiteSpace(spriteName) && byName.TryGetValue(spriteName, out var value) && !((Object)(object)value == (Object)null))
{
DamageIconByType[type] = value;
}
}
private static void AppendDropsSection(StringBuilder sb, List<TrophyDropEntry> drops)
{
sb.Append("\n\n").Append(Bold(Tr("Possible drops", "Drops possiveis")));
if (drops == null || drops.Count == 0)
{
sb.Append("\n<color=").Append("#9A9A9A").Append(">")
.Append(Tr("None configured", "Nenhum configurado"))
.Append("</color>");
return;
}
for (int i = 0; i < drops.Count; i++)
{
TrophyDropEntry trophyDropEntry = drops[i];
if (trophyDropEntry != null)
{
sb.Append("\n<color=white>").Append(trophyDropEntry.displayName).Append("</color> <color=")
.Append("#FFA03D")
.Append(">(")
.Append(FormatDropDescriptor(trophyDropEntry))
.Append(")</color>");
}
}
}
private static string FormatDropDescriptor(TrophyDropEntry drop)
{
string text = ((drop.amountMin == drop.amountMax) ? ("x" + drop.amountMin.ToString(CultureInfo.InvariantCulture)) : ("x" + drop.amountMin.ToString(CultureInfo.InvariantCulture) + "-" + drop.amountMax.ToString(CultureInfo.InvariantCulture)));
string text2 = (Mathf.Clamp01(drop.chance) * 100f).ToString("0.#", CultureInfo.InvariantCulture) + "%";
if (drop.levelMultiplier)
{
text2 += " +lvl";
}
if (drop.onePerPlayer)
{
text2 += Tr(" /player", " /jogador");
}
return text + " | " + text2;
}
private static bool IsWeakModifier(DamageModifier mod)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Invalid comparison between Unknown and I4
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Invalid comparison between Unknown and I4
return (int)mod == 8 || (int)mod == 2 || (int)mod == 6;
}
private static bool IsResistantModifier(DamageModifier mod)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Invalid comparison between Unknown and I4
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Invalid comparison between Unknown and I4
return (int)mod == 7 || (int)mod == 1 || (int)mod == 5;
}
private static bool IsImmuneOrIgnoreModifier(DamageModifier mod)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Invalid comparison between Unknown and I4
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
return (int)mod == 3 || (int)mod == 4;
}
private static bool IsNormalModifier(DamageModifier mod)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Invalid comparison between Unknown and I4
return (int)mod == 0;
}
private static BestDamageInfo ComputeBestDamageInfo(DamageModifiers mods)
{
//IL_0021: 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_0032: 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_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: 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_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
DamageType[] array = new DamageType[10];
RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
DamageType[] array2 = (DamageType[])(object)array;
BestDamageInfo bestDamageInfo = default(BestDamageInfo);
bestDamageInfo.Type = array2[0];
bestDamageInfo.Modifier = ((DamageModifiers)(ref mods)).GetModifier(array2[0]);
bestDamageInfo.Multiplier = GetModifierMultiplier(((DamageModifiers)(ref mods)).GetModifier(array2[0]));
BestDamageInfo result = bestDamageInfo;
for (int i = 1; i < array2.Length; i++)
{
DamageType val = array2[i];
DamageModifier modifier = ((DamageModifiers)(ref mods)).GetModifier(val);
float modifierMultiplier = GetModifierMultiplier(modifier);
if (modifierMultiplier > result.Multiplier)
{
result.Type = val;
result.Modifier = modifier;
result.Multiplier = modifierMultiplier;
}
}
return result;
}
private static void AppendBestDamageTypeSection(StringBuilder sb, DamageModifiers mods)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: 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)
BestDamageInfo bestDamageInfo = ComputeBestDamageInfo(mods);
sb.Append("\n\n").Append(Bold(Tr("Best damage against this enemy", "Melhor dano contra este inimigo")));
if (bestDamageInfo.Multiplier <= 1f)
{
sb.Append("\n<color=").Append("#9A9A9A").Append(">")
.Append(Tr("No specific bonus", "Sem bonus especifico"))
.Append("</color>");
return;
}
string damageTypeLabel = GetDamageTypeLabel(bestDamageInfo.Type);
string damageModifierLabel = GetDamageModifierLabel(bestDamageInfo.Modifier);
string value = StripRichText(damageTypeLabel);
string value2 = StripRichText(damageModifierLabel);
sb.Append("\n<color=white>").Append(Tr("Type:", "Tipo:")).Append("</color> <size=18><color=#FFA03D><b>")
.Append(value)
.Append("</b></color></size>");
sb.Append("\n<color=white>").Append(Tr("Bonus:", "Bonus:")).Append("</color> <size=18><color=#FFA03D><b>")
.Append(value2)
.Append(" (x")
.Append(bestDamageInfo.Multiplier.ToString("0.##", CultureInfo.InvariantCulture))
.Append(")</b></color></size>");
}
private static void AppendDamageModifierLine(StringBuilder sb, DamageType damageType, DamageModifier modifier)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
sb.Append("\n<color=white>").Append(GetDamageTypeLabel(damageType)).Append(":</color> <color=")
.Append("#FFA03D")
.Append(">")
.Append(GetDamageModifierLabel(modifier))
.Append("</color>");
}
private static string Bold(string text)
{
if (string.IsNullOrEmpty(text))
{
return string.Empty;
}
return "<color=#98c2ed><b>" + text + "</b></color>";
}
private static string Orange(string text)
{
if (string.IsNullOrEmpty(text))
{
return string.Empty;
}
return "<color=#FFA03D>" + text + "</color>";
}
private static string OrangeBold(string text)
{
if (string.IsNullOrEmpty(text))
{
return string.Empty;
}
return "<color=#FFA03D><b>" + text + "</b></color>";
}
private static string LocalizeLabel(string token, string fallback)
{
string text = LocalizeToken(token);
if (string.IsNullOrWhiteSpace(text))
{
return fallback;
}
string text2 = text.Trim();
if (text2.StartsWith("[", StringComparison.Ordinal) && text2.EndsWith("]", StringComparison.Ordinal))
{
return fallback;
}
if (text2.StartsWith("$", StringComparison.Ordinal))
{
return fallback;
}
return text2;
}
private static string GetDamageModifierLabel(DamageModifier modifier)
{
//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_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Expected I4, but got Unknown
return (int)modifier switch
{
7 => LocalizeLabel("$inventory_slightlyresistant", Tr("Slightly resistant", "Levemente resistente")),
1 => LocalizeLabel("$inventory_resistant", Tr("Resistant", "Resistente")),
5 => LocalizeLabel("$inventory_veryresistant", Tr("Very resistant", "Muito resistente")),
8 => LocalizeLabel("$inventory_slightlyweak", Tr("Slightly weak", "Levemente fraco")),
2 => LocalizeLabel("$inventory_weak", Tr("Weak", "Fraco")),
6 => LocalizeLabel("$inventory_veryweak", Tr("Very weak", "Muito fraco")),
3 => LocalizeLabel("$inventory_immune", Tr("Immune", "Imune")),
4 => LocalizeLabel("$inventory_ignore", Tr("Ignore", "Ignora")),
_ => LocalizeLabel("$inventory_normal", Tr("Normal", "Normal")),
};
}
private static string GetDamageTypeLabel(DamageType type)
{
//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_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Invalid comparison between Unknown and I4
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Invalid comparison between Unknown and I4
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Invalid comparison between Unknown and I4
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Invalid comparison between Unknown and I4
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Invalid comparison between Unknown and I4
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Invalid comparison between Unknown and I4
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Expected I4, but got Unknown
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Invalid comparison between Unknown and I4
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Invalid comparison between Unknown and I4
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Invalid comparison between Unknown and I4
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Invalid comparison between Unknown and I4
DamageType val = type;
DamageType val2 = val;
string text;
if ((int)val2 <= 32)
{
if ((int)val2 <= 8)
{
switch (val2 - 1)
{
case 0:
goto IL_008a;
case 1:
goto IL_00a9;
case 3:
goto IL_00c8;
case 2:
goto IL_01b4;
}
if ((int)val2 != 8)
{
goto IL_01b4;
}
text = LocalizeLabel("$inventory_chop", Tr("Chop", "Cortar madeira"));
}
else if ((int)val2 != 16)
{
if ((int)val2 != 32)
{
goto IL_01b4;
}
text = LocalizeLabel("$inventory_fire", Tr("Fire", "Fogo"));
}
else
{
text = LocalizeLabel("$inventory_pickaxe", Tr("Pickaxe", "Picareta"));
}
}
else if ((int)val2 <= 128)
{
if ((int)val2 != 64)
{
if ((int)val2 != 128)
{
goto IL_01b4;
}
text = LocalizeLabel("$inventory_lightning", Tr("Lightning", "Raio"));
}
else
{
text = LocalizeLabel("$inventory_frost", Tr("Frost", "Gelo"));
}
}
else if ((int)val2 != 256)
{
if ((int)val2 != 512)
{
goto IL_01b4;
}
text = LocalizeLabel("$inventory_spirit", Tr("Spirit", "Espirito"));
}
else
{
text = LocalizeLabel("$inventory_poison", Tr("Poison", "Veneno"));
}
goto IL_01c4;
IL_00a9:
text = LocalizeLabel("$inventory_slash", Tr("Slash", "Cortante"));
goto IL_01c4;
IL_008a:
text = LocalizeLabel("$inventory_blunt", Tr("Blunt", "Contundente"));
goto IL_01c4;
IL_01c4:
return StripLeadingSymbols(text);
IL_01b4:
text = ((object)(DamageType)(ref type)).ToString();
goto IL_01c4;
IL_00c8:
text = LocalizeLabel("$inventory_pierce", Tr("Pierce", "Perfurante"));
goto IL_01c4;
}
private static string StripLeadingSymbols(string text)
{
if (string.IsNullOrWhiteSpace(text))
{
return string.Empty;
}
string text2 = text.Trim();
int i;
for (i = 0; i < text2.Length; i++)
{
char c = text2[i];
if (char.IsLetterOrDigit(c))
{
break;
}
}
return (i > 0 && i < text2.Length) ? text2.Substring(i).TrimStart(Array.Empty<char>()) : text2;
}
private static string StripRichText(string text)
{
if (string.IsNullOrEmpty(text))
{
return string.Empty;
}
StringBuilder stringBuilder = new StringBuilder(text.Length);
bool flag = false;
foreach (char c in text)
{
switch (c)
{
case '<':
flag = true;
continue;
case '>':
flag = false;
continue;
}
if (!flag)
{
stringBuilder.Append(c);
}
}
return stringBuilder.ToString().Trim();
}
private static float GetModifierMultiplier(DamageModifier modifier)
{
//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_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Expected I4, but got Unknown
switch ((int)modifier)
{
case 7:
return 0.75f;
case 1:
return 0.5f;
case 5:
return 0.25f;
case 8:
return 1.25f;
case 2:
return 1.5f;
case 6:
return 2f;
case 3:
case 4:
return 0f;
default:
return 1f;
}
}
private static Color GetModifierColor(DamageModifier modifier)
{
//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_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: 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_002d: Expected I4, but got Unknown
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: 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_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: 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)
switch (modifier - 1)
{
case 1:
case 5:
case 7:
return new Color(1f, 1f, 0f, 1f);
case 0:
case 2:
case 3:
case 4:
case 6:
return new Color(0.6f, 0.6f, 0.6f, 1f);
default:
return Color.white;
}
}
private static string LocalizeToken(string token)
{
if (string.IsNullOrWhiteSpace(token))
{
return string.Empty;
}
if (!token.StartsWith("$", StringComparison.Ordinal))
{
return token;
}
ResolveLocalization();
if (_localizeMethod == null)
{
return token;
}
object obj = ((_localizationInstanceProperty != null) ? _localizationInstanceProperty.GetValue(null, null) : _localizationInstanceField?.GetValue(null));
if (obj == null)
{
return token;
}
try
{
object obj2 = _localizeMethod.Invoke(obj, new object[1] { token });
string text = obj2 as string;
if (string.IsNullOrWhiteSpace(text))
{
return token;
}
return text;
}
catch
{
return token;
}
}
private static string Tr(string en, string ptBr)
{
EnsureTranslationFilesAndLoad();
bool flag = IsPortuguese();
Dictionary<string, string> dictionary = (flag ? PortugueseTranslations : EnglishTranslations);
if (dictionary.TryGetValue(en, out var value) && !string.IsNullOrWhiteSpace(value))
{
return value;
}
if (dictionary.TryGetValue(ptBr, out value) && !string.IsNullOrWhiteSpace(value))
{
return value;
}
return flag ? ptBr : en;
}
private static bool IsPortuguese()
{
ResolveLocalization();
object obj = ((_localizationInstanceProperty != null) ? _localizationInstanceProperty.GetValue(null, null) : _localizationInstanceField?.GetValue(null));
if (obj == null)
{
return true;
}
try
{
MethodInfo method = obj.GetType().GetMethod("GetSelectedLanguage", BindingFlags.Instance | BindingFlags.Public);
if (method != null)
{
string text = method.Invoke(obj, null) as string;
if (!string.IsNullOrWhiteSpace(text))
{
string text2 = text.Trim().ToLowerInvariant();
if (text2.Contains("portugu"))
{
return true;
}
if (text2.Contains("brazil"))
{
return true;
}
if (text2.Contains("english"))
{
return false;
}
}
}
}
catch
{
}
return true;
}
private static void EnsureTranslationFilesAndLoad()
{
if (_translationsLoaded)
{
return;
}
_translationsLoaded = true;
try
{
Dictionary<string, string> defaultPortugueseTranslations = GetDefaultPortugueseTranslations();
Dictionary<string, string> defaultEnglishTranslations = GetDefaultEnglishTranslations();
string path = Path.Combine(Paths.PluginPath, "TrophyTooltip", "Traslations");
string text = Path.Combine(path, "English");
string text2 = Path.Combine(path, "Portuguese_Brazilian");
Directory.CreateDirectory(text);
Directory.CreateDirectory(text2);
string text3 = Path.Combine(text, "English.json");
string text4 = Path.Combine(text2, "Portuguese_Brazilian.json");
if (!File.Exists(text3))
{
File.WriteAllText(text3, SerializeFlatJson(defaultEnglishTranslations), Encoding.UTF8);
}
if (!File.Exists(text4))
{
File.WriteAllText(text4, SerializeFlatJson(defaultPortugueseTranslations), Encoding.UTF8);
}
EnglishTranslations.Clear();
PortugueseTranslations.Clear();
LoadTranslationsFromFile(text3, defaultEnglishTranslations, EnglishTranslations);
LoadTranslationsFromFile(text4, defaultPortugueseTranslations, PortugueseTranslations);
}
catch (Exception ex)
{
ManualLogSource log = _log;
if (log != null)
{
log.LogWarning((object)("[TrofeusInfo][TrophyTooltip] Falha ao carregar traducoes: " + ex.Message));
}
}
}
private static void LoadTranslationsFromFile(string filePath, Dictionary<string, string> defaults, Dictionary<string, string> target)
{
foreach (KeyValuePair<string, string> @default in defaults)
{
target[@default.Key] = @default.Value;
}
if (!File.Exists(filePath))
{
return;
}
string json = File.ReadAllText(filePath, Encoding.UTF8);
Dictionary<string, string> dictionary = ParseFlatJson(json);
foreach (KeyValuePair<string, string> item in dictionary)
{
if (!string.IsNullOrWhiteSpace(item.Key))
{
target[item.Key] = item.Value ?? string.Empty;
}
}
}
private static Dictionary<string, string> ParseFlatJson(string json)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
if (string.IsNullOrWhiteSpace(json))
{
return dictionary;
}
MatchCollection matchCollection = Regex.Matches(json, "\"((?:\\\\.|[^\"])*)\"\\s*:\\s*\"((?:\\\\.|[^\"])*)\"");
for (int i = 0; i < matchCollection.Count; i++)
{
string value = matchCollection[i].Groups[1].Value;
string value2 = matchCollection[i].Groups[2].Value;
string text = JsonUnescape(value);
string value3 = JsonUnescape(value2);
if (!string.IsNullOrWhiteSpace(text))
{
dictionary[text] = value3;
}
}
return dictionary;
}
private static string SerializeFlatJson(Dictionary<string, string> map)
{
StringBuilder stringBuilder = new StringBuilder(2048);
stringBuilder.Append("{\n");
bool flag = true;
foreach (KeyValuePair<string, string> item in map)
{
if (!flag)
{
stringBuilder.Append(",\n");
}
flag = false;
stringBuilder.Append(" \"").Append(JsonEscape(item.Key)).Append("\": \"")
.Append(JsonEscape(item.Value ?? string.Empty))
.Append("\"");
}
stringBuilder.Append("\n}\n");
return stringBuilder.ToString();
}
private static string JsonEscape(string s)
{
if (string.IsNullOrEmpty(s))
{
return string.Empty;
}
return s.Replace("\\", "\\\\").Replace("\"", "\\\"").Replace("\r", "\\r")
.Replace("\n", "\\n")
.Replace("\t", "\\t");
}
private static string JsonUnescape(string s)
{
if (string.IsNullOrEmpty(s))
{
return string.Empty;
}
return s.Replace("\\n", "\n").Replace("\\r", "\r").Replace("\\t", "\t")
.Replace("\\\"", "\"")
.Replace("\\\\", "\\");
}
private static Dictionary<string, string> GetDefaultPortugueseTranslations()
{
return new Dictionary<string, string>
{
{ "Base HP", "HP Base" },
{ "(scales with nearby players)", "(escala com jogadores proximos)" },
{ "HP (by stars)", "HP (por estrelas)" },
{ "Weaknesses", "Fraquezas" },
{ "Resistances", "Resistencias" },
{ "Immunities and Ignore", "Imunidades e Ignora" },
{ "Normal damage", "Dano normal" },
{ "None", "Nenhuma" },
{ "Possible drops", "Drops possiveis" },
{ "None configured", "Nenhum configurado" },
{ " /player", " /jogador" },
{ "Best damage against this enemy", "Melhor dano contra este inimigo" },
{ "No specific bonus", "Sem bonus especifico" },
{ "Type:", "Tipo:" },
{ "Bonus:", "Bonus:" },
{ "Slightly resistant", "Levemente resistente" },
{ "Resistant", "Resistente" },
{ "Very resistant", "Muito resistente" },
{ "Slightly weak", "Levemente fraco" },
{ "Weak", "Fraco" },
{ "Very weak", "Muito fraco" },
{ "Immune", "Imune" },
{ "Ignore", "Ignora" },
{ "Normal", "Normal" },
{ "Blunt", "Contundente" },
{ "Slash", "Cortante" },
{ "Pierce", "Perfurante" },
{ "Chop", "Cortar madeira" },
{ "Pickaxe", "Picareta" },
{ "Fire", "Fogo" },
{ "Frost", "Gelo" },
{ "Lightning", "Raio" },
{ "Poison", "Veneno" },
{ "Spirit", "Espirito" },
{ "Unknown", "Desconhecido" }
};
}
private static Dictionary<string, string> GetDefaultEnglishTranslations()
{
return new Dictionary<string, string>
{
{ "Base HP", "Base HP" },
{ "(scales with nearby players)", "(scales with nearby players)" },
{ "HP (by stars)", "HP (by stars)" },
{ "Weaknesses", "Weaknesses" },
{ "Resistances", "Resistances" },
{ "Immunities and Ignore", "Immunities and Ignore" },
{ "Normal damage", "Normal damage" },
{ "None", "None" },
{ "Possible drops", "Possible drops" },
{ "None configured", "None configured" },
{ " /player", " /player" },
{ "Best damage against this enemy", "Best damage against this enemy" },
{ "No specific bonus", "No specific bonus" },
{ "Type:", "Type:" },
{ "Bonus:", "Bonus:" },
{ "Slightly resistant", "Slightly resistant" },
{ "Resistant", "Resistant" },
{ "Very resistant", "Very resistant" },
{ "Slightly weak", "Slightly weak" },
{ "Weak", "Weak" },
{ "Very weak", "Very weak" },
{ "Immune", "Immune" },
{ "Ignore", "Ignore" },
{ "Normal", "Normal" },
{ "Blunt", "Blunt" },
{ "Slash", "Slash" },
{ "Pierce", "Pierce" },
{ "Chop", "Chop" },
{ "Pickaxe", "Pickaxe" },
{ "Fire", "Fire" },
{ "Frost", "Frost" },
{ "Lightning", "Lightning" },
{ "Poison", "Poison" },
{ "Spirit", "Spirit" },
{ "Unknown", "Unknown" }
};
}
private static void ResolveLocalization()
{
if (_localizationResolved)
{
return;
}
_localizationResolved = true;
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Type type = null;
for (int i = 0; i < assemblies.Length; i++)
{
type = assemblies[i].GetType("Localization", throwOnError: false);
if (type != null)
{
break;
}
}
if (!(type == null))
{
_localizationInstanceProperty = type.GetProperty("instance", BindingFlags.Static | BindingFlags.Public);
if (_localizationInstanceProperty == null)
{
_localizationInstanceField = type.GetField("instance", BindingFlags.Static | BindingFlags.Public);
}
_localizeMethod = type.GetMethod("Localize", BindingFlags.Instance | BindingFlags.Public, null, new Type[1] { typeof(string) }, null);
}
}
private static string FormatEnemyDisplayName(string rawName, string fallbackPrefab)
{
string result = (string.IsNullOrWhiteSpace(fallbackPrefab) ? Tr("Unknown", "Desconhecido") : fallbackPrefab);
if (string.IsNullOrWhiteSpace(rawName))
{
return result;
}
string text = LocalizeToken(rawName);
if (!string.IsNullOrWhiteSpace(text) && !text.StartsWith("$", StringComparison.Ordinal))
{
return text.Trim();
}
return result;
}
private static bool IsBossPrefabName(string prefabName)
{
string text = NormalizeKey(prefabName);
if (string.IsNullOrWhiteSpace(text))
{
return false;
}
return text.Contains("eikthyr") || text.Contains("gdking") || text.Contains("bonemass") || text.Contains("dragon") || text.Contains("goblinking") || text.Contains("seekerqueen") || text.Contains("fader");
}
[HarmonyPatch(typeof(InventoryGui), "UpdateTrophyList")]
[HarmonyPostfix]
private static void InventoryGuiUpdateTrophyList_Postfix(InventoryGui __instance)
{
EnsureTrophyCache();
BindTooltipToTrophyElements(__instance);
}
[HarmonyPatch(typeof(InventoryGui), "OnCloseTrophies")]
[HarmonyPostfix]
private static void InventoryGuiOnCloseTrophies_Postfix()
{
HideTooltip();
}
[HarmonyPatch(typeof(InventoryGui), "OnDestroy")]
[HarmonyPostfix]
private static void InventoryGuiOnDestroy_Postfix()
{
HideTooltip();
}
[HarmonyPatch(typeof(Hud), "OnDestroy")]
[HarmonyPostfix]
private static void HudOnDestroy_Postfix()
{
DestroyTooltip();
}
}
}