Decompiled source of AlternateCrests v0.1.5

AltCrests.dll

Decompiled a month ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
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.Configuration;
using BepInEx.Logging;
using GlobalSettings;
using HarmonyLib;
using HutongGames.PlayMaker;
using Microsoft.CodeAnalysis;
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("AltCrests")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("0.1.0.0")]
[assembly: AssemblyInformationalVersion("0.1.0")]
[assembly: AssemblyProduct("AltCrests")]
[assembly: AssemblyTitle("AltCrests")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/vice/AltCrests")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.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.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 BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace AltCrests
{
	[BepInPlugin("io.github.altcrests", "AltCrests", "0.1.0")]
	public class AltCrestsPlugin : BaseUnityPlugin
	{
		private enum ActiveCrest
		{
			MAIN_CREST,
			ALT_CREST
		}

		[HarmonyPatch(typeof(HealthManager), "TakeDamage")]
		private static class HealthManager_TakeDamage_Patch
		{
			private static bool ReturnTrue(string a, string b)
			{
				return true;
			}

			private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
			{
				//IL_0003: Unknown result type (might be due to invalid IL or missing references)
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Expected O, but got Unknown
				CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
				{
					new CodeMatch((OpCode?)OpCodes.Ldstr, (object)"Reaper", (string)null)
				}).Advance(1).SetInstructionAndAdvance(Transpilers.EmitDelegate<Func<string, string, bool>>((Func<string, string, bool>)ReturnTrue));
				ManualLogSource? log = Log;
				if (log != null)
				{
					log.LogInfo((object)"Successfully transpiled HealthManager.TakeDamage");
				}
				return val.InstructionEnumeration();
			}
		}

		[HarmonyPatch(typeof(HeroController), "Awake")]
		private static class HeroControllerPatch
		{
			private static void Postfix(HeroController __instance)
			{
				heroController = __instance;
			}
		}

		[HarmonyPatch(typeof(PlayMakerFSM), "Awake")]
		private static class PatchToolAttacksFSM
		{
			private static void Postfix(PlayMakerFSM __instance)
			{
				if ((Object)(object)__instance == (Object)null)
				{
					return;
				}
				FsmState state = __instance.Fsm.GetState("Flea Brew Burst");
				if (state != null)
				{
					fleaBrewBurstState = state;
					originalFleaBrewAudio = state.Actions.OfType<PlayAudioEvent>().FirstOrDefault();
					FsmState state2 = __instance.Fsm.GetState("Flea Brew Kickup");
					if (state2 != null)
					{
						fleaBrewKickupState = state2;
					}
				}
			}
		}

		private const string HARMONY_ID = "com.vice.altcrests";

		private static ActiveCrest activeCrest = ActiveCrest.MAIN_CREST;

		private static FsmState? fleaBrewBurstState = null;

		private static FsmState? fleaBrewKickupState = null;

		private static HeroController? heroController = null;

		private static PlayAudioEvent? originalFleaBrewAudio = null;

		private static AudioClip? Silk_HUD_evo_3 = null;

		private static AudioClip? hornet_flea_brew_effect_trigger = null;

		private static float crestSwapCooldownTimer = 0f;

		private static float crestSwapCooldown = 0.75f;

		private static int crestSwapSilkCost = 1;

		private ConfigEntry<string>? mainCrest;

		private ConfigEntry<string>? altCrest;

		private ConfigEntry<KeyCode>? keybind;

		private Dictionary<string, string> crestNames = new Dictionary<string, string>();

		internal static ManualLogSource? Log;

		public const string Id = "io.github.altcrests";

		public static string Name => "AltCrests";

		public static string Version => "0.1.0";

		private void Awake()
		{
			//IL_0011: 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)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Expected O, but got Unknown
			//IL_004c: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Expected O, but got Unknown
			//IL_0081: Expected O, but got Unknown
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			new Harmony("com.vice.altcrests").PatchAll();
			keybind = ((BaseUnityPlugin)this).Config.Bind<KeyCode>(new ConfigDefinition("AltCrests", "keybind"), (KeyCode)304, new ConfigDescription("Key for swapping crests. \nIf you're on a controller,I would recommend looking up a diagram of your controller's unity gamepad KeyCodes.\n", (AcceptableValueBase)null, Array.Empty<object>()));
			mainCrest = ((BaseUnityPlugin)this).Config.Bind<string>(new ConfigDefinition("AltCrests", "main_crest"), "hunter", new ConfigDescription("Crest names go here, lowercase.\n- hunter\n- wanderer\n- reaper\n- beast\n- architect\n- witch\n- shaman\n", (AcceptableValueBase)null, Array.Empty<object>()));
			altCrest = ((BaseUnityPlugin)this).Config.Bind<string>(new ConfigDefinition("AltCrests", "alt_crest"), "wanderer", (ConfigDescription)null);
			crestNames.Add("hunter", "Hunter");
			crestNames.Add("wanderer", "Wanderer");
			crestNames.Add("reaper", "Reaper");
			crestNames.Add("beast", "Warrior");
			crestNames.Add("architect", "Toolmaster");
			crestNames.Add("witch", "Witch");
			crestNames.Add("shaman", "Spell");
			if (!crestNames.ContainsKey(mainCrest.Value))
			{
				Log.LogError((object)(mainCrest.Value + " is not a valid crest! (Did you type the name correctly?)"));
			}
			if (!crestNames.ContainsKey(altCrest.Value))
			{
				Log.LogError((object)(altCrest.Value + " is not a valid crest! (Did you type the name correctly?)"));
			}
			Log.LogInfo((object)("Plugin " + Name + " (io.github.altcrests) has loaded!"));
		}

		private void Update()
		{
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_05fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_061f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0637: Unknown result type (might be due to invalid IL or missing references)
			if (fleaBrewBurstState == null || fleaBrewKickupState == null || (Object)(object)heroController == (Object)null || originalFleaBrewAudio == null)
			{
				return;
			}
			PlayAudioEvent val = fleaBrewBurstState.actions.OfType<PlayAudioEvent>().FirstOrDefault();
			if (heroController.toolsFSM.ActiveStateName == "Idle")
			{
				fleaBrewBurstState.Actions[2].enabled = true;
				if ((Object)(object)hornet_flea_brew_effect_trigger != (Object)null)
				{
					originalFleaBrewAudio.audioClip = FsmObject.op_Implicit((Object)(object)hornet_flea_brew_effect_trigger);
					((PlayAudioEventBase)fleaBrewBurstState.Actions.OfType<PlayAudioEvent>().FirstOrDefault()).volume = FsmFloat.op_Implicit(1f);
				}
			}
			crestSwapCooldownTimer -= Time.deltaTime;
			if (!Input.GetKeyDown(keybind.Value))
			{
				return;
			}
			((BaseUnityPlugin)this).Config.Reload();
			if (!crestNames.ContainsKey(mainCrest.Value))
			{
				Log.LogError((object)(mainCrest.Value + " is not a valid crest! (Did you type the name correctly?)"));
			}
			else if (!crestNames.ContainsKey(altCrest.Value))
			{
				ManualLogSource? log = Log;
				if (log != null)
				{
					log.LogError((object)(altCrest.Value + " is not a valid crest! (Did you type the name correctly?)"));
				}
			}
			else
			{
				if (PlayerData.instance.CurrentCrestID == "Cursed" || PlayerData.instance.CurrentCrestID == "Cloakless" || !heroController.CanAttack() || crestSwapCooldownTimer > 0f)
				{
					return;
				}
				heroController.toolsFSM.SetState("Take Control");
				heroController.toolsFSM.SetState("Flea Brew Kickup");
				fleaBrewBurstState.Actions[2].enabled = false;
				AudioClip[] array = Resources.FindObjectsOfTypeAll<AudioClip>();
				for (int i = 0; i < array.Length; i++)
				{
					if (((Object)array[i]).name == "Silk_HUD_evo_3")
					{
						Silk_HUD_evo_3 = array[i];
					}
					if (((Object)array[i]).name == "hornet_flea_brew_effect_trigger")
					{
						hornet_flea_brew_effect_trigger = array[i];
					}
				}
				((PlayAudioEventBase)fleaBrewBurstState.Actions.OfType<PlayAudioEvent>().FirstOrDefault()).volume = FsmFloat.op_Implicit(0.8f);
				if ((Object)(object)Silk_HUD_evo_3 != (Object)null)
				{
					val.audioClip = FsmObject.op_Implicit((Object)(object)Silk_HUD_evo_3);
				}
				else
				{
					ManualLogSource? log2 = Log;
					if (log2 != null)
					{
						log2.LogWarning((object)"Silk_HUD_evo_3 was null");
					}
				}
				crestSwapCooldownTimer = crestSwapCooldown;
				heroController.TakeSilk(crestSwapSilkCost);
				if (Gameplay.HunterCrest2.IsUnlocked)
				{
					crestNames.Remove("hunter");
					crestNames.Add("hunter", Gameplay.HunterCrest2.name);
				}
				if (Gameplay.HunterCrest3.IsUnlocked)
				{
					crestNames.Remove("hunter");
					crestNames.Add("hunter", Gameplay.HunterCrest3.name);
				}
				bool isInRageMode = HeroController.instance.warriorState.IsInRageMode;
				float rageEffectTimeLeft = HeroController.instance.warriorState.RageEffectTimeLeft;
				int rageModeHealCount = HeroController.instance.warriorState.RageModeHealCount;
				float rageHealTimeLeft = HeroController.instance.warriorState.RageHealTimeLeft;
				int lastHealAttack = HeroController.instance.warriorState.LastHealAttack;
				bool isInReaperMode = HeroController.instance.reaperState.IsInReaperMode;
				float reaperModeDurationLeft = HeroController.instance.reaperState.ReaperModeDurationLeft;
				if (activeCrest == ActiveCrest.MAIN_CREST)
				{
					ToolItemManager.AutoEquip(ToolItemManager.GetCrestByName(crestNames[altCrest.Value]), false, false);
					activeCrest = ActiveCrest.ALT_CREST;
				}
				else
				{
					ToolItemManager.AutoEquip(ToolItemManager.GetCrestByName(crestNames[mainCrest.Value]), false, false);
					activeCrest = ActiveCrest.MAIN_CREST;
				}
				if (isInRageMode)
				{
					HeroController.instance.warriorState.IsInRageMode = isInRageMode;
					HeroController.instance.warriorState.RageEffectTimeLeft = rageEffectTimeLeft;
					HeroController.instance.warriorState.RageHealTimeLeft = rageHealTimeLeft;
					HeroController.instance.warriorState.RageModeHealCount = rageModeHealCount;
					HeroController.instance.warriorState.LastHealAttack = lastHealAttack;
					ToolCrest crestByName = ToolItemManager.GetCrestByName((activeCrest == ActiveCrest.MAIN_CREST) ? crestNames[mainCrest.Value] : crestNames[altCrest.Value]);
					if (crestByName.HeroConfig.GetAnimationClip("Rage Idle") == null)
					{
						ManualLogSource? log3 = Log;
						if (log3 != null)
						{
							log3.LogInfo((object)("Rage Idle is not on " + crestByName.name + " crest! Patching..."));
						}
						tk2dSpriteAnimationClip animationClip = ToolItemManager.GetCrestByName("Warrior").HeroConfig.GetAnimationClip("Rage Idle");
						tk2dSpriteAnimationClip animationClip2 = ToolItemManager.GetCrestByName("Warrior").HeroConfig.GetAnimationClip("Rage Idle End");
						int num = crestByName.HeroConfig.heroAnimOverrideLib.clips.Length;
						int id = num + 1;
						CollectionExtensions.AddItem<tk2dSpriteAnimationClip>((IEnumerable<tk2dSpriteAnimationClip>)crestByName.HeroConfig.heroAnimOverrideLib.clips, animationClip);
						CollectionExtensions.AddItem<tk2dSpriteAnimationClip>((IEnumerable<tk2dSpriteAnimationClip>)crestByName.HeroConfig.heroAnimOverrideLib.clips, animationClip2);
						crestByName.HeroConfig.heroAnimOverrideLib.lookup.Add(animationClip.name, new AnimationInfo
						{
							clip = animationClip,
							id = num
						});
						crestByName.HeroConfig.heroAnimOverrideLib.lookup.Add(animationClip2.name, new AnimationInfo
						{
							clip = animationClip2,
							id = id
						});
						ManualLogSource? log4 = Log;
						if (log4 != null)
						{
							log4.LogInfo((object)("Patched " + crestByName.name + " crest."));
						}
					}
					StatusVignette.AddStatus((StatusTypes)3);
					Transform val2 = ((Component)heroController).gameObject.transform.Find("crest_warrior_effects(Clone)");
					if ((Object)(object)val2 != (Object)null)
					{
						((Component)val2).gameObject.SetActive(true);
					}
					else
					{
						ManualLogSource? log5 = Log;
						if (log5 != null)
						{
							log5.LogWarning((object)"crest_warrior_effects was not found");
						}
					}
				}
				if (isInReaperMode)
				{
					HeroController.instance.reaperState.IsInReaperMode = true;
					HeroController.instance.reaperState.ReaperModeDurationLeft = reaperModeDurationLeft;
					if (Object.op_Implicit((Object)(object)HeroController.instance.reaperModeEffect))
					{
						((Component)HeroController.instance.reaperModeEffect).gameObject.SetActive(false);
						((Component)HeroController.instance.reaperModeEffect).gameObject.SetActive(true);
					}
				}
				HeroController.instance.UpdateSilkCursed();
			}
		}
	}
}