Skip to content

Port all 1.21 new features to 26.1 把1.21的所有新特性移植到26.1 - #4845

Draft
WhereisFff wants to merge 36 commits into
Anvil-Dev:dev/26.1/1.6from
WhereisFff:dev/26.1/port
Draft

WhereisFff wants to merge 36 commits into
Anvil-Dev:dev/26.1/1.6from
WhereisFff:dev/26.1/port

Conversation

@WhereisFff

Copy link
Copy Markdown
Contributor

No description provided.

- 增加大红按钮、红石骰子、物品分配器与溢流溜槽
- 恢复智能放置器、模型选择、放置预览和物品图标渲染
- 接入仓储端口缓存交互与流体端口储罐及管网调节
- 适配物品流体事务、存档数据、配方和资源注册
- 添加分阶段游戏验证、实景对照入口和完整移植清单
- 在物品窗口内显示液面或气体余量并保持动态贴图刷新
- 显示流体图标、名称、存量和容量并补齐中英文文本
- 增加多液位实景校验及本地源分支增量核对入口
- 按最新源分支统一红石元件的普通与潜行放置朝向
- 让燃烧炼药锅使用原始轮廓
- 增加超级电容拆解为八个电容和火药的粉碎配方
- 记录已接回的源提交并补充放置与客户端规则验证
- 加入源分支新增的建筑杖模型与装备图标
- 更新离子背包图标并接通耗尽状态的新纹理
- 增加素材一致性与背包状态模型核对
- 按模拟结果与时长上限消费燃烧锅和鱼缸燃料
- 接入空炼药锅标记及喷流生命周期扩展
- 保留喷流上升状态和带注册表上下文的扩展存档
- 同步最新配置下限并补充燃料与结构回归验证
- 按流体身份跨维度汇总端口存量并保留抽空占位
- 区分自动倒桶与失败归还的目标选择规则
- 使用原生事务支持多端口模拟抽取和整体回滚
- 补齐零数量流体条目编码与仓储查询回归验证
- 聚合相连端口的物品缓存与流体能力并保留标记优先规则
- 接入双击存入和流体容器回写及核心归属生命周期
- 同步两种外观模型贴图与合成配方和玩家提示
- 补充事务回归测试及实际核心连接的视觉对照场景
- 保留模组资源与特效的完整移植要求
- 记录地形采样对照结果并移除场景中的过滤设置覆盖
- 增加内置流体分类及新玩家默认分类入口
- 支持命名空间和组合分类的流体判定
- 兼容旧 JSON 字符串与新版组件形式的分类名称
- 补齐分类数据同步与保存回归验证
- 同步流体条目并接入混合排序、分类、搜索和折叠显示
- 支持装桶、倒入容器及左右键区分并按流体身份处理点击
- 使用原生事务共同回滚空容器消费与跨端口抽液
- 还原失败浮窗和数量字体并修复折叠流体搜索漏过滤
- 保留最近四次批量存入记录并接入 Ctrl+Z
- 将 Shift 拖动的多批存入合并为一次撤销操作
- 通过原生事务按实际库存和背包容量返还物品
- 区分真实物品入库与流体倾倒以避免额外取出满桶
- 支持 Alt 点击批量存入组件相同的物品
- 保留首次点击物品身份以完成 Shift 双击批量移动
- 区分流体容器左右键行为并接入整批撤销
- 补充匹配范围与真实客户端操作回归
- 支持 Shift 拖动时选择和取消仓储取出槽位
- 映射折叠与保序视图的逻辑槽位并在服务端去重
- 将仓储抽取与背包插入纳入同一事务
- 补充容量边界和真实客户端跨区操作验证
- 分离图标堆叠与真实数量并使用 long 同步合并计数
- 保持折叠和保序视图中的大数量精度
- 增加精确数量提示和 T/P/E 单位缩写
- 修正超维存储容量占比并补充大数量回归场景
- 保存切石输入、九格合成数据及面板选项
- 为四类仓储和物品组件接入兼容旧数据的编解码
- 使用事务消费工作台和切石机完成一次性解锁
- 增加状态 RPC、标签与服务端及客户端回归验证
- 接入合成格及切石输入与指针的左右键交换
- 使用原生切石配方集合校验输入并返回候选结果
- 清空时保留容量不足的余量及未处理槽位
- 补充回归验证并记录最新源分支渲染增量
- 接入完整结构请求、有限缓存、缺失响应和登出清理
- 预览保留大结构及方块实体数据,统一读取与网络 NBT 配额
- 普通磁盘记录实际方块标识,补充数据与客户端网络回归验证
- 恢复过滤器逐秒轮播、黑名单标记与磁盘方块图标
- 使用独立离屏渲染保留平面贴图、附魔光效和有界缓存
- 增加客户端颜色检查及双版本缩放旋转对照场景
- 统一四向旋转、方块实体条件及结构消耗转换
- 兼容旧格式并迁移 24 份配方,恢复 JEI 标签候选与变体预览
- 适配模板和标签构造时序,修复谓词渲染缓存参与身份比较
- 增加 7 项回归测试及实际客户端配方同步验证
- 按完整结构、朝向与 NBT 条件识别合成和转换结果
- 接入蓝图扫描材质、翻转元数据及配方更新缓存失效
- 补充结构校验测试和双版本画面、重载、手持验证
- 完成源分支新增的过滤器与磁盘内容渲染增量
@@ -316,7 +324,7 @@ public void extractContents(GuiGraphicsExtractor graphics, int mouseX, int mouse
private void renderPreviewAreaContents(GuiGraphicsExtractor graphics, int guiLeft, int guiTop) {
// 增幅天体缺少增幅器时不显示预览内容。
CelestialBodyData body = getMenu().getBlockEntity().getCelestialBodyData();
boolean missingAmplifier = body instanceof StarData && !getMenu().getBlockEntity().isAmplifierPresent();
boolean missingAmplifier = this.missingAmplifierBlocked || body instanceof StarData && !getMenu().getBlockEntity().isAmplifierPresent();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Checkstyle] <com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck> reported by reviewdog 🐶
Line is longer than 140 characters (found 144).

@@ -127,7 +128,7 @@ public void setRecipe(IRecipeLayoutBuilder builder, RecipeHolder<MultiblockRecip
this.cache.computeIfAbsent(recipe, it -> LevelLikeDisplaySupport.asLevelLike(it.value().getPattern()));
builder.addSlot(RecipeIngredientRole.OUTPUT, 130, 70).add(recipe.value().getResult().create());

List<ItemStack> ingredientList = recipe.value().getPattern().toIngredientList();
List<ItemStack> ingredientList = MultiblockUtil.ingredientList(recipe.value().getPattern(), Minecraft.getInstance().level.registryAccess());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Checkstyle] <com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck> reported by reviewdog 🐶
Line is longer than 140 characters (found 148).

@@ -211,7 +220,7 @@ public void draw(
pose.scale(0.8F, 0.8F);
int textX = Math.round(MultiBlockCraftingCategory.WIDTH / 0.8F - minecraft.font.width(component) - 5);
graphics.text(minecraft.font, component, textX, 0, 0xFF000000, false);
int size = recipe.value().pattern.getSize();
int size = dev.anvilcraft.lib.v2.multiblock.dynamic.definition.DefinitionSerialization.fromDefinition(recipe.value().getPattern()).grid().length;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Checkstyle] <com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck> reported by reviewdog 🐶
Line is longer than 140 characters (found 153).

@@ -175,21 +176,31 @@ public void setRecipe(
it -> LevelLikeDisplaySupport.asLevelLike(it.value().getOutputPattern())
);

List<ItemStack> inputItems = recipe.value().getInputPattern().toIngredientList();
List<ItemStack> inputItems = MultiblockUtil.ingredientList(recipe.value().getInputPattern(), Minecraft.getInstance().level.registryAccess());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Checkstyle] <com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck> reported by reviewdog 🐶
Line is longer than 140 characters (found 149).


