GTNH Credits 编辑器
基本信息
| 属性 | 值 |
|---|---|
| 形态 | 独立 Swing 桌面应用,不是 Minecraft 内的 GUI,也不打进 mod jar |
| Gradle 子模块 | creditsEditor(settings.gradle.kts 的 include("creditsEditor")) |
| 主类 | net.noiraude.creditseditor.CreditsEditorApp(application { mainClass.set(...) }) |
| 产物名 | credits-editor(applicationName),安装后命令为 gtnh-credits-editor |
| 语言 | Java 21(java { toolchain { languageVersion.set(JavaLanguageVersion.of(21)) } } + options.release.set(21)) |
| Look & Feel | FlatLaf 3.5.4 的 FlatLightLaf,在 main 首行 setup()(CreditsEditorApp.java:17) |
| 依赖 | project(":libCredits")(与 mod 共用同一套解析 / 序列化代码)、gson(runtimeOnly,因为 libCredits 里 gson 是 compileOnly)、flatlaf |
| 仓库占比 | 仓库 304 个文件中 216 个来自本子模块(158 个 Java + 28 个 PNG 图标 + 10 个 messages_*.properties 等),是仓库中体积最大的部分 —— mod 本体 src/ 只有 24 个文件,libCredits/ 22 个 |
功能
编辑 credits.json 数据与配套的 .lang 翻译文件。
读取 / 写入的路径
工具按资源根(目录或资源包 zip)打开,内部只认两条路径(CreditsLayout 枚举):
assets/gtnhcredits/credits.jsonassets/gtnhcredits/lang/*.lang
命令行传入的路径有四种处理分支(creditsEditor/README.md 「Usage」节):
| 传入路径 | 行为 |
|---|---|
| 已存在的目录 | 作为资源树打开 |
已存在的 .zip 文件 |
作为 Minecraft 资源包打开 |
不存在、无 .zip 后缀 |
自动创建目录并作为资源树打开 |
不存在、带 .zip 后缀 |
自动创建 zip并写入 pack.mcmeta(pack_format 固定为 1,即 MC 1.7.10 的资源包格式,PackMcmeta.PACK_FORMAT) |
命令行
gtnh-credits-editor [OPTIONS] [<path>]
| 参数 | 行为 |
|---|---|
<path> |
启动时直接打开的路径,可为目录或 .zip;省略则打开空界面,用 File > Open / File > New 载入 |
-h, --help |
打印用法后以退出码 0 结束 |
-v, --version |
打印版本后以退出码 0 结束 |
--resource=<path> |
与位置参数 <path> 等价 |
参数非法时把错误打到 stderr 并提示 --help,以退出码 1 结束(CreditsEditorApp.java:29-37)。命令名取自系统属性 app.name,缺省 gtnh-credits-editor(CreditsEditorApp.java:56-60)。
菜单
三个顶级菜单(ui/EditorMenuBar.java):
| 菜单 | 条目 |
|---|---|
| File | Open、New、—、Save、Save As、—、Quit |
| Edit | Undo、Redo、—、Manage Locales |
| Help | Shortcuts、—、About |
界面语言由 10 个 messages_<locale>.properties 决定(cs、de、en、es、fr、it、ja、pt、ru、zh),跟随 JVM 的 user.language / user.country。Manage Locales 列出的可选语言来自 Locale.getAvailableLocales(),按当前 UI 语言的 Collator 排序(service/KnownLocales.java:29-43)—— 即可编辑的 .lang 语言集合由运行编辑器的 JVM 决定,而非仓库里预置的列表。
编辑能力
所有编辑动作走统一的撤销 / 重做命令栈(command/CommandStack、command/CommandStackSnapshot),共 21 个命令实现(command/impl/):
| 分类 | 命令 |
|---|---|
| 分类 | AddCategoryCommand、RemoveCategoryCommand、EditCategoryDisplayNameCommand、EditCategoryDetailsCommand、MoveCategoriesOrderCommand |
| 人员 | AddPersonCommand、RemovePersonCommand、AddMembershipCommand、RemoveMembershipCommand、AddPersonRoleCommand、RemovePersonRoleCommand、MoveRolesOrderCommand |
| 角色 | EditRoleDisplayNameCommand |
| 语言 | AddLocaleCommand、RemoveLocaleCommand、AbstractLocaleCommand 派生的 AbstractEditLangFieldCommand |
| 导入 | TsvImporter / TsvImportCommandFactory(TSV 批量导入,配套 ui/dialog/ImportTsvDialog) |
| 其他 | DocumentEditCommand、EditFieldCommand、CompoundCommand、AbstractCommand(基类) |
EditAbortedException 用于让用户取消编辑时干净地退出命令而不污染撤销栈。
安装与运行
| 方式 | 命令 | 产物 |
|---|---|---|
| 仓库内直接运行 | ./gradlew :creditsEditor:run |
自动以 src/main/resources 为参数 |
| 仓库内指定路径 | ./gradlew :creditsEditor:run --args="<path>" |
— |
安装到 ~/.local |
./gradlew :creditsEditor:install |
~/.local/bin/gtnh-credits-editor(+ .bat)、~/.local/lib/gtnh-credits-editor.jar(含依赖的 fat jar) |
| 自定义前缀 | ./gradlew :creditsEditor:install -PPREFIX=/usr/local,或 PREFIX=/usr/local ./gradlew :creditsEditor:install |
同上,落在 $PREFIX 下 |
| 卸载 | ./gradlew :creditsEditor:uninstall |
沿用同一 PREFIX 解析规则 |
| 跨平台发布包 | ./gradlew :creditsEditor:releaseZip |
gtnh-credits-editor-<version>.zip(启动脚本 + fat jar + Windows 安装器) |
| Windows 安装器 | ./gradlew :creditsEditor:windowsInstaller |
creditsEditor/build/distributions/gtnh-credits-editor-<version>-setup.exe(NSIS) |
PREFIX 的解析优先级为:Gradle 属性 -PPREFIX > 环境变量 PREFIX > ~/.local(build.gradle.kts 的 installPrefix)。
Linux 上 install 额外写入 freedesktop .desktop 入口与 hicolor 图标(32 / 48 / 64 / 128 px),使编辑器出现在 GNOME / KDE 应用启动器中;macOS 与 Windows 不写。
主机环境要求
windowsInstaller任务需要 NSIS 的makensis。Linux x86_64 主机上任务会自行下载 Debian 的nsis 3.08-3deb 到build/tools/nsis/并解出makensis;macOS / Windows 主机若makensis不在PATH上则直接抛GradleException并提示用包管理器安装。generateActionIcons任务需要rsvg-convert与optipng同时在PATH上,否则抛GradleException。该任务把src/main/icons/tango/下的 SVG 栅格化成 16 / 24 / 32 / 48 px 的 PNG;生成结果已提交,因此没有这两个工具也能构建。- 测试套件强制
java.awt.headless=true;需要真实图形环境的 Swing 测试用assumeFalse(isHeadless())自行跳过(build.gradle.kts的tasks.named<Test>("test"))。
相关条目
- credits.json 数据文件 - 本工具编辑的主数据文件
- lang 语言文件 - 本工具编辑的翻译文件