Decompiled source of ClassicStartArea v1.0.1

ClassicStartArea.dll

Decompiled a month ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Necro;
using UnityEngine;

[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyTitle("Classic Start Area")]
[assembly: AssemblyDescription("Restores the original intro room as the starting area in Necropolis")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("KoMiKoZa")]
[assembly: AssemblyProduct("Classic Start Area")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b39b09e0-0805-495a-80b6-960c391f255e")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: CompilationRelaxations(8)]
[assembly: AssemblyVersion("1.0.1.0")]
namespace Komikoza.Necropolis.ClassicStartArea;

[BepInPlugin("komikoza.necropolis.classicstartarea", "Classic Start Area", "1.0.1")]
public class ClassicStartAreaPlugin : BaseUnityPlugin
{
	private const string GUID = "komikoza.necropolis.classicstartarea";

	private const string NAME = "Classic Start Area";

	private const string VERSION = "1.0.1";

	internal static ManualLogSource Logger;

	internal static ConfigEntry<bool> ModEnabled;

	internal static ConfigEntry<bool> DebugMode;

	internal static FieldInfo startModuleField;

	internal static string originalStartModule = null;

	private void Awake()
	{
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Expected O, but got Unknown
		Logger = ((BaseUnityPlugin)this).Logger;
		ModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ModEnabled", true, "Enable or disable this mod");
		DebugMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "DebugMode", false, "Enable debug logging");
		startModuleField = typeof(Necropoloid).GetField("startModule", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
		if ((object)startModuleField == null)
		{
			Logger.LogError((object)string.Format("[{0}] Could not find startModule field!", "Classic Start Area"));
			return;
		}
		ModEnabled.SettingChanged += OnModEnabledChanged;
		if (!ModEnabled.Value)
		{
			Logger.LogInfo((object)string.Format("[{0}] Disabled", "Classic Start Area"));
			return;
		}
		try
		{
			Harmony val = new Harmony("komikoza.necropolis.classicstartarea");
			val.PatchAll();
			Logger.LogInfo((object)"================================================");
			Logger.LogInfo((object)string.Format("[{0}] v{1} loaded!", "Classic Start Area", "1.0.1"));
			Logger.LogInfo((object)" - Start area set to: intro (original)");
			Logger.LogInfo((object)"================================================");
		}
		catch (Exception arg)
		{
			Logger.LogError((object)string.Format("[{0}] Failed to load: {1}", "Classic Start Area", arg));
		}
	}

	private static void OnModEnabledChanged(object sender, EventArgs e)
	{
		try
		{
			Object obj = Object.FindObjectOfType(typeof(Necropoloid));
			Necropoloid val = (Necropoloid)(object)((obj is Necropoloid) ? obj : null);
			if ((Object)(object)val == (Object)null)
			{
				if (DebugMode.Value)
				{
					Logger.LogInfo((object)"[Classic Start Area][DEBUG] Necropoloid not found - might not be in game yet");
				}
			}
			else
			{
				if ((object)startModuleField == null)
				{
					return;
				}
				if (ModEnabled.Value)
				{
					if (originalStartModule == null)
					{
						originalStartModule = startModuleField.GetValue(val) as string;
						if (DebugMode.Value)
						{
							Logger.LogInfo((object)$"[Classic Start Area][DEBUG] Stored original start module: {originalStartModule}");
						}
					}
					startModuleField.SetValue(val, "intro");
					Logger.LogInfo((object)"[Classic Start Area] Enabled - start area set to: intro");
				}
				else if (originalStartModule != null)
				{
					startModuleField.SetValue(val, originalStartModule);
					Logger.LogInfo((object)$"[Classic Start Area] Disabled - start area restored to: {originalStartModule}");
				}
				else
				{
					startModuleField.SetValue(val, "start");
					Logger.LogInfo((object)"[Classic Start Area] Disabled - start area reset to: start (default)");
				}
			}
		}
		catch (Exception ex)
		{
			Logger.LogError((object)("[Classic Start Area] Error during hot-reload: " + ex));
		}
	}
}
[HarmonyPatch(typeof(Necropoloid), "Init")]
internal static class Necropoloid_Init_Patch
{
	private static void Prefix(Necropoloid __instance)
	{
		try
		{
			if (!ClassicStartAreaPlugin.ModEnabled.Value || (Object)(object)__instance == (Object)null)
			{
				return;
			}
			if ((object)ClassicStartAreaPlugin.startModuleField != null)
			{
				if (ClassicStartAreaPlugin.originalStartModule == null)
				{
					ClassicStartAreaPlugin.originalStartModule = ClassicStartAreaPlugin.startModuleField.GetValue(__instance) as string;
					if (ClassicStartAreaPlugin.DebugMode.Value)
					{
						ClassicStartAreaPlugin.Logger.LogInfo((object)$"[Classic Start Area][DEBUG] Stored original start module: {ClassicStartAreaPlugin.originalStartModule}");
					}
				}
				ClassicStartAreaPlugin.startModuleField.SetValue(__instance, "intro");
				if (ClassicStartAreaPlugin.DebugMode.Value)
				{
					ClassicStartAreaPlugin.Logger.LogInfo((object)"[Classic Start Area][DEBUG] Start area changed to: intro");
				}
			}
			else
			{
				ClassicStartAreaPlugin.Logger.LogError((object)"[Classic Start Area] Could not find startModule field!");
			}
		}
		catch (Exception ex)
		{
			ClassicStartAreaPlugin.Logger.LogError((object)("[Classic Start Area] Error: " + ex));
		}
	}
}