Decompiled source of AutoQuestEnder v1.4.1

AutoQuestEnder.dll

Decompiled 3 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using GlobalSettings;
using HarmonyLib;
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("AutoQuestEnder")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.4.1.0")]
[assembly: AssemblyInformationalVersion("1.4.1+2ad7cf974dbb634abaf2346fab29f5487100ea0c")]
[assembly: AssemblyProduct("Auto Quest Ender")]
[assembly: AssemblyTitle("AutoQuestEnder")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.1.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;
		}
	}
}
internal sealed class ConfigurationManagerAttributes
{
	public delegate void CustomHotkeyDrawerFunc(ConfigEntryBase setting, ref bool isCurrentlyAcceptingInput);

	public bool? ShowRangeAsPercent;

	public Action<ConfigEntryBase> CustomDrawer;

	public CustomHotkeyDrawerFunc CustomHotkeyDrawer;

	public bool? Browsable;

	public string Category;

	public object DefaultValue;

	public bool? HideDefaultButton;

	public bool? HideSettingName;

	public string Description;

	public string DispName;

	public int? Order;

	public bool? ReadOnly;

	public bool? IsAdvanced;

	public Func<object, string> ObjToStr;

	public Func<string, object> StrToObj;
}
namespace AutoQuestEnder
{
	[BepInPlugin("AutoQuestEnder", "Auto Quest Ender", "1.4.1")]
	public class AutoQuestEnderMain : BaseUnityPlugin
	{
		public static AutoQuestEnderMain Instance;

		private Harmony harmony;

		public ConfigEntry<bool> IsEnabled;

		public ConfigEntry<bool> AutoFinishQuestOnNPCTalk;

		private ConfigEntry<BossQuestType> AllowedBossQuests;

		private readonly string[] ExceptionQuests = new string[4] { "A Pinsmiths Tools", "Soul Snare", "Wood Witch Curse", "Doctor Curse Cure" };

		private readonly Dictionary<string, BossQuestType> bossQuests = new Dictionary<string, BossQuestType>
		{
			{
				"Skull King",
				BossQuestType.SkullTyrant
			},
			{
				"Beastfly Hunt",
				BossQuestType.Beastfly
			},
			{
				"Broodmother Hunt",
				BossQuestType.Broodmother
			},
			{
				"Song Knight",
				BossQuestType.SecondSentinel
			},
			{
				"Bellbeast Rescue",
				BossQuestType.BellEater
			},
			{
				"Pinstress Battle Pre",
				BossQuestType.Pinstress
			},
			{
				"Tormented Trobbio",
				BossQuestType.TormentedTrobbio
			},
			{
				"Garmond Black Threaded",
				BossQuestType.LostGarmond
			},
			{
				"Ant Trapper",
				BossQuestType.GurrTheOutcast
			}
		};

		public void Awake()
		{
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Expected O, but got Unknown
			harmony = Harmony.CreateAndPatchAll(typeof(AutoQuestEnderMain).Assembly, (string)null);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Auto Quest Ender is loaded");
			IsEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Is Enabled", true, "Sets whether quests should automatically complete on get.");
			AutoFinishQuestOnNPCTalk = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Finish Quests on NPC Interact", true, "Sets whether already active quests should automatically complete upon interacting with a NPC.");
			AllowedBossQuests = ((BaseUnityPlugin)this).Config.Bind<BossQuestType>("Select Boss Quests", "Allowed Boss Quests", BossQuestType.All, new ConfigDescription("Select boss quests that will be automatically skipped.", (AcceptableValueBase)null, new object[1]
			{
				new ConfigurationManagerAttributes
				{
					CustomDrawer = BossQuestFlagDrawer.DrawBossQuestFlags
				}
			}));
			Instance = this;
		}

		public void OnQuestStart(FullQuestBase quest)
		{
			Log("QUEST STARTED: " + ((Object)quest).name);
			HandleDoctorCurseCureItem(quest);
			HandleSoulSnareItem(quest);
		}

		private void HandleDoctorCurseCureItem(FullQuestBase quest)
		{
			if (((Object)quest).name == "Doctor Curse Cure")
			{
				CollectableItemManager.AddItem(CollectableItemManager.GetItemByName("Extractor Machine Pins"), 1);
			}
		}

