diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py index 5426b36..12cc763 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py @@ -241,9 +241,18 @@ class FeatureDispatcher(BlueFoxServerSystem): 取消"使用物品于方块"的字段是 ret(不是 cancel),官方要求双端设置才能 真正取消默认行为。本分发器已在服务端设 ret=True。 """ + playerId = args.get("playerId") or args.get("entityId") + # 【关键】同一右键动作会同时触发 ServerBlockUseEvent(盛出/转换, 已由 OnBlockUse + # 处理并设置 _cancelItemUse) 和 ServerItemUseOnEvent(手持方块物品的放置前摇)。 + # 若前一帧 OnBlockUse 已成功处理(盛出掉落/方块转换), 这里必须消费标记并 + # ret=True 取消放置, 否则"盛出了成品"却又"把手持的木碗/盘子放了出来"。 + # (与 OnItemTryUse 消费标记取消"吃/喝"是同一模式。) + if self._cancelItemUse.pop(playerId, False): + args['ret'] = True + return + itemName = args.get("itemName") services = self.itemUseOnAll.get(itemName) - playerId = args.get("playerId") or args.get("entityId") # 被点方块(用于去重: 该方块归哪些右键服务管辖) clickedName = None try: diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py index 245b11d..6e6f908 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/InterceptData.py @@ -30,18 +30,23 @@ """ # ============================================================================ -# 一、导入各功能分类的规则数据符号(纯常量, 无服务端 API 依赖, 客户端可安全 import) -# 逐个 try, 任一失败只跳过该模块, 不影响整体。 +# 一、导入各功能分类"手持物品右键方块表面"的规则数据符号 +# 只扫【ITEM_USE_ON_RULES】(surface 字段) —— 这些才走 ServerItemUseOnEvent +# -> handleItemUseOn, 是客户端 ClientItemUseOnEvent 应拦截的组合。 +# 注意: 绝对不要扫 SWITCH_RULES / *_SWITCHES 等(本体现在, 走 ServerBlockUseEvent +# -> handleBlockUse), 若扫进来客户端拦截会吃掉整个右键, 导致"右键什么都不发生"。 # 注: 本项目无 __init__.py, 用与各 Service 相同的 `from ..XxxData import ...` # 直接导入符号, 而非 import 模块对象。 # ============================================================================ -# 每个条目: (规则表内容) —— 规则表可能是 list[dict] 或单个 dict(RICE_PLANT) +# 每个条目: (规则表内容) —— 规则表 list[dict], 字段含 "item" + "surface"/"source" _ALL_RULE_TABLES = [] def _collect_all(): - """遍历 _ALL_RULE_TABLES, 汇总全部 (item, block) 转换对。""" + """遍历 _ALL_RULE_TABLES, 汇总全部 (手持item, 被点surface方块) 组合。 + 只取 "surface"(手持物品右键方块表面) 与 "source"(盘子转换的被点方块), + 不取 "block"(本体现在右键, 由服务端 handleBlockUse 处理)。""" pairs = set() for value in _ALL_RULE_TABLES: for rule in _as_list(value): @@ -52,73 +57,35 @@ def _collect_all(): continue if item.startswith("*"): continue - for blkf in ("block", "source", "surface"): + for blkf in ("surface", "source"): blk = rule.get(blkf) if isinstance(blk, basestring) and blk: pairs.add((item, blk)) return pairs -# ---- 面食.甜食: 和面/饺子/包子/馍/煎饼卷 + 手持生食右键蒸笼/烤炉/木碗 ---- +# ---- 面食.甜食: 手持生食/面饼/面粉 右键 烤炉/木碗/蒸笼 (itemUseOn) ---- try: - from ..mianshi.MianshiData import ( - SWITCH_RULES as MIANSHI_SWITCH, - ITEM_USE_ON_RULES as MIANSHI_USON, - ) - _ALL_RULE_TABLES.append(MIANSHI_SWITCH) + from ..mianshi.MianshiData import ITEM_USE_ON_RULES as MIANSHI_USON _ALL_RULE_TABLES.append(MIANSHI_USON) except Exception: pass -# ---- 炒锅: 盖饭双向 + 蛋炒饭 ---- +# ---- 炒锅: 盖饭双向 + 蛋炒饭 (itemUseOn, surface=米饭/成品菜) ---- try: - from ..chaoguo.ChaoguoData import ( - SWITCH_RULES as CHAOGUO_SWITCH, - ITEM_USE_ON_RULES as CHAOGUO_USON, - ) - _ALL_RULE_TABLES.append(CHAOGUO_SWITCH) + from ..chaoguo.ChaoguoData import ITEM_USE_ON_RULES as CHAOGUO_USON _ALL_RULE_TABLES.append(CHAOGUO_USON) except Exception: pass -# ---- 汤锅: 放入食材/出锅 + 手持锅态汤右键熟面条 ---- +# ---- 汤锅: 手持锅态汤右键 熟面条 (itemUseOn) ---- try: - from ..tangguo.TangguoData import ( - SWITCH_RULES as TANGGUO_SWITCH, - ITEM_USE_ON_RULES as TANGGUO_USON, - ) - _ALL_RULE_TABLES.append(TANGGUO_SWITCH) + from ..tangguo.TangguoData import ITEM_USE_ON_RULES as TANGGUO_USON _ALL_RULE_TABLES.append(TANGGUO_USON) except Exception: pass -# ---- 油锅: 倒油/放料/出锅 ---- -try: - from ..youguo.YouguoData import SWITCH_RULES as YOUGUO_SWITCH - _ALL_RULE_TABLES.append(YOUGUO_SWITCH) -except Exception: - pass - -# ---- 厨具: 炉灶加木条/丸子机加料取料/蒸笼 ---- -try: - from ..chuju.ChujuData import ( - STOVE_RULES, MEATBALLMAKER_RULES, STEAMER_RULES, - ) - _ALL_RULE_TABLES.append(STOVE_RULES) - _ALL_RULE_TABLES.append(MEATBALLMAKER_RULES) - _ALL_RULE_TABLES.append(STEAMER_RULES) -except Exception: - pass - -# ---- 食材: 裹粉(COATING 无 floor 字段, 手工补) / 肉馅按压 ---- -try: - from ..shicai.ShicaiData import COATING_RULES, MEAT_PRESS_RULES - _ALL_RULE_TABLES.append(COATING_RULES) - _ALL_RULE_TABLES.append(MEAT_PRESS_RULES) -except Exception: - pass - -# ---- 原版放置/盘子转换 ---- +# ---- 原版放置/盘子转换 (itemUseOn, surface=相邻放置 / source=盘子) ---- try: from ..yuanbanfangzhi.YuanbanData import ( ITEM_USE_ON_RULES as YUANBAN_USON, @@ -129,57 +96,6 @@ try: except Exception: pass -# ---- 乡野自然: 柴火堆叠 + 水稻种植 ---- -try: - from ..ziran.NaturalData import FIREWOOD_RULES, NATURAL_SWITCHES, RICE_PLANT - _ALL_RULE_TABLES.append(FIREWOOD_RULES) - _ALL_RULE_TABLES.append(NATURAL_SWITCHES) - _ALL_RULE_TABLES.append(RICE_PLANT) -except Exception: - pass - -# ---- 家具家私: 水槽放脏盘/盘子架放盘/碗柜放碗/火炉等 ---- -try: - from ..jiaju.FurnitureData import ( - ARROWBARREL_RULES, FLUME_RULES, TRAYRACKS_RULES, CUPBOARD_RULES, - BOOKCASE_RULES, POTIONRACK_RULES, RECORDPLAYER_RULES, - TRASHBIN_RULES, FIREPLACE_RULES, - ) - for _t in (ARROWBARREL_RULES, FLUME_RULES, TRAYRACKS_RULES, - CUPBOARD_RULES, BOOKCASE_RULES, POTIONRACK_RULES, - RECORDPLAYER_RULES, TRASHBIN_RULES, FIREPLACE_RULES): - _ALL_RULE_TABLES.append(_t) -except Exception: - pass - -# ---- 死亡生物: 挂肉钩挂死牛/死猪/死羊 + 菜刀切配 ---- -try: - from ..siwangshengwu.DeadmobData import DEADMOB_SWITCHES - _ALL_RULE_TABLES.append(DEADMOB_SWITCHES) -except Exception: - pass - -# ---- 烧烤: 支杆上杆(手持生肉/死猪右键支杆) ---- -try: - from ..shaokao.BarbecueData import BARBECUE_SWITCHES - _ALL_RULE_TABLES.append(BARBECUE_SWITCHES) -except Exception: - pass - -# ---- 市场贸易: 手持果蔬放入售卖箱/鱼桶 ---- -try: - from ..shichangmaoyi.MarketData import MARKET_SWITCHES - _ALL_RULE_TABLES.append(MARKET_SWITCHES) -except Exception: - pass - -# ---- 动物养殖: 放蛋/喂食(手持原版鸡蛋/种子/胡萝卜等) ---- -try: - from ..dongwuyangzhi.AnimalData import ANIMAL_SWITCHES - _ALL_RULE_TABLES.append(ANIMAL_SWITCHES) -except Exception: - pass - # ============================================================================ # 二、从规则表派生 (手持方块物品, 被点功能方块) 转换对