Decompiled source of CraniusHunt v1.0.1

BepInEx/plugins/CraniusHunt.dll

Decompiled 5 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Pigeon.Math;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("CraniusHunt")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.0.0.0")]
[assembly: AssemblyInformationalVersion("0.0.0-alpha.0")]
[assembly: AssemblyProduct("CraniusHunt")]
[assembly: AssemblyTitle("CraniusHunt")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.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 CraniusHunt
{
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "CraniusHunt";

		public const string PLUGIN_NAME = "CraniusHunt";

		public const string PLUGIN_VERSION = "0.0.0";
	}
}
namespace CraniusMissionMod
{
	[BepInPlugin("com.yourname.craniushunt", "CraniusHunt", "1.0.0")]
	public class CraniusMissionMod : BaseUnityPlugin
	{
		private void Awake()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			Harmony val = new Harmony("com.yourname.craniushunt");
			val.PatchAll(typeof(MissionSelectWindowInitPatch));
			val.PatchAll(typeof(AmalgamationObjectivePatch));
			val.PatchAll(typeof(MissionSelectWindowPatch));
			((BaseUnityPlugin)this).Logger.LogInfo((object)(val.Id + " loaded!"));
		}
	}
	public class CraniusMission : AmalgamationMission
	{
		public override bool CanShowInMissionSelect(out bool showLocked, out string lockedMessage)
		{
			showLocked = false;
			lockedMessage = null;
			return true;
		}
	}
	[HarmonyPatch(typeof(MissionSelectWindow), "Awake")]
	public class MissionSelectWindowInitPatch
	{
		public static CraniusMission craniusMission;

		public static EnemyClass craniusClass;

		[HarmonyPostfix]
		public static void Postfix(MissionSelectWindow __instance)
		{
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			AmalgamationMission val = Resources.FindObjectsOfTypeAll<AmalgamationMission>()[0];
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			craniusMission = ScriptableObject.CreateInstance<CraniusMission>();
			FieldInfo[] fields = typeof(AmalgamationMission).GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			foreach (FieldInfo fieldInfo in fields)
			{
				fieldInfo.SetValue(craniusMission, fieldInfo.GetValue(val));
			}
			FieldInfo field = typeof(Mission).GetField("_missionName", BindingFlags.Instance | BindingFlags.NonPublic);
			if (field != null)
			{
				field.SetValue(craniusMission, "cranius_hunt");
			}
			FieldInfo field2 = typeof(Mission).GetField("_description", BindingFlags.Instance | BindingFlags.NonPublic);
			if (field2 != null)
			{
				field2.SetValue(craniusMission, "Hunt down the secret boss Cranius!");
			}
			((Mission)craniusMission).MissionIcon = ((Mission)val).MissionIcon;
			((Mission)craniusMission).MissionColor = Color.magenta;
			((Mission)craniusMission).ShowInReplayMenu = true;
			((Mission)craniusMission).Selectable = true;
			EnemyClass[] array = Resources.FindObjectsOfTypeAll<EnemyClass>();
			foreach (EnemyClass val2 in array)
			{
				if (val2.customSpawner is ScrapBossSpawner)
				{
					craniusClass = val2;
					break;
				}
			}
			if ((Object)(object)craniusClass == (Object)null)
			{
				return;
			}
			FieldInfo field3 = typeof(Global).GetField("Missions", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
			if (field3 == null)
			{
				return;
			}
			Mission[] array2 = (Mission[])field3.GetValue(Global.Instance);
			bool flag = false;
			Mission[] array3 = array2;
			for (int i = 0; i < array3.Length; i++)
			{
				if (array3[i] is CraniusMission)
				{
					flag = true;
					break;
				}
			}
			if (!flag)
			{
				Mission[] array4 = (Mission[])(object)new Mission[array2.Length + 1];
				Array.Copy(array2, array4, array2.Length);
				array4[array2.Length] = (Mission)(object)craniusMission;
				field3.SetValue(Global.Instance, array4);
			}
			if (PlayerData.Instance != null && PlayerData.Instance.GetFlag("cranius") == 0)
			{
				PlayerData.Instance.SetFlag("cranius", 1);
			}
			if (PlayerData.Instance.GetFlag("cranius") != 1)
			{
				PlayerData.Instance.SetFlag("cranius", 1);
			}
		}
	}
	[HarmonyPatch(typeof(AmalgamationObjective), "Setup")]
	public class AmalgamationObjectivePatch
	{
		[HarmonyPostfix]
		public static void Postfix(AmalgamationObjective __instance)
		{
			if (MissionManager.Instance.Mission is CraniusMission)
			{
				FieldInfo field = typeof(AmalgamationObjective).GetField("amalgamationClass", BindingFlags.Instance | BindingFlags.NonPublic);
				if (field != null)
				{
					field.SetValue(__instance, MissionSelectWindowInitPatch.craniusClass);
				}
			}
		}
	}
	[HarmonyPatch(typeof(MissionSelectWindow), "ToggleReplayWindow")]
	public class MissionSelectWindowPatch
	{
		[HarmonyPostfix]
		public static void Postfix(MissionSelectWindow __instance)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Expected O, but got Unknown
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)MissionSelectWindowInitPatch.craniusMission == (Object)null)
			{
				return;
			}
			FieldInfo field = typeof(MissionSelectWindow).GetField("replayMissionContainer", BindingFlags.Instance | BindingFlags.NonPublic);
			if (field == null)
			{
				return;
			}
			RectTransform val = (RectTransform)field.GetValue(__instance);
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			List<MissionSelectButton> list = new List<MissionSelectButton>();
			for (int i = 0; i < ((Transform)val).childCount; i++)
			{
				MissionSelectButton component = ((Component)((Transform)val).GetChild(i)).GetComponent<MissionSelectButton>();
				if ((Object)(object)component != (Object)null && (Object)(object)((MissionData)(ref component.Mission)).Mission == (Object)(object)MissionSelectWindowInitPatch.craniusMission)
				{
					list.Add(component);
				}
			}
			if (list.Count > 1)
			{
				for (int j = 1; j < list.Count; j++)
				{
					Object.Destroy((Object)(object)((Component)list[j]).gameObject);
				}
			}
			if (list.Count > 0)
			{
				return;
			}
			FieldInfo field2 = typeof(MissionSelectWindow).GetField("missionButtonPrefab", BindingFlags.Instance | BindingFlags.NonPublic);
			if (field2 == null)
			{
				return;
			}
			MissionSelectButton val2 = (MissionSelectButton)field2.GetValue(__instance);
			if (!((Object)(object)val2 == (Object)null))
			{
				MissionSelectButton obj = Object.Instantiate<MissionSelectButton>(val2, (Transform)(object)val);
				((Component)obj).gameObject.SetActive(true);
				Random val3 = default(Random);
				((Random)(ref val3))..ctor(Global.MissionSelectSeed + (((Mission)MissionSelectWindowInitPatch.craniusMission).ID.GetHashCode() + 3173) * 5390921);
				WorldRegion val4 = ((Mission)MissionSelectWindowInitPatch.craniusMission).OverrideRegion() ?? Global.Instance.Regions[((Random)(ref val3)).Next(Global.Instance.Regions.Length)];
				string text = default(string);
				string text2 = (((Mission)MissionSelectWindowInitPatch.craniusMission).OverrideScene(ref text) ? text : val4.SceneNames[((Random)(ref val3)).Next(val4.SceneNames.Length)]);
				obj.Setup(new MissionData(((Random)(ref val3)).Next(), (Mission)(object)MissionSelectWindowInitPatch.craniusMission, val4, text2, (MissionContainer)null), __instance, true, false);
				RectTransform component2 = ((Component)obj).GetComponent<RectTransform>();
				if ((Object)(object)component2 != (Object)null)
				{
					component2.anchorMin = new Vector2(0.5f, 0.5f);
					component2.anchorMax = new Vector2(0.5f, 0.5f);
					component2.anchoredPosition = Vector2.zero;
					component2.sizeDelta = new Vector2(100f, 100f);
					((Transform)component2).localScale = Vector3.one * 1.5f;
				}
			}
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}