TaskNH

[!INFO] Git Commit: fba1a26 | Updated: 2026-10-01

TaskNH 是 GTNH 1.7.10 的队伍协作任务追踪器(modid tasknh,@Mod 类 com.eldrinn.tasknh.TaskNHMod,包根 com.eldrinn.tasknh,作者 Eldrinn_Elantey,mcmod.info 自述 “Collaborative in-game task tracker for GTNH teams.”,共 55 个 Java 文件)。它让多人队伍共享一份任务清单:分工、指派、勾选清单、评论,并把任务位置投影到地图上。

⚠️ 模组原名是 “Foreman”:存档名、配置文件名与一批 NBT 键都保留了旧名,代码里有三条一次性迁移路径,见 任务存档 与 任务数据模型。

硬依赖:gtnhlib@[0.11.51,)(队伍系统 + 网络层)、modularui2@[2.3.91,)(整个 GUI)。可选:Navigator、BetterQuesting、NotEnoughItems、ServerUtilities、BlockRenderer6343。

核心:任务数据模型

任务由 6 个类构成(com.eldrinn.tasknh.data),同时是 NBT 存档单元和网络封包单元——字段一一对应。任务的 15 个字段、NBT 键名、两代旧格式兼容路径,以及网络侧的长度/数量上限,全部在:

  • 任务数据模型 — Task / TaskStatus / AssignedPlayer / ChecklistItem / Comment / TaskLocation 六个类的字段表、NBT 键、以及 UUID 前缀匹配等细节

存储与同步

  • 任务存档 — WorldSavedData,存在主世界 mapStorage 的 TaskNHTasks;按队伍分区;ForemanTasks 与旧扁平格式两层迁移
  • 队伍与同步流程 — 登录/登出/队伍合并三个事件、客户端乐观更新与 pendingEdit、getPinnedTasks 的排序与过滤
  • 网络协议 — GTNHLib NetworkChannel("tasknh") 上 9 个封包,ID 按注册顺序分配

完成与奖励

  • 物品完成追踪 — 唯一的自动完成机制;InventoryListener 标记 + 下一 tick 检查;主物品栏精确匹配或矿辞典名匹配;完成是单向的
  • 服务端配置 — Forge .cfg,全部 3 个选项
  • 命令 — /tasknh 的 10 个子命令、UUID 前缀匹配、防路径穿越
  • 权限 — 10 个节点,可选桥接 ServerUtilities 等级;仅 3 个默认要 OP
  • 导出与导入 — 唯一的数据外流格式:<世界>/tasknh/<name>.json,物品以 NBT 文本承载

界面

  • 主界面 GUI — ModularUI 界面,11 个 widget,380 像素宽、没有容器也没有 GUI ID
  • HUD 叠加层 — 绘制被图钉的任务;九宫格锚点;HudSettingsScreen 是唯一继承原版 GuiScreen 的类
  • 客户端图钉配置 — tasknh_pins.json,按世界分区保存图钉与折叠
  • 主题与资源 — 两套 ModularUI 主题、25 个代码内颜色常量、5 个资源文件
  • 打开界面热键 — 唯一一个按键绑定,默认 Y

地图与兼容

  • Navigator 地图图层 — 需 location != null 且 showOnMap;任务 UUID 折叠成稳定的 64 位标识
  • 兼容门控 — 7 个模组的门控方式;BetterQuesting 导入是 trackOre 的唯一来源

本 mod 没有 X

以下维度逐条经 grep 验证为空,分类页因此不创建对应目录:

  • 本 mod 没有方块 —— grep -rnE "ModBlock|BlockItem|ItemBlock|registerBlocks" --include=*.java src/ 零命中;无 GameRegistry.registerBlock
  • 本 mod 没有物品 —— 同上 grep 中 registerItems 零命中,无 new Item( 注册。⚠️ gui/widget/TaskBlockItem.java 里的 TaskBlockItem 名字里有 “Item”,但它继承 SortableListWidget.Item<Task>,是一个可拖拽的列表项控件,不是注册的物品——名字容易误导
  • 本 mod 没有实体 —— grep -rnE "EntityType|extends Entity|spawnEgg|EntitySpawnEvent" --include=*.java src/ 输出 NO ENTITIES
  • 本 mod 没有多方块结构 —— integration/MultiblockTaskIntegration.java 的名字里有 “Multiblock”,但它消费的是 BlockRenderer6343 展示的其他模组的多方块预览,往 NEI 预览上加一个「+」按钮把部件转成清单项。仓库内没有自己的多方块结构定义,见 兼容门控
  • 本 mod 没有 TileEntity
  • 本 mod 没有附魔 —— grep -rnE "Enchantment" --include=*.java src/ 零命中
  • 本 mod 没有药水效果 —— 同 grep 中 PotionEffect 零命中
  • 本 mod 没有成就 —— 同 grep 中 Achievement 零命中;src/main/resources 下无 advancements/
  • 本 mod 没有维度 —— grep -rnE "DimensionType|ChunkGenerator" --include=*.java src/ 零命中。TaskLocation.dimension 只是引用已存在的维度 id
  • 本 mod 没有群系 —— grep -rnE "Biome" --include=*.java src/ 零命中
  • 本 mod 没有结构(structure) —— grep -rnE "StructureFeature|StructurePiece|registerWorldGen" --include=*.java src/ 零命中
  • 本 mod 不做世界生成 —— 没有任何 WorldGenerator 实现
  • 本 mod 没有合成配方 —— src/main/resources 下无 recipes/
  • 本 mod 没有 mixin 也不是 core mod —— gradle.properties 中 usesMixins = false、coreModClass 为空
  • 本 mod 不注册容器,没有 GUI ID —— grep -rnE "IGuiHandler|registerGuiHandler|new Container|getServerGuiElement" --include=*.java src/ 零命中。唯一继承 GuiScreen 的是 HudSettingsScreen,它不绑定容器

因此本分类只有 2 个子目录:setting(15 篇)与 keybinding(1 篇)。

随附的数据文件

模组不附带任何预置任务包。src/main/resources 下只有资源文件(见 主题与资源),没有任务数据。任务的唯一来源是玩家在游戏内创建、/tasknh import 导入、或由 BetterQuesting / BlockRenderer6343 集成转换而来。

两处会落盘的运行时数据:

路径 内容
<世界>/level.dat 的 MapStorage → TaskNHTasks 全部任务,按队伍分区(见 任务存档)
<世界>/tasknh/<name>.json /tasknh export 的输出(见 导出与导入)
<mcDataDir>/config/tasknh.cfg 服务端 3 个配置项(见 服务端配置)
<mcDataDir>/config/tasknh_pins.json 客户端图钉与 HUD 位置(见 客户端图钉配置)

已知源码缺陷

  • /tasknh import 的坐标参数顺序反了 —— TaskLocation 构造器签名是 (dimension, x, y, z, label),而 import 分支按 (x, y, z, dimension, label) 传参,导致导入的任务维度与坐标错位。存档 NBT 侧无此问题。详见 导出与导入
  • SyncAllTasksPacket.decode 的任务数没有上限检查 —— 同文件里 SyncTeamMembersPacket(500)、ReorderTasksPacket(2000)、Task 内部各项(100/200/50)都有限制,唯独全量同步封包没有。详见 网络协议