using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("SignEditor")] [assembly: AssemblyDescription("Enhanced Valheim sign editor with colors, sizes, emojis, and rich-text editing.")] [assembly: AssemblyCompany("LEGIOmods")] [assembly: AssemblyProduct("SignEditor")] [assembly: AssemblyCopyright("Copyright © 2026 LEGIOmods")] [assembly: ComVisible(false)] [assembly: Guid("4fcb2435-77bf-4d04-af4c-5f34fb7ef7dc")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyMetadata("AI_Assisted_Creation", "This assembly was partially created with the assistance of Generative AI for code changes, localization, documentation, and package preparation.")] [assembly: AssemblyMetadata("AI_Model_Vendor", "OpenAI")] [assembly: AssemblyMetadata("AI_Agent", "OpenAI Codex")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace SignEditor { [BepInPlugin("legiomods.signeditor", "SignEditor", "1.0.0")] public sealed class SignEditorPlugin : BaseUnityPlugin { private readonly struct ColorChoice { internal readonly string EnglishName; internal readonly string GermanName; internal readonly string HexTag; internal ColorChoice(string englishName, string germanName, string hex) { EnglishName = englishName; GermanName = germanName; HexTag = "<" + hex + ">"; } } private readonly struct EmojiChoice { internal readonly string Value; internal readonly string EnglishLabel; internal readonly string GermanLabel; internal EmojiChoice(string value, string englishLabel, string germanLabel) { Value = value; EnglishLabel = englishLabel; GermanLabel = germanLabel; } } private static class TextInputAccessor { private static FieldInfo inputFieldInfo; private static FieldInfo panelInfo; private static MethodInfo isVisibleMethod; private static MethodInfo setTextMethod; private static MethodInfo onEnterMethod; private static PropertyInfo textProperty; private static PropertyInfo caretProperty; private static PropertyInfo selectionFocusProperty; private static PropertyInfo selectionAnchorProperty; private static MethodInfo activateMethod; private static CanvasGroup blockedPanelGroup; private static bool panelGroupWasAdded; private static bool previousInteractable; private static bool previousBlocksRaycasts; internal static bool IsTextInputOpen() { TextInput instance = TextInput.instance; if (!Object.op_Implicit((Object)(object)instance)) { return false; } isVisibleMethod = isVisibleMethod ?? typeof(TextInput).GetMethod("IsVisible", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (isVisibleMethod != null) { object obj = isVisibleMethod.Invoke(instance, null); if (obj is bool) { return (bool)obj; } } GameObject panel = GetPanel(); if (Object.op_Implicit((Object)(object)panel)) { return panel.activeInHierarchy; } return false; } internal static void BlockUnderlyingPanel() { if (Object.op_Implicit((Object)(object)blockedPanelGroup)) { return; } GameObject panel = GetPanel(); if (Object.op_Implicit((Object)(object)panel)) { blockedPanelGroup = panel.GetComponent(); panelGroupWasAdded = !Object.op_Implicit((Object)(object)blockedPanelGroup); if (panelGroupWasAdded) { blockedPanelGroup = panel.AddComponent(); } previousInteractable = blockedPanelGroup.interactable; previousBlocksRaycasts = blockedPanelGroup.blocksRaycasts; blockedPanelGroup.interactable = false; blockedPanelGroup.blocksRaycasts = true; } } internal static void UnblockUnderlyingPanel() { if (Object.op_Implicit((Object)(object)blockedPanelGroup)) { if (panelGroupWasAdded) { Object.Destroy((Object)(object)blockedPanelGroup); } else { blockedPanelGroup.interactable = previousInteractable; blockedPanelGroup.blocksRaycasts = previousBlocksRaycasts; } blockedPanelGroup = null; panelGroupWasAdded = false; } } internal static string GetText() { object inputField = GetInputField(); if (inputField == null) { return null; } return (textProperty?.GetValue(inputField, null) as string) ?? string.Empty; } internal static void ReplaceText(string value) { object inputField = GetInputField(); if (inputField != null) { string text = value ?? string.Empty; textProperty?.SetValue(inputField, text, null); setTextMethod = setTextMethod ?? typeof(TextInput).GetMethod("setText", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); setTextMethod?.Invoke(TextInput.instance, new object[1] { text }); SetCaret(inputField, text.Length); activateMethod?.Invoke(inputField, null); } } internal static void Confirm() { TextInput instance = TextInput.instance; if (Object.op_Implicit((Object)(object)instance)) { onEnterMethod = onEnterMethod ?? typeof(TextInput).GetMethod("OnEnter", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); onEnterMethod?.Invoke(instance, null); } } private static object GetInputField() { TextInput instance = TextInput.instance; if (!Object.op_Implicit((Object)(object)instance)) { return null; } inputFieldInfo = inputFieldInfo ?? typeof(TextInput).GetField("m_inputField", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); object obj = inputFieldInfo?.GetValue(instance); if (obj == null) { return null; } Type type = obj.GetType(); textProperty = textProperty ?? type.GetProperty("text", BindingFlags.Instance | BindingFlags.Public); caretProperty = caretProperty ?? type.GetProperty("caretPosition", BindingFlags.Instance | BindingFlags.Public); selectionFocusProperty = selectionFocusProperty ?? type.GetProperty("selectionFocusPosition", BindingFlags.Instance | BindingFlags.Public); selectionAnchorProperty = selectionAnchorProperty ?? type.GetProperty("selectionAnchorPosition", BindingFlags.Instance | BindingFlags.Public); activateMethod = activateMethod ?? type.GetMethod("ActivateInputField", BindingFlags.Instance | BindingFlags.Public); return obj; } private static GameObject GetPanel() { TextInput instance = TextInput.instance; if (!Object.op_Implicit((Object)(object)instance)) { return null; } panelInfo = panelInfo ?? typeof(TextInput).GetField("m_panel", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); object? obj = panelInfo?.GetValue(instance); return (GameObject)((obj is GameObject) ? obj : null); } private static int GetCaret(object inputField, int fallback) { object obj = selectionFocusProperty?.GetValue(inputField, null) ?? caretProperty?.GetValue(inputField, null); if (obj is int) { return (int)obj; } return fallback; } private static void SetCaret(object inputField, int position) { caretProperty?.SetValue(inputField, position, null); selectionAnchorProperty?.SetValue(inputField, position, null); selectionFocusProperty?.SetValue(inputField, position, null); } } public const string PluginGuid = "legiomods.signeditor"; public const string PluginName = "SignEditor"; public const string PluginVersion = "1.0.0"; private static Harmony harmony; private static Sign lastEditedSign; private static float lastSignInteractTime; private readonly EmojiChoice[][] emojiRows = new EmojiChoice[4][] { new EmojiChoice[7] { E("↑", "Up", "Hoch"), E("↓", "Down", "Runter"), E("←", "Left", "Links"), E("→", "Right", "Rechts"), E("❤\ufe0f", "Heart", "Herz"), E("\ud83e\udd55", "Carrot", "Karotte"), E("\ud83e\uddc5", "Onion", "Zwiebel") }, new EmojiChoice[7] { E("⚡", "Lightning", "Blitz"), E("⚒\ufe0f", "Hammer", "Hammer"), E("⚙\ufe0f", "Gear", "Zahnrad"), E("⛓\ufe0f", "Chain", "Kette"), E("\ud83d\udee1\ufe0f", "Shield", "Schild"), E("\ud83c\udff9", "Bow", "Bogen"), E("\ud83d\udde1\ufe0f", "Dagger", "Dolch") }, new EmojiChoice[7] { E("⚔\ufe0f", "Swords", "Schwerter"), E("\ud83e\ude9a", "Saw", "Säge"), E("\ud83d\udca3", "Bomb", "Bombe"), E("\ud83e\uddd9\u200d♂\ufe0f", "Mage", "Magier"), E("\ud83c\udf44", "Mushroom", "Pilz"), E("\ud83c\udf53", "Berry", "Beere"), E("\ud83c\udf47", "Grapes", "Trauben") }, new EmojiChoice[5] { E("\ud83e\uded8", "Beans", "Bohnen"), E("\ud83c\udf31", "Sprout", "Keim"), E("\ud83e\ude84", "Magic", "Zauber"), E("\ud83c\udf3e", "Grain", "Korn"), E("\ud83d\udc80", "Skull", "Totenkopf") } }; private readonly ColorChoice[] colors = new ColorChoice[7] { new ColorChoice("White", "Weiß", "#FFFFFF"), new ColorChoice("Red", "Rot", "#FF0000"), new ColorChoice("Yellow", "Gelb", "#E5FF00"), new ColorChoice("Blue", "Blau", "#6495ED"), new ColorChoice("Orange", "Orange", "#FFB90F"), new ColorChoice("Green", "Grün", "#00FF00"), new ColorChoice("Black", "Schwarz", "#000000") }; private int selectedColor; private int fontSize = 10; private string editText = string.Empty; private string markupText = string.Empty; private bool editorInitialized; private Vector2 editorScroll; private Rect editorRect; private GUIStyle overlayStyle; private GUIStyle panelStyle; private GUIStyle titleStyle; private GUIStyle buttonStyle; private GUIStyle selectedStyle; private GUIStyle labelStyle; private GUIStyle previewStyle; private Font editorFont; private Texture2D overlayTexture; private Texture2D panelTexture; private Texture2D buttonTexture; private Texture2D selectedTexture; private void Awake() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown editorRect = new Rect(0f, 0f, 1380f, 900f); harmony = new Harmony("legiomods.signeditor"); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"SignEditor 1.0.0 loaded."); } private void OnDestroy() { TextInputAccessor.UnblockUnderlyingPanel(); Harmony obj = harmony; if (obj != null) { obj.UnpatchSelf(); } } private void OnGUI() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) if (ShouldShowEditor()) { if (!editorInitialized) { LoadExistingText(); } EnsureStyles(); GUI.depth = -2000; GUI.ModalWindow(493812, new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), new WindowFunction(DrawOverlay), string.Empty, overlayStyle); } } internal static void RememberSign(Sign sign) { lastEditedSign = sign; lastSignInteractTime = Time.time; } private bool ShouldShowEditor() { if (!Object.op_Implicit((Object)(object)lastEditedSign) || Time.time - lastSignInteractTime > 600f || !TextInputAccessor.IsTextInputOpen()) { bool num = editorInitialized; lastEditedSign = null; editorInitialized = false; if (num) { TextInputAccessor.UnblockUnderlyingPanel(); RestoreGameCursor(); } return false; } Cursor.visible = true; Cursor.lockState = (CursorLockMode)0; return true; } private void DrawOverlay(int id) { //IL_004d: 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_0058: Unknown result type (might be due to invalid IL or missing references) float num = Mathf.Min(1380f, (float)Screen.width - 20f); float num2 = Mathf.Min(900f, (float)Screen.height - 20f); editorRect = new Rect(((float)Screen.width - num) * 0.5f, ((float)Screen.height - num2) * 0.5f, num, num2); GUILayout.BeginArea(editorRect, panelStyle); DrawEditor(); GUILayout.EndArea(); } private void DrawEditor() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) GUILayout.Label(Text("Sign Editor", "Schild-Editor"), titleStyle, Array.Empty()); GUILayout.Space(8f); float num = Mathf.Max(180f, ((Rect)(ref editorRect)).height - 345f); editorScroll = GUILayout.BeginScrollView(editorScroll, false, false, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(num) }); GUILayout.Label(Text("Color", "Farbe"), labelStyle, Array.Empty()); for (int i = 0; i < colors.Length; i += 7) { GUILayout.BeginHorizontal(Array.Empty()); for (int j = i; j < Mathf.Min(i + 7, colors.Length); j++) { DrawColorButton(j); } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } GUILayout.Space(10f); GUILayout.BeginHorizontal(Array.Empty()); GUILayout.Label(Text("Size", "Größe"), labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(120f) }); if (GUILayout.Button("-10", buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(76f), GUILayout.Height(50f) })) { fontSize = Mathf.Max(1, fontSize - 10); RebuildMarkup(); } if (GUILayout.Button("-", buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(64f), GUILayout.Height(50f) })) { fontSize = Mathf.Max(1, fontSize - 1); RebuildMarkup(); } GUILayout.Label(fontSize.ToString(), labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(56f) }); if (GUILayout.Button("+", buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(64f), GUILayout.Height(50f) })) { fontSize = Mathf.Min(9000, fontSize + 1); RebuildMarkup(); } if (GUILayout.Button("+10", buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(76f), GUILayout.Height(50f) })) { fontSize = Mathf.Min(9000, fontSize + 10); RebuildMarkup(); } GUILayout.EndHorizontal(); GUILayout.Space(14f); GUILayout.Label(Text("Insert emoji", "Emoji einfügen"), labelStyle, Array.Empty()); float num2 = Mathf.Clamp((((Rect)(ref editorRect)).width - 135f) / 7f, 90f, 175f); for (int k = 0; k < emojiRows.Length; k++) { GUILayout.BeginHorizontal(Array.Empty()); for (int l = 0; l < emojiRows[k].Length; l++) { EmojiChoice emojiChoice = emojiRows[k][l]; if (GUILayout.Button(Text(emojiChoice.EnglishLabel, emojiChoice.GermanLabel), buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(num2), GUILayout.Height(54f) })) { editText = (editText ?? string.Empty) + emojiChoice.Value; RebuildMarkup(); GUI.FocusControl("SignEditorMarkup"); } } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); GUILayout.Space(10f); GUILayout.Label(Text("Sign text (edit directly)", "Schild-Text (direkt bearbeiten)"), labelStyle, Array.Empty()); GUI.SetNextControlName("SignEditorMarkup"); string text = GUILayout.TextArea(markupText ?? string.Empty, previewStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(130f) }); if (!string.Equals(text, markupText, StringComparison.Ordinal)) { LoadMarkup(text); } GUILayout.Space(10f); GUILayout.BeginHorizontal(Array.Empty()); if (GUILayout.Button(Text("Apply & OK", "Übernehmen & OK"), selectedStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(60f) })) { TextInputAccessor.ReplaceText(markupText); TextInputAccessor.Confirm(); CloseEditor(); } if (GUILayout.Button(Text("Clear", "Leeren"), buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(60f) })) { editText = string.Empty; markupText = string.Empty; } GUILayout.EndHorizontal(); } private void CloseEditor() { lastEditedSign = null; editorInitialized = false; TextInputAccessor.UnblockUnderlyingPanel(); RestoreGameCursor(); } private static void RestoreGameCursor() { Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; } private void DrawColorButton(int index) { bool flag = selectedColor == index; string text = (flag ? "[x] " : "[ ] ") + Text(colors[index].EnglishName, colors[index].GermanName); float num = Mathf.Clamp((((Rect)(ref editorRect)).width - 135f) / 7f, 90f, 175f); if (GUILayout.Button(text, flag ? selectedStyle : buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(num), GUILayout.Height(50f) })) { selectedColor = index; RebuildMarkup(); } } private void LoadExistingText() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) selectedColor = 0; fontSize = 10; editorScroll = Vector2.zero; string text = TextInputAccessor.GetText(); if (text == null && Object.op_Implicit((Object)(object)lastEditedSign)) { text = lastEditedSign.GetText(); } LoadMarkup(text ?? string.Empty); TextInputAccessor.BlockUnderlyingPanel(); editorInitialized = true; } private void LoadMarkup(string value) { markupText = value ?? string.Empty; string text = markupText; for (int i = 0; i < colors.Length; i++) { if (text.StartsWith(colors[i].HexTag, StringComparison.OrdinalIgnoreCase)) { selectedColor = i; text = text.Substring(colors[i].HexTag.Length); break; } } if (text.StartsWith("'); if (num > 7) { SelectNamedColor(text.Substring(7, num - 7)); text = text.Substring(num + 1); } } if (text.StartsWith("'); if (num2 > 6 && int.TryParse(text.Substring(6, num2 - 6), out var result)) { fontSize = Mathf.Clamp(result, 1, 9000); text = text.Substring(num2 + 1); } } editText = text; } private void SelectNamedColor(string value) { string text = (value ?? string.Empty).Trim().ToLowerInvariant(); string text2; switch (text) { case "weiss": case "white": text2 = "#FFFFFF"; break; case "red": case "rot": text2 = "#FF0000"; break; case "yellow": case "gelb": text2 = "#E5FF00"; break; case "blau": case "blue": text2 = "#6495ED"; break; case "orange": text2 = "#FFB90F"; break; case "green": case "gruen": text2 = "#00FF00"; break; case "black": case "schwarz": text2 = "#000000"; break; default: text2 = text; break; } for (int i = 0; i < colors.Length; i++) { if (string.Equals(colors[i].HexTag, "<" + text2 + ">", StringComparison.OrdinalIgnoreCase)) { selectedColor = i; break; } } } private void RebuildMarkup() { string text = editText ?? string.Empty; markupText = (string.IsNullOrEmpty(text) ? string.Empty : (colors[selectedColor].HexTag + "" + text)); } private static EmojiChoice E(string value, string englishLabel, string germanLabel) { return new EmojiChoice(value, englishLabel, germanLabel); } private static string Text(string english, string german) { if (Localization.instance == null) { return english; } string text = Localization.instance.GetSelectedLanguage() ?? string.Empty; if (!text.Equals("German", StringComparison.OrdinalIgnoreCase) && !text.Equals("Deutsch", StringComparison.OrdinalIgnoreCase) && !text.StartsWith("de", StringComparison.OrdinalIgnoreCase)) { return english; } return german; } private void EnsureStyles() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown //IL_00de: Expected O, but got Unknown //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Expected O, but got Unknown //IL_0127: Expected O, but got Unknown //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Expected O, but got Unknown //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Expected O, but got Unknown //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: 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_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Expected O, but got Unknown //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Expected O, but got Unknown //IL_029f: Unknown result type (might be due to invalid IL or missing references) //IL_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Expected O, but got Unknown if (panelStyle == null) { overlayTexture = MakeTexture(new Color(0f, 0f, 0f, 0.45f)); panelTexture = MakeTexture(new Color(0.08f, 0.075f, 0.065f, 0.98f)); buttonTexture = MakeTexture(new Color(0.2f, 0.18f, 0.15f, 0.98f)); selectedTexture = MakeTexture(new Color(0.38f, 0.27f, 0.12f, 1f)); GUIStyle val = new GUIStyle(GUI.skin.box); val.normal.background = overlayTexture; val.normal.textColor = Color.white; val.padding = new RectOffset(0, 0, 0, 0); overlayStyle = val; GUIStyle val2 = new GUIStyle(GUI.skin.box); val2.normal.background = panelTexture; val2.normal.textColor = Color.white; val2.padding = new RectOffset(24, 24, 22, 22); panelStyle = val2; GUIStyle val3 = new GUIStyle(GUI.skin.label) { fontSize = 36, fontStyle = (FontStyle)1 }; val3.normal.textColor = new Color(1f, 0.82f, 0.42f, 1f); titleStyle = val3; GUIStyle val4 = new GUIStyle(GUI.skin.label) { fontSize = 24 }; val4.normal.textColor = new Color(0.92f, 0.88f, 0.78f, 1f); labelStyle = val4; GUIStyle val5 = new GUIStyle(GUI.skin.button) { fontSize = 22, wordWrap = true }; val5.normal.background = buttonTexture; val5.normal.textColor = Color.white; val5.hover.background = selectedTexture; val5.hover.textColor = Color.white; val5.active.background = selectedTexture; val5.active.textColor = Color.white; buttonStyle = val5; GUIStyle val6 = new GUIStyle(buttonStyle); val6.normal.background = selectedTexture; val6.normal.textColor = Color.white; selectedStyle = val6; editorFont = Font.CreateDynamicFontFromOSFont(new string[3] { "Arial", "Segoe UI Emoji", "Segoe UI Symbol" }, 26); previewStyle = new GUIStyle(GUI.skin.textArea) { font = editorFont, fontSize = 24, wordWrap = true }; } } private static Texture2D MakeTexture(Color color) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown Texture2D val = new Texture2D(1, 1, (TextureFormat)4, false); val.SetPixel(0, 0, color); val.Apply(); return val; } } [HarmonyPatch(typeof(Sign), "Interact")] internal static class SignInteractPatch { private static void Postfix(Sign __instance, bool __result) { if (__result) { SignEditorPlugin.RememberSign(__instance); } } } }