Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Tweaks v1.1.4
plugins/Tweaks.dll
Decompiled 4 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; 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; using System.Text.RegularExpressions; using System.Threading; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using HarmonyLib; using JetBrains.Annotations; using LocalizationManager; using Microsoft.CodeAnalysis; using ServerSync; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.ObjectPool; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.BufferedDeserialization; using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators; using YamlDotNet.Serialization.Callbacks; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: Guid("E74EB49A-461D-48EA-85BC-F462D60C98C4")] [assembly: ComVisible(false)] [assembly: AssemblyTrademark("")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyProduct("Tweaks")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyDescription("")] [assembly: AssemblyTitle("Tweaks")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyFileVersion("1.1.4")] [assembly: AssemblyCompany("Radamanto")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.4.0")] [module: <a47e57a0-212c-4c2b-98e3-85833ad58b58>RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<bb1fe000-3853-4770-9792-f874f602a4bf>Embedded] internal sealed class <bb1fe000-3853-4770-9792-f874f602a4bf>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<bb1fe000-3853-4770-9792-f874f602a4bf>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <54661faf-19be-4503-9c8b-d5f1b3245000>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <54661faf-19be-4503-9c8b-d5f1b3245000>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <54661faf-19be-4503-9c8b-d5f1b3245000>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [<bb1fe000-3853-4770-9792-f874f602a4bf>Embedded] [CompilerGenerated] internal sealed class <51133548-6862-41f1-ad48-c161465c1812>NullableContextAttribute : Attribute { public readonly byte Flag; public <51133548-6862-41f1-ad48-c161465c1812>NullableContextAttribute(byte P_0) { Flag = P_0; } } [<bb1fe000-3853-4770-9792-f874f602a4bf>Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] [CompilerGenerated] internal sealed class <a47e57a0-212c-4c2b-98e3-85833ad58b58>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <a47e57a0-212c-4c2b-98e3-85833ad58b58>RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace LocalizationManager { [PublicAPI] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] public class Localizer { private static readonly Dictionary<string, Dictionary<string, Func<string>>> PlaceholderProcessors; private static readonly Dictionary<string, Dictionary<string, string>> loadedTexts; private static readonly ConditionalWeakTable<Localization, string> localizationLanguage; private static readonly List<WeakReference<Localization>> localizationObjects; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] private static BaseUnityPlugin _plugin; private static readonly List<string> fileExtensions; private static BaseUnityPlugin plugin { get { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown if (_plugin == null) { IEnumerable<TypeInfo> source; try { source = Assembly.GetExecutingAssembly().DefinedTypes.ToList(); } catch (ReflectionTypeLoadException ex) { source = from t in ex.Types where t != null select t.GetTypeInfo(); } _plugin = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)source.First([<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] [method: <51133548-6862-41f1-ad48-c161465c1812>NullableContext(2)] [field: <54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] public static event Action OnLocalizationComplete; private static void UpdatePlaceholderText(Localization localization, string key) { localizationLanguage.TryGetValue(localization, out var value); string text = loadedTexts[value][key]; if (PlaceholderProcessors.TryGetValue(key, out var value2)) { text = value2.Aggregate(text, [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] (string current, KeyValuePair<string, Func<string>> kv) => current.Replace("{" + kv.Key + "}", kv.Value())); } localization.AddWord(key, text); } public static void AddPlaceholder<T>(string key, string placeholder, ConfigEntry<T> config, [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(new byte[] { 2, 1, 1 })] Func<T, string> convertConfigValue = null) { if (convertConfigValue == null) { convertConfigValue = (T val) => val.ToString(); } if (!PlaceholderProcessors.ContainsKey(key)) { PlaceholderProcessors[key] = new Dictionary<string, Func<string>>(); } config.SettingChanged += [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] (object _, EventArgs _) => { UpdatePlaceholder(); }; if (loadedTexts.ContainsKey(Localization.instance.GetSelectedLanguage())) { UpdatePlaceholder(); } void UpdatePlaceholder() { PlaceholderProcessors[key][placeholder] = () => convertConfigValue(config.Value); UpdatePlaceholderText(Localization.instance, key); } } public static void AddText(string key, string text) { List<WeakReference<Localization>> list = new List<WeakReference<Localization>>(); foreach (WeakReference<Localization> localizationObject in localizationObjects) { if (localizationObject.TryGetTarget(out var target)) { Dictionary<string, string> dictionary = loadedTexts[localizationLanguage.GetOrCreateValue(target)]; if (!target.m_translations.ContainsKey(key)) { dictionary[key] = text; target.AddWord(key, text); } } else { list.Add(localizationObject); } } foreach (WeakReference<Localization> item in list) { localizationObjects.Remove(item); } } public static void Load() { _ = plugin; } public static void LoadLocalizationLater(Localization __instance) { LoadLocalization(Localization.instance, __instance.GetSelectedLanguage()); } public static void SafeCallLocalizeComplete() { Localizer.OnLocalizationComplete?.Invoke(); } private static void LoadLocalization(Localization __instance, string language) { if (!localizationLanguage.Remove(__instance)) { localizationObjects.Add(new WeakReference<Localization>(__instance)); } localizationLanguage.Add(__instance, language); Dictionary<string, string> dictionary = new Dictionary<string, string>(); foreach (string item in from f in Directory.GetFiles(Path.GetDirectoryName(Paths.PluginPath), plugin.Info.Metadata.Name + ".*", SearchOption.AllDirectories) where fileExtensions.IndexOf(Path.GetExtension(f)) >= 0 select f) { string[] array = Path.GetFileNameWithoutExtension(item).Split(new char[1] { '.' }); if (array.Length >= 2) { string text = array[1]; if (dictionary.ContainsKey(text)) { Debug.LogWarning((object)("Duplicate key " + text + " found for " + plugin.Info.Metadata.Name + ". The duplicate file found at " + item + " will be skipped.")); } else { dictionary[text] = item; } } } byte[] array2 = LoadTranslationFromAssembly("English"); if (array2 == null) { throw new Exception("Found no English localizations in mod " + plugin.Info.Metadata.Name + ". Expected an embedded resource translations/English.json or translations/English.yml."); } string input = Encoding.UTF8.GetString(array2).TrimStart(new char[1] { '\ufeff' }); Dictionary<string, string> dictionary2 = new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(input); if (dictionary2 == null) { throw new Exception("Localization for mod " + plugin.Info.Metadata.Name + " failed: Localization file was empty."); } string text2 = null; if (language != "English") { if (dictionary.TryGetValue(language, out var value)) { text2 = File.ReadAllText(value); } else { byte[] array3 = LoadTranslationFromAssembly(language); if (array3 != null) { text2 = Encoding.UTF8.GetString(array3); } } } if (text2 == null && dictionary.TryGetValue("English", out var value2)) { text2 = File.ReadAllText(value2); } if (text2 != null) { text2 = text2.TrimStart(new char[1] { '\ufeff' }); foreach (KeyValuePair<string, string> item2 in new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(text2) ?? new Dictionary<string, string>()) { dictionary2[item2.Key] = item2.Value; } } loadedTexts[language] = dictionary2; foreach (KeyValuePair<string, string> item3 in dictionary2) { UpdatePlaceholderText(__instance, item3.Key); } } static Localizer() { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Expected O, but got Unknown //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Expected O, but got Unknown PlaceholderProcessors = new Dictionary<string, Dictionary<string, Func<string>>>(); loadedTexts = new Dictionary<string, Dictionary<string, string>>(); localizationLanguage = new ConditionalWeakTable<Localization, string>(); localizationObjects = new List<WeakReference<Localization>>(); fileExtensions = new List<string>(2) { ".json", ".yml" }; Harmony val = new Harmony("org.bepinex.helpers.LocalizationManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "SetupLanguage", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalization", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(FejdStartup), "SetupGui", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalizationLater", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(FejdStartup), "Start", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "SafeCallLocalizeComplete", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } [return: <54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] private static byte[] LoadTranslationFromAssembly(string language) { foreach (string fileExtension in fileExtensions) { byte[] array = ReadEmbeddedFileBytes("translations." + language + fileExtension); if (array != null) { return array; } } return null; } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(2)] public static byte[] ReadEmbeddedFileBytes([<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(1)] string resourceFileName, Assembly containingAssembly = null) { using MemoryStream memoryStream = new MemoryStream(); if ((object)containingAssembly == null) { containingAssembly = Assembly.GetCallingAssembly(); } string text = containingAssembly.GetManifestResourceNames().FirstOrDefault([<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] (string str) => str.EndsWith(resourceFileName, StringComparison.Ordinal)); if (text != null) { containingAssembly.GetManifestResourceStream(text)?.CopyTo(memoryStream); } return (memoryStream.Length == 0L) ? null : memoryStream.ToArray(); } } public static class LocalizationManagerVersion { [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(1)] public const string Version = "1.4.1"; } } namespace Tweaks { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] internal static class ProtectedZoneBossAltar { private const string MsgBuildBlocked = "$tweaks_bossaltar_build_blocked"; private const string MsgTerrainBlocked = "$tweaks_bossaltar_terrain_blocked"; private static readonly HashSet<string> BossLocations = new HashSet<string>(StringComparer.Ordinal) { "Eikthyrnir", "GDKing", "Bonemass", "Dragonqueen", "GoblinKing", "Mistlands_DvergrBossEntrance1", "FaderLocation" }; private static readonly HashSet<Location> ActiveBossAltars = new HashSet<Location>(); internal static void Register(Location location) { if (Object.op_Implicit((Object)(object)location)) { string item = ProtectedZoneManager.Normalize(((Object)((Component)location).gameObject).name); if (BossLocations.Contains(item)) { ActiveBossAltars.Add(location); } } } internal static void Unregister(Location location) { if (Object.op_Implicit((Object)(object)location)) { ActiveBossAltars.Remove(location); } } internal static bool IsBlocked(Vector3 point, out ProtectedZoneBlock block) { //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) block = default(ProtectedZoneBlock); if (!Enabled()) { return false; } if (ProtectedZoneManager.Bypass()) { return false; } if (ActiveBossAltars.Count == 0) { return false; } float radius = GetRadius(); if (radius <= 0f) { return false; } foreach (Location activeBossAltar in ActiveBossAltars) { if (!Object.op_Implicit((Object)(object)activeBossAltar) || Utils.DistanceXZ(((Component)activeBossAltar).transform.position, point) > radius) { continue; } block = new ProtectedZoneBlock(ProtectedZoneKind.BossAltar, "$tweaks_bossaltar_build_blocked", "$tweaks_bossaltar_terrain_blocked"); return true; } return false; } private static bool Enabled() { try { return TweaksPlugin.GetBossAltarsProtectionEnabled(); } catch { return true; } } private static float GetRadius() { try { return Mathf.Max(0f, TweaksPlugin.CE_BossAltarsProtection_Radius.Value); } catch { return 100f; } } } [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] internal static class Tweaks_AssetLoader { [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] private static AssetBundle _bundle; private const string ResourceName = "Tweaks.assets.rd_tweaks"; private static void LoadBundle() { if ((Object)(object)_bundle != (Object)null) { return; } try { Assembly executingAssembly = Assembly.GetExecutingAssembly(); using Stream stream = executingAssembly.GetManifestResourceStream("Tweaks.assets.rd_tweaks"); if (stream != null) { byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); _bundle = AssetBundle.LoadFromMemory(array); } } catch { _bundle = null; } } [return: <54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] internal static Sprite GetSprite(string name) { LoadBundle(); if ((Object)(object)_bundle == (Object)null) { return null; } try { return _bundle.LoadAsset<Sprite>(name); } catch { return null; } } } [HarmonyPatch(typeof(Player), "AutoPickup")] [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] internal static class Patch_Player_AutoPickup_Range { private static void Prefix(Player __instance, out float __state) { __state = __instance.m_autoPickupRange; __instance.m_autoPickupRange = TweaksPlugin.CE_AutoPickupRange.Value; } private static void Postfix(Player __instance, float __state) { __instance.m_autoPickupRange = __state; } } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(2)] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] internal static class ClockHud { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] [HarmonyPatch(typeof(Hud), "Awake")] private static class Patch_Hud_Awake { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Postfix(Hud __instance) { if (!Enabled()) { TeardownUi(); } else { EnsureUi(__instance); } } } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] [HarmonyPatch(typeof(Hud), "OnDestroy")] private static class Patch_Hud_OnDestroy { private static void Postfix() { TeardownUi(); } } [HarmonyPatch(typeof(Hud), "Update")] [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] private static class Patch_Hud_Update { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Postfix(Hud __instance) { if (!Enabled()) { if ((Object)(object)_text != (Object)null) { TeardownUi(); } } else { EnsureUi(__instance); Tick(Time.unscaledDeltaTime, __instance); } } } private static GameObject _root; private static RectTransform _rootRt; private static GameObject _container; private static RectTransform _containerRt; private static TextMeshProUGUI _text; private static Image _dayNightIcon; private static RectTransform _iconRt; private static Sprite _sprDay; private static Sprite _sprNight; private static float _timer; private static string _lastLine; private const float TickInterval = 0.2f; private static readonly FieldInfo FI_EnvMan_SmoothDayFraction = AccessTools.Field(typeof(EnvMan), "m_smoothDayFraction"); private static bool Enabled() { return TweaksPlugin.CE_ClockHud_Enabled.Value; } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] [return: <54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] private static GameObject GetHudRoot(Hud hud) { FieldInfo fieldInfo = AccessTools.Field(typeof(Hud), "m_rootObject"); if (fieldInfo != null) { object? value = fieldInfo.GetValue(hud); GameObject val = (GameObject)((value is GameObject) ? value : null); if (val != null && (Object)(object)val != (Object)null) { return val; } } fieldInfo = AccessTools.Field(typeof(Hud), "m_root"); if (fieldInfo != null) { object? value2 = fieldInfo.GetValue(hud); GameObject val2 = (GameObject)((value2 is GameObject) ? value2 : null); if (val2 != null && (Object)(object)val2 != (Object)null) { return val2; } } return ((Object)(object)hud != (Object)null) ? ((Component)hud).gameObject : null; } private static TMP_FontAsset TryGetFontFromInventoryGui() { InventoryGui instance = InventoryGui.instance; if ((Object)(object)instance == (Object)null) { return null; } if ((Object)(object)instance.m_playerName != (Object)null && (Object)(object)instance.m_playerName.font != (Object)null) { return instance.m_playerName.font; } if ((Object)(object)instance.m_recipeName != (Object)null && (Object)(object)instance.m_recipeName.font != (Object)null) { return instance.m_recipeName.font; } if ((Object)(object)instance.m_containerName != (Object)null && (Object)(object)instance.m_containerName.font != (Object)null) { return instance.m_containerName.font; } if ((Object)(object)instance.m_craftingStationName != (Object)null && (Object)(object)instance.m_craftingStationName.font != (Object)null) { return instance.m_craftingStationName.font; } return null; } private static TMP_FontAsset TryGetFontFromMenu() { Menu instance = Menu.instance; if ((Object)(object)instance == (Object)null) { return null; } if ((Object)(object)instance.lastSaveText != (Object)null && (Object)(object)instance.lastSaveText.font != (Object)null) { return instance.lastSaveText.font; } return null; } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void EnsureFont(Hud hud) { if ((Object)(object)_text == (Object)null || (Object)(object)((TMP_Text)_text).font != (Object)null) { return; } TMP_FontAsset val = TryGetFontFromInventoryGui(); if ((Object)(object)val != (Object)null) { ((TMP_Text)_text).font = val; return; } val = TryGetFontFromMenu(); if ((Object)(object)val != (Object)null) { ((TMP_Text)_text).font = val; } else if ((Object)(object)hud != (Object)null && (Object)(object)hud.m_hoverName != (Object)null && (Object)(object)((TMP_Text)hud.m_hoverName).font != (Object)null) { ((TMP_Text)_text).font = ((TMP_Text)hud.m_hoverName).font; } } private static void EnsureSprites() { if ((Object)(object)_sprDay == (Object)null) { _sprDay = Tweaks_AssetLoader.GetSprite("dia"); } if ((Object)(object)_sprNight == (Object)null) { _sprNight = Tweaks_AssetLoader.GetSprite("noite"); } } private static float GetIconSize() { float value = TweaksPlugin.CE_ClockHud_IconSize.Value; return Mathf.Clamp(value, 8f, 128f); } private static void ApplyIconSize() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_iconRt == (Object)null)) { float iconSize = GetIconSize(); _iconRt.sizeDelta = new Vector2(iconSize, iconSize); } } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void EnsureUi(Hud hud) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_0094: 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_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Expected O, but got Unknown //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected O, but got Unknown //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Expected O, but got Unknown //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Expected O, but got Unknown //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_033d: Expected O, but got Unknown //IL_035a: Unknown result type (might be due to invalid IL or missing references) //IL_0364: Expected O, but got Unknown //IL_0373: Unknown result type (might be due to invalid IL or missing references) //IL_038d: Unknown result type (might be due to invalid IL or missing references) //IL_03a7: Unknown result type (might be due to invalid IL or missing references) //IL_03c1: Unknown result type (might be due to invalid IL or missing references) //IL_030e: Unknown result type (might be due to invalid IL or missing references) //IL_0313: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_text != (Object)null) { EnsureFont(hud); return; } GameObject hudRoot = GetHudRoot(hud); if (!((Object)(object)hudRoot == (Object)null)) { _root = new GameObject("Tweaks_ClockHud", new Type[1] { typeof(RectTransform) }); _root.transform.SetParent(hudRoot.transform, false); _rootRt = (RectTransform)_root.transform; _rootRt.anchorMin = new Vector2(0.5f, 1f); _rootRt.anchorMax = new Vector2(0.5f, 1f); _rootRt.pivot = new Vector2(0.5f, 1f); _rootRt.anchoredPosition = new Vector2(0f, -8f); _rootRt.sizeDelta = new Vector2(900f, 72f); _container = new GameObject("Container", new Type[1] { typeof(RectTransform) }); _container.transform.SetParent(_root.transform, false); _containerRt = (RectTransform)_container.transform; _containerRt.anchorMin = new Vector2(0.5f, 0.5f); _containerRt.anchorMax = new Vector2(0.5f, 0.5f); _containerRt.pivot = new Vector2(0.5f, 0.5f); _containerRt.anchoredPosition = new Vector2(0f, -4f); _containerRt.sizeDelta = new Vector2(900f, 72f); GameObject val = new GameObject("Text", new Type[1] { typeof(RectTransform) }); val.transform.SetParent(_container.transform, false); RectTransform val2 = (RectTransform)val.transform; val2.anchorMin = new Vector2(0f, 0.5f); val2.anchorMax = new Vector2(1f, 1f); val2.pivot = new Vector2(0.5f, 1f); val2.anchoredPosition = new Vector2(0f, 0f); val2.sizeDelta = new Vector2(0f, -8f); _text = val.AddComponent<TextMeshProUGUI>(); ((Graphic)_text).raycastTarget = false; ((TMP_Text)_text).textWrappingMode = (TextWrappingModes)0; ((TMP_Text)_text).alignment = (TextAlignmentOptions)258; ((TMP_Text)_text).fontSize = Mathf.Clamp(TweaksPlugin.CE_ClockHud_FontSize.Value, 10, 48); EnsureFont(hud); if ((Object)(object)((TMP_Text)_text).font != (Object)null) { ((TMP_Text)_text).outlineWidth = 0.2f; ((TMP_Text)_text).outlineColor = Color32.op_Implicit(Color.black); } GameObject val3 = new GameObject("DayNightIcon", new Type[1] { typeof(RectTransform) }); val3.transform.SetParent(_container.transform, false); _iconRt = (RectTransform)val3.transform; _iconRt.anchorMin = new Vector2(0.5f, 0f); _iconRt.anchorMax = new Vector2(0.5f, 0f); _iconRt.pivot = new Vector2(0.5f, 0f); _iconRt.anchoredPosition = new Vector2(0f, 2f); _dayNightIcon = val3.AddComponent<Image>(); ((Graphic)_dayNightIcon).raycastTarget = false; ((Behaviour)_dayNightIcon).enabled = false; ApplyIconSize(); _timer = 0f; _lastLine = null; } } private static void TeardownUi() { if ((Object)(object)_root != (Object)null) { Object.Destroy((Object)(object)_root); } _root = null; _rootRt = null; _container = null; _containerRt = null; _text = null; _dayNightIcon = null; _iconRt = null; _timer = 0f; _lastLine = null; } private static bool IgnoreKeyPresses() { if ((Object)(object)ZNetScene.instance == (Object)null) { return true; } if ((Object)(object)Player.m_localPlayer == (Object)null) { return true; } if (Minimap.IsOpen()) { return true; } if (Console.IsVisible()) { return true; } if (TextInput.IsVisible()) { return true; } ZNet instance = ZNet.instance; if ((Object)(object)instance != (Object)null && instance.InPasswordDialog()) { return true; } Chat instance2 = Chat.instance; if ((Object)(object)instance2 != (Object)null && instance2.HasFocus()) { return true; } if (StoreGui.IsVisible()) { return true; } if (InventoryGui.IsVisible()) { return true; } if (Menu.IsVisible()) { return true; } TextViewer instance3 = TextViewer.instance; if ((Object)(object)instance3 != (Object)null && instance3.IsVisible()) { return true; } return false; } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static float GetSmoothDayFraction(EnvMan envMan) { if (FI_EnvMan_SmoothDayFraction != null) { try { object value = FI_EnvMan_SmoothDayFraction.GetValue(envMan); if (value is float) { float result = (float)value; if (true) { return result; } } } catch { } } return envMan.GetDayFraction(); } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static int GetCurrentDaySafe(EnvMan envMan) { try { return envMan.GetCurrentDay(); } catch { return envMan.GetDay(); } } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static string GetIngameTimeString(EnvMan envMan) { float num = Mathf.Repeat(GetSmoothDayFraction(envMan), 1f); DateTime now = DateTime.Now; DateTime dateTime = new DateTime(now.Year, now.Month, now.Day); double value = (double)num * 24.0 * 60.0; return dateTime.AddMinutes(value).ToString("HH:mm"); } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static string MonoDigits(string s) { return "<mspace=0.42em>" + s + "</mspace>"; } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static string NormalizeHexColor([<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] string s, string fallbackNoHash) { if (string.IsNullOrWhiteSpace(s)) { return fallbackNoHash; } string text = s.Trim(); if (text.StartsWith("#", StringComparison.Ordinal)) { text = text.Substring(1); } if (text.Length == 6 || text.Length == 8) { return text; } return fallbackNoHash; } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static string WrapColor(string text, string hexNoHash) { if (string.IsNullOrEmpty(hexNoHash)) { return text; } return "<color=#" + hexNoHash + ">" + text + "</color>"; } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static string BuildLine() { int num = 0; string s = "00:00"; EnvMan instance = EnvMan.instance; if ((Object)(object)instance != (Object)null) { num = instance.GetDay(ZNet.instance.GetTimeSeconds()); s = GetIngameTimeString(instance); } string text = TweaksPlugin.CE_ClockHud_LabelDay.Value ?? "Dia"; string text2 = TweaksPlugin.CE_ClockHud_LabelGameTime.Value ?? "Hora"; string text3 = TweaksPlugin.CE_ClockHud_LabelRealTime.Value ?? "Hora Real"; string hexNoHash = NormalizeHexColor(TweaksPlugin.CE_ClockHud_ColorDay.Value, "FFFFFF"); string hexNoHash2 = NormalizeHexColor(TweaksPlugin.CE_ClockHud_ColorGameTime.Value, "FFFFFF"); string hexNoHash3 = NormalizeHexColor(TweaksPlugin.CE_ClockHud_ColorRealTime.Value, "FFFFFF"); string text4 = ""; if (TweaksPlugin.CE_ClockHud_ShowDay.Value) { text4 = $"{WrapColor(text, hexNoHash)}: {num}"; } string text5 = ""; if (TweaksPlugin.CE_ClockHud_ShowGameTime.Value) { text5 = WrapColor(text2, hexNoHash2) + ": " + MonoDigits(s); } string text6 = ""; if (TweaksPlugin.CE_ClockHud_ShowRealTime.Value) { DateTime now = DateTime.Now; text6 = WrapColor(text3, hexNoHash3) + ": " + MonoDigits(now.ToString("HH:mm")); } if (!string.IsNullOrWhiteSpace(text4) && !string.IsNullOrWhiteSpace(text5) && !string.IsNullOrWhiteSpace(text6)) { return (text4 + " " + text5 + " " + text6).Trim(); } if (!string.IsNullOrWhiteSpace(text4) && !string.IsNullOrWhiteSpace(text5)) { return (text4 + " " + text5).Trim(); } if (!string.IsNullOrWhiteSpace(text5) && !string.IsNullOrWhiteSpace(text6)) { return (text5 + " " + text6).Trim(); } if (!string.IsNullOrWhiteSpace(text4)) { return text4; } if (!string.IsNullOrWhiteSpace(text5)) { return text5; } if (!string.IsNullOrWhiteSpace(text6)) { return text6; } return string.Empty; } private static void UpdateDayNightIcon() { if ((Object)(object)_dayNightIcon == (Object)null) { return; } if (!TweaksPlugin.CE_ClockHud_ShowIcon.Value) { _dayNightIcon.sprite = null; ((Behaviour)_dayNightIcon).enabled = false; return; } EnsureSprites(); if (EnvMan.IsDay()) { _dayNightIcon.sprite = _sprDay; ((Behaviour)_dayNightIcon).enabled = (Object)(object)_dayNightIcon.sprite != (Object)null; } else if (EnvMan.IsNight()) { _dayNightIcon.sprite = _sprNight; ((Behaviour)_dayNightIcon).enabled = (Object)(object)_dayNightIcon.sprite != (Object)null; } else { _dayNightIcon.sprite = null; ((Behaviour)_dayNightIcon).enabled = false; } } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Tick(float dt, Hud hud) { if ((Object)(object)_text == (Object)null) { return; } EnsureFont(hud); if (IgnoreKeyPresses()) { return; } _timer += dt; while (_timer >= 0.2f) { _timer -= 0.2f; ((TMP_Text)_text).fontSize = Mathf.Clamp(TweaksPlugin.CE_ClockHud_FontSize.Value, 10, 48); string text = BuildLine(); if (!string.Equals(_lastLine, text, StringComparison.Ordinal)) { _lastLine = text; ((TMP_Text)_text).text = text; } if (TweaksPlugin.CE_ClockHud_ShowIcon.Value) { ApplyIconSize(); UpdateDayNightIcon(); } else { UpdateDayNightIcon(); } } } } [HarmonyPatch] internal static class Tweaks_ComfortRange { [CompilerGenerated] private sealed class <GetNearbyComfortPieces_Transpiler>d__3 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IDisposable, IEnumerator { private int <>1__state; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(1)] private CodeInstruction <>2__current; private int <>l__initialThreadId; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(new byte[] { 0, 1 })] private IEnumerable<CodeInstruction> instructions; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(new byte[] { 0, 1 })] public IEnumerable<CodeInstruction> <>3__instructions; private bool <replaced>5__1; private MethodInfo <mi>5__2; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(new byte[] { 0, 1 })] private IEnumerator<CodeInstruction> <>s__3; private CodeInstruction <ins>5__4; private float <f>5__5; CodeInstruction IEnumerator<CodeInstruction>.Current { [DebuggerHidden] [return: <54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(1)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetNearbyComfortPieces_Transpiler>d__3(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || (uint)(num - 1) <= 1u) { try { } finally { <>m__Finally1(); } } <mi>5__2 = null; <>s__3 = null; <ins>5__4 = null; <>1__state = -2; } private bool MoveNext() { //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Expected O, but got Unknown try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <replaced>5__1 = false; <mi>5__2 = AccessTools.Method(typeof(Tweaks_ComfortRange), "GetComfortRadiusRuntime", (Type[])null, (Type[])null); <>s__3 = instructions.GetEnumerator(); <>1__state = -3; break; case 1: <>1__state = -3; <replaced>5__1 = true; break; case 2: <>1__state = -3; <ins>5__4 = null; break; } if (<>s__3.MoveNext()) { <ins>5__4 = <>s__3.Current; if (!<replaced>5__1 && <ins>5__4.opcode == OpCodes.Ldc_R4) { object operand = <ins>5__4.operand; if (operand is float) { <f>5__5 = (float)operand; if (Math.Abs(<f>5__5 - sComfortRadiusConstant) < 0.0001f) { <>2__current = new CodeInstruction(OpCodes.Call, (object)<mi>5__2); <>1__state = 1; return true; } } } <>2__current = <ins>5__4; <>1__state = 2; return true; } <>m__Finally1(); <>s__3 = null; return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>s__3 != null) { <>s__3.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator() { <GetNearbyComfortPieces_Transpiler>d__3 <GetNearbyComfortPieces_Transpiler>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetNearbyComfortPieces_Transpiler>d__ = this; } else { <GetNearbyComfortPieces_Transpiler>d__ = new <GetNearbyComfortPieces_Transpiler>d__3(0); } <GetNearbyComfortPieces_Transpiler>d__.instructions = <>3__instructions; return <GetNearbyComfortPieces_Transpiler>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<CodeInstruction>)this).GetEnumerator(); } } private static readonly float sComfortRadiusConstant; static Tweaks_ComfortRange() { try { sComfortRadiusConstant = ((typeof(SE_Rested).GetField("c_ComfortRadius", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null) is float num) ? num : 10f); } catch { sComfortRadiusConstant = 10f; } } internal static float GetComfortRadiusRuntime() { try { if (TweaksPlugin.CE_ComfortRange_Enabled == null || !TweaksPlugin.CE_ComfortRange_Enabled.Value) { return sComfortRadiusConstant; } if (TweaksPlugin.CE_ComfortRange_Radius == null) { return sComfortRadiusConstant; } float num = TweaksPlugin.CE_ComfortRange_Radius.Value; if (num < 0f) { num = 0f; } if (num > 1000f) { num = 1000f; } return num; } catch { return sComfortRadiusConstant; } } [HarmonyTranspiler] [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] [IteratorStateMachine(typeof(<GetNearbyComfortPieces_Transpiler>d__3))] [HarmonyPatch(typeof(SE_Rested), "GetNearbyComfortPieces")] private static IEnumerable<CodeInstruction> GetNearbyComfortPieces_Transpiler(IEnumerable<CodeInstruction> instructions) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetNearbyComfortPieces_Transpiler>d__3(-2) { <>3__instructions = instructions }; } } [BepInPlugin("radamanto.Tweaks", "Tweaks", "1.1.4")] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] public class TweaksPlugin : BaseUnityPlugin { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] private class ConfigurationManagerAttributes { public bool? Browsable = false; } [CompilerGenerated] private sealed class <ReloadConfigAfterQuietPeriod>d__92 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] private object <>2__current; public float quietSeconds; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] public TweaksPlugin <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] [return: <54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public <ReloadConfigAfterQuietPeriod>d__92(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if ((DateTime.UtcNow - <>4__this._lastCfgWriteUtc).TotalSeconds < (double)quietSeconds) { <>2__current = null; <>1__state = 1; return true; } try { if (<>4__this._configWatcher == null || !<>4__this._watcherReady) { return false; } <>4__this._configWatcher.EnableRaisingEvents = false; if ((Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()) { ((BaseUnityPlugin)<>4__this).Config.Reload(); <>4__this._ignoreEventsUntilUtc = DateTime.UtcNow.AddSeconds(1.0); ((BaseUnityPlugin)<>4__this).Config.Save(); } } catch { } finally { if (<>4__this._configWatcher != null) { <>4__this._configWatcher.EnableRaisingEvents = true; } <>4__this._reloadScheduled = false; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public const string ModGUID = "radamanto.Tweaks"; public const string ModName = "Tweaks"; public const string ModVersion = "1.1.4"; private readonly Harmony _harmony = new Harmony("radamanto.Tweaks"); private static bool _bootstrapped; public static ConfigEntry<bool> CE_BossAltarsProtection_Enabled; public static ConfigEntry<float> CE_BossAltarsProtection_Radius; internal static ConfigEntry<bool> CE_ProtectedAreaObjects_Enabled; internal static ConfigEntry<float> CE_ProtectedAreaObjects_Radius; internal static ConfigEntry<string> CE_ProtectedAreaObjects_Locations; internal static ConfigEntry<string> CE_ProtectedAreaObjects_Vegetations; public static ConfigEntry<bool> CE_Plants_IgnoreBiome; public static ConfigEntry<bool> CE_AllFaction_Enabled; public static ConfigEntry<Faction> CE_AllFaction_AnimalsVeg; public static ConfigEntry<Faction> CE_AllFaction_ForestMonsters; public static ConfigEntry<Faction> CE_AllFaction_Undead; public static ConfigEntry<Faction> CE_AllFaction_Demon; public static ConfigEntry<Faction> CE_AllFaction_MountainMonsters; public static ConfigEntry<Faction> CE_AllFaction_SeaMonsters; public static ConfigEntry<Faction> CE_AllFaction_PlainsMonsters; public static ConfigEntry<Faction> CE_AllFaction_Boss; public static ConfigEntry<Faction> CE_AllFaction_MistlandsMonsters; public static ConfigEntry<bool> CE_TrashOnDel_Enabled; public static ConfigEntry<KeyCode> CE_TrashOnDel_Key; public static ConfigEntry<bool> CE_TrashOnDel_Confirm; public static ConfigEntry<bool> CE_TrashOnDel_AllowHotbar; public static ConfigEntry<bool> CE_FloatItems_Enabled; public static ConfigEntry<bool> CE_ClockHud_Enabled; public static ConfigEntry<bool> CE_ClockHud_ShowDay; public static ConfigEntry<bool> CE_ClockHud_ShowRealTime; public static ConfigEntry<bool> CE_ClockHud_ShowGameTime; public static ConfigEntry<int> CE_ClockHud_FontSize; public static ConfigEntry<string> CE_ClockHud_LabelDay; public static ConfigEntry<string> CE_ClockHud_LabelGameTime; public static ConfigEntry<string> CE_ClockHud_LabelRealTime; public static ConfigEntry<string> CE_ClockHud_ColorDay; public static ConfigEntry<string> CE_ClockHud_ColorGameTime; public static ConfigEntry<string> CE_ClockHud_ColorRealTime; public static ConfigEntry<float> CE_ClockHud_IconSize; public static ConfigEntry<bool> CE_ClockHud_ShowIcon; public static ConfigEntry<float> CE_AutoPickupRange; public static ConfigEntry<bool> CE_ComfortRange_Enabled; public static ConfigEntry<float> CE_ComfortRange_Radius; public static ConfigEntry<bool> CE_SkillDeathLoss_Enabled; public static ConfigEntry<float> CE_SkillDeathLoss_Factor; public static ConfigEntry<float> CE_SkillGain_Swords; public static ConfigEntry<float> CE_SkillGain_Knives; public static ConfigEntry<float> CE_SkillGain_Clubs; public static ConfigEntry<float> CE_SkillGain_Polearms; public static ConfigEntry<float> CE_SkillGain_Spears; public static ConfigEntry<float> CE_SkillGain_Blocking; public static ConfigEntry<float> CE_SkillGain_Axes; public static ConfigEntry<float> CE_SkillGain_Bows; public static ConfigEntry<float> CE_SkillGain_Crossbows; public static ConfigEntry<float> CE_SkillGain_Unarmed; public static ConfigEntry<float> CE_SkillGain_ElementalMagic; public static ConfigEntry<float> CE_SkillGain_BloodMagic; public static ConfigEntry<float> CE_SkillGain_Pickaxes; public static ConfigEntry<float> CE_SkillGain_WoodCutting; public static ConfigEntry<float> CE_SkillGain_Run; public static ConfigEntry<float> CE_SkillGain_Jump; public static ConfigEntry<float> CE_SkillGain_Sneak; public static ConfigEntry<float> CE_SkillGain_Swim; public static ConfigEntry<float> CE_SkillGain_Fishing; public static ConfigEntry<float> CE_SkillGain_Crafting; public static ConfigEntry<float> CE_SkillGain_Cooking; public static ConfigEntry<float> CE_SkillGain_Farming; public static ConfigEntry<float> CE_SkillGain_Dodge; public static ConfigEntry<float> CE_SkillGain_Ride; public static ConfigEntry<bool> CE_JoinMessage_Enabled; public static ConfigEntry<string> CE_JoinMessage_Text; public static ConfigEntry<bool> CE_ForcePlayerPins_Enabled; public static ConfigEntry<bool> CE_AdminBypass; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] internal static ConfigSync ConfigSync; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] private static ConfigEntry<bool> _serverConfigLocked; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] private FileSystemWatcher _configWatcher; private DateTime _lastCfgWriteUtc = DateTime.MinValue; private bool _reloadScheduled; private bool _watcherReady; private DateTime _ignoreEventsUntilUtc = DateTime.MinValue; public static bool IsLocalPlayerAdmin() { return ConfigSync != null && ConfigSync.IsAdmin; } public static bool GetAdminBypass() { return CE_AdminBypass.Value; } public static bool GetForcePlayerPins() { return CE_ForcePlayerPins_Enabled.Value; } public static bool GetBossAltarsProtectionEnabled() { return CE_BossAltarsProtection_Enabled.Value; } internal static bool GetProtectedAreaObjectsEnabled() { return CE_ProtectedAreaObjects_Enabled.Value; } private void Awake() { Localizer.Load(); if (!_bootstrapped) { _bootstrapped = true; SetupServerSyncAndWatcher(); CE_AdminBypass = Cfg("01 - General", "01.01 - AdminBypass", defaultValue: true, "If true, admins bypass supported Tweaks restrictions."); CE_ForcePlayerPins_Enabled = Cfg("02 - MapPins", "02.01 - ForceAllPlayersVisible", defaultValue: false, "Forces players to keep their public map position enabled."); CE_JoinMessage_Enabled = Cfg("03 - JoinMessage", "03.01 - Enabled", defaultValue: false, "Enables the join message."); CE_JoinMessage_Text = Cfg("03 - JoinMessage", "03.02 - Text", "A player has arrived.", "Join message text."); CE_Plants_IgnoreBiome = Cfg("04 - Plants", "04.01 - IgnoreBiome", defaultValue: true, "Allows planting in any biome."); CE_AllFaction_Enabled = Cfg("05 - FactionRemap", "05.01 - Enabled", defaultValue: false, "Enables faction remapping for creatures."); CE_AllFaction_AnimalsVeg = Cfg<Faction>("05 - FactionRemap", "05.02 - AnimalsVegToFaction", (Faction)1, "Faction used for passive wildlife."); CE_AllFaction_ForestMonsters = Cfg<Faction>("05 - FactionRemap", "05.03 - ForestMonstersToFaction", (Faction)2, "Faction used for Black Forest creatures."); CE_AllFaction_Undead = Cfg<Faction>("05 - FactionRemap", "05.04 - UndeadToFaction", (Faction)3, "Faction used for undead creatures."); CE_AllFaction_Demon = Cfg<Faction>("05 - FactionRemap", "05.05 - DemonToFaction", (Faction)4, "Faction used for Demon creatures."); CE_AllFaction_MountainMonsters = Cfg<Faction>("05 - FactionRemap", "05.06 - MountainMonstersToFaction", (Faction)5, "Faction used for Mountain creatures."); CE_AllFaction_SeaMonsters = Cfg<Faction>("05 - FactionRemap", "05.07 - SeaMonstersToFaction", (Faction)6, "Faction used for ocean creatures."); CE_AllFaction_PlainsMonsters = Cfg<Faction>("05 - FactionRemap", "05.08 - PlainsMonstersToFaction", (Faction)7, "Faction used for Plains creatures."); CE_AllFaction_Boss = Cfg<Faction>("05 - FactionRemap", "05.09 - BossToFaction", (Faction)8, "Faction used for bosses."); CE_AllFaction_MistlandsMonsters = Cfg<Faction>("05 - FactionRemap", "05.10 - MistlandsMonstersToFaction", (Faction)9, "Faction used for Mistlands creatures."); CE_TrashOnDel_Enabled = Cfg("06 - Trash", "06.01 - DeleteWithDelKey", defaultValue: true, "Allows deleting the dragged item using a key."); CE_TrashOnDel_Key = Cfg<KeyCode>("06 - Trash", "06.02 - DeleteKey", (KeyCode)127, "Key used to delete the dragged item.", synced: false); CE_TrashOnDel_Confirm = Cfg("06 - Trash", "06.03 - ConfirmDelete", defaultValue: false, "Asks for confirmation before deleting.", synced: false); CE_TrashOnDel_AllowHotbar = Cfg("06 - Trash", "06.04 - AllowDeleteHotbar", defaultValue: false, "Allows deleting items from the hotbar."); CE_FloatItems_Enabled = Cfg("07 - FloatItems", "07.01 - Enabled", defaultValue: true, "Makes dropped items float in water."); CE_ClockHud_Enabled = Cfg("08 - ClockHud", "08.01 - Enabled", defaultValue: true, "Shows a simple clock at the top center of the screen."); CE_ClockHud_ShowDay = Cfg("08 - ClockHud", "08.02 - ShowDay", defaultValue: true, "Shows the in-game day number."); CE_ClockHud_ShowGameTime = Cfg("08 - ClockHud", "08.03 - ShowGameTime", defaultValue: true, "Shows the in-game time."); CE_ClockHud_ShowRealTime = Cfg("08 - ClockHud", "08.04 - ShowRealTime", defaultValue: true, "Shows the real (system) time."); CE_ClockHud_FontSize = Cfg("08 - ClockHud", "08.05 - FontSize", 28, "Clock font size.", synced: false); CE_ClockHud_LabelDay = Cfg("08 - ClockHud", "08.06 - LabelDay", "Dia", "Label for the in-game day text."); CE_ClockHud_LabelGameTime = Cfg("08 - ClockHud", "08.07 - LabelGameTime", "Hora", "Label for the in-game time text."); CE_ClockHud_LabelRealTime = Cfg("08 - ClockHud", "08.08 - LabelRealTime", "Hora Real", "Label for the real time text."); CE_ClockHud_ColorDay = Cfg("08 - ClockHud", "08.09 - ColorDay", "#FFD700", "HEX color for the Day label. Formats: #RRGGBB.", synced: false); CE_ClockHud_ColorGameTime = Cfg("08 - ClockHud", "08.10 - ColorGameTime", "#FFD700", "HEX color for the Game Time label. Formats: #RRGGBB.", synced: false); CE_ClockHud_ColorRealTime = Cfg("08 - ClockHud", "08.11 - ColorRealTime", "#FFD700", "HEX color for the Real Time label. Formats: #RRGGBB.", synced: false); CE_ClockHud_ShowIcon = Cfg("08 - ClockHud", "08.12 - ShowIcon", defaultValue: true, "Shows the day/night icon."); CE_ClockHud_IconSize = Cfg("08 - ClockHud", "08.13 - IconSize", 34f, "Day/Night icon size in pixels.", synced: false); CE_AutoPickupRange = Cfg("09 - AutoPickupRange", "09.01 - Range", 6f, "Auto-pickup radius (meters). Vanilla is 2."); CE_ComfortRange_Enabled = Cfg("10 - ComfortRange", "10.01 - Enabled", defaultValue: true, "Enable global comfort search radius override."); CE_ComfortRange_Radius = Cfg("10 - ComfortRange", "10.02 - Radius", 25f, "Comfort search radius (meters). Vanilla is 10."); CE_SkillDeathLoss_Enabled = Cfg("11 - SkillDeathLoss", "11.01 - Enabled", defaultValue: true, "If true, overrides vanilla skill loss handling on death."); CE_SkillDeathLoss_Factor = Cfg("11 - SkillDeathLoss", "11.02 - LossFactor", 0.05f, "Fraction of each skill level lost on death. Vanilla is 0.05 (5%). Set 0 to disable skill loss."); CE_SkillGain_Swords = Cfg("12 - SkillGain", "12.01 - Swords", 1f, "Skill gain multiplier for Swords. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Knives = Cfg("12 - SkillGain", "12.02 - Knives", 1f, "Skill gain multiplier for Knives. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Clubs = Cfg("12 - SkillGain", "12.03 - Clubs", 1f, "Skill gain multiplier for Clubs. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Polearms = Cfg("12 - SkillGain", "12.04 - Polearms", 1f, "Skill gain multiplier for Polearms. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Spears = Cfg("12 - SkillGain", "12.05 - Spears", 1f, "Skill gain multiplier for Spears. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Blocking = Cfg("12 - SkillGain", "12.06 - Blocking", 1f, "Skill gain multiplier for Blocking. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Axes = Cfg("12 - SkillGain", "12.07 - Axes", 1f, "Skill gain multiplier for Axes. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Bows = Cfg("12 - SkillGain", "12.08 - Bows", 1f, "Skill gain multiplier for Bows. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Crossbows = Cfg("12 - SkillGain", "12.09 - Crossbows", 1f, "Skill gain multiplier for Crossbows. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Unarmed = Cfg("12 - SkillGain", "12.10 - Unarmed", 1f, "Skill gain multiplier for Unarmed. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_ElementalMagic = Cfg("12 - SkillGain", "12.11 - ElementalMagic", 1f, "Skill gain multiplier for Elemental Magic. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_BloodMagic = Cfg("12 - SkillGain", "12.12 - BloodMagic", 1f, "Skill gain multiplier for Blood Magic. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Pickaxes = Cfg("12 - SkillGain", "12.13 - Pickaxes", 1f, "Skill gain multiplier for Pickaxes. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_WoodCutting = Cfg("12 - SkillGain", "12.14 - WoodCutting", 1f, "Skill gain multiplier for Wood Cutting. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Run = Cfg("12 - SkillGain", "12.15 - Run", 1f, "Skill gain multiplier for Run. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Jump = Cfg("12 - SkillGain", "12.16 - Jump", 1f, "Skill gain multiplier for Jump. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Sneak = Cfg("12 - SkillGain", "12.17 - Sneak", 1f, "Skill gain multiplier for Sneak. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Swim = Cfg("12 - SkillGain", "12.18 - Swim", 1f, "Skill gain multiplier for Swim. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Fishing = Cfg("12 - SkillGain", "12.19 - Fishing", 1f, "Skill gain multiplier for Fishing. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Crafting = Cfg("12 - SkillGain", "12.20 - Crafting", 1f, "Skill gain multiplier for Crafting. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Cooking = Cfg("12 - SkillGain", "12.21 - Cooking", 1f, "Skill gain multiplier for Cooking. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Farming = Cfg("12 - SkillGain", "12.22 - Farming", 1f, "Skill gain multiplier for Farming. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Dodge = Cfg("12 - SkillGain", "12.23 - Dodge", 1f, "Skill gain multiplier for Dodge. Example: 0.75 = 75% of vanilla gain."); CE_SkillGain_Ride = Cfg("12 - SkillGain", "12.24 - Ride", 1f, "Skill gain multiplier for Ride. Example: 0.75 = 75% of vanilla gain."); CE_BossAltarsProtection_Enabled = Cfg("13 - AltarsProtection", "13.01 - BossAltarsProtectionEnabled", defaultValue: true, "Enables protection around boss altars for building and terrain modification."); CE_BossAltarsProtection_Radius = Cfg("13 - AltarsProtection", "13.02 - BossAltarsProtectionRadius", 50f, "Protection radius around boss altars for building and terrain modification."); CE_ProtectedAreaObjects_Enabled = Cfg("14 - ProtectedAreaObjects", "14.01 - Enabled", defaultValue: true, "Enable protection around configured locations and vegetation/object prefabs."); CE_ProtectedAreaObjects_Radius = Cfg("14 - ProtectedAreaObjects", "14.02 - Radius", 25f, "Protection radius around configured locations and vegetation/object prefabs."); CE_ProtectedAreaObjects_Locations = Cfg("14 - ProtectedAreaObjects", "14.03 - Locations", "", "Comma-separated Location names protected against building and terrain editing.\nExample: SunkenCrypt4,Crypt2,Crypt3,Crypt4,TrollCave02,MountainCave02,GoblinCamp2,Mistlands_Excavation1"); CE_ProtectedAreaObjects_Vegetations = Cfg("14 - ProtectedAreaObjects", "14.04 - Vegetations", "", "Comma-separated vegetation/object prefab names protected against building and terrain editing. Only prefabs with ZNetView are registered by this system.\nExample: rock4_copper,silvervein"); _harmony.PatchAll(); } } private void OnDestroy() { _configWatcher?.Dispose(); _configWatcher = null; } public void SetupServerSyncAndWatcher() { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown bool flag = false; try { ((BaseUnityPlugin)this).Config.SaveOnConfigSet = false; ConfigSync = new ConfigSync(((BaseUnityPlugin)this).Info.Metadata.GUID) { DisplayName = ((BaseUnityPlugin)this).Info.Metadata.Name, CurrentVersion = ((BaseUnityPlugin)this).Info.Metadata.Version.ToString(), MinimumRequiredVersion = ((BaseUnityPlugin)this).Info.Metadata.Version.ToString() }; _serverConfigLocked = ((BaseUnityPlugin)this).Config.Bind<bool>("01 - General", "LockConfiguration", true, new ConfigDescription("If true, the server locks synchronized configs.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Browsable = false } })); ConfigSync.AddLockingConfigEntry<bool>(_serverConfigLocked); SetupConfigWatcher(); flag = true; } catch { } finally { ((BaseUnityPlugin)this).Config.SaveOnConfigSet = true; if (flag && (Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()) { ((BaseUnityPlugin)this).Config.Save(); } } } protected ConfigEntry<T> Cfg<[<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] T>(string section, string key, T defaultValue, string description, bool synced = true) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown return config(section, key, defaultValue, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synced); } private ConfigEntry<T> config<[<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags); ConfigEntry<T> val2 = ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, val); try { SyncedConfigEntry<T> syncedConfigEntry = ConfigSync?.AddConfigEntry<T>(val2); if (syncedConfigEntry != null) { syncedConfigEntry.SynchronizedConfig = synchronizedSetting; } } catch { } return val2; } private void SetupConfigWatcher() { try { _configWatcher?.Dispose(); string configPath = Paths.ConfigPath; string fileName = Path.GetFileName(((BaseUnityPlugin)this).Config.ConfigFilePath); _configWatcher = new FileSystemWatcher(configPath, fileName) { IncludeSubdirectories = false, NotifyFilter = (NotifyFilters.FileName | NotifyFilters.Size | NotifyFilters.LastWrite | NotifyFilters.CreationTime) }; FileSystemEventHandler onChanged = [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] (object _, FileSystemEventArgs __) => { if (!(DateTime.UtcNow < _ignoreEventsUntilUtc)) { _lastCfgWriteUtc = DateTime.UtcNow; if (!_reloadScheduled) { _reloadScheduled = true; ((MonoBehaviour)this).StartCoroutine(ReloadConfigAfterQuietPeriod(0.75f)); } } }; _configWatcher.Changed += onChanged; _configWatcher.Created += onChanged; _configWatcher.Renamed += [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] (object _, RenamedEventArgs __) => { onChanged(_, __); }; _configWatcher.EnableRaisingEvents = true; _watcherReady = true; } catch { } } [IteratorStateMachine(typeof(<ReloadConfigAfterQuietPeriod>d__92))] private IEnumerator ReloadConfigAfterQuietPeriod(float quietSeconds) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ReloadConfigAfterQuietPeriod>d__92(0) { <>4__this = this, quietSeconds = quietSeconds }; } internal static float GetSkillMultiplier(SkillType skill) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected I4, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected I4, but got Unknown if (1 == 0) { } float result = (skill - 1) switch { 0 => CE_SkillGain_Swords.Value, 1 => CE_SkillGain_Knives.Value, 2 => CE_SkillGain_Clubs.Value, 3 => CE_SkillGain_Polearms.Value, 4 => CE_SkillGain_Spears.Value, 5 => CE_SkillGain_Blocking.Value, 6 => CE_SkillGain_Axes.Value, 7 => CE_SkillGain_Bows.Value, 13 => CE_SkillGain_Crossbows.Value, 10 => CE_SkillGain_Unarmed.Value, 8 => CE_SkillGain_ElementalMagic.Value, 9 => CE_SkillGain_BloodMagic.Value, 11 => CE_SkillGain_Pickaxes.Value, 12 => CE_SkillGain_WoodCutting.Value, _ => (skill - 100) switch { 2 => CE_SkillGain_Run.Value, 0 => CE_SkillGain_Jump.Value, 1 => CE_SkillGain_Sneak.Value, 3 => CE_SkillGain_Swim.Value, 4 => CE_SkillGain_Fishing.Value, 7 => CE_SkillGain_Crafting.Value, 5 => CE_SkillGain_Cooking.Value, 6 => CE_SkillGain_Farming.Value, 8 => CE_SkillGain_Dodge.Value, 10 => CE_SkillGain_Ride.Value, _ => 1f, }, }; if (1 == 0) { } return result; } } [HarmonyPatch(typeof(Character), "Awake")] internal static class AllFaction_CharacterFaction_Patch { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Postfix(Character __instance) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0050: 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) //IL_0052: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected I4, but got Unknown //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: 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_010c: Unknown result type (might be due to invalid IL or missing references) if (TweaksPlugin.CE_AllFaction_Enabled.Value && !((Object)(object)__instance == (Object)null) && !__instance.IsPlayer() && !__instance.IsTamed()) { Faction faction = __instance.m_faction; Faction val = faction; Faction val2 = faction; Faction val3 = val2; switch (val3 - 1) { case 0: val = TweaksPlugin.CE_AllFaction_AnimalsVeg.Value; break; case 1: val = TweaksPlugin.CE_AllFaction_ForestMonsters.Value; break; case 2: val = TweaksPlugin.CE_AllFaction_Undead.Value; break; case 3: val = TweaksPlugin.CE_AllFaction_Demon.Value; break; case 4: val = TweaksPlugin.CE_AllFaction_MountainMonsters.Value; break; case 5: val = TweaksPlugin.CE_AllFaction_SeaMonsters.Value; break; case 6: val = TweaksPlugin.CE_AllFaction_PlainsMonsters.Value; break; case 7: val = TweaksPlugin.CE_AllFaction_Boss.Value; break; case 8: val = TweaksPlugin.CE_AllFaction_MistlandsMonsters.Value; break; } if (val != faction) { __instance.m_faction = val; } } } } internal static class FloatItems { [HarmonyPatch(typeof(ItemDrop), "Awake")] private static class Patch_ItemDrop_Awake { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Postfix(ItemDrop __instance) { if (Enabled() && IsValidTarget(__instance) && !((Object)(object)((Component)__instance).GetComponent<Floating>() != (Object)null)) { ((Component)__instance).gameObject.AddComponent<Floating>(); } } } private static bool Enabled() { return TweaksPlugin.CE_FloatItems_Enabled.Value; } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static bool IsValidTarget(ItemDrop itemDrop) { if ((Object)(object)itemDrop == (Object)null) { return false; } GameObject gameObject = ((Component)itemDrop).gameObject; if ((Object)(object)gameObject == (Object)null) { return false; } return (Object)(object)gameObject.GetComponent<Piece>() == (Object)null && (Object)(object)gameObject.GetComponent<WearNTear>() == (Object)null && (Object)(object)gameObject.GetComponent<Rigidbody>() != (Object)null && (Object)(object)gameObject.GetComponentInChildren<Collider>() != (Object)null && (Object)(object)gameObject.GetComponent<ZNetView>() != (Object)null; } } [HarmonyPatch(typeof(Plant), "Awake")] internal static class PlantAnywhere_Patch { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Postfix(Plant __instance) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) if (!TweaksPlugin.CE_Plants_IgnoreBiome.Value) { return; } Biome val = (Biome)0; foreach (Biome value in Enum.GetValues(typeof(Biome))) { val = (Biome)(val | value); } __instance.m_biome = val; } } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] internal static class ProtectedZoneObjects { private const string MsgBuildBlocked = "$tweaks_protectedareaobjects_build_blocked"; private const string MsgTerrainBlocked = "$tweaks_protectedareaobjects_terrain_blocked"; private static readonly HashSet<Location> ActiveLocations = new HashSet<Location>(); private static readonly HashSet<ZNetView> ActiveVegetations = new HashSet<ZNetView>(); private static readonly HashSet<string> LocationNames = new HashSet<string>(StringComparer.Ordinal); private static readonly HashSet<string> VegetationNames = new HashSet<string>(StringComparer.Ordinal); private static string _cachedLocations = string.Empty; private static string _cachedVegetations = string.Empty; internal static void RegisterLocation(Location location) { if (Object.op_Implicit((Object)(object)location)) { RefreshLists(); string item = ProtectedZoneManager.Normalize(((Object)((Component)location).gameObject).name); if (LocationNames.Contains(item)) { ActiveLocations.Add(location); } } } internal static void UnregisterLocation(Location location) { if (Object.op_Implicit((Object)(object)location)) { ActiveLocations.Remove(location); } } internal static void RegisterVegetation(ZNetView znv) { if (Object.op_Implicit((Object)(object)znv)) { RefreshLists(); string item = ProtectedZoneManager.Normalize(((Object)((Component)znv).gameObject).name); if (VegetationNames.Contains(item)) { ActiveVegetations.Add(znv); } } } internal static void UnregisterVegetation(ZNetView znv) { if (Object.op_Implicit((Object)(object)znv)) { ActiveVegetations.Remove(znv); } } internal static bool IsBlocked(Vector3 point, out ProtectedZoneBlock block) { //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) block = default(ProtectedZoneBlock); if (!Enabled()) { return false; } if (ProtectedZoneManager.Bypass()) { return false; } RefreshLists(); float radius = GetRadius(); if (radius <= 0f) { return false; } foreach (Location activeLocation in ActiveLocations) { if (!Object.op_Implicit((Object)(object)activeLocation) || Utils.DistanceXZ(((Component)activeLocation).transform.position, point) > radius) { continue; } block = new ProtectedZoneBlock(ProtectedZoneKind.Object, "$tweaks_protectedareaobjects_build_blocked", "$tweaks_protectedareaobjects_terrain_blocked"); return true; } foreach (ZNetView activeVegetation in ActiveVegetations) { if (!Object.op_Implicit((Object)(object)activeVegetation) || Utils.DistanceXZ(((Component)activeVegetation).transform.position, point) > radius) { continue; } block = new ProtectedZoneBlock(ProtectedZoneKind.Object, "$tweaks_protectedareaobjects_build_blocked", "$tweaks_protectedareaobjects_terrain_blocked"); return true; } return false; } private static bool Enabled() { try { return TweaksPlugin.GetProtectedAreaObjectsEnabled(); } catch { return true; } } private static float GetRadius() { try { return Mathf.Max(0f, TweaksPlugin.CE_ProtectedAreaObjects_Radius.Value); } catch { return 100f; } } private static void RefreshLists() { string locationsRaw = GetLocationsRaw(); string vegetationsRaw = GetVegetationsRaw(); if (!string.Equals(_cachedLocations, locationsRaw, StringComparison.Ordinal)) { _cachedLocations = locationsRaw; ProtectedZoneManager.Rebuild(LocationNames, locationsRaw); } if (!string.Equals(_cachedVegetations, vegetationsRaw, StringComparison.Ordinal)) { _cachedVegetations = vegetationsRaw; ProtectedZoneManager.Rebuild(VegetationNames, vegetationsRaw); } } private static string GetLocationsRaw() { try { return TweaksPlugin.CE_ProtectedAreaObjects_Locations.Value ?? string.Empty; } catch { return string.Empty; } } private static string GetVegetationsRaw() { try { return TweaksPlugin.CE_ProtectedAreaObjects_Vegetations.Value ?? string.Empty; } catch { return string.Empty; } } } internal enum ProtectedZoneKind { BossAltar, Object } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] internal readonly struct ProtectedZoneBlock { internal readonly ProtectedZoneKind Kind; internal readonly string BuildMessage; internal readonly string TerrainMessage; internal ProtectedZoneBlock(ProtectedZoneKind kind, string buildMessage, string terrainMessage) { Kind = kind; BuildMessage = buildMessage; TerrainMessage = terrainMessage; } } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] internal static class ProtectedZoneManager { internal static bool TryGetBlock(Vector3 point, out ProtectedZoneBlock block) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) if (ProtectedZoneBossAltar.IsBlocked(point, out block)) { return true; } if (ProtectedZoneObjects.IsBlocked(point, out block)) { return true; } block = default(ProtectedZoneBlock); return false; } internal static void ShowBuildBlocked(ProtectedZoneBlock block) { Show(block.BuildMessage); } internal static void ShowTerrainBlocked(ProtectedZoneBlock block) { Show(block.TerrainMessage); } internal static bool Bypass() { try { return TweaksPlugin.GetAdminBypass() && TweaksPlugin.IsLocalPlayerAdmin(); } catch { return false; } } internal static string Normalize(string name) { if (string.IsNullOrEmpty(name)) { return string.Empty; } return name.EndsWith("(Clone)", StringComparison.Ordinal) ? name.Substring(0, name.Length - "(Clone)".Length).TrimEnd(Array.Empty<char>()) : name; } internal static void Rebuild(HashSet<string> target, string raw) { target.Clear(); if (string.IsNullOrWhiteSpace(raw)) { return; } string[] array = raw.Split(new char[1] { ',' }); for (int i = 0; i < array.Length; i++) { string text = Normalize(array[i].Trim()); if (text.Length > 0) { target.Add(text); } } } private static void Show(string message) { Player localPlayer = Player.m_localPlayer; if (Object.op_Implicit((Object)(object)localPlayer)) { ((Character)localPlayer).Message((MessageType)2, message, 0, (Sprite)null); } } } [HarmonyPatch(typeof(Location), "Awake")] internal static class ProtectedZonePatchLocationAwake { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Postfix(Location __instance) { ProtectedZoneBossAltar.Register(__instance); ProtectedZoneObjects.RegisterLocation(__instance); } } [HarmonyPatch(typeof(Location), "OnDestroy")] internal static class ProtectedZonePatchLocationOnDestroy { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Prefix(Location __instance) { ProtectedZoneBossAltar.Unregister(__instance); ProtectedZoneObjects.UnregisterLocation(__instance); } } [HarmonyPatch(typeof(ZNetView), "Awake")] internal static class ProtectedZonePatchZNetViewAwake { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Postfix(ZNetView __instance) { ProtectedZoneObjects.RegisterVegetation(__instance); } } [HarmonyPatch(typeof(ZNetView), "OnDestroy")] internal static class ProtectedZonePatchZNetViewOnDestroy { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Prefix(ZNetView __instance) { ProtectedZoneObjects.UnregisterVegetation(__instance); } } [HarmonyPatch(typeof(Player), "TryPlacePiece")] internal static class ProtectedZonePatchPlayerTryPlacePiece { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static bool Prefix(Player __instance, Piece piece, ref bool __result) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)__instance) || !Object.op_Implicit((Object)(object)piece)) { return true; } __instance.UpdatePlacementGhost(true); GameObject val = AccessTools.FieldRefAccess<Player, GameObject>("m_placementGhost").Invoke(__instance); if (!Object.op_Implicit((Object)(object)val)) { return true; } if (!ProtectedZoneManager.TryGetBlock(val.transform.position, out var block)) { return true; } ProtectedZoneManager.ShowBuildBlocked(block); __result = false; return false; } } [HarmonyPatch(typeof(TerrainComp), "RPC_ApplyOperation")] internal static class ProtectedZonePatchTerrainApplyOperation { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static bool Prefix(TerrainComp __instance, long sender, ZPackage pkg) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)__instance) || pkg == null) { return true; } ZPackage val = new ZPackage(pkg.GetArray()); Vector3 point = val.ReadVector3(); if (!ProtectedZoneManager.TryGetBlock(point, out var block)) { return true; } ProtectedZoneManager.ShowTerrainBlocked(block); return false; } } [HarmonyPatch(typeof(Skills), "LowerAllSkills")] internal static class Tweaks_Skills_LowerAllSkills_Patch { [HarmonyPriority(500)] private static bool Prefix(ref float __0) { if (TweaksPlugin.CE_SkillDeathLoss_Enabled == null || !TweaksPlugin.CE_SkillDeathLoss_Enabled.Value) { return true; } float num = ((TweaksPlugin.CE_SkillDeathLoss_Factor != null) ? TweaksPlugin.CE_SkillDeathLoss_Factor.Value : 0.05f); if (num < 0f) { num = 0f; } if (num == 0f) { return false; } __0 = num; return true; } } [HarmonyPatch(typeof(Skills), "Clear")] internal static class Tweaks_Skills_Clear_Patch { [HarmonyPriority(500)] private static bool Prefix() { if (TweaksPlugin.CE_SkillDeathLoss_Enabled == null || !TweaksPlugin.CE_SkillDeathLoss_Enabled.Value) { return true; } return false; } } [HarmonyPatch(typeof(Skills), "RaiseSkill")] internal static class Tweaks_SkillGain_Patch { private static void Prefix(ref SkillType skillType, ref float factor) { if (skillType && (int)skillType != 999) { factor *= TweaksPlugin.GetSkillMultiplier(skillType); } } } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] internal static class TrashOnDel { [HarmonyPatch(typeof(InventoryGui), "Hide")] [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] private static class Patch_InventoryGui_Hide { private static void Postfix() { CloseDialog(); } } [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(0)] [HarmonyPatch(typeof(InventoryGui), "UpdateItemDrag")] private static class Patch_InventoryGui_UpdateItemDrag { [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] private static void Postfix(InventoryGui __instance, ItemData ___m_dragItem, Inventory ___m_dragInventory, int ___m_dragAmount, GameObject ___m_dragGo) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Invalid comparison between Unknown and I4 //IL_0069: Unknown result type (might be due to invalid IL or missing references) if (Enabled() && !((Object)(object)___m_dragGo == (Object)null) && ___m_dragItem != null && ___m_dragInventory != null && ___m_dragInventory.ContainsItem(___m_dragItem) && !_dialogOpen) { KeyCode value = TweaksPlugin.CE_TrashOnDel_Key.Value; if ((int)value != 0 && ZInput.GetKeyDown(value, true)) { TryRequestDelete(___m_dragItem, ___m_dragInventory, ___m_dragAmount); } } } } [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] private static GameObject _dialog; private static bool _dialogOpen; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] private static ItemData _pendingItem; [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(2)] private static Inventory _pendingInv; private static int _pendingAmount; private static readonly MethodInfo MI_SetupDragItem = AccessTools.Method(typeof(InventoryGui), "SetupDragItem", (Type[])null, (Type[])null); private static readonly MethodInfo MI_UpdateCraftingPanel = AccessTools.Method(typeof(InventoryGui), "UpdateCraftingPanel", new Type[1] { typeof(bool) }, (Type[])null); private static bool Enabled() { return TweaksPlugin.CE_TrashOnDel_Enabled.Value; } private static void CloseDialog() { _dialogOpen = false; if ((Object)(object)_dialog != (Object)null) { Object.Destroy((Object)(object)_dialog); _dialog = null; } _pendingItem = null; _pendingInv = null; _pendingAmount = 0; } private static void DoDeleteNow() { if ((Object)(object)InventoryGui.instance == (Object)null) { CloseDialog(); return; } if ((Object)(object)Player.m_localPlayer == (Object)null) { CloseDialog(); return; } if (_pendingItem == null || _pendingInv == null) { CloseDialog(); return; } if (_pendingAmount <= 0) { CloseDialog(); return; } if (!_pendingInv.ContainsItem(_pendingItem)) { CloseDialog(); return; } if (!TweaksPlugin.CE_TrashOnDel_AllowHotbar.Value && _pendingItem.m_gridPos.y == 0) { CloseDialog(); return; } Player localPlayer = Player.m_localPlayer; ((Humanoid)localPlayer).RemoveEquipAction(_pendingItem); ((Humanoid)localPlayer).UnequipItem(_pendingItem, false); if (_pendingAmount >= _pendingItem.m_stack) { _pendingInv.RemoveItem(_pendingItem); } else { _pendingInv.RemoveItem(_pendingItem, _pendingAmount); } _pendingInv.Changed(); MI_SetupDragItem.Invoke(InventoryGui.instance, new object[3] { null, null, 0 }); MI_UpdateCraftingPanel.Invoke(InventoryGui.instance, new object[1] { false }); CloseDialog(); } private static void ShowConfirmDialog(ItemData item, int amount) { //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Expected O, but got Unknown //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Expected O, but got Unknown //IL_0227: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)InventoryGui.instance == (Object)null || _dialogOpen) { return; } Transform splitPanel = InventoryGui.instance.m_splitPanel; if ((Object)(object)splitPanel == (Object)null) { return; } _dialog = Object.Instantiate<GameObject>(((Component)splitPanel).gameObject, ((Component)InventoryGui.instance).transform); ((Object)_dialog).name = "TweaksTrashConfirm"; _dialogOpen = true; Transform obj = _dialog.transform.Find("win_bkg/Button_ok"); Button val = ((obj != null) ? ((Component)obj).GetComponent<Button>() : null); if ((Object)(object)val != (Object)null) { ((UnityEventBase)val.onClick).RemoveAllListeners(); ((UnityEvent)val.onClick).AddListener(new UnityAction(DoDeleteNow)); TextMeshProUGUI componentInChildren = ((Component)val).GetComponentInChildren<TextMeshProUGUI>(); if ((Object)(object)componentInChildren != (Object)null) { string text = ((Localization.instance != null) ? Localization.instance.Localize("$menu_ok") : "OK"); ((TMP_Text)componentInChildren).text = ((string.IsNullOrWhiteSpace(text) || text.Contains("$")) ? "OK" : text); } } Transform obj2 = _dialog.transform.Find("win_bkg/Button_cancel"); Button val2 = ((obj2 != null) ? ((Component)obj2).GetComponent<Button>() : null); if ((Object)(object)val2 != (Object)null) { ((UnityEventBase)val2.onClick).RemoveAllListeners(); ((UnityEvent)val2.onClick).AddListener(new UnityAction(CloseDialog)); } Transform val3 = _dialog.transform.Find("win_bkg/Slider"); if ((Object)(object)val3 != (Object)null) { ((Component)val3).gameObject.SetActive(false); } Transform obj3 = _dialog.transform.Find("win_bkg/Text"); TextMeshProUGUI val4 = ((obj3 != null) ? ((Component)obj3).GetComponent<TextMeshProUGUI>() : null); if ((Object)(object)val4 != (Object)null) { string text2 = ((Localization.instance != null) ? Localization.instance.Localize("$tweaks_trash_title") : "Lixeira"); ((TMP_Text)val4).text = ((string.IsNullOrWhiteSpace(text2) || text2.Contains("$")) ? "Lixeira" : text2); ((Graphic)val4).color = Color.red; } Transform obj4 = _dialog.transform.Find("win_bkg/Icon_bkg/Icon"); Image val5 = ((obj4 != null) ? ((Component)obj4).GetComponent<Image>() : null); if ((Object)(object)val5 != (Object)null) { val5.sprite = item.GetIcon(); } Transform obj5 = _dialog.transform.Find("win_bkg/amount"); TextMeshProUGUI val6 = ((obj5 != null) ? ((Component)obj5).GetComponent<TextMeshProUGUI>() : null); if ((Object)(object)val6 != (Object)null) { ((TMP_Text)val6).text = $"{amount}/{item.m_shared.m_maxStackSize}"; } _dialog.SetActive(true); } private static void TryRequestDelete(ItemData dragItem, Inventory dragInv, int dragAmount) { if (Enabled() && !((Object)(object)InventoryGui.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null) && dragInv == ((Humanoid)Player.m_localPlayer).m_inventory && dragAmount > 0 && (TweaksPlugin.CE_TrashOnDel_AllowHotbar.Value || dragItem.m_gridPos.y != 0)) { _pendingItem = dragItem; _pendingInv = dragInv; _pendingAmount = dragAmount; if (TweaksPlugin.CE_TrashOnDel_Confirm.Value) { ShowConfirmDialog(dragItem, dragAmount); } else { DoDeleteNow(); } } } } public class Tweaks_ForcePlayerPins { [HarmonyPatch(typeof(Player), "OnSpawned")] public static class Patch_Player_OnSpawned { private static void Postfix() { if (TweaksPlugin.GetForcePlayerPins() && (!TweaksPlugin.GetAdminBypass() || !TweaksPlugin.IsLocalPlayerAdmin()) && !((Object)(object)ZNet.instance == (Object)null)) { ZNet.instance.SetPublicReferencePosition(true); } } } [HarmonyPatch(typeof(ZNet), "SetPublicReferencePosition")] public static class Patch_ZNet_SetPublicReferencePosition { private static void Prefix(ref bool pub) { if (TweaksPlugin.GetForcePlayerPins() && (!TweaksPlugin.GetAdminBypass() || !TweaksPlugin.IsLocalPlayerAdmin())) { pub = true; } } } } [HarmonyPatch(typeof(Game), "UpdateRespawn")] [<51133548-6862-41f1-ad48-c161465c1812>NullableContext(1)] [<54661faf-19be-4503-9c8b-d5f1b3245000>Nullable(0)] internal static class Tweaks_JoinMessage { private static readonly MethodInfo MI_ChatSendText = AccessTools.Method(typeof(Chat), "SendText", new Type[2] { typeof(Type), typeof(string) }, (Type[])null); private static readonly CodeMatch ArrivalTokenMatch = new CodeMatch((OpCode?)OpCodes.Ldstr, (object)"$text_player_arrived", (string)null); private static readonly CodeMatch SendTextMatch = new CodeMatch((OpCode?)OpCodes.Callvirt, (object)MI_ChatSendText, (string)null); [HarmonyTranspiler] private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { ArrivalTokenMatch }); if (!val.IsValid) { return val.InstructionEnumeration(); } val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { SendTextMatch }); if (!val.IsValid) { return val.InstructionEnumeration(); } val.SetInstruction(Transpilers.EmitDelegate<Action<Chat, Type, string>>((Action<Chat, Type, string>)SendJoinMessage)); return val.InstructionEnumeration(); } private static void SendJoinMessage(Chat chat, Type type, string originalText) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)chat == (Object)null) { return; } ConfigEntry<bool> cE_JoinMessage_Enabled = TweaksPlugin.CE_JoinMessage_Enabled; if (cE_JoinMessage_Enabled == null || !cE_JoinMessage_Enabled.Value) { chat.SendText(type, originalText); return; } string text = TweaksPlugin.CE_JoinMessage_Text?.Value ?? string.Empty; if (!string.IsNullOrWhiteSpace(text)) { chat.SendText(type, text.Trim()); } } } } namespace Microsoft.CodeAnalysis { [<dacbe4d9-0477-495f-aa3a-4f3326743ae6>Embedded] [CompilerGenerated] internal sealed class <dacbe4d9-0477-495f-aa3a-4f3326743ae6>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<dacbe4d9-0477-495f-aa3a-4f3326743ae6>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <5da726ca-268e-4d69-965f-f6cea3305165>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <5da726ca-268e-4d69-965f-f6cea3305165>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <5da726ca-268e-4d69-965f-f6cea3305165>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [CompilerGenerated] [<dacbe4d9-0477-495f-aa3a-4f3326743ae6>Embedded] internal sealed class <c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContextAttribute : Attribute { public readonly byte Flag; public <c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContextAttribute(byte P_0) { Flag = P_0; } } [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] [<dacbe4d9-0477-495f-aa3a-4f3326743ae6>Embedded] [CompilerGenerated] internal sealed class <d3e25c43-42e7-46b9-beae-57202d7ab1f0>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <d3e25c43-42e7-46b9-beae-57202d7ab1f0>RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ServerSync { [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(1)] [PublicAPI] [<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(0)] internal abstract class OwnConfigEntryBase { [<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(2)] public object LocalBaseValue; public bool SynchronizedConfig = true; public abstract ConfigEntryBase BaseConfig { get; } } [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(1)] [PublicAPI] [<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(0)] internal class SyncedConfigEntry<[<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(2)] 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; base..ctor(); } public void AssignLocalValue(T value) { if (LocalBaseValue == null) { Value = value; } else { LocalBaseValue = value; } } } [<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(0)] [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(2)] internal abstract class CustomSyncedValueBase { public object LocalBaseValue; [<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(1)] public readonly string Identifier; [<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(1)] 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; [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(1)] 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] [<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(0)] [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(1)] internal sealed class CustomSyncedValue<[<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(2)] 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; } [<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(0)] [PublicAPI] [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(1)] internal class ConfigSync { [HarmonyPatch(typeof(ZRpc), "HandlePackage")] [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(0)] private static class SnatchCurrentlyHandlingRPC { [<5da726ca-268e-4d69-965f-f6cea3305165>Nullable(2)] public static ZRpc currentRpc; [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(1)] [HarmonyPrefix] private static void Prefix(ZRpc __instance) { currentRpc = __instance; } } [HarmonyPatch(typeof(ZNet), "Awake")] [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(0)] internal static class RegisterRPCPatch { [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(1)] [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()); } [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(1)] 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)); } } [<c9350a16-fb4f-495c-ae0d-074adcc75394>NullableContext(1)] 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