using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using Zorro.Core; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Carl")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Carl")] [assembly: AssemblyTitle("Carl")] [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 Carl { [BepInPlugin("Carl", "Carl", "1.0.1")] public class Plugin : BaseUnityPlugin { public const string Id = "Carl"; internal static Texture2D FaceTexture; internal static Texture2D BlankTexture; private readonly Harmony harmony = new Harmony("Carl"); internal static ManualLogSource Log { get; private set; } internal static Plugin Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)this); return; } Instance = this; Log = ((BaseUnityPlugin)this).Logger; LoadTextures(); harmony.PatchAll(Assembly.GetExecutingAssembly()); Log.LogInfo((object)"Carl loaded."); } private static void LoadTextures() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) FaceTexture = LoadEmbeddedTexture("carl_face.png"); BlankTexture = new Texture2D(128, 128, (TextureFormat)4, false); ((Object)BlankTexture).name = "Carl_blank"; ((Object)BlankTexture).hideFlags = (HideFlags)61; Color32[] pixels = Enumerable.Repeat(new Color32((byte)0, (byte)0, (byte)0, (byte)0), 16384).ToArray(); BlankTexture.SetPixels32(pixels); BlankTexture.Apply(false, false); } private static Texture2D LoadEmbeddedTexture(string fileName) { //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected O, but got Unknown Assembly executingAssembly = Assembly.GetExecutingAssembly(); string text = executingAssembly.GetManifestResourceNames().FirstOrDefault((string n) => n.EndsWith(fileName, StringComparison.OrdinalIgnoreCase)); if (text == null) { Log.LogError((object)("Embedded texture not found: " + fileName)); return null; } try { using Stream stream = executingAssembly.GetManifestResourceStream(text); if (stream == null) { Log.LogError((object)("Could not open embedded resource stream: " + text)); return null; } byte[] array = new byte[stream.Length]; int num2; for (int num = 0; num < array.Length; num += num2) { num2 = stream.Read(array, num, array.Length - num); if (num2 <= 0) { break; } } Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false); if (!ImageConversion.LoadImage(val, array)) { Log.LogError((object)("Failed to decode embedded texture: " + text)); Object.Destroy((Object)(object)val); return null; } ((Object)val).name = "Carl_" + Path.GetFileNameWithoutExtension(fileName); ((Texture)val).wrapMode = (TextureWrapMode)1; ((Texture)val).filterMode = (FilterMode)1; ((Object)val).hideFlags = (HideFlags)61; Log.LogInfo((object)$"Loaded texture {((Object)val).name} ({((Texture)val).width}x{((Texture)val).height})."); return val; } catch (Exception arg) { Log.LogError((object)$"Failed to load embedded texture {text}: {arg}"); return null; } } } } namespace Carl.Patches { [HarmonyPatch] internal static class CustomizationPatch { private const string OptionPrefix = "Carl_option_"; private static void AddCustomizationOption(Type type, string key, Texture texture = null) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Invalid comparison between Unknown and I4 //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Invalid comparison between Unknown and I4 //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Invalid comparison between Unknown and I4 //IL_00f2: Unknown result type (might be due to invalid IL or missing references) Customization instance = Singleton.Instance; if ((Object)(object)instance == (Object)null) { return; } CustomizationOption[] list = instance.GetList(type); string optionName = "Carl_option_" + key; if (list != null && list.Any((CustomizationOption o) => (Object)(object)o != (Object)null && ((Object)o).name == optionName)) { return; } CustomizationOption val = ScriptableObject.CreateInstance(); ((Object)val).name = optionName; ((Object)val).hideFlags = (HideFlags)61; val.type = type; val.texture = texture; val.requiredAchievement = (ACHIEVEMENTTYPE)0; val.customRequirement = (CUSTOMREQUIREMENT)0; val.testLocked = false; val.drawUnderEye = false; val.color = Color.white; CustomizationOption[] array = ((IEnumerable)(((object)list) ?? ((object)new CustomizationOption[0]))).Concat((IEnumerable)(object)new CustomizationOption[1] { val }).ToArray(); if ((int)type != 10) { if ((int)type != 20) { if ((int)type != 30) { return; } instance.mouths = array; } else { instance.eyes = array; } } else { instance.accessories = array; } ManualLogSource log = Plugin.Log; if (log != null) { log.LogInfo((object)$"Added {type} customization option '{optionName}'."); } } [HarmonyPatch(typeof(GUIManager), "Start")] [HarmonyPostfix] private static void OnGUIManagerStart() { try { if (!((Object)(object)Plugin.FaceTexture == (Object)null)) { AddCustomizationOption((Type)10, "face", (Texture)(object)Plugin.FaceTexture); AddCustomizationOption((Type)30, "mouth", (Texture)(object)Plugin.BlankTexture); AddCustomizationOption((Type)20, "eyes"); } } catch (Exception arg) { ManualLogSource log = Plugin.Log; if (log != null) { log.LogError((object)$"Carl customization patch error: {arg}"); } } } } }