========================================
右键拦截白名单清单（手持 item 右键 功能方块）
（供"客户端拦截 + 白名单精确化"改造参考，审核稿）
========================================
说明:
- 本清单列出所有"手持物品右键某个功能方块"时, 需要【取消该物品默认行为
  (右键吃/放置)】、改由模组处理的 精确 (手持item, 被点block) 组合。
- 目标是"精确白名单, 不误伤": 只有以下组合会在客户端提前 cancel/ret,
  其余手持物品右键任何方块一律放行, 正常放置回归。
- 来源: 逐服务从代码中已注册的 itemUseOnRules 自动提取。

【分类】
  一、原版放置(相邻空格放置, 手持原版物品右键任意表面 -> 放置到相邻格)
      - 这类其实不强依赖"被点方块", 但右键时会触发原版"放置前摇";
        客户端拦截 key = 手持item(不做被点block限制), 取消后由服务端放块。
  二、盘子装盘(手持原版食物右键 空盘子 plate_0 -> 盘子变换)
  三、面食.甜食 手持转换(右键 烤炉/木碗/蒸笼)
  四、汤锅 手持转换(右键 熟面条碗)
  五、炒锅 盖饭转换(手持成品菜右键 米饭/米饭右键 成品菜)
  六、乡野食材 裹粉(手持生食材右键 面粉块)
  七、厨具 锅铲/带油锅铲(右键 油罐/炒锅)
  八、乡野自然 水稻种植(手持稻谷右键地面/水)
  九、寿司 手持方块物品右键自家寿司方块(取消默认放置)
  十、总食用 手持直接吃物品(饭团/水煮蛋/豆腐)


========================================
一、原版放置 (YuanbanService ITEM_USE_ON_RULES)
========================================
右键场景: 手持原版/自定义生食材 右键 任意方块表面 -> 在相邻空格放置切配块/生肉。
取消key: 手持item (客户端不限制被点block, 仅知道要取消放置, 由服务端落块)
- minecraft:chicken        -> 放置 生鸡肉(放置后) roastchickenplace_0
- minecraft:salmon         -> 放置 死鲑鱼 killfish_0
- minecraft:cod            -> 放置 死鳕鱼 killcod_0
- minecraft:fish(网易兼容) -> 放置 死鳕鱼 killcod_0
- minecraft:carrot         -> 放置 切胡萝卜 cutcarrot_0
- minecraft:potato         -> 放置 切土豆 cutpotato_0
- rtdd:qingcai(青菜)       -> 放置 切青菜 cutvegetable_0
- rtdd:scallions(葱)       -> 放置 葱花_1 cutscallions_1


========================================
二、盘子装盘 (YuanbanService PLATE_RULES)
========================================
右键场景: 手持原版食物 右键 空盘子(rtdd:plate_0) -> 盘子变为对应成品盘。
取消key: (手持item, 被点block=rtdd:plate_0)
- minecraft:pumpkin_pie    + plate_0 -> plate_16 (南瓜派盘)
- minecraft:cod            + plate_0 -> plate_17 (生鱼片盘)
- minecraft:salmon         + plate_0 -> plate_17
- minecraft:tropical_fish  + plate_0 -> plate_17
- minecraft:fish(网易)     + plate_0 -> plate_17
- minecraft:melon_slice    + plate_0 -> plate_18 (西瓜盘)
- minecraft:bread          + plate_0 -> plate_20 (面包盘)
- minecraft:cookie         + plate_0 -> plate_21 (曲奇盘)
- minecraft:cooked_chicken + plate_0 -> plate_4  (熟鸡肉盘)


========================================
三、面食.甜食 (Mianshi ITEM_USE_ON_RULES)
========================================
右键场景: 手持半成品 右键 烤炉/木碗/蒸笼。
取消key: (手持item, 被点block)
- rtdd:dought_7(生面饼)  + OVEN(rtdd:oven)   -> 烤炉上方放置 馍 roujiamo_0
- rtdd:farineblock_1(面粉加鸡蛋) + BOWL(rtdd:bowlasoup木碗)
  -> 木碗变 蛋糕面糊(生) cakebatterblock_0
