Decompiled source of MineshaftRescaler v1.2.0

Tomatobird.MineshaftRescaler.dll

Decompiled a month ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
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 Dawn;
using DunGen.Graph;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using MineshaftRescaler.Patches;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: IgnoresAccessChecksTo("com.github.teamxiaolan.dawnlib")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Tomatobird.MineshaftRescaler")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.2.0.0")]
[assembly: AssemblyInformationalVersion("1.2.0+b5b14e2ea6c5fc2d24a7a667ec34d931031de979")]
[assembly: AssemblyProduct("MineshaftRescaler")]
[assembly: AssemblyTitle("Tomatobird.MineshaftRescaler")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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]
	[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]
	[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 MineshaftRescaler
{
	[BepInPlugin("Tomatobird.MineshaftRescaler", "MineshaftRescaler", "1.2.0")]
	public class MineshaftRescaler : BaseUnityPlugin
	{
		public static bool applyMineshaftSizeChanges;

		public static ConfigEntry<int> minLength;

		public static ConfigEntry<int> maxLength;

		public static ConfigEntry<int> minBranches;

		public static ConfigEntry<int> maxBranches;

		public static ConfigEntry<float> mainLength;

		public static ConfigEntry<float> cavesLength;

		public static ConfigEntry<float> fireLength;

		public static bool changeMineshaftLootBonus;

		public static ConfigEntry<int> lootAmountBonus;

		internal static bool isDawnLibLoaded;

		public static MineshaftRescaler Instance { get; private set; }

		internal static ManualLogSource Logger { get; private set; }

		internal static Harmony? Harmony { get; set; }

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			applyMineshaftSizeChanges = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ApplyMineshaftSizeChanges", true, "Applies the mineshaft size changes listed below.").Value;
			minLength = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MinLength", 14, "Minimum generation length");
			maxLength = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MaxLength", 18, "Maximum generation length");
			minBranches = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MinBranches", 14, "Minimum amount of branches to generate");
			maxBranches = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MaxBranches", 18, "Maximum amount of branches to generate");
			mainLength = ((BaseUnityPlugin)this).Config.Bind<float>("General", "MainLength", 0.25f, "Relative length of the Main side section.");
			cavesLength = ((BaseUnityPlugin)this).Config.Bind<float>("General", "CavesLength", 0.6f, "Relative length of the caves section.");
			fireLength = ((BaseUnityPlugin)this).Config.Bind<float>("General", "FireLength", 0.15f, "Relative length of the Fire side section.");
			changeMineshaftLootBonus = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ChangeMineshaftLootBonus", false, "Change the bonus amount of loot to spawn in the mineshaft interior.").Value;
			lootAmountBonus = ((BaseUnityPlugin)this).Config.Bind<int>("General", "LootAmountBonus", 6, "Amount of extra loot to spawn in mineshaft.");
			isDawnLibLoaded = Chainloader.PluginInfos.ContainsKey("com.github.teamxiaolan.dawnlib");
			Logger.LogInfo((object)$"Dawnlib installed: {isDawnLibLoaded}");
			Patch();
			Logger.LogInfo((object)"Tomatobird.MineshaftRescaler v1.2.0 has loaded!");
		}

		internal static void Patch()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony = new Harmony("Tomatobird.MineshaftRescaler");
			}
			if (applyMineshaftSizeChanges)
			{
				Logger.LogDebug((object)"Patching... MineshaftScalePatch");
				Harmony.PatchAll(typeof(MineshaftScalePatch));
			}
			if (changeMineshaftLootBonus)
			{
				if (isDawnLibLoaded)
				{
					Logger.LogDebug((object)"Patching... RoundManagerDawnLibSupportPatch");
					Harmony.PatchAll(typeof(RoundManagerDawnLibSupportPatch));
				}
				else
				{
					Logger.LogDebug((object)"Patching... RoundManager");
					Harmony.PatchAll(typeof(RoundManagerPatch));
				}
			}
			Logger.LogDebug((object)"Finished patching!");
		}

		internal static void Unpatch()
		{
			Logger.LogDebug((object)"Unpatching...");
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			Logger.LogDebug((object)"Finished unpatching!");
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "Tomatobird.MineshaftRescaler";

		public const string PLUGIN_NAME = "MineshaftRescaler";

		public const string PLUGIN_VERSION = "1.2.0";
	}
}
namespace MineshaftRescaler.Patches
{
	[HarmonyPatch(typeof(RoundManager))]
	public class MineshaftScalePatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void Start_Postfix(RoundManager __instance)
		{
			for (int i = 0; i < __instance.dungeonFlowTypes.Length; i++)
			{
				if (((Object)__instance.dungeonFlowTypes[i].dungeonFlow).name == "Level3Flow")
				{
					MineshaftRescaler.Logger.LogDebug((object)"Level3Flow found! Applying dungeon generation changes.");
					DungeonFlow dungeonFlow = __instance.dungeonFlowTypes[i].dungeonFlow;
					dungeonFlow.Length.Min = MineshaftRescaler.minLength.Value;
					dungeonFlow.Length.Max = MineshaftRescaler.maxLength.Value;
					dungeonFlow.BranchCount.Min = MineshaftRescaler.minBranches.Value;
					dungeonFlow.BranchCount.Max = MineshaftRescaler.maxBranches.Value;
					float num = MineshaftRescaler.mainLength.Value + MineshaftRescaler.cavesLength.Value + MineshaftRescaler.fireLength.Value;
					float num2 = MineshaftRescaler.mainLength.Value / num;
					float num3 = MineshaftRescaler.cavesLength.Value / num;
					float length = MineshaftRescaler.fireLength.Value / num;
					dungeonFlow.Lines[0].Length = num2;
					dungeonFlow.Lines[1].Position = num2;
					dungeonFlow.Lines[1].Length = num3;
					dungeonFlow.Lines[2].Position = num2 + num3;
					dungeonFlow.Lines[2].Length = length;
					break;
				}
			}
		}
	}
	[HarmonyPatch(typeof(RoundManager))]
	public class RoundManagerDawnLibSupportPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void Start_Postfix()
		{
			bool flag = false;
			for (int i = 0; i < RoundManager.Instance.dungeonFlowTypes.Length; i++)
			{
				if (((Object)RoundManager.Instance.dungeonFlowTypes[i].dungeonFlow).name == "Level3Flow")
				{
					DawnDungeonInfo dawnInfo = DungeonFlowExtensions.GetDawnInfo(RoundManager.Instance.dungeonFlowTypes[i].dungeonFlow);
					dawnInfo.ExtraScrapGeneration = MineshaftRescaler.lootAmountBonus.Value;
					flag = true;
					MineshaftRescaler.Logger.LogInfo((object)$"Level3Flow found! Bonus of {MineshaftRescaler.lootAmountBonus} has been applied.");
					break;
				}
			}
			if (!flag)
			{
				MineshaftRescaler.Logger.LogWarning((object)"Level3Flow was not found! Scrap amount bonus won't be applied.");
			}
		}
	}
	[HarmonyPatch(typeof(RoundManager))]
	internal class RoundManagerPatch
	{
		[HarmonyPatch("SpawnScrapInLevel")]
		[HarmonyTranspiler]
		internal static IEnumerable<CodeInstruction> ChangeMinshaftLootBonus(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Expected O, but got Unknown
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null);
			CodeMatch[] array = (CodeMatch[])(object)new CodeMatch[3]
			{
				new CodeMatch((OpCode?)OpCodes.Ldloc_1, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldc_I4_6, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Add, (object)null, (string)null)
			};
			val.MatchForward(false, array).ThrowIfNotMatch("Couldn't find targetPattern for patching mineshaft bonus!", Array.Empty<CodeMatch>()).Advance(1)
				.SetAndAdvance(OpCodes.Ldc_I4_S, (object)(sbyte)MineshaftRescaler.lootAmountBonus.Value);
			return val.InstructionEnumeration();
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}