List<ItemStack> outputItems = recipe.value().getOutputPattern().toIngredientList();
List<ItemStack> outputItems = MultiblockUtil.ingredientList(recipe.value().getOutputPattern(), Minecraft.getInstance().level.registryAccess());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Checkstyle] <com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck> reported by reviewdog 🐶
Line is longer than 140 characters (found 151).

@Comment("Maximum items the storage port moves per scan")
@BoundedDiscrete(min = 1, max = 1024)
public int maxItemsPerScan = 64;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Checkstyle] <com.puppycrawl.tools.checkstyle.checks.whitespace.EmptyLineSeparatorCheck> reported by reviewdog 🐶
'}' has more than 1 empty lines after.

public BlockState getBlockState(BlockPos pos) {
if (!this.allLayersVisible && pos.getY() != this.currentVisibleLayer) return Blocks.AIR.defaultBlockState();
if (!this.allLayersVisible && !this.alwaysRendered.contains(pos) && pos.getY() != this.currentVisibleLayer) return Blocks.AIR.defaultBlockState();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Checkstyle] <com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck> reported by reviewdog 🐶
Line is longer than 140 characters (found 154).

@@ -359,7 +359,9 @@ private static void addEndpointIfContainer(
if (seenHandlers.putIfAbsent(handler, Boolean.TRUE) != null) {
return;
}
int effectiveHeight = containerPos.getY() + phi;
int heightBias = level.getBlockEntity(containerPos) instanceof

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Checkstyle] <com.puppycrawl.tools.checkstyle.checks.whitespace.OperatorWrapCheck> reported by reviewdog 🐶
'instanceof' should be on a new line.

