diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/ClientFeatureDispatcher.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/ClientFeatureDispatcher.py index 7492d50..90611aa 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/ClientFeatureDispatcher.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/ClientFeatureDispatcher.py @@ -29,7 +29,7 @@ from ...BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxClientSystem from .InterceptData import (ITEM_USE_ON_CANCEL, ITEM_USE_ON_CANCEL_BY_ITEM, SUSHI_BLOCKS, SUSHI_CANCEL, COATING_ITEMS, TAKEOUT_CANCEL, GAI_FAN_CANCEL, BLOCKUSE_CANCEL, - BLOCKUSE_CANCEL_ITEMS, + BLOCKUSE_CANCEL_ITEMS, BLOCKUSE_CANCEL_ANY_BLOCKS, PLACE_ITEMS, EAT_ITEMS) # 自定义事件: 客户端拦(碗/盘,汤锅/炒锅/油锅成品)放置预览后, 显式通知服务端执行盛出 @@ -73,6 +73,10 @@ class ClientFeatureDispatcher(BlueFoxClientSystem): # 用于 OnItemTryUse(投掷/使用轨道)在 0.2s 内取消该玩家的投掷动画(如鸡蛋右键鸡窝 # 放蛋后引擎重置右键立即触发投掷 -> 扔蛋)。cd 到即放行, 对地扔蛋正常。 self._blockCdPlayer = {} + # 玩家级"刚对垃圾桶等'任意物品'方块做过拦截"短标记: key=playerId, value=时间戳. + # 垃圾桶规则是 item="*any", 无法用 item 精确判断, 故用玩家级窗口在 0.2s 内取消 + # 同一右键伴随的那次"吃/用"(如手持葡萄右键垃圾桶, 取消吃葡萄)。 + self._anyBlockPlayer = {} self.ListenForEvent(clientApi.GetEngineNamespace(), clientApi.GetEngineSystemName(), "ClientItemUseOnEvent", self, self.OnItemUseOn) @@ -141,6 +145,24 @@ class ClientFeatureDispatcher(BlueFoxClientSystem): }) return + # 【垃圾桶等"任意物品"方块】该方块的规则是 item="*any", 不参与 (item, block) + # 精确派生, 无法按 item 判断, 故按被点方块整块拦截: 手持任意非空物品右键垃圾桶 + # (关/开/有垃圾三态)时, 原版会先执行 吃(葡萄等食物)/放置(胡萝卜等方块), + # 服务端再取消已晚 -> "一边吃一边清空"/"直接放置"。此处 ret 掉默认行为消闪, + # 再显式 BlockUseRequest 让服务端照常 清空主手/开盖; 同时打玩家级标记, 取消 + # 同一右键伴随的那次"吃"(详见 OnItemTryUse)。 + if blockName and blockName in BLOCKUSE_CANCEL_ANY_BLOCKS: + args["ret"] = True + self._blockCd[cdKey] = time.time() + self._blockCdPlayer[pId] = time.time() + self._anyBlockPlayer[pId] = time.time() + self.NotifyToServer(BLOCK_USE_REQUEST, { + "playerId": pId, + "x": args.get("x"), "y": args.get("y"), "z": args.get("z"), + "blockName": blockName, "itemName": itemName, + }) + return + # 纯手持物品取消 (相邻放置/手持吃物品右键表面): 只看 item, 服务端走 handleItemUseOn # (Yuanban 相邻放置/装盘、Natural 种水稻、Shiyongfood 直接吃)。这些组合一旦客户端 # ret=True 会吞掉 ServerItemUseOnEvent, 故必须显式通知服务端补齐(盖饭同款机制)。 @@ -236,6 +258,14 @@ class ClientFeatureDispatcher(BlueFoxClientSystem): itemName = None _pId = args.get("playerId") or args.get("entityId") + # 垃圾桶等"任意物品"方块: 玩家级 0.2s 窗口内直接取消伴随的"吃/用"。 + # 不限物品名(该场景是"任意物品"被扔进垃圾桶/开盖, 而非吃它), 故不能用 + # BLOCKUSE_CANCEL_ITEMS 判断, 单独用 _anyBlockPlayer 标记。 + _ac = self._anyBlockPlayer.get(_pId, 0) + if _ac and (time.time() - _ac) < 0.2: + args["cancel"] = True + return + # 优先: 玩家刚做过 BlockUse 转换(0.2s 内, 如炒锅/汤锅/油锅放料、鸡蛋放鸡窝、上杆), # 引擎重置右键会立即再触发一次"吃/投掷/倒水"。此窗口内若手持该转换涉及的可食用/可用 # 物品(BLOCKUSE_CANCEL_ITEMS), 直接 cancel 掉默认吃/投掷, 避免"放料却吃了食物"。 diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py index c03d3ea..dd56e04 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py @@ -337,6 +337,26 @@ BLOCKUSE_CANCEL_ITEMS = set( _it for (_it, _bk) in BLOCKUSE_CANCEL ) +# ---- 通配"任意物品"转换(垃圾桶)的【整块】拦截集合 ---- +# 垃圾桶规则的 item="*any"(任意非空物品), 无法枚举成 (item, block) 对, 上面的精确派生 +# 会整条跳过 -> 手持 葡萄(吃)/胡萝卜(放置) 右键垃圾桶时客户端不拦, 原版先吃/先放, +# 服务端再取消已经太晚("一边吃葡萄一边清空"/"直接放置")。故改为按"被点方块"整块拦截。 +# 派生条件: 规则表里 item == "*any" 且【无 below 前置条件】。 +# (带 below 的如丸子机 meatballmaker_2 需下方有炉灶, 客户端无法判断, 不能无条件拦, +# 否则条件不满足时会吞掉玩家正常对着它吃东西/放东西。) +BLOCKUSE_CANCEL_ANY_BLOCKS = set() +for _tbl in _BLOCK_USE_TABLES: + for _r in _as_list(_tbl): + if not isinstance(_r, dict): + continue + if _r.get("item") != "*any": + continue + if _r.get("below"): + continue # 有前置条件(如炉灶)的客户端无法判断, 不拦 + _bk = _r.get("source") or _r.get("block") + if isinstance(_bk, basestring) and _bk: + BLOCKUSE_CANCEL_ANY_BLOCKS.add(_bk) + # ---- Chuju 锅铲/油罐 inline 转换(在 ChujuService.handleItemUseOn 内联, 不在数据表) ---- # 手持 锅铲/带油锅铲 右键 油罐(oilcan)/炒锅(wok) 蘸油/还油/上油 -> 取消默认 CHUJU_INLINE_CANCEL = { diff --git a/behavior_pack_v8jz0zSR/netease_blocks/b_90.json b/behavior_pack_v8jz0zSR/netease_blocks/b_90.json index 908b129..6f7be18 100644 --- a/behavior_pack_v8jz0zSR/netease_blocks/b_90.json +++ b/behavior_pack_v8jz0zSR/netease_blocks/b_90.json @@ -36,6 +36,9 @@ "minecraft:block_light_absorption": { "value": 0 }, + "minecraft:block_light_emission": { + "emission": 1.0 + }, "netease:render_layer": { "value": "alpha" }, diff --git a/behavior_pack_v8jz0zSR/netease_blocks/barbecuegrill_1.json b/behavior_pack_v8jz0zSR/netease_blocks/barbecuegrill_1.json index bdd3d34..64fbc5c 100644 --- a/behavior_pack_v8jz0zSR/netease_blocks/barbecuegrill_1.json +++ b/behavior_pack_v8jz0zSR/netease_blocks/barbecuegrill_1.json @@ -36,6 +36,9 @@ "minecraft:block_light_absorption": { "value": 0 }, + "minecraft:block_light_emission": { + "emission": 1.0 + }, "netease:render_layer": { "value": "alpha" }, diff --git a/behavior_pack_v8jz0zSR/netease_blocks/oven.json b/behavior_pack_v8jz0zSR/netease_blocks/oven.json index 7c0cbe3..c13088e 100644 --- a/behavior_pack_v8jz0zSR/netease_blocks/oven.json +++ b/behavior_pack_v8jz0zSR/netease_blocks/oven.json @@ -37,6 +37,9 @@ "minecraft:block_light_absorption": { "value": 0 }, + "minecraft:block_light_emission": { + "emission": 1.0 + }, "netease:render_layer": { "value": "alpha" }, diff --git a/behavior_pack_v8jz0zSR/netease_blocks/stove_2.json b/behavior_pack_v8jz0zSR/netease_blocks/stove_2.json index 45c3d2f..0d92b48 100644 --- a/behavior_pack_v8jz0zSR/netease_blocks/stove_2.json +++ b/behavior_pack_v8jz0zSR/netease_blocks/stove_2.json @@ -36,6 +36,9 @@ "minecraft:block_light_absorption": { "value": 0 }, + "minecraft:block_light_emission": { + "emission": 1.0 + }, "netease:render_layer": { "value": "alpha" }, diff --git a/tuilun/右键拦截白名单清单.txt b/tuilun/右键拦截白名单清单.txt index 308bb2c..f01caba 100644 --- a/tuilun/右键拦截白名单清单.txt +++ b/tuilun/右键拦截白名单清单.txt @@ -197,4 +197,21 @@ ServerItemUseOnEvent 重复触发也会被冷却拦截, 不双重消耗。 - 十、总食用 手持直接吃(饭团/水煮蛋/豆腐, 右键表面吃) [已统一] 【注意】"相邻放置/装盘"分支(ITEM_USE_ON_CANCEL_BY_ITEM)因被点【表面坐标】不变, 不设 _afterCd(避免误吞同一表面 1.5s 内连续放置), 去重交给服务端 handleItemUseOn 冷却。 -"盖饭/蛋炒饭"(GAI_FAN_CANCEL)、"盛出/出锅"(TAKEOUT_CANCEL) 仍用各自专用事件, 不变。 \ No newline at end of file +"盖饭/蛋炒饭"(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 条件, 无条件拦会吞掉条件不满足时玩家正常的吃/放置。 \ No newline at end of file