diff --git a/Dalamud/Game/UnlockState/UnlockState.cs b/Dalamud/Game/UnlockState/UnlockState.cs
index fd18a26f9..2e77139d3 100644
--- a/Dalamud/Game/UnlockState/UnlockState.cs
+++ b/Dalamud/Game/UnlockState/UnlockState.cs
@@ -310,6 +310,15 @@ internal unsafe class UnlockState : IInternalDisposableService, IUnlockState
return nativeRow != null && UIState.Instance()->IsItemActionUnlocked(nativeRow) == 1;
}
+ ///
+ public bool IsLeveCompleted(Leve row)
+ {
+ if (!this.IsLoaded)
+ return false;
+
+ return QuestManager.Instance()->IsLevequestComplete((ushort)row.RowId);
+ }
+
///
public bool IsMJILandmarkUnlocked(MJILandmark row)
{
@@ -524,6 +533,9 @@ internal unsafe class UnlockState : IInternalDisposableService, IUnlockState
if (rowRef.TryGetValue- (out var itemRow))
return this.IsItemUnlocked(itemRow);
+ if (rowRef.TryGetValue(out var leveRow))
+ return this.IsLeveCompleted(leveRow);
+
if (rowRef.TryGetValue(out var mjiLandmarkRow))
return this.IsMJILandmarkUnlocked(mjiLandmarkRow);
@@ -656,6 +668,7 @@ internal unsafe class UnlockState : IInternalDisposableService, IUnlockState
// Not implemented:
// - DescriptionPage: quite complex
// - QuestAcceptAdditionCondition: ignored
+ // - Leve: AgentUpdateFlag.UnlocksUpdate is not set and the completed status can be unset again!
// For some other day:
// - FishingSpot
@@ -814,6 +827,9 @@ internal class UnlockStatePluginScoped : IInternalDisposableService, IUnlockStat
///
public bool IsItemUnlocked(Item row) => this.unlockStateService.IsItemUnlocked(row);
+ ///
+ public bool IsLeveCompleted(Leve row) => this.unlockStateService.IsLeveCompleted(row);
+
///
public bool IsMJILandmarkUnlocked(MJILandmark row) => this.unlockStateService.IsMJILandmarkUnlocked(row);
diff --git a/Dalamud/Plugin/Services/IUnlockState.cs b/Dalamud/Plugin/Services/IUnlockState.cs
index 6fcae5d35..f51222ba1 100644
--- a/Dalamud/Plugin/Services/IUnlockState.cs
+++ b/Dalamud/Plugin/Services/IUnlockState.cs
@@ -205,6 +205,13 @@ public interface IUnlockState : IDalamudService
/// if unlocked; otherwise, .
bool IsItemUnlocked(Item row);
+ ///
+ /// Determines whether the specified Leve is completed.
+ ///
+ /// The Leve row to check.
+ /// if completed; otherwise, .
+ bool IsLeveCompleted(Leve row);
+
///
/// Determines whether the specified McGuffin is unlocked.
///