Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AutoDuty/AutoDuty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ public AutoDuty()
AssemblyDirectoryInfo = AssemblyFileInfo.Directory;

Version =
((PluginInterface.IsDev ? new Version(0,0,0, 252) :
((PluginInterface.IsDev ? new Version(0,0,0, 253) :
PluginInterface.IsTesting ? PluginInterface.Manifest.TestingAssemblyVersion ?? PluginInterface.Manifest.AssemblyVersion : PluginInterface.Manifest.AssemblyVersion)!).Revision;

if (!_configDirectory.Exists)
Expand Down
144 changes: 79 additions & 65 deletions AutoDuty/Helpers/TrustHelper.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
using System;
using System.Linq;
using Dalamud.Plugin.Services;
using ECommons;
using ECommons.DalamudServices;
using ECommons.ExcelServices;
using ECommons.GameFunctions;
using ECommons.Throttlers;
using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.Game.UI;
using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using FFXIVClientStructs.FFXIV.Component.GUI;
using System.Collections.Generic;
using Dalamud.Plugin.Services;
using ECommons.Throttlers;
using FFXIVClientStructs.FFXIV.Client.Game;
using Lumina.Excel.Sheets;
using System;
using System.Collections.Generic;
using System.Linq;

namespace AutoDuty.Helpers
{
using static Data.Classes;

internal static class TrustHelper
{
internal static unsafe uint GetLevelFromTrustWindow(AtkUnitBase* addon)
Expand All @@ -41,9 +43,19 @@ internal static bool CanTrustRun(this Content content, bool checkTrustLevels = t
return !checkTrustLevels || CanTrustRunMembers(content);
}

internal static bool LevelsSetFor(Content content)
{
return !content.TrustMembers.Any(tm => tm is { LevelIsSet: false, Available: true });
}

internal static bool LevelsSet()
{
return !Members.Values.Any(tm => tm is { LevelIsSet: false, Available: true });
}

private static bool CanTrustRunMembers(Content content)
{
if (content.TrustMembers.Any(tm => tm is { LevelIsSet: false, Available: true }))
if (!LevelsSetFor(content))
GetLevels(content);

TrustMember?[] members = new TrustMember?[3];
Expand Down Expand Up @@ -91,8 +103,8 @@ internal static bool SetLevelingTrustMembers(Content content, LevelingMode mode)

JobRole playerJobRole = Player.Available ? Player.Object.ClassJob.ValueNullable?.GetJobRole() ?? JobRole.None : JobRole.None;

Svc.Log.Info("Leveling Trust Members set");
Svc.Log.Info(content.TrustMembers.Count.ToString());
Svc.Log.Info("Leveling Trust Members set start");
Svc.Log.Info("Trustmembers available: " + content.TrustMembers.Count);

int index = 0;

Expand Down Expand Up @@ -142,7 +154,9 @@ public static bool CanSelectMember(this TrustMember?[] trustMembers, TrustMember
TrustRole.AllRounder => true,
_ => throw new ArgumentOutOfRangeException(member.Name, "member is of invalid role.. somehow")
};
internal static readonly Dictionary<TrustMemberName, TrustMember> Members = [];

internal static readonly Dictionary<TrustMemberName, TrustMember> Members = [];
internal static readonly Dictionary<byte, TrustMember> MembersByMemberId = [];

internal static void PopulateTrustMembers()
{
Expand All @@ -151,30 +165,36 @@ internal static void PopulateTrustMembers()

if (dawnSheet == null || jobSheet == null) return;

void AddMember(TrustMemberName name, byte index, TrustRole role, ClassJobType classJob, uint levelInit = 71, uint levelCap = 100, uint unlockQuest = 0) => Members.Add(name, new TrustMember
{
Index = index,
Name = dawnSheet.GetRow((uint)name)!.Unknown0.ToString(),
Role = role,
Job = jobSheet.GetRow((uint)classJob)!,
MemberName = name,
LevelInit = levelInit,
Level = levelInit,
LevelCap = levelCap,
LevelIsSet = levelInit == levelCap,
UnlockQuest = unlockQuest
});

AddMember(TrustMemberName.Alphinaud, 0, TrustRole.Healer, ClassJobType.Sage);
AddMember(TrustMemberName.Alisaie, 1, TrustRole.DPS, ClassJobType.RedMage);
AddMember(TrustMemberName.Thancred, 2, TrustRole.Tank, ClassJobType.Gunbreaker);
AddMember(TrustMemberName.Urianger, 3, TrustRole.Healer, ClassJobType.Astrologian);
AddMember(TrustMemberName.Yshtola, 4, TrustRole.DPS, ClassJobType.Black_Mage);
AddMember(TrustMemberName.Ryne, 5, TrustRole.DPS, ClassJobType.Rogue, 71, 80);
AddMember(TrustMemberName.Estinien, 5, TrustRole.DPS, ClassJobType.Dragoon, 81);
AddMember(TrustMemberName.Graha, 6, TrustRole.AllRounder, ClassJobType.Black_Mage, 81, unlockQuest: 69318);
AddMember(TrustMemberName.Zero, 7, TrustRole.DPS, ClassJobType.Reaper, 90, 90);
AddMember(TrustMemberName.Krile, 7, TrustRole.DPS, ClassJobType.Pictomancer, 91);
void AddMember(TrustMemberName name, byte index, byte memberId, TrustRole role, ClassJobType classJob, uint levelInit = 71, uint levelCap = 100, uint unlockQuest = 0)
{
TrustMember member = new TrustMember
{
Index = index,
MemberId = memberId,
Name = dawnSheet.GetRow((uint)name)!.Unknown0.ToString(),
Role = role,
Job = jobSheet.GetRow((uint)classJob)!,
MemberName = name,
LevelInit = levelInit,
Level = levelInit,
LevelCap = levelCap,
LevelIsSet = levelInit == levelCap,
UnlockQuest = unlockQuest
};
Members.Add(name, member);
MembersByMemberId.Add(memberId, member);
}

AddMember(TrustMemberName.Alphinaud, 0, 6, TrustRole.Healer, ClassJobType.Sage);
AddMember(TrustMemberName.Alisaie, 1, 1, TrustRole.DPS, ClassJobType.RedMage);
AddMember(TrustMemberName.Thancred, 2, 2, TrustRole.Tank, ClassJobType.Gunbreaker);
AddMember(TrustMemberName.Urianger, 3, 3, TrustRole.Healer, ClassJobType.Astrologian);
AddMember(TrustMemberName.Yshtola, 4, 4, TrustRole.DPS, ClassJobType.Black_Mage);
AddMember(TrustMemberName.Ryne, 5, 5, TrustRole.DPS, ClassJobType.Rogue, 71, 80);
AddMember(TrustMemberName.Estinien, 5, 7, TrustRole.DPS, ClassJobType.Dragoon, 81);
AddMember(TrustMemberName.Graha, 6, 8, TrustRole.AllRounder, ClassJobType.Black_Mage, 81, unlockQuest: 69318);
AddMember(TrustMemberName.Zero, 7, 103, TrustRole.DPS, ClassJobType.Reaper, 90, 90);
AddMember(TrustMemberName.Krile, 7, 11, TrustRole.DPS, ClassJobType.Pictomancer, 91);
}

public static void ResetTrustIfInvalid()
Expand Down Expand Up @@ -265,55 +285,49 @@ private static unsafe void Stop(bool forceHide = false)
internal static unsafe void GetLevelsUpdate(IFramework framework)
{
if (_getLevelsContent == null || Plugin.InDungeon || !AgentHUD.Instance()->IsMainCommandEnabled(82))
{
Stop();
return;
}

if (!EzThrottler.Throttle("GetLevelsUpdate", 5) || !PlayerHelper.IsValid) return;

if (!GenericHelpers.TryGetAddonByName("Dawn", out AtkUnitBase* addonDawn) || !GenericHelpers.IsAddonReady(addonDawn))
AgentDawn* agentDawn = AgentDawn.Instance();
if (!agentDawn->IsAddonReady())
{
if (EzThrottler.Throttle("OpenDawn", 5000))
{
Svc.Log.Debug("TrustHelper - Opening Dawn");
AgentModule.Instance()->GetAgentByInternalId(AgentId.Dawn)->Show();
}
if (!EzThrottler.Throttle("OpenDawn", 2500))
return;

Svc.Log.Debug("Trust Helper - Opening Dawn");
RaptureAtkModule.Instance()->OpenDawn(_getLevelsContent.RowId);
return;
}
else
EzThrottler.Throttle("OpenDawn", 5, true);

if (addonDawn->AtkValues[241].UInt < (_getLevelsContent!.ExVersion - 2))
if (agentDawn->Data->ContentData.ExpansionCount < (_getLevelsContent.ExVersion - 2))
{
Svc.Log.Debug($"TrustHelper - You do not have expansion: {_getLevelsContent.ExVersion} unlocked stopping");
Stop(true);
Svc.Log.Debug($"Trust Helper - You do not have expansion: {_getLevelsContent.ExVersion} unlocked. stopping");
Stop();
return;
}

if (addonDawn->AtkValues[242].UInt != (_getLevelsContent!.ExVersion - 3))
{
Svc.Log.Debug($"TrustHelper - Opening Expansion: {_getLevelsContent.ExVersion}");
AddonHelper.FireCallBack(addonDawn, true, 20, (_getLevelsContent!.ExVersion - 3));
}
else if (addonDawn->AtkValues[151].UInt != _getLevelsContent.DawnIndex)
{
Svc.Log.Debug($"TrustHelper - Clicking: {_getLevelsContent.EnglishName} at index: {_getLevelsContent.DawnIndex}");
AddonHelper.FireCallBack(addonDawn, true, 15, _getLevelsContent.DawnIndex);
}
else
AgentDawnInterface.DawnMemberData memberData = agentDawn->Data->MemberData;

foreach (AgentDawnInterface.DawnMemberEntry entry in memberData.Members)
{
for (int id = 0; id < _getLevelsContent.TrustMembers.Count; id++)
if(entry.MemberId != 0 && MembersByMemberId.TryGetValue(entry.MemberId, out TrustMember? member) && !member.LevelIsSet)
{
TrustMember trustMember = _getLevelsContent.TrustMembers[id];
if (trustMember is { LevelIsSet: false, Available: true })
Svc.Log.Debug($"TrustHelper - Setting {member.MemberName} aka {member.Name} {member.MemberId} level to {entry.Level}");
member.SetLevel(entry.Level);

if(LevelsSet())
{

AddonHelper.FireCallBack(addonDawn, true, 16, id);
uint lvl = GetLevelFromTrustWindow(addonDawn);
Svc.Log.Debug($"TrustHelper - Setting {trustMember.MemberName} level to {lvl}");
trustMember.SetLevel(lvl);
Stop();
return;
}
}
Stop();
}

Stop();
}
}
}