Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of AutoQuestEnder v1.4.1
AutoQuestEnder.dll
Decompiled 9 months agousing 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"; } }