Skip to content

Modify the crab trap logic with 1.21.1 修改1.21.1版本的蟹笼的逻辑#3967

Merged
Gu-ZT merged 7 commits into
Anvil-Dev:dev/1.21/1.6from
burin-ljx:crab_trap
Jul 3, 2026
Merged

Modify the crab trap logic with 1.21.1 修改1.21.1版本的蟹笼的逻辑#3967
Gu-ZT merged 7 commits into
Anvil-Dev:dev/1.21/1.6from
burin-ljx:crab_trap

Conversation

@burin-ljx

Copy link
Copy Markdown
Contributor

@burin-ljx burin-ljx marked this pull request as draft July 3, 2026 06:23
@Gugle2308

Copy link
Copy Markdown
Collaborator

⚠️ Dangerous command requires approval:

echo "=== common.json 完整结构(非 diff,检查条目)===" && curl -sL "https://raw.githubusercontent.com/Anvil-Dev/AnvilCraft/dev/1.21/1.6/src/generated/resources/data/anvilcraft/loot_table/gameplay/crab_trap/commo...

Reason: Security scan — [MEDIUM] Schemeless URL in sink context: URL without explicit scheme passed to a command that downloads/executes content; [MEDIUM] Schemeless URL in sink context: URL without explicit scheme passed to a command that downloads/executes content; [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection.
Safer: tirith run https://raw.githubusercontent.com/Anvil-Dev/AnvilCraft/dev/1.21/1.6/src/generated/resources/data/anvilcraft/loot_table/gameplay/crab_trap/common.json — or: vet https://raw.githubusercontent.com/Anvil-Dev/AnvilCraft/dev/1.21/1.6/src/generated/resources/data/anvilcraft/loot_table/gameplay/crab_trap/common.json (https://getvet.sh); [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection.
Safer: tirith run https://raw.githubusercontent.com/Anvil-Dev/AnvilCraft/dev/1.21/1.6/src/generated/resources/data/anvilcraft/loot_table/gameplay/crab_trap/ocean.json — or: vet https://raw.githubusercontent.com/Anvil-Dev/AnvilCraft/dev/1.21/1.6/src/generated/resources/data/anvilcraft/loot_table/gameplay/crab_trap/ocean.json (https://getvet.sh)

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

@Gugle2308

Copy link
Copy Markdown
Collaborator

我现在掌握了完整的变更情况,以下是我的审查。


代码审查摘要

PR #3967 — 修改蟹笼逻辑(BlockEntity → BlockState 属性重构)

总体评价:请求更改(1 个关键问题,2 个警告,2 条建议)


🔴 关键

  • 翻译键名拼写错误:crap_trapcrab_trap

    ScreenLang.java 中新增的翻译键为 tooltip.anvilcraft.crap_trap.state_name("Crap Trap State"),但正确拼写应为 crab_trap

    影响面: 该键同时出现在:

    • ScreenLang.java(数据生成源)
    • CrabTrapTooltipProvider.java(运行时引用)
    • en_us.jsonen_ud.json(生成资源)

    建议: 全部改为 tooltip.anvilcraft.crab_trap.state_name。对比 Jade 的翻译键 tooltip.anvilcraft.crab_trap.jade.finishing 正确使用了 crab_trap,同一功能不应有两种命名。


⚠️ 警告

  • 文件末尾缺少换行符(EOF newline)

    CrabTrapBlockStateProvider.java(新文件)末尾缺少 POSIX 换行符。数据生成器产出的资源文件不应有此类问题,手动编写的新源文件更应注意。

  • 产出量激增风险:6个生物群系战利品表全部无条件触发

    旧设计中每个战利品表有 10%(0.1f)的几率产出,新设计中改为 1.0f(必定产出)。加上 harvest 循环 for (i = 1; i < FINISHING + 1; i++)FINISHING=15 时执行 15 次 × 6 个战利品表 = 90 次 loot table 调用,每轮产出约 90 个物品 + 3 个蟹钳。而蟹笼仅需 3 面邻水即可在约 17 分钟内自然累积满,导致单次收获产出远超旧版。

    建议: 考虑要么降低 FINISHING 上限(如 5~8),要么在 loot 循环中对部分战利品表保留概率抽取(不全部改为 1.0),以控制单次产出量。


💡 建议

  • 不同生物群系的蟹笼产出应区分

    当前实现中,无论蟹笼放置于河流、海洋还是丛林生物群系,harvest 时都从全部 6 个战利品表中生成物品。旧代码也存在同样问题,但旧版因 0.1f 概率加上 BE 库存容量限制(9 slots),实际产出仍有限。新版无库存限制后应该利用生物群系上下文做过滤,使河边的蟹笼只出河流战利品,海边的只出海洋战利品。

  • Finishing 上限为 15,但等待时间较长

    从 0 到 15 需要 15 个随机刻(平均 17 分钟),而旧版每次随机刻都有概率直接产出。新版用户需要等待更久才能收获一次。可考虑将上限降低到 58,或增加 FINISHING 的递增速度(多次邻水判定时一次增加 2 或 3)。


✅ 看起来不错

  • 架构合理性:从 BlockEntity + IItemHandler 改为 BlockState IntegerProperty,去掉了 BE 序列化/反序列化、onLoad/setRemoved 生命周期管理、Capability 注册等复杂依赖,设计更简洁。
  • 删除完整性CrabTrapBlockEntity.javaCrabTrapStorageProvider.javaModBlockEntities 中的注册行三者全部删除,旧类名未在新增行中出现残留 ✅
  • Jade/WTHIT 迁移完善:旧 CrabTrapStorageProvider(基于 BE inventory)被替换为 CrabTrapBlockStateProvider(基于 BlockState),服务端和客户端注册均已同步更新 ✅
  • Tooltip 迁移:HUD 从 BE 改为 BlockState 读取 FINISHING 值,注册为 BlockTooltipProvider 而非 BlockEntityTooltipProvider
  • 铁砧行为和右键行为一致HitCrabTrapBehavior.handle()CrabTrapBlock.useWithoutItem() 使用相同的 loot 生成逻辑,都正确重置 FINISHING=0
  • 红石比较器输出:新增 hasAnalogOutputSignal + getAnalogOutputSignal 返回 FINISHING 值,向外暴露进度 ✅
  • 客户端守卫:所有交互方法(useWithoutItemHitCrabTrapBehavior.handle)正确添加 isClientSide() 守卫 ✅

结论: 重构方向合理(BE → BlockState),整体迁移完整度高。主要阻塞项为翻译键拼写错误,建议修复后合并。产出量平衡问题建议在后续 PR 中优化。

@Gugle2308

Copy link
Copy Markdown
Collaborator

⚠️ Dangerous command requires approval:

echo "=== 确认 randomTick 中 FINISHING 增量逻辑 ===" && grep -B2 -A5 "FINISHING" /tmp/pr3967-java.diff | grep "randomTick\|setValue\|FINISHING" && echo "" && echo "=== 检查 useWithoutItem 的 loot 生成循环性能 ===" &&...

Reason: Security scan — [HIGH] Confusable Unicode characters in text: Content contains Unicode characters visually identical to ASCII (math alphanumerics, Cyrillic/Greek lookalikes) appearing near ASCII text, which may indicate a homoglyph attack

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

@Gugle2308

Copy link
Copy Markdown
Collaborator

基于对 PR #3967 的 diff 分析(786 行,20 文件),以下是审查结果。


代码审查摘要

结论:请求更改 — 发现 2 个关键问题,1 个警告,3 条建议

🔴 关键

  1. 所有战利品表 randomChance 从 0.1 改为 1.0,导致产出暴增约 100 倍

    文件:CrabTrapLootSubProvider.java(所有 6 个战利品表)及对应的生成 JSON 文件

    // 旧: .when(LootItemRandomChanceCondition.randomChance(0.1f))
    // 新: .when(LootItemRandomChanceCondition.randomChance(1))

    旧逻辑:每次 randomTick 尝试向 BE 插入战利品,每个表 10% 概率 → 平均每 tick ~0.6 件物品累积进库存。
    新逻辑:useWithoutItem / HitCrabTrapBehavior 中循环 FINISHING 次调用 generateLoot(),每个表 100% 概率。
    以 FINISHING=15 计算:15 次 × 6 个表 × 1 件物品 ≈ 90 件物品/次收获。

    建议: 如果希望保持每 tick 1 件物品的总产出,应将每个表的 randomChance 改为约 0.17f(≈ 1/6),而非 1.0。当前 90 件/次相对旧版 ~9 件/周期(15 tick × 0.6)是 10 倍提升,且所有产出集中在一次交互中释放,显著改变了平衡。

  2. 战利品每次交互重新随机生成,非累积型

    generateLoot() 每次都通过 lootTable.getRandomItems(lootParams) 从战利品表全新抽取。这意味着玩家在 FINISHING=15 时交互获得的物资与 15 次 randomTick 期间实际"捕获"的内容毫无关系。每次交互都是一个独立的全新随机池。如果玩家存档重载,同样的 FINISHING 值可能产生完全不同的一组物品。

    建议: 考虑在 randomTick 增量时即生成并存储物品(例如存为 List 到 BlockEntity 或 DataComponent),而非在交互时批量重抽。或者至少为每次 randomTick 记录一个随机种子到 BlockState 属性中,使 loot 生成确定性。

⚠️ 警告

  1. useWithoutItem 返回 InteractionResult.CONSUME 而非 SUCCESS

    return InteractionResult.CONSUME;

    对于不使用物品的方块交互(useWithoutItem),服务端通常返回 SUCCESSCONSUME 的语义是"交互已被消费且不会触发后续操作",可能阻碍其他事件或模组的兼容性处理。建议改为 InteractionResult.SUCCESS

💡 建议

  1. HitCrabTrapBehavioruseWithoutItem 的物品掉落位置不一致

    • useWithoutItem:掉落位置在 pos.relative(Direction.UP).getCenter()(方块正上方中心)
    • HitCrabTrapBehavior:掉落位置在 hitBlockPos.above().relative(facing).getCenter().relative(facing.getOpposite(), 0.5)(方块上方靠朝向方向便宜 0.5 格)

    玩家右击与铁砧砸落获得物品的位置不同,可能引起困惑。建议统一掉落位置(例如统一在方块上方中心)。

  2. CrabTrapBlockStateProvider.java 末尾缺失换行符

    No newline at end of file

    同时旧 CrabTrapStorageProvider.java 也有此问题(但已删除)。建议为新增的文件补上末尾换行符以避免 POSIX 兼容性问题。

  3. Property 名称 finishing 语义不够直观

    该属性实际上表示"捕获进度计数器"(0-15,每次 randomTick 在足够水源时 +1),finishing(完成度)可能暗示"快要完成了"。建议改为 catch_levelprogress 以更清晰表达其功能。

✅ 看起来不错

  • BE→BlockState 重构干净完整CrabTrapBlockEntity.java 删除、ModBlockEntities 注册移除、所有引用同步更新,无残留引用
  • FINISHING 0-15 范围完美映射 comparator 输出getAnalogOutputSignal 直接返回 state.getValue(FINISHING),红石玩家可据此读取进度
  • Jade/HUD 工具提示正确迁移:从 CrabTrapStorageProvider(显示库存)改为 CrabTrapBlockStateProvider(显示 FINISHING 值),迁移路径清晰
  • 语言文件双向同步en_us.jsonen_ud.json 都正确新增了 crab_trap.jade.finishingcrap_trap.state_name 两条
  • randomTick 水源检测逻辑保留:≥3 面相邻水的守卫条件不变,只是从插入战利品改为递增计数器
  • isClientSide() 守卫正确HitCrabTrapBehavior 新增了客户端守卫,useWithoutItem 中也正确分支到客户端返回 SUCCESS

由 Hermes Agent 自动审查

@Gugle2308

Copy link
Copy Markdown
Collaborator

我现在已完成对 PR #3967 的全面审查。以下是完整的审查意见。


PR #3967 代码审查摘要

结论:请求更改(1 个关键问题,1 条建议)

PR 概要:将蟹笼从 BlockEntity + ItemStackHandler 存储模式重构为 BlockState Property (FINISHING) 驱动模式。移除 BE 和旧的 Jade 存储 Provider,新增基于 BlockState 的 FINISHING 计数器、Jade/HUD 状态显示和比较器输出。


🔴 关键

1. 战利品产量爆炸性增长 — CrabTrapLootSubProvider.java + HitCrabTrapBehavior.java

randomChance0.1f 改为 1.0(所有 6 个 loot table)+ 按 FINISHING 层级循环生成 = 产量激增 ~10 倍以上

旧系统:每 randomTick → 6 tables × 10% → avg 0.6 items/tick → ~9 items 最多
新系统:FINISHING=15 时开启 → 15 级 × 6 tables × 100% = 90 items + 3 蟹爪

这导致一次收获的战利品数量远超旧版。请确认这是有意的调整。如果是的话,请在 PR 描述中说明平衡性考虑;如果不是,建议考虑以下方案:

  • 恢复 randomChance(0.1f) + 在 loot table 层面做每级单次 roll(而非每级 6 次)
  • 或降低 loot table 的 rolls 值(如 ConstantValue.exactly(0.2f) + bonus_rolls: 0.0

⚠️ 警告

2. CrabTrapBlockStateProvider.java 缺少末尾换行符

+}\n\ No newline at end of file

该文件末尾缺少 POSIX 换行符。虽然是简单问题,建议运行数据生成器重新生成或手动补上。


💡 建议

3. HitCrabTrapBehavior.handle()CrabTrapBlock.useWithoutItem() 中存在重复的战利品生成循环

两处代码几乎完全相同的循环:

// HitCrabTrapBehavior.java (line 154-159) 和 CrabTrapBlock.java (line 466-471)
for (int i = 1; i < FINISHING + 1; i++) {
    items.addAll(generateLoot(..., CRAB_TRAP_COMMON));
    items.addAll(generateLoot(..., CRAB_TRAP_RIVER));
    // ... 共 6 个 loot table
    if (i % 5 == 0) items.add(CRAB_CLAW.asStack());
}

建议将整个循环提取为 CrabTrapBlock 的静态方法(如 dumpLoot(Level, BlockPos, int finishing)),统一入口,方便后续调整 loot 逻辑时只需改一处。

4. randomTick 频率与 FINISHING 增长速度

randomTick 在至少 3 面邻水时每次随机 tick +1 FINISHING,最大 15。在 Minecraft 中 random tick 平均 ~68 秒/次(g=3),所以满 15 级大约需要 17 分钟。这是合理范围,但建议在 PR 描述中明确说明预期等待时间。


✅ 看起来不错

  • 架构重构干净:从 BE+Inventory 改为 BlockState Property,无需维护持久化物品数据,设计简洁
  • useWithoutItem 正确使用 26.1 新 API:替代了旧的 use(InteractionHand) 签名 ✅
  • 比较器输出hasAnalogOutputSignal(true) + getAnalogOutputSignal 返回 FINISHING 值 (0-15),允许红石交互 ✅
  • rotate/mirror 保留:方向变换逻辑不受影响 ✅
  • en_ud.json 同步:新翻译键已在翻转语言文件中正确镜像 ✅
  • 相邻注册删除无污染:ModBlockEntities 中 CRAB_TRAP 的删除干净,不影响相邻的 CORRUPTED_BEACON ✅
  • onRemove 不需要:因无 BE/Inventory,删除 onRemove override 正确 ✅
  • Jade/HUD 工具提示一致性CrabTrapBlockStateProviderCrabTrapTooltipProvider 都使用 FINISHING 值显示进度,信息源一致 ✅
  • generateLoot() 提取为静态方法:虽然循环体重复,但底层的 loot table 调用已封装为可复用的静态方法 ✅

由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown
Collaborator

我已下载并分析完所有差异文件。按 PR 规模(20 个文件,786 行 diff),以下是完整的审查结果。


代码审查摘要

PR #3967 — 蟹笼逻辑重构:从 BlockEntity + IItemHandler 存储改为 BlockState IntegerProperty FISHING 计数 + 即时战利品生成


🟢 主要更改概览

变更类型 文件数 说明
重构范围 12 个 Java 源文件 移除 BlockEntity,用 BlockState 属性替代
删除 2 个文件 CrabTrapBlockEntity.javaCrabTrapStorageProvider.java
新增 2 个文件 CrabTrapTooltipProvider.javaCrabTrapBlockStateProvider.java
生成资源 8 个文件 战利品表 JSON 和语言文件重新生成
无实际变更 0 所有文件都有真实改动

架构变更

  • 旧模式:铁砧击打 → 生成战利品 → 存入 CrabTrapBlockEntity(9 格 ItemStackHandler)→ 玩家右键逐一取出
  • 新模式randomTick 逐环境面检查 3 面水源 → FISHING+1(上限 15),铁砧击打/右键空手 → 按 FISHING 层数即时生成战利品并洒落 → FISHING 归零
  • 红石输出:新增 hasAnalogOutputSignal + getAnalogOutputSignal,比较器可读取捕蟹进度 ∑ 信号强度 = FISHING 值

🔴 关键

  1. CrabTrapLootSubProvider 战利品概率从 0.1f1.0(10 倍提升),缺乏设计说明

    所有 6 张战利品表(common/river/ocean/warm_ocean/swamp/jungle)都把 LootItemRandomChanceCondition.randomChance 从 0.1f 改成了 1.0。

    影响评估:在 FISHING=15 时,单次收获会触发:

    15 层 × 6 张表 = 90 次 roll(现均为 100% 触发)
    + 每 5 层额外 1 个 CRAB_CLAW = 3 个保底
    → 单次掉落约 90+ 个物品
    

    对比旧行为:旧系统每 randomTick(~3 秒)有 10% 几率生成一个物品存入箱中,玩家事后统一取出。新系统是一次性将 90+ 个物品全部洒落在地上。即使大部分是海草,性能影响和掉落物散落范围也不容忽视。如概率 1.0 是设计目标,建议添加注释说明理由。 如果是调试残留,请恢复为 0.1f

    建议方案

    • 保持旧概率 0.1f,利用「FISHING 层数 × 多次尝试」的累积效应替代单次高概率;或
    • common 池外单独控制稀有物品概率

⚠️ 警告

  1. HitCrabTrapBehavior.handle()CrabTrapBlock.useWithoutItem() 中战利品生成逻辑完全重复

    // 完全相同的一段逻辑在两处出现:
    for (int i = 1; i < state.getValue(FISHING) + 1; i++) {
        items.addAll(generateLoot(..., CRAB_TRAP_COMMON));
        items.addAll(generateLoot(..., CRAB_TRAP_RIVER));
        // ... 6 张表 + i % 5 == 0 CRAB_CLAW
    }

    问题:这是 copy-paste 的重复代码。未来修改战利品表组合或添加新表时,必须同步修改两处,极易遗漏。建议提取为静态方法(如 CrabTrapBlock.harvest(ServerLevel, BlockPos, int fishingLevel))。

  2. CrabTrapBlockStateProvider.java 缺少末尾换行符(No newline at end of file)

    $ echo >> src/main/java/dev/dubhe/anvilcraft/integration/jade/provider/CrabTrapBlockStateProvider.java

    新文件不符合 POSIX 规范。旧被删除文件也有此问题,但不应在新文件中延续。

  3. FISHING 属性最大值 15 但在 randomTick 中写死 < 15

    if (times >= 3 && state.getValue(FISHING) < 15) {

    IntegerProperty.create("fishing", 0, 15) 已定义了上限。< 15 意味着 FISHING 最大值为 14,而非属性定义中的 15。应改为 < 16<= 15 或直接依赖属性边界不写守卫(属性自身会拒绝超出范围的值)。


💡 建议

  1. useWithoutItem 返回 InteractionResult.CONSUME 而非 SUCCESS

    use() 返回 SUCCESSCONSUME 在服务端和客户端都视为已处理,行为上与 SUCCESS 相似但语义不同(CONSUME 表示消耗了玩家的操作但未消耗物品)。1.21.1 中建议对非物品交互使用 SUCCESS,除非明确需要阻止副手交互。参见 NeoForge 文档。

  2. generateLootpublic static 方法但仅在 PR 内部两个地方使用

    建议改为 private static 或提取到独立工具类以减少 API 暴露面。

  3. 语言文件新增 key 的跨语言同步

    en_us.json 新增了 2 个 key:

    • tooltip.anvilcraft.crab_trap.jade.fishing
    • tooltip.anvilcraft.crab_trap.state_name

    en_ud.json(反向镜像)已同步 ✅。但 PR 描述未说明是否需要其他社区语言(如 zh_cn.json)的翻译。建议补充或创建 issue 跟踪翻译需求。


✅ 看起来不错

  • 架构简化:移除 BlockEntity 和 IItemHandler,使用 BlockState 属性跟踪进度,显著降低复杂度
  • Jade/HUD 集成完整:旧 CrabTrapStorageProvider(展示 BE 库存)正确替换为 CrabTrapBlockStateProvider(展示 FISHING 进度);HudTooltipManager 中新增了 CrabTrapTooltipProvider
  • ModBlockEntities 清理彻底:CRAB_TRAP 条目被删除,CrabTrapBlockEntity import 被移除,无残留引用
  • AnvilCraftJadePlugin 正确更新:blockDataProvider 和 blockComponent 都从旧 BE 类迁移到了 Block 类
  • onRemove 被移除:之前用于从 BE 中掉落物品,新模式无库存需要维护,删除合理
  • isClientSide() 守卫一致HitCrabTrapBehavioruseWithoutItem 开头都有客户端守卫
  • 战利品表 JSON 生成一致性:所有 6 张战利品表的 chance 更改在 JSON 中也同步更新 ✅

总结

结论:请求更改(1 个关键问题 + 3 个警告需修复后合并)

等级 计数
🔴 关键 1 — 战利品概率 10 倍提升需确认设计意图
⚠️ 警告 3 — 重复逻辑、EOF 换行符、FISHING 边界值
💡 建议 3 — 返回类型、API 可见性、跨语言翻译
✅ 良好 7 — 架构简化、Jade/HUD 集成、清理完整性

@burin-ljx burin-ljx marked this pull request as ready for review July 3, 2026 08:09
@Gugle2308

Copy link
Copy Markdown
Collaborator

现在我已经完整理解了所有的变更。以下是审查结果。


代码审查摘要:PR #3967 — 蟹笼逻辑重写

结论:COMMENT(建议) — 架构设计方向正确,但有两个需注意的问题和一个代码质量建议。


架构变更概述

此 PR 从根本上重构了蟹笼的工作方式:

旧设计(BE 存储模式):

randomTick → tryInsertLoot(0.1 chance) → 存入 9 格 Inventory BE
use() / anvil hit → 从 BE 取出物品 → 投出

依赖 CrabTrapBlockEntity(含 ItemStackHandler 9 slots)、IItemHandlerHolder、NBT 序列化。

新设计(BlockState 计数 + 即时生成模式):

randomTick → FISHING++ (max 15)
useWithoutItem() / anvil hit → 按 FISHING 次数 × 6 张战利品表即时生成 → 投出 → FISHING = 0

完全移除了 BlockEntity。通过 IntegerProperty FISHING(0,15) 替代了库存存储。

这是一个清晰且正确的架构改进。 BE 的移除减少了内存占用、tick 开销和 NBT 序列化复杂度。红石模拟输出(getAnalogOutputSignal 直接返回 FISHING 值)也是旧设计所缺的加分项。


🟢 看起来不错

  • CrabTrapBlockBetterBaseEntityBlock 改为 Block — 干净地移除了所有 BE 相关覆写(codec()newBlockEntity()getRenderShape()onRemove()
  • generateLoot() 提取为 static public 方法 — 可被 HitCrabTrapBehavior 直接复用
  • createBlockStateDefinition 正确加入了 FISHING — 且 getStateForPlacementdefaultState 正确设初始值 0
  • HitCrabTrapBehavior 加入了 level.isClientSide() 守卫 — 旧代码没有,这是改进
  • Jade 插件迁移干净AnvilCraftJadePluginregisterItemStorage(CrabTrapStorageProvider, CrabTrapBlockEntity)registerBlockDataProvider(CrabTrapBlockStateProvider, CrabTrapBlock),两端(common + client)都同步更新
  • CrabTrapStorageProvider.java 完整删除 — 无残留引用
  • 语言文件同步en_us.jsonen_ud.json 的 key 一一对应(含反转文本)
  • 战利品表 chance 变更一致CrabTrapLootSubProvider.java 和 6 个生成的 JSON 文件全部从 0.1 改为 1,没有遗漏
  • 红石信号hasAnalogOutputSignal(true) + getAnalogOutputSignal 返回 FISHING 值,使红石比较器可读取积累进度,这是原本缺失的功能

⚠️ 警告

1. CrabTrapBlockStateProvider.java 末尾缺失换行符

+# 最后一行:}\
+No newline at end of file

虽然是生成资源文件,但会导致 git diff 标记和 POSIX 兼容性问题。建议在数据生成器中检查或在提交前手动添加。


💡 建议

2. 战利品生成逻辑重复(两个地方完全相同)

CrabTrapBlock.useWithoutItem()HitCrabTrapBehavior.handle() 中的核心循环完全一致:

for (int i = 1; i < state.getValue(FISHING) + 1; i++) {
    items.addAll(generateLoot(level, pos, ModLootTables.CRAB_TRAP_COMMON));
    items.addAll(generateLoot(level, pos, ModLootTables.CRAB_TRAP_RIVER));
    items.addAll(generateLoot(level, pos, ModLootTables.CRAB_TRAP_OCEAN));
    items.addAll(generateLoot(level, pos, ModLootTables.CRAB_TRAP_WARM_OCEAN));
    items.addAll(generateLoot(level, pos, ModLootTables.CRAB_TRAP_SWAMP));
    items.addAll(generateLoot(level, pos, ModLootTables.CRAB_TRAP_JUNGLE));
    if (i % 5 == 0) items.add(ModItems.CRAB_CLAW.asStack());
}

建议提取为静态方法,例如 CrabTrapBlock.harvestLoot(ServerLevel, BlockPos, int fishingCount),统一一处修改维护。未来若需要调整战利品生成逻辑(如增减表格、修改 CRAB_CLAW 频率),两处同步更新容易遗漏。

3. FISHING=15 时战利品产出量可能过高

当玩家收获一个满级蟹笼(FISHING=15)时:

  • 每次收获生成:15次 × 6张战利品表 = 90次战利品抽取
  • 每次抽取 chance=1.0(对比旧版 0.1),全部必出
  • 每 5 次额外产出 1 个 CRAB_CLAW(共 3 个)
场景 旧版(每 tick 0.1×6 概率) 新版(满 FISHING 收获)
单次产出物品数量 ~0.6 个/tick(被库存容量限制) 90 个(一次性全部投出)

建议确认是否经过了 playtest 验证:满级蟹笼一脚踩出 90 个物品(加掉落的 15 格实体)会不会造成性能或体验问题。如果视觉/性能上需要控制,可考虑:

  • 降低 FISHING 最大值(如 5 或 8)
  • randomTick 中给每 tick 设置 chance < 1 的递增概率(旧系统用 0.1 而新版用 100% 的增量)

🔍 额外检查点验证

检查项 结果
BE 删除完整性:ModBlockEntities.CRAB_TRAP 已移除
CrabTrapStorageProviderCrabTrapBlockStateProvider 替换 ✅ 两端同步
Java 导入更新(CrabTrapBlockEntity 引用已全部清除)
rotate()/mirror() 保留 ✅(位置调整但功能不变)
SimpleWaterloggedBlock 实现保留
IHammerRemovable 兼容性(不依赖 BE)
randomTickWATERLOGGED 检查和旧逻辑一致
客户端守卫 (level.isClientSide()) ✅ 在 useWithoutItemHitCrabTrapBehavior 中都有
语言文件同步(en_us ↔ en_ud)
战利品表 chance 一致性(源码 + 6 个 JSON)

总结: 架构层面是一次干净的改进 — 消灭了一个仅做 9 格库存的 BE,用 BlockState 属性和即时战利品生成替代,减少了内存和 tick 开销,增加了红石可观测性。主要建议是提取重复的战利品生成逻辑,并关注新版满级产出量的游戏平衡性。

—— 由 Hermes Agent 审查

@Gu-ZT Gu-ZT merged commit 8c4c2cd into Anvil-Dev:dev/1.21/1.6 Jul 3, 2026
2 checks passed
@Gugle2308

Copy link
Copy Markdown
Collaborator

PR #3967 已关闭(closed),根据审查流程第 0 步:"closed" / "labeled" → 停止,不发评论。

无需审查。

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.

[TODO] 蟹笼调整

3 participants