- rtdd:dumplings_4(生饺子) + STEAMER(rtdd:steamer) -> 蒸笼变 蒸饺子(生) steamerdumplings_0, 计时
- rtdd:roubaozi_3(生肉包子) + STEAMER -> 蒸笼变 蒸包子(生) baozilong_1, 计时
- rtdd:bamboo_4(竹筒加肉)  + STEAMER -> 蒸笼变 竹筒饭(生) bamboo_6, 计时
- rtdd:plate_34(蛋液半成品) + STEAMER -> 蒸笼变 蒸牛奶鸡蛋 steamermilkandegg, 计时


========================================
四、汤锅 (Tangguo ITEM_USE_ON_RULES)
========================================
右键场景: 手持锅态汤方块 右键 熟面条碗(noodle_soup) -> 面条碗变对应汤面。
取消key: (手持item, 被点block=rtdd:noodle_soup)
- 蘑菇汤(rtdd:mushroomsoup)      -> mushroomnoodles(香菇面)
- 蔬菜汤(rtdd:vegetablesoup)     -> vegetable_noodles(蔬菜面)
- 蛋花汤(rtdd:eggsoup)           -> noodles_1(蛋花面)
- (该表还被组装成 胡萝卜牛肉汤等 熟品 -> 各汤面, 见 ITEM_USE_ON_RULES)


========================================
五、炒锅 盖饭 (Chaoguo ITEM_USE_ON_RULES)
========================================
右键场景: 双向转换(手持成品菜右键米饭 / 手持米饭右键成品菜)。
取消key: 手持item + 被点block 双向都要取消默认放置。
正向(手持成品菜 -> 右键 米饭 bowlofrice/2/3):
- 辣子鸡丁(plate_47)     -> 辣子鸡丁盖饭(全份) plate_48
- 香菇滑鸡(plate_54)     -> 香菇滑鸡盖饭(全份) plate_55
- 麻婆豆腐(plate_32)     -> 麻婆豆腐盖饭 plate_56
- 胡萝卜炒鳕鱼(plate_15) -> 鳕鱼盖饭 plate_50
反向(手持米饭 bowlofrice/2/3 -> 右键上述成品菜方块):
- 米饭三形态 右键 辣子鸡丁plate_47/香菇滑鸡plate_54/麻婆豆腐plate_32/胡萝卜炒鳕鱼plate_15
  被点方块原地变对应盖饭
蛋炒饭(手持米饭三形态 右键 炒锅_86 riceegg_2 -> 炒锅_87 riceegg_3):
- bowlofrice/2/3 x riceegg_2 = 3组


========================================
六、乡野食材 裹粉 (Shicai COATING_RULES)
========================================
右键场景: 手持生食材 右键 面粉块(farineblock_3) -> 裹粉。
取消key: 手持item + 被点block=rtdd:farineblock_3
- rtdd:sashimi(生鱼片) 等裹粉食材(具体清单见 ShicaiData.COATING_RULES)


========================================
七、厨具 (Chuju 锅铲/带油锅铲)
========================================
右键场景: 手持锅铲 右键 油罐/炒锅。
取消key:
- rtdd:spatula(锅铲) + rtdd:oilcan(油罐) -> 锅铲变带油锅铲, 油罐次数-1
- rtdd:spatula_oil(带油锅铲) + rtdd:oilcan -> 变回锅铲, 油罐次数+1
- rtdd:spatula_oil(带油锅铲) + rtdd:wok(炒锅) -> 炒锅变炒锅(添油), 油铲变回锅铲


========================================
八、乡野自然 水稻 (Natural RICE_PLANT)
========================================
右键场景: 手持稻谷 右键 水面/地面 -> 种植水稻。
取消key: 手持item=rtdd:rice_seeds(稻谷)


========================================
九、寿司 (Shousi)
========================================
右键场景: 手持寿司方块物品 右键 自家寿司方块 -> 取消默认放置(意图是堆叠/转换)。
取消key: 手持item=全部寿司方块物品 + 被点block=自家寿司方块
- 卷寿司/手握/寿司堆 等全部 sushiBlockItems 右键 自家方块


========================================
十、总食用 手持直接吃 (Shiyongfood TRY_USE_RULES)
========================================
右键场景: 手持物品 右键空中/方块 -> 直接吃(不放置)。
取消key: 手持item (ClientItemTryUseEvent cancel)
- rtdd:rice_balls(饭团)   -> 直接吃
- rtdd:boiled_egg(水煮蛋) -> 直接吃
- rtdd:beancurd(豆腐)     -> 直接吃