		private void HandleSoulSnareItem(FullQuestBase quest)
		{
			if (!(((Object)quest).name != "Soul Snare"))
			{
				CollectableItemManager.AddItem(CollectableItemManager.GetItemByName("Snare Soul Churchkeeper"), 1);
				CollectableItemManager.AddItem(CollectableItemManager.GetItemByName("Snare Soul Bell Hermit"), 1);
				CollectableItemManager.AddItem(CollectableItemManager.GetItemByName("Snare Soul Swamp Bug"), 1);
				((SavedItem)ToolItemManager.GetToolByName("Silk Snare")).Get(true);
			}
		}

		public void OnQuestComplete(FullQuestBase quest)
		{
			GetItem(quest);
			CheckBrollyQuest(quest);
			CheckSaveShermaQuest(quest);
			CheckMossQuest();
		}

		private void GetItem(FullQuestBase quest)
		{
			SavedItem rewardItem = quest.RewardItem;
			if (Object.op_Implicit((Object)(object)rewardItem))
			{
				rewardItem.Get(quest.RewardCount, true);
			}
		}

		public void CheckMossQuest()
		{
			if (QuestManager.GetQuest("Mossberry Collection Pre").IsCompleted && !Gameplay.MossCreep1Tool.IsUnlocked)
			{
				((SavedItem)Gameplay.MossCreep1Tool).Get(true);
			}
		}

		public void CheckBrollyQuest(FullQuestBase quest)
		{
			if (((Object)quest).name == "Brolly Get" && quest.IsCompleted && !PlayerData.instance.hasBrolly)
			{
				PlayerData.instance.hasBrolly = true;
			}
		}

		public void CheckDoctorCurseCureQuest(FullQuestBase quest)
		{
			if (!(((Object)quest).name != "Doctor Curse Cure") && quest.IsCompleted && PlayerData.instance.IsAnyCursed)
			{
				Gameplay.WitchCrest.Unlock();
				ToolItemManager.SetEquippedCrest(Gameplay.WitchCrest.name);
			}
		}

		public void CheckSoulSnareQuest()
		{
			if ((QuestManager.GetQuest("Soul Snare").IsCompleted || QuestManager.GetQuest("Soul Snare Pre").IsCompleted) && !PlayerData.instance.soulSnareReady)
			{
				PlayerData.instance.soulSnareReady = true;
			}
		}

		public void CheckSaveShermaQuest(FullQuestBase quest)
		{
			if (((Object)quest).name == "Save Sherma")
			{
				PrefabCollectable val = ((IEnumerable<PrefabCollectable>)Resources.FindObjectsOfTypeAll<PrefabCollectable>()).FirstOrDefault((Func<PrefabCollectable, bool>)((PrefabCollectable item) => ((Object)item).name == "Silk Spool"));
				if (val != null)
				{
					((SavedItem)val).Get(true);
				}
			}
		}

		public bool IsQuestException(FullQuestBase quest)
		{
			if (bossQuests.TryGetValue(((Object)quest).name, out var value))
			{
				Log($"Found quest type: {value}");
				return AllowedBossQuests.Value.HasFlag(value);
			}
			return ExceptionQuests.Contains(((Object)quest).name);
		}

