Port all 1.21 new features to 26.1 把1.21的所有新特性移植到26.1 - #4845
WhereisFff wants to merge 36 commits into
Conversation
- 增加大红按钮、红石骰子、物品分配器与溢流溜槽 - 恢复智能放置器、模型选择、放置预览和物品图标渲染 - 接入仓储端口缓存交互与流体端口储罐及管网调节 - 适配物品流体事务、存档数据、配方和资源注册 - 添加分阶段游戏验证、实景对照入口和完整移植清单
- 在物品窗口内显示液面或气体余量并保持动态贴图刷新 - 显示流体图标、名称、存量和容量并补齐中英文文本 - 增加多液位实景校验及本地源分支增量核对入口
- 按最新源分支统一红石元件的普通与潜行放置朝向 - 让燃烧炼药锅使用原始轮廓 - 增加超级电容拆解为八个电容和火药的粉碎配方 - 记录已接回的源提交并补充放置与客户端规则验证
- 加入源分支新增的建筑杖模型与装备图标 - 更新离子背包图标并接通耗尽状态的新纹理 - 增加素材一致性与背包状态模型核对
- 按模拟结果与时长上限消费燃烧锅和鱼缸燃料 - 接入空炼药锅标记及喷流生命周期扩展 - 保留喷流上升状态和带注册表上下文的扩展存档 - 同步最新配置下限并补充燃料与结构回归验证
- 按流体身份跨维度汇总端口存量并保留抽空占位 - 区分自动倒桶与失败归还的目标选择规则 - 使用原生事务支持多端口模拟抽取和整体回滚 - 补齐零数量流体条目编码与仓储查询回归验证
- 聚合相连端口的物品缓存与流体能力并保留标记优先规则 - 接入双击存入和流体容器回写及核心归属生命周期 - 同步两种外观模型贴图与合成配方和玩家提示 - 补充事务回归测试及实际核心连接的视觉对照场景
- 保留模组资源与特效的完整移植要求 - 记录地形采样对照结果并移除场景中的过滤设置覆盖
- 增加内置流体分类及新玩家默认分类入口 - 支持命名空间和组合分类的流体判定 - 兼容旧 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(); | |||
There was a problem hiding this comment.
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()); | |||
There was a problem hiding this comment.
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; | |||
There was a problem hiding this comment.
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()); | |||
There was a problem hiding this comment.
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()); |
There was a problem hiding this comment.
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; | ||
| } |
There was a problem hiding this comment.
'}' 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(); |
There was a problem hiding this comment.
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 | |||
There was a problem hiding this comment.
'instanceof' should be on a new line.
- 接通合成及切石取出、Shift 存放与自动补料 - 修正偏移配方余料位置,保留催化剂和容器并保证补料事务守恒 - 限定主背包投放范围并验证满容量拒绝和真实客户端 RPC - 登记源分支新增的 21 个待移植提交
- 按产物堆叠上限计算预算并跨 RPC 分块锁定配方 - 接通 Q 和 Ctrl+Q,复用余料归还及自动补料逻辑 - 处理容量回滚、催化剂停止和会话变更清理 - 补充切石预算、数量守恒与客户端续作验证
- 恢复合成模式解锁、九宫格和切石选择及持久化选项 - 接入取出、批量、清空和输入槽移出丢弃接口 - 添加紧凑分类布局并同步源版面板素材与双语文本 - 补充真实界面点击和关闭恢复验证
- 接入跨区左键均分、右键逐格投放和创造中键填满 - 统一拖拽预览与释放提交,校验指针权限及槽位上限 - 修复切石滚动条拖动并补充真实界面操作验证
- 按目标槽、其余输入和主背包顺序收集同组件物品 - 使用服务端指针防止过期快照放大数量 - 排队处理快速双击并在交互完成后关闭归还指针 - 补充收集范围与真实界面数量守恒验证
- 同步普通、合成及分类设置页的背景、控件和命中坐标 - 持久保存玩家布局并兼容旧设置,同步翻转按钮与双语提示 - 增加设置权限与编解码测试及真实客户端交互验证
- 支持合成格份数分配与切石配方选取,保留输入布局和物品组件 - 按整组事务扣取背包、仓储及流体材料,失败时回滚空容器与流体 - 归还旧输入并增加数量守恒、边界及真实客户端 RPC 验证
- 为 JEI 与客户端扩展提供真实背包槽位、翻转坐标和指针状态 - 保留现有交互同步并接通容器前景事件,维持 JEI 叠加层显示 - 增加槽位映射测试及数字键、丢弃和关闭归还的客户端验证
- 按标签余量、物品组件和共享流体容器预算生成转移计划 - 接通配方入口、缺料按钮、切石选择及转移后合成面板刷新 - 补充材料分配测试与有无 JEI 的真实客户端验证
- 登记大型板条箱与潜影集装箱主方块并按距离查询最近目标 - 接入加载、移除、世界卸载和停服清理,查询不强制加载区块 - 增加范围边界、存档恢复、无绑定目标和生命周期验证
- 统一药盒与护符盒取放规则并支持创造背包本地交互 - 同步玩家收纳按键配置并完善药盒组件快照与冷却 - 适配本地预测音效,验证生存与创造取放及物品守恒
- 同步药盒与护符盒选中索引,保证高亮与服务端取物一致 - 校验菜单与槽位并处理移开重置、关闭重开及等值物品栈替换 - 增加索引边界测试和真实客户端滚轮取物验证
- 添加终端绑定、目标解析和按玩家隔离的远程会话 - 接通物品与流体访问,独立保存终端合成格并刷新动态目标 - 同步终端资源及基础配方,升级和解绑保留合成格内容 - 增加远程访问、数量守恒与真实客户端验证
- 按终端模式自动收存主背包超量物品并补充耗尽的手持物品 - 使用事务保证跨存储转移守恒,防止手动移物和切换快捷栏误补货 - 接通四模式环形轮盘及模式同步,补充服务端与真实客户端验证
- 支持游戏内、背包及创造物品栏的键盘和鼠标开仓 - 保留搜索输入并限制指针持物和非背包界面触发 - 合并重复开仓请求并防止迟到响应覆盖新界面 - 补充双语键位名称和真实客户端输入验证
Reason: script execution via -e/-c flag Reply |
| import dev.dubhe.anvilcraft.block.multipart.IMultiPartBlockModelHolder.ModelRenderTarget; | ||
| import dev.dubhe.anvilcraft.block.multipart.IMultiPartBlockModelHolder; |
There was a problem hiding this comment.
Wrong lexicographical order for 'dev.dubhe.anvilcraft.block.multipart.IMultiPartBlockModelHolder' import. Should be before 'dev.dubhe.anvilcraft.block.multipart.IMultiPartBlockModelHolder.ModelRenderTarget'.
|
我已完成对 PR #4845 的分析(794 文件 / +47,461 −9,047,无 代码审查摘要 — PR #4845操作: synchronize( 分布: ✅ API 迁移健康度(26.1 迁移 PR)
🔴 关键未发现阻断级缺陷(编译/启动/GameTest 证据齐全,作者亦在
|
| 声称(源分支特性) | 状态 | 对应实现 |
|---|---|---|
| 大红按钮(六向、多人持有、超时释放) | ✅ | BigRedButtonBlock/BlockEntity、BigRedButtonHoldPacket、BigRedButtonInputListener、渲染器、资源 |
| 红石骰子(均匀/真实模式、轮盘) | ✅ | RedstoneDiceBlock/BlockEntity、RedstoneDice{Roll,Mode}Packet、RedstoneDiceInputListener |
| 物品分配器 / 溢流溜槽 | ✅ | ItemSplitter*、OverflowChute*(含铁砧下砸、溢流口开关) |
| 仓储端口(物品 / 流体 / 整合器) | 主体、StoragePortManager、物品+流体端口 UI 齐全;整合器缺 zh 名与 tooltip |
|
| 终端(本地 / 潜影 / 超维) | ✅ | TerminalItem 系列、TerminalSessions/SourceManager、RPC 校验 |
| 空炼药锅 + 等离子喷流存续 | ✅ | IEmptyCauldron、PlasmaJetHooks/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 审查
|
💾 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); | |||
There was a problem hiding this comment.
似乎本行因为使用 ClientLevel 导致服务器启动崩溃。
No description provided.