mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-30 12:23:39 +01:00
Merge branch 'api14' into AddonLifecycleRefactor
This commit is contained in:
commit
bc8e986c11
33 changed files with 280 additions and 202 deletions
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<PropertyGroup Label="Feature">
|
<PropertyGroup Label="Feature">
|
||||||
<Description>XIV Launcher addon framework</Description>
|
<Description>XIV Launcher addon framework</Description>
|
||||||
<DalamudVersion>13.0.0.13</DalamudVersion>
|
<DalamudVersion>13.0.0.16</DalamudVersion>
|
||||||
<AssemblyVersion>$(DalamudVersion)</AssemblyVersion>
|
<AssemblyVersion>$(DalamudVersion)</AssemblyVersion>
|
||||||
<Version>$(DalamudVersion)</Version>
|
<Version>$(DalamudVersion)</Version>
|
||||||
<FileVersion>$(DalamudVersion)</FileVersion>
|
<FileVersion>$(DalamudVersion)</FileVersion>
|
||||||
|
|
@ -84,11 +84,8 @@
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="System.Collections.Immutable" />
|
|
||||||
<PackageReference Include="System.Drawing.Common" />
|
|
||||||
<PackageReference Include="System.Reactive" />
|
<PackageReference Include="System.Reactive" />
|
||||||
<PackageReference Include="System.Reflection.MetadataLoadContext" />
|
<PackageReference Include="System.Reflection.MetadataLoadContext" />
|
||||||
<PackageReference Include="System.Resources.Extensions" />
|
|
||||||
<PackageReference Include="TerraFX.Interop.Windows" />
|
<PackageReference Include="TerraFX.Interop.Windows" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -84,8 +84,11 @@ internal sealed class DataManager : IInternalDisposableService, IDataManager
|
||||||
dalamud.StartInfo.TroubleshootingPackData);
|
dalamud.StartInfo.TroubleshootingPackData);
|
||||||
|
|
||||||
// Don't fail for IndexIntegrityResult.Exception, since the check during launch has a very small timeout
|
// Don't fail for IndexIntegrityResult.Exception, since the check during launch has a very small timeout
|
||||||
this.HasModifiedGameDataFiles =
|
// this.HasModifiedGameDataFiles =
|
||||||
tsInfo?.IndexIntegrity is LauncherTroubleshootingInfo.IndexIntegrityResult.Failed;
|
// tsInfo?.IndexIntegrity is LauncherTroubleshootingInfo.IndexIntegrityResult.Failed;
|
||||||
|
|
||||||
|
// TODO: Put above back when check in XL is fixed
|
||||||
|
this.HasModifiedGameDataFiles = false;
|
||||||
|
|
||||||
if (this.HasModifiedGameDataFiles)
|
if (this.HasModifiedGameDataFiles)
|
||||||
Log.Verbose("Game data integrity check failed!\n{TsData}", dalamud.StartInfo.TroubleshootingPackData);
|
Log.Verbose("Game data integrity check failed!\n{TsData}", dalamud.StartInfo.TroubleshootingPackData);
|
||||||
|
|
|
||||||
|
|
@ -192,8 +192,8 @@ public sealed class EntryPoint
|
||||||
|
|
||||||
var dalamud = new Dalamud(info, fs, configuration, mainThreadContinueEvent);
|
var dalamud = new Dalamud(info, fs, configuration, mainThreadContinueEvent);
|
||||||
Log.Information("This is Dalamud - Core: {GitHash}, CS: {CsGitHash} [{CsVersion}]",
|
Log.Information("This is Dalamud - Core: {GitHash}, CS: {CsGitHash} [{CsVersion}]",
|
||||||
Util.GetScmVersion(),
|
Versioning.GetScmVersion(),
|
||||||
Util.GetGitHashClientStructs(),
|
Versioning.GetGitHashClientStructs(),
|
||||||
FFXIVClientStructs.ThisAssembly.Git.Commits);
|
FFXIVClientStructs.ThisAssembly.Git.Commits);
|
||||||
|
|
||||||
dalamud.WaitForUnload();
|
dalamud.WaitForUnload();
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ internal partial class ChatHandlers : IServiceType
|
||||||
|
|
||||||
if (this.configuration.PrintDalamudWelcomeMsg)
|
if (this.configuration.PrintDalamudWelcomeMsg)
|
||||||
{
|
{
|
||||||
chatGui.Print(string.Format(Loc.Localize("DalamudWelcome", "Dalamud {0} loaded."), Util.GetScmVersion())
|
chatGui.Print(string.Format(Loc.Localize("DalamudWelcome", "Dalamud {0} loaded."), Versioning.GetScmVersion())
|
||||||
+ string.Format(Loc.Localize("PluginsWelcome", " {0} plugin(s) loaded."), pluginManager.InstalledPlugins.Count(x => x.IsLoaded)));
|
+ string.Format(Loc.Localize("PluginsWelcome", " {0} plugin(s) loaded."), pluginManager.InstalledPlugins.Count(x => x.IsLoaded)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -116,7 +116,7 @@ internal partial class ChatHandlers : IServiceType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(this.configuration.LastVersion) || !Util.AssemblyVersion.StartsWith(this.configuration.LastVersion))
|
if (string.IsNullOrEmpty(this.configuration.LastVersion) || !Versioning.GetAssemblyVersion().StartsWith(this.configuration.LastVersion))
|
||||||
{
|
{
|
||||||
var linkPayload = chatGui.AddChatLinkHandler(
|
var linkPayload = chatGui.AddChatLinkHandler(
|
||||||
(_, _) => dalamudInterface.OpenPluginInstallerTo(PluginInstallerOpenKind.Changelogs));
|
(_, _) => dalamudInterface.OpenPluginInstallerTo(PluginInstallerOpenKind.Changelogs));
|
||||||
|
|
@ -137,7 +137,7 @@ internal partial class ChatHandlers : IServiceType
|
||||||
Type = XivChatType.Notice,
|
Type = XivChatType.Notice,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.configuration.LastVersion = Util.AssemblyVersion;
|
this.configuration.LastVersion = Versioning.GetAssemblyVersion();
|
||||||
this.configuration.QueueSave();
|
this.configuration.QueueSave();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -305,7 +305,8 @@ internal class GameInventory : IInternalDisposableService
|
||||||
private GameInventoryItem[] CreateItemsArray(int length)
|
private GameInventoryItem[] CreateItemsArray(int length)
|
||||||
{
|
{
|
||||||
var items = new GameInventoryItem[length];
|
var items = new GameInventoryItem[length];
|
||||||
items.Initialize();
|
foreach (ref var item in items.AsSpan())
|
||||||
|
item = new();
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
using Dalamud.Bindings.ImGui;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
using Dalamud.Console;
|
||||||
using Dalamud.Memory;
|
using Dalamud.Memory;
|
||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
|
|
||||||
|
|
@ -37,6 +38,8 @@ internal sealed unsafe partial class Win32InputHandler : IImGuiInputHandler
|
||||||
private readonly WndProcDelegate wndProcDelegate;
|
private readonly WndProcDelegate wndProcDelegate;
|
||||||
private readonly nint platformNamePtr;
|
private readonly nint platformNamePtr;
|
||||||
|
|
||||||
|
private readonly IConsoleVariable<bool> cvLogMouseEvents;
|
||||||
|
|
||||||
private ViewportHandler viewportHandler;
|
private ViewportHandler viewportHandler;
|
||||||
|
|
||||||
private int mouseButtonsDown;
|
private int mouseButtonsDown;
|
||||||
|
|
@ -87,6 +90,11 @@ internal sealed unsafe partial class Win32InputHandler : IImGuiInputHandler
|
||||||
this.cursors[(int)ImGuiMouseCursor.ResizeNwse] = LoadCursorW(default, IDC.IDC_SIZENWSE);
|
this.cursors[(int)ImGuiMouseCursor.ResizeNwse] = LoadCursorW(default, IDC.IDC_SIZENWSE);
|
||||||
this.cursors[(int)ImGuiMouseCursor.Hand] = LoadCursorW(default, IDC.IDC_HAND);
|
this.cursors[(int)ImGuiMouseCursor.Hand] = LoadCursorW(default, IDC.IDC_HAND);
|
||||||
this.cursors[(int)ImGuiMouseCursor.NotAllowed] = LoadCursorW(default, IDC.IDC_NO);
|
this.cursors[(int)ImGuiMouseCursor.NotAllowed] = LoadCursorW(default, IDC.IDC_NO);
|
||||||
|
|
||||||
|
this.cvLogMouseEvents = Service<ConsoleManager>.Get().AddVariable(
|
||||||
|
"imgui.log_mouse_events",
|
||||||
|
"Log mouse events to console for debugging",
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -267,11 +275,23 @@ internal sealed unsafe partial class Win32InputHandler : IImGuiInputHandler
|
||||||
case WM.WM_XBUTTONDOWN:
|
case WM.WM_XBUTTONDOWN:
|
||||||
case WM.WM_XBUTTONDBLCLK:
|
case WM.WM_XBUTTONDBLCLK:
|
||||||
{
|
{
|
||||||
|
if (this.cvLogMouseEvents.Value)
|
||||||
|
{
|
||||||
|
Log.Verbose(
|
||||||
|
"Handle MouseDown {Btn} WantCaptureMouse: {Want} mouseButtonsDown: {Down}",
|
||||||
|
GetButton(msg, wParam),
|
||||||
|
io.WantCaptureMouse,
|
||||||
|
this.mouseButtonsDown);
|
||||||
|
}
|
||||||
|
|
||||||
var button = GetButton(msg, wParam);
|
var button = GetButton(msg, wParam);
|
||||||
if (io.WantCaptureMouse)
|
if (io.WantCaptureMouse)
|
||||||
{
|
{
|
||||||
if (this.mouseButtonsDown == 0 && GetCapture() == nint.Zero)
|
if (this.mouseButtonsDown == 0 && GetCapture() == nint.Zero)
|
||||||
|
{
|
||||||
SetCapture(hWndCurrent);
|
SetCapture(hWndCurrent);
|
||||||
|
}
|
||||||
|
|
||||||
this.mouseButtonsDown |= 1 << button;
|
this.mouseButtonsDown |= 1 << button;
|
||||||
io.AddMouseButtonEvent(button, true);
|
io.AddMouseButtonEvent(button, true);
|
||||||
return default(LRESULT);
|
return default(LRESULT);
|
||||||
|
|
@ -288,12 +308,28 @@ internal sealed unsafe partial class Win32InputHandler : IImGuiInputHandler
|
||||||
case WM.WM_MBUTTONUP:
|
case WM.WM_MBUTTONUP:
|
||||||
case WM.WM_XBUTTONUP:
|
case WM.WM_XBUTTONUP:
|
||||||
{
|
{
|
||||||
|
if (this.cvLogMouseEvents.Value)
|
||||||
|
{
|
||||||
|
Log.Verbose(
|
||||||
|
"Handle MouseUp {Btn} WantCaptureMouse: {Want} mouseButtonsDown: {Down}",
|
||||||
|
GetButton(msg, wParam),
|
||||||
|
io.WantCaptureMouse,
|
||||||
|
this.mouseButtonsDown);
|
||||||
|
}
|
||||||
|
|
||||||
var button = GetButton(msg, wParam);
|
var button = GetButton(msg, wParam);
|
||||||
if (io.WantCaptureMouse)
|
|
||||||
|
// Need to check if we captured the button event away from the game here, otherwise the game might get
|
||||||
|
// a down event but no up event, causing the cursor to get stuck.
|
||||||
|
// Can happen if WantCaptureMouse becomes true in between down and up
|
||||||
|
if (io.WantCaptureMouse && (this.mouseButtonsDown & (1 << button)) != 0)
|
||||||
{
|
{
|
||||||
this.mouseButtonsDown &= ~(1 << button);
|
this.mouseButtonsDown &= ~(1 << button);
|
||||||
if (this.mouseButtonsDown == 0 && GetCapture() == hWndCurrent)
|
if (this.mouseButtonsDown == 0 && GetCapture() == hWndCurrent)
|
||||||
|
{
|
||||||
ReleaseCapture();
|
ReleaseCapture();
|
||||||
|
}
|
||||||
|
|
||||||
io.AddMouseButtonEvent(button, false);
|
io.AddMouseButtonEvent(button, false);
|
||||||
return default(LRESULT);
|
return default(LRESULT);
|
||||||
}
|
}
|
||||||
|
|
@ -458,7 +494,12 @@ internal sealed unsafe partial class Win32InputHandler : IImGuiInputHandler
|
||||||
// (This is the position you can get with ::GetCursorPos() or WM_MOUSEMOVE + ::ClientToScreen(). In theory adding viewport->Pos to a client position would also be the same.)
|
// (This is the position you can get with ::GetCursorPos() or WM_MOUSEMOVE + ::ClientToScreen(). In theory adding viewport->Pos to a client position would also be the same.)
|
||||||
var mousePos = mouseScreenPos;
|
var mousePos = mouseScreenPos;
|
||||||
if ((io.ConfigFlags & ImGuiConfigFlags.ViewportsEnable) == 0)
|
if ((io.ConfigFlags & ImGuiConfigFlags.ViewportsEnable) == 0)
|
||||||
ClientToScreen(focusedWindow, &mousePos);
|
{
|
||||||
|
// Use game window, otherwise, positions are calculated based on the focused window which might not be the game.
|
||||||
|
// Leads to offsets.
|
||||||
|
ClientToScreen(this.hWnd, &mousePos);
|
||||||
|
}
|
||||||
|
|
||||||
io.AddMousePosEvent(mousePos.x, mousePos.y);
|
io.AddMousePosEvent(mousePos.x, mousePos.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -162,15 +162,14 @@ internal class SeStringRenderer : IServiceType
|
||||||
if (drawParams.Font.HasValue)
|
if (drawParams.Font.HasValue)
|
||||||
font = drawParams.Font.Value;
|
font = drawParams.Font.Value;
|
||||||
|
|
||||||
// API14: Remove commented out code
|
if (ThreadSafety.IsMainThread && drawParams.TargetDrawList is null && font is null)
|
||||||
if (ThreadSafety.IsMainThread /* && drawParams.TargetDrawList is null */ && font is null)
|
|
||||||
font = ImGui.GetFont();
|
font = ImGui.GetFont();
|
||||||
if (font is null)
|
if (font is null)
|
||||||
throw new ArgumentException("Specified font is empty.");
|
throw new ArgumentException("Specified font is empty.");
|
||||||
|
|
||||||
// This also does argument validation for drawParams. Do it here.
|
// This also does argument validation for drawParams. Do it here.
|
||||||
// `using var` makes a struct read-only, but we do want to modify it.
|
// `using var` makes a struct read-only, but we do want to modify it.
|
||||||
var stateStorage = new SeStringDrawState(
|
using var stateStorage = new SeStringDrawState(
|
||||||
sss,
|
sss,
|
||||||
drawParams,
|
drawParams,
|
||||||
ThreadSafety.IsMainThread ? this.colorStackSetMainThread : new(this.colorStackSetMainThread.ColorTypes),
|
ThreadSafety.IsMainThread ? this.colorStackSetMainThread : new(this.colorStackSetMainThread.ColorTypes),
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ using Dalamud.Interface.Utility;
|
||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
|
|
||||||
using FFXIVClientStructs.FFXIV.Component.GUI;
|
using FFXIVClientStructs.FFXIV.Component.GUI;
|
||||||
|
|
||||||
using Lumina.Text.Payloads;
|
using Lumina.Text.Payloads;
|
||||||
using Lumina.Text.ReadOnly;
|
using Lumina.Text.ReadOnly;
|
||||||
|
|
||||||
|
|
@ -17,7 +18,7 @@ namespace Dalamud.Interface.ImGuiSeStringRenderer;
|
||||||
|
|
||||||
/// <summary>Calculated values from <see cref="SeStringDrawParams"/> using ImGui styles.</summary>
|
/// <summary>Calculated values from <see cref="SeStringDrawParams"/> using ImGui styles.</summary>
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
public unsafe ref struct SeStringDrawState
|
public unsafe ref struct SeStringDrawState : IDisposable
|
||||||
{
|
{
|
||||||
private static readonly int ChannelCount = Enum.GetValues<SeStringDrawChannel>().Length;
|
private static readonly int ChannelCount = Enum.GetValues<SeStringDrawChannel>().Length;
|
||||||
|
|
||||||
|
|
@ -65,17 +66,10 @@ public unsafe ref struct SeStringDrawState
|
||||||
this.drawList = ssdp.TargetDrawList.Value;
|
this.drawList = ssdp.TargetDrawList.Value;
|
||||||
this.ScreenOffset = ssdp.ScreenOffset ?? Vector2.Zero;
|
this.ScreenOffset = ssdp.ScreenOffset ?? Vector2.Zero;
|
||||||
|
|
||||||
// API14: Remove, always throw
|
this.ScreenOffset = ssdp.ScreenOffset ?? throw new ArgumentException(
|
||||||
if (ThreadSafety.IsMainThread)
|
$"{nameof(ssdp.ScreenOffset)} must be set when specifying a target draw list, as it cannot be fetched from the ImGui state. (GetCursorScreenPos?)");
|
||||||
{
|
this.FontSize = ssdp.FontSize ?? throw new ArgumentException(
|
||||||
this.ScreenOffset = ssdp.ScreenOffset ?? ImGui.GetCursorScreenPos();
|
$"{nameof(ssdp.FontSize)} must be set when specifying a target draw list, as it cannot be fetched from the ImGui state.");
|
||||||
this.FontSize = ssdp.FontSize ?? ImGui.GetFontSize();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new ArgumentException(
|
|
||||||
$"{nameof(ssdp.FontSize)} must be set when specifying a target draw list, as it cannot be fetched from the ImGui state.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// this.FontSize = ssdp.FontSize ?? throw new ArgumentException(
|
// this.FontSize = ssdp.FontSize ?? throw new ArgumentException(
|
||||||
// $"{nameof(ssdp.FontSize)} must be set when specifying a target draw list, as it cannot be fetched from the ImGui state.");
|
// $"{nameof(ssdp.FontSize)} must be set when specifying a target draw list, as it cannot be fetched from the ImGui state.");
|
||||||
|
|
@ -194,6 +188,9 @@ public unsafe ref struct SeStringDrawState
|
||||||
/// <summary>Gets the text fragments.</summary>
|
/// <summary>Gets the text fragments.</summary>
|
||||||
internal List<TextFragment> Fragments { get; }
|
internal List<TextFragment> Fragments { get; }
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public void Dispose() => this.splitter.ClearFreeMemory();
|
||||||
|
|
||||||
/// <summary>Sets the current channel in the ImGui draw list splitter.</summary>
|
/// <summary>Sets the current channel in the ImGui draw list splitter.</summary>
|
||||||
/// <param name="channelIndex">Channel to switch to.</param>
|
/// <param name="channelIndex">Channel to switch to.</param>
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
|
|
||||||
|
|
@ -305,12 +305,12 @@ internal class DalamudCommands : IServiceType
|
||||||
|
|
||||||
chatGui.Print(new SeStringBuilder()
|
chatGui.Print(new SeStringBuilder()
|
||||||
.AddItalics("Dalamud:")
|
.AddItalics("Dalamud:")
|
||||||
.AddText($" {Util.GetScmVersion()}")
|
.AddText($" {Versioning.GetScmVersion()}")
|
||||||
.Build());
|
.Build());
|
||||||
|
|
||||||
chatGui.Print(new SeStringBuilder()
|
chatGui.Print(new SeStringBuilder()
|
||||||
.AddItalics("FFXIVCS:")
|
.AddItalics("FFXIVCS:")
|
||||||
.AddText($" {Util.GetGitHashClientStructs()}")
|
.AddText($" {Versioning.GetGitHashClientStructs()}")
|
||||||
.Build());
|
.Build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ internal class DalamudInterface : IInternalDisposableService
|
||||||
() => Service<DalamudInterface>.GetNullable()?.ToggleDevMenu(),
|
() => Service<DalamudInterface>.GetNullable()?.ToggleDevMenu(),
|
||||||
VirtualKey.SHIFT);
|
VirtualKey.SHIFT);
|
||||||
|
|
||||||
if (Util.GetActiveTrack() != "release")
|
if (Versioning.GetActiveTrack() != "release")
|
||||||
{
|
{
|
||||||
titleScreenMenu.AddEntryCore(
|
titleScreenMenu.AddEntryCore(
|
||||||
Loc.Localize("TSMDalamudDevMenu", "Developer Menu"),
|
Loc.Localize("TSMDalamudDevMenu", "Developer Menu"),
|
||||||
|
|
@ -669,6 +669,8 @@ internal class DalamudInterface : IInternalDisposableService
|
||||||
{
|
{
|
||||||
using var barColor = ImRaii.PushColor(ImGuiCol.WindowBg, new Vector4(0.060f, 0.060f, 0.060f, 0.773f));
|
using var barColor = ImRaii.PushColor(ImGuiCol.WindowBg, new Vector4(0.060f, 0.060f, 0.060f, 0.773f));
|
||||||
barColor.Push(ImGuiCol.MenuBarBg, Vector4.Zero);
|
barColor.Push(ImGuiCol.MenuBarBg, Vector4.Zero);
|
||||||
|
barColor.Push(ImGuiCol.Border, Vector4.Zero);
|
||||||
|
barColor.Push(ImGuiCol.BorderShadow, Vector4.Zero);
|
||||||
if (ImGui.BeginMainMenuBar())
|
if (ImGui.BeginMainMenuBar())
|
||||||
{
|
{
|
||||||
var pluginManager = Service<PluginManager>.Get();
|
var pluginManager = Service<PluginManager>.Get();
|
||||||
|
|
@ -863,7 +865,7 @@ internal class DalamudInterface : IInternalDisposableService
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.MenuItem(this.dalamud.StartInfo.GameVersion?.ToString() ?? "Unknown version", false, false);
|
ImGui.MenuItem(this.dalamud.StartInfo.GameVersion?.ToString() ?? "Unknown version", false, false);
|
||||||
ImGui.MenuItem($"D: {Util.GetScmVersion()} CS: {Util.GetGitHashClientStructs()}[{FFXIVClientStructs.ThisAssembly.Git.Commits}]", false, false);
|
ImGui.MenuItem($"D: {Versioning.GetScmVersion()} CS: {Versioning.GetGitHashClientStructs()}[{FFXIVClientStructs.ThisAssembly.Git.Commits}]", false, false);
|
||||||
ImGui.MenuItem($"CLR: {Environment.Version}", false, false);
|
ImGui.MenuItem($"CLR: {Environment.Version}", false, false);
|
||||||
|
|
||||||
ImGui.EndMenu();
|
ImGui.EndMenu();
|
||||||
|
|
@ -1074,8 +1076,8 @@ internal class DalamudInterface : IInternalDisposableService
|
||||||
{
|
{
|
||||||
ImGui.PushFont(InterfaceManager.MonoFont);
|
ImGui.PushFont(InterfaceManager.MonoFont);
|
||||||
|
|
||||||
ImGui.BeginMenu($"{Util.GetActiveTrack() ?? "???"} on {Util.GetGitBranch() ?? "???"}", false);
|
ImGui.BeginMenu($"{Versioning.GetActiveTrack() ?? "???"} on {Versioning.GetGitBranch() ?? "???"}", false);
|
||||||
ImGui.BeginMenu($"{Util.GetScmVersion()}", false);
|
ImGui.BeginMenu($"{Versioning.GetScmVersion()}", false);
|
||||||
ImGui.BeginMenu(this.FrameCount.ToString("000000"), false);
|
ImGui.BeginMenu(this.FrameCount.ToString("000000"), false);
|
||||||
ImGui.BeginMenu(ImGui.GetIO().Framerate.ToString("000"), false);
|
ImGui.BeginMenu(ImGui.GetIO().Framerate.ToString("000"), false);
|
||||||
ImGui.BeginMenu($"W:{Util.FormatBytes(GC.GetTotalMemory(false))}", false);
|
ImGui.BeginMenu($"W:{Util.FormatBytes(GC.GetTotalMemory(false))}", false);
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ public class BranchSwitcherWindow : Window
|
||||||
this.branches = await client.GetFromJsonAsync<Dictionary<string, VersionEntry>>(BranchInfoUrl);
|
this.branches = await client.GetFromJsonAsync<Dictionary<string, VersionEntry>>(BranchInfoUrl);
|
||||||
Debug.Assert(this.branches != null, "this.branches != null");
|
Debug.Assert(this.branches != null, "this.branches != null");
|
||||||
|
|
||||||
var trackName = Util.GetActiveTrack();
|
var trackName = Versioning.GetActiveTrack();
|
||||||
this.selectedBranchIndex = this.branches.IndexOf(x => x.Value.Track == trackName);
|
this.selectedBranchIndex = this.branches.IndexOf(x => x.Value.Track == trackName);
|
||||||
if (this.selectedBranchIndex == -1)
|
if (this.selectedBranchIndex == -1)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -147,7 +147,7 @@ internal sealed class ChangelogWindow : Window, IDisposable
|
||||||
var pmWantsChangelog = pm?.InstalledPlugins.Any() ?? true;
|
var pmWantsChangelog = pm?.InstalledPlugins.Any() ?? true;
|
||||||
return (string.IsNullOrEmpty(configuration.LastChangelogMajorMinor) ||
|
return (string.IsNullOrEmpty(configuration.LastChangelogMajorMinor) ||
|
||||||
(!WarrantsChangelogForMajorMinor.StartsWith(configuration.LastChangelogMajorMinor) &&
|
(!WarrantsChangelogForMajorMinor.StartsWith(configuration.LastChangelogMajorMinor) &&
|
||||||
Util.AssemblyVersion.StartsWith(WarrantsChangelogForMajorMinor))) && pmWantsChangelog;
|
Versioning.GetAssemblyVersion().StartsWith(WarrantsChangelogForMajorMinor))) && pmWantsChangelog;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
|
|
@ -357,7 +357,7 @@ internal sealed class ChangelogWindow : Window, IDisposable
|
||||||
{
|
{
|
||||||
case State.WindowFadeIn:
|
case State.WindowFadeIn:
|
||||||
case State.ExplainerIntro:
|
case State.ExplainerIntro:
|
||||||
ImGui.TextWrapped($"Welcome to Dalamud v{Util.GetScmVersion()}!");
|
ImGui.TextWrapped($"Welcome to Dalamud v{Versioning.GetScmVersion()}!");
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
ImGui.TextWrapped(ChangeLog);
|
ImGui.TextWrapped(ChangeLog);
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
|
|
|
||||||
|
|
@ -144,7 +144,7 @@ internal class SeStringCreatorWidget : IDataWindowWidget
|
||||||
new TextEntry(TextEntryType.Macro, " <string(lstr1)>"),
|
new TextEntry(TextEntryType.Macro, " <string(lstr1)>"),
|
||||||
];
|
];
|
||||||
|
|
||||||
private SeStringParameter[]? localParameters = [Util.GetScmVersion()];
|
private SeStringParameter[]? localParameters = [Versioning.GetScmVersion()];
|
||||||
private ReadOnlySeString input;
|
private ReadOnlySeString input;
|
||||||
private ClientLanguage? language;
|
private ClientLanguage? language;
|
||||||
private Task? validImportSheetNamesTask;
|
private Task? validImportSheetNamesTask;
|
||||||
|
|
|
||||||
|
|
@ -302,7 +302,7 @@ internal class PluginInstallerWindow : Window, IDisposable
|
||||||
|
|
||||||
this.profileManagerWidget.Reset();
|
this.profileManagerWidget.Reset();
|
||||||
|
|
||||||
if (this.staleDalamudNewVersion == null && !Util.GetActiveTrack().IsNullOrEmpty())
|
if (this.staleDalamudNewVersion == null && !Versioning.GetActiveTrack().IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
Service<DalamudReleases>.Get().GetVersionForCurrentTrack().ContinueWith(t =>
|
Service<DalamudReleases>.Get().GetVersionForCurrentTrack().ContinueWith(t =>
|
||||||
{
|
{
|
||||||
|
|
@ -310,7 +310,7 @@ internal class PluginInstallerWindow : Window, IDisposable
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var versionInfo = t.Result;
|
var versionInfo = t.Result;
|
||||||
if (versionInfo.AssemblyVersion != Util.GetScmVersion())
|
if (versionInfo.AssemblyVersion != Versioning.GetScmVersion())
|
||||||
{
|
{
|
||||||
this.staleDalamudNewVersion = versionInfo.AssemblyVersion;
|
this.staleDalamudNewVersion = versionInfo.AssemblyVersion;
|
||||||
}
|
}
|
||||||
|
|
@ -1670,7 +1670,7 @@ internal class PluginInstallerWindow : Window, IDisposable
|
||||||
DrawWarningIcon();
|
DrawWarningIcon();
|
||||||
DrawLinesCentered("A new version of Dalamud is available.\n" +
|
DrawLinesCentered("A new version of Dalamud is available.\n" +
|
||||||
"Please restart the game to ensure compatibility with updated plugins.\n" +
|
"Please restart the game to ensure compatibility with updated plugins.\n" +
|
||||||
$"old: {Util.GetScmVersion()} new: {this.staleDalamudNewVersion}");
|
$"old: {Versioning.GetScmVersion()} new: {this.staleDalamudNewVersion}");
|
||||||
|
|
||||||
ImGuiHelpers.ScaledDummy(10);
|
ImGuiHelpers.ScaledDummy(10);
|
||||||
}
|
}
|
||||||
|
|
@ -2461,7 +2461,7 @@ internal class PluginInstallerWindow : Window, IDisposable
|
||||||
var isOutdated = effectiveApiLevel < PluginManager.DalamudApiLevel;
|
var isOutdated = effectiveApiLevel < PluginManager.DalamudApiLevel;
|
||||||
|
|
||||||
var isIncompatible = manifest.MinimumDalamudVersion != null &&
|
var isIncompatible = manifest.MinimumDalamudVersion != null &&
|
||||||
manifest.MinimumDalamudVersion > Util.AssemblyVersionParsed;
|
manifest.MinimumDalamudVersion > Versioning.GetAssemblyVersionParsed();
|
||||||
|
|
||||||
var enableInstallButton = this.updateStatus != OperationStatus.InProgress &&
|
var enableInstallButton = this.updateStatus != OperationStatus.InProgress &&
|
||||||
this.installStatus != OperationStatus.InProgress &&
|
this.installStatus != OperationStatus.InProgress &&
|
||||||
|
|
|
||||||
|
|
@ -223,7 +223,7 @@ Contribute at: https://github.com/goatcorp/Dalamud
|
||||||
.Select(plugin => $"{plugin.Manifest.Name} by {plugin.Manifest.Author}\n")
|
.Select(plugin => $"{plugin.Manifest.Name} by {plugin.Manifest.Author}\n")
|
||||||
.Aggregate(string.Empty, (current, next) => $"{current}{next}");
|
.Aggregate(string.Empty, (current, next) => $"{current}{next}");
|
||||||
|
|
||||||
this.creditsText = string.Format(CreditsTextTempl, typeof(Dalamud).Assembly.GetName().Version, pluginCredits, Util.GetGitHashClientStructs());
|
this.creditsText = string.Format(CreditsTextTempl, typeof(Dalamud).Assembly.GetName().Version, pluginCredits, Versioning.GetGitHashClientStructs());
|
||||||
|
|
||||||
var gameGui = Service<GameGui>.Get();
|
var gameGui = Service<GameGui>.Get();
|
||||||
var playerState = PlayerState.Instance();
|
var playerState = PlayerState.Instance();
|
||||||
|
|
|
||||||
|
|
@ -503,7 +503,7 @@ internal class TitleScreenMenuWindow : Window, IDisposable
|
||||||
lssb.PushEdgeColorType(701).PushColorType(539)
|
lssb.PushEdgeColorType(701).PushColorType(539)
|
||||||
.Append(SeIconChar.BoxedLetterD.ToIconChar())
|
.Append(SeIconChar.BoxedLetterD.ToIconChar())
|
||||||
.PopColorType().PopEdgeColorType();
|
.PopColorType().PopEdgeColorType();
|
||||||
lssb.Append($" Dalamud: {Util.GetScmVersion()}");
|
lssb.Append($" Dalamud: {Versioning.GetScmVersion()}");
|
||||||
|
|
||||||
lssb.Append($" - {count} {(count != 1 ? "plugins" : "plugin")} loaded");
|
lssb.Append($" - {count} {(count != 1 ? "plugins" : "plugin")} loaded");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ internal class PresetModel
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a value indicating whether this preset is in the default state.
|
/// Gets a value indicating whether this preset is in the default state.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonIgnore]
|
||||||
public bool IsDefault =>
|
public bool IsDefault =>
|
||||||
!this.IsPinned &&
|
!this.IsPinned &&
|
||||||
!this.IsClickThrough &&
|
!this.IsClickThrough &&
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ public abstract class Window
|
||||||
Click = _ =>
|
Click = _ =>
|
||||||
{
|
{
|
||||||
this.internalIsClickthrough = false;
|
this.internalIsClickthrough = false;
|
||||||
this.presetDirty = false;
|
this.presetDirty = true;
|
||||||
ImGui.OpenPopup(AdditionsPopupName);
|
ImGui.OpenPopup(AdditionsPopupName);
|
||||||
},
|
},
|
||||||
Priority = int.MinValue,
|
Priority = int.MinValue,
|
||||||
|
|
@ -672,16 +672,13 @@ public abstract class Window
|
||||||
Task.FromResult<IDalamudTextureWrap>(tex));
|
Task.FromResult<IDalamudTextureWrap>(tex));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.hasError)
|
if (isErrorStylePushed)
|
||||||
{
|
{
|
||||||
this.PostDraw();
|
Style.StyleModelV1.DalamudStandard.Pop();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (isErrorStylePushed)
|
this.PostDraw();
|
||||||
{
|
|
||||||
Style.StyleModelV1.DalamudStandard.Pop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.PostHandlePreset(persistence);
|
this.PostHandlePreset(persistence);
|
||||||
|
|
@ -864,7 +861,7 @@ public abstract class Window
|
||||||
foreach (var button in this.allButtons)
|
foreach (var button in this.allButtons)
|
||||||
{
|
{
|
||||||
if (this.internalIsClickthrough && !button.AvailableClickthrough)
|
if (this.internalIsClickthrough && !button.AvailableClickthrough)
|
||||||
return;
|
continue;
|
||||||
|
|
||||||
Vector2 position = new(titleBarRect.Max.X - padR - buttonSize, titleBarRect.Min.Y + style.FramePadding.Y);
|
Vector2 position = new(titleBarRect.Max.X - padR - buttonSize, titleBarRect.Min.Y + style.FramePadding.Y);
|
||||||
padR += buttonSize + style.ItemInnerSpacing.X;
|
padR += buttonSize + style.ItemInnerSpacing.X;
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ internal class HappyHttpClient : IInternalDisposableService
|
||||||
{
|
{
|
||||||
UserAgent =
|
UserAgent =
|
||||||
{
|
{
|
||||||
new ProductInfoHeaderValue("Dalamud", Util.AssemblyVersion),
|
new ProductInfoHeaderValue("Dalamud", Versioning.GetAssemblyVersion()),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ internal sealed class ClientHelloService : IInternalDisposableService
|
||||||
return new ClientHelloResponse
|
return new ClientHelloResponse
|
||||||
{
|
{
|
||||||
ApiVersion = "1.0",
|
ApiVersion = "1.0",
|
||||||
DalamudVersion = Util.GetScmVersion(),
|
DalamudVersion = Versioning.GetScmVersion(),
|
||||||
GameVersion = dalamud.StartInfo.GameVersion?.ToString() ?? "Unknown",
|
GameVersion = dalamud.StartInfo.GameVersion?.ToString() ?? "Unknown",
|
||||||
ProcessId = Environment.ProcessId,
|
ProcessId = Environment.ProcessId,
|
||||||
ProcessStartTime = new DateTimeOffset(Process.GetCurrentProcess().StartTime).ToUnixTimeSeconds(),
|
ProcessStartTime = new DateTimeOffset(Process.GetCurrentProcess().StartTime).ToUnixTimeSeconds(),
|
||||||
|
|
|
||||||
|
|
@ -16,18 +16,15 @@ using Dalamud.Game.Text;
|
||||||
using Dalamud.Game.Text.Sanitizer;
|
using Dalamud.Game.Text.Sanitizer;
|
||||||
using Dalamud.Interface;
|
using Dalamud.Interface;
|
||||||
using Dalamud.Interface.Internal;
|
using Dalamud.Interface.Internal;
|
||||||
using Dalamud.Interface.Internal.Windows.PluginInstaller;
|
|
||||||
using Dalamud.Interface.Internal.Windows.SelfTest;
|
|
||||||
using Dalamud.Interface.Internal.Windows.Settings;
|
|
||||||
using Dalamud.IoC.Internal;
|
using Dalamud.IoC.Internal;
|
||||||
using Dalamud.Plugin.Internal;
|
using Dalamud.Plugin.Internal;
|
||||||
using Dalamud.Plugin.Internal.AutoUpdate;
|
using Dalamud.Plugin.Internal.AutoUpdate;
|
||||||
using Dalamud.Plugin.Internal.Types;
|
using Dalamud.Plugin.Internal.Types;
|
||||||
using Dalamud.Plugin.Internal.Types.Manifest;
|
using Dalamud.Plugin.Internal.Types.Manifest;
|
||||||
using Dalamud.Plugin.Ipc;
|
using Dalamud.Plugin.Ipc;
|
||||||
using Dalamud.Plugin.Ipc.Exceptions;
|
|
||||||
using Dalamud.Plugin.Ipc.Internal;
|
using Dalamud.Plugin.Ipc.Internal;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.VersionInfo;
|
||||||
|
using Dalamud.Utility;
|
||||||
|
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
|
||||||
|
|
@ -204,11 +201,7 @@ internal sealed class DalamudPluginInterface : IDalamudPluginInterface, IDisposa
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc/>
|
||||||
/// Gets the plugin the given assembly is part of.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="assembly">The assembly to check.</param>
|
|
||||||
/// <returns>The plugin the given assembly is part of, or null if this is a shared assembly or if this information cannot be determined.</returns>
|
|
||||||
public IExposedPlugin? GetPlugin(Assembly assembly)
|
public IExposedPlugin? GetPlugin(Assembly assembly)
|
||||||
=> AssemblyLoadContext.GetLoadContext(assembly) switch
|
=> AssemblyLoadContext.GetLoadContext(assembly) switch
|
||||||
{
|
{
|
||||||
|
|
@ -216,11 +209,7 @@ internal sealed class DalamudPluginInterface : IDalamudPluginInterface, IDisposa
|
||||||
var context => this.GetPlugin(context),
|
var context => this.GetPlugin(context),
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc/>
|
||||||
/// Gets the plugin that loads in the given context.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context">The context to check.</param>
|
|
||||||
/// <returns>The plugin that loads in the given context, or null if this isn't a plugin's context or if this information cannot be determined.</returns>
|
|
||||||
public IExposedPlugin? GetPlugin(AssemblyLoadContext context)
|
public IExposedPlugin? GetPlugin(AssemblyLoadContext context)
|
||||||
=> Service<PluginManager>.Get().InstalledPlugins.FirstOrDefault(p => p.LoadsIn(context)) switch
|
=> Service<PluginManager>.Get().InstalledPlugins.FirstOrDefault(p => p.LoadsIn(context)) switch
|
||||||
{
|
{
|
||||||
|
|
@ -228,6 +217,12 @@ internal sealed class DalamudPluginInterface : IDalamudPluginInterface, IDisposa
|
||||||
var p => new ExposedPlugin(p),
|
var p => new ExposedPlugin(p),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public IDalamudVersionInfo GetDalamudVersion()
|
||||||
|
{
|
||||||
|
return new DalamudVersionInfo(Versioning.GetAssemblyVersionParsed(), Versioning.GetActiveTrack());
|
||||||
|
}
|
||||||
|
|
||||||
#region IPC
|
#region IPC
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ using Dalamud.Plugin.Internal.Types.Manifest;
|
||||||
using Dalamud.Plugin.Ipc;
|
using Dalamud.Plugin.Ipc;
|
||||||
using Dalamud.Plugin.Ipc.Exceptions;
|
using Dalamud.Plugin.Ipc.Exceptions;
|
||||||
using Dalamud.Plugin.Ipc.Internal;
|
using Dalamud.Plugin.Ipc.Internal;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.VersionInfo;
|
||||||
|
|
||||||
namespace Dalamud.Plugin;
|
namespace Dalamud.Plugin;
|
||||||
|
|
||||||
|
|
@ -194,6 +194,12 @@ public interface IDalamudPluginInterface : IServiceProvider
|
||||||
/// <returns>The plugin that loads in the given context, or null if this isn't a plugin's context or if this information cannot be determined.</returns>
|
/// <returns>The plugin that loads in the given context, or null if this isn't a plugin's context or if this information cannot be determined.</returns>
|
||||||
IExposedPlugin? GetPlugin(AssemblyLoadContext context);
|
IExposedPlugin? GetPlugin(AssemblyLoadContext context);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets information about the version of Dalamud this plugin is loaded into.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Class containing version information.</returns>
|
||||||
|
IDalamudVersionInfo GetDalamudVersion();
|
||||||
|
|
||||||
/// <inheritdoc cref="DataShare.GetOrCreateData{T}"/>
|
/// <inheritdoc cref="DataShare.GetOrCreateData{T}"/>
|
||||||
T GetOrCreateData<T>(string tag, Func<T> dataGenerator) where T : class;
|
T GetOrCreateData<T>(string tag, Func<T> dataGenerator) where T : class;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1790,7 +1790,7 @@ internal class PluginManager : IInternalDisposableService
|
||||||
var updates = this.AvailablePlugins
|
var updates = this.AvailablePlugins
|
||||||
.Where(remoteManifest => plugin.Manifest.InternalName == remoteManifest.InternalName)
|
.Where(remoteManifest => plugin.Manifest.InternalName == remoteManifest.InternalName)
|
||||||
.Where(remoteManifest => plugin.Manifest.InstalledFromUrl == remoteManifest.SourceRepo.PluginMasterUrl || !remoteManifest.SourceRepo.IsThirdParty)
|
.Where(remoteManifest => plugin.Manifest.InstalledFromUrl == remoteManifest.SourceRepo.PluginMasterUrl || !remoteManifest.SourceRepo.IsThirdParty)
|
||||||
.Where(remoteManifest => remoteManifest.MinimumDalamudVersion == null || Util.AssemblyVersionParsed >= remoteManifest.MinimumDalamudVersion)
|
.Where(remoteManifest => remoteManifest.MinimumDalamudVersion == null || Versioning.GetAssemblyVersionParsed() >= remoteManifest.MinimumDalamudVersion)
|
||||||
.Where(remoteManifest =>
|
.Where(remoteManifest =>
|
||||||
{
|
{
|
||||||
var useTesting = this.UseTesting(remoteManifest);
|
var useTesting = this.UseTesting(remoteManifest);
|
||||||
|
|
|
||||||
|
|
@ -315,7 +315,7 @@ internal class LocalPlugin : IAsyncDisposable
|
||||||
if (!this.CheckPolicy())
|
if (!this.CheckPolicy())
|
||||||
throw new PluginPreconditionFailedException($"Unable to load {this.Name} as a load policy forbids it");
|
throw new PluginPreconditionFailedException($"Unable to load {this.Name} as a load policy forbids it");
|
||||||
|
|
||||||
if (this.Manifest.MinimumDalamudVersion != null && this.Manifest.MinimumDalamudVersion > Util.AssemblyVersionParsed)
|
if (this.Manifest.MinimumDalamudVersion != null && this.Manifest.MinimumDalamudVersion > Versioning.GetAssemblyVersionParsed())
|
||||||
throw new PluginPreconditionFailedException($"Unable to load {this.Name}, Dalamud version is lower than minimum required version {this.Manifest.MinimumDalamudVersion}");
|
throw new PluginPreconditionFailedException($"Unable to load {this.Name}, Dalamud version is lower than minimum required version {this.Manifest.MinimumDalamudVersion}");
|
||||||
|
|
||||||
this.State = PluginState.Loading;
|
this.State = PluginState.Loading;
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ internal class PluginRepository
|
||||||
},
|
},
|
||||||
UserAgent =
|
UserAgent =
|
||||||
{
|
{
|
||||||
new ProductInfoHeaderValue("Dalamud", Util.AssemblyVersion),
|
new ProductInfoHeaderValue("Dalamud", Versioning.GetAssemblyVersion()),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
@ -164,7 +164,7 @@ internal class PluginRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
this.PluginMaster = pluginMaster.Where(this.IsValidManifest).ToList().AsReadOnly();
|
this.PluginMaster = pluginMaster.Where(this.IsValidManifest).ToList().AsReadOnly();
|
||||||
|
|
||||||
// API9 HACK: Force IsHide to false, we should remove that
|
// API9 HACK: Force IsHide to false, we should remove that
|
||||||
if (!this.IsThirdParty)
|
if (!this.IsThirdParty)
|
||||||
{
|
{
|
||||||
|
|
@ -197,7 +197,7 @@ internal class PluginRepository
|
||||||
Log.Error("Plugin {PluginName} in {RepoLink} has an invalid Name.", manifest.InternalName, this.PluginMasterUrl);
|
Log.Error("Plugin {PluginName} in {RepoLink} has an invalid Name.", manifest.InternalName, this.PluginMasterUrl);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
||||||
if (manifest.AssemblyVersion == null)
|
if (manifest.AssemblyVersion == null)
|
||||||
{
|
{
|
||||||
|
|
@ -224,7 +224,7 @@ internal class PluginRepository
|
||||||
request.Headers.CacheControl = new CacheControlHeaderValue { NoCache = true };
|
request.Headers.CacheControl = new CacheControlHeaderValue { NoCache = true };
|
||||||
|
|
||||||
using var requestCts = new CancellationTokenSource(TimeSpan.FromSeconds(timeout));
|
using var requestCts = new CancellationTokenSource(TimeSpan.FromSeconds(timeout));
|
||||||
|
|
||||||
return await httpClient.SendAsync(request, requestCts.Token);
|
return await httpClient.SendAsync(request, requestCts.Token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
11
Dalamud/Plugin/VersionInfo/DalamudVersionInfo.cs
Normal file
11
Dalamud/Plugin/VersionInfo/DalamudVersionInfo.cs
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
namespace Dalamud.Plugin.VersionInfo;
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
internal class DalamudVersionInfo(Version version, string? track) : IDalamudVersionInfo
|
||||||
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public Version Version { get; } = version;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public string? BetaTrack { get; } = track;
|
||||||
|
}
|
||||||
19
Dalamud/Plugin/VersionInfo/IDalamudVersionInfo.cs
Normal file
19
Dalamud/Plugin/VersionInfo/IDalamudVersionInfo.cs
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
namespace Dalamud.Plugin.VersionInfo;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Interface exposing various information related to Dalamud versioning.
|
||||||
|
/// </summary>
|
||||||
|
public interface IDalamudVersionInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the Dalamud version.
|
||||||
|
/// </summary>
|
||||||
|
Version Version { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the currently used beta track.
|
||||||
|
/// Please don't tell users to switch branches. They have it bad enough, fix your things instead.
|
||||||
|
/// Null if this build wasn't launched from XIVLauncher.
|
||||||
|
/// </summary>
|
||||||
|
string? BetaTrack { get; }
|
||||||
|
}
|
||||||
|
|
@ -37,7 +37,7 @@ internal static class BugBait
|
||||||
Name = plugin.InternalName,
|
Name = plugin.InternalName,
|
||||||
Version = isTesting ? plugin.TestingAssemblyVersion?.ToString() : plugin.AssemblyVersion.ToString(),
|
Version = isTesting ? plugin.TestingAssemblyVersion?.ToString() : plugin.AssemblyVersion.ToString(),
|
||||||
Platform = Util.GetHostPlatform().ToString(),
|
Platform = Util.GetHostPlatform().ToString(),
|
||||||
DalamudHash = Util.GetScmVersion(),
|
DalamudHash = Versioning.GetScmVersion(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (includeException)
|
if (includeException)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ internal class DalamudReleases : IServiceType
|
||||||
/// <returns>The version info for the current track.</returns>
|
/// <returns>The version info for the current track.</returns>
|
||||||
public async Task<DalamudVersionInfo?> GetVersionForCurrentTrack()
|
public async Task<DalamudVersionInfo?> GetVersionForCurrentTrack()
|
||||||
{
|
{
|
||||||
var currentTrack = Util.GetActiveTrack();
|
var currentTrack = Versioning.GetActiveTrack();
|
||||||
if (currentTrack.IsNullOrEmpty())
|
if (currentTrack.IsNullOrEmpty())
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,11 +69,11 @@ public static class Troubleshooting
|
||||||
LoadedPlugins = pluginManager?.InstalledPlugins?.Select(x => x.Manifest as LocalPluginManifest)?.OrderByDescending(x => x.InternalName).ToArray(),
|
LoadedPlugins = pluginManager?.InstalledPlugins?.Select(x => x.Manifest as LocalPluginManifest)?.OrderByDescending(x => x.InternalName).ToArray(),
|
||||||
PluginStates = pluginManager?.InstalledPlugins?.Where(x => !x.IsDev).ToDictionary(x => x.Manifest.InternalName, x => x.IsBanned ? "Banned" : x.State.ToString()),
|
PluginStates = pluginManager?.InstalledPlugins?.Where(x => !x.IsDev).ToDictionary(x => x.Manifest.InternalName, x => x.IsBanned ? "Banned" : x.State.ToString()),
|
||||||
EverStartedLoadingPlugins = pluginManager?.InstalledPlugins.Where(x => x.HasEverStartedLoad).Select(x => x.InternalName).ToList(),
|
EverStartedLoadingPlugins = pluginManager?.InstalledPlugins.Where(x => x.HasEverStartedLoad).Select(x => x.InternalName).ToList(),
|
||||||
DalamudVersion = Util.GetScmVersion(),
|
DalamudVersion = Versioning.GetScmVersion(),
|
||||||
DalamudGitHash = Util.GetGitHash() ?? "Unknown",
|
DalamudGitHash = Versioning.GetGitHash() ?? "Unknown",
|
||||||
GameVersion = startInfo.GameVersion?.ToString() ?? "Unknown",
|
GameVersion = startInfo.GameVersion?.ToString() ?? "Unknown",
|
||||||
Language = startInfo.Language.ToString(),
|
Language = startInfo.Language.ToString(),
|
||||||
BetaKey = Util.GetActiveTrack(),
|
BetaKey = Versioning.GetActiveTrack(),
|
||||||
DoPluginTest = configuration.DoPluginTest,
|
DoPluginTest = configuration.DoPluginTest,
|
||||||
LoadAllApiLevels = pluginManager?.LoadAllApiLevels == true,
|
LoadAllApiLevels = pluginManager?.LoadAllApiLevels == true,
|
||||||
InterfaceLoaded = interfaceManager?.IsReady ?? false,
|
InterfaceLoaded = interfaceManager?.IsReady ?? false,
|
||||||
|
|
|
||||||
|
|
@ -68,96 +68,10 @@ public static partial class Util
|
||||||
];
|
];
|
||||||
|
|
||||||
private static readonly Type GenericSpanType = typeof(Span<>);
|
private static readonly Type GenericSpanType = typeof(Span<>);
|
||||||
private static string? scmVersionInternal;
|
|
||||||
private static string? gitHashInternal;
|
|
||||||
private static string? gitHashClientStructsInternal;
|
|
||||||
private static string? branchInternal;
|
|
||||||
|
|
||||||
private static ulong moduleStartAddr;
|
private static ulong moduleStartAddr;
|
||||||
private static ulong moduleEndAddr;
|
private static ulong moduleEndAddr;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the Dalamud version.
|
|
||||||
/// </summary>
|
|
||||||
[Api14ToDo("Remove. Make both versions here internal. Add an API somewhere.")]
|
|
||||||
public static string AssemblyVersion { get; } =
|
|
||||||
Assembly.GetAssembly(typeof(ChatHandlers))!.GetName().Version!.ToString();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the Dalamud version.
|
|
||||||
/// </summary>
|
|
||||||
internal static Version AssemblyVersionParsed { get; } =
|
|
||||||
Assembly.GetAssembly(typeof(ChatHandlers))!.GetName().Version!;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the SCM Version from the assembly, or null if it cannot be found. This method will generally return
|
|
||||||
/// the <c>git describe</c> output for this build, which will be a raw version if this is a stable build or an
|
|
||||||
/// appropriately-annotated version if this is *not* stable. Local builds will return a `Local Build` text string.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The SCM version of the assembly.</returns>
|
|
||||||
public static string GetScmVersion()
|
|
||||||
{
|
|
||||||
if (scmVersionInternal != null) return scmVersionInternal;
|
|
||||||
|
|
||||||
var asm = typeof(Util).Assembly;
|
|
||||||
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
|
|
||||||
|
|
||||||
return scmVersionInternal = attrs.First(a => a.Key == "SCMVersion").Value
|
|
||||||
?? asm.GetName().Version!.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the git commit hash value from the assembly or null if it cannot be found. Will be null for Debug builds,
|
|
||||||
/// and will be suffixed with `-dirty` if in release with pending changes.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The git hash of the assembly.</returns>
|
|
||||||
public static string? GetGitHash()
|
|
||||||
{
|
|
||||||
if (gitHashInternal != null)
|
|
||||||
return gitHashInternal;
|
|
||||||
|
|
||||||
var asm = typeof(Util).Assembly;
|
|
||||||
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
|
|
||||||
|
|
||||||
return gitHashInternal = attrs.FirstOrDefault(a => a.Key == "GitHash")?.Value ?? "N/A";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the git hash value from the assembly or null if it cannot be found.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The git hash of the assembly.</returns>
|
|
||||||
public static string? GetGitHashClientStructs()
|
|
||||||
{
|
|
||||||
if (gitHashClientStructsInternal != null)
|
|
||||||
return gitHashClientStructsInternal;
|
|
||||||
|
|
||||||
var asm = typeof(Util).Assembly;
|
|
||||||
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
|
|
||||||
|
|
||||||
gitHashClientStructsInternal = attrs.First(a => a.Key == "GitHashClientStructs").Value;
|
|
||||||
|
|
||||||
return gitHashClientStructsInternal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the Git branch name this version of Dalamud was built from, or null, if this is a Debug build.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The branch name.</returns>
|
|
||||||
public static string? GetGitBranch()
|
|
||||||
{
|
|
||||||
if (branchInternal != null)
|
|
||||||
return branchInternal;
|
|
||||||
|
|
||||||
var asm = typeof(Util).Assembly;
|
|
||||||
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
|
|
||||||
|
|
||||||
var gitBranch = attrs.FirstOrDefault(a => a.Key == "GitBranch")?.Value;
|
|
||||||
if (gitBranch == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return branchInternal = gitBranch;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc cref="DescribeAddress(nint)"/>
|
/// <inheritdoc cref="DescribeAddress(nint)"/>
|
||||||
public static unsafe string DescribeAddress(void* p) => DescribeAddress((nint)p);
|
public static unsafe string DescribeAddress(void* p) => DescribeAddress((nint)p);
|
||||||
|
|
||||||
|
|
@ -693,16 +607,6 @@ public static partial class Util
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the active Dalamud track, if this instance was launched through XIVLauncher and used a version
|
|
||||||
/// downloaded from webservices.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The name of the track, or null.</returns>
|
|
||||||
internal static string? GetActiveTrack()
|
|
||||||
{
|
|
||||||
return Environment.GetEnvironmentVariable("DALAMUD_BRANCH");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a random, inoffensive, human-friendly string.
|
/// Gets a random, inoffensive, human-friendly string.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
108
Dalamud/Utility/Versioning.cs
Normal file
108
Dalamud/Utility/Versioning.cs
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace Dalamud.Utility;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helpers to access Dalamud versioning information.
|
||||||
|
/// </summary>
|
||||||
|
internal static class Versioning
|
||||||
|
{
|
||||||
|
private static string? scmVersionInternal;
|
||||||
|
private static string? gitHashInternal;
|
||||||
|
private static string? gitHashClientStructsInternal;
|
||||||
|
private static string? branchInternal;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the Dalamud version.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The raw Dalamud assembly version.</returns>
|
||||||
|
internal static string GetAssemblyVersion() =>
|
||||||
|
Assembly.GetAssembly(typeof(Versioning))!.GetName().Version!.ToString();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the Dalamud version.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The parsed Dalamud assembly version.</returns>
|
||||||
|
internal static Version GetAssemblyVersionParsed() =>
|
||||||
|
Assembly.GetAssembly(typeof(Versioning))!.GetName().Version!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the SCM Version from the assembly, or null if it cannot be found. This method will generally return
|
||||||
|
/// the <c>git describe</c> output for this build, which will be a raw version if this is a stable build or an
|
||||||
|
/// appropriately-annotated version if this is *not* stable. Local builds will return a `Local Build` text string.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The SCM version of the assembly.</returns>
|
||||||
|
internal static string GetScmVersion()
|
||||||
|
{
|
||||||
|
if (scmVersionInternal != null) return scmVersionInternal;
|
||||||
|
|
||||||
|
var asm = typeof(Util).Assembly;
|
||||||
|
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
|
||||||
|
|
||||||
|
return scmVersionInternal = attrs.First(a => a.Key == "SCMVersion").Value
|
||||||
|
?? asm.GetName().Version!.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the git commit hash value from the assembly or null if it cannot be found. Will be null for Debug builds,
|
||||||
|
/// and will be suffixed with `-dirty` if in release with pending changes.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The git hash of the assembly.</returns>
|
||||||
|
internal static string? GetGitHash()
|
||||||
|
{
|
||||||
|
if (gitHashInternal != null)
|
||||||
|
return gitHashInternal;
|
||||||
|
|
||||||
|
var asm = typeof(Util).Assembly;
|
||||||
|
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
|
||||||
|
|
||||||
|
return gitHashInternal = attrs.FirstOrDefault(a => a.Key == "GitHash")?.Value ?? "N/A";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the git hash value from the assembly or null if it cannot be found.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The git hash of the assembly.</returns>
|
||||||
|
internal static string? GetGitHashClientStructs()
|
||||||
|
{
|
||||||
|
if (gitHashClientStructsInternal != null)
|
||||||
|
return gitHashClientStructsInternal;
|
||||||
|
|
||||||
|
var asm = typeof(Util).Assembly;
|
||||||
|
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
|
||||||
|
|
||||||
|
gitHashClientStructsInternal = attrs.First(a => a.Key == "GitHashClientStructs").Value;
|
||||||
|
|
||||||
|
return gitHashClientStructsInternal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the Git branch name this version of Dalamud was built from, or null, if this is a Debug build.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The branch name.</returns>
|
||||||
|
internal static string? GetGitBranch()
|
||||||
|
{
|
||||||
|
if (branchInternal != null)
|
||||||
|
return branchInternal;
|
||||||
|
|
||||||
|
var asm = typeof(Util).Assembly;
|
||||||
|
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
|
||||||
|
|
||||||
|
var gitBranch = attrs.FirstOrDefault(a => a.Key == "GitBranch")?.Value;
|
||||||
|
if (gitBranch == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return branchInternal = gitBranch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the active Dalamud track, if this instance was launched through XIVLauncher and used a version
|
||||||
|
/// downloaded from webservices.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The name of the track, or null.</returns>
|
||||||
|
internal static string? GetActiveTrack()
|
||||||
|
{
|
||||||
|
return Environment.GetEnvironmentVariable("DALAMUD_BRANCH");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,38 +6,35 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<!-- Analyzers -->
|
<!-- Analyzers -->
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="4.14.0" />
|
||||||
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
|
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
|
||||||
<PackageVersion Include="JetBrains.Annotations" Version="2025.2.2" />
|
<PackageVersion Include="JetBrains.Annotations" Version="2025.2.4" />
|
||||||
|
|
||||||
<!-- Misc Libraries -->
|
<!-- Misc Libraries -->
|
||||||
<PackageVersion Include="BitFaster.Caching" Version="2.4.1" />
|
<PackageVersion Include="BitFaster.Caching" Version="2.5.4" />
|
||||||
<PackageVersion Include="CheapLoc" Version="1.1.8" />
|
<PackageVersion Include="CheapLoc" Version="1.1.8" />
|
||||||
<PackageVersion Include="MinSharp" Version="1.0.4" />
|
<PackageVersion Include="MinSharp" Version="1.0.4" />
|
||||||
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
|
||||||
<PackageVersion Include="Lumina" Version="6.5.1" />
|
<PackageVersion Include="Lumina" Version="6.5.1" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.ObjectPool" Version="10.0.0" />
|
<PackageVersion Include="Microsoft.Extensions.ObjectPool" Version="10.0.0" />
|
||||||
<PackageVersion Include="System.Collections.Immutable" Version="10.0.0" />
|
<PackageVersion Include="System.Reactive" Version="6.1.0" />
|
||||||
<PackageVersion Include="System.Drawing.Common" Version="10.0.0" />
|
|
||||||
<PackageVersion Include="System.Reactive" Version="5.0.0" />
|
|
||||||
<PackageVersion Include="System.Reflection.MetadataLoadContext" Version="10.0.0" />
|
<PackageVersion Include="System.Reflection.MetadataLoadContext" Version="10.0.0" />
|
||||||
<PackageVersion Include="System.Resources.Extensions" Version="10.0.0" />
|
|
||||||
<PackageVersion Include="DotNet.ReproducibleBuilds" Version="1.2.39" />
|
<PackageVersion Include="DotNet.ReproducibleBuilds" Version="1.2.39" />
|
||||||
<PackageVersion Include="sqlite-net-pcl" Version="1.8.116" />
|
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
||||||
|
|
||||||
<!-- DirectX / Win32 -->
|
<!-- DirectX / Win32 -->
|
||||||
<PackageVersion Include="TerraFX.Interop.Windows" Version="10.0.26100.5" />
|
<PackageVersion Include="TerraFX.Interop.Windows" Version="10.0.26100.5" />
|
||||||
<PackageVersion Include="Microsoft.Windows.CsWin32" Version="0.3.259" />
|
<PackageVersion Include="Microsoft.Windows.CsWin32" Version="0.3.259" />
|
||||||
|
|
||||||
<!-- Logging -->
|
<!-- Logging -->
|
||||||
<PackageVersion Include="Serilog" Version="4.0.2" />
|
<PackageVersion Include="Serilog" Version="4.3.0" />
|
||||||
<PackageVersion Include="Serilog.Sinks.Async" Version="2.0.0" />
|
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" />
|
||||||
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
|
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
|
||||||
<PackageVersion Include="Serilog.Sinks.File" Version="6.0.0" />
|
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
|
|
||||||
<!-- Injector Utilities -->
|
<!-- Injector Utilities -->
|
||||||
<PackageVersion Include="Iced" Version="1.17.0" />
|
<PackageVersion Include="Iced" Version="1.21.0" />
|
||||||
<PackageVersion Include="PeNet" Version="2.6.4" />
|
<PackageVersion Include="PeNet" Version="5.1.0" />
|
||||||
|
|
||||||
<!-- HexaGen -->
|
<!-- HexaGen -->
|
||||||
<PackageVersion Include="HexaGen.Runtime" Version="1.1.20" />
|
<PackageVersion Include="HexaGen.Runtime" Version="1.1.20" />
|
||||||
|
|
@ -52,15 +49,15 @@
|
||||||
<PackageVersion Include="StreamJsonRpc" Version="2.22.23" />
|
<PackageVersion Include="StreamJsonRpc" Version="2.22.23" />
|
||||||
|
|
||||||
<!-- Unit Testing -->
|
<!-- Unit Testing -->
|
||||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
|
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
|
||||||
<PackageVersion Include="xunit" Version="2.4.1" />
|
<PackageVersion Include="xunit" Version="2.9.3" />
|
||||||
<PackageVersion Include="xunit.abstractions" Version="2.0.3" />
|
<PackageVersion Include="xunit.abstractions" Version="2.0.3" />
|
||||||
<PackageVersion Include="xunit.analyzers" Version="0.10.0" />
|
<PackageVersion Include="xunit.analyzers" Version="1.26.0" />
|
||||||
<PackageVersion Include="xunit.assert" Version="2.4.1" />
|
<PackageVersion Include="xunit.assert" Version="2.9.3" />
|
||||||
<PackageVersion Include="xunit.core" Version="2.4.1" />
|
<PackageVersion Include="xunit.core" Version="2.9.3" />
|
||||||
<PackageVersion Include="xunit.extensibility.core" Version="2.4.1" />
|
<PackageVersion Include="xunit.extensibility.core" Version="2.9.3" />
|
||||||
<PackageVersion Include="xunit.extensibility.execution" Version="2.4.1" />
|
<PackageVersion Include="xunit.extensibility.execution" Version="2.9.3" />
|
||||||
<PackageVersion Include="xunit.runner.console" Version="2.4.1" />
|
<PackageVersion Include="xunit.runner.console" Version="2.9.3" />
|
||||||
<PackageVersion Include="xunit.runner.visualstudio" Version="2.4.3" />
|
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue