Update for SDK.

This commit is contained in:
Ottermandias 2025-03-27 12:04:38 +01:00
parent 279a861582
commit 03bb07a9c0
28 changed files with 178 additions and 147 deletions

View file

@ -16,7 +16,7 @@ jobs:
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@v1 uses: actions/setup-dotnet@v1
with: with:
dotnet-version: '8.x.x' dotnet-version: '9.x.x'
- name: Restore dependencies - name: Restore dependencies
run: dotnet restore run: dotnet restore
- name: Download Dalamud - name: Download Dalamud

View file

@ -15,7 +15,7 @@ jobs:
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@v1 uses: actions/setup-dotnet@v1
with: with:
dotnet-version: '8.x.x' dotnet-version: '9.x.x'
- name: Restore dependencies - name: Restore dependencies
run: dotnet restore run: dotnet restore
- name: Download Dalamud - name: Download Dalamud

View file

@ -15,7 +15,7 @@ jobs:
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@v1 uses: actions/setup-dotnet@v1
with: with:
dotnet-version: '8.x.x' dotnet-version: '9.x.x'
- name: Restore dependencies - name: Restore dependencies
run: dotnet restore run: dotnet restore
- name: Download Dalamud - name: Download Dalamud

@ -1 +1 @@
Subproject commit 13f1a90b88d2b8572480748a209f957b70d6a46f Subproject commit 3396ee176fa72ad2dfb2de3294f7125ebce4dae5

@ -1 +1 @@
Subproject commit 404c8aaa5115925006963baa118bf710c7953380 Subproject commit 6d262cd3181d44c29891c9473f7c423300320f15

View file

@ -1,4 +1,6 @@
using System.Text.Json.Nodes; using System;
using System.Collections.Generic;
using System.Text.Json.Nodes;
namespace Penumbra.CrashHandler.Buffers; namespace Penumbra.CrashHandler.Buffers;

View file

@ -1,4 +1,6 @@
using System.Text.Json.Nodes; using System;
using System.Collections.Generic;
using System.Text.Json.Nodes;
namespace Penumbra.CrashHandler.Buffers; namespace Penumbra.CrashHandler.Buffers;

View file

@ -1,5 +1,8 @@
using System;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.IO.MemoryMappedFiles; using System.IO.MemoryMappedFiles;
using System.Linq;
using System.Numerics; using System.Numerics;
using System.Text; using System.Text;

View file

@ -1,4 +1,6 @@
using System.Text.Json.Nodes; using System;
using System.Collections.Generic;
using System.Text.Json.Nodes;
namespace Penumbra.CrashHandler.Buffers; namespace Penumbra.CrashHandler.Buffers;

View file

@ -1,3 +1,5 @@
using System;
using System.Collections.Generic;
using Penumbra.CrashHandler.Buffers; using Penumbra.CrashHandler.Buffers;
namespace Penumbra.CrashHandler; namespace Penumbra.CrashHandler;

View file

@ -1,4 +1,7 @@
using System.Text.Json.Nodes; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Nodes;
using Penumbra.CrashHandler.Buffers; using Penumbra.CrashHandler.Buffers;
namespace Penumbra.CrashHandler; namespace Penumbra.CrashHandler;

View file

@ -1,4 +1,5 @@
using Penumbra.CrashHandler.Buffers; using System;
using Penumbra.CrashHandler.Buffers;
namespace Penumbra.CrashHandler; namespace Penumbra.CrashHandler;

View file

@ -1,20 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Dalamud.NET.Sdk/12.0.2">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<LangVersion>preview</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<PlatformTarget>x64</PlatformTarget>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<PropertyGroup>
<DalamudLibPath Condition="$([MSBuild]::IsOSPlatform('Windows'))">$(appdata)\XIVLauncher\addon\Hooks\dev\</DalamudLibPath>
<DalamudLibPath Condition="$([MSBuild]::IsOSPlatform('Linux'))">$(HOME)/.xlcore/dalamud/Hooks/dev/</DalamudLibPath>
<DalamudLibPath Condition="$(DALAMUD_HOME) != ''">$(DALAMUD_HOME)/</DalamudLibPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@ -25,4 +11,8 @@
<DebugType>embedded</DebugType> <DebugType>embedded</DebugType>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<Use_DalamudPackager>false</Use_DalamudPackager>
</PropertyGroup>
</Project> </Project>

