diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py index 14976e5..3757e74 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/service/FeatureDispatcher.py @@ -61,6 +61,7 @@ class FeatureDispatcher(BlueFoxServerSystem): blockSet = set() itemUseOnOwner = {} itemUseOnSet = set() + itemUseOnAll = {} # 物品名 -> [服务...]: 同一物品可被多个服务注册(按注册顺序), 逐个 fallback timerOwner = {} timerSet = set() @@ -91,6 +92,9 @@ class FeatureDispatcher(BlueFoxServerSystem): for itemName in service.getItemUseOnRules(): cls.itemUseOnOwner[itemName] = service cls.itemUseOnSet.add(itemName) + # 同一物品可被多个服务注册(如 食材裹粉 vs 原版放置 都处理 土豆), + # 按注册顺序追加, OnItemUseOn 逐个 fallback + cls.itemUseOnAll.setdefault(itemName, []).append(service) @classmethod def registerTimer(cls, service): @@ -210,34 +214,46 @@ class FeatureDispatcher(BlueFoxServerSystem): def OnItemUseOn(self, args): """ 手持物品右键某个方块表面时触发(如手持原版生鸡肉右键地面)。 - 用手持物品名 O(1) 定位到唯一的功能服务,转发给它的 handleItemUseOn。 + 用手持物品名定位到注册该物品的【所有】服务(itemUseOnAll,按注册顺序), + 逐个尝试 handleItemUseOn,第一个返回 True 的服务处理成功: + - 食材裹粉(ShicaiService) 与 原版放置(YuanbanService) 都注册了 土豆/鸡肉/猪肉, + 手持这些物品右键面粉块 → 裹粉先命中; 右键地面 → 裹粉返回 False 后交给原版放置。 取消"使用物品于方块"的字段是 ret(不是 cancel),官方要求双端设置才能 真正取消默认行为。本分发器已在服务端设 ret=True。 """ itemName = args.get("itemName") - service = self.itemUseOnOwner.get(itemName) - print "[FD-ItemUseOn]", itemName, "svc:", (service.__class__.__name__ if service else "NONE") - if not service: + services = self.itemUseOnAll.get(itemName) + if not services: return + print "[FD-ItemUseOn]", itemName, "svcs:", [s.__class__.__name__ for s in services] - # 被点方块属于某个"右键方块"服务的管辖(条箱/挂肉钩/锅具等) → 该方块右键由 - # ServerBlockUseEvent 处理(放入/挂鱼/做菜), 不执行"手持物品右键表面放置", - # 避免与方块右键逻辑重复(如手持鲑鱼右键条箱应放入而非放置死鲑鱼)。 playerId = args.get("playerId") or args.get("entityId") + # 被点方块(用于去重: 该方块归哪个右键服务管辖) + clickedName = None try: dim = comp.CreateDimension(playerId).GetEntityDimensionId() b = comp.CreateBlockInfo(LevelId).GetBlockNew( (args.get("x"), args.get("y"), args.get("z")), dim) - if b and b.get("name") in self.blockOwner: - return + clickedName = b.get("name") if b else None except Exception: pass - handled = service.handleItemUseOn(args) - if handled: - args['ret'] = True - self._cancelItemUse[playerId] = True + for service in services: + # 被点方块属于某个"右键方块"服务的管辖(条箱/挂肉钩/锅具等) → 该方块右键由 + # ServerBlockUseEvent 处理(放入/挂鱼/做菜), 跳过本服务的 itemUseOn, + # 避免与方块右键逻辑重复(如手持鲑鱼右键条箱应放入而非放置死鲑鱼)。 + # 例外: 被点方块的 owner 就是当前服务自己(如 食材裹粉: 面粉块归 ShicaiService + # 管辖, 手持生食材右键它时放行给 handleItemUseOn 处理) 则继续尝试。 + if clickedName and clickedName in self.blockOwner: + if self.blockOwner[clickedName] is not service: + continue + + handled = service.handleItemUseOn(args) + if handled: + args['ret'] = True + self._cancelItemUse[playerId] = True + return # ============================================================================ # 主入口3:拦截物品使用(防止喝药水/吃食物等默认行为) diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shicai/ShicaiData.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shicai/ShicaiData.py index 84eede9..3334475 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shicai/ShicaiData.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shicai/ShicaiData.py @@ -63,7 +63,8 @@ GARLIC_BLOCK = "rtdd:cutgarlic" GARLIC_CHOP_COUNT = 3 GARLIC_DROP = {"name": "rtdd:crushedgarlic", "count": 16} -# ---- 裹粉: 面粉块 + 生食材 -> 掉落裹粉半成品 ---- +# ---- 裹粉: 面粉块(farineblock_3) + 生食材 -> 掉落裹粉半成品 ---- +# 只支持"面粉块"这一个方块(用户指定 tile.rtdd:farineblock_3.name=面粉块) FLOUR_BLOCK = "rtdd:farineblock_3" COATING_RULES = [ {"item": "rtdd:sashimi", "count": 6, @@ -78,6 +79,14 @@ COATING_RULES = [ "drop": {"name": "rtdd:oilfrenchfries", "count": 10}}, ] +# ---- 肉馅按压: 空手右键 生猪肉馅/生牛肉馅 -> 按压成型 ---- +MEAT_PRESS_RULES = [ + {"source": "rtdd:rawmeatball_0", "target": "rtdd:rawmeatball_2", + "tip": "§a生猪肉馅按压成型了"}, + {"source": "rtdd:rawmeatball_1", "target": "rtdd:rawmeatball_3", + "tip": "§a生牛肉馅按压成型了"}, +] + # ---- 左键破坏掉落: 摆在地上的切配方块 -> 原版食材(相对"切配态"的原版不切物品) ---- DESTROY_DROP = { "rtdd:cutcarrot_0": "minecraft:carrot", diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shicai/service/ShicaiService.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shicai/service/ShicaiService.py index 297821e..db0ad61 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shicai/service/ShicaiService.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/shicai/service/ShicaiService.py @@ -35,6 +35,7 @@ from ....BlueFoxTools.ToolsConfig import LevelId from ..ShicaiData import ( CLEAVER_ITEM, CHOP_CHAINS, GARLIC_BLOCK, GARLIC_CHOP_COUNT, GARLIC_DROP, FLOUR_BLOCK, COATING_RULES, DESTROY_DROP, + MEAT_PRESS_RULES, ) # ---- 统一分发器 ---- @@ -58,9 +59,20 @@ class ShicaiService(BlueFoxServerSystem): self.chopMap[b] = (chain, i) self.featureBlocks.add(b) - # ---- 蒜末方块 + 面粉块 ---- + # ---- 蒜末方块 + 肉馅(按压) + 面粉块 ---- + # 面粉块(farineblock_3) 注册进 blockOwner 仅用于"去重标记": 裹粉本身走 + # OnItemUseOn(ServerItemUseOnEvent), 但把它标记为 ShicaiService 管辖后, + # 原版放置(YuanbanService) 手持土豆/鸡肉/猪肉右键面粉块时会因去重跳过放置。 + # (OnBlockUse 路由到本类 handleBlockUse 时无裹粉分支, 直接返回 False, 无副作用) self.featureBlocks.add(GARLIC_BLOCK) self.featureBlocks.add(FLOUR_BLOCK) + for r in MEAT_PRESS_RULES: + self.featureBlocks.add(r["source"]) + + # ---- 肉馅按压映射 ---- + self.meatPressMap = {} + for r in MEAT_PRESS_RULES: + self.meatPressMap[r["source"]] = r # ---- 裹粉规则映射: 手持物品名 -> 规则 ---- self.coatingMap = {} @@ -85,8 +97,35 @@ class ShicaiService(BlueFoxServerSystem): return self.featureBlocks def getItemUseOnRules(self): - """手持物品右键方块表面不需要单独路由, 返回空""" - return {} + """手持生食材右键方块表面路由(裹粉): 注册全部裹粉食材(含原版物品)。 + 与原版放置(YuanbanService) 的物品冲突由 FeatureDispatcher 多服务 fallback 解决: + 本服务先试(面粉块裹粉), 失败再交给 YuanbanService(放置)。""" + rules = {} + for r in COATING_RULES: + rules[r["item"]] = True + return rules + + def handleItemUseOn(self, args): + """由 FeatureDispatcher 转发的"手持物品右键方块表面"入口(裹粉): + 手持生食材右键 面粉块(farineblock_3) 表面 -> 裹粉。 + 返回 True=处理了; False=不属本功能管(交还其他服务/默认行为)。""" + itemName = args.get("itemName") + playerId = args.get("playerId") or args.get("entityId") + x, y, z = args.get("x"), args.get("y"), args.get("z") + dim = comp.CreateDimension(playerId).GetEntityDimensionId() + key = (dim, x, y, z) + + # 被点方块必须是 面粉块(farineblock_3) + try: + cur = comp.CreateBlockInfo(LevelId).GetBlockNew((x, y, z), dim) + if not cur or cur.get("name") != FLOUR_BLOCK: + return False + except Exception: + return False + + itemDict = self.getCarriedItem(playerId) + itemName2 = itemDict.get("newItemName") if itemDict else None + return self._handleCoating(playerId, (x, y, z), dim, itemDict, itemName2, key) def handleDestroy(self, args): """由 FeatureDispatcher 转发的"玩家左键破坏方块"入口。 @@ -134,6 +173,10 @@ class ShicaiService(BlueFoxServerSystem): itemDict = self.getCarriedItem(playerId) itemName = itemDict.get("newItemName") if itemDict else None + # ---- 肉馅按压(空手右键) ---- + if blockName in self.meatPressMap: + return self._handleMeatPress(blockName, playerId, pos, dim, itemName, key) + # ---- 菜刀切分 ---- if blockName in self.chopMap: return self._handleChop(blockName, playerId, pos, dim, itemDict, itemName, key) @@ -142,14 +185,25 @@ class ShicaiService(BlueFoxServerSystem): if blockName == GARLIC_BLOCK: return self._handleGarlic(playerId, pos, dim, itemDict, itemName, key) - # ---- 裹粉 ---- - if blockName == FLOUR_BLOCK: - return self._handleCoating(playerId, pos, dim, itemDict, itemName, key) - return False # ============================================================================ - # 二、菜刀切分配 + # 二、肉馅按压(空手右键) + # ============================================================================ + + def _handleMeatPress(self, blockName, playerId, pos, dim, itemName, key): + # 必须空手 + if itemName and itemName != "minecraft:air": + return False + rule = self.meatPressMap[blockName] + if not self.checkCooldown(key, 0.5): + return True + self.replaceBlock(pos, dim, rule["target"], playerId) + comp.CreateMsg(playerId).NotifyOneMessage(playerId, rule["tip"]) + return True + + # ============================================================================ + # 三、菜刀切分配 # ============================================================================ def _handleChop(self, blockName, playerId, pos, dim, itemDict, itemName, key): diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_apple_pile.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_apple_pile.json index 261dfd7..a3e3fae 100644 --- a/behavior_pack_v8jz0zSR/netease_recipes/xy_apple_pile.json +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_apple_pile.json @@ -10,6 +10,10 @@ "item": "minecraft:apple", "data": 0 }, + "4": { + "item": "minecraft:apple", + "data": 0 + }, "2": { "item": "minecraft:apple", "data": 0 @@ -40,7 +44,7 @@ }, "pattern": [ "012", - "3 5", + "345", "678" ], "result": { diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_bread_pile.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_bread_pile.json index bc54f41..cdb84fc 100644 --- a/behavior_pack_v8jz0zSR/netease_recipes/xy_bread_pile.json +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_bread_pile.json @@ -10,6 +10,10 @@ "item": "minecraft:bread", "data": 0 }, + "4": { + "item": "minecraft:bread", + "data": 0 + }, "2": { "item": "minecraft:bread", "data": 0 @@ -40,7 +44,7 @@ }, "pattern": [ "012", - "3 5", + "345", "678" ], "result": { diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_carrot_pile.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_carrot_pile.json index a25aab0..7491844 100644 --- a/behavior_pack_v8jz0zSR/netease_recipes/xy_carrot_pile.json +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_carrot_pile.json @@ -10,6 +10,10 @@ "item": "minecraft:carrot", "data": 0 }, + "4": { + "item": "minecraft:carrot", + "data": 0 + }, "2": { "item": "minecraft:carrot", "data": 0 @@ -40,7 +44,7 @@ }, "pattern": [ "012", - "3 5", + "345", "678" ], "result": { diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_cod_pile.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_cod_pile.json index 872ee48..817de95 100644 --- a/behavior_pack_v8jz0zSR/netease_recipes/xy_cod_pile.json +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_cod_pile.json @@ -10,6 +10,10 @@ "item": "minecraft:cod", "data": 0 }, + "4": { + "item": "minecraft:cod", + "data": 0 + }, "2": { "item": "minecraft:cod", "data": 0 @@ -40,7 +44,7 @@ }, "pattern": [ "012", - "3 5", + "345", "678" ], "result": { diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_potato_pile.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_potato_pile.json index 33a1f1d..f1a349b 100644 --- a/behavior_pack_v8jz0zSR/netease_recipes/xy_potato_pile.json +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_potato_pile.json @@ -10,6 +10,10 @@ "item": "minecraft:potato", "data": 0 }, + "4": { + "item": "minecraft:potato", + "data": 0 + }, "2": { "item": "minecraft:potato", "data": 0 @@ -40,7 +44,7 @@ }, "pattern": [ "012", - "3 5", + "345", "678" ], "result": { diff --git a/behavior_pack_v8jz0zSR/netease_recipes/xy_salmon_pile.json b/behavior_pack_v8jz0zSR/netease_recipes/xy_salmon_pile.json index c7baccf..ea99110 100644 --- a/behavior_pack_v8jz0zSR/netease_recipes/xy_salmon_pile.json +++ b/behavior_pack_v8jz0zSR/netease_recipes/xy_salmon_pile.json @@ -10,6 +10,10 @@ "item": "minecraft:salmon", "data": 0 }, + "4": { + "item": "minecraft:salmon", + "data": 0 + }, "2": { "item": "minecraft:salmon", "data": 0 @@ -40,7 +44,7 @@ }, "pattern": [ "012", - "3 5", + "345", "678" ], "result": { diff --git a/tuilun/全部功能做了什么.txt b/tuilun/全部功能做了什么.txt index d2f28fc..9eb97bc 100644 --- a/tuilun/全部功能做了什么.txt +++ b/tuilun/全部功能做了什么.txt @@ -457,18 +457,26 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher) 四、蒜末(手持 菜刀 右键 大蒜cutgarlic, 3次) - 大蒜 -> 掉16蒜末(crushedgarlic) + 变空气 [已实现] -五、裹粉半成品(手持生食材右键 面粉块farineblock_3, 消耗面粉块变空气 + 掉落产物) +五、裹粉半成品(手持生食材右键 面粉块farineblock_3 表面, 消耗面粉块变空气 + 掉落产物) +- 只认"面粉块"farineblock_3 这一个方块(用户指定) [已实现] +- 事件路径: 裹粉是"手持物品右键方块表面"场景, 走 OnItemUseOn(ServerItemUseOnEvent); + 因此 ShicaiService 注册裹粉食材到 itemUseOnOwner, FeatureDispatcher 改造成 + 多服务 fallback(itemUseOnAll), 与原版放置(YuanbanService) 共享 土豆/鸡肉/猪肉 + 的注册: 右键面粉块→裹粉先命中; 右键地面→裹粉返回False后交给原版放置 [已实现] - 生鱼片(sashimi) x6 -> 裹粉的鱼(oilfish_0) x1 [已实现] - 龙虾(lobster) x2 -> 裹粉的天妇罗(oiltempura) x1 [已实现] - 原版猪肉 x1 -> 裹粉的猪肉(oilpork) x1 [已实现] - 原版生鸡肉 x1 -> 裹粉的鸡块(oil_chickennuggets) x6 [已实现] - 原版土豆 x1 -> 裹粉的薯条(oilfrenchfries) x10 [已实现] -六、工作台配方(netease_recipes) +七、肉馅按压(空手右键, ShicaiService._handleMeatPress) [已实现] +- 生猪肉馅(rawmeatball_0) 空手右键 -> 生猪肉馅(按压 rawmeatball_2) [已实现] +- 生牛肉馅(rawmeatball_1) 空手右键 -> 生牛肉馅(按压 rawmeatball_3) [已实现] + +八、工作台配方(netease_recipes) - 大蒜串: 大蒜x7 + 支杆(b_34)x2 -> garlicskewers (xy_garlicskewers) [已实现] - 辣椒串: 辣椒(pepper)x7 + 支杆x2 -> chiliskewer (xy_chiliskewer) [已实现] -- 桃子堆: 桃子(peach)x9 -> peachpile_0 (xy_peachpile_0) [已实现] -- 橙子堆: 橙子(orange)x9 -> orangepile_0 (xy_orangepile_0) [已实现] - (注: 苹果/面包/胡萝卜/鳕鱼/土豆/鲑鱼堆 为既有 8合1(中间空) 配方; 鸡蛋堆为 9满格; - 分解配方待确认后补充, 见 全部功能没做什么.txt) +- 食材堆合成(9满格): 苹果/面包/胡萝卜/鳕鱼/土豆/鲑鱼堆 由原 8合1(中间空) 统一改 9满格 [已实现] +- 桃子堆/橙子堆: 9满格 (xy_peachpile_0 / xy_orangepile_0) [已实现] +- 食材堆分解(堆放工作台): 9个堆均新增分解配方 xy_*_pile_unpack -> 对应食材x9 [已实现]