========================================
十一、盛出/出锅消闪 (InterceptData.TAKEOUT_CANCEL, 2026-09-23)
========================================
右键场景: 手持 木碗/盘子 右键 成品方块(汤锅成品/炒锅熟盘装/油锅熟炸物) -> 盛出/出锅。
问题: 手持可放置方块物品右键, 客户端先渲染一帧"放置前摇/幽灵方块",
服务端取消指令往返后才撤掉 -> "闪一下"(服务端顺序正确, 碗/盘从未真落, 见日志 FD-Placed-AFTER=air)。
方案: 客户端对该组合 ClientItemUseOnEvent ret=True(取消放置预览, 消闪)
   + NotifyToServer('TakeoutRequest') 显式通知服务端执行盛出(纠正"客户端拦截吞服务端盛出")。
取消key: (手持item, 被点block), 由 汤锅/炒锅/油锅 SWITCH_RULES 里 action=="take_out"
         且 item 是容器(木碗bowlasoup / 盘子plate_0) 的规则自动派生。
- 汤锅: 木碗(bowlasoup)/盘子(plate_0) + 各成品汤方块(30条, 含 美味饺子全份盘装plate_30a)
- 炒锅: 盘子(plate_0) + 各炒锅熟成品(38条, 含蛋炒饭 riceegg_3)
- 油锅: 盘子(plate_0) + 6条熟炸物方块
特殊:
- 空手取出(item=None, 捏饭团/取水煮蛋/煎饼/馍出锅)、菜刀(item=CLEAVER)不走此路, 照旧 ServerBlockUseEvent。
- 服务端在 FeatureDispatcher.OnTakeoutRequest -> 各 Service.handleTakeoutRequest,
  校验落点仍是成品方块才执行(防客户端事件与服务端事件双份)。


========================================
十二、盖饭/蛋炒饭 消闪 (InterceptData.GAI_FAN_CANCEL, 2026-09-23)
========================================
右键场景: 手持 成品菜 右键 米饭(盖饭正向) / 手持 米饭 右键 成品菜(盖饭反向) /
          手持 米饭 右键 炒锅蛋炒饭(蛋炒饭改造)。
问题: 这些组合走 ServerItemUseOnEvent, 但也被 ITEM_USE_ON_CANCEL 纯 ret=True 吞掉,
导致服务端 ServerItemUseOnEvent 不触发 -> 盖饭"点无反应"(与盛出被吞同机制)。
方案: 客户端对该组合 ret=True(消闪) + NotifyToServer('GaifanRequest') 显式触发
      -> FeatureDispatcher.OnGaifanRequest -> ChaoguoService.handleItemUseOn。
取消key: (手持item, 被点block), 由 ChaoguoData.ITEM_USE_ON_RULES 的 surface 字段自动派生
         (盖饭正向/反向 + 蛋炒饭改造, 共若干组)。

【通用】客户端 1.5 秒放置冷却(_afterCd): 盛出/盖饭/出锅后, 同一坐标短时间内引擎
再触发的"放置"直接 ret 吞掉, 消除"转换后多放置一次"的闪烁 (2026-09-23)。


========================================
十三、其余 itemUseOn 转换 统一显式事件修复 (InterceptData / FeatureDispatcher, 2026-09-23)
========================================
问题: 与盖饭同款 —— 客户端对"走 handleItemUseOn 的 itemUseOn 转换"纯 ret=True 时,
会吞掉服务端 ServerItemUseOnEvent, 导致一端(面食/汤锅/装盘/相邻放置/厨具蘸油/寿司/
裹粉/种水稻)转换"点无反应"。
方案: 客户端对所有这些组合改为 ret=True(消闪) + NotifyToServer('ItemUseOnRequest')
显式触发; 服务端新增 FeatureDispatcher.OnItemUseOnRequest, 复用按 itemName 路由到
itemUseOnAll 各服务 handleItemUseOn(与 OnGaifanRequest 同机制), 逐个 fallback。
去重: 各服务 handleItemUseOn 自带 checkCooldown(同坐标/同物品), 即使与真实
ServerItemUseOnEvent 重复触发也会被冷却拦截, 不双重消耗。
- 一、原版相邻放置(手持原版生食右键任意表面 -> 相邻格放切配块/生肉) [已统一]
- 二、盘子装盘(手持原版食物右键 plate_0 -> 盘子变换) [已统一]
- 三、面食.甜食 手持转换(右键 烤炉/木碗/蒸笼) [已统一]
- 四、汤锅 手持转换(右键 熟面条碗 -> 汤面) [已统一]
- 六、乡野食材 裹粉(手持生食材右键 面粉块) [已统一]
- 七、厨具 锅铲/带油锅铲(右键 油罐/炒锅) [已统一]
- 八、乡野自然 水稻种植(手持稻谷右键地面) [已统一]
- 九、寿司 手持方块物品右键自家寿司方块(取消默认放置) [已统一]
- 十、总食用 手持直接吃(饭团/水煮蛋/豆腐, 右键表面吃) [已统一]
【注意】"相邻放置/装盘"分支(ITEM_USE_ON_CANCEL_BY_ITEM)因被点【表面坐标】不变,
不设 _afterCd(避免误吞同一表面 1.5s 内连续放置), 去重交给服务端 handleItemUseOn 冷却。
"盖饭/蛋炒饭"(GAI_FAN_CANCEL)、"盛出/出锅"(TAKEOUT_CANCEL) 仍用各自专用事件, 不变。


