Decompiled source of Explorer v1.0.9
Explorer.dll
Decompiled a month 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.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using Explorer.Functions; using Explorer.Patches; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using ServerSync; using SkillManager; using TMPro; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Explorer")] [assembly: AssemblyDescription("https://thunderstore.io/c/valheim/p/blacks7ar/Explorer/")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("blacks7ar")] [assembly: AssemblyProduct("Explorer")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("BB754B16-F519-4DFA-9F56-5992A6316B23")] [assembly: AssemblyFileVersion("1.0.9")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.9.0")] [module: UnverifiableCode] [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 SkillManager { [PublicAPI] public class Skill { public static class LocalizationCache { private static readonly Dictionary<string, Localization> localizations = new Dictionary<string, Localization>(); internal static void LocalizationPostfix(Localization __instance, string language) { string key = localizations.FirstOrDefault((KeyValuePair<string, Localization> l) => l.Value == __instance).Key; if (key != null) { localizations.Remove(key); } if (!localizations.ContainsKey(language)) { localizations.Add(language, __instance); } } public static Localization ForLanguage(string? language = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown if (localizations.TryGetValue(language ?? PlayerPrefs.GetString("language", "English"), out var value)) { return value; } value = new Localization(); if (language != null) { value.SetupLanguage(language); } return value; } } [PublicAPI] public class LocalizeKey { private static readonly List<LocalizeKey> keys = new List<LocalizeKey>(); public readonly string Key; public readonly Dictionary<string, string> Localizations = new Dictionary<string, string>(); public LocalizeKey(string key) { Key = key.Replace("$", ""); } public void Alias(string alias) { Localizations.Clear(); if (!alias.Contains("$")) { alias = "$" + alias; } Localizations["alias"] = alias; Localization.instance.AddWord(Key, Localization.instance.Localize(alias)); } public LocalizeKey English(string key) { return addForLang("English", key); } public LocalizeKey Swedish(string key) { return addForLang("Swedish", key); } public LocalizeKey French(string key) { return addForLang("French", key); } public LocalizeKey Italian(string key) { return addForLang("Italian", key); } public LocalizeKey German(string key) { return addForLang("German", key); } public LocalizeKey Spanish(string key) { return addForLang("Spanish", key); } public LocalizeKey Russian(string key) { return addForLang("Russian", key); } public LocalizeKey Romanian(string key) { return addForLang("Romanian", key); } public LocalizeKey Bulgarian(string key) { return addForLang("Bulgarian", key); } public LocalizeKey Macedonian(string key) { return addForLang("Macedonian", key); } public LocalizeKey Finnish(string key) { return addForLang("Finnish", key); } public LocalizeKey Danish(string key) { return addForLang("Danish", key); } public LocalizeKey Norwegian(string key) { return addForLang("Norwegian", key); } public LocalizeKey Icelandic(string key) { return addForLang("Icelandic", key); } public LocalizeKey Turkish(string key) { return addForLang("Turkish", key); } public LocalizeKey Lithuanian(string key) { return addForLang("Lithuanian", key); } public LocalizeKey Czech(string key) { return addForLang("Czech", key); } public LocalizeKey Hungarian(string key) { return addForLang("Hungarian", key); } public LocalizeKey Slovak(string key) { return addForLang("Slovak", key); } public LocalizeKey Polish(string key) { return addForLang("Polish", key); } public LocalizeKey Dutch(string key) { return addForLang("Dutch", key); } public LocalizeKey Portuguese_European(string key) { return addForLang("Portuguese_European", key); } public LocalizeKey Portuguese_Brazilian(string key) { return addForLang("Portuguese_Brazilian", key); } public LocalizeKey Chinese(string key) { return addForLang("Chinese", key); } public LocalizeKey Japanese(string key) { return addForLang("Japanese", key); } public LocalizeKey Korean(string key) { return addForLang("Korean", key); } public LocalizeKey Hindi(string key) { return addForLang("Hindi", key); } public LocalizeKey Thai(string key) { return addForLang("Thai", key); } public LocalizeKey Abenaki(string key) { return addForLang("Abenaki", key); } public LocalizeKey Croatian(string key) { return addForLang("Croatian", key); } public LocalizeKey Georgian(string key) { return addForLang("Georgian", key); } public LocalizeKey Greek(string key) { return addForLang("Greek", key); } public LocalizeKey Serbian(string key) { return addForLang("Serbian", key); } public LocalizeKey Ukrainian(string key) { return addForLang("Ukrainian", key); } private LocalizeKey addForLang(string lang, string value) { Localizations[lang] = value; if (Localization.instance.GetSelectedLanguage() == lang) { Localization.instance.AddWord(Key, value); } else if (lang == "English" && !Localization.instance.m_translations.ContainsKey(Key)) { Localization.instance.AddWord(Key, value); } return this; } [HarmonyPriority(300)] internal static void AddLocalizedKeys(Localization __instance, string language) { foreach (LocalizeKey key in keys) { string value2; if (key.Localizations.TryGetValue(language, out var value) || key.Localizations.TryGetValue("English", out value)) { __instance.AddWord(key.Key, value); } else if (key.Localizations.TryGetValue("alias", out value2)) { Localization.instance.AddWord(key.Key, Localization.instance.Localize(value2)); } } } } private class ConfigurationManagerAttributes { [UsedImplicitly] public string? Category; } [HarmonyPatch(typeof(Skills), "IsSkillValid")] private static class Patch_Skills_IsSkillValid { private static void Postfix(SkillType type, ref bool __result) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) if (!__result && skills.ContainsKey(type)) { __result = true; } } } private static readonly Dictionary<SkillType, Skill> skills; internal static readonly Dictionary<string, Skill> skillByName; private readonly string skillName; private readonly string internalSkillName; private readonly SkillDef skillDef; public readonly LocalizeKey Name; public readonly LocalizeKey Description; private float skillEffectFactor = 1f; private int skillLoss = 5; public bool Configurable; private static bool InitializedTerminal; private static Localization? _english; private static BaseUnityPlugin? _plugin; private static bool hasConfigSync; private static object? _configSync; public float SkillGainFactor { get { return skillDef.m_increseStep; } set { skillDef.m_increseStep = value; this.SkillGainFactorChanged?.Invoke(value); } } public float SkillEffectFactor { get { return skillEffectFactor; } set { skillEffectFactor = value; this.SkillEffectFactorChanged?.Invoke(value); } } public int SkillLoss { get { return skillLoss; } set { skillLoss = value; this.SkillLossChanged?.Invoke(value); } } private static Localization english => _english ?? (_english = LocalizationCache.ForLanguage("English")); private static BaseUnityPlugin plugin { get { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown object obj = _plugin; if (obj == null) { BaseUnityPlugin val = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)Assembly.GetExecutingAssembly().DefinedTypes.First((TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); _plugin = val; obj = (object)val; } return (BaseUnityPlugin)obj; } } private static object? configSync { get { if (_configSync == null && hasConfigSync) { Type type = Assembly.GetExecutingAssembly().GetType("ServerSync.ConfigSync"); if ((object)type != null) { _configSync = Activator.CreateInstance(type, plugin.Info.Metadata.GUID + " SkillManager"); type.GetField("CurrentVersion").SetValue(_configSync, plugin.Info.Metadata.Version.ToString()); type.GetProperty("IsLocked").SetValue(_configSync, true); } else { hasConfigSync = false; } } return _configSync; } } public event Action<float>? SkillGainFactorChanged; public event Action<float>? SkillEffectFactorChanged; public event Action<float>? SkillLossChanged; public Skill(string englishName, string icon) : this(englishName, loadSprite(icon, 64, 64)) { } public Skill(string englishName, Sprite icon) { //IL_0019: 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_003a: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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) //IL_0077: 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_0082: Expected O, but got Unknown SkillType val = fromName(englishName); string text = new Regex("[^a-zA-Z]").Replace(englishName, "_"); skills[val] = this; skillByName[englishName] = this; skillDef = new SkillDef { m_description = "$skilldesc_" + text, m_icon = icon, m_increseStep = 1f, m_skill = val }; internalSkillName = text; skillName = englishName; Name = new LocalizeKey("skill_" + ((object)(SkillType)(ref val)).ToString()).English(englishName); Description = new LocalizeKey("skilldesc_" + text); } public static SkillType fromName(string englishName) { return (SkillType)Math.Abs(StringExtensionMethods.GetStableHashCode(englishName)); } static Skill() { //IL_0025: 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_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00a2: 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_00dd: Expected O, but got Unknown //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Expected O, but got Unknown //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Expected O, but got Unknown //IL_0156: 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_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Expected O, but got Unknown //IL_01ab: Expected O, but got Unknown //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Expected O, but got Unknown //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Expected O, but got Unknown //IL_023c: Expected O, but got Unknown skills = new Dictionary<SkillType, Skill>(); skillByName = new Dictionary<string, Skill>(); InitializedTerminal = false; hasConfigSync = true; Harmony val = new Harmony("org.bepinex.helpers.skillmanager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(FejdStartup), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Skill), "Patch_FejdStartup", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Skills), "GetSkillDef", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Skill), "Patch_Skills_GetSkillDef", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Skills), "CheatRaiseSkill", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Skill), "Patch_Skills_CheatRaiseskill", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Skills), "CheatResetSkill", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Skill), "Patch_Skills_CheatResetSkill", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizeKey), "AddLocalizedKeys", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Terminal), "InitTerminal", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Skill), "Patch_Terminal_InitTerminal_Prefix", (Type[])null, (Type[])null)), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Skill), "Patch_Terminal_InitTerminal", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "SetupLanguage", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizationCache), "LocalizationPostfix", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Skills), "OnDeath", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Skill), "Patch_Skills_OnDeath_Prefix", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Skill), "Patch_Skills_OnDeath_Finalizer", (Type[])null, (Type[])null)), (HarmonyMethod)null); } private static void Patch_FejdStartup() { //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Expected O, but got Unknown //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Expected O, but got Unknown //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Expected O, but got Unknown foreach (Skill skill in skills.Values) { if (skill.Configurable) { string key = skill.Name.Key; string group = new Regex("['[\"\\]]").Replace(english.Localize(key), "").Trim(); string category = Localization.instance.Localize(key).Trim(); ConfigEntry<float> skillGain = config(group, "Skill gain factor", skill.SkillGainFactor, new ConfigDescription("The rate at which you gain experience for the skill.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 5f), new object[1] { new ConfigurationManagerAttributes { Category = category } })); skill.SkillGainFactor = skillGain.Value; skillGain.SettingChanged += delegate { skill.SkillGainFactor = skillGain.Value; }; ConfigEntry<float> skillEffect = config(group, "Skill effect factor", skill.SkillEffectFactor, new ConfigDescription("The power of the skill, based on the default power.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 5f), new object[1] { new ConfigurationManagerAttributes { Category = category } })); skill.SkillEffectFactor = skillEffect.Value; skillEffect.SettingChanged += delegate { skill.SkillEffectFactor = skillEffect.Value; }; ConfigEntry<int> skillLoss = config(group, "Skill loss", skill.skillLoss, new ConfigDescription("How much experience to lose on death.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { new ConfigurationManagerAttributes { Category = category } })); skill.skillLoss = skillLoss.Value; skillLoss.SettingChanged += delegate { skill.skillLoss = skillLoss.Value; }; } } } private static void Patch_Skills_GetSkillDef(ref SkillDef? __result, List<SkillDef> ___m_skills, SkillType type) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) if (__result == null) { SkillDef val = GetSkillDef(type); if (val != null) { ___m_skills.Add(val); __result = val; } } } private static bool Patch_Skills_CheatRaiseskill(Skills __instance, string name, float value, Player ___m_player) { //IL_0017: 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_0022: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) foreach (SkillType key in skills.Keys) { SkillType current = key; Skill skill = skills[current]; if (string.Equals(skill.internalSkillName, name, StringComparison.CurrentCultureIgnoreCase)) { Skill skill2 = __instance.GetSkill(current); skill2.m_level += value; skill2.m_level = Mathf.Clamp(skill2.m_level, 0f, 100f); ((Character)___m_player).Message((MessageType)1, "Skill increased " + Localization.instance.Localize("$skill_" + ((object)(SkillType)(ref current)).ToString()) + ": " + (int)skill2.m_level, 0, skill2.m_info.m_icon); Console.instance.Print("Skill " + skill.internalSkillName + " = " + skill2.m_level); return false; } } return true; } private static bool Patch_Skills_CheatResetSkill(Skills __instance, string name) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) foreach (SkillType key in skills.Keys) { Skill skill = skills[key]; if (string.Equals(skill.internalSkillName, name, StringComparison.CurrentCultureIgnoreCase)) { __instance.ResetSkill(key); Console.instance.Print("Skill " + skill.internalSkillName + " reset"); return false; } } return true; } private static void Patch_Skills_OnDeath_Prefix(Skills __instance, ref Dictionary<SkillType, Skill>? __state) { //IL_002b: 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_0091: Unknown result type (might be due to invalid IL or missing references) if (__state == null) { __state = new Dictionary<SkillType, Skill>(); } foreach (KeyValuePair<SkillType, Skill> skill in skills) { if (__instance.m_skillData.TryGetValue(skill.Key, out var value)) { __state[skill.Key] = value; if (skill.Value.skillLoss > 0) { Skill obj = value; obj.m_level -= value.m_level * (float)skill.Value.SkillLoss / 100f; value.m_accumulator = 0f; } __instance.m_skillData.Remove(skill.Key); } } } private static void Patch_Skills_OnDeath_Finalizer(Skills __instance, ref Dictionary<SkillType, Skill>? __state) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (__state == null) { return; } foreach (KeyValuePair<SkillType, Skill> item in __state) { __instance.m_skillData[item.Key] = item.Value; } __state = null; } private static void Patch_Terminal_InitTerminal_Prefix() { InitializedTerminal = Terminal.m_terminalInitialized; } private static void Patch_Terminal_InitTerminal() { if (!InitializedTerminal) { AddSkill(Terminal.commands["raiseskill"]); AddSkill(Terminal.commands["resetskill"]); } static void AddSkill(ConsoleCommand command) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown ConsoleOptionsFetcher fetcher = command.m_tabOptionsFetcher; command.m_tabOptionsFetcher = (ConsoleOptionsFetcher)delegate { List<string> list = fetcher.Invoke(); list.AddRange(skills.Values.Select((Skill skill) => skill.internalSkillName)); return list; }; } } private static SkillDef? GetSkillDef(SkillType skillType) { //IL_0005: 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) if (!skills.ContainsKey(skillType)) { return null; } return skills[skillType].skillDef; } private static byte[] ReadEmbeddedFileBytes(string name) { using MemoryStream memoryStream = new MemoryStream(); Assembly.GetExecutingAssembly().GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name + "." + name).CopyTo(memoryStream); return memoryStream.ToArray(); } private static Texture2D loadTexture(string name) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown //IL_001f: Expected O, but got Unknown Texture2D val = new Texture2D(0, 0); ImageConversion.LoadImage(val, ReadEmbeddedFileBytes("icons." + name)); return val; } public static Sprite loadSprite(string name, int width, int height) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) return Sprite.Create(loadTexture(name), new Rect(0f, 0f, (float)width, (float)height), Vector2.zero); } private static ConfigEntry<T> config<T>(string group, string name, T value, ConfigDescription description) { ConfigEntry<T> val = plugin.Config.Bind<T>(group, name, value, description); configSync?.GetType().GetMethod("AddConfigEntry").MakeGenericMethod(typeof(T)) .Invoke(configSync, new object[1] { val }); return val; } private static ConfigEntry<T> config<T>(string group, string name, T value, string description) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>())); } } [PublicAPI] public static class SkillExtensions { public static float GetSkillFactor(this Character character, string name) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return character.GetSkillFactor(Skill.fromName(name)) * Skill.skillByName[name].SkillEffectFactor; } public static float GetSkillFactor(this Skills skills, string name) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return skills.GetSkillFactor(Skill.fromName(name)) * Skill.skillByName[name].SkillEffectFactor; } public static void RaiseSkill(this Character character, string name, float value = 1f) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) character.RaiseSkill(Skill.fromName(name), value); } public static void RaiseSkill(this Skills skill, string name, float value = 1f) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) skill.RaiseSkill(Skill.fromName(name), value); } public static void LowerSkill(this Character character, string name, float factor = 1f) { character.GetSkills().LowerSkill(name, factor); } public static void LowerSkill(this Skills skills, string name, float factor) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (factor > 0f && skills.m_skillData.TryGetValue(Skill.fromName(name), out var value)) { Skill obj = value; obj.m_level -= value.m_level * factor; value.m_accumulator = 0f; } } } } namespace Explorer { [BepInPlugin("blacks7ar.Explorer", "Explorer", "1.0.9")] public class Plugin : BaseUnityPlugin { private const string modGUID = "blacks7ar.Explorer"; public const string modName = "Explorer"; public const string modAuthor = "blacks7ar"; public const string modVersion = "1.0.9"; public const string modLink = "https://thunderstore.io/c/valheim/p/blacks7ar/Explorer/"; private static readonly Harmony _harmony = new Harmony("blacks7ar.Explorer"); private static readonly ConfigSync _configSync = new ConfigSync("blacks7ar.Explorer") { DisplayName = "Explorer", CurrentVersion = "1.0.9", MinimumRequiredVersion = "1.0.9" }; private static ConfigEntry<Toggle> _serverConfigLocked; private static ConfigEntry<float> _expGainFactor; private static ConfigEntry<int> _expLoss; public static ConfigEntry<Toggle> _displayExpGain; public static ConfigEntry<float> _detectionRadius; public static ConfigEntry<int> _increasePerLevel; public static ConfigEntry<float> _loreStoneExp; public static ConfigEntry<float> _locationExp; public static ConfigEntry<float> _newBiomeExp; public static ConfigEntry<int> _dungeonsLevel; public static ConfigEntry<string> _meadowsResourcesT1; public static ConfigEntry<int> _meadowsResourcesT1Level; public static ConfigEntry<string> _blackForestResourcesT2; public static ConfigEntry<int> _blackForestResourcesT2Level; public static ConfigEntry<string> _swampResourcesT3; public static ConfigEntry<int> _swampResourcesT3Level; public static ConfigEntry<string> _mountainResourcesT4; public static ConfigEntry<int> _mountainResourcesT4Level; public static ConfigEntry<string> _plainsResourcesT5; public static ConfigEntry<int> _plainsResourcesT5Level; public static ConfigEntry<string> _mistlandsResourcesT6; public static ConfigEntry<int> _mistlandsResourcesT6Level; public static ConfigEntry<string> _ashlandsResourcesT7; public static ConfigEntry<int> _ashlandsResourcesT7Level; public static ConfigEntry<Toggle> _iconsOnly; public static ConfigEntry<int> _maxPin; public static ConfigEntry<KeyboardShortcut> _hidePinKey; public static bool _hidePins; private static Skill _explorer; private ConfigEntry<T> config<T>(string group, string name, T value, ConfigDescription description, bool synchronizedConfig = true) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown ConfigDescription val = new ConfigDescription(description.Description + (synchronizedConfig ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags); ConfigEntry<T> val2 = ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, val); _configSync.AddConfigEntry<T>(val2).SynchronizedConfig = synchronizedConfig; return val2; } private ConfigEntry<T> config2<T>(string group, string name, T value, string desc, bool synchronizedConfig = true) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown Explorer.Functions.ConfigurationManagerAttributes configurationManagerAttributes = new Explorer.Functions.ConfigurationManagerAttributes { CustomDrawer = TextBox }; return config(group, name, value, new ConfigDescription(desc, (AcceptableValueBase)null, new object[1] { configurationManagerAttributes }), synchronizedConfig); } public void Awake() { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Expected O, but got Unknown //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Expected O, but got Unknown //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Expected O, but got Unknown //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Expected O, but got Unknown //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Expected O, but got Unknown //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Expected O, but got Unknown //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Expected O, but got Unknown //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Expected O, but got Unknown //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Expected O, but got Unknown //IL_02ff: Unknown result type (might be due to invalid IL or missing references) //IL_030a: Expected O, but got Unknown //IL_03a0: Unknown result type (might be due to invalid IL or missing references) //IL_03ab: Expected O, but got Unknown //IL_0404: Unknown result type (might be due to invalid IL or missing references) //IL_040f: Expected O, but got Unknown //IL_0468: Unknown result type (might be due to invalid IL or missing references) //IL_0473: Expected O, but got Unknown //IL_04cc: Unknown result type (might be due to invalid IL or missing references) //IL_04d7: Expected O, but got Unknown //IL_0530: Unknown result type (might be due to invalid IL or missing references) //IL_053b: Expected O, but got Unknown //IL_0594: Unknown result type (might be due to invalid IL or missing references) //IL_059f: Expected O, but got Unknown //IL_05f8: Unknown result type (might be due to invalid IL or missing references) //IL_0603: Expected O, but got Unknown //IL_063c: Unknown result type (might be due to invalid IL or missing references) //IL_0647: Expected O, but got Unknown ((BaseUnityPlugin)this).Config.SaveOnConfigSet = false; _explorer = new Skill("Explorer", "explorer.png"); _explorer.Description.English("Pins resources on the map while you explore and increases exploration radius."); _explorer.Configurable = false; _serverConfigLocked = config("1- ServerSync", "Lock Configuration", Toggle.On, new ConfigDescription("If On, the configuration is locked and can be changed by server admins only.", (AcceptableValueBase)null, Array.Empty<object>())); _configSync.AddLockingConfigEntry<Toggle>(_serverConfigLocked); _detectionRadius = config("2- Exploration", "Detection Radius", 30f, new ConfigDescription("Detection radius for tracking down resources.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 50f), Array.Empty<object>())); _increasePerLevel = config("2- Exploration", "Radius Increase Per Level", 2, new ConfigDescription("Exploration radius increase per level.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); _loreStoneExp = config("2- Exploration", "Lore Stone Exp Gain", 3f, new ConfigDescription("Base exp factor gain when you interact to a runestone that gives lores about valheim.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 10f), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); _locationExp = config("2- Exploration", "Discovered Location Exp Gain", 2f, new ConfigDescription("Base exp factor gain when you discovered a new location.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 10f), Array.Empty<object>())); _newBiomeExp = config("2- Exploration", "New Biome Exp Gain", 10f, new ConfigDescription("Base exp factor gain when you discover a new biome.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 25f), Array.Empty<object>())); _iconsOnly = config("2- Exploration", "Icons Only", Toggle.Off, new ConfigDescription("If On, only icons will be visible on the world map.", (AcceptableValueBase)null, Array.Empty<object>())); _maxPin = config("2- Exploration", "Max Pin", 10, new ConfigDescription("Max number of pins to be displayed on the map.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 50), Array.Empty<object>())); _hidePinKey = config<KeyboardShortcut>("2- Exploration", "Hide Pin Hotkey", new KeyboardShortcut((KeyCode)101, (KeyCode[])(object)new KeyCode[1] { (KeyCode)308 }), new ConfigDescription("Quick hotkey to hide pins on the map", (AcceptableValueBase)null, Array.Empty<object>()), synchronizedConfig: false); _displayExpGain = config("3- Skills Exp", "Display Exp Gain", Toggle.On, new ConfigDescription("Enable/Disables exp gain notification.", (AcceptableValueBase)null, Array.Empty<object>())); _expGainFactor = config("3- Skills Exp", "Exp Gain Factor", 1f, new ConfigDescription("Exp gain factor for explorer skill.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 5f), Array.Empty<object>())); _expGainFactor.SettingChanged += delegate { _explorer.SkillGainFactor = _expGainFactor.Value; }; _explorer.SkillGainFactor = _expGainFactor.Value; _expLoss = config("3- Skills Exp", "Exp Loss Amount", 0, new ConfigDescription("Skills exp loss on death.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>())); _expLoss.SettingChanged += delegate { _explorer.SkillLoss = _expLoss.Value; }; _explorer.SkillLoss = _expLoss.Value; _meadowsResourcesT1 = config2("4- Resources", "Tier1 Meadows", "Flint,Mushroom,Raspberry,Honey", "Prefab names of resources that you can gather in meadows biome.\nNOTE: You need to logout if you added additional resources while in-game."); _meadowsResourcesT1Level = config("4- Resources", "Tier1 Meadows Level", 10, new ConfigDescription("Required skill level needed to track down resources in meadows and pin them on the map.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); _blackForestResourcesT2 = config2("4- Resources", "Tier2 BlackForest", "Blueberries,CarrotSeeds,Thistle,CopperOre,TinOre", "Prefab names of resources that you can gather in black forest biome.\nNOTE: You need to logout if you added additional resources while in-game."); _blackForestResourcesT2Level = config("4- Resources", "Tier2 BlackForest Level", 22, new ConfigDescription("Required skill level needed to track down resources in black forest and pin them on the map.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); _swampResourcesT3 = config2("4- Resources", "Tier3 Swamp", "TurnipSeeds,Guck,Chitin", "Prefab names of resources that you can gather in swamp biome.\nNOTE: You need to logout if you added additional resources while in-game."); _swampResourcesT3Level = config("4- Resources", "Tier3 Swamp Level", 34, new ConfigDescription("Required skill level needed to track down resources in swamp and pin them on the map.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); _mountainResourcesT4 = config2("4- Resources", "Tier4 Mountain", "DragonEgg,OnionSeeds,SilverOre", "Prefab names of resources that you can gather in mountain biome.\nNOTE: You need to logout if you added additional resources while in-game."); _mountainResourcesT4Level = config("4- Resources", "Tier4 Mountain Level", 46, new ConfigDescription("Required skill level needed to track down resources in mountain and pin them on the map.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); _plainsResourcesT5 = config2("4- Resources", "Tier5 Plains", "Barley,Cloudberry,Flax,Tar", "Prefab names of resources that you can gather in plains biome.\nNOTE: You need to logout if you added additional resources while in-game."); _plainsResourcesT5Level = config("4- Resources", "Tier5 Plains Level", 58, new ConfigDescription("Required skill level needed to track down resources in plains and pin them on the map.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); _mistlandsResourcesT6 = config2("4- Resources", "Tier6 Mistlands", "MushroomJotunPuffs,MushroomMagecap,Softtissue,BlackMarble,IronScrap,CopperScrap", "Prefab names of resources that you can gather in mistlands biome.\nNOTE: You need to logout if you added additional resources while in-game."); _mistlandsResourcesT6Level = config("4- Resources", "Tier6 Mistlands Level", 70, new ConfigDescription("Required skill level needed to track down resources in plains and pin them on the map.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); _ashlandsResourcesT7 = config2("4- Resources", "Tier7 Ashlands", "Fiddleheadfern,MushroomSmokePuff,FlametalOreNew,ProustitePowder,SulfurStone", "Prefab names of resources that you can pick in ashlands biome.\nNOTE: You need to logout if you added additional resources while in-game."); _ashlandsResourcesT7Level = config("4- Resources", "Tier7 Ashlands Level", 82, new ConfigDescription("Required skill level needed to track down resources in ashlands and pin them on the map.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); _dungeonsLevel = config("5- Dungeons", "Dungeons Level", 28, new ConfigDescription("Required skill level needed to track down dungeons and caves and pins them on the map.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), new object[1] { new Explorer.Functions.ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); Helper.GetDungeonSprites(); ((BaseUnityPlugin)this).Config.SaveOnConfigSet = true; ((BaseUnityPlugin)this).Config.Save(); Assembly executingAssembly = Assembly.GetExecutingAssembly(); _harmony.PatchAll(executingAssembly); } public void Update() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //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) Player localPlayer = Player.m_localPlayer; if (!Object.op_Implicit((Object)(object)localPlayer)) { return; } KeyboardShortcut value = _hidePinKey.Value; if (((KeyboardShortcut)(ref value)).IsDown() && ((Character)localPlayer).TakeInput() && !_hidePins) { _hidePins = true; ((Character)localPlayer).Message((MessageType)2, "Explorer pins are turned Off.", 0, (Sprite)null); return; } value = _hidePinKey.Value; if (((KeyboardShortcut)(ref value)).IsDown() && ((Character)localPlayer).TakeInput() && _hidePins) { ((Character)localPlayer).Message((MessageType)2, "Explorer pins are turned On.", 0, (Sprite)null); _hidePins = false; } } private void OnDestroy() { ((BaseUnityPlugin)this).Config.Save(); } private static void TextBox(ConfigEntryBase entryBase) { entryBase.BoxedValue = GUILayout.TextArea((string)entryBase.BoxedValue, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true) }); } } } namespace Explorer.Patches { [HarmonyPatch] public class DestructiblePatch { [HarmonyPostfix] [HarmonyPatch(typeof(Destructible), "Awake")] private static void Awake_Postfix(Destructible __instance) { if (!((Object)(object)__instance == (Object)null)) { DropOnDestroyed component = ((Component)__instance).GetComponent<DropOnDestroyed>(); if ((!((Object)(object)component != (Object)null) || component.m_dropWhenDestroyed != null) && (!((Object)(object)__instance.m_spawnWhenDestroyed != (Object)null) || Object.op_Implicit((Object)(object)__instance.m_spawnWhenDestroyed.GetComponent<MineRock5>()))) { AddTier2Tracker(__instance); AddTier3Tracker(__instance); AddTier4Tracker(__instance); AddTier5Tracker(__instance); AddTier6Tracker(__instance); AddTier7Tracker(__instance); } } } private static void AddTier2Tracker(Destructible destructible) { //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)destructible.m_spawnWhenDestroyed == (Object)null) { DropOnDestroyed component = ((Component)destructible).GetComponent<DropOnDestroyed>(); if ((Object)(object)component == (Object)null || component.m_dropWhenDestroyed == null) { return; } string text = ""; string resourceName = ""; foreach (DropData item in component.m_dropWhenDestroyed.m_drops.Where((DropData drop) => (Object)(object)drop.m_item != (Object)null && Object.op_Implicit((Object)(object)drop.m_item.GetComponent<ItemDrop>()))) { text = ((Object)item.m_item).name; resourceName = Localization.instance.Localize(item.m_item.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); } Helper.GetTier2PinIcons(text); if (Helper._ResourceIconsT2.TryGetValue(text, out var value)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._blackForestResourcesT2Level.Value); } return; } MineRock5 component2 = destructible.m_spawnWhenDestroyed.GetComponent<MineRock5>(); if ((Object)(object)component2 == (Object)null) { return; } string text2 = ""; string resourceName2 = ""; if (component2.m_dropItems == null) { return; } foreach (DropData drop in component2.m_dropItems.m_drops) { if (!((Object)(object)drop.m_item == (Object)null)) { ItemDrop component3 = drop.m_item.GetComponent<ItemDrop>(); if (!((Object)(object)component3 == (Object)null)) { text2 = ((Object)drop.m_item).name; resourceName2 = Localization.instance.Localize(component3.m_itemData.m_shared.m_name); } } } Helper.GetTier2PinIcons(text2); if (Helper._ResourceIconsT2.TryGetValue(text2, out var value2)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName2, Plugin._detectionRadius.Value, value2, Plugin._blackForestResourcesT2Level.Value); } } private static void AddTier3Tracker(Destructible destructible) { //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)destructible.m_spawnWhenDestroyed == (Object)null) { DropOnDestroyed component = ((Component)destructible).GetComponent<DropOnDestroyed>(); if ((Object)(object)component == (Object)null || component.m_dropWhenDestroyed == null) { return; } string text = ""; string resourceName = ""; foreach (DropData item in component.m_dropWhenDestroyed.m_drops.Where((DropData drop) => (Object)(object)drop.m_item != (Object)null && Object.op_Implicit((Object)(object)drop.m_item.GetComponent<ItemDrop>()))) { text = ((Object)item.m_item).name; resourceName = Localization.instance.Localize(item.m_item.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); } Helper.GetTier3PinIcons(text); if (Helper._ResourceIconsT3.TryGetValue(text, out var value)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._swampResourcesT3Level.Value); } return; } MineRock5 component2 = destructible.m_spawnWhenDestroyed.GetComponent<MineRock5>(); if ((Object)(object)component2 == (Object)null) { return; } string text2 = ""; string resourceName2 = ""; if (component2.m_dropItems == null) { return; } foreach (DropData drop in component2.m_dropItems.m_drops) { if (!((Object)(object)drop.m_item == (Object)null)) { ItemDrop component3 = drop.m_item.GetComponent<ItemDrop>(); if (!((Object)(object)component3 == (Object)null)) { text2 = ((Object)drop.m_item).name; resourceName2 = Localization.instance.Localize(component3.m_itemData.m_shared.m_name); } } } Helper.GetTier3PinIcons(text2); if (Helper._ResourceIconsT3.TryGetValue(text2, out var value2)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName2, Plugin._detectionRadius.Value, value2, Plugin._swampResourcesT3Level.Value); } } private static void AddTier4Tracker(Destructible destructible) { //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)destructible.m_spawnWhenDestroyed == (Object)null) { DropOnDestroyed component = ((Component)destructible).GetComponent<DropOnDestroyed>(); if ((Object)(object)component == (Object)null || component.m_dropWhenDestroyed == null) { return; } string text = ""; string resourceName = ""; foreach (DropData item in component.m_dropWhenDestroyed.m_drops.Where((DropData drop) => (Object)(object)drop.m_item != (Object)null && Object.op_Implicit((Object)(object)drop.m_item.GetComponent<ItemDrop>()))) { text = ((Object)item.m_item).name; resourceName = Localization.instance.Localize(item.m_item.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); } Helper.GetTier4PinIcons(text); if (Helper._ResourceIconsT4.TryGetValue(text, out var value)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._mountainResourcesT4Level.Value); } return; } MineRock5 component2 = destructible.m_spawnWhenDestroyed.GetComponent<MineRock5>(); if ((Object)(object)component2 == (Object)null) { return; } string text2 = ""; string resourceName2 = ""; if (component2.m_dropItems == null) { return; } foreach (DropData drop in component2.m_dropItems.m_drops) { if (!((Object)(object)drop.m_item == (Object)null)) { ItemDrop component3 = drop.m_item.GetComponent<ItemDrop>(); if (!((Object)(object)component3 == (Object)null)) { text2 = ((Object)drop.m_item).name; resourceName2 = Localization.instance.Localize(component3.m_itemData.m_shared.m_name); } } } Helper.GetTier4PinIcons(text2); if (Helper._ResourceIconsT4.TryGetValue(text2, out var value2)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName2, Plugin._detectionRadius.Value, value2, Plugin._mountainResourcesT4Level.Value); } } private static void AddTier5Tracker(Destructible destructible) { //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)destructible.m_spawnWhenDestroyed == (Object)null) { DropOnDestroyed component = ((Component)destructible).GetComponent<DropOnDestroyed>(); if ((Object)(object)component == (Object)null || component.m_dropWhenDestroyed == null) { return; } string text = ""; string resourceName = ""; foreach (DropData item in component.m_dropWhenDestroyed.m_drops.Where((DropData drop) => (Object)(object)drop.m_item != (Object)null && Object.op_Implicit((Object)(object)drop.m_item.GetComponent<ItemDrop>()))) { text = ((Object)item.m_item).name; resourceName = Localization.instance.Localize(item.m_item.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); } Helper.GetTier5PinIcons(text); if (Helper._ResourceIconsT5.TryGetValue(text, out var value)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._plainsResourcesT5Level.Value); } return; } MineRock5 component2 = destructible.m_spawnWhenDestroyed.GetComponent<MineRock5>(); if ((Object)(object)component2 == (Object)null) { return; } string text2 = ""; string resourceName2 = ""; if (component2.m_dropItems == null) { return; } foreach (DropData drop in component2.m_dropItems.m_drops) { if (!((Object)(object)drop.m_item == (Object)null)) { ItemDrop component3 = drop.m_item.GetComponent<ItemDrop>(); if (!((Object)(object)component3 == (Object)null)) { text2 = ((Object)drop.m_item).name; resourceName2 = Localization.instance.Localize(component3.m_itemData.m_shared.m_name); } } } Helper.GetTier5PinIcons(text2); if (Helper._ResourceIconsT5.TryGetValue(text2, out var value2)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName2, Plugin._detectionRadius.Value, value2, Plugin._plainsResourcesT5Level.Value); } } private static void AddTier6Tracker(Destructible destructible) { //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)destructible.m_spawnWhenDestroyed == (Object)null) { DropOnDestroyed component = ((Component)destructible).GetComponent<DropOnDestroyed>(); if ((Object)(object)component == (Object)null || component.m_dropWhenDestroyed == null) { return; } string text = ""; string resourceName = ""; foreach (DropData item in component.m_dropWhenDestroyed.m_drops.Where((DropData drop) => (Object)(object)drop.m_item != (Object)null && Object.op_Implicit((Object)(object)drop.m_item.GetComponent<ItemDrop>()))) { text = ((Object)item.m_item).name; resourceName = Localization.instance.Localize(item.m_item.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); } Helper.GetTier6PinIcons(text); if (Helper._ResourceIconsT6.TryGetValue(text, out var value)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._mistlandsResourcesT6Level.Value); } return; } MineRock5 component2 = destructible.m_spawnWhenDestroyed.GetComponent<MineRock5>(); if ((Object)(object)component2 == (Object)null) { return; } string text2 = ""; string resourceName2 = ""; if (component2.m_dropItems == null) { return; } foreach (DropData drop in component2.m_dropItems.m_drops) { if (!((Object)(object)drop.m_item == (Object)null)) { ItemDrop component3 = drop.m_item.GetComponent<ItemDrop>(); if (!((Object)(object)component3 == (Object)null)) { text2 = ((Object)drop.m_item).name; resourceName2 = Localization.instance.Localize(component3.m_itemData.m_shared.m_name); } } } Helper.GetTier6PinIcons(text2); if (Helper._ResourceIconsT6.TryGetValue(text2, out var value2)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName2, Plugin._detectionRadius.Value, value2, Plugin._mistlandsResourcesT6Level.Value); } } private static void AddTier7Tracker(Destructible destructible) { //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)destructible.m_spawnWhenDestroyed == (Object)null) { DropOnDestroyed component = ((Component)destructible).GetComponent<DropOnDestroyed>(); if ((Object)(object)component == (Object)null || component.m_dropWhenDestroyed == null) { return; } string text = ""; string resourceName = ""; foreach (DropData item in component.m_dropWhenDestroyed.m_drops.Where((DropData drop) => (Object)(object)drop.m_item != (Object)null && Object.op_Implicit((Object)(object)drop.m_item.GetComponent<ItemDrop>()))) { text = ((Object)item.m_item).name; resourceName = Localization.instance.Localize(item.m_item.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); } Helper.GetTier7PinIcons(text); if (Helper._ResourceIconsT7.TryGetValue(text, out var value)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._ashlandsResourcesT7Level.Value); } return; } MineRock5 component2 = destructible.m_spawnWhenDestroyed.GetComponent<MineRock5>(); if ((Object)(object)component2 == (Object)null) { return; } string text2 = ""; string resourceName2 = ""; if (component2.m_dropItems == null) { return; } foreach (DropData drop in component2.m_dropItems.m_drops) { if (!((Object)(object)drop.m_item == (Object)null)) { ItemDrop component3 = drop.m_item.GetComponent<ItemDrop>(); if (!((Object)(object)component3 == (Object)null)) { text2 = ((Object)drop.m_item).name; resourceName2 = Localization.instance.Localize(component3.m_itemData.m_shared.m_name); } } } Helper.GetTier7PinIcons(text2); if (Helper._ResourceIconsT7.TryGetValue(text2, out var value2)) { ((Component)destructible).gameObject.AddComponent<Tracker>().Create(resourceName2, Plugin._detectionRadius.Value, value2, Plugin._ashlandsResourcesT7Level.Value); } } } [HarmonyPatch] public class DropOnDestroyedPatch { [HarmonyPostfix] [HarmonyPatch(typeof(DropOnDestroyed), "Awake")] private static void Awake_Postfix(DropOnDestroyed __instance) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) if (!((Object)__instance).name.Contains("Beehive")) { return; } foreach (DropData drop in __instance.m_dropWhenDestroyed.m_drops) { ItemDrop component = drop.m_item.GetComponent<ItemDrop>(); string name = ((Object)drop.m_item).name; string resourceName = Localization.instance.Localize(component.m_itemData.m_shared.m_name); Helper.GetTier1PinIcons(name); if (!Helper._ResourceIconsT1.TryGetValue(name, out var value)) { break; } ((Component)__instance).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._meadowsResourcesT1Level.Value); } } } [HarmonyPatch] public class LeviathanAwake { [HarmonyPostfix] [HarmonyPatch(typeof(Leviathan), "Awake")] private static void Awake_Postfix(Leviathan __instance) { AddTier3Tracker(__instance); AddTier7Tracker(__instance); } private static void AddTier3Tracker(Leviathan leviathan) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) MineRock component = ((Component)leviathan).GetComponent<MineRock>(); if ((Object)(object)component == (Object)null) { return; } string text = ""; string resourceName = ""; if (component.m_dropItems == null) { return; } foreach (DropData drop in component.m_dropItems.m_drops) { ItemDrop component2 = drop.m_item.GetComponent<ItemDrop>(); text = ((Object)drop.m_item).name; resourceName = Localization.instance.Localize(component2.m_itemData.m_shared.m_name); } Helper.GetTier3PinIcons(text); if (Helper._ResourceIconsT3.TryGetValue(text, out var value)) { ((Component)leviathan).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._swampResourcesT3Level.Value); } } private static void AddTier7Tracker(Leviathan leviathan) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) MineRock component = ((Component)leviathan).GetComponent<MineRock>(); if ((Object)(object)component == (Object)null) { return; } string text = ""; string resourceName = ""; if (component.m_dropItems == null) { return; } foreach (DropData drop in component.m_dropItems.m_drops) { ItemDrop component2 = drop.m_item.GetComponent<ItemDrop>(); text = ((Object)drop.m_item).name; resourceName = Localization.instance.Localize(component2.m_itemData.m_shared.m_name); } Helper.GetTier7PinIcons(text); if (Helper._ResourceIconsT7.TryGetValue(text, out var value)) { ((Component)leviathan).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._swampResourcesT3Level.Value); } } } [HarmonyPatch] public class LocationPatch { private static readonly IDictionary<string, string> _LocalizationDict = new Dictionary<string, string>(); [HarmonyPostfix] [HarmonyPatch(typeof(Location), "Awake")] private static void Awake_Postfix(Location __instance) { if (!Helper._DungeonList.Contains(((Object)((Component)__instance).gameObject).name.Replace("(Clone)", ""))) { return; } string text = ((Object)((Component)__instance).gameObject).name.Replace("(Clone)", ""); GetLocalizedName(); if (text == "SunkenCrypt4") { Sprite pinIcon = Skill.loadSprite("crypt.png", 64, 64); ((Component)__instance).gameObject.AddComponent<Tracker>().Create(Localized("SunkenCrypt4"), Plugin._detectionRadius.Value, pinIcon, Plugin._dungeonsLevel.Value); return; } Helper.GetDungeonPinIcons(text); if (Helper._DungeonPinIcons.TryGetValue(text, out var value)) { ((Component)__instance).gameObject.AddComponent<Tracker>().Create(Localized(text), Plugin._detectionRadius.Value, value, Plugin._dungeonsLevel.Value); } } private static void GetLocalizedName() { _LocalizationDict.Clear(); foreach (string dungeon in Helper._DungeonList) { string text; switch (dungeon) { case "Crypt2": case "Crypt3": case "Crypt4": text = Localization.instance.Localize("$location_forestcrypt"); break; case "TrollCave02": text = Localization.instance.Localize("$location_forestcave"); break; case "SunkenCrypt4": text = Localization.instance.Localize("$location_sunkencrypt"); break; case "MountainCave02": text = Localization.instance.Localize("$location_mountaincave"); break; case "Mistlands_DvergrTownEntrance1": case "Mistlands_DvergrTownEntrance2": text = Localization.instance.Localize("$location_dvergrtown"); break; case "MorgenHole2": case "MorgenHole1": case "MorgenHole3": text = Localization.instance.Localize("$location_morgenhole"); break; default: text = ""; break; } string value = text; _LocalizationDict.Add(dungeon, value); } } private static string Localized(string name) { string result = ""; foreach (string key in _LocalizationDict.Keys) { if (!(name != key)) { result = _LocalizationDict[key]; } } return result; } } [HarmonyPatch] public class MinimapPatch { private static int velocity; [HarmonyPostfix] [HarmonyPatch(typeof(Minimap), "Explore", new Type[] { typeof(int), typeof(int) })] private static void Explore_Postfix(ref bool __result) { if (__result) { velocity++; } } [HarmonyPostfix] [HarmonyPatch(typeof(Minimap), "Explore", new Type[] { typeof(Vector3), typeof(float) })] private static void Explore_Postfix() { if (velocity > 0 && Object.op_Implicit((Object)(object)Player.m_localPlayer)) { ((Character)(object)Player.m_localPlayer).RaiseSkill("Explorer", 0.1f); } } [HarmonyPrefix] [HarmonyPatch(typeof(Minimap), "Explore", new Type[] { typeof(Vector3), typeof(float) })] private static void Explore_Prefix(ref float radius) { velocity = 0; radius *= ((Character)(object)Player.m_localPlayer).GetSkillFactor("Explorer") * (float)Plugin._increasePerLevel.Value + 1f; } } [HarmonyPatch(typeof(ObjectDB), "UpdateRegisters")] public class ObjectDBPatch { public static readonly IDictionary<string, Sprite> _ResourceSpritesDictT1 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceSpritesDictT2 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceSpritesDictT3 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceSpritesDictT4 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceSpritesDictT5 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceSpritesDictT6 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceSpritesDictT7 = new Dictionary<string, Sprite>(); private static void Postfix(ObjectDB __instance) { GetResourceT1Sprites(__instance); GetResourceT2Sprites(__instance); GetResourceT3Sprites(__instance); GetResourceT4Sprites(__instance); GetResourceT5Sprites(__instance); GetResourceT6Sprites(__instance); GetResourceT7Sprites(__instance); } private static void GetResourceT1Sprites(ObjectDB objectDB) { _ResourceSpritesDictT1.Clear(); foreach (string item in new HashSet<string>(Plugin._meadowsResourcesT1.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries))) { GameObject itemPrefab = objectDB.GetItemPrefab(StringExtensionMethods.GetStableHashCode(item)); if (!((Object)(object)itemPrefab == (Object)null)) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { _ResourceSpritesDictT1.Add(item, component.m_itemData.GetIcon()); } } } } private static void GetResourceT2Sprites(ObjectDB objectDB) { _ResourceSpritesDictT2.Clear(); foreach (string item in new HashSet<string>(Plugin._blackForestResourcesT2.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries))) { GameObject itemPrefab = objectDB.GetItemPrefab(StringExtensionMethods.GetStableHashCode(item)); if (!((Object)(object)itemPrefab == (Object)null)) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { _ResourceSpritesDictT2.Add(item, component.m_itemData.GetIcon()); } } } } private static void GetResourceT3Sprites(ObjectDB objectDB) { _ResourceSpritesDictT3.Clear(); foreach (string item in new HashSet<string>(Plugin._swampResourcesT3.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries))) { GameObject itemPrefab = objectDB.GetItemPrefab(StringExtensionMethods.GetStableHashCode(item)); if (!((Object)(object)itemPrefab == (Object)null)) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { _ResourceSpritesDictT3.Add(item, component.m_itemData.GetIcon()); } } } } private static void GetResourceT4Sprites(ObjectDB objectDB) { _ResourceSpritesDictT4.Clear(); foreach (string item in new HashSet<string>(Plugin._mountainResourcesT4.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries))) { GameObject itemPrefab = objectDB.GetItemPrefab(StringExtensionMethods.GetStableHashCode(item)); if (!((Object)(object)itemPrefab == (Object)null)) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { _ResourceSpritesDictT4.Add(item, component.m_itemData.GetIcon()); } } } } private static void GetResourceT5Sprites(ObjectDB objectDB) { _ResourceSpritesDictT5.Clear(); foreach (string item in new HashSet<string>(Plugin._plainsResourcesT5.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries))) { GameObject itemPrefab = objectDB.GetItemPrefab(StringExtensionMethods.GetStableHashCode(item)); if (!((Object)(object)itemPrefab == (Object)null)) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { _ResourceSpritesDictT5.Add(item, component.m_itemData.GetIcon()); } } } } private static void GetResourceT6Sprites(ObjectDB objectDB) { _ResourceSpritesDictT6.Clear(); foreach (string item in new HashSet<string>(Plugin._mistlandsResourcesT6.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries))) { GameObject itemPrefab = objectDB.GetItemPrefab(StringExtensionMethods.GetStableHashCode(item)); if (!((Object)(object)itemPrefab == (Object)null)) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { _ResourceSpritesDictT6.Add(item, component.m_itemData.GetIcon()); } } } } private static void GetResourceT7Sprites(ObjectDB objectDB) { _ResourceSpritesDictT7.Clear(); foreach (string item in new HashSet<string>(Plugin._ashlandsResourcesT7.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries))) { GameObject itemPrefab = objectDB.GetItemPrefab(StringExtensionMethods.GetStableHashCode(item)); if (!((Object)(object)itemPrefab == (Object)null)) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { _ResourceSpritesDictT7.Add(item, component.m_itemData.GetIcon()); } } } } } [HarmonyPatch] public class PickablePatch { [HarmonyPostfix] [HarmonyPatch(typeof(Pickable), "SetPicked")] private static void SetPicked_Postfix(Pickable __instance, ref bool picked) { if (!((Object)(object)__instance == (Object)null) && picked) { Tracker component = ((Component)__instance).gameObject.GetComponent<Tracker>(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } } } [HarmonyPostfix] [HarmonyPatch(typeof(Pickable), "Awake")] private static void Awake_Postfix(Pickable __instance) { AddTier1Tracker(__instance); AddTier2Tracker(__instance); AddTier3Tracker(__instance); AddTier4Tracker(__instance); AddTier5Tracker(__instance); AddTier6Tracker(__instance); AddTier7Tracker(__instance); } private static void AddTier1Tracker(Pickable pickable) { string name = ((Object)pickable.m_itemPrefab).name; string resourceName = Localization.instance.Localize(pickable.m_itemPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); Helper.GetTier1PinIcons(name); if (Helper._ResourceIconsT1.TryGetValue(name, out var value)) { ((Component)pickable).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._meadowsResourcesT1Level.Value); } } private static void AddTier2Tracker(Pickable pickable) { string name = ((Object)pickable.m_itemPrefab).name; string resourceName = Localization.instance.Localize(pickable.m_itemPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); Helper.GetTier2PinIcons(name); if (Helper._ResourceIconsT2.TryGetValue(name, out var value)) { ((Component)pickable).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._blackForestResourcesT2Level.Value); } } private static void AddTier3Tracker(Pickable pickable) { string name = ((Object)pickable.m_itemPrefab).name; string resourceName = Localization.instance.Localize(pickable.m_itemPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); Helper.GetTier3PinIcons(name); if (Helper._ResourceIconsT3.TryGetValue(name, out var value)) { ((Component)pickable).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._swampResourcesT3Level.Value); } } private static void AddTier4Tracker(Pickable pickable) { string name = ((Object)pickable.m_itemPrefab).name; string resourceName = Localization.instance.Localize(pickable.m_itemPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); Helper.GetTier4PinIcons(name); if (Helper._ResourceIconsT4.TryGetValue(name, out var value)) { ((Component)pickable).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._mountainResourcesT4Level.Value); } } private static void AddTier5Tracker(Pickable pickable) { string name = ((Object)pickable.m_itemPrefab).name; string resourceName = Localization.instance.Localize(pickable.m_itemPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); Helper.GetTier5PinIcons(name); if (Helper._ResourceIconsT5.TryGetValue(name, out var value)) { ((Component)pickable).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._plainsResourcesT5Level.Value); } } private static void AddTier6Tracker(Pickable pickable) { string name = ((Object)pickable.m_itemPrefab).name; string resourceName = Localization.instance.Localize(pickable.m_itemPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); Helper.GetTier6PinIcons(name); if (Helper._ResourceIconsT6.TryGetValue(name, out var value)) { ((Component)pickable).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._mistlandsResourcesT6Level.Value); } } private static void AddTier7Tracker(Pickable pickable) { string name = ((Object)pickable.m_itemPrefab).name; string resourceName = Localization.instance.Localize(pickable.m_itemPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_name); Helper.GetTier7PinIcons(name); if (Helper._ResourceIconsT7.TryGetValue(name, out var value)) { ((Component)pickable).gameObject.AddComponent<Tracker>().Create(resourceName, Plugin._detectionRadius.Value, value, Plugin._ashlandsResourcesT7Level.Value); } } } [HarmonyPatch] public class PlayerPatch { [HarmonyPostfix] [HarmonyPatch(typeof(Player), "Awake")] private static void Awake_Postfix(Player __instance) { ((Character)__instance).m_nview.Register<int>("Explorer IncreaseSkill", (Action<long, int>)delegate(long _, int factor) { ((Character)(object)__instance).RaiseSkill("Explorer", factor); }); } [HarmonyPostfix] [HarmonyPatch(typeof(Player), "Update")] private static void Update_Postfix(ref Player __instance) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer)) { ((Character)__instance).m_nview.GetZDO().Set("Explorer Skill Factor", ((Character)__instance).GetSkillFactor(Skill.fromName("Explorer"))); } } [HarmonyPrefix] [HarmonyPatch(typeof(Player), "AddKnownText")] private static void AddKnownText_Postfix(Player __instance, ref string label) { if (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer) && label.Length != 0 && label.StartsWith("$lore_") && !__instance.m_knownTexts.ContainsKey(label)) { ((Character)(object)__instance).RaiseSkill("Explorer", Plugin._loreStoneExp.Value); } } [HarmonyPrefix] [HarmonyPatch(typeof(Player), "AddKnownBiome")] private static void AddKnownBiome_Prefix(Player __instance, ref Biome biome) { if (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer) && !__instance.m_knownBiome.Contains(biome)) { ((Character)(object)__instance).RaiseSkill("Explorer", Plugin._newBiomeExp.Value); } } [HarmonyPostfix] [HarmonyPatch(typeof(Player), "FixedUpdate")] private static void FixedUpdate_Postfix(Player __instance) { CheckKnownLocation(__instance); } private static void CheckKnownLocation(Player player) { //IL_0025: 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_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player != (Object)(object)Player.m_localPlayer || ((Character)player).InIntro() || (Object)(object)player == (Object)null) { return; } Location location = Location.GetLocation(((Component)player).transform.position, false); if ((Object)(object)location == (Object)null) { return; } string label = ((Object)((Component)location).gameObject).name.Replace("(Clone)", "") + "_BSE" + Helper.RandomNumber(); if (Location.IsInsideLocation(((Component)player).transform.position, 2f)) { Dictionary<string, string> customData = player.m_customData; Vector3 position = ((Component)location).transform.position; if (!customData.ContainsValue(((object)(Vector3)(ref position)).ToString())) { position = ((Component)location).transform.position; Helper.AddCustomData(player, label, ((object)(Vector3)(ref position)).ToString()); ((Character)(object)player).RaiseSkill("Explorer", Plugin._locationExp.Value); ((Character)player).Message((MessageType)2, "Discovered a new location!", 0, (Sprite)null); } } } } [HarmonyPatch] public class RuneStonePatch { [HarmonyPrefix] [HarmonyPatch(typeof(RuneStone), "Interact")] private static void Interact_Prefix(RuneStone __instance) { if (!((Object)(object)Player.m_localPlayer == (Object)null)) { RandomRuneText randomText = __instance.GetRandomText(); string label = ((Object)((Component)__instance).gameObject).name + "_BSE" + Helper.RandomNumber(); if (randomText != null && !Player.m_localPlayer.m_customData.ContainsValue(randomText.m_text)) { Helper.AddCustomData(Player.m_localPlayer, label, randomText.m_text); ((Character)(object)Player.m_localPlayer).RaiseSkill("Explorer", Plugin._loreStoneExp.Value); } } } } [HarmonyPatch(typeof(Skills), "RaiseSkill")] public class SkillsPatch { private static void Postfix(Skills __instance, SkillType skillType, float factor = 1f) { //IL_0034: 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_0056: Unknown result type (might be due to invalid IL or missing references) if (Plugin._displayExpGain.Value == Toggle.Off) { return; } ((Character)__instance.m_player).GetSkills().m_skillData.TryGetValue((SkillType)Mathf.Abs(StringExtensionMethods.GetStableHashCode("Explorer")), out var value); if ((SkillType?)skillType != value?.m_info.m_skill) { return; } try { if (value.m_level < 100f) { float value2 = value.m_accumulator / (value.GetNextLevelRequirement() / 100f); ((Character)__instance.m_player).Message((MessageType)1, $"Level {value.m_level.tFloat(0)} Explorer [{value.m_accumulator.tFloat(2)}/{value.GetNextLevelRequirement().tFloat(2)}] ({value2.tFloat(0)}%)", 0, value.m_info.m_icon); } } catch { } } } public class Tracker : MonoBehaviour { public string m_resourceName; private float m_trackRange; private Sprite m_pinIcon; private PinData m_pinData; private int m_requiredLevel; private static readonly List<PinData> m_pinList = new List<PinData>(); public void Create(string resourceName, float trackRange, Sprite pinIcon, int requiredLevel) { m_resourceName = resourceName; m_trackRange = trackRange; m_pinIcon = pinIcon; m_pinData = null; m_requiredLevel = requiredLevel; } private void Update() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_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_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: 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) Player localPlayer = Player.m_localPlayer; if (Object.op_Implicit((Object)(object)localPlayer)) { Vector2 val = Vector2.op_Implicit(((Component)localPlayer).transform.position - ((Component)this).transform.position); float skillFactor = ((Character)(object)localPlayer).GetSkillFactor("Explorer"); bool flag = Plugin._iconsOnly.Value == Toggle.On; bool flag2 = ((Vector2)(ref val)).magnitude <= m_trackRange; if (m_pinData == null && flag2 && m_requiredLevel > 0 && skillFactor >= (float)m_requiredLevel / 100f && m_pinList.Count < Plugin._maxPin.Value) { m_pinData = HaveSimilarPin(((Component)this).transform.position, (PinType)8, m_resourceName, save: false) ?? Minimap.instance.AddPin(((Component)this).transform.position, (PinType)8, flag ? "" : m_resourceName, false, false, 0L, ""); m_pinData.m_icon = m_pinIcon; m_pinData.m_worldSize = 0f; m_pinList.Add(m_pinData); } else if (m_pinData != null && !flag2) { m_pinList.Remove(m_pinData); Minimap.instance.RemovePin(m_pinData); m_pinData = null; } else if (m_pinData != null && (m_requiredLevel <= 0 || (float)m_requiredLevel / 100f > skillFactor)) { m_pinList.Remove(m_pinData); Minimap.instance.RemovePin(m_pinData); m_pinData = null; } else if (m_pinData != null && Plugin._hidePins) { m_pinList.Clear(); Minimap.instance.RemovePin(m_pinData); m_pinData = null; } if (m_pinData != null) { m_pinData.m_pos = ((Component)this).transform.position; } } } private static PinData? HaveSimilarPin(Vector3 pos, PinType type, string name, bool save) { //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) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) string name2 = name; return ((IEnumerable<PinData>)Minimap.instance.m_pins).FirstOrDefault((Func<PinData, bool>)((PinData x) => x.m_name == name2 && x.m_type == type && x.m_save == save && CheckDistance(x.m_pos, pos, 20f))); } private static bool CheckDistance(Vector3 pinPos, Vector3 refPos, float distance) { //IL_0000: 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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) return Math.Sqrt(Math.Pow(pinPos.x - refPos.x, 2.0) + Math.Pow(pinPos.y - refPos.y, 2.0) + Math.Pow(pinPos.z - refPos.z, 2.0)) < (double)distance; } private void OnDestroy() { if (m_pinData == null) { return; } try { m_pinList.Remove(m_pinData); Minimap.instance.RemovePin(m_pinData); m_pinData = null; } catch { } } } } namespace Explorer.Functions { public class ConfigurationManagerAttributes { [UsedImplicitly] public bool? ShowRangeAsPercent; [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [UsedImplicitly] public string Category; [UsedImplicitly] public Action<ConfigEntryBase> CustomDrawer; } public static class Helper { public static readonly IDictionary<string, Sprite> _ResourceIconsT1 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceIconsT2 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceIconsT3 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceIconsT4 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceIconsT5 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceIconsT6 = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _ResourceIconsT7 = new Dictionary<string, Sprite>(); private static readonly IDictionary<string, Sprite> _DungeonSpritesDict = new Dictionary<string, Sprite>(); public static readonly IDictionary<string, Sprite> _DungeonPinIcons = new Dictionary<string, Sprite>(); public static HashSet<string> _DungeonList = new HashSet<string> { "Crypt2", "Crypt3", "Crypt4", "TrollCave02", "SunkenCrypt4", "MountainCave02", "Mistlands_DvergrTownEntrance1", "Mistlands_DvergrTownEntrance2", "MorgenHole1", "MorgenHole2", "MorgenHole3", "BOM_FlintMine01", "BOM_FlintMine02", "BOM_CopperMine01", "BOM_CopperMine02", "BOM_TinMine01", "BOM_TinMine02", "BOM_CoalMine01", "BOM_CoalMine02", "BOM_IronMine01", "BOM_IronMine02", "BOM_SilverMine01", "BOM_SilverMine02" }; public static float tFloat(this float value, int digits) { double num = Math.Pow(10.0, digits); return (float)(Math.Truncate(num * (double)value) / num); } public static void GetDungeonSprites() { _DungeonSpritesDict.Clear(); foreach (string dungeon in _DungeonList) { Sprite val; switch (dungeon) { case "Crypt2": case "Crypt3": case "Crypt4": val = Skill.loadSprite("burial.png", 64, 64); break; case "TrollCave02": val = Skill.loadSprite("troll_cave.png", 64, 64); break; case "MountainCave02": val = Skill.loadSprite("mountain_cave.png", 64, 64); break; case "Mistlands_DvergrTownEntrance1": val = Skill.loadSprite("mistland_dungeon.png", 64, 64); break; case "Mistlands_DvergrTownEntrance2": val = Skill.loadSprite("mistland_dungeon_rock.png", 64, 64); break; case "MorgenHole2": case "MorgenHole1": case "MorgenHole3": val = Skill.loadSprite("morgen_hole.png", 64, 64); break; case "BOM_CoalMine01": case "BOM_CoalMine02": case "BOM_IronMine01": case "BOM_IronMine02": case "BOM_FlintMine01": case "BOM_FlintMine02": case "BOM_CopperMine01": case "BOM_CopperMine02": case "BOM_SilverMine01": case "BOM_SilverMine02": case "BOM_TinMine01": case "BOM_TinMine02": val = Skill.loadSprite("oremine.png", 64, 64); break; default: val = null; break; } Sprite value = val; _DungeonSpritesDict.Add(dungeon, value); } } public static void GetDungeonPinIcons(string dungeon) { if (_DungeonPinIcons.ContainsKey(dungeon)) { return; } foreach (string key in _DungeonSpritesDict.Keys) { if (!(dungeon != key)) { _DungeonPinIcons.Add(dungeon, _DungeonSpritesDict[key]); } } } public static void GetTier1PinIcons(string resource) { if (_ResourceIconsT1.ContainsKey(resource)) { return; } foreach (string key in ObjectDBPatch._ResourceSpritesDictT1.Keys) { if (!(resource != key)) { _ResourceIconsT1.Add(resource, ObjectDBPatch._ResourceSpritesDictT1[key]); } } } public static void GetTier2PinIcons(string resource) { if (_ResourceIconsT2.ContainsKey(resource)) { return; } foreach (string key in ObjectDBPatch._ResourceSpritesDictT2.Keys) { if (!(resource != key)) { _ResourceIconsT2.Add(resource, ObjectDBPatch._ResourceSpritesDictT2[key]); } } } public static void GetTier3PinIcons(string resource) { if (_ResourceIconsT3.ContainsKey(resource)) { return; } foreach (string key in ObjectDBPatch._ResourceSpritesDictT3.Keys) { if (!(resource != key)) { _ResourceIconsT3.Add(resource, ObjectDBPatch._ResourceSpritesDictT3[key]); } } } public static void GetTier4PinIcons(string resource) { if (_ResourceIconsT4.ContainsKey(resource)) { return; } foreach (string key in ObjectDBPatch._ResourceSpritesDictT4.Keys) { if (!(resource != key)) { _ResourceIconsT4.Add(resource, ObjectDBPatch._ResourceSpritesDictT4[key]); } } } public static void GetTier5PinIcons(string resource) { if (_ResourceIconsT5.ContainsKey(resource)) { return; } foreach (string key in ObjectDBPatch._ResourceSpritesDictT5.Keys) { if (!(resource != key)) { _ResourceIconsT5.Add(resource, ObjectDBPatch._ResourceSpritesDictT5[key]); } } } public static void GetTier6PinIcons(string resource) { if (_ResourceIconsT6.ContainsKey(resource)) { return; } foreach (string key in ObjectDBPatch._ResourceSpritesDictT6.Keys) { if (!(resource != key)) { _ResourceIconsT6.Add(resource, ObjectDBPatch._ResourceSpritesDictT6[key]); } } } public static void GetTier7PinIcons(string resource) { if (_ResourceIconsT7.ContainsKey(resource)) { return; } foreach (string key in ObjectDBPatch._ResourceSpritesDictT7.Keys) { if (!(resource != key)) { _ResourceIconsT7.Add(resource, ObjectDBPatch._ResourceSpritesDictT7[key]); } } } public static void AddCustomData(Player player, string label, string text) { if (!player.m_customData.ContainsKey(label)) { player.m_customData.Add(label, text); } } public static string RandomNumber() { int num = Random.Range(0, 9); int num2 = Random.Range(0, 9); int num3 = Random.Range(0, 9); int num4 = Random.Range(0, 9); int num5 = Random.Range(0, 9); return $"{num}{num2}{num3}{num4}{num5}"; } } public enum Toggle { On = 1, Off = 0 } } namespace ServerSync { [PublicAPI] internal abstract class OwnConfigEntryBase { public object? LocalBaseValue; public bool SynchronizedConfig = true; public abstract ConfigEntryBase BaseConfig { get; } } [PublicAPI] internal class SyncedConfigEntry<T> : OwnConfigEntryBase { public readonly ConfigEntry<T> SourceConfig; public override ConfigEntryBase BaseConfig => (ConfigEntryBase)(object)SourceConfig; public T Value { get { return SourceConfig.Value; } set { SourceConfig.Value = value; } } public SyncedConfigEntry(ConfigEntry<T> sourceConfig) { SourceConfig = sourceConfig; } public void AssignLocalValue(T value) { if (LocalBaseValue == null) { Value = value; } else { LocalBaseValue = value; } } } internal abstract class CustomSyncedValueBase { public object? LocalBaseValue; public readonly string Identifier; public readonly Type Type; private object? boxedValue; protected bool localIsOwner; public readonly int Priority; public object? BoxedValue { get { return boxedValue; } set { boxedValue = value; this.ValueChanged?.Invoke(); } } public event Action? ValueChanged; protected CustomSyncedValueBase(ConfigSync configSync, string identifier, Type type, int priority) { Priority = priority; Identifier = identifier; Type = type; configSync.AddCustomValue(this); localIsOwner = configSync.IsSourceOfTruth; configSync.SourceOfTruthChanged += delegate(bool truth) { localIsOwner = truth; }; } } [PublicAPI] internal sealed class CustomSyncedValue<T> : CustomSyncedValueBase { public T Value { get { return (T)base.BoxedValue; } set { base.BoxedValue = value; } } public CustomSyncedValue(ConfigSync configSync, string identifier, T value = default(T), int priority = 0) : base(configSync, identifier, typeof(T), priority) { Value = value; } public void AssignLocalValue(T value) { if (localIsOwner) { Value = value; } else { LocalBaseValue = value; } } } internal class ConfigurationManagerAttributes { [UsedImplicitly] public bool? ReadOnly = false; } [PublicAPI] internal class ConfigSync { [HarmonyPatch(typeof(ZRpc), "HandlePackage")] private static class SnatchCurrentlyHandlingRPC { public static ZRpc? currentRpc; [HarmonyPrefix] private static void Prefix(ZRpc __instance) { currentRpc = __instance; } } [HarmonyPatch(typeof(ZNet), "Awake")] internal static class RegisterRPCPatch { [HarmonyPostfix] private static void Postfix(ZNet __instance) { isServer = __instance.IsServer(); foreach (ConfigSync configSync2 in configSyncs) { ZRoutedRpc.instance.Register<ZPackage>(configSync2.Name + " ConfigSync", (Action<long, ZPackage>)configSync2.RPC_FromOtherClientConfigSync); if (isServer) { configSync2.InitialSyncDone = true; Debug.Log((object)("Registered '" + configSync2.Name + " ConfigSync' RPC - waiting for incoming connections")); } } if (isServer) { ((MonoBehaviour)__instance).StartCoroutine(WatchAdminListChanges()); } static void SendAdmin(List<ZNetPeer> peers, bool isAdmin) { ZPackage package = ConfigsToPackage(null, null, new PackageEntry[1] { new PackageEntry { section = "Internal", key = "lockexempt", type = typeof(bool), value = isAdmin } }); ConfigSync configSync = configSyncs.First(); if (configSync != null) { ((MonoBehaviour)ZNet.instance).StartCoroutine(configSync.sendZPackage(peers, package)); } } static IEnumerator WatchAdminListChanges() { MethodInfo listContainsId = AccessTools.DeclaredMethod(typeof(ZNet), "ListContainsId", (Type[])null, (Type[])null); SyncedList adminList = (SyncedList)AccessTools.DeclaredField(typeof(ZNet), "m_adminList").GetValue(ZNet.instance); List<string> CurrentList = new List<string>(adminList.GetList()); while (true) { yield return (object)new WaitForSeconds(30f); if (!adminList.GetList().SequenceEqual(CurrentList)) { CurrentList = new List<string>(adminList.GetList()); List<ZNetPeer> adminPeer = ZNet.instance.GetPeers().Where(delegate(ZNetPeer p) { string hostName = p.m_rpc.GetSocket().GetHostName(); return ((object)listContainsId == null) ? adminList.Contains(hostName) : ((bool)listContainsId.Invoke(ZNet.instance, new object[2] { adminList, hostName })); }).ToList(); List<ZNetPeer> nonAdminPeer = ZNet.instance.GetPeers().Except(adminPeer).ToList(); SendAdmin(nonAdminPeer, isAdmin: false); SendAdmin(adminPeer, isAdmin: true); } } } } } [HarmonyPatch(typeof(ZNet), "OnNewConnection")] private static class RegisterClientRPCPatch { [HarmonyPostfix] private static void Postfix(ZNet __instance, ZNetPeer peer) { if (__instance.IsServer()) { return; } foreach (ConfigSync configSync in configSyncs) { peer.m_rpc.Register<ZPackage>(configSync.Name + " ConfigSync", (Action<ZRpc, ZPackage>)configSync.RPC_FromServerConfigSync); } } } private class ParsedConfigs { public readonly Dictionary<OwnConfigEntryBase, object?> configValues = new Dictionary<OwnConfigEntryBase, object>(); public readonly Dictionary<CustomSyncedValueBase, object?> customValues = new Dictionary<CustomSyncedValueBase, object>(); } [HarmonyPatch(typeof(ZNet), "Shutdown")] private class ResetConfigsOnShutdown { [HarmonyPostfix] private static void Postfix() { ProcessingServerUpdate = true; foreach (ConfigSync configSync in configSyncs) { configSync.resetConfigsFromServer(); configSync.IsSourceOfTruth = true; configSync.InitialSyncDone = false; } ProcessingServerUpdate = false; } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] private class SendConfig