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);
}
}
}
}