========================================
十四、"任意物品"功能方块的整块拦截 (InterceptData.BLOCKUSE_CANCEL_ANY_BLOCKS, 2026-09-30)
========================================
问题: 垃圾桶规则是 item="*any"(任意非空物品), 不在 (item, block) 精确派生范围内
(BLOCKUSE_CANCEL 派生时显式跳过通配 item) -> 客户端不拦:
- 手持葡萄等食物右键垃圾桶(打开): 原版先"吃", 服务端再取消已晚 -> "一边吃一边清空";
- 手持胡萝卜等方块物品右键垃圾桶: 原版先"放置" -> 垃圾桶旁直接多放一块。
方案: 新增按【被点方块】整块拦截的集合 BLOCKUSE_CANCEL_ANY_BLOCKS:
  客户端 OnItemUseOn 命中该方块(手持任意非空物品) -> ret=True(消闪) + NotifyToServer
  ('BlockUseRequest') 走服务端 handleBlockUse; 并在 OnItemTryUse 用玩家级 0.2s 窗口
  (_anyBlockPlayer)取消同一右键伴随的那次"吃/用"。
派生: 各 _BLOCK_USE_TABLES 中 item=="*any" 且【无 below 前置条件】的规则的 source 方块。
- 垃圾桶三态: rtdd:storage_buckets(关) / rtdd:rubbish_bin_2(打开,掉垃圾清空主手) / rtdd:b_160(有垃圾)
【排除】带 below 的"任意物品"规则(如丸子机 meatballmaker_2 需下方有炉灶)不纳入:
客户端无法判断 below 条件, 无条件拦会吞掉条件不满足时玩家正常的吃/放置。


========================================
十五、冰棍盒/炒冰盒 整条"放料"链消闪 (YinliaoData.LOLLY_FRYICE_BLOCKUSE, 2026-09-30)
========================================
问题: 冰棍盒/炒冰盒的"放冰→放水果→取成品"链是内联实现(YinliaoService
_handleLollyBox / _handleFryIceBox), 不在 Data 规则表 -> 未进 BLOCKUSE_CANCEL:
- 放冰步: 冰块是【可放置方块物品】-> 原版先播"放置"前摇 -> 闪一下;
- 放水果步: 水果多为【可食用】(苹果/西瓜片 原版, 葡萄/桃子/橙子 rtdd)
  -> 原版当"吃"吞掉 -> 手持原版物品会吃、手持葡萄也会吃。
方案: YinliaoData.LOLLY_FRYICE_BLOCKUSE 罗列整条链组合, 注册进
InterceptData._BLOCK_USE_TABLES 后自动进入 BLOCKUSE_CANCEL, 客户端提前 ret +
BlockUseRequest 消闪并禁止默认 吃/放置, 服务端 handleBlockUse 照常换态。
- 放冰:   各冰块(minecraft:ice / packed_ice / blue_ice / frosted_ice)
          × rtdd:icelollybox_1(冰棍盒未定型) 与 rtdd:frytheicebox(炒冰盒空)
- 放水果: POPSICLE_FRUITS 各水果 × rtdd:icelollybox_2(冰棍盒定型)
          FRYICE_FRUITS   各水果 × rtdd:frytheicebox_1(炒冰盒已放冰)
【未含】各水果盒/冰沙盒的"空手右键取成品"(item=None) —— 空手不涉及放置/
吃, 无需拦截, 仍走正常 ServerBlockUseEvent。