View file

@ -1,4 +1,6 @@
using System.Diagnostics; using System;
using System.Diagnostics;
using System.IO;
using System.Text.Json; using System.Text.Json;
namespace Penumbra.CrashHandler; namespace Penumbra.CrashHandler;

View file

@ -0,0 +1,13 @@
{
"version": 1,
"dependencies": {
"net9.0-windows7.0": {
"DotNet.ReproducibleBuilds": {
"type": "Direct",
"requested": "[1.2.25, )",
"resolved": "1.2.25",
"contentHash": "xCXiw7BCxHJ8pF6wPepRUddlh2dlQlbr81gXA72hdk4FLHkKXas7EH/n+fk5UCA/YfMqG1Z6XaPiUjDbUNBUzg=="
}
}
}
}

@ -1 +1 @@
Subproject commit 757aaa39ac4aa988d0b8597ff088641a0f4f49fd Subproject commit ab3ee0ee814e170b59e0c13b023bbb8bc9314c74

@ -1 +1 @@
Subproject commit 4eb7c118cdac5873afb97cb04719602f061f03b7 Subproject commit 2896c0561f60827f97408650d52a15c38f4d9d10

View file

@ -54,34 +54,34 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "structs", "structs", "{B03F
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU Release|x64 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{13C812E9-0D42-4B95-8646-40EEBF30636F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {13C812E9-0D42-4B95-8646-40EEBF30636F}.Debug|x64.ActiveCfg = Debug|Any CPU
{13C812E9-0D42-4B95-8646-40EEBF30636F}.Debug|Any CPU.Build.0 = Debug|Any CPU {13C812E9-0D42-4B95-8646-40EEBF30636F}.Debug|x64.Build.0 = Debug|Any CPU
{13C812E9-0D42-4B95-8646-40EEBF30636F}.Release|Any CPU.ActiveCfg = Release|Any CPU {13C812E9-0D42-4B95-8646-40EEBF30636F}.Release|x64.ActiveCfg = Release|x64
{13C812E9-0D42-4B95-8646-40EEBF30636F}.Release|Any CPU.Build.0 = Release|Any CPU {13C812E9-0D42-4B95-8646-40EEBF30636F}.Release|x64.Build.0 = Release|x64
{EE551E87-FDB3-4612-B500-DC870C07C605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EE551E87-FDB3-4612-B500-DC870C07C605}.Debug|x64.ActiveCfg = Debug|x64
{EE551E87-FDB3-4612-B500-DC870C07C605}.Debug|Any CPU.Build.0 = Debug|Any CPU {EE551E87-FDB3-4612-B500-DC870C07C605}.Debug|x64.Build.0 = Debug|x64
{EE551E87-FDB3-4612-B500-DC870C07C605}.Release|Any CPU.ActiveCfg = Release|Any CPU {EE551E87-FDB3-4612-B500-DC870C07C605}.Release|x64.ActiveCfg = Release|x64
{EE551E87-FDB3-4612-B500-DC870C07C605}.Release|Any CPU.Build.0 = Release|Any CPU {EE551E87-FDB3-4612-B500-DC870C07C605}.Release|x64.Build.0 = Release|x64
{87750518-1A20-40B4-9FC1-22F906EFB290}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {87750518-1A20-40B4-9FC1-22F906EFB290}.Debug|x64.ActiveCfg = Debug|Any CPU
{87750518-1A20-40B4-9FC1-22F906EFB290}.Debug|Any CPU.Build.0 = Debug|Any CPU {87750518-1A20-40B4-9FC1-22F906EFB290}.Debug|x64.Build.0 = Debug|Any CPU
{87750518-1A20-40B4-9FC1-22F906EFB290}.Release|Any CPU.ActiveCfg = Release|Any CPU {87750518-1A20-40B4-9FC1-22F906EFB290}.Release|x64.ActiveCfg = Release|x64
{87750518-1A20-40B4-9FC1-22F906EFB290}.Release|Any CPU.Build.0 = Release|Any CPU {87750518-1A20-40B4-9FC1-22F906EFB290}.Release|x64.Build.0 = Release|x64
{1FE4D8DF-B56A-464F-B39E-CDC0ED4167D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1FE4D8DF-B56A-464F-B39E-CDC0ED4167D4}.Debug|x64.ActiveCfg = Debug|x64
{1FE4D8DF-B56A-464F-B39E-CDC0ED4167D4}.Debug|Any CPU.Build.0 = Debug|Any CPU {1FE4D8DF-B56A-464F-B39E-CDC0ED4167D4}.Debug|x64.Build.0 = Debug|x64
{1FE4D8DF-B56A-464F-B39E-CDC0ED4167D4}.Release|Any CPU.ActiveCfg = Release|Any CPU {1FE4D8DF-B56A-464F-B39E-CDC0ED4167D4}.Release|x64.ActiveCfg = Release|x64
{1FE4D8DF-B56A-464F-B39E-CDC0ED4167D4}.Release|Any CPU.Build.0 = Release|Any CPU {1FE4D8DF-B56A-464F-B39E-CDC0ED4167D4}.Release|x64.Build.0 = Release|x64
{5549BAFD-6357-4B1A-800C-75AC36E5B76D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5549BAFD-6357-4B1A-800C-75AC36E5B76D}.Debug|x64.ActiveCfg = Debug|x64
{5549BAFD-6357-4B1A-800C-75AC36E5B76D}.Debug|Any CPU.Build.0 = Debug|Any CPU {5549BAFD-6357-4B1A-800C-75AC36E5B76D}.Debug|x64.Build.0 = Debug|x64
{5549BAFD-6357-4B1A-800C-75AC36E5B76D}.Release|Any CPU.ActiveCfg = Release|Any CPU {5549BAFD-6357-4B1A-800C-75AC36E5B76D}.Release|x64.ActiveCfg = Release|x64
{5549BAFD-6357-4B1A-800C-75AC36E5B76D}.Release|Any CPU.Build.0 = Release|Any CPU {5549BAFD-6357-4B1A-800C-75AC36E5B76D}.Release|x64.Build.0 = Release|x64
{EE834491-A98F-4395-BE0D-6861AE5AD953}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EE834491-A98F-4395-BE0D-6861AE5AD953}.Debug|x64.ActiveCfg = Debug|x64
{EE834491-A98F-4395-BE0D-6861AE5AD953}.Debug|Any CPU.Build.0 = Debug|Any CPU {EE834491-A98F-4395-BE0D-6861AE5AD953}.Debug|x64.Build.0 = Debug|x64
{EE834491-A98F-4395-BE0D-6861AE5AD953}.Release|Any CPU.ActiveCfg = Release|Any CPU {EE834491-A98F-4395-BE0D-6861AE5AD953}.Release|x64.ActiveCfg = Release|x64
{EE834491-A98F-4395-BE0D-6861AE5AD953}.Release|Any CPU.Build.0 = Release|Any CPU {EE834491-A98F-4395-BE0D-6861AE5AD953}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View file