- 接通合成及切石取出、Shift 存放与自动补料
- 修正偏移配方余料位置,保留催化剂和容器并保证补料事务守恒
- 限定主背包投放范围并验证满容量拒绝和真实客户端 RPC
- 登记源分支新增的 21 个待移植提交
- 按产物堆叠上限计算预算并跨 RPC 分块锁定配方
- 接通 Q 和 Ctrl+Q,复用余料归还及自动补料逻辑
- 处理容量回滚、催化剂停止和会话变更清理
- 补充切石预算、数量守恒与客户端续作验证
- 恢复合成模式解锁、九宫格和切石选择及持久化选项
- 接入取出、批量、清空和输入槽移出丢弃接口
- 添加紧凑分类布局并同步源版面板素材与双语文本
- 补充真实界面点击和关闭恢复验证
- 接入跨区左键均分、右键逐格投放和创造中键填满
- 统一拖拽预览与释放提交,校验指针权限及槽位上限
- 修复切石滚动条拖动并补充真实界面操作验证
- 按目标槽、其余输入和主背包顺序收集同组件物品
- 使用服务端指针防止过期快照放大数量
- 排队处理快速双击并在交互完成后关闭归还指针
- 补充收集范围与真实界面数量守恒验证
- 同步普通、合成及分类设置页的背景、控件和命中坐标
- 持久保存玩家布局并兼容旧设置,同步翻转按钮与双语提示
- 增加设置权限与编解码测试及真实客户端交互验证
- 支持合成格份数分配与切石配方选取,保留输入布局和物品组件
- 按整组事务扣取背包、仓储及流体材料,失败时回滚空容器与流体
- 归还旧输入并增加数量守恒、边界及真实客户端 RPC 验证
- 为 JEI 与客户端扩展提供真实背包槽位、翻转坐标和指针状态
- 保留现有交互同步并接通容器前景事件,维持 JEI 叠加层显示
- 增加槽位映射测试及数字键、丢弃和关闭归还的客户端验证
- 按标签余量、物品组件和共享流体容器预算生成转移计划
- 接通配方入口、缺料按钮、切石选择及转移后合成面板刷新
- 补充材料分配测试与有无 JEI 的真实客户端验证
- 登记大型板条箱与潜影集装箱主方块并按距离查询最近目标
- 接入加载、移除、世界卸载和停服清理,查询不强制加载区块
- 增加范围边界、存档恢复、无绑定目标和生命周期验证
- 统一药盒与护符盒取放规则并支持创造背包本地交互
- 同步玩家收纳按键配置并完善药盒组件快照与冷却
- 适配本地预测音效,验证生存与创造取放及物品守恒
- 同步药盒与护符盒选中索引,保证高亮与服务端取物一致
- 校验菜单与槽位并处理移开重置、关闭重开及等值物品栈替换
- 增加索引边界测试和真实客户端滚轮取物验证
- 添加终端绑定、目标解析和按玩家隔离的远程会话
- 接通物品与流体访问,独立保存终端合成格并刷新动态目标
- 同步终端资源及基础配方,升级和解绑保留合成格内容
- 增加远程访问、数量守恒与真实客户端验证
- 按终端模式自动收存主背包超量物品并补充耗尽的手持物品
- 使用事务保证跨存储转移守恒,防止手动移物和切换快捷栏误补货
- 接通四模式环形轮盘及模式同步,补充服务端与真实客户端验证
- 支持游戏内、背包及创造物品栏的键盘和鼠标开仓
- 保留搜索输入并限制指针持物和非背包界面触发
- 合并重复开仓请求并防止迟到响应覆盖新界面
- 补充双语键位名称和真实客户端输入验证
@Gugle2308

