qstbak/Questionable/Questionable.External/QuestionableIpc.cs
2026-08-17 20:29:32 +10:00

1277 lines
42 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.DependencyInjection;
using Questionable.Controller;
using Questionable.Controller.Conditions;
using Questionable.Controller.Steps;
using Questionable.Data;
using Questionable.Functions;
using Questionable.Model;
using Questionable.Model.Questing;
using Questionable.Windows.JournalComponents;
using Questionable.Windows.QuestComponents;
namespace Questionable.External;
internal sealed class QuestionableIpc : IDisposable
{
public sealed class StepData
{
public required string QuestId { get; init; }
public required byte Sequence { get; init; }
public required int Step { get; init; }
public required string InteractionType { get; init; }
public required Vector3? Position { get; init; }
public required ushort TerritoryId { get; init; }
}
public sealed class TaskData
{
public required string TaskName { get; init; }
public required int RemainingTaskCount { get; init; }
}
public sealed class StopConditionData
{
public required bool Enabled { get; init; }
public required int TargetValue { get; init; }
}
public sealed class MsqLevelLockData
{
public required bool IsLevelLocked { get; init; }
public required int LevelsNeeded { get; init; }
public required int RequiredLevel { get; init; }
public required string? QuestName { get; init; }
}
private const string IpcGetAlliedSocietyRemainingAllowances = "Questionable.AlliedSociety.GetRemainingAllowances";
private const string IpcGetAlliedSocietyTimeUntilReset = "Questionable.AlliedSociety.GetTimeUntilReset";
private const string IpcGetAlliedSocietyAvailableQuestIds = "Questionable.AlliedSociety.GetAvailableQuestIds";
private const string IpcGetAlliedSocietyAllAvailableQuestCounts = "Questionable.AlliedSociety.GetAllAvailableQuestCounts";
private const string IpcGetAlliedSocietyIsMaxRank = "Questionable.AlliedSociety.IsMaxRank";
private const string IpcGetAlliedSocietyCurrentRank = "Questionable.AlliedSociety.GetCurrentRank";
private const string IpcGetAlliedSocietiesWithAvailableQuests = "Questionable.AlliedSociety.GetSocietiesWithAvailableQuests";
private const string IpcAddAlliedSocietyOptimalQuests = "Questionable.AlliedSociety.AddOptimalQuests";
private const string IpcGetAlliedSocietyOptimalQuests = "Questionable.AlliedSociety.GetOptimalQuests";
private const string IpcGetBlacklistedQuests = "Questionable.GetBlacklistedQuests";
private const string IpcAddBlacklistedQuest = "Questionable.AddBlacklistedQuest";
private const string IpcRemoveBlacklistedQuest = "Questionable.RemoveBlacklistedQuest";
private const string IpcClearBlacklistedQuests = "Questionable.ClearBlacklistedQuests";
private const string IpcIsQuestBlacklisted = "Questionable.IsQuestBlacklisted";
private readonly QuestController _questController;
private readonly EventInfoComponent _eventInfoComponent;
private readonly QuestRegistry _questRegistry;
private readonly QuestFunctions _questFunctions;
private readonly QuestData _questData;
private readonly ManualPriorityComponent _manualPriorityComponent;
private readonly Configuration _configuration;
private readonly IDalamudPluginInterface _pluginInterface;
private readonly IServiceProvider _serviceProvider;
private readonly AutoDutyIpc _autoDutyIpc;
private readonly IObjectTable _objectTable;
private readonly List<Action> _unregisterActions = new List<Action>();
private const string IpcGetDefaultDutyMode = "Questionable.GetDefaultDutyMode";
private const string IpcSetDefaultDutyMode = "Questionable.SetDefaultDutyMode";
private const string IpcGetDutyModeOverride = "Questionable.GetDutyModeOverride";
private const string IpcSetDutyModeOverride = "Questionable.SetDutyModeOverride";
private const string IpcClearDutyModeOverride = "Questionable.ClearDutyModeOverride";
private const string IpcClearAllDutyModeOverrides = "Questionable.ClearAllDutyModeOverrides";
private const string IpcIsLevelingModeEnabled = "Questionable.IsLevelingModeEnabled";
private const string IpcSetLevelingModeEnabled = "Questionable.SetLevelingModeEnabled";
private const string IpcGetMsqLevelLockInfo = "Questionable.GetMsqLevelLockInfo";
private const string IpcStartLevelingMode = "Questionable.StartLevelingMode";
private const string IpcStopLevelingMode = "Questionable.StopLevelingMode";
private static readonly (int Major, int Minor) ApiVersion = (Major: 1, Minor: 0);
private const string IpcApiVersion = "Questionable.ApiVersion";
private const string IpcGetMsqPriorityMode = "Questionable.GetMsqPriorityMode";
private const string IpcSetMsqPriorityMode = "Questionable.SetMsqPriorityMode";
private const string IpcImportQuestPriority = "Questionable.ImportQuestPriority";
private const string IpcClearQuestPriority = "Questionable.ClearQuestPriority";
private const string IpcAddQuestPriority = "Questionable.AddQuestPriority";
private const string IpcInsertQuestPriority = "Questionable.InsertQuestPriority";
private const string IpcExportQuestPriority = "Questionable.ExportQuestPriority";
private const string IpcGetPriorityQuests = "Questionable.GetPriorityQuests";
private const string IpcRemovePriorityQuest = "Questionable.RemovePriorityQuest";
private const string IpcReorderPriorityQuest = "Questionable.ReorderPriorityQuest";
private const string IpcGetAvailablePresets = "Questionable.GetAvailablePresets";
private const string IpcGetPresetQuests = "Questionable.GetPresetQuests";
private const string IpcAddPresetToPriority = "Questionable.AddPresetToPriority";
private const string IpcIsPresetAvailable = "Questionable.IsPresetAvailable";
private const string IpcIsQuestInPriority = "Questionable.IsQuestInPriority";
private const string IpcGetQuestPriorityIndex = "Questionable.GetQuestPriorityIndex";
private const string IpcHasAvailablePriorityQuests = "Questionable.HasAvailablePriorityQuests";
private const string IpcIsRunning = "Questionable.IsRunning";
private const string IpcGetCurrentQuestId = "Questionable.GetCurrentQuestId";
private const string IpcGetCurrentStepData = "Questionable.GetCurrentStepData";
private const string IpcGetCurrentTask = "Questionable.GetCurrentTask";
private const string IpcGetCurrentlyActiveEventQuests = "Questionable.GetCurrentlyActiveEventQuests";
private const string IpcStartQuest = "Questionable.StartQuest";
private const string IpcStartSingleQuest = "Questionable.StartSingleQuest";
private const string IpcIsQuestLocked = "Questionable.IsQuestLocked";
private const string IpcIsQuestComplete = "Questionable.IsQuestComplete";
private const string IpcIsReadyToAcceptQuest = "Questionable.IsReadyToAcceptQuest";
private const string IpcIsQuestAccepted = "Questionable.IsQuestAccepted";
private const string IpcIsQuestUnobtainable = "Questionable.IsQuestUnobtainable";
private const string IpcGetStopConditionsEnabled = "Questionable.GetStopConditionsEnabled";
private const string IpcSetStopConditionsEnabled = "Questionable.SetStopConditionsEnabled";
private const string IpcGetStopQuestList = "Questionable.GetStopQuestList";
private const string IpcAddStopQuest = "Questionable.AddStopQuest";
private const string IpcRemoveStopQuest = "Questionable.RemoveStopQuest";
private const string IpcClearStopQuests = "Questionable.ClearStopQuests";
private const string IpcGetLevelStopCondition = "Questionable.GetLevelStopCondition";
private const string IpcSetLevelStopCondition = "Questionable.SetLevelStopCondition";
private const string IpcGetSequenceStopCondition = "Questionable.GetSequenceStopCondition";
private const string IpcSetSequenceStopCondition = "Questionable.SetSequenceStopCondition";
private const string IpcGetQuestSequenceStopCondition = "Questionable.GetQuestSequenceStopCondition";
private const string IpcSetQuestSequenceStopCondition = "Questionable.SetQuestSequenceStopCondition";
private const string IpcRemoveQuestSequenceStopCondition = "Questionable.RemoveQuestSequenceStopCondition";
private const string IpcGetAllQuestSequenceStopConditions = "Questionable.GetAllQuestSequenceStopConditions";
private const string IpcGetLevelStopMode = "Questionable.GetLevelStopMode";
private const string IpcSetLevelStopMode = "Questionable.SetLevelStopMode";
private const string IpcGetSequenceStopMode = "Questionable.GetSequenceStopMode";
private const string IpcSetSequenceStopMode = "Questionable.SetSequenceStopMode";
private const string IpcGetQuestStopMode = "Questionable.GetQuestStopMode";
private const string IpcSetQuestStopMode = "Questionable.SetQuestStopMode";
private void RegisterAlliedSocietyIpc()
{
Register("Questionable.AlliedSociety.GetRemainingAllowances", GetAlliedSocietyRemainingAllowances);
Register("Questionable.AlliedSociety.GetTimeUntilReset", GetAlliedSocietyTimeUntilReset);
Register<byte, List<string>>("Questionable.AlliedSociety.GetAvailableQuestIds", GetAlliedSocietyAvailableQuestIds);
Register("Questionable.AlliedSociety.GetAllAvailableQuestCounts", GetAlliedSocietyAllAvailableQuestCounts);
Register<byte, bool>("Questionable.AlliedSociety.IsMaxRank", GetAlliedSocietyIsMaxRank);
Register<byte, int>("Questionable.AlliedSociety.GetCurrentRank", GetAlliedSocietyCurrentRank);
Register("Questionable.AlliedSociety.GetSocietiesWithAvailableQuests", GetAlliedSocietiesWithAvailableQuests);
Register<byte, int>("Questionable.AlliedSociety.AddOptimalQuests", AddAlliedSocietyOptimalQuests);
Register<byte, List<string>>("Questionable.AlliedSociety.GetOptimalQuests", GetAlliedSocietyOptimalQuests);
}
private unsafe int GetAlliedSocietyRemainingAllowances()
{
QuestManager* ptr = QuestManager.Instance();
if (ptr == null)
{
return 12;
}
return (int)ptr->GetBeastTribeAllowance();
}
private long GetAlliedSocietyTimeUntilReset()
{
TimeSpan item = AlliedSocietyJournalComponent.CalculateTimeUntilReset().TimeUntilReset;
return item.Ticks;
}
private List<string> GetAlliedSocietyAvailableQuestIds(byte alliedSocietyId)
{
if (alliedSocietyId == 0 || !Enum.IsDefined(typeof(EAlliedSociety), alliedSocietyId))
{
return new List<string>();
}
EAlliedSociety alliedSociety = (EAlliedSociety)alliedSocietyId;
return (from q in _serviceProvider.GetRequiredService<AlliedSocietyQuestFunctions>().GetAvailableAlliedSocietyQuests(alliedSociety)
select q.ToString()).ToList();
}
private Dictionary<byte, int> GetAlliedSocietyAllAvailableQuestCounts()
{
Dictionary<byte, int> dictionary = new Dictionary<byte, int>();
AlliedSocietyQuestFunctions requiredService = _serviceProvider.GetRequiredService<AlliedSocietyQuestFunctions>();
EAlliedSociety[] values = Enum.GetValues<EAlliedSociety>();
foreach (EAlliedSociety eAlliedSociety in values)
{
if (eAlliedSociety != EAlliedSociety.None)
{
int count = requiredService.GetAvailableAlliedSocietyQuests(eAlliedSociety).Count;
if (count > 0)
{
dictionary[(byte)eAlliedSociety] = count;
}
}
}
return dictionary;
}
private unsafe bool GetAlliedSocietyIsMaxRank(byte alliedSocietyId)
{
if (!Enum.IsDefined(typeof(EAlliedSociety), alliedSocietyId) || alliedSocietyId == 0)
{
return false;
}
QuestManager* ptr = QuestManager.Instance();
if (ptr == null)
{
return false;
}
byte b = (byte)(ptr->BeastReputation[alliedSocietyId - 1].Rank & 0x7F);
return b >= (EAlliedSociety)alliedSocietyId switch
{
EAlliedSociety.Amaljaa => 3,
EAlliedSociety.Sylphs => 3,
EAlliedSociety.Kobolds => 3,
EAlliedSociety.Sahagin => 3,
EAlliedSociety.Ixal => 7,
_ => 8,
};
}
private unsafe int GetAlliedSocietyCurrentRank(byte alliedSocietyId)
{
if (!Enum.IsDefined(typeof(EAlliedSociety), alliedSocietyId) || alliedSocietyId == 0)
{
return -1;
}
QuestManager* ptr = QuestManager.Instance();
if (ptr == null)
{
return -1;
}
return (byte)(ptr->BeastReputation[alliedSocietyId - 1].Rank & 0x7F);
}
private List<byte> GetAlliedSocietiesWithAvailableQuests()
{
List<byte> list = new List<byte>();
AlliedSocietyQuestFunctions requiredService = _serviceProvider.GetRequiredService<AlliedSocietyQuestFunctions>();
EAlliedSociety[] values = Enum.GetValues<EAlliedSociety>();
foreach (EAlliedSociety eAlliedSociety in values)
{
if (eAlliedSociety != EAlliedSociety.None && requiredService.GetAvailableAlliedSocietyQuests(eAlliedSociety).Count > 0)
{
list.Add((byte)eAlliedSociety);
}
}
return list;
}
private int AddAlliedSocietyOptimalQuests(byte alliedSocietyId)
{
if (!Enum.IsDefined(typeof(EAlliedSociety), alliedSocietyId) || alliedSocietyId == 0)
{
return 0;
}
EAlliedSociety eAlliedSociety = (EAlliedSociety)alliedSocietyId;
List<QuestId> availableAlliedSocietyQuests = _serviceProvider.GetRequiredService<AlliedSocietyQuestFunctions>().GetAvailableAlliedSocietyQuests(eAlliedSociety);
if (availableAlliedSocietyQuests.Count == 0)
{
return 0;
}
IQuestInfo questInfo;
Quest quest;
List<QuestInfo> list = (from questInfo in availableAlliedSocietyQuests.Select((QuestId questId) => (!_questData.TryGetQuestInfo(questId, out questInfo)) ? null : questInfo).OfType<QuestInfo>()
where _questRegistry.TryGetQuest(questInfo.QuestId, out quest) && !quest.Root.Disabled
where !_questController.ManualPriorityQuests.Any((Quest pq) => pq.Id.Equals(questInfo.QuestId))
orderby questInfo.AlliedSocietyRank descending
select questInfo).ToList();
if (list.Count == 0)
{
return 0;
}
int val = (((int)eAlliedSociety <= 5) ? 12 : 3);
int alliedSocietyRemainingAllowances = GetAlliedSocietyRemainingAllowances();
int count = Math.Min(Math.Min(val, alliedSocietyRemainingAllowances), list.Count);
int num = 0;
foreach (QuestInfo item in list.Take(count))
{
if (_questController.AddQuestPriority(item.QuestId))
{
num++;
}
}
return num;
}
private List<string> GetAlliedSocietyOptimalQuests(byte alliedSocietyId)
{
if (!Enum.IsDefined(typeof(EAlliedSociety), alliedSocietyId) || alliedSocietyId == 0)
{
return new List<string>();
}
EAlliedSociety eAlliedSociety = (EAlliedSociety)alliedSocietyId;
List<QuestId> availableAlliedSocietyQuests = _serviceProvider.GetRequiredService<AlliedSocietyQuestFunctions>().GetAvailableAlliedSocietyQuests(eAlliedSociety);
if (availableAlliedSocietyQuests.Count == 0)
{
return new List<string>();
}
IQuestInfo questInfo;
Quest quest;
List<QuestInfo> list = (from questInfo in availableAlliedSocietyQuests.Select((QuestId questId) => (!_questData.TryGetQuestInfo(questId, out questInfo)) ? null : questInfo).OfType<QuestInfo>()
where _questRegistry.TryGetQuest(questInfo.QuestId, out quest) && !quest.Root.Disabled
where !_questController.ManualPriorityQuests.Any((Quest pq) => pq.Id.Equals(questInfo.QuestId))
orderby questInfo.AlliedSocietyRank descending
select questInfo).ToList();
if (list.Count == 0)
{
return new List<string>();
}
int val = (((int)eAlliedSociety <= 5) ? 12 : 3);
int alliedSocietyRemainingAllowances = GetAlliedSocietyRemainingAllowances();
int count = Math.Min(Math.Min(val, alliedSocietyRemainingAllowances), list.Count);
return (from q in list.Take(count)
select q.QuestId.ToString()).ToList();
}
private void RegisterBlacklistIpc()
{
Register("Questionable.GetBlacklistedQuests", GetBlacklistedQuests);
Register<string, bool>("Questionable.AddBlacklistedQuest", AddBlacklistedQuest);
Register<string, bool>("Questionable.RemoveBlacklistedQuest", RemoveBlacklistedQuest);
Register("Questionable.ClearBlacklistedQuests", ClearBlacklistedQuests);
Register<string, bool>("Questionable.IsQuestBlacklisted", IsQuestBlacklistedIpc);
}
private List<string> GetBlacklistedQuests()
{
return _configuration.General.BlacklistedQuests.Select((ElementId q) => q.ToString()).ToList();
}
private bool AddBlacklistedQuest(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null && _configuration.General.BlacklistedQuests.Add(elementId))
{
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
return false;
}
private bool RemoveBlacklistedQuest(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
bool num = _configuration.General.BlacklistedQuests.Remove(elementId);
if (num)
{
_pluginInterface.SavePluginConfig(_configuration);
}
return num;
}
return false;
}
private bool ClearBlacklistedQuests()
{
_configuration.General.BlacklistedQuests.Clear();
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private bool IsQuestBlacklistedIpc(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
return _questFunctions.IsQuestBlacklisted(elementId);
}
return false;
}
public QuestionableIpc(QuestController questController, EventInfoComponent eventInfoComponent, QuestRegistry questRegistry, QuestFunctions questFunctions, QuestData questData, ManualPriorityComponent manualPriorityComponent, Configuration configuration, IDalamudPluginInterface pluginInterface, IServiceProvider serviceProvider, AutoDutyIpc autoDutyIpc, IObjectTable objectTable)
{
_questController = questController;
_eventInfoComponent = eventInfoComponent;
_questRegistry = questRegistry;
_questFunctions = questFunctions;
_questData = questData;
_manualPriorityComponent = manualPriorityComponent;
_configuration = configuration;
_pluginInterface = pluginInterface;
_serviceProvider = serviceProvider;
_autoDutyIpc = autoDutyIpc;
_objectTable = objectTable;
RegisterMetaIpc();
RegisterQuestStateIpc();
RegisterDutyModeIpc();
RegisterPriorityQuestIpc();
RegisterStopConditionIpc();
RegisterAlliedSocietyIpc();
RegisterLevelingModeIpc();
RegisterBlacklistIpc();
RegisterMsqPriorityIpc();
}
private void Register<TRet>(string name, Func<TRet> handler)
{
ICallGateProvider<TRet> ipcProvider = _pluginInterface.GetIpcProvider<TRet>(name);
ipcProvider.RegisterFunc(handler);
_unregisterActions.Add(ipcProvider.UnregisterFunc);
}
private void Register<T1, TRet>(string name, Func<T1, TRet> handler)
{
ICallGateProvider<T1, TRet> ipcProvider = _pluginInterface.GetIpcProvider<T1, TRet>(name);
ipcProvider.RegisterFunc(handler);
_unregisterActions.Add(ipcProvider.UnregisterFunc);
}
private void Register<T1, T2, TRet>(string name, Func<T1, T2, TRet> handler)
{
ICallGateProvider<T1, T2, TRet> ipcProvider = _pluginInterface.GetIpcProvider<T1, T2, TRet>(name);
ipcProvider.RegisterFunc(handler);
_unregisterActions.Add(ipcProvider.UnregisterFunc);
}
public void Dispose()
{
foreach (Action unregisterAction in _unregisterActions)
{
unregisterAction();
}
_unregisterActions.Clear();
}
private void RegisterDutyModeIpc()
{
Register("Questionable.GetDefaultDutyMode", GetDefaultDutyMode);
Register<int, bool>("Questionable.SetDefaultDutyMode", SetDefaultDutyMode);
Register<uint, int>("Questionable.GetDutyModeOverride", GetDutyModeOverride);
Register<uint, int, bool>("Questionable.SetDutyModeOverride", SetDutyModeOverride);
Register<uint, bool>("Questionable.ClearDutyModeOverride", ClearDutyModeOverride);
Register("Questionable.ClearAllDutyModeOverrides", ClearAllDutyModeOverrides);
}
private int GetDefaultDutyMode()
{
return (int)_configuration.Duties.DefaultDutyMode;
}
private bool SetDefaultDutyMode(int dutyMode)
{
if (!Enum.IsDefined(typeof(EDutyMode), dutyMode))
{
return false;
}
_configuration.Duties.DefaultDutyMode = (EDutyMode)dutyMode;
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private int GetDutyModeOverride(uint contentFinderConditionId)
{
if (_configuration.Duties.DutyModeOverrides.TryGetValue(contentFinderConditionId, out var value))
{
return (int)value;
}
return -1;
}
private bool SetDutyModeOverride(uint contentFinderConditionId, int dutyMode)
{
if (!Enum.IsDefined(typeof(EDutyMode), dutyMode))
{
return false;
}
_configuration.Duties.DutyModeOverrides[contentFinderConditionId] = (EDutyMode)dutyMode;
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private bool ClearDutyModeOverride(uint contentFinderConditionId)
{
bool num = _configuration.Duties.DutyModeOverrides.Remove(contentFinderConditionId);
if (num)
{
_pluginInterface.SavePluginConfig(_configuration);
}
return num;
}
private bool ClearAllDutyModeOverrides()
{
_configuration.Duties.DutyModeOverrides.Clear();
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private void RegisterLevelingModeIpc()
{
Register("Questionable.IsLevelingModeEnabled", IsLevelingModeEnabled);
Register<bool, bool>("Questionable.SetLevelingModeEnabled", SetLevelingModeEnabled);
Register("Questionable.GetMsqLevelLockInfo", GetMsqLevelLockInfo);
Register("Questionable.StartLevelingMode", StartLevelingMode);
Register("Questionable.StopLevelingMode", StopLevelingMode);
}
private bool IsLevelingModeEnabled()
{
return _configuration.Duties.RunLevelingModeWhenUnderleveled;
}
private bool SetLevelingModeEnabled(bool enabled)
{
_configuration.Duties.RunLevelingModeWhenUnderleveled = enabled;
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private MsqLevelLockData? GetMsqLevelLockInfo()
{
var (flag, levelsNeeded, requiredLevel, questName) = _questFunctions.GetMsqLevelLockInfo();
if (!flag)
{
return null;
}
return new MsqLevelLockData
{
IsLevelLocked = flag,
LevelsNeeded = levelsNeeded,
RequiredLevel = requiredLevel,
QuestName = questName
};
}
private bool StartLevelingMode()
{
if (!_autoDutyIpc.IsConfiguredToRunLevelingMode(_objectTable.LocalPlayer?.Level ?? 0))
{
return false;
}
return _autoDutyIpc.StartLevelingMode();
}
private bool StopLevelingMode()
{
return _autoDutyIpc.Stop();
}
private void RegisterMetaIpc()
{
Register("Questionable.ApiVersion", () => ((int, int))ApiVersion);
}
private void RegisterMsqPriorityIpc()
{
Register("Questionable.GetMsqPriorityMode", GetMsqPriorityMode);
Register<int, bool>("Questionable.SetMsqPriorityMode", SetMsqPriorityMode);
}
private int GetMsqPriorityMode()
{
return (int)_configuration.General.MsqPriority;
}
private bool SetMsqPriorityMode(int mode)
{
if (!Enum.IsDefined(typeof(Configuration.EMsqPriorityMode), mode))
{
return false;
}
_configuration.General.MsqPriority = (Configuration.EMsqPriorityMode)mode;
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private void RegisterPriorityQuestIpc()
{
Register<string, bool>("Questionable.ImportQuestPriority", ImportQuestPriority);
Register<string, bool>("Questionable.AddQuestPriority", AddQuestPriority);
Register("Questionable.ClearQuestPriority", ClearQuestPriority);
Register<int, string, bool>("Questionable.InsertQuestPriority", InsertQuestPriority);
Register("Questionable.ExportQuestPriority", _manualPriorityComponent.EncodeQuestPriority);
Register("Questionable.GetPriorityQuests", GetPriorityQuests);
Register<string, bool>("Questionable.RemovePriorityQuest", RemovePriorityQuest);
Register<string, int, bool>("Questionable.ReorderPriorityQuest", ReorderPriorityQuest);
Register("Questionable.GetAvailablePresets", GetAvailablePresets);
Register<string, List<string>>("Questionable.GetPresetQuests", GetPresetQuests);
Register<string, int>("Questionable.AddPresetToPriority", AddPresetToPriority);
Register<string, bool>("Questionable.IsPresetAvailable", IsPresetAvailable);
Register<string, bool>("Questionable.IsQuestInPriority", IsQuestInPriority);
Register<string, int>("Questionable.GetQuestPriorityIndex", GetQuestPriorityIndex);
Register("Questionable.HasAvailablePriorityQuests", HasAvailablePriorityQuests);
}
private bool ImportQuestPriority(string encodedQuestPriority)
{
List<ElementId> list = ManualPriorityComponent.DecodeQuestPriority(encodedQuestPriority);
if (list.Count > 0)
{
return _questController.ImportQuestPriority(list);
}
return false;
}
private bool ClearQuestPriority()
{
_questController.ClearQuestPriority();
return true;
}
private bool AddQuestPriority(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null && _questRegistry.IsKnownQuest(elementId))
{
return _questController.AddQuestPriority(elementId);
}
return false;
}
private bool InsertQuestPriority(int index, string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null && _questRegistry.IsKnownQuest(elementId))
{
return _questController.InsertQuestPriority(index, elementId);
}
return false;
}
private List<string> GetPriorityQuests()
{
return _questController.ManualPriorityQuests.Select((Quest q) => q.Id.ToString()).ToList();
}
private bool RemovePriorityQuest(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
Quest quest = _questController.ManualPriorityQuests.FirstOrDefault((Quest q) => q.Id.Equals(elementId));
if (quest != null)
{
_questController.ManualPriorityQuests.Remove(quest);
_questController.SavePriorityQuests();
return true;
}
}
return false;
}
private bool ReorderPriorityQuest(string questId, int newIndex)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
Quest quest = _questController.ManualPriorityQuests.FirstOrDefault((Quest q) => q.Id.Equals(elementId));
if (quest != null && newIndex >= 0 && newIndex < _questController.ManualPriorityQuests.Count)
{
_questController.ManualPriorityQuests.Remove(quest);
_questController.ManualPriorityQuests.Insert(newIndex, quest);
_questController.SavePriorityQuests();
return true;
}
}
return false;
}
private List<string> GetAvailablePresets()
{
return new List<string> { "crystal_tower", "hard_primals" };
}
private List<string> GetPresetQuests(string presetName)
{
List<ElementId> source = ((presetName == "crystal_tower") ? QuestData.CrystalTowerQuests.Cast<ElementId>().ToList() : ((!(presetName == "hard_primals")) ? new List<ElementId>() : QuestData.HardModePrimals.Cast<ElementId>().ToList()));
return source.Select((ElementId q) => q.ToString()).ToList();
}
private int AddPresetToPriority(string presetName)
{
List<string> presetQuests = GetPresetQuests(presetName);
int num = 0;
foreach (string item in presetQuests)
{
if (ElementId.TryFromString(item, out ElementId elementId) && elementId != null && (_questFunctions.IsReadyToAcceptQuest(elementId) || _questFunctions.IsQuestAccepted(elementId)) && !_questController.ManualPriorityQuests.Any((Quest q) => q.Id.Equals(elementId)) && _questRegistry.IsKnownQuest(elementId) && _questController.AddQuestPriority(elementId))
{
num++;
}
}
return num;
}
private bool IsPresetAvailable(string presetName)
{
return GetAvailablePresets().Contains(presetName);
}
private bool IsQuestInPriority(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
return _questController.ManualPriorityQuests.Any((Quest q) => q.Id.Equals(elementId));
}
return false;
}
private int GetQuestPriorityIndex(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
Quest quest = _questController.ManualPriorityQuests.FirstOrDefault((Quest q) => q.Id.Equals(elementId));
if (quest != null)
{
return _questController.ManualPriorityQuests.IndexOf(quest);
}
}
return -1;
}
private bool HasAvailablePriorityQuests()
{
return _questFunctions.GetNextPriorityQuestsThatCanBeAccepted().Any((PriorityQuestInfo x) => x.IsAvailable);
}
private void RegisterQuestStateIpc()
{
Register("Questionable.IsRunning", () => _questController.AutomationType != QuestController.EAutomationType.Manual || _questController.IsRunning);
Register("Questionable.GetCurrentQuestId", () => _questController.CurrentQuest?.Quest.Id.ToString());
Register("Questionable.GetCurrentStepData", GetStepData);
Register("Questionable.GetCurrentTask", GetCurrentTask);
Register("Questionable.GetCurrentlyActiveEventQuests", () => (from q in _eventInfoComponent.GetCurrentlyActiveEventQuests()
select q.ToString()).ToList());
Register("Questionable.StartQuest", (string questId) => StartQuest(questId, single: false));
Register("Questionable.StartSingleQuest", (string questId) => StartQuest(questId, single: true));
Register<string, bool>("Questionable.IsQuestLocked", IsQuestLocked);
Register<string, bool>("Questionable.IsQuestComplete", IsQuestComplete);
Register<string, bool>("Questionable.IsReadyToAcceptQuest", IsReadyToAcceptQuest);
Register<string, bool>("Questionable.IsQuestAccepted", IsQuestAccepted);
Register<string, bool>("Questionable.IsQuestUnobtainable", IsQuestUnobtainable);
}
private bool StartQuest(string questId, bool single)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null && _questRegistry.TryGetQuest(elementId, out Quest quest))
{
_questController.SetNextQuest(quest);
if (single)
{
_questController.StartSingleQuest("IPCQuestSelection");
}
else
{
_questController.Start("IPCQuestSelection");
}
return true;
}
return false;
}
private StepData? GetStepData()
{
QuestController.QuestProgress currentQuest = _questController.CurrentQuest;
if (currentQuest == null)
{
return null;
}
string text = currentQuest.Quest.Id.ToString();
if (string.IsNullOrEmpty(text))
{
return null;
}
QuestStep questStep = currentQuest.Quest.FindSequence(currentQuest.Sequence)?.FindStep(currentQuest.Step);
if (questStep == null)
{
return null;
}
return new StepData
{
QuestId = text,
Sequence = currentQuest.Sequence,
Step = currentQuest.Step,
InteractionType = questStep.InteractionType.ToString(),
Position = questStep.Position,
TerritoryId = questStep.TerritoryId
};
}
private TaskData? GetCurrentTask()
{
ITask task = _questController.TaskQueue.CurrentTaskExecutor?.CurrentTask;
if (task == null)
{
return null;
}
int remainingTaskCount = _questController.TaskQueue.RemainingTasks.Count();
string taskName = task.ToString() ?? "Unknown";
return new TaskData
{
TaskName = taskName,
RemainingTaskCount = remainingTaskCount
};
}
private bool IsQuestLocked(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null && _questRegistry.TryGetQuest(elementId, out Quest _))
{
return _questFunctions.IsQuestLocked(elementId);
}
return true;
}
private bool IsQuestComplete(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
return _questFunctions.IsQuestComplete(elementId);
}
return false;
}
private bool IsReadyToAcceptQuest(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
return _questFunctions.IsReadyToAcceptQuest(elementId);
}
return false;
}
private bool IsQuestAccepted(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
return _questFunctions.IsQuestAccepted(elementId);
}
return false;
}
private bool IsQuestUnobtainable(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
return _questFunctions.IsQuestUnobtainable(elementId);
}
return false;
}
private void RegisterStopConditionIpc()
{
Register("Questionable.GetStopConditionsEnabled", GetStopConditionsEnabled);
Register<bool, bool>("Questionable.SetStopConditionsEnabled", SetStopConditionsEnabled);
Register("Questionable.GetStopQuestList", GetStopQuestList);
Register<string, bool>("Questionable.AddStopQuest", AddStopQuest);
Register<string, bool>("Questionable.RemoveStopQuest", RemoveStopQuest);
Register("Questionable.ClearStopQuests", ClearStopQuests);
Register("Questionable.GetLevelStopCondition", GetLevelStopCondition);
Register<bool, int, bool>("Questionable.SetLevelStopCondition", SetLevelStopCondition);
Register("Questionable.GetSequenceStopCondition", GetSequenceStopCondition);
Register<bool, int, bool>("Questionable.SetSequenceStopCondition", SetSequenceStopCondition);
Register<string, int>("Questionable.GetQuestSequenceStopCondition", GetQuestSequenceStopCondition);
Register<string, int, bool>("Questionable.SetQuestSequenceStopCondition", SetQuestSequenceStopCondition);
Register<string, bool>("Questionable.RemoveQuestSequenceStopCondition", RemoveQuestSequenceStopCondition);
Register("Questionable.GetAllQuestSequenceStopConditions", GetAllQuestSequenceStopConditions);
Register("Questionable.GetLevelStopMode", GetLevelStopMode);
Register<int, bool>("Questionable.SetLevelStopMode", SetLevelStopMode);
Register("Questionable.GetSequenceStopMode", GetSequenceStopMode);
Register<int, bool>("Questionable.SetSequenceStopMode", SetSequenceStopMode);
Register<string, int>("Questionable.GetQuestStopMode", GetQuestStopMode);
Register<string, int, bool>("Questionable.SetQuestStopMode", SetQuestStopMode);
}
private bool GetStopConditionsEnabled()
{
return _configuration.Stop.Enabled;
}
private bool SetStopConditionsEnabled(bool enabled)
{
_configuration.Stop.Enabled = enabled;
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private List<string> GetStopQuestList()
{
return (from c in _configuration.Stop.Conditions.OfType<QuestCompleteCondition>()
select c.QuestId.ToString()).ToList();
}
private bool AddStopQuest(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null && _questRegistry.IsKnownQuest(elementId) && !_configuration.Stop.Conditions.OfType<QuestCompleteCondition>().Any((QuestCompleteCondition c) => c.QuestId.Equals(elementId)))
{
_configuration.Stop.Conditions.Add(new QuestCompleteCondition
{
QuestId = elementId,
Mode = EStopConditionMode.Stop
});
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
return false;
}
private bool RemoveStopQuest(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
QuestCompleteCondition questCompleteCondition = _configuration.Stop.Conditions.OfType<QuestCompleteCondition>().FirstOrDefault((QuestCompleteCondition c) => c.QuestId.Equals(elementId));
if (questCompleteCondition != null)
{
_configuration.Stop.Conditions.Remove(questCompleteCondition);
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
}
return false;
}
private bool ClearStopQuests()
{
_configuration.Stop.Conditions.RemoveAll((StopCondition c) => c is QuestCompleteCondition);
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private StopConditionData GetLevelStopCondition()
{
LevelCondition levelCondition = _configuration.Stop.Conditions.OfType<LevelCondition>().FirstOrDefault();
return new StopConditionData
{
Enabled = (levelCondition != null),
TargetValue = (levelCondition?.TargetLevel ?? 50)
};
}
private bool SetLevelStopCondition(bool enabled, int targetLevel)
{
if (targetLevel < 1 || targetLevel > 100)
{
return false;
}
LevelCondition levelCondition = _configuration.Stop.Conditions.OfType<LevelCondition>().FirstOrDefault();
if (!enabled)
{
if (levelCondition != null)
{
_configuration.Stop.Conditions.Remove(levelCondition);
}
}
else if (levelCondition != null)
{
levelCondition.TargetLevel = targetLevel;
levelCondition.Mode = EStopConditionMode.Stop;
}
else
{
_configuration.Stop.Conditions.Add(new LevelCondition
{
TargetLevel = targetLevel,
Mode = EStopConditionMode.Stop
});
}
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private StopConditionData GetSequenceStopCondition()
{
GlobalSequenceCondition globalSequenceCondition = _configuration.Stop.Conditions.OfType<GlobalSequenceCondition>().FirstOrDefault();
return new StopConditionData
{
Enabled = (globalSequenceCondition != null),
TargetValue = (globalSequenceCondition?.TargetSequence ?? 1)
};
}
private bool SetSequenceStopCondition(bool enabled, int targetSequence)
{
if (targetSequence < 0 || targetSequence > 255)
{
return false;
}
GlobalSequenceCondition globalSequenceCondition = _configuration.Stop.Conditions.OfType<GlobalSequenceCondition>().FirstOrDefault();
if (!enabled)
{
if (globalSequenceCondition != null)
{
_configuration.Stop.Conditions.Remove(globalSequenceCondition);
}
}
else if (globalSequenceCondition != null)
{
globalSequenceCondition.TargetSequence = targetSequence;
globalSequenceCondition.Mode = EStopConditionMode.Stop;
}
else
{
_configuration.Stop.Conditions.Add(new GlobalSequenceCondition
{
TargetSequence = targetSequence,
Mode = EStopConditionMode.Stop
});
}
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private int GetQuestSequenceStopCondition(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
QuestCompleteCondition questCompleteCondition = _configuration.Stop.Conditions.OfType<QuestCompleteCondition>().FirstOrDefault((QuestCompleteCondition c) => c.QuestId.Equals(elementId));
if (questCompleteCondition != null)
{
return questCompleteCondition.Sequence ?? (-1);
}
}
return -1;
}
private bool SetQuestSequenceStopCondition(string questId, int targetSequence)
{
if (targetSequence < 0 || targetSequence > 255)
{
return false;
}
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null && _questRegistry.IsKnownQuest(elementId))
{
QuestCompleteCondition questCompleteCondition = _configuration.Stop.Conditions.OfType<QuestCompleteCondition>().FirstOrDefault((QuestCompleteCondition c) => c.QuestId.Equals(elementId));
if (questCompleteCondition != null)
{
questCompleteCondition.Sequence = targetSequence;
}
else
{
_configuration.Stop.Conditions.Add(new QuestCompleteCondition
{
QuestId = elementId,
Sequence = targetSequence,
Mode = EStopConditionMode.Stop
});
}
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
return false;
}
private bool RemoveQuestSequenceStopCondition(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
QuestCompleteCondition questCompleteCondition = _configuration.Stop.Conditions.OfType<QuestCompleteCondition>().FirstOrDefault((QuestCompleteCondition c) => c.QuestId.Equals(elementId) && c.Sequence.HasValue);
if (questCompleteCondition != null)
{
_configuration.Stop.Conditions.Remove(questCompleteCondition);
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
}
return false;
}
private Dictionary<string, int> GetAllQuestSequenceStopConditions()
{
return (from c in _configuration.Stop.Conditions.OfType<QuestCompleteCondition>()
where c.Sequence.HasValue
select c).ToDictionary((QuestCompleteCondition c) => c.QuestId.ToString(), (QuestCompleteCondition c) => c.Sequence.Value);
}
private int GetLevelStopMode()
{
return (int)(_configuration.Stop.Conditions.OfType<LevelCondition>().FirstOrDefault()?.Mode ?? EStopConditionMode.Off);
}
private bool SetLevelStopMode(int mode)
{
if (!Enum.IsDefined(typeof(EStopConditionMode), mode))
{
return false;
}
LevelCondition levelCondition = _configuration.Stop.Conditions.OfType<LevelCondition>().FirstOrDefault();
if (mode == 0)
{
if (levelCondition != null)
{
_configuration.Stop.Conditions.Remove(levelCondition);
}
}
else if (levelCondition != null)
{
levelCondition.Mode = (EStopConditionMode)mode;
}
else
{
_configuration.Stop.Conditions.Add(new LevelCondition
{
TargetLevel = 50,
Mode = (EStopConditionMode)mode
});
}
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private int GetSequenceStopMode()
{
return (int)(_configuration.Stop.Conditions.OfType<GlobalSequenceCondition>().FirstOrDefault()?.Mode ?? EStopConditionMode.Off);
}
private bool SetSequenceStopMode(int mode)
{
if (!Enum.IsDefined(typeof(EStopConditionMode), mode))
{
return false;
}
GlobalSequenceCondition globalSequenceCondition = _configuration.Stop.Conditions.OfType<GlobalSequenceCondition>().FirstOrDefault();
if (mode == 0)
{
if (globalSequenceCondition != null)
{
_configuration.Stop.Conditions.Remove(globalSequenceCondition);
}
}
else if (globalSequenceCondition != null)
{
globalSequenceCondition.Mode = (EStopConditionMode)mode;
}
else
{
_configuration.Stop.Conditions.Add(new GlobalSequenceCondition
{
TargetSequence = 1,
Mode = (EStopConditionMode)mode
});
}
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
private int GetQuestStopMode(string questId)
{
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null)
{
QuestCompleteCondition questCompleteCondition = _configuration.Stop.Conditions.OfType<QuestCompleteCondition>().FirstOrDefault((QuestCompleteCondition c) => c.QuestId.Equals(elementId));
if (questCompleteCondition != null)
{
return (int)questCompleteCondition.Mode;
}
}
return -1;
}
private bool SetQuestStopMode(string questId, int mode)
{
if (!Enum.IsDefined(typeof(EStopConditionMode), mode))
{
return false;
}
if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null && _questRegistry.IsKnownQuest(elementId))
{
QuestCompleteCondition questCompleteCondition = _configuration.Stop.Conditions.OfType<QuestCompleteCondition>().FirstOrDefault((QuestCompleteCondition c) => c.QuestId.Equals(elementId));
if (mode == 0)
{
if (questCompleteCondition != null)
{
_configuration.Stop.Conditions.Remove(questCompleteCondition);
}
}
else if (questCompleteCondition != null)
{
questCompleteCondition.Mode = (EStopConditionMode)mode;
}
else
{
_configuration.Stop.Conditions.Add(new QuestCompleteCondition
{
QuestId = elementId,
Mode = (EStopConditionMode)mode
});
}
_pluginInterface.SavePluginConfig(_configuration);
return true;
}
return false;
}
}