Compare commits
10 Commits
67430ed38e
...
19c7c784f8
| Author | SHA1 | Date | |
|---|---|---|---|
| 19c7c784f8 | |||
| 531b103e8e | |||
| 8d6b603963 | |||
| be349a29a4 | |||
| 9b69d1bc2a | |||
| e800bc4c75 | |||
| fdb31b5720 | |||
| f26d958a5c | |||
| a041fc6ebf | |||
| 88a1be2738 |
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<OutputType>Exe</OutputType>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
@@ -17,10 +17,10 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
|
||||
<PackageReference Include="BenchmarkDotNet.Diagnostics.dotTrace" Version="0.14.0" />
|
||||
<PackageReference Include="BenchmarkDotNet.Diagnostics.Windows" Version="0.14.0" />
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.199">
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
|
||||
<PackageReference Include="BenchmarkDotNet.Diagnostics.dotTrace" Version="0.15.8" />
|
||||
<PackageReference Include="BenchmarkDotNet.Diagnostics.Windows" Version="0.15.8" />
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.264">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
Craftimizer — Hellion fork of the FFXIV crafting plugin by Asriel Camora
|
||||
|
||||
═══════════════════════════════════════════════════════════════════
|
||||
Source code
|
||||
═══════════════════════════════════════════════════════════════════
|
||||
|
||||
Copyright (c) 2023 Asriel Camora
|
||||
Original author of Craftimizer (https://github.com/WorkingRobot/Craftimizer).
|
||||
The entire architecture, simulator, solver, recipe data layer,
|
||||
synthesis hooks, macro engine, and every UI window are Asriel's
|
||||
work. This fork would not exist without it.
|
||||
|
||||
Copyright (c) 2026 Hellion Online Media
|
||||
Hellion fork maintenance: Dalamud SDK 14 → 15 migration for the
|
||||
FFXIV 7.5 / Dalamud API 15 cycle. Scope: the ValueType → AtkValueType
|
||||
rename in FFXIVClientStructs, the local IEndObject interface that
|
||||
replaces the removed Dalamud ImRaii.IEndObject, the typed ImRaii
|
||||
disposable returns (TabItemDisposable, ColorDisposable), and the
|
||||
ImRaii.TabItem ref-bool lifetime fix. No functional changes.
|
||||
|
||||
Source code is licensed under the MIT License. The full Licence text
|
||||
lives in the LICENSE file at the root of this repository.
|
||||
|
||||
═══════════════════════════════════════════════════════════════════
|
||||
Visual assets
|
||||
═══════════════════════════════════════════════════════════════════
|
||||
|
||||
Copyright (c) 2026 Florian Eck
|
||||
Designer of the Hellion Forge logo (docs/images/hellion-forge.png).
|
||||
Exclusive usage and marketing rights licensed to Hellion Online
|
||||
Media. This asset is NOT covered by the MIT source code licence
|
||||
above and may not be reused, modified, or redistributed without
|
||||
separate permission from the copyright holder.
|
||||
|
||||
Copyright (c) 2023 Asriel Camora
|
||||
Designer of the Craftimizer plugin icon (icon.png), the embedded
|
||||
graphics (Craftimizer/Graphics/*.png), and the documentation
|
||||
screenshots (Images/*.png). Asset reuse follows the MIT Licence
|
||||
above.
|
||||
|
||||
═══════════════════════════════════════════════════════════════════
|
||||
Bundled binary assets
|
||||
═══════════════════════════════════════════════════════════════════
|
||||
|
||||
Raphael solver (Craftimizer/raphael_bindings.dll, Raphael.Net.dll)
|
||||
Upstream Rust + .NET binding crate bundled as a pre-built binary
|
||||
by the original Craftimizer build. Licensing follows the upstream
|
||||
Raphael project; see the upstream Craftimizer repository for the
|
||||
attribution chain.
|
||||
|
||||
═══════════════════════════════════════════════════════════════════
|
||||
|
||||
Acknowledgements directed at the upstream author live in NOTICE.md.
|
||||
@@ -1,14 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Dalamud.NET.Sdk/13.0.0">
|
||||
<Project Sdk="Dalamud.NET.Sdk/15.0.0">
|
||||
<PropertyGroup>
|
||||
<Authors>Asriel Camora</Authors>
|
||||
<Version>2.8.0.0</Version>
|
||||
<Version>2.9.1.1</Version>
|
||||
<PackageProjectUrl>https://github.com/WorkingRobot/Craftimizer.git</PackageProjectUrl>
|
||||
<Configurations>Debug;Release</Configurations>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0-windows7.0</TargetFramework>
|
||||
<TargetFramework>net10.0-windows</TargetFramework>
|
||||
<Platforms>x64</Platforms>
|
||||
<Nullable>enable</Nullable>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MathNet.Numerics" Version="5.0.0" />
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.199">
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.264">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
||||
@@ -321,7 +321,7 @@ internal static class ImGuiUtils
|
||||
using var fill = ImRaii2.PushColor(ImPlotCol.Fill, Vector4.One.WithAlpha(.5f));
|
||||
|
||||
using var plot = ImRaii2.Plot("##violin", size, ImPlotFlags.CanvasOnly | ImPlotFlags.NoInputs | ImPlotFlags.NoChild | ImPlotFlags.NoFrame);
|
||||
if (plot)
|
||||
if (plot.Success)
|
||||
{
|
||||
ImPlot.SetupAxes([], [], ImPlotAxisFlags.NoDecorations, ImPlotAxisFlags.NoDecorations | ImPlotAxisFlags.AutoFit);
|
||||
ImPlot.SetupAxisLimits(ImAxis.X1, data.Min, data.Max, ImPlotCond.Always);
|
||||
|
||||
+13
-8
@@ -6,9 +6,14 @@ using System.Numerics;
|
||||
|
||||
namespace Craftimizer.Plugin;
|
||||
|
||||
public interface IEndObject : IDisposable
|
||||
{
|
||||
bool Success { get; }
|
||||
}
|
||||
|
||||
public static class ImRaii2
|
||||
{
|
||||
private struct EndUnconditionally(Action endAction, bool success) : ImRaii.IEndObject, IDisposable
|
||||
private struct EndUnconditionally(Action endAction, bool success) : IEndObject
|
||||
{
|
||||
private Action EndAction { get; } = endAction;
|
||||
|
||||
@@ -26,7 +31,7 @@ public static class ImRaii2
|
||||
}
|
||||
}
|
||||
|
||||
private struct EndConditionally(Action endAction, bool success) : ImRaii.IEndObject, IDisposable
|
||||
private struct EndConditionally(Action endAction, bool success) : IEndObject
|
||||
{
|
||||
public bool Success { get; } = success;
|
||||
|
||||
@@ -48,36 +53,36 @@ public static class ImRaii2
|
||||
}
|
||||
}
|
||||
|
||||
public static ImRaii.IEndObject GroupPanel(string name, float width, out float internalWidth)
|
||||
public static IEndObject GroupPanel(string name, float width, out float internalWidth)
|
||||
{
|
||||
internalWidth = ImGuiUtils.BeginGroupPanel(name, width);
|
||||
return new EndUnconditionally(ImGuiUtils.EndGroupPanel, true);
|
||||
}
|
||||
|
||||
public static ImRaii.IEndObject Plot(string title_id, Vector2 size, ImPlotFlags flags)
|
||||
public static IEndObject Plot(string title_id, Vector2 size, ImPlotFlags flags)
|
||||
{
|
||||
return new EndConditionally(new Action(ImPlot.EndPlot), ImPlot.BeginPlot(title_id, size, flags));
|
||||
}
|
||||
|
||||
public static ImRaii.IEndObject PushStyle(ImPlotStyleVar idx, Vector2 val)
|
||||
public static IEndObject PushStyle(ImPlotStyleVar idx, Vector2 val)
|
||||
{
|
||||
ImPlot.PushStyleVar(idx, val);
|
||||
return new EndUnconditionally(ImPlot.PopStyleVar, true);
|
||||
}
|
||||
|
||||
public static ImRaii.IEndObject PushStyle(ImPlotStyleVar idx, float val)
|
||||
public static IEndObject PushStyle(ImPlotStyleVar idx, float val)
|
||||
{
|
||||
ImPlot.PushStyleVar(idx, val);
|
||||
return new EndUnconditionally(ImPlot.PopStyleVar, true);
|
||||
}
|
||||
|
||||
public static ImRaii.IEndObject PushColor(ImPlotCol idx, Vector4 col)
|
||||
public static IEndObject PushColor(ImPlotCol idx, Vector4 col)
|
||||
{
|
||||
ImPlot.PushStyleColor(idx, col);
|
||||
return new EndUnconditionally(ImPlot.PopStyleColor, true);
|
||||
}
|
||||
|
||||
public static ImRaii.IEndObject TextWrapPos(float wrap_local_pos_x)
|
||||
public static IEndObject TextWrapPos(float wrap_local_pos_x)
|
||||
{
|
||||
ImGui.PushTextWrapPos(wrap_local_pos_x);
|
||||
return new EndUnconditionally(ImGui.PopTextWrapPos, true);
|
||||
|
||||
@@ -75,7 +75,7 @@ public sealed class Plugin : IDalamudPlugin
|
||||
var editorWindow = (EditorWindow?.IsOpen ?? false) ? EditorWindow : null;
|
||||
var recipeData = editorWindow?.RecipeData ?? Service.Plugin.RecipeNoteWindow.RecipeData;
|
||||
var characterStats = editorWindow?.CharacterStats ?? Service.Plugin.RecipeNoteWindow.CharacterStats;
|
||||
var buffs = editorWindow?.Buffs ?? (RecipeNoteWindow.CharacterStats != null ? new(Service.ClientState.LocalPlayer?.StatusList) : null);
|
||||
var buffs = editorWindow?.Buffs ?? (RecipeNoteWindow.CharacterStats != null ? new(Service.Objects.LocalPlayer?.StatusList) : null);
|
||||
|
||||
return (characterStats, recipeData, buffs);
|
||||
}
|
||||
@@ -143,7 +143,7 @@ public sealed class Plugin : IDalamudPlugin
|
||||
ListWindow.BringToFront();
|
||||
}
|
||||
|
||||
public void OpenCraftingLog()
|
||||
public static void OpenCraftingLog()
|
||||
{
|
||||
Chat.SendMessage("/craftinglog");
|
||||
}
|
||||
@@ -154,7 +154,7 @@ public sealed class Plugin : IDalamudPlugin
|
||||
ClipboardWindow = new(macros);
|
||||
}
|
||||
|
||||
public IActiveNotification DisplaySolverWarning(string text) =>
|
||||
public static IActiveNotification DisplaySolverWarning(string text) =>
|
||||
DisplayNotification(new()
|
||||
{
|
||||
Content = text,
|
||||
@@ -162,7 +162,7 @@ public sealed class Plugin : IDalamudPlugin
|
||||
Type = NotificationType.Warning
|
||||
});
|
||||
|
||||
public IActiveNotification DisplayNotification(Notification notification)
|
||||
public static IActiveNotification DisplayNotification(Notification notification)
|
||||
{
|
||||
var ret = Service.NotificationManager.AddNotification(notification);
|
||||
// ret.SetIconTexture(Icon.RentAsync().ContinueWith(t => (IDalamudTextureWrap?)t));
|
||||
|
||||
@@ -45,7 +45,7 @@ internal static class DynamicBars
|
||||
defaultSize);
|
||||
});
|
||||
|
||||
private static ImRaii.Color? PushCollectableColor(this in BarData bar, float collectability, bool colorUnmetThreshold = true)
|
||||
private static ImRaii.ColorDisposable? PushCollectableColor(this in BarData bar, float collectability, bool colorUnmetThreshold = true)
|
||||
{
|
||||
if (bar.Collectability is not { } collectabilities)
|
||||
return null;
|
||||
|
||||
@@ -33,7 +33,7 @@ public static class FoodStatus
|
||||
if (item.ItemAction.ValueNullable is not { } itemAction)
|
||||
continue;
|
||||
|
||||
if (itemAction.Type is not (844 or 845 or 846))
|
||||
if (itemAction.Action.RowId is not (844 or 845 or 846))
|
||||
continue;
|
||||
|
||||
if (LuminaSheets.ItemFoodSheet.GetRowOrDefault(itemAction.Data[1]) is not { } itemFood)
|
||||
@@ -70,8 +70,8 @@ public static class FoodStatus
|
||||
FoodItems = foods.ToFrozenDictionary();
|
||||
MedicineItems = medicines.ToFrozenDictionary();
|
||||
|
||||
FoodOrder = FoodItems.OrderByDescending(a => a.Value.Item.LevelItem.RowId).Select(a => a.Key).ToImmutableArray();
|
||||
MedicineOrder = MedicineItems.OrderByDescending(a => a.Value.Item.LevelItem.RowId).Select(a => a.Key).ToImmutableArray();
|
||||
FoodOrder = [.. FoodItems.OrderByDescending(a => a.Value.Item.LevelItem.RowId).Select(a => a.Key)];
|
||||
MedicineOrder = [.. MedicineItems.OrderByDescending(a => a.Value.Item.LevelItem.RowId).Select(a => a.Key)];
|
||||
}
|
||||
|
||||
public static void Initialize() { }
|
||||
|
||||
@@ -37,7 +37,7 @@ public sealed unsafe class Hooks : IDisposable
|
||||
var ret = UseActionHook.Original(manager, actionType, actionId, targetId, extraParam, mode, comboRouteId, optOutAreaTargeted);
|
||||
if (canCast && ret && actionType is CSActionType.CraftAction or CSActionType.Action)
|
||||
{
|
||||
var classJob = ClassJobUtils.GetClassJobFromIdx((byte)(Service.ClientState.LocalPlayer?.ClassJob.RowId ?? 0));
|
||||
var classJob = ClassJobUtils.GetClassJobFromIdx((byte)(Service.Objects.LocalPlayer?.ClassJob.RowId ?? 0));
|
||||
if (classJob != null)
|
||||
{
|
||||
var simActionType = ActionUtils.GetActionTypeFromId(actionId, classJob.Value, actionType == CSActionType.CraftAction);
|
||||
@@ -75,7 +75,7 @@ public sealed unsafe class Hooks : IDisposable
|
||||
if (actionType is not (CSActionType.CraftAction or CSActionType.Action))
|
||||
return ret;
|
||||
|
||||
var jobId = Service.ClientState.LocalPlayer?.ClassJob.RowId;
|
||||
var jobId = Service.Objects.LocalPlayer?.ClassJob.RowId;
|
||||
if (jobId == null)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public sealed class Ipc
|
||||
if (prop.GetMethod is not { } getMethod)
|
||||
throw new InvalidOperationException("Property must have a getter");
|
||||
|
||||
if (getMethod.GetCustomAttribute<CompilerGeneratedAttribute>() is null)
|
||||
if (!getMethod.IsDefined<CompilerGeneratedAttribute>())
|
||||
throw new InvalidOperationException("Property must have an auto getter");
|
||||
|
||||
var type = prop.PropertyType;
|
||||
|
||||
@@ -20,7 +20,7 @@ public static class MacroCopy
|
||||
{
|
||||
if (actions.Count == 0)
|
||||
{
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = "Cannot copy an empty macro.",
|
||||
MinimizedText = "Cannot copy empty macro",
|
||||
@@ -152,7 +152,7 @@ public static class MacroCopy
|
||||
|
||||
if (config.ShowCopiedMessage)
|
||||
{
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = i > 1 ? "Copied macro to User Macros." : $"Copied {i} macros to User Macros.",
|
||||
MinimizedText = i > 1 ? "Copied macro" : $"Copied {i} macros",
|
||||
@@ -164,7 +164,7 @@ public static class MacroCopy
|
||||
{
|
||||
Service.Plugin.OpenMacroClipboard(macros);
|
||||
var rest = macros.Count - i;
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = $"Couldn't copy {rest} macro{(rest == 1 ? "" : "s")}, so a window was opened with all of them.",
|
||||
Minimized = false,
|
||||
@@ -201,7 +201,7 @@ public static class MacroCopy
|
||||
ImGui.SetClipboardText(string.Join(Environment.NewLine + Environment.NewLine, macros));
|
||||
if (Service.Configuration.MacroCopy.ShowCopiedMessage)
|
||||
{
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = macros.Count == 1 ? "Copied macro to clipboard." : $"Copied {macros.Count} macros to clipboard.",
|
||||
MinimizedText = macros.Count == 1 ? "Copied macro" : $"Copied {macros.Count} macros",
|
||||
@@ -215,7 +215,7 @@ public static class MacroCopy
|
||||
{
|
||||
if (!Service.Ipc.MacroMateIsAvailable())
|
||||
{
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = "Please check if it installed and enabled.",
|
||||
MinimizedText = "Macro Mate is unavailable",
|
||||
@@ -232,7 +232,7 @@ public static class MacroCopy
|
||||
var (isValidParent, parentError) = Service.Ipc.MacroMateValidateGroupPath(parentPath);
|
||||
if (!isValidParent)
|
||||
{
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = parentError!,
|
||||
MinimizedText = parentError,
|
||||
@@ -246,7 +246,7 @@ public static class MacroCopy
|
||||
|
||||
if (Service.Configuration.MacroCopy.ShowCopiedMessage)
|
||||
{
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = "Copied macro to Macro Mate.",
|
||||
MinimizedText = "Copied macro",
|
||||
|
||||
@@ -47,7 +47,7 @@ public sealed record RecipeData
|
||||
ClassJobLevel = Table.ClassJobLevel,
|
||||
ConditionsFlag = Table.ConditionsFlag,
|
||||
MaxDurability = (Recipe.MaxAdjustableJobLevel.RowId != 0 ? 80 : Table.Durability) * Recipe.DurabilityFactor / 100,
|
||||
MaxQuality = (Recipe.CanHq || Recipe.IsExpert) ? (int)Table.Quality * Recipe.QualityFactor / 100 : 0,
|
||||
MaxQuality = (Recipe.CanHq || Recipe.RequiredQuality > 0) ? (int)Table.Quality * Recipe.QualityFactor / 100 : 0,
|
||||
MaxProgress = Table.Difficulty * Recipe.DifficultyFactor / 100,
|
||||
QualityModifier = Table.QualityModifier,
|
||||
QualityDivider = Table.QualityDivider,
|
||||
|
||||
@@ -4,7 +4,7 @@ using Dalamud.Memory;
|
||||
using FFXIVClientStructs.FFXIV.Client.UI;
|
||||
using FFXIVClientStructs.FFXIV.Component.GUI;
|
||||
using System;
|
||||
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType;
|
||||
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.AtkValueType;
|
||||
|
||||
namespace Craftimizer.Utils;
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ public sealed class MacroClipboard : Window, IDisposable
|
||||
ImGui.SetClipboardText(macro);
|
||||
if (Service.Configuration.MacroCopy.ShowCopiedMessage)
|
||||
{
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = Macros.Count == 1 ? "Copied macro to clipboard." : $"Copied macro {idx + 1} to clipboard.",
|
||||
MinimizedText = Macros.Count == 1 ? "Copied macro" : $"Copied macro {idx + 1}",
|
||||
|
||||
@@ -1008,13 +1008,13 @@ public sealed class MacroEditor : Window, IDisposable
|
||||
}
|
||||
|
||||
private const int MAX_LEVEL = 100;
|
||||
private float GetLevelEntryWidth()
|
||||
private static float GetLevelEntryWidth()
|
||||
{
|
||||
var levelTextWidth = ImGui.CalcTextSize(SqText.ToLevelString(MAX_LEVEL)).X + ImGui.GetStyle().FramePadding.X * 2 + 5;
|
||||
return ImGui.CalcTextSize(SqText.LevelPrefix.ToIconString()).X + 5 + levelTextWidth;
|
||||
}
|
||||
|
||||
private bool DrawLevelEntry(ref int level)
|
||||
private static bool DrawLevelEntry(ref int level)
|
||||
{
|
||||
static int LevelInputCallback(ImGuiInputTextCallbackDataPtr data)
|
||||
{
|
||||
@@ -1570,7 +1570,7 @@ public sealed class MacroEditor : Window, IDisposable
|
||||
foreach (var action in parsedActions)
|
||||
AddStep(action);
|
||||
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = $"Imported macro with {parsedActions.Count} step{(parsedActions.Count != 1 ? "s" : "")}",
|
||||
MinimizedText = $"Imported {parsedActions.Count} step macro",
|
||||
@@ -1626,7 +1626,7 @@ public sealed class MacroEditor : Window, IDisposable
|
||||
Macro.Clear();
|
||||
foreach (var action in actions)
|
||||
AddStep(action);
|
||||
Service.Plugin.DisplayNotification(new()
|
||||
Plugin.Plugin.DisplayNotification(new()
|
||||
{
|
||||
Content = $"Imported macro \"{name}\"",
|
||||
Title = "Macro Imported",
|
||||
@@ -1677,7 +1677,7 @@ public sealed class MacroEditor : Window, IDisposable
|
||||
|
||||
var solver = new Solver.Solver(config, state) { Token = token };
|
||||
solver.OnLog += Log.Debug;
|
||||
solver.OnWarn += t => Service.Plugin.DisplaySolverWarning(t);
|
||||
solver.OnWarn += t => Plugin.Plugin.DisplaySolverWarning(t);
|
||||
solver.OnNewAction += a => Macro.Enqueue(a);
|
||||
solver.OnSuggestSolution += a => Macro.EnqueueEphemeral(a.Actions);
|
||||
SolverObject = solver;
|
||||
|
||||
@@ -23,7 +23,7 @@ public sealed class MacroList : Window, IDisposable
|
||||
public CharacterStats? CharacterStats { get; private set; }
|
||||
public RecipeData? RecipeData { get; private set; }
|
||||
|
||||
private IReadOnlyList<Macro> Macros => Service.Configuration.Macros;
|
||||
private static IReadOnlyList<Macro> Macros => Service.Configuration.Macros;
|
||||
private Dictionary<Macro, SimulationState> MacroStateCache { get; } = [];
|
||||
|
||||
public MacroList() : base("Craftimizer Macro List", WindowFlags, false)
|
||||
@@ -60,7 +60,7 @@ public sealed class MacroList : Window, IDisposable
|
||||
|
||||
public override bool DrawConditions()
|
||||
{
|
||||
return Service.ClientState.LocalPlayer != null;
|
||||
return Service.Objects.LocalPlayer != null;
|
||||
}
|
||||
|
||||
public override void PreDraw()
|
||||
@@ -129,7 +129,7 @@ public sealed class MacroList : Window, IDisposable
|
||||
ImGuiUtils.TextCentered(text2);
|
||||
ImGuiUtils.AlignCentered(buttonRowWidth);
|
||||
if (ImGui.Button(text3))
|
||||
Service.Plugin.OpenCraftingLog();
|
||||
Plugin.Plugin.OpenCraftingLog();
|
||||
ImGui.SameLine();
|
||||
if (ImGui.Button(text4))
|
||||
OpenEditor(null);
|
||||
@@ -356,7 +356,7 @@ public sealed class MacroList : Window, IDisposable
|
||||
sortedMacros = [.. query];
|
||||
}
|
||||
|
||||
private void OpenEditor(Macro? macro)
|
||||
private static void OpenEditor(Macro? macro)
|
||||
{
|
||||
var stats = Service.Plugin.GetDefaultStats();
|
||||
Service.Plugin.OpenMacroEditor(stats.Character, stats.Recipe, stats.Buffs, null, macro?.Actions ?? Enumerable.Empty<ActionType>(), macro != null ? (actions => { macro.ActionEnumerable = actions; Service.Configuration.Save(); }) : null);
|
||||
|
||||
@@ -190,7 +190,7 @@ public sealed unsafe class RecipeNote : Window, IDisposable
|
||||
private bool StatsChanged { get; set; }
|
||||
private bool CalculateShouldOpen()
|
||||
{
|
||||
if (Service.ClientState.LocalPlayer == null)
|
||||
if (Service.Objects.LocalPlayer == null)
|
||||
return false;
|
||||
|
||||
bool ShouldUseRecipeNote()
|
||||
@@ -476,7 +476,7 @@ public sealed unsafe class RecipeNote : Window, IDisposable
|
||||
Service.Plugin.OpenMacroListWindow();
|
||||
|
||||
if (ImGui.Button("Open in Macro Editor", new(availWidth, 0)))
|
||||
Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.ClientState.LocalPlayer!.StatusList), CalculateIngredientHqCounts(), [], null);
|
||||
Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.Objects.LocalPlayer!.StatusList), CalculateIngredientHqCounts(), [], null);
|
||||
}
|
||||
|
||||
private void DrawCharacterStats()
|
||||
@@ -810,7 +810,7 @@ public sealed unsafe class RecipeNote : Window, IDisposable
|
||||
};
|
||||
|
||||
using var panel = ImRaii2.GroupPanel(panelTitle, panelWidth, out _);
|
||||
if (!panel)
|
||||
if (!panel.Success)
|
||||
return;
|
||||
|
||||
var stepsAvailWidthOffset = ImGui.GetContentRegionAvail().X - panelWidth;
|
||||
@@ -1031,7 +1031,7 @@ public sealed unsafe class RecipeNote : Window, IDisposable
|
||||
ImGui.TableNextColumn();
|
||||
{
|
||||
if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Edit, miniRowHeight))
|
||||
Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.ClientState.LocalPlayer!.StatusList), CalculateIngredientHqCounts(), actions, state.MacroEditorSetter);
|
||||
Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.Objects.LocalPlayer!.StatusList), CalculateIngredientHqCounts(), actions, state.MacroEditorSetter);
|
||||
if (ImGui.IsItemHovered())
|
||||
ImGuiUtils.Tooltip("Open in Macro Editor");
|
||||
if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Paste, miniRowHeight))
|
||||
@@ -1125,7 +1125,7 @@ public sealed unsafe class RecipeNote : Window, IDisposable
|
||||
var statusRequired = RecipeData.Recipe.StatusRequired;
|
||||
if (statusRequired.RowId != 0 && statusRequired.IsValid)
|
||||
{
|
||||
if (!Service.ClientState.LocalPlayer!.StatusList.Any(s => s.StatusId == statusRequired.RowId))
|
||||
if (!Service.Objects.LocalPlayer!.StatusList.Any(s => s.StatusId == statusRequired.RowId))
|
||||
return CraftableStatus.RequiredStatus;
|
||||
}
|
||||
|
||||
@@ -1234,7 +1234,7 @@ public sealed unsafe class RecipeNote : Window, IDisposable
|
||||
|
||||
var solver = new Solver.Solver(config, state) { Token = token };
|
||||
solver.OnLog += Log.Debug;
|
||||
solver.OnWarn += t => Service.Plugin.DisplaySolverWarning(t);
|
||||
solver.OnWarn += t => Plugin.Plugin.DisplaySolverWarning(t);
|
||||
BestMacroSolver = solver;
|
||||
solver.Start();
|
||||
var solution = solver.GetTask().GetAwaiter().GetResult();
|
||||
|
||||
@@ -50,14 +50,13 @@ public sealed class Settings : Window, IDisposable
|
||||
SelectedTab = label;
|
||||
}
|
||||
|
||||
private ImRaii.IEndObject TabItem(string label)
|
||||
private ImRaii.TabItemDisposable TabItem(string label)
|
||||
{
|
||||
var isSelected = string.Equals(SelectedTab, label, StringComparison.Ordinal);
|
||||
if (isSelected)
|
||||
{
|
||||
SelectedTab = null;
|
||||
var open = true;
|
||||
return ImRaii.TabItem(label, ref open, ImGuiTabItemFlags.SetSelected);
|
||||
return ImRaii.TabItem(label, ImGuiTabItemFlags.SetSelected);
|
||||
}
|
||||
return ImRaii.TabItem(label);
|
||||
}
|
||||
@@ -653,7 +652,7 @@ public sealed class Settings : Window, IDisposable
|
||||
else
|
||||
{
|
||||
DrawOption(
|
||||
"Quick Solve",
|
||||
"Backload Progress",
|
||||
"Speeds up solve times. Backloads all Progress " +
|
||||
"actions to the end of the rotation.",
|
||||
config.BackloadProgress,
|
||||
|
||||
@@ -159,7 +159,7 @@ public sealed unsafe class SynthHelper : Window, IDisposable
|
||||
private bool wasInCraftAction;
|
||||
private bool CalculateShouldOpen()
|
||||
{
|
||||
if (Service.ClientState.LocalPlayer == null)
|
||||
if (Service.Objects.LocalPlayer == null)
|
||||
return false;
|
||||
|
||||
if (!Service.Configuration.EnableSynthHelper)
|
||||
@@ -486,7 +486,7 @@ public sealed unsafe class SynthHelper : Window, IDisposable
|
||||
}
|
||||
|
||||
if (ImGui.Button("Open in Macro Editor", new(-1, 0)))
|
||||
Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.ClientState.LocalPlayer!.StatusList), null, [], null);
|
||||
Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.Objects.LocalPlayer!.StatusList), null, [], null);
|
||||
}
|
||||
|
||||
public bool ExecuteNextAction()
|
||||
@@ -559,7 +559,7 @@ public sealed unsafe class SynthHelper : Window, IDisposable
|
||||
|
||||
private SimulationState GetCurrentState()
|
||||
{
|
||||
var player = Service.ClientState.LocalPlayer!;
|
||||
var player = Service.Objects.LocalPlayer!;
|
||||
var values = new SynthesisValues(Addon);
|
||||
var statusManager = ((Character*)player.Address)->GetStatusManager();
|
||||
|
||||
@@ -649,7 +649,7 @@ public sealed unsafe class SynthHelper : Window, IDisposable
|
||||
|
||||
var solver = new Solver.Solver(config, state) { Token = token };
|
||||
solver.OnLog += Log.Debug;
|
||||
solver.OnWarn += t => Service.Plugin.DisplaySolverWarning(t);
|
||||
solver.OnWarn += t => Plugin.Plugin.DisplaySolverWarning(t);
|
||||
solver.OnNewAction += EnqueueAction;
|
||||
SolverObject = solver;
|
||||
solver.Start();
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"version": 1,
|
||||
"dependencies": {
|
||||
"net9.0-windows7.0": {
|
||||
"net10.0-windows7.0": {
|
||||
"DalamudPackager": {
|
||||
"type": "Direct",
|
||||
"requested": "[13.0.0, )",
|
||||
"resolved": "13.0.0",
|
||||
"contentHash": "Mb3cUDSK/vDPQ8gQIeuCw03EMYrej1B4J44a1AvIJ9C759p9XeqdU9Hg4WgOmlnlPe0G7ILTD32PKSUpkQNa8w=="
|
||||
"requested": "[15.0.0, )",
|
||||
"resolved": "15.0.0",
|
||||
"contentHash": "411vwC8/X8Z/sQ2TI6v3SvOn66xFPeOjFn3Zn+h0d3Ox2t1kFm66AhDvmx/qcMwVrR+Hidxj0dadpQ2dgyXMBQ=="
|
||||
},
|
||||
"DotNet.ReproducibleBuilds": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.2.25, )",
|
||||
"resolved": "1.2.25",
|
||||
"contentHash": "xCXiw7BCxHJ8pF6wPepRUddlh2dlQlbr81gXA72hdk4FLHkKXas7EH/n+fk5UCA/YfMqG1Z6XaPiUjDbUNBUzg=="
|
||||
"requested": "[1.2.39, )",
|
||||
"resolved": "1.2.39",
|
||||
"contentHash": "fcFN01tDTIQqDuTwr1jUQK/geofiwjG5DycJQOnC72i1SsLAk1ELe+apBOuZ11UMQG8YKFZG1FgvjZPbqHyatg=="
|
||||
},
|
||||
"MathNet.Numerics": {
|
||||
"type": "Direct",
|
||||
@@ -22,22 +22,22 @@
|
||||
},
|
||||
"Meziantou.Analyzer": {
|
||||
"type": "Direct",
|
||||
"requested": "[2.0.199, )",
|
||||
"resolved": "2.0.199",
|
||||
"contentHash": "y8oRrTLDBw1b10pWci/PnFoahdIMflNSlVheL9kzUylAASnoJPFyvuyaNXcrbOTNOEk1aMLFRr1mSX/xvYR15g=="
|
||||
"requested": "[2.0.264, )",
|
||||
"resolved": "2.0.264",
|
||||
"contentHash": "zRG13RDG446rZNdd/YjKRd4utpbjleRDUqNQSrX0etMnH8Rz9NBlXUpS5aR2ExoOokhNfkdOW8HpLzjLj5x0hQ=="
|
||||
},
|
||||
"DotNext": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.21.0",
|
||||
"contentHash": "fU63OJVSDSsOl6adjNM8e5zmyhdZkX2ztvmSeW6lBjFdvFG8ZwMOrJ+L8Ih/2yKr0cuaV8PNwnhDrlS4MFf14A==",
|
||||
"resolved": "5.26.1",
|
||||
"contentHash": "rcy6Yrpb64B7qYm/+D+4sfBUzwX/IOGeJBYReDL8/TAIp8aZrZPtXx8nwkYjWCuakYn2tBppwefIM6pd/cOnMw==",
|
||||
"dependencies": {
|
||||
"System.IO.Hashing": "8.0.0"
|
||||
}
|
||||
},
|
||||
"Raphael.Net": {
|
||||
"type": "Transitive",
|
||||
"resolved": "3.0.0",
|
||||
"contentHash": "9yY+jR2gddw52HtShBL/JikQ4gZa8lxFYSUIi2y510HLsaK86iqtuRgrv8/akrHR66QRWEPtmHXyehW1hrmP9Q=="
|
||||
"resolved": "4.1.0",
|
||||
"contentHash": "KRkRUn5gdFwKMpZXtFC9W58lNnhSXQpvNmLaCn7f9Tbx92UhRfttC7/QqyWhjkD2u6L9YNIpNp3nxF6awEOntw=="
|
||||
},
|
||||
"System.IO.Hashing": {
|
||||
"type": "Transitive",
|
||||
@@ -51,16 +51,16 @@
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"Craftimizer.Simulator": "[1.0.0, )",
|
||||
"DotNext": "[5.21.0, )",
|
||||
"Raphael.Net": "[3.0.0, )"
|
||||
"DotNext": "[5.26.1, )",
|
||||
"Raphael.Net": "[4.1.0, )"
|
||||
}
|
||||
}
|
||||
},
|
||||
"net9.0-windows7.0/win-x64": {
|
||||
"net10.0-windows7.0/win-x64": {
|
||||
"Raphael.Net": {
|
||||
"type": "Transitive",
|
||||
"resolved": "3.0.0",
|
||||
"contentHash": "9yY+jR2gddw52HtShBL/JikQ4gZa8lxFYSUIi2y510HLsaK86iqtuRgrv8/akrHR66QRWEPtmHXyehW1hrmP9Q=="
|
||||
"resolved": "4.1.0",
|
||||
"contentHash": "KRkRUn5gdFwKMpZXtFC9W58lNnhSXQpvNmLaCn7f9Tbx92UhRfttC7/QqyWhjkD2u6L9YNIpNp3nxF6awEOntw=="
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
# Notice
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
This Craftimizer fork is built on
|
||||
[Craftimizer](https://github.com/WorkingRobot/Craftimizer) by
|
||||
**[Asriel Camora](https://github.com/WorkingRobot)**, who built and
|
||||
maintained the plugin for years. The entire architecture, the crafting
|
||||
simulator, the macro solver, the recipe data layer, the synthesis helper,
|
||||
and every UI window come from Asriel's work. Without Craftimizer, this
|
||||
fork would not exist.
|
||||
|
||||
If this fork is useful to you, the credit for that belongs in large
|
||||
part to Asriel.
|
||||
|
||||
## A direct word to Asriel
|
||||
|
||||
Hi. I am Jon. I forked Craftimizer because the upstream `main` branch
|
||||
had not received an update past FFXIV 7.4, and I wanted a working
|
||||
crafting plugin for personal use that still loads on the current Dalamud
|
||||
API. This is not a "do it better" fork. The opposite is true. I would
|
||||
have happily kept using upstream if it had stayed current.
|
||||
|
||||
What this fork adds is purely a Dalamud SDK 14 → 15 migration cycle.
|
||||
Concretely, three changes in `FFXIVClientStructs` and Dalamud's `ImRaii`
|
||||
namespace were renamed or removed; this fork ports the affected call
|
||||
sites to the new symbol names and adds a local `IEndObject` interface to
|
||||
replace the nested one Dalamud removed. No new features, no design
|
||||
departures, no rebranding of internal namespaces. Where I had to modify
|
||||
your sources I kept the edits minimal, isolated to the lines the SDK 15
|
||||
compiler refused, and revertible.
|
||||
|
||||
If you pick Craftimizer back up and ship an upstream SDK 15 update, this
|
||||
fork folds back into a pure mirror and the recommendation will be to
|
||||
switch back to your build.
|
||||
|
||||
If anything in this fork ever steps on something you would not be okay
|
||||
with — attribution, naming, anything else — please reach out and I will
|
||||
fix it. Genuinely.
|
||||
|
||||
## Why this fork exists
|
||||
|
||||
The upstream `main` last commit is "Update for 7.4" from late 2025. The
|
||||
plugin is otherwise dormant: no SDK 15 branch, no public roadmap, no
|
||||
recent issue activity from the maintainer. FFXIV 7.5 brought the Dalamud
|
||||
API jump from level 14 to 15 in early 2026, and Craftimizer stopped
|
||||
loading from then on. My personal crafting workflow depends on it, so I
|
||||
took the maintenance burden on for a while.
|
||||
|
||||
This fork is maintained for personal and friend-circle use under Hellion
|
||||
Forge. It is not a competing project and does not target the broader
|
||||
Craftimizer user base.
|
||||
|
||||
## Why this fork is not upstreamed
|
||||
|
||||
I did not open a pull request because the upstream repository has been
|
||||
quiet for months and there is no signal that maintenance bandwidth is
|
||||
available on Asriel's side. A drive-by SDK-15-bump PR with no maintainer
|
||||
to land it would sit open indefinitely and create the wrong impression
|
||||
that the change has been reviewed. If upstream becomes active again and
|
||||
wants the migration, the change set is small enough (+23 / -19 lines,
|
||||
seven files) to merge by hand in minutes.
|
||||
|
||||
## Maintainer contact
|
||||
|
||||
If something in this fork causes problems, especially if it relates back
|
||||
to upstream Craftimizer or to attribution:
|
||||
|
||||
- **Gitea Issues:**
|
||||
[JonKazama-Hellion/Craftimizer/issues](https://gitea.hellion-forge.cloud/JonKazama-Hellion/Craftimizer/issues)
|
||||
- **Discord:** `@j.j_kazama`
|
||||
- **Email (business):** <kontakt@hellion-media.de>
|
||||
|
||||
I respond on weekdays during European business hours. For attribution
|
||||
or takedown questions, email is the fastest path.
|
||||
|
||||
## Trademarks and naming
|
||||
|
||||
"Craftimizer" is the name Asriel chose for the upstream plugin. This
|
||||
fork keeps the name as a reference to the origin and does not rebrand
|
||||
the user-facing identity. The Hellion brand is mine.
|
||||
|
||||
---
|
||||
|
||||
Maintained under **Hellion Forge**, the modding and plugin line of
|
||||
**Hellion Online Media** | Bad Harzburg |
|
||||
[hellion-media.de](https://hellion-media.de)
|
||||
@@ -1,3 +1,132 @@
|
||||
# Craftimizer
|
||||
# Craftimizer (Hellion Fork)
|
||||
|
||||
soon(tm)
|
||||
[](LICENSE)
|
||||
[](https://github.com/goatcorp/Dalamud)
|
||||
[](https://dotnet.microsoft.com/)
|
||||
[](https://www.finalfantasyxiv.com/)
|
||||
[](https://github.com/WorkingRobot/Craftimizer)
|
||||
|
||||
<p align="center">
|
||||
<img src="docs/images/hellion-forge.png" alt="Hellion Forge" width="180" />
|
||||
</p>
|
||||
|
||||
**Version 2.9.1.1 (Hellion fork)** — a maintenance fork of
|
||||
[Craftimizer](https://github.com/WorkingRobot/Craftimizer) by
|
||||
[Asriel Camora](https://github.com/WorkingRobot), brought back to life on
|
||||
Dalamud SDK 15 for FFXIV 7.5+.
|
||||
|
||||
Upstream Craftimizer received its last update for FFXIV 7.4 in late 2025 and
|
||||
has been dormant since. With the Dalamud API jump from level 14 to 15 in
|
||||
early 2026, the plugin stopped loading. This fork is a narrow API-compatibility
|
||||
cycle that gets it back on its feet for personal and friend-circle use. No
|
||||
features added, no design changes, no behavior departures from upstream. If
|
||||
Asriel ships an official SDK 15 update upstream, this fork folds back into a
|
||||
pure mirror and the recommendation will be to switch back.
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
Every line of crafting logic, every solver heuristic, the entire simulator, the
|
||||
recipe data layer, the synthesis hooks, and all UI windows are
|
||||
**[Asriel Camora](https://github.com/WorkingRobot)**'s work. This fork only
|
||||
unblocks the API path. Full acknowledgement in [NOTICE.md](NOTICE.md).
|
||||
|
||||
This fork is maintained under **Hellion Forge**, the modding and plugin line of
|
||||
[Hellion Online Media](https://hellion-media.de).
|
||||
|
||||
---
|
||||
|
||||
## What this fork changes
|
||||
|
||||
| Area | Upstream (last 2.9.1.1) | This fork |
|
||||
| ----------------------------------------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------- |
|
||||
| Dalamud SDK | 14.0.1 | **15.0.0** |
|
||||
| Dalamud API Level | 14 (manifest unset, packager-inferred) | **15** (packager-set) |
|
||||
| `FFXIVClientStructs.FFXIV.Component.GUI` type | `ValueType` | `AtkValueType` (upstream rename) |
|
||||
| `Dalamud.Interface.Utility.Raii.ImRaii` nested | `IEndObject`, `Color` (removed in SDK15) | local `IEndObject` interface in `ImRaii2.cs`; typed `ImRaii.*Disposable` returns |
|
||||
| `Settings.TabItem` ref-bool lifetime | `var open = true; TabItem(label, ref open, flags)` (rejected by SDK 15 escape analysis) | `TabItem(label, flags)` overload (no ref) |
|
||||
|
||||
Diff total: **+23 / −19 lines** across seven files. The change set is
|
||||
intentionally minimal so a future upstream merge stays trivial.
|
||||
|
||||
---
|
||||
|
||||
## Tech Stack
|
||||
|
||||
| Category | Technology |
|
||||
| ---------- | ----------------------------------------------------- |
|
||||
| Platform | Dalamud Plugin (API Level 15) |
|
||||
| Language | C# / .NET 10 (`net10.0-windows`) |
|
||||
| Build | Dalamud.NET.Sdk 15.0.0 |
|
||||
| UI | Dear ImGui via Dalamud bindings |
|
||||
| Solver | Raphael (Rust crate, bundled as `raphael_bindings.dll`) |
|
||||
| Toolchain | dotnet 10 SDK |
|
||||
|
||||
---
|
||||
|
||||
## Build
|
||||
|
||||
```bash
|
||||
git clone ssh://git@gitea.hellion-forge.cloud:2222/JonKazama-Hellion/Craftimizer.git
|
||||
cd Craftimizer
|
||||
dotnet build Craftimizer.sln -c Release
|
||||
```
|
||||
|
||||
The plugin DLL plus the manifest land in `Craftimizer/bin/x64/Release/`. Point
|
||||
Dalamud's **Dev Plugin Locations** at that folder (`/xlsettings` →
|
||||
**Experimental**) to load it as a dev plugin.
|
||||
|
||||
---
|
||||
|
||||
## Project Status
|
||||
|
||||
**Experimental Hellion fork — personal-use only.** No distribution channel,
|
||||
no custom repo, no release pipeline. This may change if the fork grows beyond
|
||||
a single-user maintenance build, but for now: clone, build, dev-load.
|
||||
|
||||
If upstream resumes active maintenance, this fork archives.
|
||||
|
||||
---
|
||||
|
||||
## Community & Support
|
||||
|
||||
- Bug reports and questions:
|
||||
[Gitea Issues](https://gitea.hellion-forge.cloud/JonKazama-Hellion/Craftimizer/issues)
|
||||
- Discord DM: `@j.j_kazama`
|
||||
- Email (business): <kontakt@hellion-media.de>
|
||||
|
||||
For anything that relates back to upstream Craftimizer or to attribution, see
|
||||
the contact path in [NOTICE.md](NOTICE.md).
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
MIT (same license as upstream Craftimizer). Full text in [LICENSE](LICENSE).
|
||||
Copyright details with dual-holder block in [COPYRIGHT](COPYRIGHT). Personal
|
||||
acknowledgement to the upstream author in [NOTICE.md](NOTICE.md).
|
||||
|
||||
© 2023 [Asriel Camora](https://github.com/WorkingRobot) for the original
|
||||
Craftimizer plugin. © 2026 Hellion Online Media for the Dalamud SDK 15
|
||||
fork-maintenance modifications.
|
||||
|
||||
### FFXIV Disclaimer
|
||||
|
||||
FINAL FANTASY XIV © SQUARE ENIX CO., LTD. All rights reserved. Craftimizer
|
||||
and this fork are unofficial, fan-made plugins and are not affiliated with,
|
||||
supported by, sponsored by, or approved by Square Enix.
|
||||
|
||||
---
|
||||
|
||||
## Project Documents
|
||||
|
||||
| Document | Contents |
|
||||
| -------------------------- | -------------------------------------------------------------- |
|
||||
| [`LICENSE`](LICENSE) | MIT licence full text (Asriel Camora original notice intact). |
|
||||
| [`COPYRIGHT`](COPYRIGHT) | Dual-holder copyright block, visual asset attribution. |
|
||||
| [`NOTICE.md`](NOTICE.md) | Acknowledgement to upstream author, scope of fork, contact. |
|
||||
|
||||
---
|
||||
|
||||
Maintained under **Hellion Forge**, the modding and plugin line of
|
||||
**Hellion Online Media** | Bad Harzburg |
|
||||
[hellion-media.de](https://hellion-media.de)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<Platforms>x64</Platforms>
|
||||
@@ -9,7 +9,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.199">
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.264">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
||||
@@ -10,12 +10,12 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DotNext" Version="5.21.0" />
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.199">
|
||||
<PackageReference Include="DotNext" Version="5.26.1" />
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.264">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Raphael.Net" Version="3.0.0" />
|
||||
<PackageReference Include="Raphael.Net" Version="4.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -209,6 +209,7 @@ public sealed class Solver : IDisposable
|
||||
{
|
||||
Adversarial = Config.Adversarial,
|
||||
BackloadProgress = Config.BackloadProgress,
|
||||
AllowNonMaxQualitySolutions = true,
|
||||
LogLevel = Raphael.LevelFilter.Debug,
|
||||
ThreadCount = (ushort)Config.MaxThreadCount,
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<IsPackable>false</IsPackable>
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 9.4 KiB |
Reference in New Issue
Block a user