Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of MirrorDecor v1.3.3
BepInEx/plugins/MirrorDecor/MirrorDecor.dll
Decompiled 2 years agousing 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 System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalLib.Extras; using LethalLib.Modules; using LethalSettings.UI; using LethalSettings.UI.Components; using Microsoft.CodeAnalysis; using MirrorDecor.Compatibility; using MoreCompany; using MoreCompany.Cosmetics; using UnityEngine; using UnityEngine.Rendering; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("MirrorDecor")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("A mod for Lethal Company that adds a working mirror decoration that you can buy for your ship!")] [assembly: AssemblyFileVersion("1.3.3.0")] [assembly: AssemblyInformationalVersion("1.3.3+6dfd43fe551629c2f729958253d8276330245757")] [assembly: AssemblyProduct("MirrorDecor")] [assembly: AssemblyTitle("MirrorDecor")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.3.3.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace MirrorDecor { public class Config { public static ConfigEntry<bool> mirrorEnabled; public static ConfigEntry<int> mirrorPrice; public static ConfigEntry<bool> alwaysAvailable; public static ConfigEntry<int> resolution; public static void Load() { mirrorEnabled = Plugin.config.Bind<bool>("Mirror", "MirrorEnabled", true, "Will you be able to purchase the mirror?"); mirrorPrice = Plugin.config.Bind<int>("Mirror", "MirrorPrice", 100, "What will be the price of the mirror?"); alwaysAvailable = Plugin.config.Bind<bool>("Mirror", "AlwaysAvailable", true, "Is the mirror always available to purchase from the store?"); resolution = Plugin.config.Bind<int>("Mirror", "MirrorResolution", 512, "What is the resolution/quality of the mirror image? (ex. 2000 = 2000x2000 pixels)"); } } public class CustomUnlockable { public string name = ""; public string unlockablePath = ""; public string infoPath = ""; public Action<UnlockableItem> unlockableAction = delegate { }; public bool enabled = true; public int unlockCost = -1; public CustomUnlockable(string name, string unlockablePath, string infoPath, Action<UnlockableItem> action = null, int unlockCost = -1) { this.name = name; this.unlockablePath = unlockablePath; this.infoPath = infoPath; if (action != null) { unlockableAction = action; } this.unlockCost = unlockCost; } public static CustomUnlockable Add(string name, string unlockablePath, string infoPath = null, Action<UnlockableItem> action = null, int unlockCost = -1, bool enabled = true) { return new CustomUnlockable(name, unlockablePath, infoPath, action, unlockCost) { enabled = enabled }; } } public class MirrorScript : MonoBehaviour { } [HarmonyPatch(typeof(PlayerControllerB), "SpawnPlayerAnimation")] internal class PlayerPatch { private static void Postfix(ref PlayerControllerB __instance) { if ((Object)(object)__instance == (Object)(object)GameNetworkManager.Instance.localPlayerController) { PlayerControllerB obj = __instance; ((Component)__instance).GetComponentInChildren<LODGroup>().enabled = false; ((Renderer)obj.thisPlayerModel).shadowCastingMode = (ShadowCastingMode)1; ((Component)obj.localVisor).GetComponentInChildren<Renderer>().shadowCastingMode = (ShadowCastingMode)0; ((Renderer)obj.thisPlayerModelLOD1).shadowCastingMode = (ShadowCastingMode)3; ((Renderer)obj.thisPlayerModelLOD2).enabled = false; ((Component)obj.thisPlayerModel).gameObject.layer = 23; ((Component)obj.thisPlayerModelArms).gameObject.layer = 5; } } } [BepInPlugin("quackandcheese.mirrordecor", "MirrorDecor", "1.3.3")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInProcess("Lethal Company.exe")] public class Plugin : BaseUnityPlugin { public class OnUpdateResolutionEventArgs : EventArgs { public int res; public OnUpdateResolutionEventArgs(int res) { this.res = res; } } public const string ModGUID = "quackandcheese.mirrordecor"; public const string ModName = "MirrorDecor"; public const string ModVersion = "1.3.3"; public const int MirrorCameraCullingMask = 565909343; public static AssetBundle Bundle; public static ConfigFile config; public static ManualLogSource logger; public static List<CustomUnlockable> customUnlockables; public const int MirrorMinRes = 8; public const int MirrorMaxRes = 1024; public static event EventHandler<OnUpdateResolutionEventArgs> OnUpdateResolution; private void Awake() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown Bundle = QuickLoadAssetBundle("mirror.assets"); logger = ((BaseUnityPlugin)this).Logger; config = ((BaseUnityPlugin)this).Config; Harmony val = new Harmony("quackandcheese.mirrordecor"); val.PatchAll(); if (Chainloader.PluginInfos.ContainsKey("me.swipez.melonloader.morecompany")) { try { val.PatchAll(typeof(CosmeticPatch)); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)ex); } } Config.Load(); RegisterItems(); if (Chainloader.PluginInfos.ContainsKey("com.willis.lc.lethalsettings")) { AddSetting(); } UpdateMirrorRes(Config.resolution.Value); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin MirrorDecor is loaded!"); } [MethodImpl(MethodImplOptions.NoInlining)] private void AddSetting() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //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_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0093: 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_00ad: Expected O, but got Unknown //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Expected O, but got Unknown ModSettingsConfig val = new ModSettingsConfig(); val.Name = "MirrorDecor"; val.Id = "quackandcheese.mirrordecor"; val.Version = "1.3.3"; val.Description = "Adds a working mirror decoration that you can buy for your ship!"; MenuComponent[] array = new MenuComponent[2]; HorizontalComponent val2 = new HorizontalComponent(); val2.Children = (MenuComponent[])(object)new MenuComponent[1] { (MenuComponent)new SliderComponent { Value = Config.resolution.Value, MinValue = 8f, MaxValue = 1024f, Text = "Mirror Resolution", OnValueChanged = delegate(SliderComponent self, float value) { UpdateMirrorRes((int)value); }, WholeNumbers = true, OnInitialize = delegate { UpdateMirrorRes(Config.resolution.Value); } } }; array[0] = (MenuComponent)val2; array[1] = (MenuComponent)new LabelComponent { Text = "The resolution/quality of the mirror image. Reduce size for better framerate." }; val.MenuComponents = (MenuComponent[])(object)array; ModMenu.RegisterMod(val, true, true); } private void UpdateMirrorRes(int res) { int num = Mathf.Clamp(res, 8, 1024); Resize(Bundle.LoadAsset<RenderTexture>("Assets/Mirror/Materials/Mirror.renderTexture"), num, num); Config.resolution.Value = num; } private void RegisterItems() { customUnlockables = new List<CustomUnlockable> { CustomUnlockable.Add("Mirror", "Assets/Mirror/Unlockables/Mirror/Mirror.asset", "Assets/Mirror/Unlockables/Mirror/MirrorInfo.asset", null, Config.mirrorPrice.Value, Config.mirrorEnabled.Value) }; Bundle.LoadAsset<UnlockableItemDef>("Assets/Mirror/Unlockables/Mirror/Mirror.asset").unlockable.alwaysInStock = Config.alwaysAvailable.Value; foreach (CustomUnlockable customUnlockable in customUnlockables) { if (customUnlockable.enabled) { UnlockableItem unlockable = Bundle.LoadAsset<UnlockableItemDef>(customUnlockable.unlockablePath).unlockable; if ((Object)(object)unlockable.prefabObject != (Object)null) { NetworkPrefabs.RegisterNetworkPrefab(unlockable.prefabObject); } TerminalNode val = null; if (customUnlockable.infoPath != null) { val = Bundle.LoadAsset<TerminalNode>(customUnlockable.infoPath); } Unlockables.RegisterUnlockable(unlockable, (StoreType)2, (TerminalNode)null, (TerminalNode)null, val, customUnlockable.unlockCost); } } } public static T FindAsset<T>(string name) where T : Object { return Resources.FindObjectsOfTypeAll<T>().ToList().Find((T x) => ((Object)x).name == name); } public static AssetBundle QuickLoadAssetBundle(string assetBundleName) { return AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), assetBundleName)); } public static void Resize(RenderTexture renderTexture, int width, int height) { if (Object.op_Implicit((Object)(object)renderTexture)) { renderTexture.Release(); ((Texture)renderTexture).width = width; ((Texture)renderTexture).height = height; } } public void sendModInfo() { foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos) { if (pluginInfo.Value.Metadata.GUID.Contains("ModSync")) { try { List<string> list = new List<string> { "quackandcheese", "MirrorDecor" }; ((Component)pluginInfo.Value.Instance).BroadcastMessage("getModInfo", (object)list, (SendMessageOptions)1); break; } catch (Exception) { logger.LogInfo((object)"Failed to send info to ModSync, go yell at Minx"); break; } } } } } public static class PluginInfo { public const string PLUGIN_GUID = "MirrorDecor"; public const string PLUGIN_NAME = "MirrorDecor"; public const string PLUGIN_VERSION = "1.3.3"; } } namespace MirrorDecor.Compatibility { internal class CosmeticPatch { [HarmonyPatch(typeof(CosmeticApplication), "UpdateAllCosmeticVisibilities")] [HarmonyPostfix] [HarmonyWrapSafe] private static void Postfix(CosmeticApplication __instance, bool isLocalPlayer) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if ((int)__instance.parentType != 0 || !isLocalPlayer || !MainClass.cosmeticsSyncOther.Value) { return; } foreach (CosmeticInstance spawnedCosmetic in __instance.spawnedCosmetics) { if ((int)spawnedCosmetic.cosmeticType != 0 || !__instance.detachedHead) { ((Component)spawnedCosmetic).gameObject.SetActive(true); CosmeticRegistry.RecursiveLayerChange(((Component)spawnedCosmetic).transform, 23); } } } } }