muffin v7.38.5

This commit is contained in:
alydev 2025-11-24 14:55:42 +10:00
parent 7177a5440c
commit ac85eea230
3 changed files with 966 additions and 420 deletions

View file

@ -6,6 +6,8 @@ using System.Numerics;
using System.Runtime.InteropServices;
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.DependencyInjection;
using Questionable.Controller;
using Questionable.Controller.Steps;
using Questionable.Data;
@ -13,6 +15,7 @@ using Questionable.Functions;
using Questionable.Model;
using Questionable.Model.Questing;
using Questionable.Windows;
using Questionable.Windows.JournalComponents;
using Questionable.Windows.QuestComponents;
namespace Questionable.External;
@ -134,6 +137,20 @@ internal sealed class QuestionableIpc : IDisposable
private const string IpcSetSequenceStopCondition = "Questionable.SetSequenceStopCondition";
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 readonly QuestController _questController;
private readonly QuestRegistry _questRegistry;
@ -150,6 +167,8 @@ internal sealed class QuestionableIpc : IDisposable
private readonly IDalamudPluginInterface _pluginInterface;
private readonly IServiceProvider _serviceProvider;
private readonly ICallGateProvider<bool> _isRunning;
private readonly ICallGateProvider<string?> _getCurrentQuestId;
@ -236,7 +255,21 @@ internal sealed class QuestionableIpc : IDisposable
private readonly ICallGateProvider<bool, int, bool> _setSequenceStopCondition;
public QuestionableIpc(QuestController questController, EventInfoComponent eventInfoComponent, QuestRegistry questRegistry, QuestFunctions questFunctions, QuestData questData, ManualPriorityComponent manualPriorityComponent, PresetBuilderComponent presetBuilderComponent, Configuration configuration, IDalamudPluginInterface pluginInterface)
private readonly ICallGateProvider<int> _getAlliedSocietyRemainingAllowances;
private readonly ICallGateProvider<long> _getAlliedSocietyTimeUntilReset;
private readonly ICallGateProvider<byte, List<string>> _getAlliedSocietyAvailableQuestIds;
private readonly ICallGateProvider<Dictionary<byte, int>> _getAlliedSocietyAllAvailableQuestCounts;
private readonly ICallGateProvider<byte, bool> _getAlliedSocietyIsMaxRank;
private readonly ICallGateProvider<byte, int> _getAlliedSocietyCurrentRank;
private readonly ICallGateProvider<List<byte>> _getAlliedSocietiesWithAvailableQuests;
public QuestionableIpc(QuestController questController, EventInfoComponent eventInfoComponent, QuestRegistry questRegistry, QuestFunctions questFunctions, QuestData questData, ManualPriorityComponent manualPriorityComponent, PresetBuilderComponent presetBuilderComponent, Configuration configuration, IDalamudPluginInterface pluginInterface, IServiceProvider serviceProvider)
{
QuestionableIpc questionableIpc = this;
_questController = questController;
@ -247,6 +280,7 @@ internal sealed class QuestionableIpc : IDisposable
_presetBuilderComponent = presetBuilderComponent;
_configuration = configuration;
_pluginInterface = pluginInterface;
_serviceProvider = serviceProvider;
_isRunning = pluginInterface.GetIpcProvider<bool>("Questionable.IsRunning");
_isRunning.RegisterFunc(() => questController.AutomationType != QuestController.EAutomationType.Manual || questController.IsRunning);
_getCurrentQuestId = pluginInterface.GetIpcProvider<string>("Questionable.GetCurrentQuestId");
@ -334,6 +368,20 @@ internal sealed class QuestionableIpc : IDisposable
_getSequenceStopCondition.RegisterFunc(GetSequenceStopCondition);
_setSequenceStopCondition = pluginInterface.GetIpcProvider<bool, int, bool>("Questionable.SetSequenceStopCondition");
_setSequenceStopCondition.RegisterFunc(SetSequenceStopCondition);
_getAlliedSocietyRemainingAllowances = pluginInterface.GetIpcProvider<int>("Questionable.AlliedSociety.GetRemainingAllowances");
_getAlliedSocietyRemainingAllowances.RegisterFunc(GetAlliedSocietyRemainingAllowances);
_getAlliedSocietyTimeUntilReset = pluginInterface.GetIpcProvider<long>("Questionable.AlliedSociety.GetTimeUntilReset");
_getAlliedSocietyTimeUntilReset.RegisterFunc(GetAlliedSocietyTimeUntilReset);
_getAlliedSocietyAvailableQuestIds = pluginInterface.GetIpcProvider<byte, List<string>>("Questionable.AlliedSociety.GetAvailableQuestIds");
_getAlliedSocietyAvailableQuestIds.RegisterFunc(GetAlliedSocietyAvailableQuestIds);
_getAlliedSocietyAllAvailableQuestCounts = pluginInterface.GetIpcProvider<Dictionary<byte, int>>("Questionable.AlliedSociety.GetAllAvailableQuestCounts");
_getAlliedSocietyAllAvailableQuestCounts.RegisterFunc(GetAlliedSocietyAllAvailableQuestCounts);
_getAlliedSocietyIsMaxRank = pluginInterface.GetIpcProvider<byte, bool>("Questionable.AlliedSociety.IsMaxRank");
_getAlliedSocietyIsMaxRank.RegisterFunc(GetAlliedSocietyIsMaxRank);
_getAlliedSocietyCurrentRank = pluginInterface.GetIpcProvider<byte, int>("Questionable.AlliedSociety.GetCurrentRank");
_getAlliedSocietyCurrentRank.RegisterFunc(GetAlliedSocietyCurrentRank);
_getAlliedSocietiesWithAvailableQuests = pluginInterface.GetIpcProvider<List<byte>>("Questionable.AlliedSociety.GetSocietiesWithAvailableQuests");
_getAlliedSocietiesWithAvailableQuests.RegisterFunc(GetAlliedSocietiesWithAvailableQuests);
}
private bool StartQuest(string questId, bool single)
@ -921,6 +969,97 @@ internal sealed class QuestionableIpc : IDisposable
return true;
}
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 (!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 num = (byte)(ptr->BeastReputation[alliedSocietyId - 1].Rank & 0x7F);
byte b = (byte)((alliedSocietyId <= 5) ? 8 : 3);
return num >= b;
}
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;
}
public void Dispose()
{
_exportQuestPriority.UnregisterFunc();
@ -966,5 +1105,12 @@ internal sealed class QuestionableIpc : IDisposable
_getStopQuestList.UnregisterFunc();
_setStopConditionsEnabled.UnregisterFunc();
_getStopConditionsEnabled.UnregisterFunc();
_getAlliedSocietiesWithAvailableQuests.UnregisterFunc();
_getAlliedSocietyCurrentRank.UnregisterFunc();
_getAlliedSocietyIsMaxRank.UnregisterFunc();
_getAlliedSocietyAllAvailableQuestCounts.UnregisterFunc();
_getAlliedSocietyAvailableQuestIds.UnregisterFunc();
_getAlliedSocietyTimeUntilReset.UnregisterFunc();
_getAlliedSocietyRemainingAllowances.UnregisterFunc();
}
}