Decompiled source of Logic World BIE Mod Loader v1.1.1

BepInEx/plugins/LWBIEML.dll

Decompiled a month ago
using System;
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 Microsoft.CodeAnalysis;

[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("LWBIEML")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("LWBIEML")]
[assembly: AssemblyTitle("LWBIEML")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace lw_bepinex_modloader
{
	[BepInPlugin("com.foxfirefive.lwbieml", "Logic World BepInEx Mod Loader", "1.1.1")]
	public class LWBIEML : BaseUnityPlugin
	{
		private string PluginsRoot => Paths.PluginPath;

		private string GameDataFolder => Path.Combine(Paths.GameRootPath, "GameData");

		private void Awake()
		{
			try
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Loading mods...");
				LoadMods();
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Mod loading complete.");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Exception in Awake: " + ex));
			}
		}

		private void OnApplicationQuit()
		{
			try
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Application quitting — cleaning up...");
				CleanUpGameDataFolder();
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Cleanup complete.");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Exception during cleanup on quit: " + ex));
			}
		}

		private void CleanUpGameDataFolder()
		{
			if (!Directory.Exists(GameDataFolder))
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"GameData folder not found.");
				return;
			}
			string[] fileSystemEntries = Directory.GetFileSystemEntries(GameDataFolder);
			foreach (string text in fileSystemEntries)
			{
				string fileName = Path.GetFileName(text);
				if (fileName.StartsWith("_") || string.Equals(fileName, "MHG", StringComparison.OrdinalIgnoreCase))
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)("Skipping protected mod: " + fileName));
					continue;
				}
				try
				{
					if (Directory.Exists(text))
					{
						Directory.Delete(text, recursive: true);
					}
					else if (File.Exists(text))
					{
						File.Delete(text);
					}
					((BaseUnityPlugin)this).Logger.LogInfo((object)("Deleted: " + text));
				}
				catch (Exception arg)
				{
					((BaseUnityPlugin)this).Logger.LogError((object)$"Failed to delete '{text}': {arg}");
				}
			}
		}

		private void LoadMods()
		{
			if (!Directory.Exists(PluginsRoot))
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"BepInEx Plugins folder not found.");
				return;
			}
			if (!Directory.Exists(PluginsRoot))
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"BepInEx Plugins folder not found.");
				return;
			}
			if (!Directory.Exists(GameDataFolder))
			{
				Directory.CreateDirectory(GameDataFolder);
			}
			string[] directories = Directory.GetDirectories(PluginsRoot);
			if (directories.Length == 0)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"No Logic World mods found in BepInEx plugins directory.");
				return;
			}
			string[] array = directories;
			foreach (string text in array)
			{
				try
				{
					if (string.Equals(Path.GetFileName(text), "lwbieml", StringComparison.OrdinalIgnoreCase))
					{
						continue;
					}
					string text2 = null;
					text2 = ((!File.Exists(Path.Combine(text, "manifest.jecs"))) ? Directory.GetDirectories(text).FirstOrDefault((string sub) => File.Exists(Path.Combine(sub, "manifest.jecs"))) : text);
					if (text2 == null)
					{
						((BaseUnityPlugin)this).Logger.LogInfo((object)("Skipping '" + text + "' — no manifest.jecs found"));
						continue;
					}
					string fileName = Path.GetFileName(text2);
					string text3 = Path.Combine(GameDataFolder, fileName);
					if (Directory.Exists(text3))
					{
						Directory.Delete(text3, recursive: true);
						((BaseUnityPlugin)this).Logger.LogInfo((object)("Deleted existing mod: " + text3));
					}
					CopyDirectory(text2, text3);
					((BaseUnityPlugin)this).Logger.LogInfo((object)("Loaded mod '" + fileName + "' into GameData."));
				}
				catch (Exception arg)
				{
					((BaseUnityPlugin)this).Logger.LogError((object)$"Failed to load mod from '{text}': {arg}");
				}
			}
		}

		private void CopyDirectory(string sourceDir, string destinationDir)
		{
			Directory.CreateDirectory(destinationDir);
			string[] files = Directory.GetFiles(sourceDir);
			foreach (string text in files)
			{
				string destFileName = Path.Combine(destinationDir, Path.GetFileName(text));
				File.Copy(text, destFileName, overwrite: true);
			}
			files = Directory.GetDirectories(sourceDir);
			foreach (string text2 in files)
			{
				string destinationDir2 = Path.Combine(destinationDir, Path.GetFileName(text2));
				CopyDirectory(text2, destinationDir2);
			}
		}
	}
}