diff --git a/Dalamud/Configuration/Internal/DalamudConfiguration.cs b/Dalamud/Configuration/Internal/DalamudConfiguration.cs
index 9404b5b10..d546dc517 100644
--- a/Dalamud/Configuration/Internal/DalamudConfiguration.cs
+++ b/Dalamud/Configuration/Internal/DalamudConfiguration.cs
@@ -487,6 +487,14 @@ internal sealed class DalamudConfiguration : IInternalDisposableService
///
public Vector2 NotificationAnchorPosition { get; set; } = new(1f, 1f);
+#pragma warning disable SA1600
+#pragma warning disable SA1516
+ // XLCore/XoM compatibility until they move it out
+ public string? DalamudBetaKey { get; set; } = null;
+ public string? DalamudBetaKind { get; set; }
+#pragma warning restore SA1516
+#pragma warning restore SA1600
+
///
/// Load a configuration from the provided path.
///
diff --git a/Dalamud/Dalamud.csproj b/Dalamud/Dalamud.csproj
index b9b453f89..090301c10 100644
--- a/Dalamud/Dalamud.csproj
+++ b/Dalamud/Dalamud.csproj
@@ -6,7 +6,7 @@
XIV Launcher addon framework
- 13.0.0.11
+ 13.0.0.12
$(DalamudVersion)
$(DalamudVersion)
$(DalamudVersion)
diff --git a/Dalamud/Game/Player/PlayerState.cs b/Dalamud/Game/Player/PlayerState.cs
index 917c946db..bd19b5bfb 100644
--- a/Dalamud/Game/Player/PlayerState.cs
+++ b/Dalamud/Game/Player/PlayerState.cs
@@ -77,7 +77,7 @@ internal unsafe class PlayerState : IServiceType, IPlayerState
public RowRef ClassJob => this.IsLoaded ? LuminaUtils.CreateRef(CSPlayerState.Instance()->CurrentClassJobId) : default;
///
- public short Level => this.IsLoaded ? CSPlayerState.Instance()->CurrentLevel : default;
+ public short Level => this.IsLoaded && this.ClassJob.IsValid ? this.GetClassJobLevel(this.ClassJob.Value) : this.EffectiveLevel;
///
public bool IsLevelSynced => this.IsLoaded && CSPlayerState.Instance()->IsLevelSynced;
diff --git a/Dalamud/Interface/Windowing/Window.cs b/Dalamud/Interface/Windowing/Window.cs
index f12e87099..e90e38119 100644
--- a/Dalamud/Interface/Windowing/Window.cs
+++ b/Dalamud/Interface/Windowing/Window.cs
@@ -425,8 +425,17 @@ public abstract class Window
UIGlobals.PlaySoundEffect(this.OnOpenSfxId);
}
- this.PreDraw();
- this.ApplyConditionals();
+ var isErrorStylePushed = false;
+ if (!this.hasError)
+ {
+ this.PreDraw();
+ this.ApplyConditionals();
+ }
+ else
+ {
+ Style.StyleModelV1.DalamudStandard.Push();
+ isErrorStylePushed = true;
+ }
if (this.ForceMainWindow)
ImGuiHelpers.ForceNextWindowMainViewport();
@@ -448,10 +457,22 @@ public abstract class Window
var flags = this.Flags;
if (this.internalIsPinned || this.internalIsClickthrough)
+ {
flags |= ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoResize;
+ }
if (this.internalIsClickthrough)
+ {
flags |= ImGuiWindowFlags.NoInputs | ImGuiWindowFlags.NoNav | ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.NoScrollWithMouse | ImGuiWindowFlags.NoMouseInputs;
+ }
+
+ // If we have an error, reset all flags to default, and unlock window size.
+ if (this.hasError)
+ {
+ flags = ImGuiWindowFlags.None;
+ ImGui.SetNextWindowCollapsed(false, ImGuiCond.Once);
+ ImGui.SetNextWindowSizeConstraints(Vector2.Zero, Vector2.PositiveInfinity);
+ }
if (this.CanShowCloseButton ? ImGui.Begin(this.WindowName, ref this.internalIsOpen, flags) : ImGui.Begin(this.WindowName, flags))
{
@@ -670,7 +691,17 @@ public abstract class Window
Task.FromResult(tex));
}
- this.PostDraw();
+ if (!this.hasError)
+ {
+ this.PostDraw();
+ }
+ else
+ {
+ if (isErrorStylePushed)
+ {
+ Style.StyleModelV1.DalamudStandard.Pop();
+ }
+ }
this.PostHandlePreset(persistence);
diff --git a/Dalamud/Plugin/Services/IPlayerState.cs b/Dalamud/Plugin/Services/IPlayerState.cs
index 1416dfb77..21d88010b 100644
--- a/Dalamud/Plugin/Services/IPlayerState.cs
+++ b/Dalamud/Plugin/Services/IPlayerState.cs
@@ -79,7 +79,7 @@ public interface IPlayerState : IDalamudService
bool IsLevelSynced { get; }
///
- /// Gets the effective level of the local character.
+ /// Gets the effective level of the local character, taking level sync into account.
///
short EffectiveLevel { get; }