Decompiled source of ZenMap v1.1.0
plugins/ZenMap.dll
Decompiled 20 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using GUIFramework; using HarmonyLib; using JetBrains.Annotations; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Jotunn.Utils; using Microsoft.CodeAnalysis; using Splatform; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; using Zen; using Zen.Lib; using Zen.Lib.Config; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("ZenMap")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ZenMap")] [assembly: AssemblyCopyright("Copyright \ufffd 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")] [assembly: AssemblyFileVersion("0.0.1.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.1.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [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 ZenMap { internal static class ColorExt { public static uint ToUInt(this Color color) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Color32.op_Implicit(color).ToUInt(); } public static uint ToUInt(this Color32 color) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) return (uint)((color.r << 24) | (color.g << 16) | (color.b << 8) | color.a); } public static Color ToColor(this uint rgba) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) return Color32.op_Implicit(new Color32((byte)(rgba >> 24), (byte)(rgba >> 16), (byte)(rgba >> 8), (byte)rgba)); } } internal static class DataKey { public const int CurrentVersion = 1; public const string MapID = "ZenMap_id"; public const string Seed = "ZenMap_seed"; public const string Label = "ZenMap_label"; public const string Position = "ZenMap_position"; public const string Radius = "ZenMap_radius"; public const string Pins = "ZenMap_pins"; public const string Timestamp = "ZenMap_timestamp"; public const string Version = "ZenMap_version"; public const string LastUsedMapID = "ZenMap_LastUsedMapID"; } [HarmonyPatch] internal static class InventoryCheck { private static bool _isFound; public static bool HaveMap { get; private set; } internal static void Init() { HaveMap = InventoryExt.ContainsItemByPrefab(((Humanoid)Player.m_localPlayer).GetInventory(), "ZenMap"); _isFound = false; } private static bool IsValid(Inventory inv) { if (Object.op_Implicit((Object)(object)Player.m_localPlayer)) { return inv == ((Humanoid)Player.m_localPlayer).GetInventory(); } return false; } private static void Reset(Inventory inv) { if (IsValid(inv)) { _isFound = false; } } private static void CheckIfHadMap(Inventory inv) { if (IsValid(inv) && Object.op_Implicit((Object)(object)Minimap.instance) && Minimap.instance.m_visibleIconTypes == MapPinType.VisibleTypes.CompassWithMap && !_isFound) { RequirePinUpdate(); } } private static void CheckMapItem(Inventory inv, ItemData item) { if (IsValid(inv) && !_isFound) { HaveMap = ItemDataExt.GetPrefabName(item) == "ZenMap"; if (HaveMap) { _isFound = true; RequirePinUpdate(); } } } private static void RequirePinUpdate() { if (Object.op_Implicit((Object)(object)Minimap.instance)) { Minimap.instance.m_pinUpdateRequired = true; } } [HarmonyPrefix] [HarmonyPatch(typeof(Player), "OnSpawned")] private static void Player_OnSpawned() { Init(); } [HarmonyTranspiler] [HarmonyPatch(typeof(Inventory), "UpdateTotalWeight")] private static IEnumerable<CodeInstruction> Inventory_UpdateTotalWeight_Transpiler(IEnumerable<CodeInstruction> codes) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Expected O, but got Unknown //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Expected O, but got Unknown //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Expected O, but got Unknown //IL_014b: Unknown result type (might be due to invalid IL or missing references) CodeMatch[] array = (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(ItemData), "GetWeight", (Type[])null, (Type[])null), (string)null), new CodeMatch((OpCode?)OpCodes.Add, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Stfld, (object)AccessTools.Field(typeof(Inventory), "m_totalWeight"), (string)null) }; Action<Inventory> action = Reset; CodeInstruction[] array2 = (CodeInstruction[])(object)new CodeInstruction[2] { new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Call, (object)action.Method) }; Action<Inventory, ItemData> action2 = CheckMapItem; CodeInstruction[] array3 = (CodeInstruction[])(object)new CodeInstruction[3] { new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Ldloc_1, (object)null), new CodeInstruction(OpCodes.Call, (object)action2.Method) }; Action<Inventory> action3 = CheckIfHadMap; CodeInstruction[] array4 = (CodeInstruction[])(object)new CodeInstruction[2] { new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Call, (object)action3.Method) }; return new CodeMatcher(codes, (ILGenerator)null).Start().Insert(array2).MatchEndForward(array) .ThrowIfInvalid("Unable to match IL") .Advance(1) .Insert(array3) .End() .Insert(array4) .InstructionEnumeration(); } } [HarmonyPatch] internal static class MapClouds { private static Texture2D? _cloudsCache; private static readonly Texture2D NoClouds; private static bool _isVisible; private static readonly int CloudTexID; static MapClouds() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) _isVisible = true; CloudTexID = Shader.PropertyToID("_CloudTex"); NoClouds = new Texture2D(1, 1); NoClouds.SetPixel(0, 0, Color.clear); NoClouds.Apply(); } public static void ResetState() { if (Object.op_Implicit((Object)(object)Minimap.instance) && Object.op_Implicit((Object)(object)_cloudsCache)) { Minimap.instance.m_mapLargeShader.SetTexture(CloudTexID, (Texture)(object)_cloudsCache); } _isVisible = true; _cloudsCache = null; } internal static void Shutdown() { if (Object.op_Implicit((Object)(object)_cloudsCache) && Object.op_Implicit((Object)(object)Minimap.instance)) { Minimap.instance.m_mapLargeShader.SetTexture(CloudTexID, (Texture)(object)_cloudsCache); } } [HarmonyPostfix] [HarmonyPatch(typeof(Minimap), "Start")] private static void Minimap_Start() { ResetState(); } [HarmonyPrefix] [HarmonyPatch(typeof(Minimap), "UpdateMap")] private static void Minimap_UpdateMap(Minimap __instance) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) if ((int)__instance.m_mode != 2) { return; } Material mapLargeShader = __instance.m_mapLargeShader; if (!Object.op_Implicit((Object)(object)_cloudsCache)) { _cloudsCache = (Texture2D)mapLargeShader.GetTexture(CloudTexID); } if ((Configs.HideMapItemClouds.Value && MapLocation.IsMapItem()) || (Configs.HideMapTableClouds.Value && MapLocation.IsMapTable())) { if (_isVisible) { mapLargeShader.SetTexture(CloudTexID, (Texture)(object)NoClouds); _isVisible = false; } return; } bool flag = ZInput.GetKey(Configs.HideMapCloudsKey.Value, true) || ZInput.GetButton("JoyRStick"); if (flag == _isVisible) { _isVisible = !flag; mapLargeShader.SetTexture(CloudTexID, (Texture)(_isVisible ? ((object)_cloudsCache) : ((object)NoClouds))); } } } [HarmonyPatch] internal static class MapFog { private static Texture2D? _fogAll; private static Texture2D? _fogNone; private static bool[]? _exploreAll; private static bool IsInitialized { get { if (Object.op_Implicit((Object)(object)_fogAll) && Object.op_Implicit((Object)(object)_fogNone)) { return _exploreAll != null; } return false; } } [HarmonyPostfix] [HarmonyPatch(typeof(Minimap), "Start")] [HarmonyPriority(200)] private static void Minimap_Start(Minimap __instance) { Init(); } [HarmonyPrefix] [HarmonyPatch(typeof(Minimap), "ExploreAll")] private static void Minimap_ExploreAll(ref bool __runOriginal) { if (IsInitialized) { __runOriginal = false; FastExploreAll(); } } [HarmonyPrefix] [HarmonyPatch(typeof(Minimap), "Reset")] private static void Minimap_Reset(ref bool __runOriginal) { if (IsInitialized) { __runOriginal = false; FastReset(); Minimap.instance.m_sharedMapHint.gameObject.SetActive(false); } } private static void InitFog(this Texture2D texture, Color32 color) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) Color32[] array = (Color32[])(object)new Color32[((Texture)texture).width * ((Texture)texture).height]; for (int i = 0; i < array.Length; i++) { array[i] = color; } texture.SetPixels32(array); texture.Apply(); } internal static void Init() { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) Logging<Plugin>.Info((object)"Initialize the fog cache", 0); _fogAll = Create(Minimap.instance.m_fogTexture); _fogNone = Create(Minimap.instance.m_fogTexture); _fogAll.InitFog(Color32.op_Implicit(Color.white)); _fogNone.InitFog(Color32.op_Implicit(Color.clear)); _exploreAll = Enumerable.Repeat(element: true, Minimap.instance.m_explored.Length).ToArray(); static Texture2D Create(Texture2D tex) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown return new Texture2D(((Texture)tex).width, ((Texture)tex).height, tex.format, ((Texture)tex).mipmapCount, false, true); } } public static void FastExploreAll() { if (!IsInitialized) { throw new Exception("Not initialized"); } Logging<Plugin>.Info((object)"Set the fog texture to no fog", 0); Graphics.CopyTexture((Texture)(object)_fogNone, (Texture)(object)Minimap.instance.m_fogTexture); Logging<Plugin>.Info((object)"Set the explored area to all", 0); _exploreAll.CopyTo(Minimap.instance.m_explored, 0); } public static void FastReset() { if (!IsInitialized) { throw new Exception("Not initialized"); } Logging<Plugin>.Info((object)"Set the fog texture to all fog", 0); Graphics.CopyTexture((Texture)(object)_fogAll, (Texture)(object)Minimap.instance.m_fogTexture); Logging<Plugin>.Info((object)"Reset the explored area to none", 0); int length = Minimap.instance.m_explored.Length; Array.Clear(Minimap.instance.m_explored, 0, length); Array.Clear(Minimap.instance.m_exploredOthers, 0, length); } } [HarmonyPatch] internal static class MapItem { public const string PrefabName = "ZenMap"; private const int VariantCount = 10; private static Guid LastUsedMapID { get { if (!Player.m_localPlayer.m_customData.TryGetValue("ZenMap_LastUsedMapID", out var value)) { return Guid.Empty; } return Guid.Parse(value); } set { Player.m_localPlayer.m_customData["ZenMap_LastUsedMapID"] = value.ToString("N"); } } internal static Action? AddCraftingItem() { //IL_003d: 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) //IL_0058: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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_009a: Expected O, but got Unknown //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) Sprite[] array = (Sprite[])(object)new Sprite[10]; for (int i = 0; i < array.Length; i++) { array[i] = AssetIO.LoadSpriteFromResource((BaseUnityPlugin)(object)ZenMod<Plugin>.Instance, $"ItemIcons.map_item{i:00}.png"); } CustomItem val = new CustomItem("ZenMap", "ArmorRagsChest", new ItemConfig { Name = "$map_item", Description = "$map_item_description", CraftingStation = CraftingStations.None, MinStationLevel = 0, Requirements = Array.Empty<RequirementConfig>(), Icons = array, Amount = 1, Weight = 0.1f, StackSize = 1 }); CustomItemExt.ApplyTextureToPrefab(val, array[0].texture, 0.5f, Vector2.one * 2f, Vector2.zero, "map", true, (Color?)null); ItemManager.Instance.AddItem(val); return null; } public static void ShowLastUsed() { Logging<Plugin>.Info((object)$"Last used map: {LastUsedMapID}", 0); Inventory inventory = ((Humanoid)Player.m_localPlayer).GetInventory(); Guid guid2; ItemData val = ((IEnumerable<ItemData>)inventory.GetAllItems()).FirstOrDefault((Func<ItemData, bool>)((ItemData item) => item.TryGetMapID(out guid2) && guid2 == LastUsedMapID)) ?? inventory.GetItem("ZenMap", -1, true); if (val == null) { MapMissing(); return; } val.TryGetMapID(out var guid); Logging<Plugin>.Info((object)$"Showing map: {guid}", 0); LastUsedMapID = guid; MapLocation mapLocation = MapLocation.ReadFrom(val); if (mapLocation == null) { MapMissing(); } else { mapLocation.Show(); } static void MapMissing() { Logging<Plugin>.Info((object)"Map not found", 0); ((Character)Player.m_localPlayer).Message((MessageType)2, "$map_error_missing", 0, (Sprite)null); } } public static int GetNextVariant() { Dictionary<string, string> customData = Player.m_localPlayer.m_customData; string value; int num = (customData.TryGetValue("ZenMap_MapItemNextVariant", out value) ? int.Parse(value) : 0); customData["ZenMap_MapItemNextVariant"] = ((num + 1) % 10).ToString(); return num; } public static bool IsMapItem(this ItemData? item) { return ((item != null) ? ItemDataExt.GetPrefabName(item) : null) == "ZenMap"; } public static bool IsValidSeed(this ItemData item) { if (!item.m_customData.TryGetValue("ZenMap_seed", out var value)) { return false; } return int.Parse(value) == WorldGenerator.instance.GetSeed(); } private static bool TryGetMapID(this ItemData mapItem, out Guid guid) { guid = Guid.Empty; if (!mapItem.IsMapItem()) { return false; } if (mapItem.m_customData.TryGetValue("ZenMap_id", out var value)) { guid = Guid.Parse(value); } return guid != Guid.Empty; } internal static void CreateMapID(this ItemData mapItem) { if (!mapItem.IsMapItem()) { throw new ArgumentException("Item is not a MapItem"); } mapItem.m_customData["ZenMap_id"] = Guid.NewGuid().ToString("D"); } [HarmonyPrefix] [HarmonyPatch(typeof(Humanoid), "UseItem")] [HarmonyPriority(100)] private static void Humanoid_UseItem(Humanoid __instance, Inventory? inventory, ItemData? item, bool fromInventoryGui, ref bool __runOriginal) { if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer || item == null || !item.IsMapItem() || !fromInventoryGui) { return; } if (inventory == null) { inventory = __instance.m_inventory; } if (!inventory.ContainsItem(item)) { return; } __runOriginal = false; if (!item.IsValidSeed()) { ((Character)__instance).Message((MessageType)2, "$map_error_alien", 0, (Sprite)null); return; } if (inventory == __instance.GetInventory() && item.TryGetMapID(out var guid)) { LastUsedMapID = guid; } MapLocation.ReadFrom(item)?.Show(); } [HarmonyPrefix] [HarmonyPatch(typeof(InventoryGrid), "CreateItemTooltip")] private static void InventoryGrid_CreateItemTooltip(InventoryGrid __instance, ItemData item) { //IL_0000: 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_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 HintType activeType = KeyHint.ActiveType; if (activeType - 4 <= 1) { KeyHint.SetLabel("Split", item.IsMapItem() ? StringExt.Localize("$hud_rename") : StringExt.Localize("$inventory_splitstack")); } } [HarmonyPrefix] [HarmonyPatch(typeof(UITooltip), "HideTooltip")] private static void UITooltip_HideTooltip(UITooltip __instance) { //IL_0000: 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_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 HintType activeType = KeyHint.ActiveType; if (activeType - 4 <= 1) { KeyHint.SetLabel("Split", StringExt.Localize("$inventory_splitstack")); } } [HarmonyPostfix] [HarmonyPatch(typeof(ItemData), "GetTooltip", new Type[] { typeof(int) })] private static void ItemDrop_ItemData_GetTooltip(ItemData __instance, ref string __result) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) if (!__instance.IsMapItem()) { return; } __instance.m_customData.TryGetValue("ZenMap_label", out var value); string text = "$map_item_description"; if (!Utility.IsNullOrWhiteSpace(value)) { text += $"\n\n<color={UIColor.ValheimBeige}>{value}</color>"; } if (Configs.CalendarShow.Value) { string text2 = MapLocation.ReadFrom(__instance)?.GetCalendarString(); if (text2 != null) { if (Utility.IsNullOrWhiteSpace(value)) { text += "\n"; } text += $"\n<color={UIColor.ValheimBeige}>{text2}</color>"; } } if (!__instance.IsValidSeed()) { text += $"\n\n<color={UIColor.Red}>$map_error_alien</color>"; } __result = __result.Replace("$map_item_description", text); } [HarmonyPrefix] [HarmonyPatch(typeof(InventoryGui), "OnSelectedItem")] private static void InventoryGui_OnSelectedItem(InventoryGui __instance, ItemData item, Modifier mod, ref bool __runOriginal) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 ItemData item2 = item; if (item2.IsMapItem() && (int)mod == 1) { __runOriginal = false; MapLocation map = MapLocation.ReadFrom(item2, ignoreSeed: true); map?.PromptLabel(delegate { map.WriteTo(item2); }); } } } internal class MapLocation { private static MapLocation? _active; public readonly Vector3 Position; public readonly float Radius; public readonly float Percent; public readonly int WorldSeed; private double _timestamp; private string? _pinsBase64; private List<MapLocationPins.PinInfo>? _pins; public static bool InUse => _active != null; public static MapLocation Active => _active ?? throw new InvalidOperationException("No active map location"); public string Label { get; private set; } public MapLocation(string label, Vector3 position, float radius) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) Label = label; Position = position; if (!(radius > 0f)) { throw new ArgumentOutOfRangeException("radius", "must be positive"); } Radius = radius; Percent = Mathf.Clamp(Radius / (float)Configs.MapTableFullRadius.Value, 0f, 1f); WorldSeed = WorldGenerator.instance.GetSeed(); } private MapLocation(string label, Vector3 position, float radius, int worldSeed) : this(label, position, radius) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) WorldSeed = worldSeed; } public static bool IsMapTable() { if (InUse) { return !IsMapItem(); } return false; } public static bool IsMapItem() { List<MapLocationPins.PinInfo> pins; return IsMapItem(out pins); } public static bool IsMapItem(out List<MapLocationPins.PinInfo> pins) { pins = _active?._pins; return pins != null; } public void WriteTo(ItemData target) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) Logging<Plugin>.Info((object)"Write map location to item", 0); target.CreateMapID(); Dictionary<string, string> customData = target.m_customData; int worldSeed = WorldSeed; customData["ZenMap_seed"] = worldSeed.ToString(); target.m_customData["ZenMap_position"] = JsonUtility.ToJson((object)Position); Dictionary<string, string> customData2 = target.m_customData; float radius = Radius; customData2["ZenMap_radius"] = radius.ToString("F"); target.m_customData["ZenMap_label"] = Label; target.m_customData["ZenMap_pins"] = _pinsBase64 ?? MapLocationPins.SerializePins(Position, Radius); target.m_customData["ZenMap_timestamp"] = BitConverter.DoubleToInt64Bits((_timestamp != 0.0) ? _timestamp : ZNet.instance.GetTimeSeconds()).ToString(); target.m_customData["ZenMap_version"] = 1.ToString(); } public static MapLocation? ReadFrom(ItemData source, bool ignoreSeed = false) { //IL_0071: Unknown result type (might be due to invalid IL or missing references) if (!ignoreSeed && !source.IsValidSeed()) { Logging<Plugin>.Info((object)"Map item world seed does not match current world seed.", 0); return null; } Logging<Plugin>.Info((object)"Read map data from the item", 0); Dictionary<string, string> customData = source.m_customData; if (customData.TryGetValue("ZenMap_position", out var value) && customData.TryGetValue("ZenMap_radius", out var value2) && customData.TryGetValue("ZenMap_label", out var value3) && customData.TryGetValue("ZenMap_seed", out var value4)) { string value5; MapLocation obj = new MapLocation(value3, JsonUtility.FromJson<Vector3>(value), float.Parse(value2), int.Parse(value4)) { _pinsBase64 = (customData.TryGetValue("ZenMap_pins", out value5) ? value5 : null) }; obj._pins = MapLocationPins.DeserializePins(obj._pinsBase64); obj._timestamp = (customData.TryGetValue("ZenMap_timestamp", out var value6) ? BitConverter.Int64BitsToDouble(long.Parse(value6)) : 0.0); return obj; } Logging<Plugin>.Warning((object)"Map item data missing or invalid location data. Was this map item instanced manually by admin?", 0); return null; } public void Show() { //IL_001d: 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) _active = this; MapFog.FastReset(); if (IsMapItem()) { MapLocationPins.ResetPinMarkers(); } Minimap.instance.Explore(Position, Radius); Minimap.instance.m_largeZoom = Mathf.Max(Map.Zoom.Min, Map.Zoom.Max * (Percent + 0.2f)); bool noMap = Game.m_noMap; Game.m_noMap = false; Minimap.instance.ShowPointOnMap(Position); Game.m_noMap = noMap; PlaySoundFX(); } public static void Close() { if (InUse) { MapLocationPins.ResetPinMarkers(); PlaySoundFX(); _active = null; } } private static void PlaySoundFX() { ((Humanoid)Player.m_localPlayer).TriggerEquipEffect((ItemData)null); } public void PromptLabel(Action onSuccess) { Action onSuccess2 = onSuccess; TextPrompt.Show("$map_item_prompt", Label, (Action<string>)delegate(string input) { Label = StringExt.ToProperCase(StringExtensionMethods.RemoveRichTextTags(Regex.Replace(input, "\\$", string.Empty, RegexOptions.Multiline)).Trim(), false); Logging<Plugin>.Info((object)("Set text (sanitized): '" + Label + "'"), 0); onSuccess2(); }, 50); } public int GetCalendarYear(double defaultSeconds = -1.0) { double num = ((_timestamp > 0.0) ? _timestamp : defaultSeconds); if (num < 0.0) { return 0; } int num2 = EnvMan.instance.GetDay(num) + Configs.CalendarInitDays.Value; int value = Configs.CalendarDaysPerYear.Value; return num2 / value + 1; } public string? GetCalendarString(double defaultSeconds = -1.0) { int calendarYear = GetCalendarYear(defaultSeconds); if (calendarYear != 0) { return StringExt.Localize("$msg_calendar", new string[1] { calendarYear.ToString("N0", CultureInfo.CurrentCulture) }); } return null; } } internal static class MapParchment { public const string PrefabName = "ZenMapParchment"; internal static Action AddCraftingItem() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) Logging<Plugin>.Info((object)"Add crafting item: ZenMapParchment", 0); Sprite val = AssetIO.LoadSpriteFromResource((BaseUnityPlugin)(object)ZenMod<Plugin>.Instance, "ItemIcons.parchment.png"); ItemConfig val2 = new ItemConfig(); val2.Name = "$map_item_parchment"; val2.Description = "$map_item_parchment_description"; val2.CraftingStation = Configs.ParchmentCraftingStation.Value; val2.MinStationLevel = Configs.ParchmentCraftingStationLevel.Value; val2.Requirements = Configs.ParchmentResources.Value.ToRequirementConfigs(':'); val2.Icons = (Sprite[])(object)new Sprite[1] { val }; val2.Amount = 1; val2.Weight = 0.1f; val2.StackSize = 10; CustomItem item = new CustomItem("ZenMapParchment", "ArmorRagsChest", val2); CustomItemExt.ApplyTextureToPrefab(item, val.texture, 0.5f, Vector2.one, Vector2.zero, "", true, (Color?)null); ItemManager.Instance.AddItem(item); return ConfigSync; void ConfigSync() { Recipe recipe = item.Recipe.Recipe; recipe.m_craftingStation = PrefabManagerExt.GetCraftingStation(PrefabManager.Instance, Configs.ParchmentCraftingStation.Value); recipe.m_minStationLevel = Configs.ParchmentCraftingStationLevel.Value; recipe.m_resources = (Configs.EnableMapItems.Value ? Configs.ParchmentResources.Value.ToRequirements(':') : Array.Empty<Requirement>()); } } public static bool IsMapParchment(this ItemData? item) { return ((item != null) ? ItemDataExt.GetPrefabName(item) : null) == "ZenMapParchment"; } } [HarmonyPatch] internal static class MapLocationPins { public class PinInfo { public Guid Guid; public PinType Type; public bool Checked; public Color Color; } private static readonly List<PinData> ValidPins = new List<PinData>(); private const int SerializeVersion = 1; public static void Shutdown() { ResetPinMarkers(); } public static void ResetPinMarkers() { foreach (PinData validPin in ValidPins) { Minimap instance = Minimap.instance; if (instance != null) { instance.DestroyPinMarker(validPin); } MapTrack.RemoveFromCache(validPin); } ValidPins.Clear(); if (Object.op_Implicit((Object)(object)Minimap.instance)) { CollectionExtensions.Do<PinData>((IEnumerable<PinData>)Minimap.instance.m_pins, (Action<PinData>)Minimap.instance.DestroyPinMarker); Minimap.instance.m_pinUpdateRequired = true; } } public static string SerializePins(Vector3 origin, float range) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Expected I4, but got Unknown //IL_00cf: Unknown result type (might be due to invalid IL or missing references) List<PinData> list = (from pin in Minimap.instance.m_pins where VectorExtensions.DistanceTo(origin, pin.m_pos) < range where Configs.PinShowMapItem.IsAllowed(pin.GetPrefabHash()) select pin).ToList(); ZPackage val = new ZPackage(); val.Write(1); val.Write(list.Count); foreach (PinData item in list) { Guid guid = item.GetGuid(); if (guid == Guid.Empty) { throw new Exception("Guid can not be empty"); } val.Write(guid.ToByteArray()); val.Write((int)item.m_type); val.Write(item.m_checked); val.Write(Color.white.ToUInt()); } string @base = val.GetBase64(); Logging<Plugin>.Info((object)$"Serialized pins: {list.Count}, bytes: {val.Size()}, base64 size: {@base.Length}", 0); return @base; } public static List<PinInfo> DeserializePins(string? base64) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //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_00a3: Unknown result type (might be due to invalid IL or missing references) if (base64 == null) { return new List<PinInfo>(); } ZPackage val = new ZPackage(base64); int num = val.ReadInt(); if (num != 1) { Logging<Plugin>.Error((object)$"Map version mismatch. Expected {1}, got {num}", (ushort)0); return new List<PinInfo>(); } List<PinInfo> list = new List<PinInfo>(); int num2 = val.ReadInt(); for (int i = 0; i < num2; i++) { PinInfo pinInfo = new PinInfo { Guid = new Guid(val.ReadByteArray()), Type = (PinType)val.ReadInt(), Checked = val.ReadBool(), Color = val.ReadUInt().ToColor() }; Logging<Plugin>.Info((object)$"Deserialized pin: {pinInfo.Guid}, type: {pinInfo.Type}", 0); list.Add(pinInfo); } Logging<Plugin>.Info((object)$"Deserialized pins: {list.Count}", 0); return list; } private static List<PinData> MergeLocationPins() { if (!MapLocation.IsMapItem(out List<PinInfo> pins)) { return Minimap.instance.m_pins; } if (ValidPins.Count > 0) { return ValidPins; } foreach (PinData pin in Minimap.instance.m_pins) { if (!IsHiddenOnMapItem(pin) && !pin.IsTracked()) { ValidPins.Add(CopyPin(pin)); } } foreach (PinInfo item2 in pins) { if (MapTrack.TryGetZDO(item2.Guid, out ZDO zdo)) { PinData item = CreateTempPin(zdo, item2); ValidPins.Add(item); } } return ValidPins; } private static bool IsHiddenOnMapItem(PinData pin) { //IL_000b: 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_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected I4, but got Unknown bool flag = pin.m_shouldDelete; if (!flag) { PinType type = pin.m_type; bool flag2; switch (type - 5) { case 0: case 2: case 6: case 7: case 8: flag2 = true; break; default: flag2 = false; break; } flag = flag2; } return flag; } private static PinData CreateTempPin(ZDO zdo, PinInfo pinInfo) { //IL_0000: 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_001c: 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_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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_004b: Expected O, but got Unknown //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown PinData val = new PinData { m_name = MapTrack.CreateTrackingLabel(zdo.GetLabel(), pinInfo.Guid), m_pos = zdo.GetPosition(), m_type = pinInfo.Type, m_icon = Minimap.instance.GetSprite(pinInfo.Type) }; val.m_NamePinData = new PinNameData(val); Logging<Plugin>.Info((object)("Pin Created: " + val.m_name), 0); return val; } private static PinData CopyPin(PinData pin) { //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_0026: 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_0034: 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_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) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009e: 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) //IL_00a5: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00ab: Expected O, but got Unknown Logging<Plugin>.Info((object)$"Copy pin: {pin.m_name} {pin.m_pos}", 0); PinData val = new PinData { m_name = pin.m_name, m_pos = pin.m_pos, m_type = pin.m_type, m_icon = pin.m_icon, m_checked = pin.m_checked, m_ownerID = pin.m_ownerID, m_author = pin.m_author, m_doubleSize = pin.m_doubleSize, m_worldSize = pin.m_worldSize, m_animate = pin.m_animate }; val.m_NamePinData = new PinNameData(val); return val; } [HarmonyTranspiler] [HarmonyPatch(typeof(Minimap), "UpdatePins")] private static IEnumerable<CodeInstruction> Minimap_UpdatePins_MergePins(IEnumerable<CodeInstruction> codes) { FieldInfo pinsField = AccessTools.Field(typeof(Minimap), "m_pins"); Func<List<PinData>> intercept = MergeLocationPins; return Transpilers.Manipulator(codes, (Func<CodeInstruction, bool>)((CodeInstruction code) => CodeInstructionExtensions.Is(code, OpCodes.Ldfld, (MemberInfo)pinsField)), (Action<CodeInstruction>)delegate(CodeInstruction code) { code.opcode = OpCodes.Call; code.operand = intercept.Method; }); } [HarmonyTranspiler] [HarmonyPatch(typeof(Minimap), "UpdatePins")] private static IEnumerable<CodeInstruction> Minimap_UpdatePins_ColorPins(IEnumerable<CodeInstruction> codes, ILGenerator gen) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Expected O, but got Unknown //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown //IL_00f0: Unknown result type (might be due to invalid IL or missing references) CodeMatch[] array = (CodeMatch[])(object)new CodeMatch[4] { new CodeMatch((OpCode?)OpCodes.Ldloc_S, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(PinData), "m_iconElement"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldloc_S, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.PropertySetter(typeof(Graphic), "color"), (string)null) }; Func<PinData, Color, Color> func = AdjustPinColor; CodeInstruction[] array2 = (CodeInstruction[])(object)new CodeInstruction[4] { new CodeInstruction(OpCodes.Ldloc_S, (object)(byte)6), new CodeInstruction(OpCodes.Ldloc_S, (object)(byte)9), new CodeInstruction(OpCodes.Call, (object)func.Method), new CodeInstruction(OpCodes.Stloc_S, (object)(byte)9) }; return new CodeMatcher(codes, gen).MatchStartForward(array).ThrowIfInvalid("Unable to match IL").Insert(array2) .InstructionEnumeration(); } private static Color AdjustPinColor(PinData pin, Color defaultColor) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Invalid comparison between Unknown and I4 //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) if (!Configs.PinColorEnabled.Value) { return defaultColor; } PinType type = pin.m_type; if ((int)type != 4) { if ((int)type == 9) { return Configs.PinColorBoss.Value; } if (pin.GetPrefabHash() == MapTrack.Pin.Sign) { return Configs.PinColorPrivate.Value; } if (MapTrack.Pin.Mounts.Contains(pin.GetPrefabHash())) { return Configs.PinColorPrivate.Value; } if (pin.IsTracked()) { return Configs.PinColorShared.Value; } return Configs.PinColorSpecial.Value; } return Configs.PinColorDeath.Value; } [HarmonyPrefix] [HarmonyPatch(typeof(Player), "OnSpawned")] private static void Player_OnSpawned() { ResetPinMarkers(); } } [HarmonyPatch] internal static class MapPinSelect { private static VariantDialog _dialog = null; private static Action<PinType>? _onSelect; private static ItemData? _mapPinsIconData; private static readonly string[] PinDisplayOrder = new string[41] { "pickaxe", "axe", "sword", "bow", "anvil", "armor", "chest", "stackedbars", "potion", "cauldron", "tree", "berries", "berries2", "carrot", "turnip", "onion", "mushroom", "fish", "bee", "flower", "bread", "grain", "pig", "chicken", "wolf", "castle", "castle2", "tent", "bridge", "cave", "crystal", "magic_circle", "magic_eye", "magic_book", "swirl", "monster", "monster_trex", "dragon", "dragon2", "kraken", "question" }; private static readonly PinType[] PinnableTypes = ((IEnumerable<PinType>)(object)new PinType[1] { (PinType)3 }).Union(PinDisplayOrder.Select(MapPinIcon.GetPinTypeFromResourceName)).ToArray(); public static bool IsOpen { get { if (Object.op_Implicit((Object)(object)_dialog)) { return ((Component)_dialog).gameObject.activeSelf; } return false; } } public static void Init() { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: 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_00d1: Unknown result type (might be due to invalid IL or missing references) _dialog = Object.Instantiate<VariantDialog>(InventoryGui.instance.m_variantDialog, Hud.instance.m_rootObject.transform); ((Component)_dialog).gameObject.SetActive(false); ((Object)_dialog).name = "ZenMap_PinSelect"; _dialog.m_selected = OnSelected; ((Graphic)((Component)_dialog.m_elementPrefab.transform.Find("Button")).GetComponent<Image>()).material = Materials.IconCleanTransparency; _mapPinsIconData = CreateMapPinsIconData(); RectTransform val = (RectTransform)_dialog.m_listRoot.parent; Vector2 anchoredPosition = val.anchoredPosition; anchoredPosition.y = -590f; val.anchoredPosition = anchoredPosition; val.sizeDelta = new Vector2(448f, 515f); } private static ItemData CreateMapPinsIconData() { //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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown ItemData obj = ZNetScene.instance.GetPrefab("ZenMapPin").GetComponent<ItemDrop>().m_itemData.Clone(); obj.m_shared = new SharedData { m_icons = ((IEnumerable<PinType>)PinnableTypes).Select((Func<PinType, Sprite>)Minimap.instance.GetSprite).ToArray(), m_variants = PinnableTypes.Length }; return obj; } private static GameObject CreateButton(Transform parent, string text, Action? onClick = null, Vector2 size = default(Vector2)) { //IL_003a: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: 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_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) Action onClick2 = onClick; GameObject val = Object.Instantiate<GameObject>(((Component)Resources.FindObjectsOfTypeAll<Settings>()[0].m_backButton).gameObject, parent, false); ((Object)val).name = "ZenMap_RemovePinBtn"; GuiButton component = val.GetComponent<GuiButton>(); Navigation navigation = default(Navigation); ((Navigation)(ref navigation)).mode = (Mode)0; ((Selectable)component).navigation = navigation; ((UnityEventBase)((Button)component).onClick).RemoveAllListeners(); ((UnityEvent)((Button)component).onClick).AddListener(new UnityAction(ClickHandler)); ((Component)val.transform.Find("Label")).GetComponent<TMP_Text>().text = text; RectTransform val2 = (RectTransform)val.transform; val2.anchoredPosition = Vector2.one * 0.5f; val2.pivot = Vector2.one * 0.5f; if (size != default(Vector2)) { val2.sizeDelta = size; } Localization.instance.Localize(val.transform); return val; void ClickHandler() { onClick2?.Invoke(); } } public static void Choose(Action<PinType> onSelect) { if (!IsOpen) { _onSelect = onSelect; _dialog.Setup(_mapPinsIconData); } } public static void CheckForInput() { if (IsOpen) { if (ZInput.GetKeyDown((KeyCode)27, true)) { Close(); } if (ZInput.GetButtonDown("JoyButtonB")) { Close(); } } } private static void Close() { _dialog.OnClose(); } public static void Shutdown() { if (Object.op_Implicit((Object)(object)_dialog)) { Object.Destroy((Object)(object)((Component)_dialog).gameObject); } } private static void OnSelected(int index) { Logging<Plugin>.Info((object)$"Selected index: {index}", 0); _onSelect?.Invoke(PinnableTypes[index]); Close(); } [HarmonyPrefix] [HarmonyPatch(typeof(VariantDialog), "OnClose")] private static void VariantDialog_OnClose(VariantDialog __instance) { if (!((Object)(object)__instance != (Object)(object)_dialog)) { _onSelect = null; PlayerController.SetTakeInputDelay(0.5f); } } [HarmonyPrefix] [HarmonyPatch(typeof(InventoryGui), "IsVisible")] private static void InventoryGui_IsVisible(ref bool __result, ref bool __runOriginal) { __runOriginal = !IsOpen; __result = IsOpen; } [HarmonyPrefix] [HarmonyPatch(typeof(InventoryGui), "Show")] private static void InventoryGui_Show() { if (IsOpen) { Close(); } } } [HarmonyPatch] internal static class MapUI { private const float IconPadding = 15f; private const float IconScale = 0.65f; private static readonly (string Name, PinType PinType, PinOption options)[] PinGroups = new(string, PinType, PinOption)[8] { ("Sign", (PinType)3, PinOption.Sign), ("Town", (PinType)1, PinOption.MapTable), ("Bonfire", (PinType)0, PinOption.Bonfire), ("Vehicle", (PinType)260, PinOption.Cart | PinOption.WarMachine), ("Ship", (PinType)258, PinOption.LargeShip | PinOption.SmallBoat), ("Portal", (PinType)6, PinOption.Portal), ("TombStone", (PinType)4, PinOption.Tombstone), ("BossAlter", (PinType)9, PinOption.None) }; private static RectTransform _iconPanel = null; private static RectTransform _iconPanel2 = null; private static RectTransform _keyHints = null; private static RectTransform _sharedPanel = null; private static RectTransform _publicPanel = null; private static Image _playerMarker = null; private static void DisableOriginalIcons() { Disable(Minimap.instance.m_selectedIcon0); Disable(Minimap.instance.m_selectedIcon1); Disable(Minimap.instance.m_selectedIcon2); Disable(Minimap.instance.m_selectedIcon3); Disable(Minimap.instance.m_selectedIcon4); Disable(Minimap.instance.m_selectedIconBoss); Disable(Minimap.instance.m_selectedIconDeath); static void Disable(Image img) { ((Component)((Component)img).transform.parent).gameObject.SetActive(false); } } public static void Show(bool isVisible) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: 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_0078: 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_0093: 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_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) ((Component)_iconPanel).gameObject.SetActive(isVisible); ((Component)_iconPanel2).gameObject.SetActive(false); ((Component)_keyHints).gameObject.SetActive(isVisible); if (_sharedPanel.anchoredPosition.y > _publicPanel.anchoredPosition.y) { RectTransform sharedPanel = _sharedPanel; RectTransform publicPanel = _publicPanel; Vector2 anchoredPosition = _publicPanel.anchoredPosition; Vector2 anchoredPosition2 = _sharedPanel.anchoredPosition; sharedPanel.anchoredPosition = anchoredPosition; publicPanel.anchoredPosition = anchoredPosition2; sharedPanel = _sharedPanel; RectTransform publicPanel2 = _publicPanel; anchoredPosition2 = _publicPanel.pivot; anchoredPosition = _sharedPanel.pivot; sharedPanel.pivot = anchoredPosition2; publicPanel2.pivot = anchoredPosition; } ((Component)_sharedPanel).gameObject.SetActive(isVisible || !Map.IsNoMapKey); ((Component)_publicPanel).gameObject.SetActive(isVisible); ((Behaviour)_playerMarker).enabled = !Configs.HidePlayerArrow.Value || isVisible; } internal static void Init() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown Transform transform = Minimap.instance.m_largeRoot.transform; _iconPanel = (RectTransform)transform.Find("IconPanel"); _iconPanel2 = (RectTransform)transform.Find("IconPanel2"); _keyHints = (RectTransform)transform.Find("KeyHints"); _sharedPanel = (RectTransform)transform.Find("SharedPanel"); _publicPanel = (RectTransform)transform.Find("PublicPanel"); _playerMarker = ((Component)Minimap.instance.m_largeMarker).GetComponent<Image>(); } internal static void Shutdown() { } private static void InitNavIcons() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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_008c: 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_00af: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0192: 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_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) _iconPanel.anchoredPosition = new Vector2(-39f, -100f); _iconPanel.anchorMax = new Vector2(1f, 1f); _iconPanel.anchorMin = new Vector2(1f, 0f); _iconPanel.pivot = new Vector2(0.5f, 0.5f); _iconPanel.sizeDelta = new Vector2(100f, -110f); ((Transform)_iconPanel).localScale = Vector3.one * 0.65f; ((Transform)_iconPanel).Find("iconhints").localScale = Vector3.one / 0.65f; GameObject gameObject = ((Component)((Component)Minimap.instance.m_selectedIcon1).transform.parent).gameObject; Minimap.instance.m_selectedIcons.Clear(); foreach (var item3 in IEnumerableExt.WithIndex<(string, PinType, PinOption)>((IEnumerable<(string, PinType, PinOption)>)PinGroups)) { (string, PinType, PinOption) item = item3.Item1; int item2 = item3.Item2; GameObject val = Object.Instantiate<GameObject>(gameObject, (Transform)(object)_iconPanel); Image component = val.GetComponent<Image>(); component.sprite = Minimap.instance.GetSprite(item.Item2); if (MapPinType.IsTrackedPin(item.Item2)) { Color color = Color.white * 0.8f; ((Graphic)component).color = color; } Transform transform = val.transform; Vector3 localPosition = transform.localPosition; Vector3 val2 = Vector3.down * (float)item2; Rect rect = ((Graphic)component).rectTransform.rect; transform.localPosition = localPosition + val2 * (((Rect)(ref rect)).height + 15f); ((Object)val).name = item.Item1; val.SetActive(true); SetupEventHandlers(val, item2); Minimap.instance.m_selectedIcons.Add(item.Item2, ((Component)val.transform.Find("Selected")).GetComponent<Image>()); } } private static void SetupEventHandlers(GameObject obj, int index) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown Button component = obj.GetComponent<Button>(); ((Behaviour)component).enabled = true; component.onClick = new ButtonClickedEvent(); ((UnityEvent)component.onClick).AddListener((UnityAction)delegate { OnSelectPinGroup(index); }); MouseClick component2 = obj.GetComponent<MouseClick>(); ((Behaviour)component2).enabled = false; component2.m_leftClick = (UnityEvent)new ButtonClickedEvent(); component2.m_rightClick = (UnityEvent)new ButtonClickedEvent(); component2.m_middleClick = (UnityEvent)new ButtonClickedEvent(); } private static void OnSelectPinGroup(int index) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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) Logging<Plugin>.Info((object)$"Selected pin group index: {index}", 0); PinType item = PinGroups[index].PinType; Minimap.instance.ToggleIconFilter(item); } [HarmonyPostfix] [HarmonyPatch(typeof(Minimap), "Start")] private static void Minimap_Start() { Init(); } } [HarmonyPatch] internal static class NetPlayerPosition { [HarmonyPatch] private static class AlwaysShowPlayerPosition { [UsedImplicitly] private static IEnumerable<MethodInfo> TargetMethods() { return new <>z__ReadOnlyArray<MethodInfo>(new MethodInfo[3] { AccessTools.DeclaredMethod(typeof(ZNet), "UpdatePlayerList", (Type[])null, (Type[])null), AccessTools.DeclaredMethod(typeof(ZNet), "SendPlayerList", (Type[])null, (Type[])null), AccessTools.DeclaredMethod(typeof(ZNet), "RPC_PlayerList", (Type[])null, (Type[])null) }); } [UsedImplicitly] private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> codes) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) CodeMatch[] array = (CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.DeclaredField(typeof(PlayerInfo), "m_publicPosition"), (string)null), new CodeMatch((OpCode?)OpCodes.Brfalse, (object)null, (string)null) }; return new CodeMatcher(codes, (ILGenerator)null).MatchStartForward(array).ThrowIfInvalid("Unable to match IL").Repeat((Action<CodeMatcher>)Change, (Action<string>)null) .InstructionEnumeration(); static void Change(CodeMatcher cm) { cm.Advance(-1); cm.SetAndAdvance(OpCodes.Nop, (object)null); cm.SetAndAdvance(OpCodes.Nop, (object)null); cm.SetAndAdvance(OpCodes.Nop, (object)null); } } } [HarmonyPrefix] [HarmonyPatch(typeof(ZNet), "SendServerSyncPlayerData")] private static void ZNet_SendServerSyncPlayerData(ZNet __instance) { if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && !((Character)Player.m_localPlayer).InGodMode()) { __instance.SetPublicReferencePosition(!((Character)Player.m_localPlayer).IsPVPEnabled()); } } } [HarmonyPatch] internal static class PinBoss { public enum RevealMode { Never, NearOnly, Anywhere } private const float NearDistance = 20f; [HarmonyPrefix] [HarmonyPatch(typeof(Minimap), "DiscoverLocation")] private static void Minimap_DiscoverLocation(PinType type, Vector3 pos, ref bool __runOriginal) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) if ((int)type != 9 || !Object.op_Implicit((Object)(object)Player.m_localPlayer)) { return; } if (((Character)Player.m_localPlayer).InGodMode()) { Logging<Plugin>.Info((object)"God mode is enabled, use vanilla behavior", 0); return; } Logging<Plugin>.Info((object)$"Boss pin reveal mode: {Configs.PinBossReveal.Value}", 0); switch (Configs.PinBossReveal.Value) { case RevealMode.Never: __runOriginal = false; break; case RevealMode.NearOnly: if (MathExt.DistanceTo((MonoBehaviour)(object)Player.m_localPlayer, pos) > 20f) { __runOriginal = false; } break; default: throw new ArgumentOutOfRangeException(); case RevealMode.Anywhere: break; } Logging<Plugin>.Info((object)(__runOriginal ? $"Revealing pin {MathExt.XZY(pos)}" : "Suppressing pin"), 0); } } internal static class MapPin { public const string PrefabName = "ZenMapPin"; public static readonly Sprite Icon = AssetIO.LoadSpriteFromResource((BaseUnityPlugin)(object)ZenMod<Plugin>.Instance, "ItemIcons.pin_nail2.png"); internal static Action AddCraftingItem() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: 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) Logging<Plugin>.Info((object)"Add crafting item: ZenMapPin", 0); ItemConfig val = new ItemConfig(); val.Name = "$map_item_pin"; val.Description = "$map_item_pin_description"; val.CraftingStation = Configs.MapPinCraftingStation.Value; val.MinStationLevel = Configs.MapPinCraftingStationLevel.Value; val.Requirements = Configs.MapPinItemResources.Value.ToRequirementConfigs(':'); val.Icons = (Sprite[])(object)new Sprite[1] { Icon }; val.Amount = 1; val.Weight = 0.1f; val.StackSize = Configs.MapPinStackSize.Value; CustomItem mapPinItem = new CustomItem("ZenMapPin", "Club", val); CustomItemExt.ApplyTextureToPrefab(mapPinItem, Icon.texture, 0.35f, Vector2.one * 2f, Vector2.zero, "", true, (Color?)null); ItemManager.Instance.AddItem(mapPinItem); return ConfigSync; void ConfigSync() { Recipe recipe = mapPinItem.Recipe.Recipe; recipe.m_craftingStation = PrefabManagerExt.GetCraftingStation(PrefabManager.Instance, Configs.MapPinCraftingStation.Value); recipe.m_minStationLevel = Configs.MapPinCraftingStationLevel.Value; recipe.m_resources = Configs.MapPinItemResources.Value.ToRequirements(':'); recipe.m_item.m_itemData.m_shared.m_maxStackSize = Configs.MapPinStackSize.Value; } } public static bool IsMapPin(this ItemData? item) { return ((item != null) ? ItemDataExt.GetPrefabName(item) : null) == "ZenMapPin"; } } [HarmonyPatch] internal static class PinDeath { public static bool AllowAdd; [HarmonyPrefix] [HarmonyPatch(typeof(Minimap), "AddPin")] private static void Minimap_AddPin(PinType type, ref bool __runOriginal) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 __runOriginal = (int)type != 4 || AllowAdd; } [HarmonyPostfix] [HarmonyPatch(typeof(Minimap), "LoadMapData")] private static void Minimap_LoadMapData(Minimap __instance) { __instance.m_pins.RemoveAll((PinData pin) => (int)pin.m_type == 4); } } [HarmonyPatch] internal static class MapPinType { internal static class VisibleTypes { public static readonly bool[] Everything = Init(state: true); public static readonly bool[] CompassNoMap = Init(state: false); public static readonly bool[] CompassWithMap = Init(state: false); public static readonly bool[] MapTable = Init(state: false); public static readonly bool[] MapItem = Init(state: false); public static readonly bool[] Nothing = Init(state: false); private static bool[] Init(bool state) { return Enumerable.Repeat(state, 384).ToArray(); } } private const int ReservedTypes = 128; private const PinType ReservedStart = 256; private const PinType ReservedEnd = 384; internal const PinType UserPin = 288; public const PinType Raft = 256; public const PinType Karve = 257; public const PinType VikingShip = 258; public const PinType VikingShipAshlands = 259; public const PinType Cart = 260; public const PinType Catapult = 261; public const PinType BatteringRam = 262; public const PinType Mount = 263; public const PinType None = 8; public const PinType Campfire = 0; public const PinType House = 1; public const PinType Hammer = 2; public const PinType Dot = 3; public const PinType Portal = 6; public const PinType Death = 4; public const PinType Boss = 9; public const PinType Bed = 5; public const PinType Player = 10; public static bool IsSignPin(PinType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 if ((int)type >= 288 || (int)type == 3) { return true; } return false; } public static bool IsTrackedPin(PinType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 if ((int)type < 256 || (int)type >= 384) { return IsSignPin(type); } return true; } [HarmonyPostfix] [HarmonyPatch(typeof(Minimap), "Start")] private static void Minimap_Start(Minimap __instance) { Minimap.instance.m_visibleIconTypes = VisibleTypes.Nothing; } } [HarmonyPatch] internal static class MapPinIcon { internal static readonly Dictionary<int, PinType> NamedPinTypes; internal static readonly Dictionary<PinType, string> PinTypeToResource; private static readonly Dictionary<string, Sprite> SpriteCache; static MapPinIcon() { NamedPinTypes = new Dictionary<int, PinType> { [MapTrack.Pin.Raft] = (PinType)256, [MapTrack.Pin.Karve] = (PinType)257, [MapTrack.Pin.Longship] = (PinType)258, [MapTrack.Pin.Drakkar] = (PinType)259, [MapTrack.Pin.Cart] = (PinType)260, [MapTrack.Pin.Catapult] = (PinType)261, [MapTrack.Pin.BatteringRam] = (PinType)262, [MapTrack.Pin.Tombstone] = (PinType)4, [MapTrack.Pin.Bonfire] = (PinType)0, [MapTrack.Pin.MapTable] = (PinType)1, [MapTrack.Pin.PortalWood] = (PinType)6, [MapTrack.Pin.PortalStone] = (PinType)6 }; PinTypeToResource = new Dictionary<PinType, string> { [(PinType)3] = "flag", [(PinType)256] = "vehicle_ship_raft", [(PinType)257] = "vehicle_ship_karve", [(PinType)258] = "vehicle_ship_longboat", [(PinType)259] = "vehicle_ship_drakkar", [(PinType)260] = "vehicle_cart", [(PinType)261] = "vehicle_catapult", [(PinType)262] = "vehicle_batteringram", [(PinType)263] = "horse", [(PinType)288] = "anvil", [(PinType)289] = "cauldron", [(PinType)290] = "pickaxe", [(PinType)291] = "armor", [(PinType)292] = "axe", [(PinType)293] = "sword", [(PinType)294] = "potion", [(PinType)295] = "bow", [(PinType)296] = "stackedbars", [(PinType)297] = "chest", [(PinType)298] = "tree", [(PinType)299] = "berries", [(PinType)300] = "berries2", [(PinType)301] = "carrot", [(PinType)302] = "turnip", [(PinType)303] = "onion", [(PinType)304] = "mushroom", [(PinType)305] = "fish", [(PinType)306] = "bee", [(PinType)307] = "flower", [(PinType)308] = "bread", [(PinType)309] = "grain", [(PinType)310] = "pig", [(PinType)311] = "chicken", [(PinType)312] = "wolf", [(PinType)313] = "castle", [(PinType)314] = "castle2", [(PinType)315] = "tent", [(PinType)316] = "bridge", [(PinType)317] = "cave", [(PinType)318] = "crystal", [(PinType)319] = "magic_circle", [(PinType)320] = "magic_eye", [(PinType)321] = "magic_book", [(PinType)322] = "swirl", [(PinType)323] = "monster", [(PinType)324] = "monster_trex", [(PinType)325] = "dragon", [(PinType)326] = "dragon2", [(PinType)327] = "kraken", [(PinType)328] = "question" }; SpriteCache = new Dictionary<string, Sprite>(); Logging<Plugin>.Info((object)"Init sprite cache", 0); SpriteCache.Clear(); foreach (string item in PinTypeToResource.Values.Distinct()) { SpriteCache.Add(item, LoadSprite(item)); } } private static Sprite LoadSprite(string name) { //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) try { if (name.StartsWith("#")) { PinType val = (PinType)int.Parse(name.Substring(1)); return Minimap.instance.GetSprite(val); } if (name.StartsWith("$")) { string text = name.Substring(1); GameObject prefab = ZNetScene.instance.GetPrefab(text); if (Object.op_Implicit((Object)(object)prefab)) { return prefab.GetComponent<Piece>().m_icon; } prefab = ObjectDB.instance.GetItemPrefab(text); if (Object.op_Implicit((Object)(object)prefab)) { return ItemDataExt.GetIcon(prefab.GetComponent<ItemDrop>()); } throw new NullReferenceException("Prefab not found: " + name); } return AssetIO.LoadSpriteFromResource((BaseUnityPlugin)(object)ZenMod<Plugin>.Instance, "MapPins." + name + ".png"); } catch (Exception innerException) { throw new Exception("Failed to load sprite: " + name, innerException); } } private static PinType GetPrefabPinType(int prefabHash) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) if (!NamedPinTypes.TryGetValue(prefabHash, out var value)) { return (PinType)3; } return value; } internal static PinType GetPinTypeFromResourceName(string name) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) string name2 = name; return PinTypeToResource.First<KeyValuePair<PinType, string>>((KeyValuePair<PinType, string> kvp) => kvp.Value == name2).Key; } internal static PinType GetPinType(this ZDO zdo) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return GetPrefabPinType(zdo.GetPrefab()); } private static Sprite? GetCustomIcon(PinType pinType) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) if (!PinTypeToResource.TryGetValue(pinType, out string value)) { return null; } return SpriteCache[value]; } [HarmonyPrefix] [HarmonyPatch(typeof(Minimap), "GetSprite")] private static void Minimap_GetSprite(PinType type, ref Sprite? __result, ref bool __runOriginal) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) Sprite customIcon = GetCustomIcon(type); if (Object.op_Implicit((Object)(object)customIcon)) { __result = customIcon; __runOriginal = false; } } } [HarmonyPatch] internal static class MapTrack { public static class Pin { public static readonly int Sign = StringExtensionMethods.GetStableHashCode("sign"); public static readonly int Tombstone = StringExtensionMethods.GetStableHashCode("Player_tombstone"); public static readonly int MapTable = StringExtensionMethods.GetStableHashCode("piece_cartographytable"); public static readonly int Bonfire = StringExtensionMethods.GetStableHashCode("bonfire"); public static readonly int Raft = StringExtensionMethods.GetStableHashCode("Raft"); public static readonly int Karve = StringExtensionMethods.GetStableHashCode("Karve"); public static readonly int Longship = StringExtensionMethods.GetStableHashCode("VikingShip"); public static readonly int Drakkar = StringExtensionMethods.GetStableHashCode("VikingShip_Ashlands"); public static readonly int Cart = StringExtensionMethods.GetStableHashCode("Cart"); public static readonly int Catapult = StringExtensionMethods.GetStableHashCode("Catapult"); public static readonly int BatteringRam = StringExtensionMethods.GetStableHashCode("BatteringRam"); public static readonly int PortalWood = StringExtensionMethods.GetStableHashCode("portal_wood"); public static readonly int PortalStone = StringExtensionMethods.GetStableHashCode("portal_stone"); public static readonly HashSet<int> Mounts = new HashSet<int>(); } internal static readonly Dictionary<int, PinOption> PinToOption = new Dictionary<int, PinOption> { { Pin.Sign, PinOption.Sign }, { Pin.Raft, PinOption.SmallBoat }, { Pin.Karve, PinOption.SmallBoat }, { Pin.Longship, PinOption.LargeShip }, { Pin.Drakkar, PinOption.LargeShip }, { Pin.Cart, PinOption.Cart }, { Pin.Catapult, PinOption.WarMachine }, { Pin.BatteringRam, PinOption.WarMachine }, { Pin.Tombstone, PinOption.Tombstone }, { Pin.MapTable, PinOption.MapTable }, { Pin.Bonfire, PinOption.Bonfire }, { Pin.PortalWood, PinOption.Portal }, { Pin.PortalStone, PinOption.Portal } }; private const string GuidPrefix = "GUID|"; private static readonly int ZDOVarGUID = StringExtensionMethods.GetStableHashCode("GUID|"); private static readonly Dictionary<Guid, ZDOID> GuidIndexZDOID = new Dictionary<Guid, ZDOID>(); private static readonly Dictionary<Guid, PinData> GuidIndexPin = new Dictionary<Guid, PinData>(); private static readonly Dictionary<PinData, Guid> PinToGuidCache = new Dictionary<PinData, Guid>(); private static bool _isIndexReady; private const string DataDelimiter = "\0#"; private static readonly int DataSize; internal static void Init() { Configs.UpdatePinOptions(); ZRoutedRpc.instance.Register<ZDOID>("RPC_StopTracking", (Action<long, ZDOID>)RPC_StopTracking); _isIndexReady = false; Logging<Plugin>.Info((object)"Waiting before rebuilding index...", 0); Timing.Delay((MonoBehaviour)(object)ZenMod<Plugin>.Instance, 3f, (Action)delegate { RebuildIndex(); SetupAutoPins(); _isIndexReady = true; }); } internal static void Shutdown() { _isIndexReady = false; ZRoutedRpc instance = ZRoutedRpc.instance; if (instance != null) { ZRoutedRpcExt.Unregister(instance, "RPC_StopTracking"); } } public static PinOption GetPinOption(int prefabHash) { if (!PinToOption.TryGetValue(prefabHash, out var value)) { return PinOption.None; } return value; } private static void SetupAutoPins() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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_003b: Unknown result type (might be due to invalid IL or missing references) Logging<Plugin>.Debug((object)"Refreshing AutoPins", 0); ZDOID[] array = GuidIndexZDOID.Values.ToArray(); foreach (ZDOID val in array) { ZDO zDO = ZDOMan.instance.GetZDO(val); if (zDO == null) { Logging<Plugin>.Warning((object)$"ZDO is null for ZDOID: {val} - skipping.", 0); } else { AutoPinIfReq(zDO); } } } [HarmonyTranspiler] [HarmonyPatch(typeof(Minimap), "AddPin")] private static IEnumerable<CodeInstruction> Minimap_AddPin(IEnumerable<CodeInstruction> codes) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) CodeMatch[] array = (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldarg_2, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(Minimap), "ToggleIconFilter", (Type[])null, (Type[])null), (string)null) }; return new CodeMatcher(codes, (ILGenerator)null).MatchStartForward(array).ThrowIfInvalid("Unable to match IL").SetAndAdvance(OpCodes.Nop, (object)null) .SetAndAdvance(OpCodes.Nop, (object)null) .SetAndAdvance(OpCodes.Nop, (object)null) .InstructionEnumeration(); } [HarmonyPrefix] [HarmonyPatch(typeof(Minimap), "UpdatePins")] private static void Minimap_UpdatePins(Minimap __instance) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 bool flag = (int)__instance.m_mode != 2; Minimap instance = Minimap.instance; bool[] visibleIconTypes = (((Character)Player.m_localPlayer).InGodMode() ? MapPinType.VisibleTypes.Everything : (MapLocation.IsMapItem() ? MapPinType.VisibleTypes.MapItem : (MapLocation.IsMapTable() ? MapPinType.VisibleTypes.MapTable : ((!flag) ? MapPinType.VisibleTypes.Nothing : (InventoryCheck.HaveMap ? MapPinType.VisibleTypes.CompassWithMap : MapPinType.VisibleTypes.CompassNoMap))))); instance.m_visibleIconTypes = visibleIconTypes; } [HarmonyPrefix] [HarmonyPatch(typeof(Minimap), "UpdateDynamicPins")] private static void Minimap_UpdateDynamicPins(float dt) { if (_isIndexReady) { UpdatePins(dt); } } [HarmonyPostfix] [HarmonyPatch(typeof(Minimap), "AddPin")] private static void Minimap_AddPin(PinData? __result) { if (__result != null) { UpdateIndex(__result); } } [HarmonyPostfix] [HarmonyPatch(typeof(Minimap), "RemovePin", new Type[] { typeof(PinData) })] private static void Minimap_RemovePin(PinData? pin) { if (pin != null) { GuidIndexPin.Remove(pin.GetGuid()); RemoveFromCache(pin); } } [HarmonyPrefix] [HarmonyPatch(typeof(ZDOMan), "CreateSyncList")] private static void ZDOMan_CreateSyncList(ZDOMan __instance) { if (!ZNet.IsSinglePlayer && ZNet.instance.IsServer()) { CollectionExtensions.Do<ZDOID>((IEnumerable<ZDOID>)GuidIndexZDOID.Values, (Action<ZDOID>)__instance.ForceSendZDO); } } [HarmonyPrefix] [HarmonyPatch(typeof(ZDOMan), "HandleDestroyedZDO")] private static void ZDOMan_HandleDestroyedZDO(ZDOID uid) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (!Game.instance.IsShuttingDown()) { RemoveIndexAndPin(uid, out ZDO _); } } [HarmonyPostfix] [HarmonyPatch(typeof(ZDOMan), "FilterZDO")] private static void ZDOMan_FilterZDO(ZDO? zdo) { if (zdo != null) { UpdateIndex(zdo); } } [HarmonyPostfix] [HarmonyPatch(typeof(ZDOMan), "GetZDO")] private static void ZDOMan_GetZDO(ZDO? __result) { if (__result != null) { UpdateIndex(__result); } } [HarmonyTranspiler] [HarmonyPatch(typeof(ZDOMan), "RPC_ZDOData")] private static IEnumerable<CodeInstruction> ZDOMan_RPC_ZDOData(IEnumerable<CodeInstruction> codes) { MethodInfo methodInfo = AccessTools.DeclaredMethod(typeof(ZDO), "Deserialize", (Type[])null, (Type[])null); Action<ZDO, ZPackage> action = DeserializeIntercept; return Transpilers.MethodReplacer(codes, (MethodBase)methodInfo, (MethodBase)action.Method); static void DeserializeIntercept(ZDO zdo, ZPackage pkg) { zdo.Deserialize(pkg); UpdateIndex(zdo); AutoPinIfReq(zdo); } } [HarmonyPostfix] [HarmonyPatch(typeof(ZNetView), "Awake")] private static void ZNetView_Awake(ZNetView __instance) { if (__instance.IsValid()) { AutoPinIfReq(__instance.GetZDO()); } } public static int GetPrefabHash(this PinData pin) { if (!pin.TryGetZDO(out ZDO zdo)) { return 0; } return zdo.GetPrefab(); } private static bool IsAutoPinPrefab(ZDO zdo) { if (zdo.GetPrefab() != Pin.Sign && !Pin.Mounts.Contains(zdo.GetPrefab())) { return PinToOption.ContainsKey(zdo.GetPrefab()); } return false; } private static void AutoPinIfReq(ZDO zdo) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (IsAutoPinPrefab(zdo)) { if (ZNet.instance.IsDedicated()) { TrackZDO(zdo); } else if (zdo.FindPin() == null) { Logging<Plugin>.Info((object)$"Adding autopin for ZDO: {ZdoExt.GetPrefabName(zdo)} {zdo.m_uid}", 0); AddPin(zdo, save: false, (PinType)8); } } } private static void RebuildIndex() { Logging<Plugin>.Info((object)"Rebuilding Guid to ZDO index", 0); GuidIndexZDOID.Clear(); foreach (ZDO value in ZDOMan.instance.m_objectsByID.Values) { UpdateIndex(value); if (ZNet.instance.IsServer() && IsAutoPinPrefab(value)) { TrackZDO(value); } } Logging<Plugin>.Info((object)"Rebuilding Guid to PinData index", 0); GuidIndexPin.Clear(); PinToGuidCache.Clear(); foreach (PinData pin in Minimap.instance.m_pins) { UpdateIndex(pin); } } private static Guid UpdateIndex(PinData pin) { Guid guid = pin.GetGuid(); if (guid != Guid.Empty) { GuidIndexPin[guid] = pin; } return guid; } private static Guid UpdateIndex(ZDO zdo) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) Guid guid = zdo.GetGuid(); if (guid != Guid.Empty) { GuidIndexZDOID[guid] = zdo.m_uid; } return guid; } private static ZDOID LookupZDOID(Guid guid) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) if (guid == Guid.Empty) { return ZDOID.None; } if (!GuidIndexZDOID.TryGetValue(guid, out var value)) { return ZDOID.None; } return value; } private static Guid GetGuid(this ZDO? zdo) { byte[] array = ((zdo != null) ? zdo.GetByteArray(ZDOVarGUID, (byte[])null) : null); if (array == null || array.Length != 16) { return Guid.Empty; } return new Guid(array); } public static string CreateTrackingLabel(string label, Guid guid) { if (label.Contains("\0#")) { throw new ArgumentException("label already contains guid, double guid encoding is not safe"); } return label + "\0#" + guid.ToString("N"); } private static string RemoveTrackingFromLabel(string label) { int num = label.IndexOf("\0#", StringComparison.Ordinal); if (num >= 0) { return label.Substring(0, num); } return label; } public static bool IsTracked(this PinData pin) { return pin.GetGuid() != Guid.Empty; } public static Guid GetGuid(this PinData pin) { if (PinToGuidCache.TryGetValue(pin, out var value)) { return value; } if (Utility.IsNullOrWhiteSpace(pin.m_name) || pin.m_name.Length < DataSize + "\0#".Length) { return Guid.Empty; } int num = pin.m_name.IndexOf("\0#"[0]); if (num < 0 || num >= pin.m_name.Length - 1 || pin.m_name[num + 1] != "\0#"[1]) { return Guid.Empty; } value = Guid.ParseExact(pin.m_name.Substring(num + "\0#".Length, DataSize), "N"); Logging<Plugin>.Info((object)$"Caching Pin: {value}", 0); PinToGuidCache.Add(pin, value); return value; } public static string GetLabel(this PinData pin) { return RemoveTrackingFromLabel(pin.m_name); } public static PinData? FindPin(this ZDO zdo) { return FindPin(zdo.GetGuid()); } private static PinData? FindPin(Guid guid) { if (!GuidIndexPin.TryGetValue(guid, out PinData value)) { return null; } return value; } public static void RemovePin(PinData pin) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) Logging<Plugin>.Info((object)$"Remove Pin: {pin.m_name} {MathExt.XZY(pin.m_pos)}", 0); Minimap.instance.RemovePin(pin); } internal static void RemoveFromCache(PinData pin) { PinToGuidCache.Remove(pin); } private static void RPC_StopTracking(long sender, ZDOID zid) { //IL_0000: 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 (RemoveIndexAndPin(zid, out ZDO removedZDO) && removedZDO.IsOwner()) { Logging<Plugin>.Info((object)$"Zero out Guid for ZDO: {zid}", 0); removedZDO.Set(ZDOVarGUID, Array.Empty<byte>()); } } public static void StopTracking(ZDO zdo) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) if (!zdo.HasOwner()) { zdo.SetOwner(ZDOMan.GetSessionID()); } ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "RPC_StopTracking", new object[1] { zdo.m_uid }); } private static bool RemoveIndexAndPin(ZDOID zid, out ZDO removedZDO) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) removedZDO = ZDOMan.instance.GetZDO(zid); Guid guid = removedZDO.GetGuid(); if (guid != Guid.Empty) { Logging<Plugin>.Info((object)$"ZDOID: {zid} remove Guid: {guid}", 0); GuidIndexZDOID.Remove(guid); } if (Object.op_Implicit((Object)(object)Minimap.instance)) { PinData val = FindPin(guid); if (val != null) { RemovePin(val); } } return removedZDO != null; } private static Guid TrackZDO(ZDO zdo) { //IL_0042: Unknown result type (might be due to invalid IL or missing references) Guid guid = zdo.GetGuid(); if (guid != Guid.Empty) { return guid; } ZNetView val = ZNetScene.instance.FindInstance(zdo); if (Object.op_Implicit((Object)(object)val)) { val.ClaimOwnership(); } guid = Guid.NewGuid(); Logging<Plugin>.Info((object)$"Create new Guid: {guid} for zdo {zdo.m_uid}", 0); zdo.Set(ZDOVarGUID, guid.ToByteArray()); UpdateIndex(zdo); return guid; } public static bool TryGetZDO(Guid guid, out ZDO zdo) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) ZDOID val = LookupZDOID(guid); zdo = ZDOMan.instance.GetZDO(val); return zdo != null; } private static bool TryGetZDO(this PinData pin, out ZDO zdo) { return TryGetZDO(pin.GetGuid(), out zdo); } private static bool IsSharedPin(PinData pin) { if (pin.m_ownerID != Player.m_localPlayer.GetPlayerID()) { return pin.m_ownerID != 0; } return false; } private static void UpdatePins(float dt) { //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Invalid comparison between Unknown and I4 //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Invalid comparison between Unknown and I4 if (Game.instance.IsShuttingDown()) { return; } List<PinData> pins = Minimap.instance.m_pins; Player localPlayer = Player.m_localPlayer; ZNetView val = PlayerExt.GetControlled<Ship>(localPlayer)?.m_nview; int num; if (val == null) { ZNetView val2 = PlayerExt.GetControlled<Sadle>(localPlayer)?.m_nview; num = (((val2 != null) ? Object.op_Implicit((Object)(object)val2) : ((Character)localPlayer).IsAttachedToShip()) ? 1 : 0); } else { num = (Object.op_Implicit((Object)(object)val) ? 1 : 0); } ZNetView attached = ((num != 0) ? ((Component)localPlayer.m_attachPoint).GetComponentInParent<ZNetView>() : null); int num2 = pins.Count - 1; PinData pin; while (num2 >= 0) { pin = pins[num2]; ZDO zdo; if (IsSharedPin(pin)) { Logging<Plugin>.Debug((object)"Shared pin found, ignoring", 0); } else if (!pin.TryGetZDO(out zdo)) { if (pin.GetGuid() != Guid.Empty) { RemovePin(pin); } } else { Vector3 position = zdo.GetPosition(); pin.m_pos = Vector3.MoveTowards(pin.m_pos, position, 200f * dt); if (!MathExt.Approximately(pin.m_pos, position)) { Minimap.instance.m_pinUpdateRequired = true; } MapMode mode = Minimap.instance.m_mode; if ((int)mode > 1) { if ((int)mode != 2) { throw new ArgumentOutOfRangeException("m_mode"); } bool num3 = Object.op_Implicit((Object)(object)attached) && (!Configs.HideShipBanana.Value || ((Character)Player.m_localPlayer).InGodMode()); ShowShipBanana(num3); ShowAttachedPin(!num3); pin.SetLabel(zdo.GetLabel()); } else { ShowAttachedPin(isVisible: false); } } num2--; void ShowAttachedPin(bool isVisible) { int isVisible2; if (!isVisible) { ZDO obj = zdo; ZNetView obj2 = attached; isVisible2 = ((obj != ((obj2 != null) ? obj2.GetZDO() : null)) ? 1 : 0); } else { isVisible2 = 1; } ShowPin((byte)isVisible2 != 0); } } void ShowPin(bool isVisible) { RectTransform uiElement = pin.m_uiElement; if (uiElement != null) { ((Component)uiElement).gameObject.SetActive(isVisible); } } static void ShowShipBanana(bool isVisible) { ((Component)Minimap.instance.m_largeShipMarker).gameObject.SetActive(isVisible); } } public static bool AddPin(ZDO zdo, bool save, PinType type = 8) { //IL_0056: 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_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Invalid comparison between Unknown and I4 //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) if (ZNet.instance.IsDedicated()) { throw new Exception("AddPin() should not be called on dedicated servers"); } PinData val = zdo.FindPin(); if (val != null) { Logging<Plugin>.Debug((object)$"Pin already exists: {val.GetGuid()} {val.m_name} {val.m_pos}", 0); return false; } string label = zdo.GetLabel(); Vector3 position = zdo.GetPosition(); Guid guid = TrackZDO(zdo); string text = CreateTrackingLabel(label, guid); Logging<Plugin>.Info((object)("Tracking Label: " + text), 0); if ((int)type == 8) { type = zdo.GetPinType(); } PinDeath.AllowAdd = true; PinData val2 = Minimap.instance.AddPin(position, type, text, save, false, 0L, default(PlatformUserID)); PinDeath.AllowAdd = false; if (val2 == null) { return false; } Logging<Plugin>.Info((object)$"Add pin type: {val2.m_type} {guid} {ZdoExt.GetPrefabName(zdo)} ({MathExt.XZY(position)}) ", 0); return true; } private static void SetLabel(this PinData pin, string label) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown if (!Utility.IsNullOrWhiteSpace(label)) { pin.m_name = CreateTrackingLabel(label, pin.GetGuid()); if (pin.m_NamePinData == null) { pin.m_NamePinData = new PinNameData(pin); } if (Object.op_Implicit((Object)(object)pin.m_NamePinData.PinNameText)) { pin.m_NamePinData.PinNameText.text = pin.GetLabel(); } } } internal static string GetLabel(this ZDO zdo) { GameObject prefab = ZNetScene.instance.GetPrefab(zdo.GetPrefab()); Sign val = default(Sign); string text = default(string); if (prefab.TryGetComponent<Sign>(ref val) && zdo.GetString(ZDOVars.s_text, ref text)) { if (!(text != val.m_defaultText)) { return string.Empty; } return text; } Tameable val2 = default(Tameable); if (prefab.TryGetComponent<Tameable>(ref val2)) { string result = default(string); if (zdo.GetString(ZDOVars.s_tamedName, ref result)) { return result; } Character val3 = default(Character); if (((Component)val2).TryGetComponent<Character>(ref val3)) { return StringExt.Localize(val3.m_name); } return string.Empty; } MapTable val4 = default(MapTable); if (prefab.TryGetComponent<MapTable>(ref val4)) { string text2 = default(string); if (zdo.GetString(ZDOVars.s_text, ref text2)) { if (Utility.IsNullOrWhiteSpace(text2)) { return StringExt.Localize("$map_region_default"); } return text2; } return StringExt.Localize("$map_region_default"); } TombStone val5 = default(TombStone); if (prefab.TryGetComponent<TombStone>(ref val5)) { string @string = zdo.GetString(ZDOVars.s_ownerName, ""); string text3 = StringExt.Localize(zdo.GetString(ZDOVars.s_text, "")); if (Utility.IsNullOrWhiteSpace(text3)) { return @string; } return @string + "\n(" + text3 + ")"; } string text4 = string.Empty; Piece val6 = default(Piece); Hoverable val7 = default(Hoverable); if (prefab.TryGetComponent<Piece>(ref val6)) { text4 = val6.m_name; } else if (prefab.TryGetComponent<Hoverable>(ref val7)) { text4 = val7.GetHoverName(); } return StringExt.Localize(text4); } static MapTrack() { Guid empty = Guid.Empty; DataSize = empty.ToString("N").Length; } } [HarmonyPatch] internal static class PinToMount { private static bool IsTrackedMount(this Tameable tameable) { return Configs.TrackedMounts.Value.Contains(tameable.m_nview.GetPrefabName(), true); } private static voi