Migrate features and fixes from dev/26.1 to port/1.21.1 - #97
Conversation
- 新增分支对比报告:分支拓扑、提交主题、模块清单与逐模块差异分类 - 新增 Minecraft 与 NeoForge 版本差异文档:13 个 API 差异主题,含旧→新对照、涉及文件与迁移注意 - 新增迁移计划文档:8 个回迁项(含 module.yukkuri 整模块)的目标、步骤、API 适配点与验收方式 - 三个文档回迁项编号与提交引用保持一致,无法本地验证的点均标注待验证
回移植 dev/26.1 6220427 的 public 化改动,作为 module.rpc 等外部模块 使用 @Network(protocol = PacketProtocol.PLAY) 注解的前置条件。
将 dev/26.1 的 module.rpc(d153e58 Anvil-Dev#60、8d57cba Anvil-Dev#63、4910620 Anvil-Dev#87)整体回移植, 作为新模块 anvillib-rpc-neoforge-1.21.1,实现 @RemoteCallable 静态方法 + 方法引用解析 + 索引下发 + 双向 play 网络包 + 带返回值 invoke 的完整 RPC 能力。 API 适配(26.1 → 1.21.1): - Identifier → ResourceLocation - FMLLoader.getCurrent().getLoadingModList() → LoadingModList.get() - field.accessFlags()/AccessFlag(Java 22)→ Modifier.isPublic/isStatic/isFinal - ClientPacketDistributor(26.1 新增)→ PacketDistributor.sendToServer - ByteBufCodecs.LONG_ARRAY(26.1 新增)→ VarInt/VarLong 手写等价编解码 - Java 22 lambda 参数 _ 改名为 ignored - 补 compileOnly org.jspecify:jspecify:1.0.0(@NullMarked 注解依赖) 构建:build.gradle 按 port 侧模板,jarJar 依赖 anvillib-network-neoforge-1.21.1。
将 dev/26.1 的 module.sync(3ce2611、bf49789、8d57cba、1063ee9 Anvil-Dev#65)整体回移植, 作为新模块 anvillib-sync-neoforge-1.21.1 + 内嵌 anvillib-sync-processor-neoforge-1.21.1, 实现 @sync 注解字段双向同步、LazySync 惰性差分同步与 Configuration 阶段配置表下发。 API 适配(26.1 → 1.21.1): - Identifier → ResourceLocation - FMLLoader.getCurrent().getLoadingModList() → LoadingModList.get() - ClientPacketDistributor(26.1 新增)→ PacketDistributor.sendToServer - ByteBufCodecs.LONG/LONG_ARRAY(26.1 新增)→ VAR_LONG / VarInt+VarLong 手写 - ItemStackTemplate.STREAM_CODEC 分支删除(1.21.1 ItemStack.OPTIONAL_STREAM_CODEC 等价) - IModFile.getContents()(26.1 新增)→ getSecureJar().getPath + Files.newInputStream - ServerPlayer.level()(26.1 改名)→ serverLevel() - ChunkPos.containing(BlockPos)(26.1 新增)→ new ChunkPos(blockPos) - ClientLevel.getEntities().get(UUID)(1.21.1 为 protected)→ entitiesForRendering() 遍历 - Java 22 lambda 参数 _ 改名为 ignored processor 字节码注入从 26.1 专属 neoforgespi.transformation SPI 重写为 1.21.1 CoreMod(ICoreMod + ITransformer<ClassNode>,services 注册 net.neoforged.neoforgespi.coremod.ICoreMod),注入器(SyncBytecodeInjector / LazySyncBytecodeInjector)纯 ASM 逻辑原样复用。 构建:主模块 jarJar 依赖 processor/codec/network/util(-1.21.1 坐标); processor 子项目 Java 21、jreleaser 按 port 侧直接坐标写法。
将 dev/26.1 的 module.collision(82b4f6a)整体回移植,作为新模块 anvillib-collision-neoforge-1.21.1。模块为零 MC/NeoForge API 依赖的纯数学 AABB×三角形 SAT 碰撞检测,源码逐字搬移,仅补 compileOnly jspecify(@NullMarked)。
将 dev/26.1 的 renderdoc-loader(2751be4、1063ee9)源码逐字回移植,作为 renderdoc-loader-internal,实现 premain/agentmain 动态加载 RenderDoc DLL。 jar manifest 含 Premain-Class/Agent-Class(jar-in-jar 内嵌支持)。 构建适配:Java 25 → 21;jreleaser 别名改为直接坐标写法后因插件冲突移除 (本模块不发布中央仓库);jetbrains annotations 版本对齐 port 侧 24.1.0。
将 dev/26.1 的 module.explosion(435e23f、fba1027)整体回移植,作为新模块 anvillib-explosion-neoforge-1.21.1,依赖 port 侧 anvillib-config-neoforge-1.21.1, 实现 ServerTickEvent.Post 驱动的分层球壳破坏 + 熔炼配方熔化替换。 API 适配(26.1 → 1.21.1): - Identifier → ResourceLocation - Ingredient.items()(26.1 Stream<Holder<Item>>)→ getItems()(ItemStack[]) - ItemStackTemplate → ItemStack(getCount/getItem) - BuiltInRegistries.BLOCK.get(TagKey) → getTag(TagKey)(Optional<HolderSet.Named>) - AbstractCookingRecipe.input()(26.1 新增)→ getIngredients().get(0) - SingleItemRecipeAccessor 的 result 类型 ItemStackTemplate → ItemStack - entity.hurtServer(...)(26.1 专属)→ Entity.hurt(DamageSource, float) - GatherDataEvent.Client → 单一 GatherDataEvent + includeClient() - @config(group=...) 移除(port @config 无 group 属性) - Java 22 lambda 参数 _ 改名;mixins.json JAVA_25 → JAVA_21
将 dev/26.1 module.config 的三项功能演进回移植(3d50d76、946938f Anvil-Dev#56): - @config(group=...) 配置分组:Config 新增 group() 属性、ConfigManager 传递、 ConfigRecord 新增 group 组件,getFileName() 生成 <group>/<modid>-type.toml 子目录文件 (1.21.1 ConfigTracker 原生支持子目录路径) - TranslatableEnum 枚举翻译:新增 util/TranslatableEnum(扩展 NeoForge 21.1.226 TranslatableEnum,提供 getTranslationKey 生成 anvillib.configuration.enum.* 键), ConfigData 增加 ENUM_STRING 常量与 enumValueAdd 反射分支 - TOML key 点分隔:FormattingUtil 新增 toPointSplitName,ConfigData 的 section 键 改用点分隔形式(破坏性:语言 key 由 section.anvillib_explosion.common.toml 变为 section.anvillib.explosion.common.toml,使用方语言文件需同步,已重跑 module.explosion runData 更新产物) 不移植:ConfigManager 的 Optional.of(ModList.get()) 修复(计划标注可选且有争议, port 侧 ModList.get() 不返回 null,行为等价);FMLLoader.getCurrent().getDist() 保持 port 侧 FMLLoader.getDist() 写法。
回移植 dev/26.1 的三处小演进: - PacketData 泛型检查修复(20721b1 Anvil-Dev#52):字段判断反转为 Type.class.isAssignableFrom(fieldType) 并追加类型实参校验 (isMatchingTypeArgument:Type<X> 检查第 0 参、StreamCodec<B,T> 检查第 1 参), 修复同一类中多个静态 Type/StreamCodec 字段时的误匹配 - NetworkUtil 条件发送(5733a9d):新增 sendToAllPlayersIncluded 与 sendToAllPlayersInDimensionIncluded(included == null 默认全通过), 与现有 Excluded 方法对称;player.equals(excluded) 改为 Objects.equals 防 NPE - PacketProtocol public 已随 #P1 前置提交(56cade3a)
回移植 dev/26.1 的两处纯逻辑修复:
- SpawnItem.accept()(40b8f84):count 掷 0 时直接返回,不再生成空堆物品实体
- SetBlock 编解码(b8825bd):optionalFieldOf("nbt") 默认值 null → 空 CompoundTag,
修复 JSON 缺 nbt 字段时 loadWithComponents(null, ...) 的潜在 NPE
不迁移:SpawnItem 的 ItemStackTemplate 化与 SetBlock 的 ValueInput/ProblemReporter
NBT 加载上报(26.1 平台特性,port 侧 ItemStack/loadWithComponents(CompoundTag, Provider)
等价)。
回移植 dev/26.1 的两项功能演进: - 数据加载拆分(dc4d583):IntegrationType.DATA 拆为 CLIENT_DATA/SERVER_DATA; IntegrationInstance 的 dataLoader 拆为 clientDataLoader + serverDataLoader, findVirtual 查找 applyClientData/applyServerData;loadData → loadClientData/ loadServerData、loadAllDataIntegrations → loadAllClientDataIntegrations/ loadAllServerDataIntegrations - meter 递增(e8efbd4):compileContent 循环内 meter.increment() 破坏性 API:旧的 applyData 方法名不再被识别,下游使用方需同步改名。 不迁移:FMLLoader.getCurrent().getLoadingModList() 保留 port 侧 LoadingModList.get() 写法。
回移植 dev/26.1 module.util 的功能演进: - OutlineUtil(e4c09fb Anvil-Dev#75):AABB 轮廓直接提取(OutlineUtil 434 行原样复制, 仅依赖 AABB/Vec3 + Java 标准库);client/Line 移除 setLineWidth(1.21.1 VertexConsumer 无此方法,1.21.2 渲染管线改造后引入);新增 ShapeUtilJoinTimingTest + runShapeUtilJoinTimingTest(JavaExec)构建接线 - 谓词 HolderGetter 参数化(bb09805):BlockStatePredicate / ItemIngredientPredicate / ItemPredicate 的 Builder.of(TagKey) → of(HolderGetter, TagKey),不再绑定静态注册表; 连带 module.recipe 五个调用方(InWorldRecipeBuilder、HasBlock、HasBlockIngredient、 HasItem、HasItemIngredient)同步改造 - ItemIngredientPredicate 新增实例方法 withCount(int)(d84912e,返回新实例 不改原实例;Builder.withCount 已在 port 侧存在);BlockStatePredicate 加 @EqualsAndHashCode(c480e9f Anvil-Dev#49) 保留项:BlockStatePredicate.Builder.with(BlockState)(module.multiblock 依赖, dev 侧为配合 26.1 重构删除,port 不照搬)。
将 dev/26.1 的 module.space-select(1335fc5、e75b10f)整体回移植,作为新模块 anvillib-space-select-neoforge-1.21.1,依赖 anvillib-network-neoforge-1.21.1, 实现区域框选/线框渲染/滚轮缩放。 API 适配(26.1 → 1.21.1): - Identifier → ResourceLocation - ARGB(26.1 新类)→ 手写 (a<<24)|(r<<16)|(g<<8)|b int 打包 - Inventory.getSelectedSlot()(26.1)→ 公开字段 Inventory.selected - ClientPacketDistributor(26.1 新增)→ PacketDistributor.sendToServer - RenderLevelStageEvent 子类(AfterTranslucentParticles)→ 单一事件 + getStage() - ShapeRenderer(1.21.1 不存在)→ LevelRenderer.renderVoxelShape/renderLineBox - RenderTypes.lines()(26.1 类)→ RenderType.lines() - Minecraft.hasControlDown/hasAltDown → Screen.hasControlDown/hasAltDown - Direction.getApproximateNearest → getNearest(double,double,double) - 相机位置取 event.getCamera().getPosition(),线宽用默认
回移植 dev/26.1 module.registrum 的注册表类型扩展(9b2d0e3 Anvil-Dev#31、9c89bfa Anvil-Dev#27、 9627358 Anvil-Dev#30、c307a4c Anvil-Dev#28、252922e Anvil-Dev#47):新增 builders/ 与 util/entry/ 下 39 个文件, AbstractRegistrum 增加 17 组注册入口(creativeTab/attachment/dataComponent/ biomeModifier/glm/structureModifier/condition/soundEvent/recipe/gameEvent/potion/ mobEffect/villager/poi/profession/self)。 API 适配(26.1 → 1.21.1): - CreativeTab/SoundEvent 仅 Identifier → ResourceLocation - AttachmentBuilder.serialize(MapCodec) → serialize(Codec)(26.1 才改 MapCodec) - DataComponentBuilder 删除 ignoreSwapAnimation()(1.21.2+ 才有) - RecipeSerializerBuilder:1.21.1 RecipeSerializer 为接口,createEntry 改匿名类 实现 codec()/streamCodec() - VillagerProfession 按 1.21.1 6 元 record(无 TradeSet 参数,第一参数 modid+name) - VillagerTypeBuilder 用 () -> new VillagerType(name)(方法引用无法匹配 Supplier) - dataComponentPredicate 入口不迁(1.21.5+ 才有 DataComponentPredicate) 零碎修复:BlockBuilder.item() 默认 lang(e3ba2cd)、OneTimeEventReceiver 空值防御 (23f5686)。
…provider)) 回移植 dev/26.1 module.registrum 的 datagen 增强(58f01d4): - RegistrumRecipeProvider:vanilla 方法 public 化(oneToOneConversionRecipe/ oreSmelting/oreBlasting/oreCooking)——1.21.1 为 protected static 且首参 RecipeOutput,落法为公开包装方法内调 RecipeProvider.xxx(this, ...) 而非 override; 26.1 独有配方(shelf/colorItemWithDye/colorWithDye/dryGhast)按 1.21.1 vanilla 字节码手动实现;save 均用 ResourceLocation - Builder.dataMap(DataMapType, NonNullBiFunction<DataGenContext, HolderLookup.Provider, D>) 重载;RegistrumDataMapProvider override gather(HolderLookup.Provider) 缓存 provider (21.1.226 存在该非弃用重载) 不迁移:ItemStackTemplate 相关方法、GeneratorType/ProviderType 拆分、 RegistrumRecipeRunner、模型生成器五件套(26.1 专属)。
回移植 dev/26.1 module.multiblock 的四项功能演进/修复: - M1 DynamicMultiblockEvent(1e5bfb3 Anvil-Dev#69):新建 dynamic/event/DynamicMultiblockEvent (Event + ICancellableEvent,Form/Unform 可取消子类);DynamicMultiblockManager. updateFormed 与两个 packet handler 加事件触发点,取消则回滚 setFormed - M2 未加载区块快照复用(d888714 Anvil-Dev#73):buildSnapshot 对 !level.isLoaded(pos) 分支 复用旧 entries;Entry.blockState 可空 + test() 空态返回 true;MultiblockState 新增 snapshot 字段,checkMultiblockFormed 先存快照 - M3 Long→BlockPos 键化(22091d4):multiblocks/pendingChecks 改 Map<BlockPos,…>/ Set<BlockPos>,getAt/add/removeAt/containsAt 与异步回调处 pos.immutable() 防哈希突变; MultiblockCheckSnapshot 字段 controllerPosLong → controllerPos - M4 定义懒解析(1b0a652):MultiblockState 构造器改收 ResourceKey,getDefinition (HolderLookup.Provider) 懒解析 Holder.Reference;DEFINITION_KEY_STREAM_CODEC 外提 (ResourceKey.streamCodec);packet/manager 同步改用 holder.key() Java 21:port 侧已无 lambda 下划线问题;level.isClientSide 沿用 port 字段写法。
回移植 dev/26.1 module.wheel 的环形扇区选择效果(5d0b285、46e1b73、8a818f0): - api/WheelSelectionEffect(DOT/ANNULAR_SECTOR 两种形态 + normalizePositiveAngle 角度归一化,纯逻辑原样搬);WheelMenuBuilder 链式 selectionEffect()/ selectionEffectColor();WheelMenuModel 两个新 of(...) 重载 - WheelWidget.renderSelectionEffect/renderProgressAnimation/renderAnnularSectorSelection: 渲染落在 port 既有 Tesselator/ShaderInstance/LibShaders 体系(QUADS + RenderSystem.setShader + safeGetUniform 逐个 set + BufferUploader.drawWithShader), shader 为空走多边形回退;移除固定 selectionEffectRadius 参数(动态尺寸) - annular_sector.fsh/json 落位注册(去掉 26.1 UBO 块,改 port 惯例独立 uniform) 切断 dev 侧 wheel 对 anvillib-rendering 的 jarJar 依赖(port 不引入 rendering)。 不迁移:gui/render/state 三件套、LibRenders、LibDynamicUniforms(26.1 渲染管线)。
Reason: Security scan — [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection. Reply |
回移植 dev/26.1 的 roseau API 兼容检查体系(ea4301f Anvil-Dev#25、a6a24f1、946938f): - 根 roseau.yaml(排除 Deprecated/Beta/ApiStatus 系列注解) - gradle/scripts/roseau.gradle:roseau-cli 0.6.0 差分检查任务,通过 gradle.projectsEvaluated + subprojects 注册到各模块(Java 21 toolchain, 替换 dev 的 java_version 属性引用;tasks.named('jar', Jar) 惰性化以兼容 Gradle 8.8 配置时机) - 根 build.gradle 接入 注意:本机运行 roseauCheck 时 Gradle daemon 崩溃(疑似 roseau-cli 0.6.0 与本地 Java 21 环境兼容问题),任务可注册、配置阶段通过,运行验收 登记为待 CI/人工补验。
🌿 Roseau API Breaking Change Report
|
Reason: Security scan — [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection. Reply |
🌿 Roseau API Breaking Change Report
|
Reason: script execution via -e/-c flag Reply |
|
信息收集完毕。综合所有分析,输出审查意见: 代码审查摘要 — PR #97操作: 🔴 关键
|
| 计划项 | 状态 | 说明 |
|---|---|---|
| #P1 rpc | ✅ | 30 文件完整 |
| #P2 sync + processor | ✅ | 39 文件,CoreMod 重写 |
| #P3 explosion | ✅ | 16 文件 |
| #P4 collision | ✅ | 7 文件 |
| #P5 space-select | ✅ | 23 文件 |
| #P6 font | ❌ | 未落地(settings.gradle 已 include) |
| #P7 rendering | ❌ | 未落地(settings.gradle 已 include) |
| #P8 renderdoc-loader | ✅ | 4 文件 |
| #P9 config | ✅ | 6 文件 |
| #P10 integration | ✅ | 3 文件 |
| #P11 network | ✅ | 3 文件 |
| #P12 util | ✅ | 7 文件 + 测试 |
| #P13 registrum | ✅ | 46 文件 |
| #P14 registrum datagen | ✅ | RecipeProvider 改动 |
| #P15 multiblock | ✅ | 7 文件 |
| #P16 recipe | ✅ | 7 文件 |
| #P17 wheel | ✅ | 8 文件 |
| #P18 test | 未见集成测试落地 | |
| #P19 构建体系 | ✅ | roseau.yaml + roseau.gradle |
结论: COMMENT(草稿 PR,需修复构建阻断后转 ready) — 核心问题是 settings.gradle 引用了未包含的 module.rendering / module.font,当前分支无法通过 Gradle 配置阶段;建议先移除这两个 include(或补齐模块),并统一 @NullMarked 与迁移文档的约定。其余模块移植质量高,26.1 API 泄漏为零,可待构建验证后进入正式审查。
由 Hermes Agent 审查
Reason: script execution via -e/-c flag Reply |
|
💾 Self-improvement review: Patched SKILL.md in skill 'minecraft-mod-pr-review' (1 replacement). |
|
I now have a complete picture. Let me compile the final review. 代码审查摘要 — PR #97操作: opened 迁移健康度(1.21.1 反向适配检查)
🔴 关键(必须修复后合并)
|
| 计划项 | 状态 | 证据 |
|---|---|---|
| #P1 module.rpc | ✅ | 30 文件,网络/配置/客户端注册齐全 |
| #P2 module.sync + processor | ✅ | 39 文件,CoreMod 重写正确(运行时 jarJar 待验证) |
| #P3 module.explosion | ✅ | 16 文件,mixins.json 已注册 Accessor |
| #P4 module.collision | ✅ | 纯数学,零 MC 依赖 |
| #P5 module.space-select | ✅ | 渲染层已改 LevelRenderer.renderVoxelShape |
| #P6 module.font | ❌ | 未交付,但 settings.gradle 已注册(构建阻断) |
| #P7 module.rendering | ❌ | 未交付,但 settings.gradle 已注册(构建阻断) |
| #P8 renderdoc-loader | ✅ | Agent + build.gradle |
| #P9 config group/TranslatableEnum/点分隔 | ✅ | Config/ConfigManager/ConfigRecord/FormattingUtil 联动一致 |
| #P10 integration 拆分 | ✅ | CLIENT_DATA/SERVER_DATA + meter 递增 |
| #P11 network 三处 | ✅ | PacketData 泛型修复 / Included 方法 / PacketProtocol public |
| #P12 util 演进 | ✅ | OutlineUtil + HolderGetter 重构(连带 recipe 4 调用方) |
| #P13 registrum 14 种 builder | ✅ | AbstractRegistrum +438 行,VillagerProfession 6 元 record |
| #P14 registrum datagen | ✅ | RecipeProvider public 化 + dataMap(provider) |
| #P15 multiblock 四项 | ✅ | 事件 + 快照复用 + BlockPos 键化 + 懒解析 |
| #P16 recipe 两修复 | ✅ | 已核对 |
| #P17 wheel 环形扇区 | ✅ | fsh + json + LibShaders + Widget |
| #P18 module.test | 仅 module.util 的 ShapeUtilJoinTimingTest 落地 | |
| #P19 roseauCheck | 文件齐备,但全子项目配置期网络 I/O 需惰性化 |
结论: REQUEST_CHANGES — settings.gradle 引用了两个不存在的模块目录,导致仓库任何 Gradle 构建(含现有模块)在配置阶段直接失败,这是必须修复的阻断项;其余为文档一致性(jspecify vs 计划 §2.4)、roseau 配置期网络 I/O、SyncManager.getValue 空实现等警告级问题。功能迁移本身质量很高,修复后值得合并。
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
SyncClassProcessor(CoreMod) |
生产 jar(jarJar 嵌套)下 @Sync 字段是否被注入 |
🔴 |
DynamicMultiblockManager.buildSnapshot |
未加载区块 + 快照复用 + 首次检测(old 为空 Map)三条路径 | 🟡 |
PacketData.isMatchingTypeArgument |
泛型实参为通配符/非 Class/类型参数时的 false 分支 | 🟢 |
RpcPendingCalls.tick() |
100 tick 超时边界(99/100/101)与已移除条目 | 🟢 |
ConfigData.enumValueAdd |
TranslatableEnum + SerializedName 覆盖 | 🟢 |
由 Hermes Agent 审查
回移植 dev/26.1 module.rendering 的纯逻辑/资源部分(7121bf6、7d07f20 Anvil-Dev#41、 494274e Anvil-Dev#21),形成新模块 anvillib-rendering-neoforge-1.21.1 骨架: - foundation/buffers/layout(BufferLayout/Std140/Std430 布局计算 + 测试)、 BufferObject 基类(去掉 DynamicUniformStorage/CommandEncoder 依赖, 改为 write(ByteBuffer))、Sdf2d(9 种 SDF 距离函数)、SdfParameters/ SdfRenderType/SdfPassType、DirtyTracked、Empty/Transforming 缓冲源、 ALRMeshSorting、MemoryBarrierFlag/ALRComputeCapabilities/GpuBufferConstants、 MainTargetResizeEvent+GameRendererMixin、RegisterComputePipelinesEvent、 MinecraftMixin、RenderTypeMixin+ALRRenderTypeExtension(bloom 标记)、 ALRIntegrationCompatMixinPlugin、Timer、ALRSharedMath、shader 资源 1.21.1 适配(实测销账):Mth.roundToward 存在(V-1 ✓)、EmptyBufferSource super(null,null) 兼容(V-3 ✓)、Mth.length(float) 仅 double 需强转、 CompactVectorArray 不存在改 VertexSorting.sort、setLineWidth 不存在、 updateLevelInEngines 单参、AddClientReloadListenersEvent → RegisterClientReloadListenersEvent(registerReloadListener) - runStd140LayoutRulesTest(JavaExec)+ check 依赖,Std140/Std430 断言通过
将 dev/26.1 的 module.font(1d56a4e Anvil-Dev#22、946938f Anvil-Dev#56)整体回移植,作为新模块 anvillib-font-neoforge-1.21.1(jarJar 依赖 anvillib-rendering-neoforge-1.21.1), 实现 AWT 字体 → CPU 生成 SDF 图集 → GPU 采样渲染。 直接移植 9 项:SdfGlyphAtlas/SdfGlyphPage/SdfTextLayout/ALFont/FontManager/ AnvilLibFontConfig(V-12 销账:FMLLoader.getCurrent().getGameDir() → FMLPaths.GAMEDIR.get())/ AnvilLibFont/data/AnvilLibFontData(GatherDataEvent.Client → 单一 GatherDataEvent,V-17 ✓)/ shader 资源 反向适配 8 项:SdfAtlasTexture 用 DynamicTexture+TextureManager.register; ALFPipelines 用 RegisterShadersEvent+ShaderInstance(参照 port wheel LibShaders, VertexFormat.builder() 实测存在);SdfTextRenderer 用 GuiGraphics+Tesselator 提交 quad、分段样式纯逻辑复用;GuiGraphicsExtractorExtension+Mixin 注入目标改 GuiGraphics (interface_injections.json),ARGB.multiply → FastColor.ARGB32.multiply(实测存在); 3 个 screen/widget 改 1.21.1 render/mouseClicked API;sdf_text.fsh/vsh 按 1.21.1 (DiffuseSampler→Sampler0、显式 ModelViewMat/ProjMat)+ 新增 sdf_text.json 另实测修复:AnvilLibFont 的空 @EventBusSubscriber(无 @SubscribeEvent 方法, 1.21.1 自动注册抛 IllegalArgumentException)已移除。runData 生成 en_us.json 通过。
Reason: Security scan — [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection. Reply |
|
所有检查完成。@mod dist 隔离正确(font/rendering/rpc-client/space-select-client/sync-client 均为 Dist.CLIENT,同 jar 双 @mod 标准模式)。输出审查: 代码审查摘要 — PR #97操作: synchronize(反向移植复查: 对比上次 synchronize(418 文件/33.8K 行),本次 diff 再次增大(419 文件/35.2K 行)。已按复查要求重跑全部扫描(headers 重建、反向 API、ghost、mixin 交叉、接线验证),未沿用上次计数。 ✅ 反向 API 健康度(重扫干净)
✅ 结构性复查(接线全部到位)
🔴 关键(需关注后合并)
|
|
💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). · Patched references/reverse-port-review-detail.md in skill 'reverse-port-pr-review' (1 replacement). |
🌿 Roseau API Breaking Change Report
|
|
|
代码审查摘要 — PR #97操作: synchronize(反向移植复查) ✅ 反向 API 残留扫描(干净)
1.21.1 正常指标: ✅ Mixin 配置 ↔ 类文件交叉检查(全匹配)
✅ 接线验证
📋 声称清单映射(todo 20 项全对应)
🔴 关键问题(建议修复后再合并)
|
|
💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). · Patched references/reverse-port-review-detail.md in skill 'reverse-port-pr-review' (1 replacement). |
🌿 Roseau API Breaking Change Report
|
It's unnecessary
|
所有扫描完成。以下是审查结果: 代码审查摘要 — PR #97操作: synchronize
✅ 反向 API 健康度(26.1 残留扫描)
所有 26.1 API 命中均落在 docs 规划文档(合法提及),Java 真实残留 = 0。 🔴 关键(建议合并前处理)
|
| 声称 | 状态 | 对应模块文件数 |
|---|---|---|
| #P1 module.rpc (25) | ✅ | 25 Java |
| #P2 module.sync+processor (31) | ✅ | 31 Java(主 25 + processor 6) |
| #P3 module.explosion (10) | ✅ | 10 |
| #P4 module.collision (3) | ✅ | 3 |
| #P5 module.space-select (18) | ✅ | 18 |
| #P6 module.font (25) | ✅ | 25 |
| #P7 module.rendering | ✅ 已移除 | diff 中 0 文件 |
| #P8 renderdoc-loader | ✅ 已移除 | diff 中 0 文件 |
| #P9–#P20(config/integration/network/util/registrum×2/multiblock/recipe/wheel/test/roseau/codec) | ✅ | 8/2/6/11/44/13/26/12/16/roseau.yaml+gradle/2 |
V-9/V-10/L-1 仍为「未验证/运行待补验」,其余 V 项已销账或编译级验证通过。
结论: COMMENT — 代码质量与移植完整性优秀(反向 API 残留 0、mixin/injection/jarJar 接线全对、声称清单全兑现)。合并前请:① 完成 V-9/V-10 的打包启动实测并补防御性改写(ICoreMod 时序是最大结构性风险);② 处理 roseau.gradle 急切网络;③ 等 CI 绿(当前 unstable)。PR 仍为 draft,转 ready 后再合入。
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). · Patched references/reverse-port-review-detail.md in skill 'reverse-port-pr-review' (1 replacement). |
🌿 Roseau API Breaking Change Report
|
|
所有扫描完成。汇总数据:
代码审查摘要 — PR #97(第 6 次 synchronize 复查)操作: synchronize ✅ 反向 API 健康度(本次全量重扫)
1.21.1 基线指标正常: 🔴 关键无新增关键问题。结构性风险复查后依旧成立:
|
| 声称 | 状态 | 对应模块文件数 |
|---|---|---|
| #P1 module.rpc | ✅ | 30 |
| #P2 module.sync + processor | ✅ | 39 + 9 |
| #P3 module.explosion | ✅ | 15 |
| #P4 module.collision | ✅ | 7 |
| #P5 module.space-select | ✅ | 23 |
| #P6 module.font | ✅ | 36 |
| #P7 module.rendering | ✅(已移除) | 0 残留确认 |
| #P8 renderdoc-loader | ✅(已移除) | 0 残留确认 |
| #P9 module.config | ✅ | 8 |
| #P10 module.integration | ✅ | 2 |
| #P11 module.network | ✅ | 6 |
| #P12 module.util | ✅ | 12 |
| #P13/#P14 module.registrum | ✅ | 44 |
| #P15 module.multiblock | ✅ | 14 |
| #P16 module.recipe | ✅ | 26 |
| #P17 module.wheel | ✅ | 14 |
| #P18 module.test | ✅ | 17 |
| #P19 构建体系 roseau | ✅(运行待补验 L-1) | roseau.yaml + roseau.gradle |
| #P20 module.codec CodecUtil | ✅ | 2(32 个 create/mapCodec 重载) |
结论: COMMENT — 反向移植质量良好(API 残留 0、接线完整、逻辑抽查无新问题),规模收缩与 todo 移除项一致。但 PR 仍为 draft、CI unstable,且 V-9/V-10(CoreMod 时序)与 L-1(roseau 急切网络)两项结构性风险未销账、无 runClient 实测。建议:CI 转绿后合并;合并前至少完成一次启动冒烟验证,并优先处理 roseau.gradle 的急切网络反模式。
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
SyncClassProcessor / SyncTargetIndex |
启动日志验证注入点 + LoadingModList 就绪时序 | 🔴 |
roseau.gradle roseauCheck |
离线/无网络环境构建不阻塞 | 🔴 |
ExplosionSession |
并行切片边界(layer=96/97)、radius 边界、per-tick 上限 | 🟡 |
MultiblockState |
未加载区块快照复用、事件取消回滚 | 🟡 |
WheelWidget |
环形扇区角度归一化(负角/跨 2π)、shader null 回退 | 🟡 |
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched references/reverse-port-review-detail.md in skill 'reverse-port-pr-review' (1 replacement). · Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). |
🌿 Roseau API Breaking Change Report
|
- 回移植 aa59e37(Anvil-Dev#53)的模块化构建:新增 .github/modules.json 与 generate-matrix.js,ci/pull_request/release 改为 prepare → build/deploy-l0/l1/l2 → main 的分层矩阵 - 新增 roseau_check/roseau_comment 工作流并适配 1.21.1:任务名后缀 -neoforge-1.21.1,模块集剔除 rendering、纳入 explosion/rpc/yukkuri - 修复 roseauCheck 本机运行:roseau-cli 0.6.0 需 Java 25,降至 0.4.0;基线构件改由 rootProject 解析;任务改为 doFirst 内两次 javaexec 产出 CSV/HTML 报告 - 更新 #P19 跟踪文档:roseauCheck 本机验证通过(codec/rpc),L-1 遗留销账
🌿 Roseau API Breaking Change Report
🔴 config — 1 breaking change(s)
|
- 盘面新增半透明深色圆盘与毛玻璃模糊背景(WheelFrostedBackground + frosted_disc/blur shader) - 中心区域与扇区之间新增白色不透明细圆环分隔 - 中心留白垂直居中显示当前悬停项名称 - 新增贴分隔圆环内侧、指向鼠标方向的尖括号箭头与左右下角浮动翻页箭头(segment shader) - 高亮扇区在扇区间平滑滑动,停住后内外缘同步外扩 2px 且透明度由 20% 升至 100% - annular_sector shader 半径语义修正(直径→半径),WheelScreen 半径比例调整为 0.17/0.33 - 渲染适配 1.21.1 Tesselator + ShaderInstance 模式,不引入 module.rendering - module.test 演示菜单扩至 9/8 项并补齐图标渲染器,新增扇形效果按键 B/N
- 移除 branch-comparison.md 文档文件 - 清理关于 port/1.21.1 与 dev/26.1 分支对比的详细分析内容 - 删除包含 595 行的分支拓扑、提交主题对比、模块清单等完整报告 - 移除分支迁移相关的结论性内容与技术细节说明
|
所有扫描完成。汇总第 7 次 synchronize 复查结果: 代码审查摘要 — PR #97操作: synchronize(第 7 次复查) 📊 本次规模变化来源
✅ 反向 API 残留扫描(核心检查)
Ghost 文件 0、硬编码密钥 0、TODO/FIXME 0、lang 键对称(font 6/6、explosion 7/7)✅ 🔴 关键
|
|
💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). · Patched references/reverse-port-review-detail.md in skill 'reverse-port-pr-review' (1 replacement). |
🌿 Roseau API Breaking Change Report
🔴 config — 1 breaking change(s)
|
|
All scans complete. Compiling the review — this 代码审查摘要 — PR #97操作: ✅ 健康度扫描(全量重跑)
🔴 关键(待验证项,非新问题)
|
|
💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). · Patched references/reverse-port-review-detail.md in skill 'reverse-port-pr-review' (1 replacement). |
|
PR #97 已关闭(closed),按 webhook 约束停止审查,不发布评论。 操作: closed — 跳过审查流程(closed/labeled 事件不触发代码审查)。 |
No description provided.