@ -193,7 +193,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
if (shpk == null) if (shpk == null)
return; return;
var shpkName = mtrl->ShpkNameSpan; var shpkName = mtrl->ShpkName.AsSpan();
var shpkState = GetStateForHumanSetup(shpkName) var shpkState = GetStateForHumanSetup(shpkName)
?? GetStateForHumanRender(shpkName) ?? GetStateForHumanRender(shpkName)
?? GetStateForModelRendererRender(shpkName) ?? GetStateForModelRendererRender(shpkName)
@ -217,7 +217,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
} }
private ModdedShaderPackageState? GetStateForHumanSetup(MaterialResourceHandle* mtrlResource) private ModdedShaderPackageState? GetStateForHumanSetup(MaterialResourceHandle* mtrlResource)
=> mtrlResource == null ? null : GetStateForHumanSetup(mtrlResource->ShpkNameSpan); => mtrlResource == null ? null : GetStateForHumanSetup(mtrlResource->ShpkName.AsSpan());
private ModdedShaderPackageState? GetStateForHumanSetup(ReadOnlySpan<byte> shpkName) private ModdedShaderPackageState? GetStateForHumanSetup(ReadOnlySpan<byte> shpkName)
=> CharacterStockingsShpkName.SequenceEqual(shpkName) ? _characterStockingsState : null; => CharacterStockingsShpkName.SequenceEqual(shpkName) ? _characterStockingsState : null;
@ -227,7 +227,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
=> _characterStockingsState.MaterialCount; => _characterStockingsState.MaterialCount;
private ModdedShaderPackageState? GetStateForHumanRender(MaterialResourceHandle* mtrlResource) private ModdedShaderPackageState? GetStateForHumanRender(MaterialResourceHandle* mtrlResource)
=> mtrlResource == null ? null : GetStateForHumanRender(mtrlResource->ShpkNameSpan); => mtrlResource == null ? null : GetStateForHumanRender(mtrlResource->ShpkName.AsSpan());
private ModdedShaderPackageState? GetStateForHumanRender(ReadOnlySpan<byte> shpkName) private ModdedShaderPackageState? GetStateForHumanRender(ReadOnlySpan<byte> shpkName)
=> SkinShpkName.SequenceEqual(shpkName) ? _skinState : null; => SkinShpkName.SequenceEqual(shpkName) ? _skinState : null;
@ -237,7 +237,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
=> _skinState.MaterialCount; => _skinState.MaterialCount;
private ModdedShaderPackageState? GetStateForModelRendererRender(MaterialResourceHandle* mtrlResource) private ModdedShaderPackageState? GetStateForModelRendererRender(MaterialResourceHandle* mtrlResource)
=> mtrlResource == null ? null : GetStateForModelRendererRender(mtrlResource->ShpkNameSpan); => mtrlResource == null ? null : GetStateForModelRendererRender(mtrlResource->ShpkName.AsSpan());
private ModdedShaderPackageState? GetStateForModelRendererRender(ReadOnlySpan<byte> shpkName) private ModdedShaderPackageState? GetStateForModelRendererRender(ReadOnlySpan<byte> shpkName)
{ {
@ -264,7 +264,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
+ _hairMaskState.MaterialCount; + _hairMaskState.MaterialCount;
private ModdedShaderPackageState? GetStateForModelRendererUnk(MaterialResourceHandle* mtrlResource) private ModdedShaderPackageState? GetStateForModelRendererUnk(MaterialResourceHandle* mtrlResource)
=> mtrlResource == null ? null : GetStateForModelRendererUnk(mtrlResource->ShpkNameSpan); => mtrlResource == null ? null : GetStateForModelRendererUnk(mtrlResource->ShpkName.AsSpan());
private ModdedShaderPackageState? GetStateForModelRendererUnk(ReadOnlySpan<byte> shpkName) private ModdedShaderPackageState? GetStateForModelRendererUnk(ReadOnlySpan<byte> shpkName)
{ {
@ -480,7 +480,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable, IRequiredServic
if (material == null) if (material == null)
return _prepareColorTableHook.Original(thisPtr, stain0Id, stain1Id); return _prepareColorTableHook.Original(thisPtr, stain0Id, stain1Id);
var shpkState = GetStateForColorTable(thisPtr->ShpkNameSpan); var shpkState = GetStateForColorTable(thisPtr->ShpkName.AsSpan());
if (shpkState == null || shpkState.MaterialCount == 0) if (shpkState == null || shpkState.MaterialCount == 0)
return _prepareColorTableHook.Original(thisPtr, stain0Id, stain1Id); return _prepareColorTableHook.Original(thisPtr, stain0Id, stain1Id);

View file

@ -84,7 +84,9 @@ public sealed unsafe class LiveColorTablePreviewer : LiveMaterialPreviewerBase
textureSize[1] = Height; textureSize[1] = Height;
using var texture = using var texture =
new SafeTextureHandle(Device.Instance()->CreateTexture2D(textureSize, 1, 0x2460, 0x80000804, 7), false); new SafeTextureHandle(
Device.Instance()->CreateTexture2D(textureSize, 1, TextureFormat.R16G16B16A16_FLOAT,
TextureFlags.TextureNoSwizzle | TextureFlags.Immutable | TextureFlags.Managed, 7), false);
if (texture.IsInvalid) if (texture.IsInvalid)
return; return;

View file

@ -239,7 +239,7 @@ internal unsafe partial record ResolveContext(
return cached; return cached;
var node = CreateNode(ResourceType.Mtrl, (nint)mtrl, &resource->ResourceHandle, path, false); var node = CreateNode(ResourceType.Mtrl, (nint)mtrl, &resource->ResourceHandle, path, false);
var shpkNode = CreateNodeFromShpk(resource->ShaderPackageResourceHandle, new CiByteString(resource->ShpkName)); var shpkNode = CreateNodeFromShpk(resource->ShaderPackageResourceHandle, new CiByteString(resource->ShpkName.Value));
if (shpkNode is not null) if (shpkNode is not null)
{ {
if (Global.WithUiData) if (Global.WithUiData)
@ -253,7 +253,7 @@ internal unsafe partial record ResolveContext(
var alreadyProcessedSamplerIds = new HashSet<uint>(); var alreadyProcessedSamplerIds = new HashSet<uint>();
for (var i = 0; i < resource->TextureCount; i++) for (var i = 0; i < resource->TextureCount; i++)
{ {
var texNode = CreateNodeFromTex(resource->Textures[i].TextureResourceHandle, new CiByteString(resource->TexturePath(i)), var texNode = CreateNodeFromTex(resource->Textures[i].TextureResourceHandle, new CiByteString(resource->TexturePath(i).Value),
resource->Textures[i].IsDX11); resource->Textures[i].IsDX11);
if (texNode == null) if (texNode == null)
continue; continue;

View file

@ -1,5 +1,6 @@
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using FFXIVClientStructs.STD; using FFXIVClientStructs.STD;
using InteropGenerator.Runtime;
using Penumbra.String; using Penumbra.String;
namespace Penumbra.Interop.Structs; namespace Penumbra.Interop.Structs;
@ -57,8 +58,8 @@ internal static class StructExtensions
return ToOwnedByteString(character.ResolvePhybPath(pathBuffer, partialSkeletonIndex)); return ToOwnedByteString(character.ResolvePhybPath(pathBuffer, partialSkeletonIndex));
} }
private static unsafe CiByteString ToOwnedByteString(byte* str) private static unsafe CiByteString ToOwnedByteString(CStringPointer str)
=> str == null ? CiByteString.Empty : new CiByteString(str).Clone(); => str.HasValue ? new CiByteString(str.Value).Clone() : CiByteString.Empty;
private static CiByteString ToOwnedByteString(ReadOnlySpan<byte> str) private static CiByteString ToOwnedByteString(ReadOnlySpan<byte> str)
=> str.Length == 0 ? CiByteString.Empty : CiByteString.FromSpanUnsafe(str, true).Clone(); => str.Length == 0 ? CiByteString.Empty : CiByteString.FromSpanUnsafe(str, true).Clone();

View file

@ -1,25 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Dalamud.NET.Sdk/12.0.2">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<LangVersion>preview</LangVersion>
<PlatformTarget>x64</PlatformTarget>
<AssemblyTitle>Penumbra</AssemblyTitle> <AssemblyTitle>Penumbra</AssemblyTitle>
<Company>absolute gangstas</Company> <Company>absolute gangstas</Company>
<Product>Penumbra</Product> <Product>Penumbra</Product>
<Copyright>Copyright © 2022</Copyright> <Copyright>Copyright © 2025</Copyright>
<FileVersion>9.0.0.1</FileVersion> <FileVersion>9.0.0.1</FileVersion>
<AssemblyVersion>9.0.0.1</AssemblyVersion> <AssemblyVersion>9.0.0.1</AssemblyVersion>
<OutputPath>bin\$(Configuration)\</OutputPath> <OutputPath>bin\$(Configuration)\</OutputPath>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Nullable>enable</Nullable>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<MSBuildWarningsAsMessages>$(MSBuildWarningsAsMessages);MSB3277</MSBuildWarningsAsMessages>
<DefineConstants>PROFILING;</DefineConstants> <DefineConstants>PROFILING;</DefineConstants>
</PropertyGroup> </PropertyGroup>
@ -35,63 +25,13 @@
</Content> </Content>
</ItemGroup> </ItemGroup>
<PropertyGroup>
<DalamudLibPath>$(AppData)\XIVLauncher\addon\Hooks\dev\</DalamudLibPath>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Dalamud">
<HintPath>$(DalamudLibPath)Dalamud.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ImGui.NET">
<HintPath>$(DalamudLibPath)ImGui.NET.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ImGuiScene">
<HintPath>$(DalamudLibPath)ImGuiScene.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Lumina">
<HintPath>$(DalamudLibPath)Lumina.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Lumina.Excel">
<HintPath>$(DalamudLibPath)Lumina.Excel.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="FFXIVClientStructs">
<HintPath>$(DalamudLibPath)FFXIVClientStructs.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>$(DalamudLibPath)Newtonsoft.Json.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Iced">
<HintPath>$(DalamudLibPath)Iced.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SharpDX">
<HintPath>$(DalamudLibPath)SharpDX.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SharpDX.Direct3D11">
<HintPath>$(DalamudLibPath)SharpDX.Direct3D11.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SharpDX.DXGI">
<HintPath>$(DalamudLibPath)SharpDX.DXGI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="OtterTex.dll"> <Reference Include="OtterTex.dll">
<HintPath>lib\OtterTex.dll</HintPath> <HintPath>lib\OtterTex.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<!-- This reference is only there to silence a vulnerability warning caused by transitive inclusion of a lower version through PeNet and System.Security.Cryptography.Pkcs. -->
<PackageReference Include="System.Formats.Asn1" Version="9.0.2" />
<PackageReference Include="EmbedIO" Version="3.5.2" /> <PackageReference Include="EmbedIO" Version="3.5.2" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" /> <PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
<PackageReference Include="SharpCompress" Version="0.39.0" /> <PackageReference Include="SharpCompress" Version="0.39.0" />

View file

@ -8,7 +8,7 @@
"RepoUrl": "https://github.com/xivdev/Penumbra", "RepoUrl": "https://github.com/xivdev/Penumbra",
"ApplicableVersion": "any", "ApplicableVersion": "any",
"Tags": [ "modding" ], "Tags": [ "modding" ],
"DalamudApiLevel": 11, "DalamudApiLevel": 12,
"LoadPriority": 69420, "LoadPriority": 69420,
"LoadRequiredState": 2, "LoadRequiredState": 2,
"LoadSync": true, "LoadSync": true,

View file

@ -1,12 +1,76 @@
using Dalamud.Interface.ImGuiNotification; using Dalamud.Interface.ImGuiNotification;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services; using OtterGui.Services;
using Penumbra.Api.Enums;
using Penumbra.GameData.Files; using Penumbra.GameData.Files;
using Penumbra.Mods;
using Penumbra.String.Classes;
using SharpCompress.Common; using SharpCompress.Common;
using SharpCompress.Readers; using SharpCompress.Readers;
namespace Penumbra.Services; namespace Penumbra.Services;
public class ModMigrator
{
private class FileData(string path)
{
public readonly string Path = path;
public readonly List<(string GamePath, int Option)> GamePaths = [];
}
private sealed class FileDataDict : Dictionary<string, FileData>
{
public void Add(string path, string gamePath, int option)
{
if (!TryGetValue(path, out var data))
{
data = new FileData(path);
data.GamePaths.Add((gamePath, option));
Add(path, data);
}
else
{
data.GamePaths.Add((gamePath, option));
}
}
}
private readonly FileDataDict Textures = [];
private readonly FileDataDict Models = [];
private readonly FileDataDict Materials = [];
public void Update(IEnumerable<Mod> mods)
{
CollectFiles(mods);
}
private void CollectFiles(IEnumerable<Mod> mods)
{
var option = 0;
foreach (var mod in mods)
{
AddDict(mod.Default.Files, option++);
foreach (var container in mod.Groups.SelectMany(group => group.DataContainers))
AddDict(container.Files, option++);
}
return;
void AddDict(Dictionary<Utf8GamePath, FullPath> dict, int currentOption)
{
foreach (var (gamePath, file) in dict)
{
switch (ResourceTypeExtensions.FromExtension(gamePath.Extension().Span))
{
case ResourceType.Tex: Textures.Add(file.FullName, gamePath.ToString(), currentOption); break;
case ResourceType.Mdl: Models.Add(file.FullName, gamePath.ToString(), currentOption); break;
case ResourceType.Mtrl: Materials.Add(file.FullName, gamePath.ToString(), currentOption); break;
}
}
}
}
}
public class MigrationManager(Configuration config) : IService public class MigrationManager(Configuration config) : IService
{ {
public enum TaskType : byte public enum TaskType : byte

View file

@ -1,4 +1,5 @@
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.Textures;
using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Textures.TextureWraps;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
@ -18,7 +19,6 @@ public class LaunchButton : IDisposable, IUiService
private readonly string _fileName; private readonly string _fileName;
private readonly ITextureProvider _textureProvider; private readonly ITextureProvider _textureProvider;
private IDalamudTextureWrap? _icon;
private IReadOnlyTitleScreenMenuEntry? _entry; private IReadOnlyTitleScreenMenuEntry? _entry;
/// <summary> /// <summary>
@ -30,7 +30,6 @@ public class LaunchButton : IDisposable, IUiService
_configWindow = ui; _configWindow = ui;
_textureProvider = textureProvider; _textureProvider = textureProvider;
_title = title; _title = title;
_icon = null;
_entry = null; _entry = null;
_fileName = Path.Combine(pi.AssemblyLocation.DirectoryName!, "tsmLogo.png"); _fileName = Path.Combine(pi.AssemblyLocation.DirectoryName!, "tsmLogo.png");
@ -39,7 +38,6 @@ public class LaunchButton : IDisposable, IUiService
public void Dispose() public void Dispose()
{ {
_icon?.Dispose();
if (_entry != null) if (_entry != null)
_title.RemoveEntry(_entry); _title.RemoveEntry(_entry);
} }
@ -52,9 +50,8 @@ public class LaunchButton : IDisposable, IUiService
try try
{ {
// TODO: update when API updated. // TODO: update when API updated.
_icon = _textureProvider.GetFromFile(_fileName).RentAsync().Result; var icon = _textureProvider.GetFromFile(_fileName);
if (_icon != null) _entry = _title.AddEntry("Manage Penumbra", icon, OnTriggered);
_entry = _title.AddEntry("Manage Penumbra", _icon, OnTriggered);
_uiBuilder.Draw -= CreateEntry; _uiBuilder.Draw -= CreateEntry;
} }

View file

@ -164,13 +164,14 @@ public unsafe class GlobalVariablesDrawer(
_schedulerFilterMapU8 = CiByteString.FromString(_schedulerFilterMap, out var t, MetaDataComputation.All, false) _schedulerFilterMapU8 = CiByteString.FromString(_schedulerFilterMap, out var t, MetaDataComputation.All, false)
? t ? t
: CiByteString.Empty; : CiByteString.Empty;
ImUtf8.Text($"{_shownResourcesMap} / {scheduler.Scheduler->NumResources}"); ImUtf8.Text($"{_shownResourcesMap} / {scheduler.Scheduler->Resources.LongCount}");
using var table = ImUtf8.Table("##SchedulerMapResources"u8, 10, ImGuiTableFlags.RowBg | ImGuiTableFlags.SizingFixedFit, using var table = ImUtf8.Table("##SchedulerMapResources"u8, 10, ImGuiTableFlags.RowBg | ImGuiTableFlags.SizingFixedFit,
-Vector2.UnitX); -Vector2.UnitX);
if (!table) if (!table)
return; return;
var map = (StdMap<int, Pointer<SchedulerResource>>*)&scheduler.Scheduler->Unknown; // TODO Remove cast when it'll have the right type in CS.
var map = (StdMap<int, Pointer<SchedulerResource>>*)&scheduler.Scheduler->Resources;
var total = 0; var total = 0;
_shownResourcesMap = 0; _shownResourcesMap = 0;
foreach (var (key, resourcePtr) in *map) foreach (var (key, resourcePtr) in *map)
@ -214,7 +215,7 @@ public unsafe class GlobalVariablesDrawer(
_schedulerFilterListU8 = CiByteString.FromString(_schedulerFilterList, out var t, MetaDataComputation.All, false) _schedulerFilterListU8 = CiByteString.FromString(_schedulerFilterList, out var t, MetaDataComputation.All, false)
? t ? t
: CiByteString.Empty; : CiByteString.Empty;
ImUtf8.Text($"{_shownResourcesList} / {scheduler.Scheduler->NumResources}"); ImUtf8.Text($"{_shownResourcesList} / {scheduler.Scheduler->Resources.LongCount}");
using var table = ImUtf8.Table("##SchedulerListResources"u8, 10, ImGuiTableFlags.RowBg | ImGuiTableFlags.SizingFixedFit, using var table = ImUtf8.Table("##SchedulerListResources"u8, 10, ImGuiTableFlags.RowBg | ImGuiTableFlags.SizingFixedFit,
-Vector2.UnitX); -Vector2.UnitX);
if (!table) if (!table)
@ -223,7 +224,7 @@ public unsafe class GlobalVariablesDrawer(
var resource = scheduler.Scheduler->Begin; var resource = scheduler.Scheduler->Begin;
var total = 0; var total = 0;
_shownResourcesList = 0; _shownResourcesList = 0;
while (resource != null && total < (int)scheduler.Scheduler->NumResources) while (resource != null && total < scheduler.Scheduler->Resources.Count)
{ {
if (_schedulerFilterList.Length is 0 || resource->Name.Buffer.IndexOf(_schedulerFilterListU8.Span) >= 0) if (_schedulerFilterList.Length is 0 || resource->Name.Buffer.IndexOf(_schedulerFilterListU8.Span) >= 0)
{ {

View file

@ -1,7 +1,19 @@
{ {
"version": 1, "version": 1,
"dependencies": { "dependencies": {
"net8.0-windows7.0": { "net9.0-windows7.0": {
"DalamudPackager": {
"type": "Direct",
"requested": "[12.0.0, )",
"resolved": "12.0.0",
"contentHash": "J5TJLV3f16T/E2H2P17ClWjtfEBPpq3yxvqW46eN36JCm6wR+EaoaYkqG9Rm5sHqs3/nK/vKjWWyvEs/jhKoXw=="
},
"DotNet.ReproducibleBuilds": {
"type": "Direct",
"requested": "[1.2.25, )",
"resolved": "1.2.25",
"contentHash": "xCXiw7BCxHJ8pF6wPepRUddlh2dlQlbr81gXA72hdk4FLHkKXas7EH/n+fk5UCA/YfMqG1Z6XaPiUjDbUNBUzg=="
},
"EmbedIO": { "EmbedIO": {
"type": "Direct", "type": "Direct",
"requested": "[3.5.2, )", "requested": "[3.5.2, )",
@ -52,12 +64,6 @@
"resolved": "3.1.7", "resolved": "3.1.7",
"contentHash": "9fIOOAsyLFid6qKypM2Iy0Z3Q9yoanV8VoYAHtI2sYGMNKzhvRTjgFDHonIiVe+ANtxIxM6SuqUzj0r91nItpA==" "contentHash": "9fIOOAsyLFid6qKypM2Iy0Z3Q9yoanV8VoYAHtI2sYGMNKzhvRTjgFDHonIiVe+ANtxIxM6SuqUzj0r91nItpA=="
}, },
"System.Formats.Asn1": {
"type": "Direct",
"requested": "[9.0.2, )",
"resolved": "9.0.2",
"contentHash": "OKWHCPYQr/+cIoO8EVjFn7yFyiT8Mnf1wif/5bYGsqxQV6PrwlX2HQ9brZNx57ViOvRe4ing1xgHCKl/5Ko8xg=="
},
"JetBrains.Annotations": { "JetBrains.Annotations": {
"type": "Transitive", "type": "Transitive",
"resolved": "2024.3.0", "resolved": "2024.3.0",
@ -134,8 +140,8 @@
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"OtterGui": "[1.0.0, )", "OtterGui": "[1.0.0, )",
"Penumbra.Api": "[5.6.0, )", "Penumbra.Api": "[5.6.1, )",
"Penumbra.String": "[1.0.5, )" "Penumbra.String": "[1.0.6, )"
} }
}, },
"penumbra.string": { "penumbra.string": {