Decompiled source of RendNutcrackerApocalypse v1.1.0

RendNutcrackerApocalypse.dll

Decompiled 2 months ago
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
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: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("RendNutcrackerApocalypse")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Rend Nutcracker Apocalypse Mod")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RendNutcrackerApocalypse")]
[assembly: AssemblyTitle("RendNutcrackerApocalypse")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace RendNutcrackerApocalypse;

[BepInPlugin("com.triteeth.rendnutcrackerapocalypse", "<color=#FF0000>R</color><color=#FF7F00>e</color><color=#FFFF00>n</color><color=#00FF00>d</color><color=#0000FF>N</color><color=#4B0082>u</color><color=#9400D3>t</color><color=#FF0000>c</color><color=#FF7F00>r</color><color=#FFFF00>a</color><color=#00FF00>c</color><color=#0000FF>k</color><color=#4B0082>e</color><color=#9400D3>r</color><color=#FF0000>A</color><color=#FF7F00>p</color><color=#FFFF00>o</color><color=#00FF00>c</color><color=#0000FF>a</color><color=#4B0082>l</color><color=#9400D3>y</color><color=#FF0000>p</color><color=#FF7F00>s</color><color=#FFFF00>e</color>", "1.1.0")]
public class Plugin : BaseUnityPlugin
{
	private const string g = "com.triteeth.rendnutcrackerapocalypse";

	private const string n = "<color=#FF0000>R</color><color=#FF7F00>e</color><color=#FFFF00>n</color><color=#00FF00>d</color><color=#0000FF>N</color><color=#4B0082>u</color><color=#9400D3>t</color><color=#FF0000>c</color><color=#FF7F00>r</color><color=#FFFF00>a</color><color=#00FF00>c</color><color=#0000FF>k</color><color=#4B0082>e</color><color=#9400D3>r</color><color=#FF0000>A</color><color=#FF7F00>p</color><color=#FFFF00>o</color><color=#00FF00>c</color><color=#0000FF>a</color><color=#4B0082>l</color><color=#9400D3>y</color><color=#FF0000>p</color><color=#FF7F00>s</color><color=#FFFF00>e</color>";

	private const string v = "1.1.0";

	private readonly Harmony h = new Harmony("com.triteeth.rendnutcrackerapocalypse");

	private static Plugin inst;

	public static ConfigEntry<float> chance;

	public static ConfigEntry<bool> force;

	public static ConfigEntry<bool> instSpwn;

	public static ConfigEntry<bool> slwTm;

	public static ConfigEntry<float> tmMult;

	public static bool isActive;

	private void Awake()
	{
		if ((Object)(object)inst == (Object)null)
		{
			inst = this;
		}
		chance = ((BaseUnityPlugin)this).Config.Bind<float>("General", "ApocalypseChance", 1f, "chance");
		force = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "ForceApocalypse", false, "force rend");
		instSpwn = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "InstantSpawn", true, "fast spawn");
		slwTm = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "SlowTime", false, "slow time");
		tmMult = ((BaseUnityPlugin)this).Config.Bind<float>("General", "TimeSlowMultiplier", 1f, "how slow");
		h.PatchAll(typeof(Patches));
	}
}
[HarmonyPatch]
public static class Patches
{
	private static EnemyType GetNut()
	{
		if ((Object)(object)StartOfRound.Instance == (Object)null || StartOfRound.Instance.levels == null)
		{
			return null;
		}
		SelectableLevel[] levels = StartOfRound.Instance.levels;
		foreach (SelectableLevel val in levels)
		{
			if ((Object)(object)val == (Object)null)
			{
				continue;
			}
			foreach (SpawnableEnemyWithRarity enemy in val.Enemies)
			{
				if (enemy != null && enemy.enemyType?.enemyName.ToLower().Contains("nutcracker") == true)
				{
					return enemy.enemyType;
				}
			}
			foreach (SpawnableEnemyWithRarity outsideEnemy in val.OutsideEnemies)
			{
				if (outsideEnemy != null && outsideEnemy.enemyType?.enemyName.ToLower().Contains("nutcracker") == true)
				{
					return outsideEnemy.enemyType;
				}
			}
			foreach (SpawnableEnemyWithRarity daytimeEnemy in val.DaytimeEnemies)
			{
				if (daytimeEnemy != null && daytimeEnemy.enemyType?.enemyName.ToLower().Contains("nutcracker") == true)
				{
					return daytimeEnemy.enemyType;
				}
			}
		}
		return null;
	}

	[HarmonyPatch(typeof(RoundManager), "LoadNewLevel")]
	[HarmonyPrefix]
	public static void LoadNewLevelPrefix(RoundManager __instance, int randomSeed, SelectableLevel newLevel)
	{
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Expected O, but got Unknown
		Plugin.isActive = false;
		if ((Object)(object)newLevel == (Object)null)
		{
			return;
		}
		string text = newLevel.sceneName ?? "";
		if (!text.ToLower().Contains("rend"))
		{
			return;
		}
		float num = Random.Range(0f, 100f);
		if (Plugin.force.Value || num < Plugin.chance.Value)
		{
			Plugin.isActive = true;
			EnemyType nut = GetNut();
			if ((Object)(object)nut != (Object)null)
			{
				newLevel.Enemies.Clear();
				newLevel.Enemies.Add(new SpawnableEnemyWithRarity(nut, 100));
				int minEnemiesToSpawn = Mathf.RoundToInt(20f + 30f * Mathf.Pow(Random.value, 3f));
				__instance.minEnemiesToSpawn = minEnemiesToSpawn;
				__instance.currentMaxInsidePower = 9999f;
				__instance.cannotSpawnMoreInsideEnemies = false;
			}
			else
			{
				Plugin.isActive = false;
			}
		}
	}

	[HarmonyPatch(typeof(RoundManager), "AdvanceHourAndSpawnNewBatchOfEnemies")]
	[HarmonyPrefix]
	public static void AdvanceHourAndSpawnNewBatchOfEnemiesPrefix(RoundManager __instance)
	{
		if (Plugin.isActive)
		{
			__instance.currentMaxInsidePower = 9999f;
			__instance.cannotSpawnMoreInsideEnemies = false;
		}
	}

	[HarmonyPatch(typeof(RoundManager), "SpawnInsideEnemiesFromVentsIfReady")]
	[HarmonyPrefix]
	public static bool SpawnInsideEnemiesFromVentsIfReadyPrefix(RoundManager __instance)
	{
		if (Plugin.isActive && Plugin.instSpwn.Value)
		{
			if (__instance.allEnemyVents == null)
			{
				return true;
			}
			for (int i = 0; i < __instance.allEnemyVents.Length; i++)
			{
				EnemyVent val = __instance.allEnemyVents[i];
				if ((Object)(object)val != (Object)null && val.occupied)
				{
					__instance.SpawnEnemyFromVent(val);
				}
			}
			__instance.currentEnemySpawnIndex = __instance.enemySpawnTimes.Count;
			return false;
		}
		return true;
	}

	[HarmonyPatch(typeof(TimeOfDay), "Update")]
	[HarmonyPostfix]
	public static void TimeOfDayUpdatePostfix(TimeOfDay __instance)
	{
		if (Plugin.isActive && Plugin.slwTm.Value)
		{
			__instance.globalTimeSpeedMultiplier = 1f / Mathf.Max(1f, Plugin.tmMult.Value);
		}
	}
}