Files
rtdd/tuilun/右键拦截白名单清单.txt
T
2026-09-30 12:54:42 +08:00

236 lines
14 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
========================================
右键拦截白名单清单(手持 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。