Decompiled source of GodModeBoss v0.1.1

GodModeBoss.dll

Decompiled a week ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Threading;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Cysharp.Threading.Tasks;
using Cysharp.Threading.Tasks.CompilerServices;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using NineSolsAPI;
using UnityEngine;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("GodModeBoss")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("GodModeBoss")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("GodModeBoss")]
[assembly: AssemblyTitle("GodModeBoss")]
[assembly: AssemblyVersion("1.0.0.0")]
[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.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]
	[Microsoft.CodeAnalysis.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]
	[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 GodModeBoss
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("GodModeBoss", "GodModeBoss", "1.0.0")]
	public class GodModeBoss : BaseUnityPlugin
	{
		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <CyclePhases>d__26 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskVoidMethodBuilder <>t__builder;

			public GodModeBoss <>4__this;

			private int <phaseIndex>5__2;

			private CancellationToken <cancellationToken>5__3;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
				//IL_0084: Unknown result type (might be due to invalid IL or missing references)
				//IL_0089: Unknown result type (might be due to invalid IL or missing references)
				//IL_008c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				GodModeBoss godModeBoss = <>4__this;
				try
				{
					if (num != 0)
					{
						<phaseIndex>5__2 = 0;
						godModeBoss.isCyclingPhases = true;
						<cancellationToken>5__3 = godModeBoss.phaseCycleCancellationTokenSource?.Token ?? CancellationToken.None;
						goto IL_00e1;
					}
					Awaiter awaiter = <>u__1;
					<>u__1 = default(Awaiter);
					num = (<>1__state = -1);
					goto IL_00da;
					IL_00e1:
					if (godModeBoss.isCyclingPhases && !<cancellationToken>5__3.IsCancellationRequested)
					{
						godModeBoss.SetPhase(<phaseIndex>5__2);
						<phaseIndex>5__2 = (<phaseIndex>5__2 + 1) % 3;
						UniTask val = UniTask.Delay((int)(godModeBoss.phaseSecond?.Value ?? 0f) * 1000, false, (PlayerLoopTiming)8, <cancellationToken>5__3);
						awaiter = ((UniTask)(ref val)).GetAwaiter();
						if (!((Awaiter)(ref awaiter)).IsCompleted)
						{
							num = (<>1__state = 0);
							<>u__1 = awaiter;
							((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <CyclePhases>d__26>(ref awaiter, ref this);
							return;
						}
						goto IL_00da;
					}
					goto end_IL_000e;
					IL_00da:
					((Awaiter)(ref awaiter)).GetResult();
					goto IL_00e1;
					end_IL_000e:;
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					<cancellationToken>5__3 = default(CancellationToken);
					((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				<cancellationToken>5__3 = default(CancellationToken);
				((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <checkBossActive>d__15 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder <>t__builder;

			public GodModeBoss <>4__this;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_0084: Unknown result type (might be due to invalid IL or missing references)
				//IL_0089: Unknown result type (might be due to invalid IL or missing references)
				//IL_0090: Unknown result type (might be due to invalid IL or missing references)
				//IL_004b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0050: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_0059: Unknown result type (might be due to invalid IL or missing references)
				//IL_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				GodModeBoss godModeBoss = <>4__this;
				try
				{
					if (num != 0)
					{
						goto IL_0011;
					}
					Awaiter awaiter = <>u__1;
					<>u__1 = default(Awaiter);
					num = (<>1__state = -1);
					goto IL_009f;
					IL_0011:
					MonsterBase bossInstance = godModeBoss.GetBossInstance();
					if (!((Object)(object)bossInstance != (Object)null) || !bossInstance.IsAlive() || !((Behaviour)bossInstance).isActiveAndEnabled || !((Component)bossInstance).gameObject.activeInHierarchy || !((Component)bossInstance).gameObject.activeSelf)
					{
						YieldAwaitable val = UniTask.Yield();
						awaiter = ((YieldAwaitable)(ref val)).GetAwaiter();
						if (!((Awaiter)(ref awaiter)).IsCompleted)
						{
							num = (<>1__state = 0);
							<>u__1 = awaiter;
							((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <checkBossActive>d__15>(ref awaiter, ref this);
							return;
						}
						goto IL_009f;
					}
					goto end_IL_000e;
					IL_009f:
					((Awaiter)(ref awaiter)).GetResult();
					goto IL_0011;
					end_IL_000e:;
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		private Harmony mainHarmony = new Harmony("GodModeBoss.Harmony");

		private ConfigEntry<bool>[] phaseButtons = new ConfigEntry<bool>[0];

		private ConfigEntry<bool> invincibleButton;

		private ConfigEntry<bool> phaseCycleButton;

		private ConfigEntry<float> phaseSecond;

		public ConfigEntry<bool> isReviveJade;

		public ConfigEntry<bool> isToast;

		private bool isCyclingPhases;

		private CancellationTokenSource? phaseCycleCancellationTokenSource;

		public static GodModeBoss Instance { get; private set; }

		private void Awake()
		{
			Log.Init(((BaseUnityPlugin)this).Logger);
			RCGLifeCycle.DontDestroyForever(((Component)this).gameObject);
			mainHarmony = Harmony.CreateAndPatchAll(typeof(GodModeBoss).Assembly, (string)null);
			InitializeConfigEntries();
			SceneManager.sceneLoaded += OnSceneLoaded;
			Instance = this;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin GodModeBoss is loaded!");
		}

		private async void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			StopPhaseCycle();
			if (phaseCycleButton?.Value ?? false)
			{
				await checkBossActive();
				TogglePhaseCycle(enable: true);
			}
			if (invincibleButton?.Value ?? false)
			{
				ToggleInvincibility();
			}
		}

		[AsyncStateMachine(typeof(<checkBossActive>d__15))]
		private UniTask checkBossActive()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			<checkBossActive>d__15 <checkBossActive>d__ = default(<checkBossActive>d__15);
			<checkBossActive>d__.<>t__builder = AsyncUniTaskMethodBuilder.Create();
			<checkBossActive>d__.<>4__this = this;
			<checkBossActive>d__.<>1__state = -1;
			((AsyncUniTaskMethodBuilder)(ref <checkBossActive>d__.<>t__builder)).Start<<checkBossActive>d__15>(ref <checkBossActive>d__);
			return ((AsyncUniTaskMethodBuilder)(ref <checkBossActive>d__.<>t__builder)).Task;
		}

		private MonsterBase GetBossInstance()
		{
			foreach (MonsterBase value in SingletonBehaviour<MonsterManager>.Instance.monsterDict.Values)
			{
				if (((Component)value).tag == "Boss")
				{
					return value;
				}
			}
			return null;
		}

		private void InitializeConfigEntries()
		{
			phaseButtons = new ConfigEntry<bool>[3]
			{
				CreatePhaseButton("Phase 1", 0),
				CreatePhaseButton("Phase 2", 1),
				CreatePhaseButton("Phase 3", 2)
			};
			invincibleButton = ((BaseUnityPlugin)this).Config.Bind<bool>("Actions", "Toggle Invincibility", false, "Toggle invincibility for all bosses");
			invincibleButton.SettingChanged += delegate
			{
				ToggleInvincibility();
			};
			phaseCycleButton = ((BaseUnityPlugin)this).Config.Bind<bool>("Actions", "Cycle Phases 1~3", false, "Automatically cycle phases 1 to 3 every x seconds");
			phaseCycleButton.SettingChanged += delegate
			{
				TogglePhaseCycle(phaseCycleButton?.Value ?? false);
			};
			phaseSecond = ((BaseUnityPlugin)this).Config.Bind<float>("Actions", "Change Phases Every Second", 30f, "");
			isReviveJade = ((BaseUnityPlugin)this).Config.Bind<bool>("", "Revive Jade Unlimit times", false, "");
			isToast = ((BaseUnityPlugin)this).Config.Bind<bool>("", "Is Toast Change Phase", false, "");
			ResetAllButtons();
		}

		private ConfigEntry<bool> CreatePhaseButton(string name, int phaseIndex)
		{
			ConfigEntry<bool> entry = ((BaseUnityPlugin)this).Config.Bind<bool>("Actions", "Goto " + name, false, "Trigger " + name + " for all bosses");
			entry.SettingChanged += delegate
			{
				if (entry.Value)
				{
					SetPhase(phaseIndex);
				}
				entry.Value = false;
			};
			return entry;
		}

		private void ResetAllButtons()
		{
			ConfigEntry<bool>[] array = phaseButtons;
			for (int i = 0; i < array.Length; i++)
			{
				array[i].Value = false;
			}
			invincibleButton.Value = false;
			isReviveJade.Value = false;
			phaseCycleButton.Value = false;
		}

		private void ToggleInvincibility()
		{
			foreach (MonsterBase value in SingletonBehaviour<MonsterManager>.Instance.monsterDict.Values)
			{
				if (((Component)value).tag == "Boss" && TryGetMonsterStat(value, out MonsterStat monsterStat))
				{
					bool flag = invincibleButton?.Value ?? false;
					monsterStat.IsLockPostureInvincible = flag;
					ToastManager.Toast((object)$"Invincible: {flag} Name: {((Object)value).name}");
				}
			}
		}

		private void SetPhase(int phaseIndex)
		{
			bool flag = isToast?.Value ?? false;
			foreach (MonsterBase value in SingletonBehaviour<MonsterManager>.Instance.monsterDict.Values)
			{
				if (((Component)value).tag == "Boss")
				{
					GotoPhase(value, phaseIndex);
					if (flag)
					{
						ToastManager.Toast((object)$"Goto Phase {phaseIndex + 1} Name:{((Object)value).name}");
					}
				}
			}
		}

		private bool TryGetMonsterStat(MonsterBase monster, out MonsterStat monsterStat)
		{
			object? obj = (typeof(MonsterBase).GetField("monsterStat") ?? typeof(MonsterBase).GetField("_monsterStat"))?.GetValue(monster);
			monsterStat = (MonsterStat)((obj is MonsterStat) ? obj : null);
			return (Object)(object)monsterStat != (Object)null;
		}

		private void GotoPhase(MonsterBase monster, int phaseIndex)
		{
			monster.PhaseIndex = phaseIndex;
			((Actor)monster).animator.SetInteger(Animator.StringToHash("PhaseIndex"), phaseIndex);
			monster.postureSystem.RestorePosture();
			monster.monsterCore.EnablePushAway();
			monster.monsterCore.DisablePushAway();
			ClearAllAttackSensors(monster);
		}

		private void ClearAllAttackSensors(MonsterBase monster)
		{
			AttackSensor[] attackSensors = GetAttackSensors(monster);
			foreach (AttackSensor obj in attackSensors)
			{
				if (obj != null)
				{
					obj.ClearQueue();
				}
			}
		}

		private AttackSensor[] GetAttackSensors(MonsterBase monster)
		{
			return (AttackSensor[])(((object)((typeof(MonsterBase).GetField("attackSensors", BindingFlags.Instance | BindingFlags.NonPublic) ?? typeof(MonsterBase).GetField("_attackSensors", BindingFlags.Instance | BindingFlags.NonPublic))?.GetValue(monster) as AttackSensor[])) ?? ((object)new AttackSensor[0]));
		}

		[AsyncStateMachine(typeof(<CyclePhases>d__26))]
		private UniTaskVoid CyclePhases()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			<CyclePhases>d__26 <CyclePhases>d__ = default(<CyclePhases>d__26);
			<CyclePhases>d__.<>t__builder = AsyncUniTaskVoidMethodBuilder.Create();
			<CyclePhases>d__.<>4__this = this;
			<CyclePhases>d__.<>1__state = -1;
			((AsyncUniTaskVoidMethodBuilder)(ref <CyclePhases>d__.<>t__builder)).Start<<CyclePhases>d__26>(ref <CyclePhases>d__);
			return ((AsyncUniTaskVoidMethodBuilder)(ref <CyclePhases>d__.<>t__builder)).Task;
		}

		private void TogglePhaseCycle(bool enable)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			if (enable && !isCyclingPhases)
			{
				phaseCycleCancellationTokenSource?.Cancel();
				phaseCycleCancellationTokenSource = new CancellationTokenSource();
				UniTaskVoid val = CyclePhases();
				((UniTaskVoid)(ref val)).Forget();
			}
			else if (!enable && isCyclingPhases)
			{
				phaseCycleCancellationTokenSource?.Cancel();
				isCyclingPhases = false;
			}
		}

		private void StopPhaseCycle()
		{
			if (phaseCycleCancellationTokenSource != null)
			{
				phaseCycleCancellationTokenSource.Cancel();
				isCyclingPhases = false;
			}
		}

		private void OnDestroy()
		{
			StopPhaseCycle();
			mainHarmony.UnpatchSelf();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"GodModeBoss plugin unpatched.");
		}
	}
	internal static class Log
	{
		private static ManualLogSource? logSource;

		internal static void Init(ManualLogSource logSource)
		{
			Log.logSource = logSource;
		}

		internal static void Debug(object data)
		{
			ManualLogSource? obj = logSource;
			if (obj != null)
			{
				obj.LogDebug(data);
			}
		}

		internal static void Error(object data)
		{
			ManualLogSource? obj = logSource;
			if (obj != null)
			{
				obj.LogError(data);
			}
		}

		internal static void Fatal(object data)
		{
			ManualLogSource? obj = logSource;
			if (obj != null)
			{
				obj.LogFatal(data);
			}
		}

		internal static void Info(object data)
		{
			ManualLogSource? obj = logSource;
			if (obj != null)
			{
				obj.LogInfo(data);
			}
		}

		internal static void Message(object data)
		{
			ManualLogSource? obj = logSource;
			if (obj != null)
			{
				obj.LogMessage(data);
			}
		}

		internal static void Warning(object data)
		{
			ManualLogSource? obj = logSource;
			if (obj != null)
			{
				obj.LogWarning(data);
			}
		}
	}
	[HarmonyPatch]
	public class Patches
	{
		[HarmonyPatch(typeof(PlayerAbilityData), "CanUseCheck")]
		[HarmonyPrefix]
		private static bool PatchCanUseCheck(ref PlayerAbilityData __instance, ref object effectProvider)
		{
			if (((Object)__instance).name.Contains("Revive Jade"))
			{
				GodModeBoss instance = GodModeBoss.Instance;
				if (instance != null && instance.isReviveJade?.Value == true)
				{
					return false;
				}
			}
			return true;
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "GodModeBoss";

		public const string PLUGIN_NAME = "GodModeBoss";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}