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 LCPosterEditor v1.0.3
LCPosterEditor.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("LCPosterEditor")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LCPosterEditor")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("80129ca5-58c6-4fee-bdbb-73f1029a0f5d")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace LCPosterEditor; internal class AtlasCreator { private static List<Image> posterImages = (from f in Directory.EnumerateFiles(Path.Combine(PluginInfo.PLUGIN_DIR, "Input", "posters")) select Image.FromFile(f)).ToList(); private static List<Image> tipImages = (from f in Directory.EnumerateFiles(Path.Combine(PluginInfo.PLUGIN_DIR, "Input", "tips")) select Image.FromFile(f)).ToList(); private static readonly int[] TIPS_SIZE = new int[2] { 796, 1024 }; private static readonly int[] POSTER_SIZE = new int[2] { 1024, 1024 }; private static readonly int[,] POSTER_OFFSETS = new int[5, 4] { { 0, 0, 341, 559 }, { 346, 0, 284, 559 }, { 641, 58, 274, 243 }, { 184, 620, 411, 364 }, { 632, 320, 372, 672 } }; private static ManualLogSource Logger { get; set; } public static void Init(ManualLogSource logger) { Logger = logger; Logger.LogInfo((object)"Poster and/or Tips images found, creating assets now..."); if (!Directory.EnumerateFileSystemEntries(Path.Combine(PluginInfo.PLUGIN_DIR, "LCPosterEditor", "posters")).Any() && Directory.EnumerateFileSystemEntries(Path.Combine(PluginInfo.PLUGIN_DIR, "Input", "posters")).Any()) { Logger.LogInfo((object)"Creating Poster Atlases..."); for (int i = 0; i < posterImages.Count; i++) { List<Image> list = new List<Image>(); for (int j = 0; j < 5; j++) { list.Add((Image)(object)ResizeImage(posterImages[(i + j) % posterImages.Count], POSTER_OFFSETS[j, 2], POSTER_OFFSETS[j, 3], Plugin.KeepAspectRatio.Value)); } CreatePosterAtlas(list, Path.Combine(PluginInfo.PLUGIN_DIR, "LCPosterEditor", "posters", $"{i}.png")); } Logger.LogInfo((object)"Poster Atlases Created!"); } if (!Directory.EnumerateFileSystemEntries(Path.Combine(PluginInfo.PLUGIN_DIR, "LCPosterEditor", "tips")).Any() && Directory.EnumerateFileSystemEntries(Path.Combine(PluginInfo.PLUGIN_DIR, "Input", "tips")).Any()) { Logger.LogInfo((object)"Creating Tip Files..."); for (int k = 0; k < tipImages.Count; k++) { CreateTipFile((Image)(object)ResizeImage(tipImages[k], TIPS_SIZE[0], TIPS_SIZE[1], Plugin.KeepAspectRatio.Value), Path.Combine(PluginInfo.PLUGIN_DIR, "LCPosterEditor", "tips", $"{k}.png")); } Logger.LogInfo((object)"Tip Files Created!"); } } private static void CreatePosterAtlas(List<Image> posters, string filename) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown Image val = (Image)new Bitmap(POSTER_SIZE[0], POSTER_SIZE[1]); Graphics val2 = Graphics.FromImage(val); try { for (int i = 0; i < posters.Count; i++) { val2.DrawImage(posters[i], new Point(POSTER_OFFSETS[i, 0], POSTER_OFFSETS[i, 1])); } } finally { ((IDisposable)val2)?.Dispose(); } val.Save(filename); } private static void CreateTipFile(Image tip, string filename) { tip.Save(filename); } private static Bitmap ResizeImage(Image image, int width, int height, bool keepAspectRatio) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Expected O, but got Unknown if (keepAspectRatio) { double val = (double)width / (double)image.Width; double val2 = (double)height / (double)image.Height; double num = Math.Min(val, val2); width = (int)((double)image.Width * num); height = (int)((double)image.Height * num); } Rectangle rectangle = new Rectangle(0, 0, width, height); Bitmap val3 = new Bitmap(width, height); val3.SetResolution(image.HorizontalResolution, image.VerticalResolution); Graphics val4 = Graphics.FromImage((Image)(object)val3); try { val4.CompositingMode = (CompositingMode)1; val4.CompositingQuality = (CompositingQuality)2; val4.InterpolationMode = (InterpolationMode)7; val4.SmoothingMode = (SmoothingMode)2; val4.PixelOffsetMode = (PixelOffsetMode)2; ImageAttributes val5 = new ImageAttributes(); try { val5.SetWrapMode((WrapMode)3); val4.DrawImage(image, rectangle, 0, 0, image.Width, image.Height, (GraphicsUnit)2, val5); } finally { ((IDisposable)val5)?.Dispose(); } } finally { ((IDisposable)val4)?.Dispose(); } return val3; } } internal class Config { private static ConfigFile ConfigFile { get; set; } static Config() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown ConfigFile = new ConfigFile(Paths.ConfigPath + "\\LethalPosters.cfg", true); foreach (string posterFolder in Plugin.PosterFolders) { int num = posterFolder.IndexOf("plugins\\", StringComparison.Ordinal) + "plugins\\".Length; int num2 = posterFolder.IndexOf("\\LethalPosters", num, StringComparison.Ordinal); string text = posterFolder.Substring(num, num2 - num); ConfigEntry<bool> val = ConfigFile.Bind<bool>(text, "Enabled", true, "Enable or disable " + text); if (!val.Value) { Directory.Move(posterFolder, posterFolder + ".Disabled"); } } } } internal class Patches { private static ManualLogSource Logger { get; set; } public static void Init(ManualLogSource logger) { Logger = logger; } [HarmonyPatch(typeof(StartOfRound), "Start")] [HarmonyPostfix] private static void StartPatch() { Logger.LogInfo((object)"Patching Start in StartOfRound"); UpdateMaterials(0); } [HarmonyPatch(typeof(RoundManager), "GenerateNewLevelClientRpc")] [HarmonyPostfix] private static void GenerateNewLevelClientRpcPatch(int randomSeed) { Logger.LogInfo((object)"Patching GenerateNewLevelClientRpc in RoundManager"); UpdateMaterials(randomSeed); } private static void UpdateMaterials(int seed) { Logger.LogInfo((object)"Patching the textures"); Plugin.Rand = new Random(seed); Material[] materials = ((Renderer)GameObject.Find("HangarShip/Plane.001").GetComponent<MeshRenderer>()).materials; UpdateTexture(Plugin.PosterFiles, materials[0]); UpdateTexture(Plugin.TipFiles, materials[1]); } private static void UpdateTexture(IReadOnlyList<string> files, Material material) { if (files.Count != 0) { int index = Plugin.Rand.Next(files.Count); Logger.LogInfo((object)("Patching " + ((Object)material).name + " with " + files[index])); Texture2D mainTexture = ES3.LoadImage(File.ReadAllBytes(files[index])); material.mainTexture = (Texture)(object)mainTexture; } } } [BepInPlugin("nyoo-LCPosterEditor", "LCPosterEditor", "1.0.3")] public class Plugin : BaseUnityPlugin { public static List<string> PosterFolders = new List<string>(); public static readonly List<string> PosterFiles = new List<string>(); public static readonly List<string> TipFiles = new List<string>(); public static Random Rand = new Random(); public static ConfigEntry<bool> KeepAspectRatio; private void Awake() { //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Expected O, but got Unknown LoadConfigs(); CreateDirs(); if ((!Directory.EnumerateFileSystemEntries(Path.Combine(PluginInfo.PLUGIN_DIR, "LCPosterEditor", "posters")).Any() && Directory.EnumerateFileSystemEntries(Path.Combine(PluginInfo.PLUGIN_DIR, "Input", "posters")).Any()) || (!Directory.EnumerateFileSystemEntries(Path.Combine(PluginInfo.PLUGIN_DIR, "LCPosterEditor", "tips")).Any() && Directory.EnumerateFileSystemEntries(Path.Combine(PluginInfo.PLUGIN_DIR, "Input", "tips")).Any())) { AtlasCreator.Init(((BaseUnityPlugin)this).Logger); } else { ((BaseUnityPlugin)this).Logger.LogInfo((object)"Poster/Tip files found or Input files missing... continuing to load"); } PosterFolders = Directory.GetDirectories(Paths.PluginPath, "LCPosterEditor", SearchOption.AllDirectories).ToList(); PosterFolders.AddRange(Directory.GetDirectories(Paths.PluginPath, "LethalPosters", SearchOption.AllDirectories).ToList()); foreach (string posterFolder in PosterFolders) { string[] files = Directory.GetFiles(Path.Combine(posterFolder, "posters")); foreach (string text in files) { if (Path.GetExtension(text) != ".old") { PosterFiles.Add(text); } } string[] files2 = Directory.GetFiles(Path.Combine(posterFolder, "tips")); foreach (string text2 in files2) { if (Path.GetExtension(text2) != ".old") { TipFiles.Add(text2); } } } Patches.Init(((BaseUnityPlugin)this).Logger); Harmony val = new Harmony("nyoo-LCPosterEditor"); val.PatchAll(typeof(Patches)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin LCPosterEditor (1.0.3) is loaded!"); } private void CreateDirs() { Directory.CreateDirectory(Path.Combine(PluginInfo.PLUGIN_DIR, "LCPosterEditor", "posters")); Directory.CreateDirectory(Path.Combine(PluginInfo.PLUGIN_DIR, "LCPosterEditor", "tips")); Directory.CreateDirectory(Path.Combine(PluginInfo.PLUGIN_DIR, "Input", "posters")); Directory.CreateDirectory(Path.Combine(PluginInfo.PLUGIN_DIR, "Input", "tips")); } private void LoadConfigs() { KeepAspectRatio = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "KeepAspectRatio", true, "Determines whether or not to restrict the image generation to the original image's aspect ratio"); } } public static class PluginInfo { public const string PLUGIN_GUID = "nyoo-LCPosterEditor"; public const string PLUGIN_NAME = "LCPosterEditor"; public const string PLUGIN_VERSION = "1.0.3"; public static readonly string PLUGIN_DIR = Path.Combine(Paths.PluginPath, "nyoo-LCPosterEditor"); }