Please disclose if your mod was created primarily 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.1
plugins/Tweaks.dll
Decompiled a day 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: ComVisible(false)] [assembly: AssemblyTrademark("")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyProduct("Tweaks")] [assembly: AssemblyFileVersion("1.1.1")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyDescription("")] [assembly: AssemblyTitle("Tweaks")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: Guid("E74EB49A-461D-48EA-85BC-F462D60C98C4")] [assembly: AssemblyCompany("Radamanto")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.1.0")] [module: <399655a9-ab83-4b3b-a603-21c80405e2af>RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<27200c69-0f7a-4604-885b-3ccd0a71ea0e>Embedded] internal sealed class <27200c69-0f7a-4604-885b-3ccd0a71ea0e>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<27200c69-0f7a-4604-885b-3ccd0a71ea0e>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <6e8281e4-ad61-4796-b0f6-fa0eefb28975>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <6e8281e4-ad61-4796-b0f6-fa0eefb28975>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <6e8281e4-ad61-4796-b0f6-fa0eefb28975>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [<27200c69-0f7a-4604-885b-3ccd0a71ea0e>Embedded] [CompilerGenerated] internal sealed class <dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContextAttribute : Attribute { public readonly byte Flag; public <dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContextAttribute(byte P_0) { Flag = P_0; } } [<27200c69-0f7a-4604-885b-3ccd0a71ea0e>Embedded] [CompilerGenerated] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class <399655a9-ab83-4b3b-a603-21c80405e2af>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <399655a9-ab83-4b3b-a603-21c80405e2af>RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Tweaks { [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] internal static class Tweaks_AssetLoader { [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>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: <6e8281e4-ad61-4796-b0f6-fa0eefb28975>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; } } } [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] [HarmonyPatch(typeof(Player), "AutoPickup")] [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] 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; } } [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(2)] internal static class ClockHud { [HarmonyPatch(typeof(Hud), "Awake")] [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(0)] private static class Patch_Hud_Awake { [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] private static void Postfix(Hud __instance) { if (!Enabled()) { TeardownUi(); } else { EnsureUi(__instance); } } } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(0)] [HarmonyPatch(typeof(Hud), "OnDestroy")] private static class Patch_Hud_OnDestroy { private static void Postfix() { TeardownUi(); } } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(0)] [HarmonyPatch(typeof(Hud), "Update")] private static class Patch_Hud_Update { [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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; } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] [return: <6e8281e4-ad61-4796-b0f6-fa0eefb28975>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; } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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); } } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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; } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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(); } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] private static int GetCurrentDaySafe(EnvMan envMan) { try { return envMan.GetCurrentDay(); } catch { return envMan.GetDay(); } } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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"); } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] private static string MonoDigits(string s) { return "<mspace=0.42em>" + s + "</mspace>"; } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] private static string NormalizeHexColor([<6e8281e4-ad61-4796-b0f6-fa0eefb28975>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; } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] private static string WrapColor(string text, string hexNoHash) { if (string.IsNullOrEmpty(hexNoHash)) { return text; } return "<color=#" + hexNoHash + ">" + text + "</color>"; } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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; } } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(1)] private CodeInstruction <>2__current; private int <>l__initialThreadId; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(new byte[] { 0, 1 })] private IEnumerable<CodeInstruction> instructions; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(new byte[] { 0, 1 })] public IEnumerable<CodeInstruction> <>3__instructions; private bool <replaced>5__1; private MethodInfo <mi>5__2; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>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: <6e8281e4-ad61-4796-b0f6-fa0eefb28975>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] [HarmonyPatch(typeof(SE_Rested), "GetNearbyComfortPieces")] [IteratorStateMachine(typeof(<GetNearbyComfortPieces_Transpiler>d__3))] [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] 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.1")] [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] public class TweaksPlugin : BaseUnityPlugin { [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(0)] private class ConfigurationManagerAttributes { public bool? Browsable = false; } [CompilerGenerated] private sealed class <ReloadConfigAfterQuietPeriod>d__84 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] private object <>2__current; public float quietSeconds; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] public TweaksPlugin <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] [return: <6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public <ReloadConfigAfterQuietPeriod>d__84(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.1"; private readonly Harmony _harmony = new Harmony("radamanto.Tweaks"); private static bool _bootstrapped; 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; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(2)] internal static ConfigSync ConfigSync; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(2)] private static ConfigEntry<bool> _serverConfigLocked; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>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; } 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."); _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<[<6e8281e4-ad61-4796-b0f6-fa0eefb28975>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<[<6e8281e4-ad61-4796-b0f6-fa0eefb28975>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 = [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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 += [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(0)] (object _, RenamedEventArgs __) => { onChanged(_, __); }; _configWatcher.EnableRaisingEvents = true; _watcherReady = true; } catch { } } [IteratorStateMachine(typeof(<ReloadConfigAfterQuietPeriod>d__84))] private IEnumerator ReloadConfigAfterQuietPeriod(float quietSeconds) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ReloadConfigAfterQuietPeriod>d__84(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 { [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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 { [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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; } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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 { [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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; } } [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); } } } [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] internal static class TrashOnDel { [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(0)] [HarmonyPatch(typeof(InventoryGui), "Hide")] private static class Patch_InventoryGui_Hide { private static void Postfix() { CloseDialog(); } } [HarmonyPatch(typeof(InventoryGui), "UpdateItemDrag")] [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(0)] private static class Patch_InventoryGui_UpdateItemDrag { [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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); } } } } [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(2)] private static GameObject _dialog; private static bool _dialogOpen; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(2)] private static ItemData _pendingItem; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>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; } } } } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(1)] [HarmonyPatch(typeof(Game), "UpdateRespawn")] [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] internal static class Tweaks_JoinMessage { private static readonly CodeMatch ArrivalMatch = new CodeMatch((OpCode?)OpCodes.Ldstr, (object)"I have arrived!", (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 //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[2] { ArrivalMatch, new CodeMatch((OpCode?)OpCodes.Callvirt, (object)null, (string)null) }); if (val.IsValid) { val.Advance(1).SetInstruction(Transpilers.EmitDelegate<Action>((Action)SendJoinMessage)); } return val.InstructionEnumeration(); } private static void SendJoinMessage() { ConfigEntry<bool> cE_JoinMessage_Enabled = TweaksPlugin.CE_JoinMessage_Enabled; if (cE_JoinMessage_Enabled != null && cE_JoinMessage_Enabled.Value && !((Object)(object)Chat.instance == (Object)null)) { string text = TweaksPlugin.CE_JoinMessage_Text?.Value ?? string.Empty; if (!string.IsNullOrWhiteSpace(text)) { Chat.instance.SendText((Type)1, text.Trim()); } } } } } namespace LocalizationManager { [PublicAPI] [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(0)] [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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; [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>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([<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(2)] [method: <dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(2)] [field: <6e8281e4-ad61-4796-b0f6-fa0eefb28975>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, [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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, [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>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 += [<dd109eff-d465-4da7-b2ed-701d4a2d426e>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: <6e8281e4-ad61-4796-b0f6-fa0eefb28975>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; } [<dd109eff-d465-4da7-b2ed-701d4a2d426e>NullableContext(2)] public static byte[] ReadEmbeddedFileBytes([<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(1)] string resourceFileName, Assembly containingAssembly = null) { using MemoryStream memoryStream = new MemoryStream(); if ((object)containingAssembly == null) { containingAssembly = Assembly.GetCallingAssembly(); } string text = containingAssembly.GetManifestResourceNames().FirstOrDefault([<dd109eff-d465-4da7-b2ed-701d4a2d426e>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 { [<6e8281e4-ad61-4796-b0f6-fa0eefb28975>Nullable(1)] public const string Version = "1.4.1"; } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<27b767c0-81fc-4a12-8d1c-f676a45576cf>Embedded] internal sealed class <27b767c0-81fc-4a12-8d1c-f676a45576cf>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<27b767c0-81fc-4a12-8d1c-f676a45576cf>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <0de56649-abde-4d39-bdde-5318585b5d2f>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <0de56649-abde-4d39-bdde-5318585b5d2f>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <0de56649-abde-4d39-bdde-5318585b5d2f>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [CompilerGenerated] [<27b767c0-81fc-4a12-8d1c-f676a45576cf>Embedded] internal sealed class <1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContextAttribute : Attribute { public readonly byte Flag; public <1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [<27b767c0-81fc-4a12-8d1c-f676a45576cf>Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class <cb54881b-a51d-4fcb-b606-cbfc256d332f>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <cb54881b-a51d-4fcb-b606-cbfc256d332f>RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ServerSync { [PublicAPI] [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(1)] [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(0)] internal abstract class OwnConfigEntryBase { [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] public object LocalBaseValue; public bool SynchronizedConfig = true; public abstract ConfigEntryBase BaseConfig { get; } } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(1)] [PublicAPI] [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(0)] internal class SyncedConfigEntry<[<0de56649-abde-4d39-bdde-5318585b5d2f>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; } } } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(2)] [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(0)] internal abstract class CustomSyncedValueBase { public object LocalBaseValue; [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(1)] public readonly string Identifier; [<0de56649-abde-4d39-bdde-5318585b5d2f>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; [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>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; }; } } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(1)] [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(0)] [PublicAPI] internal sealed class CustomSyncedValue<[<0de56649-abde-4d39-bdde-5318585b5d2f>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; } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(1)] [PublicAPI] [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(0)] internal class ConfigSync { [HarmonyPatch(typeof(ZRpc), "HandlePackage")] [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(0)] private static class SnatchCurrentlyHandlingRPC { [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] public static ZRpc currentRpc; [HarmonyPrefix] [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(1)] private static void Prefix(ZRpc __instance) { currentRpc = __instance; } } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(0)] [HarmonyPatch(typeof(ZNet), "Awake")] internal static class RegisterRPCPatch { [HarmonyPostfix] [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(1)] 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()); } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>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)); } } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>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(30f); if (!adminList.GetList().SequenceEqual(CurrentList)) { CurrentList = new List<string>(adminList.GetList()); List<ZNetPeer> adminPeer = ZNet.instance.GetPeers().Where(delegate(ZNetPeer p) { string hostName = p.m_rpc.GetSocket().GetHostName(); return ((object)listContainsId == null) ? adminList.Contains(hostName) : ((bool)listContainsId.Invoke(ZNet.instance, new object[2] { adminList, hostName })); }).ToList(); List<ZNetPeer> nonAdminPeer = ZNet.instance.GetPeers().Except(adminPeer).ToList(); SendAdmin(nonAdminPeer, isAdmin: false); SendAdmin(adminPeer, isAdmin: true); } } } } } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(0)] [HarmonyPatch(typeof(ZNet), "OnNewConnection")] private static class RegisterClientRPCPatch { [HarmonyPostfix] [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(1)] private static void Postfix(ZNet __instance, ZNetPeer peer) { if (__instance.IsServer()) { return; } foreach (ConfigSync configSync in configSyncs) { peer.m_rpc.Register<ZPackage>(configSync.Name + " ConfigSync", (Action<ZRpc, ZPackage>)configSync.RPC_FromServerConfigSync); } } } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(0)] private class ParsedConfigs { [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(new byte[] { 1, 1, 2 })] public readonly Dictionary<OwnConfigEntryBase, object> configValues = new Dictionary<OwnConfigEntryBase, object>(); [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(new byte[] { 1, 1, 2 })] public readonly Dictionary<CustomSyncedValueBase, object> customValues = new Dictionary<CustomSyncedValueBase, object>(); } [HarmonyPatch(typeof(ZNet), "Shutdown")] [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(0)] private class ResetConfigsOnShutdown { [HarmonyPostfix] private static void Postfix() { ProcessingServerUpdate = true; foreach (ConfigSync configSync in configSyncs) { configSync.resetConfigsFromServer(); configSync.IsSourceOfTruth = true; configSync.InitialSyncDone = false; } ProcessingServerUpdate = false; } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(0)] private class SendConfigsAfterLogin { [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(0)] private class BufferingSocket : ZPlayFabSocket, ISocket { public volatile bool finished = false; public volatile int versionMatchQueued = -1; public readonly List<ZPackage> Package = new List<ZPackage>(); public readonly ISocket Original; public BufferingSocket(ISocket original) { Original = original; ((ZPlayFabSocket)this)..ctor(); } public bool IsConnected() { return Original.IsConnected(); } public ZPackage Recv() { return Original.Recv(); } public int GetSendQueueSize() { return Original.GetSendQueueSize(); } public int GetCurrentSendRate() { return Original.GetCurrentSendRate(); } public bool IsHost() { return Original.IsHost(); } public void Dispose() { Original.Dispose(); } public bool GotNewData() { return Original.GotNewData(); } public void Close() { Original.Close(); } public string GetEndPointString() { return Original.GetEndPointString(); } public void GetAndResetStats(out int totalSent, out int totalRecv) { Original.GetAndResetStats(ref totalSent, ref totalRecv); } public void GetConnectionQuality(out float localQuality, out float remoteQuality, out int ping, out float outByteSec, out float inByteSec) { Original.GetConnectionQuality(ref localQuality, ref remoteQuality, ref ping, ref outByteSec, ref inByteSec); } public ISocket Accept() { return Original.Accept(); } public int GetHostPort() { return Original.GetHostPort(); } public bool Flush() { return Original.Flush(); } public string GetHostName() { return Original.GetHostName(); } public void VersionMatch() { if (finished) { Original.VersionMatch(); } else { versionMatchQueued = Package.Count; } } public void Send(ZPackage pkg) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown int pos = pkg.GetPos(); pkg.SetPos(0); int num = pkg.ReadInt(); if ((num == StringExtensionMethods.GetStableHashCode("PeerInfo") || num == StringExtensionMethods.GetStableHashCode("RoutedRPC") || num == StringExtensionMethods.GetStableHashCode("ZDOData")) && !finished) { ZPackage val = new ZPackage(pkg.GetArray()); val.SetPos(pos); Package.Add(val); } else { pkg.SetPos(pos); Original.Send(pkg); } } } [HarmonyPrefix] [HarmonyPriority(800)] private static void Prefix([<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(new byte[] { 2, 1, 1 })] ref Dictionary<Assembly, BufferingSocket> __state, ZNet __instance, ZRpc rpc) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Invalid comparison between Unknown and I4 if (!__instance.IsServer()) { return; } BufferingSocket bufferingSocket = new BufferingSocket(rpc.GetSocket()); AccessTools.DeclaredField(typeof(ZRpc), "m_socket").SetValue(rpc, bufferingSocket); object? obj = AccessTools.DeclaredMethod(typeof(ZNet), "GetPeer", new Type[1] { typeof(ZRpc) }, (Type[])null).Invoke(__instance, new object[1] { rpc }); ZNetPeer val = (ZNetPeer)((obj is ZNetPeer) ? obj : null); if (val != null && (int)ZNet.m_onlineBackend > 0) { FieldInfo fieldInfo = AccessTools.DeclaredField(typeof(ZNetPeer), "m_socket"); object? value = fieldInfo.GetValue(val); ZPlayFabSocket val2 = (ZPlayFabSocket)((value is ZPlayFabSocket) ? value : null); if (val2 != null) { typeof(ZPlayFabSocket).GetField("m_remotePlayerId").SetValue(bufferingSocket, val2.m_remotePlayerId); } fieldInfo.SetValue(val, bufferingSocket); } if (__state == null) { __state = new Dictionary<Assembly, BufferingSocket>(); } __state[Assembly.GetExecutingAssembly()] = bufferingSocket; } [HarmonyPostfix] private static void Postfix(Dictionary<Assembly, BufferingSocket> __state, ZNet __instance, ZRpc rpc) { ZNetPeer peer; if (__instance.IsServer()) { object obj = AccessTools.DeclaredMethod(typeof(ZNet), "GetPeer", new Type[1] { typeof(ZRpc) }, (Type[])null).Invoke(__instance, new object[1] { rpc }); peer = (ZNetPeer)((obj is ZNetPeer) ? obj : null); if (peer == null) { SendBufferedData(); } else { ((MonoBehaviour)__instance).StartCoroutine(sendAsync()); } } void SendBufferedData() { if (rpc.GetSocket() is BufferingSocket bufferingSocket) { AccessTools.DeclaredField(typeof(ZRpc), "m_socket").SetValue(rpc, bufferingSocket.Original); object? obj2 = AccessTools.DeclaredMethod(typeof(ZNet), "GetPeer", new Type[1] { typeof(ZRpc) }, (Type[])null).Invoke(__instance, new object[1] { rpc }); ZNetPeer val = (ZNetPeer)((obj2 is ZNetPeer) ? obj2 : null); if (val != null) { AccessTools.DeclaredField(typeof(ZNetPeer), "m_socket").SetValue(val, bufferingSocket.Original); } } BufferingSocket bufferingSocket2 = __state[Assembly.GetExecutingAssembly()]; bufferingSocket2.finished = true; for (int i = 0; i < bufferingSocket2.Package.Count; i++) { if (i == bufferingSocket2.versionMatchQueued) { bufferingSocket2.Original.VersionMatch(); } bufferingSocket2.Original.Send(bufferingSocket2.Package[i]); } if (bufferingSocket2.Package.Count == bufferingSocket2.versionMatchQueued) { bufferingSocket2.Original.VersionMatch(); } } IEnumerator sendAsync() { foreach (ConfigSync configSync in configSyncs) { List<PackageEntry> entries = new List<PackageEntry>(); if (configSync.CurrentVersion != null) { entries.Add(new PackageEntry { section = "Internal", key = "serverversion", type = typeof(string), value = configSync.CurrentVersion }); } MethodInfo listContainsId = AccessTools.DeclaredMethod(typeof(ZNet), "ListContainsId", (Type[])null, (Type[])null); SyncedList adminList = (SyncedList)AccessTools.DeclaredField(typeof(ZNet), "m_adminList").GetValue(ZNet.instance); entries.Add(new PackageEntry { section = "Internal", key = "lockexempt", type = typeof(bool), value = (((object)listContainsId == null) ? ((object)adminList.Contains(rpc.GetSocket().GetHostName())) : listContainsId.Invoke(ZNet.instance, new object[2] { adminList, rpc.GetSocket().GetHostName() })) }); ZPackage package = ConfigsToPackage(configSync.allConfigs.Select([<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(0)] (OwnConfigEntryBase c) => c.BaseConfig), configSync.allCustomValues, entries, partial: false); yield return ((MonoBehaviour)__instance).StartCoroutine(configSync.sendZPackage(new List<ZNetPeer> { peer }, package)); } SendBufferedData(); } } } [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(0)] private class PackageEntry { public string section = null; public string key = null; public Type type = null; [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] public object value; } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(0)] [HarmonyPatch(typeof(ConfigEntryBase), "GetSerializedValue")] private static class PreventSavingServerInfo { [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(1)] [HarmonyPrefix] private static bool Prefix(ConfigEntryBase __instance, ref string __result) { OwnConfigEntryBase ownConfigEntryBase = configData(__instance); if (ownConfigEntryBase == null || isWritableConfig(ownConfigEntryBase)) { return true; } __result = TomlTypeConverter.ConvertToString(ownConfigEntryBase.LocalBaseValue, __instance.SettingType); return false; } } [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(0)] [HarmonyPatch(typeof(ConfigEntryBase), "SetSerializedValue")] private static class PreventConfigRereadChangingValues { [<1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(1)] [HarmonyPrefix] private static bool Prefix(ConfigEntryBase __instance, string value) { OwnConfigEntryBase ownConfigEntryBase = configData(__instance); if (ownConfigEntryBase == null || ownConfigEntryBase.LocalBaseValue == null) { return true; } try { ownConfigEntryBase.LocalBaseValue = TomlTypeConverter.ConvertToValue(value, __instance.SettingType); } catch (Exception ex) { Debug.LogWarning((object)$"Config value of setting \"{__instance.Definition}\" could not be parsed and will be ignored. Reason: {ex.Message}; Value: {value}"); } return false; } } [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(0)] private class InvalidDeserializationTypeException : Exception { public string expected = null; public string received = null; public string field = ""; } public static bool ProcessingServerUpdate; public readonly string Name; [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] public string DisplayName; [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] public string CurrentVersion; [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] public string MinimumRequiredVersion; public bool ModRequired = false; private bool? forceConfigLocking; private bool isSourceOfTruth = true; private static readonly HashSet<ConfigSync> configSyncs; private readonly HashSet<OwnConfigEntryBase> allConfigs = new HashSet<OwnConfigEntryBase>(); private HashSet<CustomSyncedValueBase> allCustomValues = new HashSet<CustomSyncedValueBase>(); private static bool isServer; private static bool lockExempt; [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] private OwnConfigEntryBase lockedConfig = null; private const byte PARTIAL_CONFIGS = 1; private const byte FRAGMENTED_CONFIG = 2; private const byte COMPRESSED_CONFIG = 4; private readonly Dictionary<string, SortedDictionary<int, byte[]>> configValueCache = new Dictionary<string, SortedDictionary<int, byte[]>>(); [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(new byte[] { 1, 0, 1 })] private readonly List<KeyValuePair<long, string>> cacheExpirations = new List<KeyValuePair<long, string>>(); private static long packageCounter; public bool IsLocked { get { bool? flag = forceConfigLocking; bool num; if (!flag.HasValue) { if (lockedConfig == null) { goto IL_0052; } num = ((IConvertible)lockedConfig.BaseConfig.BoxedValue).ToInt32(CultureInfo.InvariantCulture) != 0; } else { num = flag.GetValueOrDefault(); } if (!num) { goto IL_0052; } int result = ((!lockExempt) ? 1 : 0); goto IL_0053; IL_0053: return (byte)result != 0; IL_0052: result = 0; goto IL_0053; } set { forceConfigLocking = value; } } public bool IsAdmin => lockExempt || isSourceOfTruth; public bool IsSourceOfTruth { get { return isSourceOfTruth; } private set { if (value != isSourceOfTruth) { isSourceOfTruth = value; this.SourceOfTruthChanged?.Invoke(value); } } } public bool InitialSyncDone { get; private set; } = false; [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] [method: <1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(2)] [field: <0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] public event Action<bool> SourceOfTruthChanged; [<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] [method: <1c0e0a90-007b-47bf-afa0-abe0807da3cf>NullableContext(2)] [field: <0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] private event Action lockedConfigChanged; static ConfigSync() { ProcessingServerUpdate = false; configSyncs = new HashSet<ConfigSync>(); lockExempt = false; packageCounter = 0L; RuntimeHelpers.RunClassConstructor(typeof(VersionCheck).TypeHandle); } public ConfigSync(string name) { Name = name; configSyncs.Add(this); new VersionCheck(this); } public SyncedConfigEntry<T> AddConfigEntry<[<0de56649-abde-4d39-bdde-5318585b5d2f>Nullable(2)] T>(ConfigEntry<T> configEntry) { OwnConfigEntryBase ownConfigEntryBase = configData((ConfigEntryBase)(object)configEntry); SyncedConfigEntry<T> syncedEntry = ownConfigEntryBase as SyncedConfigEntry<T>; if (syncedEntry == null) { syncedEntry = new SyncedConfigEntry<T>(configEntry); AccessTools.DeclaredField(type