Copy link
Copy Markdown
Collaborator

⚠️ Dangerous command requires approval:

cd /tmp; curl -sL "https://api.github.com/repos/Anvil-Dev/AnvilCraft/pulls/4845" -o pr4845.json; wc -c pr4845.json; python3 -c "
import json
d=json.load(open('pr4845.json'))
print('TITLE:', d['title']...

Reason: script execution via -e/-c flag

Reply /approve to execute, /approve session to approve this pattern for the session, /approve always to approve permanently, or /deny to cancel.

import dev.dubhe.anvilcraft.block.multipart.IMultiPartBlockModelHolder.ModelRenderTarget;
import dev.dubhe.anvilcraft.block.multipart.IMultiPartBlockModelHolder;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Checkstyle] <com.puppycrawl.tools.checkstyle.checks.imports.CustomImportOrderCheck> reported by reviewdog 🐶
Wrong lexicographical order for 'dev.dubhe.anvilcraft.block.multipart.IMultiPartBlockModelHolder' import. Should be before 'dev.dubhe.anvilcraft.block.multipart.IMultiPartBlockModelHolder.ModelRenderTarget'.

@Gugle2308

Copy link
Copy Markdown
Collaborator

我已完成对 PR #4845 的分析(794 文件 / +47,461 −9,047,无 gh 认证可用,未改动标题)。以下为审查意见:


代码审查摘要 — PR #4845

