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";
}
}