From 19c7c784f829aa451e9373b12439c6fe0a5777d0 Mon Sep 17 00:00:00 2001 From: Jon Kazama Date: Tue, 26 May 2026 19:45:24 +0200 Subject: [PATCH] Add Hellion fork README, NOTICE, and COPYRIGHT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Initial Hellion Forge documentation for the Craftimizer fork. - Replace stub README with full project page (badges, fork scope table, tech stack, build instructions, project status, license block, FFXIV disclaimer, Hellion Forge footer) - Add NOTICE.md with acknowledgement to Asriel Camora as the upstream author, direct word on fork intent, scope of changes, contact path, and explicit non-upstreaming rationale - Add COPYRIGHT with dual-holder source code block (Asriel 2023 + Hellion Online Media 2026 for the SDK 15 maintenance), visual asset block (Hellion Forge logo by Florian Eck, all-rights-reserved), and bundled binary attribution (Raphael solver) - Drop in the Hellion Forge logo under docs/images/ LICENSE remains unchanged — Asriel Camora's original MIT notice is mandatory under MIT clause 3. --- COPYRIGHT | 53 ++++++++++++++ NOTICE.md | 87 ++++++++++++++++++++++ README.md | 133 +++++++++++++++++++++++++++++++++- docs/images/hellion-forge.png | Bin 0 -> 9647 bytes 4 files changed, 271 insertions(+), 2 deletions(-) create mode 100644 COPYRIGHT create mode 100644 NOTICE.md create mode 100644 docs/images/hellion-forge.png diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..a078ccd --- /dev/null +++ b/COPYRIGHT @@ -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. diff --git a/NOTICE.md b/NOTICE.md new file mode 100644 index 0000000..7f55bef --- /dev/null +++ b/NOTICE.md @@ -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):** + +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) diff --git a/README.md b/README.md index a777cf1..9fe055b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,132 @@ -# Craftimizer +# Craftimizer (Hellion Fork) -soon(tm) \ No newline at end of file +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) +[![Dalamud API](https://img.shields.io/badge/Dalamud-API_15-purple)](https://github.com/goatcorp/Dalamud) +[![.NET](https://img.shields.io/badge/.NET-10.0-512BD4)](https://dotnet.microsoft.com/) +[![FFXIV](https://img.shields.io/badge/FFXIV-7.5+-c3a37f)](https://www.finalfantasyxiv.com/) +[![Upstream](https://img.shields.io/badge/upstream-WorkingRobot%2FCraftimizer-blue)](https://github.com/WorkingRobot/Craftimizer) + +

+ Hellion Forge +

+ +**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): + +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) diff --git a/docs/images/hellion-forge.png b/docs/images/hellion-forge.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7290cec5c5b52d11a80ce288d50a3ccd6f980b GIT binary patch literal 9647 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