操作: synchronize(draft: true
范围: 794 个文件(338 Java / +47,461 −9,047;604 新增 / 0 删除 / 36 commits)
分支: WhereisFff:dev/26.1/port (f0156f4) → Anvil-Dev:dev/26.1/1.6 (e4bf6c7)
描述: PR body 为空

分布:src/main 363(其中 Java 新增 134)、src/generated 333、dev/porting 90、docs/porting 3、构建脚本 4。

✅ API 迁移健康度(26.1 迁移 PR)

指标 计数 状态
Identifier / ResourceLocation 48 / 0 ✅ 旧 API 无残留
jspecify / jetbrains / javax Nullable 73 / 0 / 0 ✅ 符合 AGENTS.md 空值注解规定
@OnlyIn 2(新增) ⚠️ 见警告 5
TODO/FIXME、硬编码凭据、System.out/printStackTrace 0
EOF 缺换行 333(329 json + 3 mcmeta + 1 java) 💡 见建议 3

🔴 关键

未发现阻断级缺陷(编译/启动/GameTest 证据齐全,作者亦在 docs/porting/26.1.md 记录了逐批验收与未完成项)。

⚠️ 警告

  1. 标题声称与内容不符docs/porting/source-updates.json 自记为 7 项 ported / 21 项 pending(含 Add Building Rod 添加建筑杖与蓝图建造功能,完善红石行为、附魔兼容及进度条件 #4854 建筑杖蓝图、Add space equipment and inventory pocket system, and improve the building wand and structure scanner, and fixed bugs 添加航天装备与口袋系统并完善建筑杖和结构扫描仪,以及修复bug #4878 航天装备与口袋系统、Modify the power mechanism and jump height of the buffer shoe. 修改缓冲靴的蓄力机制和跳跃高度 #4897 缓冲靴、Fix building wand material handling, equipment abilities and terminal item extraction logic 修复建筑杖材料处理、装备能力与终端取物逻辑 #4901 等),docs/porting/26.1.md 第 5~7 批标注"待逐项审计",dynamic-renderers.tsv 有 6 项 missing-feature(AutoEnchantingTable / CrushingTable / GlassPipe / HypercubeBE / RuinsBlockEntity / StampingPlatform 渲染器)。"Port all 1.21 new features"目前不成立,建议标题标注 WIP(本次 gh token 失效,未自动修改,建议标题见文末)。

  2. zh_cn 漏译 23 个新键,破坏仓库既有翻译约定 — 目标分支 en_uszh_cn 键集差异为 0(zh_cn 另有 177 个独有键),本 PR 新增 97 键但 zh_cn 只补了 74 个,缺口如下(全部会以英文/键名形式出现在中文界面):

    • block.anvilcraft.storage_port_consolidatortooltip.anvilcraft.item.storage_port_consolidator(+.shift)
    • 12 个配置项:anvilcraft.configuration.invert_override_action(+.tooltip)、plasma_jets_cauldron_consume_amount/extra_durationplasma_jets_fish_tank_consume_amount/extra_durationplasma_jets_max_duration(各含 .tooltip
    • config.jade.plugin_anvilcraft.overflow_disposal_fluid_tank
    • 7 个 item.anvilcraft.{big_red_button,item_splitter,overflow_chute,redstone_dice,storage_port,storage_fluid_port,storage_port_consolidator}
  3. AGENTS.md 写入半句话 — 新增行 - Do not write manual(无宾语、不构成可执行指令),属明显未完成编辑,应删除或补全。

  4. dev/porting/ 与构建脚本混入功能 PR,且测试不会被执行 — 90 个文件(74 Java 测试/场景 + 13 verify_*.py + checkstyle.gradle/no-jei.gradle + 3 个 .nbt 夹具)+ build.gradle 188 行 portValidation 分支 + 1201 行 docs/porting/26.1.md。这些 GameTest 仅在 -PportValidation 时加入 sourceSet,而 .github/workflows/* 无任何改动(仓库也没有 src/test),CI 永远不会运行它们,因此这 70+ 测试文件当前只是本地工具,无法提供回归保护。建议:拆成独立 PR,或迁到正式 gametest source set + CI job;若保留在 dev/porting,请在 AGENTS.md/README 说明其非常规构建路径。

  5. 重新启用 @OnlyIn(Dist.CLIENT)(基底分支中是注释掉状态)PlasmaJetsBlockEntity.clientTick / summonParticles 现在带该注解,调用链经公共类中的 private static final BiConsumer<..., Level> CLIENT_TICK = (entity, level) -> entity.clientTick((ClientLevel) level)。当前靠 level.isClientSide() 守卫规避服务端调用,但基底分支此前特意注释掉该注解,请确认 26.1 的 dist 剥离不会让服务端出现不可达被剥离方法的问题(并说明当初注释的原因)。

  6. BlockStatePredicateMixin 改写依赖库的等值语义@Mixin(value = BlockStatePredicate.class, remap = false)equals/hashCode 内的 getStatesCache() 重定向为 List.of()。若该库的 equals 同时以缓存列表参与身份判定,会使"匹配条件相同但缓存不同"的谓词互相等价。这类修补更适合上游修(或至少补 issue 链接/注释说明为何安全),否则后续 AnvilLib 升级会静默失效。

  7. SmartBlockPlacerBlockEntity 整文件替换(4313 → 1263 行) — 已核对:新文件与 dev/1.21/1.6 版本逐行等价(仅 395 行 API 迁移差异:ValueInput/ValueOutputResourceHandler、jspecify 等)。但 26.1 侧原有实现中的 IS_BEING_MOVED_BY_PLACERINHERITED_PROPERTIESWorkMode(Move/Blueprint)、layerPositions 等概念在 1.21 分支均不存在,属被整体移除。请确认这些行为已由新的 ITargetPointer / MovingPart / BlockPlacementUtil 路径完全覆盖,并在 PR 描述中写明,否则评审无法判断是否是功能回退。

  8. TerminalSessions.storage() 缺少空值校验SESSIONS.get(player.getUUID()).get(token) 未判空(同文件的 contains() / terminal() 都做了判空),会话过期或未 open 时直接 NPE。建议与其他方法保持一致的防御式写法。

  9. 作者自述的遗留缺陷(建议在 PR 中显式列为待办)resourcepacks/first_ancient_debris 配方仍是 1.21 原料 JSON,实际数据加载解析失败;GameTest 启动日志中 Jade 26.1.1 查询 minecraft:loot_table 注册表报错。二者都以"已知问题"形式只写在 1201 行文档里,容易漏掉。

💡 建议

  1. PlasmaJetsBlockEntityMAX_DURATIONCONTINUOUS_FUEL_AMOUNTCONTINUOUS_FUEL_DURATION 三个 public 常量已无任何引用(旧用法已删除);且 CONTINUOUS_FUEL_DURATION = MAX_DURATION / BUCKET_VOLUME * 2(=24)与配置 plasmaJetsFishTankExtraDuration = 24 重复表达同一语义,建议删常量或让配置引用它。
  2. anvilcraft.mixins.jsonclient 段新条目插在字母序列表头部,建议按序插入(AbstractContainerScreenMixin 之前)。
  3. src/main/java/.../item/block/ChuteBlockItem.java 缺文件末尾换行(另有 332 个 json/mcmeta 同样缺)——git diff --check 检不出,建议用编辑器/脚本统一补齐。
  4. dependencies.gradle 中 AnvilLib 聚合 519cube/multiblock 529 版本错位(文档说明是为规避 Hi-Z compute shader image binding 越界回归),建议在该行加注释指回 docs/porting/26.1.md,否则后人极易误"统一版本"。
  5. 交互范围判定不统一:StoragePortTakeOutPacketdistanceToSqr(...) > 64.0BigRedButtonHoldPacketisWithinBlockInteractionRange(pos, 1.0),建议统一。
  6. dev/porting 下 13 个 verify_*_resources.py 结构高度相似,建议合并为带 --feature 参数的单一脚本。

🟢 看起来不错

  • RPC 安全性扎实:29 个 @RemoteCallable 全部挂 validator;StorageServerStub.StorageAccessValidator 校验 args[0] 必须等于调用者 UUID,并新增 isOutsideBuildHeight / hasChunkAt 与"终端会话伪坐标"分支(避免假坐标回退到世界访问);注释明确"取出完全在服务端执行",客户端不直接改物品,防幻影物品刷取。
  • 静态状态清理成对TerminalSourceManager.clear(level) 挂在 LevelEvent.UnloadServerStoppedEventStoragePortManager / TerminalSourceManager / StorageServerStub / TerminalSessionsPlayerLoggedOutEvent → StorageServerStub.remove(uuid) 清理会话与 CRAFTING_BATCHESTerminalSourceManagergetChunkNow + 死条目剪枝,规避未加载区块访问。
  • 注册完整性无损:8 个新方块(大红按钮/红石骰子/物品分配器/溢流溜槽/燃烧炼药锅/仓储端口/仓储流体端口/整合器)均有 blockEntity 注册、loot table、blockstate、模型、纹理;4 个新通用 mixin 与 8 个 client mixin 在 mixins.json 中全部存在且分区正确;interface_injections.jsonEmptyCauldronMixin 的双注册与既有 BlockMixin/IBlockExtension 惯例一致,不算问题。
  • en_ud 反转表已同步:新增键 97 / 97 完全一致。
  • 测试与文档诚实:GameTest 覆盖喷流燃料模拟(模拟不扣料、不足一轮不部分扣除)、鱼缸 24gt、骰子点数/存档回滚、仓储 RPC 会话上限与越权、放置规则、结构磁盘等;docs/porting/26.1.md 明确区分"已接入 / 待验收",并声明"不能用禁用渲染、占位实现或删掉不兼容功能来达到完整移植"。
  • 新增配置项均带合理 @BoundedDiscrete 区间;无遗留调试输出(仅 LOGGER.debug)。

📋 声称验证表

声称(源分支特性) 状态 对应实现
大红按钮(六向、多人持有、超时释放) BigRedButtonBlock/BlockEntityBigRedButtonHoldPacketBigRedButtonInputListener、渲染器、资源
红石骰子(均匀/真实模式、轮盘) RedstoneDiceBlock/BlockEntityRedstoneDice{Roll,Mode}PacketRedstoneDiceInputListener
物品分配器 / 溢流溜槽 ItemSplitter*OverflowChute*(含铁砧下砸、溢流口开关)
仓储端口(物品 / 流体 / 整合器) ⚠️ 主体、StoragePortManager、物品+流体端口 UI 齐全;整合器缺 zh 名与 tooltip
终端(本地 / 潜影 / 超维) TerminalItem 系列、TerminalSessions/SourceManager、RPC 校验
空炼药锅 + 等离子喷流存续 IEmptyCauldronPlasmaJetHooks/FuelHandler、配置项
智能方块放置器(指针/放置规则/蓝图) ⚠️ 逐行等价于 1.21;26.1 侧旧实现被整体删除,蓝图材料清单修复仍 pending (#4873)
多方块预览 / 模型精确拾取 / 描边 ⚠️ 选择与描边已接通;6 个渲染器仍 missing-feature,视觉验收未完成
结构扫描仪 / 磁盘 / 建筑杖 / 航天装备 / 口袋系统 未移植(pending #4878/#4857/#4854 等)
"1.21 的所有新特性" 自记 21/28 项 pending

🧪 测试建议

被测目标 推荐场景 优先级
TerminalSessions.storage() open / 已过期 token 调用 → 不抛 NPE 🔴
StoragePortManager 注册表 跨维度同坐标注册/注销(含区块卸载、世界卸载)后无残留 🔴
zh_cn / en_us 键集 CI 增加 en_us ↔ zh_cn 键差集断言(当前差异 0,本 PR 破坏) 🟡
PlasmaJetsBlockEntity 服务端 tick 路径不可达被 @OnlyIn 剥离的方法 🟡
BlockStatePredicate 谓词作 Map key 时渲染缓存不参与身份判定、不同条件谓词不等价 🟡

结论: COMMENT — 工作质量高(RPC 校验、静态状态清收、注册/资源/loot/en_ud 完整性、测试与文档都扎实),但作为 draft 的 WIP:标题"Port all"与自记 21 项 pending 不符,zh_cn 23 键漏译破坏了仓库零缺口约定,dev/porting 90 文件与 188 行构建逻辑混入且 CI 不执行,另有 AGENTS.md 半句话、TerminalSessions 空值、@OnlyIn 重新启用等具体问题待处理。

建议标题(本次 gh token 失效未自动修改):
Port 1.21 features to 26.1 (WIP, 7/28 tracked commits) 分批移植 1.21 新特性到 26.1(进行中)


由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement).

@@ -141,46 +165,63 @@ public Pair<Set<BlockPos>, Set<BlockPos>> getHeatingPoses(Level level) {
return new Pair<>(noMagnet, magnet);
}

private static final BiConsumer<PlasmaJetsBlockEntity, Level> CLIENT_TICK = (entity, level) -> entity.clientTick((ClientLevel) level);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

似乎本行因为使用 ClientLevel 导致服务器启动崩溃。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants