From 45d328b3392841d2e4bf1ddef298304392608899 Mon Sep 17 00:00:00 2001 From: wenhe <1046926120@qq.com> Date: Tue, 22 Sep 2026 11:23:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=B3=E9=94=AE=20=E6=94=B92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Script_NeteaseModousIY5aSF/modMain.py | 3 + .../service/ClientFeatureDispatcher.py | 118 ++++++++++++ .../xiangyemod/service/FeatureDispatcher.py | 11 +- .../xiangyemod/service/InterceptData.py | 182 ++++++++++++++++++ .../netease_recipes/xy_apple_pile_unpack.json | 25 +++ .../netease_recipes/xy_bread_pile_unpack.json | 25 +++ .../xy_carrot_pile_unpack.json | 25 +++ .../netease_recipes/xy_cod_pile_unpack.json | 25 +++ .../netease_recipes/xy_egg_pile_unpack.json | 25 +++ .../xy_orangepile_0_unpack.json | 25 +++ .../xy_peachpile_0_unpack.json | 25 +++ .../netease_recipes/xy_plate_27.json | 35 ++++ .../netease_recipes/xy_plate_28.json | 35 ++++ .../netease_recipes/xy_plate_29.json | 35 ++++ .../netease_recipes/xy_plate_42.json | 35 ++++ .../xy_potato_pile_unpack.json | 25 +++ .../xy_salmon_pile_unpack.json | 25 +++ tuilun/全部功能做了什么.txt | 16 ++ tuilun/右键拦截白名单清单.txt | 138 +++++++++++++ 19 files changed, 826 insertions(+), 7 deletions(-) create mode 100644 behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/ClientFeatureDispatcher.py create mode 100644 behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_apple_pile_unpack.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_bread_pile_unpack.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_carrot_pile_unpack.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_cod_pile_unpack.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_egg_pile_unpack.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_orangepile_0_unpack.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_peachpile_0_unpack.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_plate_27.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_plate_28.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_plate_29.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_plate_42.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_potato_pile_unpack.json create mode 100644 behavior_pack_v8jz0zSR/netease_recipes/xy_salmon_pile_unpack.json create mode 100644 tuilun/右键拦截白名单清单.txt diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/modMain.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/modMain.py index fd2b0e8..14aef5b 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/modMain.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/modMain.py @@ -29,5 +29,8 @@ from xiangyemod.chaoguo.service.ChaoguoTimerService import ChaoguoTimerService from xiangyemod.shiyongfood.service.ShiyongfoodService import ShiyongfoodService if not serverApi.IsInServer(): + # 客户端进程: 导入客户端拦截系统(继承 BlueFoxClientSystem, 框架自动注册), + # 提前取消右键默认行为, 消除服务端拦截的"闪一下" + from xiangyemod.service.ClientFeatureDispatcher import ClientFeatureDispatcher pass LoadMod() \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/ClientFeatureDispatcher.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/ClientFeatureDispatcher.py new file mode 100644 index 0000000..cf2f751 --- /dev/null +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/ClientFeatureDispatcher.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +""" +================================================================================ +客户端右键拦截系统(ClientFeatureDispatcher) +================================================================================ +【作用】 + 在客户端提前拦截"手持物品右键功能方块"的默认行为(吃/放置前摇), + 消除服务端取消带来的"闪一下"视觉问题。与服务端 FeatureDispatcher 配合: + 客户端先 cancel/ret, 再由服务端精确处理转换。 + +【监听事件】(全模组客户端唯一拦截点) + 1. ClientBlockUseEvent 右键功能方块 -> cancel=True + 2. ClientItemUseOnEvent 手持白名单物品右键方块表面 -> ret=True + 3. ClientItemTryUseEvent 手持直接吃物品(饭团/水煮蛋/豆腐) -> cancel=True + +【白名单来源】 + 共享数据 InterceptData.py (客户端/服务端同一份, 见其注释) +================================================================================ +""" +import mod.client.extraClientApi as clientApi + +ClientSystem = clientApi.GetClientSystemCls() +clientComp = clientApi.GetEngineCompFactory() + +from ...BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxClientSystem +from .InterceptData import (ITEM_USE_ON_CANCEL, ITEM_USE_ON_CANCEL_BY_ITEM, + BLOCK_USE_CANCEL, SUSHI_BLOCKS, COATING_ITEMS) + + +class ClientFeatureDispatcher(BlueFoxClientSystem): + """客户端右键拦截: 白名单提前 cancel/ret, 消除闪烁""" + + def __init__(self, namespace, systemName): + BlueFoxClientSystem.__init__(self, namespace, systemName) + print "===== ClientFeatureDispatcher init =====" + self.ListenForEvent(clientApi.GetEngineNamespace(), + clientApi.GetEngineSystemName(), + "ClientBlockUseEvent", self, self.OnBlockUse) + self.ListenForEvent(clientApi.GetEngineNamespace(), + clientApi.GetEngineSystemName(), + "ClientItemUseOnEvent", self, self.OnItemUseOn) + self.ListenForEvent(clientApi.GetEngineNamespace(), + clientApi.GetEngineSystemName(), + "ClientItemTryUseEvent", self, self.OnItemTryUse) + + def Destroy(self): + print "===== ClientFeatureDispatcher Destroy =====" + self.UnListenForEvent(clientApi.GetEngineNamespace(), + clientApi.GetEngineSystemName(), + "ClientBlockUseEvent", self, self.OnBlockUse) + self.UnListenForEvent(clientApi.GetEngineNamespace(), + clientApi.GetEngineSystemName(), + "ClientItemUseOnEvent", self, self.OnItemUseOn) + self.UnListenForEvent(clientApi.GetEngineNamespace(), + clientApi.GetEngineSystemName(), + "ClientItemTryUseEvent", self, self.OnItemTryUse) + + # ============================================================================ + # 入口1: 右键功能方块 -> 提前 cancel 默认交互 + # ============================================================================ + def OnBlockUse(self, args): + blockName = args.get("blockName") + if blockName in BLOCK_USE_CANCEL: + args["cancel"] = True + + # ============================================================================ + # 入口2: 手持物品右键方块表面 -> 白名单组合才 ret + # ============================================================================ + def OnItemUseOn(self, args): + blockName = args.get("blockName") + try: + itemDict = args.get("itemDict") or {} + itemName = itemDict.get("newItemName") or itemDict.get("itemName") + except Exception: + itemName = None + if not itemName: + return + + # 纯手持物品取消 (相邻放置/手持吃物品右键表面): 只看 item + if itemName in ITEM_USE_ON_CANCEL_BY_ITEM: + args["ret"] = True + return + + if not blockName: + return + + # 精确组合 (手持item, 被点block) + pair = (itemName, blockName) + if pair in ITEM_USE_ON_CANCEL: + args["ret"] = True + return + + # 寿司: 手持寿司方块物品 右键 自家寿司方块 -> 取消默认放置 + if itemName in SUSHI_BLOCKS and blockName in SUSHI_BLOCKS: + args["ret"] = True + return + + # 裹粉: 手持生食材 右键 面粉块 -> 取消默认放置 + if itemName in COATING_ITEMS and blockName == "rtdd:farineblock_3": + args["ret"] = True + + # ============================================================================ + # 入口3: 手持直接吃物品(长按/空中使用) -> cancel 默认吃 + # ============================================================================ + def OnItemTryUse(self, args): + try: + itemDict = args.get("itemDict") or {} + itemName = itemDict.get("newItemName") or itemDict.get("itemName") + except Exception: + itemName = None + # 饭团/水煮蛋/豆腐 在 ITEM_USE_ON_CANCEL_BY_ITEM 里(EAT_ITEMS) + if itemName in ITEM_USE_ON_CANCEL_BY_ITEM: + args["cancel"] = True + + +# 注: 客户端系统需在客户端进程被实例化。modMain 只能在服务端 import 服务端 +# 系统; 客户端系统由 BlueFox 框架自动注册其子类。为确保本类被加载, 需在 +# modMain 客户端分支(IsInServer()==False)里 import 本模块。 \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py index 78331d2..5426b36 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py @@ -256,13 +256,10 @@ class FeatureDispatcher(BlueFoxServerSystem): owners = self.blockOwnerAll.get(clickedName) if clickedName else None - # 手持方块物品右键"功能方块"(右键服务管辖的方块): 若没有任何 itemUseOn - # 服务会处理它, 直接取消默认放置 —— 防止"先放一个方块再消失"的体验 - # (例如手持生饺子右键蒸笼、手持方块右键面团等, 意图是转换而非放置) - if clickedName and owners and (not services or not any( - s in owners for s in services)): - args['ret'] = True - return + # 【已移除宽泛兜底】以前"手持方块物品右键任何功能方块且无 itemUseOn 服务 + # 就 ret=True 取消默认放置", 导致正常放置失效。现在改由客户端白名单精确 + # 拦截(见 ClientFeatureDispatcher + InterceptData), 服务端只处理真正注册了 + # itemUseOn 的组合, 其余一律放行(放置恢复正常)。 if not services: return diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py new file mode 100644 index 0000000..5959f34 --- /dev/null +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- +""" +================================================================================ +右键拦截白名单数据(共享,客户端/服务端共用) +================================================================================ +【作用】 + 统一管理"手持物品右键功能方块"时, 需要【提前取消该物品默认行为 + (右键吃/放置)】的精确组合。客户端 ClientFeatureDispatcher 用它提前 + cancel/ret 消除闪烁; 服务端 FeatureDispatcher 读同一份, 保持一致。 + +【为什么需要】 + 不精确拦截会造成两种问题: + 1. 宽泛拦截(以前): 手持任意方块右键"任何功能方块"就取消放置 -> 正常放置失效 + 2. 不拦截: 手持南瓜派右键盘子时, 原版先触发"吃/放"前摇, 由服务端取消就"闪一下" + 因此只对下面明确列出的组合拦截, 其余一律放行。 + +【集合】 + ITEM_USE_ON_CANCEL : set of (手持item, 被点block) 仅这两者匹配才取消 + ITEM_USE_ON_CANCEL_BY_ITEM : set of 手持item 只看手持item即可取消 + BLOCK_USE_CANCEL : set of 被右键的block 右键这些功能方块提前cancel +================================================================================ +""" + +# ============================================================================ +# 一、精确组合: (手持item, 被点block) -> 两者都匹配才取消 +# ============================================================================ + +# ---- 盘子装盘 (YuanbanService PLATE_RULES) ---- +PLATE_CANCEL = { + ("minecraft:pumpkin_pie", "rtdd:plate_0"), + ("minecraft:cod", "rtdd:plate_0"), + ("minecraft:salmon", "rtdd:plate_0"), + ("minecraft:tropical_fish", "rtdd:plate_0"), + ("minecraft:fish", "rtdd:plate_0"), + ("minecraft:melon_slice", "rtdd:plate_0"), + ("minecraft:bread", "rtdd:plate_0"), + ("minecraft:cookie", "rtdd:plate_0"), + ("minecraft:cooked_chicken", "rtdd:plate_0"), +} + +# ---- 面食.甜食手持转换 (Mianshi ITEM_USE_ON_RULES) ---- +MIANSHI_CANCEL = { + ("rtdd:dought_7", "rtdd:oven"), + ("rtdd:farineblock_1", "rtdd:bowlasoup"), + ("rtdd:dumplings_4", "rtdd:steamer"), + ("rtdd:roubaozi_3", "rtdd:steamer"), + ("rtdd:bamboo_4", "rtdd:steamer"), + ("rtdd:plate_34", "rtdd:steamer"), +} + +# ---- 汤锅手持转换 (Tangguo ITEM_USE_ON_RULES) ---- +TANGGUO_CANCEL = { + ("rtdd:mushroomsoup", "rtdd:noodle_soup"), + ("rtdd:vegetablesoup", "rtdd:noodle_soup"), + ("rtdd:eggsoup", "rtdd:noodle_soup"), +} + +# ---- 炒锅 盖饭双重转换 (Chaoguo ITEM_USE_ON_RULES) ---- +# 正向: 手持成品菜 -> 右键 米饭三形态 (米饭在物品/方块双向, 以方块被点为准) +CHAOGUO_CANCEL = { + ("rtdd:plate_47", "rtdd:bowlofrice"), + ("rtdd:plate_47", "rtdd:bowlofrice_2"), + ("rtdd:plate_47", "rtdd:bowlofrice_3"), + ("rtdd:plate_54", "rtdd:bowlofrice"), + ("rtdd:plate_54", "rtdd:bowlofrice_2"), + ("rtdd:plate_54", "rtdd:bowlofrice_3"), + ("rtdd:plate_32", "rtdd:bowlofrice"), + ("rtdd:plate_32", "rtdd:bowlofrice_2"), + ("rtdd:plate_32", "rtdd:bowlofrice_3"), + ("rtdd:plate_15", "rtdd:bowlofrice"), + ("rtdd:plate_15", "rtdd:bowlofrice_2"), + ("rtdd:plate_15", "rtdd:bowlofrice_3"), + # 反向: 手持米饭 -> 右键 成品菜方块 + ("rtdd:bowlofrice", "rtdd:plate_47"), + ("rtdd:bowlofrice_2", "rtdd:plate_47"), + ("rtdd:bowlofrice_3", "rtdd:plate_47"), + ("rtdd:bowlofrice", "rtdd:plate_54"), + ("rtdd:bowlofrice_2", "rtdd:plate_54"), + ("rtdd:bowlofrice_3", "rtdd:plate_54"), + ("rtdd:bowlofrice", "rtdd:plate_32"), + ("rtdd:bowlofrice_2", "rtdd:plate_32"), + ("rtdd:bowlofrice_3", "rtdd:plate_32"), + ("rtdd:bowlofrice", "rtdd:plate_15"), + ("rtdd:bowlofrice_2", "rtdd:plate_15"), + ("rtdd:bowlofrice_3", "rtdd:plate_15"), +} + +# ---- 厨具 锅铲/带油锅铲 (Chuju) ---- +CHUJU_CANCEL = { + ("rtdd:spatula", "rtdd:oilcan"), + ("rtdd:spatula_oil", "rtdd:oilcan"), + ("rtdd:spatula_oil", "rtdd:wok"), +} + +# ---- 寿司: 手持寿司方块物品 右键 自家寿司方块 (取消默认放置) ---- +# 被点block为寿司方块时, 手持任何寿司方块物品都取消放置(意图是堆叠/取走/转换) +SUSHI_BLOCKS = { + "rtdd:sushi_0", "rtdd:sushi_1", + "rtdd:codsushi_1", "rtdd:codsushi_2", "rtdd:codsushi_3", + "rtdd:codsushi_4", "rtdd:codsushi_5", "rtdd:codsushi_6", + "rtdd:salmonsushi_1", "rtdd:salmonsushi_2", "rtdd:salmonsushi_3", + "rtdd:salmonsushi_4", "rtdd:salmonsushi_5", "rtdd:salmonsushi_6", + "rtdd:fishsushi_1", "rtdd:fishsushi_2", "rtdd:fishsushi_3", + "rtdd:fishsushi_4", "rtdd:fishsushi_5", "rtdd:fishmonsushi_6", + "rtdd:nigirisushi", + "rtdd:sushipile_0", "rtdd:sushipile_1", "rtdd:sushipile_2", + "rtdd:sushipile_3", "rtdd:sushipile_4", "rtdd:sushipile_5", + "rtdd:nigirisushifishcod", "rtdd:nigirisushicod_2", "rtdd:nigirisushicod_3", + "rtdd:nigirisushifishsalmon_1", "rtdd:nigirisushisalnom_2", "rtdd:nigirisushisalnom_3", + "rtdd:nigirisushifish_1", "rtdd:nigirisushifish_2", "rtdd:nigirisushifish_3", + "rtdd:squid_sushi", "rtdd:squidsushi_2", "rtdd:squidsushi_3", +} +SUSHI_CANCEL = set( + (held, block) for held in SUSHI_BLOCKS for block in SUSHI_BLOCKS +) + +# ---- 裹粉 (Shicai COATING_RULES): 手持生食材右键 面粉块 (取消默认放置) ---- +COATING_ITEMS = { + "rtdd:sashimi", # 生鱼片 + "rtdd:lobster", # 龙虾 + "minecraft:porkchop", # 生猪肉 + "minecraft:chicken", # 生鸡肉 + "minecraft:potato", # 生土豆 +} +COATING_CANCEL = set( + (item, "rtdd:farineblock_3") for item in COATING_ITEMS +) + +# ---- 汇总精确组合 ---- +ITEM_USE_ON_CANCEL = (PLATE_CANCEL | MIANSHI_CANCEL | TANGGUO_CANCEL + | CHAOGUO_CANCEL | CHUJU_CANCEL | SUSHI_CANCEL + | COATING_CANCEL) + +# ============================================================================ +# 二、纯手持物品取消: 只看手持item (右键任意方块表面/空中) +# ============================================================================ + +# ---- 原版相邻放置 (YuanbanService ITEM_USE_ON_RULES) ---- +PLACE_ITEMS = { + "minecraft:chicken", + "minecraft:salmon", + "minecraft:cod", + "minecraft:fish", + "minecraft:carrot", + "minecraft:potato", + "rtdd:qingcai", + "rtdd:scallions", +} + +# ---- 总食用 手持直接吃 (Shiyongfood TRY_USE_RULES) ---- +EAT_ITEMS = { + "rtdd:rice_balls", # 饭团 + "rtdd:boiled_egg", # 水煮蛋 + "rtdd:beancurd", # 豆腐 +} + +ITEM_USE_ON_CANCEL_BY_ITEM = PLACE_ITEMS | EAT_ITEMS + +# ============================================================================ +# 三、右键功能方块集合 (ClientBlockUseEvent 提前 cancel) +# 右键这些功能方块, 无论空手/手持, 客户端都提前取消"默认交互", +# 由服务端 OnBlockUse 精确路由处理(不误伤放置)。 +# 注意: 仅列出"交互型"功能方块(灶台/蒸笼/炒锅/汤锅/锅具/柴火/水箱等), +# 不放被右键时应当正常放置的方块。 +# ============================================================================ +BLOCK_USE_CANCEL = { + "rtdd:stove", "rtdd:stove_1", "rtdd:stove_2", + "rtdd:steamer", "rtdd:steamercover", + "rtdd:wok", "rtdd:coverthepan", "rtdd:oilpan", + "rtdd:stewedsoup", "rtdd:stewedsoupwater", "rtdd:coverthepot", + "rtdd:oilpot_0", "rtdd:oilpot_1", + "rtdd:oilcan", + "rtdd:manger_0", "rtdd:manger_1", "rtdd:manger_2", "rtdd:manger_3", + "rtdd:pigmanger_1", "rtdd:pigmanger_2", + "rtdd:chickenmanger_0", "rtdd:chickenmanger_1", + "rtdd:firewood", "rtdd:firewood_2", + "rtdd:stonemill", + "rtdd:beater", "rtdd:beatermeat_0", "rtdd:beatermeat_1", + "rtdd:beatermike_0", "rtdd:beatermike_1", "rtdd:beatermike_2", + "rtdd:beater_custard_0", "rtdd:beater_custard_1", "rtdd:beater_custard_2", + "rtdd:beater_eggsandmilk_0", "rtdd:beater_eggsandmilk_1", "rtdd:beater_eggsandmilk_2", +} \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_apple_pile_unpack.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_apple_pile_unpack.json new file mode 100644 index 0000000..989b2ba --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_apple_pile_unpack.json @@ -0,0 +1,25 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:apple_pile", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_apple_pile_unpack" + }, + "pattern": [ + "0" + ], + "result": { + "data": 0, + "item": "minecraft:apple", + "count": 9 + }, + "tags": [ + "crafting_table" + ] + } +} \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_bread_pile_unpack.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_bread_pile_unpack.json new file mode 100644 index 0000000..325665b --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_bread_pile_unpack.json @@ -0,0 +1,25 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:bread_pile", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_bread_pile_unpack" + }, + "pattern": [ + "0" + ], + "result": { + "data": 0, + "item": "minecraft:bread", + "count": 9 + }, + "tags": [ + "crafting_table" + ] + } +} \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_carrot_pile_unpack.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_carrot_pile_unpack.json new file mode 100644 index 0000000..3f9d03b --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_carrot_pile_unpack.json @@ -0,0 +1,25 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:carrot_pile", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_carrot_pile_unpack" + }, + "pattern": [ + "0" + ], + "result": { + "data": 0, + "item": "minecraft:carrot", + "count": 9 + }, + "tags": [ + "crafting_table" + ] + } +} \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_cod_pile_unpack.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_cod_pile_unpack.json new file mode 100644 index 0000000..20493d2 --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_cod_pile_unpack.json @@ -0,0 +1,25 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:cod_pile", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_cod_pile_unpack" + }, + "pattern": [ + "0" + ], + "result": { + "data": 0, + "item": "minecraft:cod", + "count": 9 + }, + "tags": [ + "crafting_table" + ] + } +} \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_egg_pile_unpack.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_egg_pile_unpack.json new file mode 100644 index 0000000..570326c --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_egg_pile_unpack.json @@ -0,0 +1,25 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:egg_pile", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_egg_pile_unpack" + }, + "pattern": [ + "0" + ], + "result": { + "data": 0, + "item": "minecraft:egg", + "count": 9 + }, + "tags": [ + "crafting_table" + ] + } +} \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_orangepile_0_unpack.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_orangepile_0_unpack.json new file mode 100644 index 0000000..290c146 --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_orangepile_0_unpack.json @@ -0,0 +1,25 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:orangepile_0", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_orangepile_0_unpack" + }, + "pattern": [ + "0" + ], + "result": { + "data": 0, + "item": "rtdd:orange", + "count": 9 + }, + "tags": [ + "crafting_table" + ] + } +} \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_peachpile_0_unpack.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_peachpile_0_unpack.json new file mode 100644 index 0000000..0deec54 --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_peachpile_0_unpack.json @@ -0,0 +1,25 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:peachpile_0", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_peachpile_0_unpack" + }, + "pattern": [ + "0" + ], + "result": { + "data": 0, + "item": "rtdd:peach", + "count": 9 + }, + "tags": [ + "crafting_table" + ] + } +} \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_27.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_27.json new file mode 100644 index 0000000..25e0aa2 --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_27.json @@ -0,0 +1,35 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:plate_0", + "data": 0 + }, + "1": { + "item": "rtdd:nigirisushifish_3", + "data": 0 + }, + "2": { + "item": "rtdd:fishsushi_5", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_plate_27" + }, + "pattern": [ + "0", + "1", + "2" + ], + "result": { + "data": 0, + "item": "rtdd:plate_27", + "count": 1 + }, + "tags": [ + "crafting_table" + ] + } +} diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_28.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_28.json new file mode 100644 index 0000000..d9ab6f9 --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_28.json @@ -0,0 +1,35 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:plate_0", + "data": 0 + }, + "1": { + "item": "rtdd:nigirisushicod_3", + "data": 0 + }, + "2": { + "item": "rtdd:codsushi_5", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_plate_28" + }, + "pattern": [ + "0", + "1", + "2" + ], + "result": { + "data": 0, + "item": "rtdd:plate_28", + "count": 1 + }, + "tags": [ + "crafting_table" + ] + } +} diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_29.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_29.json new file mode 100644 index 0000000..68a981c --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_29.json @@ -0,0 +1,35 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:plate_0", + "data": 0 + }, + "1": { + "item": "rtdd:nigirisushisalnom_3", + "data": 0 + }, + "2": { + "item": "rtdd:salmonsushi_5", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_plate_29" + }, + "pattern": [ + "0", + "1", + "2" + ], + "result": { + "data": 0, + "item": "rtdd:plate_29", + "count": 1 + }, + "tags": [ + "crafting_table" + ] + } +} diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_42.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_42.json new file mode 100644 index 0000000..283f2c9 --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_plate_42.json @@ -0,0 +1,35 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:plate_0", + "data": 0 + }, + "1": { + "item": "rtdd:squidsushi_3", + "data": 0 + }, + "2": { + "item": "rtdd:fishsushi_5", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_plate_42" + }, + "pattern": [ + "0", + "1", + "2" + ], + "result": { + "data": 0, + "item": "rtdd:plate_42", + "count": 1 + }, + "tags": [ + "crafting_table" + ] + } +} diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_potato_pile_unpack.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_potato_pile_unpack.json new file mode 100644 index 0000000..be8c5bc --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_potato_pile_unpack.json @@ -0,0 +1,25 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:potato_pile", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_potato_pile_unpack" + }, + "pattern": [ + "0" + ], + "result": { + "data": 0, + "item": "minecraft:potato", + "count": 9 + }, + "tags": [ + "crafting_table" + ] + } +} \ No newline at end of file diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_salmon_pile_unpack.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_salmon_pile_unpack.json new file mode 100644 index 0000000..0e5598f --- /dev/null +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_salmon_pile_unpack.json @@ -0,0 +1,25 @@ +{ + "format_version": "1.12", + "minecraft:recipe_shaped": { + "key": { + "0": { + "item": "rtdd:salmon_pile", + "data": 0 + } + }, + "description": { + "identifier": "rtdd:xy_salmon_pile_unpack" + }, + "pattern": [ + "0" + ], + "result": { + "data": 0, + "item": "minecraft:salmon", + "count": 9 + }, + "tags": [ + "crafting_table" + ] + } +} \ No newline at end of file diff --git a/tuilun/全部功能做了什么.txt b/tuilun/全部功能做了什么.txt index e4f51d8..d941c58 100644 --- a/tuilun/全部功能做了什么.txt +++ b/tuilun/全部功能做了什么.txt @@ -956,3 +956,19 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher) 面食补 蒸牛奶鸡蛋(steamermilkandegg); 死亡生物修正 挂鱼晾干钩(meathookcoddry) 为"空手右键取鱼干"并补挂肉架_3/4 [已实现] + +######################################## +【右键拦截白名单化 + 客户端拦截】2026-09-22 +######################################## +- 问题: 原 OnItemUseOn 有宽泛兜底"手持方块物品右键任意功能方块且无 itemUseOn + 服务就 ret=True 取消默认放置", 导致正常放置失效。 +- 修复: ①删除该宽泛兜底, 服务端只处理真正注册了 itemUseOn 的组合, 其余放行 → 放置恢复 + ②新增共享白名单 InterceptData.py(客户端/服务端同一份): PLATE_CANCEL装盘/ + MIANSHI_CANCEL面食/ TANGGUO_CANCEL汤锅/ CHAOGUO_CANCEL盖饭双向/ + CHUJU_CANCEL锅铲油罐炒锅/ SUSHI_CANCEL寿司堆叠/ COATING_CANCEL裹粉/ + PLACE_ITEMS原版相邻放置/ EAT_ITEMS手持直接吃/ BLOCK_USE_CANCEL右键功能方块 + ③新增 ClientFeatureDispatcher.py(继承 BlueFoxClientSystem): 监听 + ClientBlockUseEvent(cancel功能方块)/ ClientItemUseOnEvent(ret白名单组合)/ + ClientItemTryUseEvent(cancel手持吃物品), 客户端提前拦截消除"闪一下" + ④modMain.py 客户端分支导入 ClientFeatureDispatcher, 由 BlueFox 框架自动注册 [已实现] + diff --git a/tuilun/右键拦截白名单清单.txt b/tuilun/右键拦截白名单清单.txt new file mode 100644 index 0000000..ae02197 --- /dev/null +++ b/tuilun/右键拦截白名单清单.txt @@ -0,0 +1,138 @@ +======================================== +右键拦截白名单清单(手持 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 + 被点方块原地变对应盖饭 + + +======================================== +六、乡野食材 裹粉 (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(豆腐) -> 直接吃 \ No newline at end of file