		public void Log(string message)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)message);
		}

		public void OnDestroy()
		{
			Harmony obj = harmony;
			if (obj != null)
			{
				obj.UnpatchSelf();
			}
			Instance = null;
		}
	}
	[Flags]
	public enum BossQuestType
	{
		None = 0,
		SkullTyrant = 1,
		Beastfly = 2,
		Broodmother = 4,
		SecondSentinel = 8,
		BellEater = 0x10,
		Pinstress = 0x20,
		TormentedTrobbio = 0x40,
		LostGarmond = 0x80,
		GurrTheOutcast = 0x100,
		All = 0x1FF
	}
	public class BossQuestFlagDrawer
	{
		private static Dictionary<BossQuestType, string> bossQuestNames = new Dictionary<BossQuestType, string>
		{
			{
				BossQuestType.SkullTyrant,
				"The Great Tyrant (Skull Tyrant)"
			},
			{
				BossQuestType.Beastfly,
				"Grand Hunt (Savage Beastfly)"
			},
			{
				BossQuestType.Broodmother,
				"The Wailing Mother (Broodmother)"
			},
			{
				BossQuestType.SecondSentinel,
				"Final Audience (Second Sentinel)"
			},
			{
				BossQuestType.BellEater,
				"Beast in the Bells (Bell Eater)"
			},
			{
				BossQuestType.Pinstress,
				"Fatal Resolve (Pinstress)"
			},
			{
				BossQuestType.TormentedTrobbio,
				"Pain, Anguish and Misery (Tormented Trobbio)"
			},
			{
				BossQuestType.LostGarmond,
				"Hero's Call (Lost Garmond)"
			},
			{
				BossQuestType.GurrTheOutcast,
				"Hidden Hunter (Gurr the Outcast)"
			}
		};

		public static void DrawBossQuestFlags(ConfigEntryBase entry)
		{
			BossQuestType bossQuestType = (BossQuestType)entry.BoxedValue;
			GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
			foreach (KeyValuePair<BossQuestType, string> bossQuestName in bossQuestNames)
			{
				bossQuestName.Deconstruct(out var key, out var value);
				BossQuestType bossQuestType2 = key;
				string text = value;
				bool flag = bossQuestType.HasFlag(bossQuestType2);
				bool flag2 = GUILayout.Toggle(flag, text, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) });
				if (flag2 != flag)
				{
					bossQuestType = (flag2 ? (bossQuestType | bossQuestType2) : (bossQuestType & ~bossQuestType2));
					entry.BoxedValue = bossQuestType;
				}
			}
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			if (GUILayout.Button("Select All", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }))
			{
				entry.BoxedValue = BossQuestType.All;
			}
			if (GUILayout.Button("Clear All", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }))
			{
				entry.BoxedValue = BossQuestType.None;
			}
			GUILayout.EndHorizontal();
			GUILayout.EndVertical();
		}
	}
	[HarmonyPatch]
	public class HeroInitializePatches
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(HeroController), "Start")]
		private static void CheckCompletedQuests()
		{
			CheckMossToolQuest();
			CheckBrollyGetQuest();
			CheckDoctorCurseCureQuest();
			CheckSoulSnareQuest();
		}

		private static void CheckMossToolQuest()
		{
			AutoQuestEnderMain.Instance.CheckMossQuest();
		}

		private static void CheckBrollyGetQuest()
		{
			AutoQuestEnderMain.Instance.CheckBrollyQuest(QuestManager.GetQuest("Brolly Get"));
		}

		private static void CheckDoctorCurseCureQuest()
		{
			AutoQuestEnderMain.Instance.CheckDoctorCurseCureQuest(QuestManager.GetQuest("Doctor Curse Cure"));
		}

		private static void CheckSoulSnareQuest()
		{
			AutoQuestEnderMain.Instance.CheckSoulSnareQuest();
		}
	}
	[HarmonyPatch]
	public class QuestGiverPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(PlayMakerNPC), "OnStartDialogue")]
		private static void AutoCompleteQuestsOnInteractPatch(ref PlayMakerNPC __instance)
		{
			if (!AutoQuestEnderMain.Instance.IsEnabled.Value || ((Object)__instance).name == "City Travel Tube" || !AutoQuestEnderMain.Instance.AutoFinishQuestOnNPCTalk.Value)
			{
				return;
			}
			foreach (FullQuestBase quest in QuestManager.GetActiveQuests())
			{
				if (!(quest is MainQuest) && !AutoQuestEnderMain.Instance.IsQuestException(quest))
				{
					quest.TryEndQuest((Action)delegate
					{
						AutoQuestEnderMain.Instance.OnQuestComplete(quest);
					}, false, true, true);
				}
			}
		}
	}
	[HarmonyPatch]
	public class QuestPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(FullQuestBase), "BeginQuest")]
		private static void AutoEndQuestOnStartPatch(ref FullQuestBase __instance)
		{
			AutoQuestEnderMain.Instance.OnQuestStart(__instance);
			if (AutoQuestEnderMain.Instance.IsEnabled.Value && !(__instance is MainQuest) && !AutoQuestEnderMain.Instance.IsQuestException(__instance))
			{
				FullQuestBase instance = __instance;
				__instance.TryEndQuest((Action)delegate
				{
					AutoQuestEnderMain.Instance.OnQuestComplete(instance);
				}, false, true, true);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(FullQuestBase), "GetIsReadyToTurnIn")]
		private static void SetIsReadyAlwaysTruePatch(FullQuestBase __instance, ref bool __result)
		{
			if (AutoQuestEnderMain.Instance.IsEnabled.Value)
			{
				__result = true;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		private static void SetCanCompleteTruePatch(FullQuestBase __instance, ref bool __result)
		{
			if (!(__instance is MainQuest) && AutoQuestEnderMain.Instance.IsEnabled.Value)
			{
				__result = true;
			}
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "AutoQuestEnder";

		public const string PLUGIN_NAME = "Auto Quest Ender";

		public const string PLUGIN_VERSION = "1.4.1";
	}
}