From 0cb1da680d16b887ef1a38ac60c3a5a13368527c Mon Sep 17 00:00:00 2001 From: wenhe <1046926120@qq.com> Date: Thu, 3 Sep 2026 15:42:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=B6=E5=85=B7=E5=AE=9E=E7=8E=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xiangyemod/jiaju/FurnitureData.py | 116 ++++++++---------- .../jiaju/service/FurnitureService.py | 73 ++++++++++- tuilun/全部功能做了什么.txt | 18 +-- tuilun/家具家私转化关系.txt | 7 +- 4 files changed, 133 insertions(+), 81 deletions(-) diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/FurnitureData.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/FurnitureData.py index 359faf5..b3c3235 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/FurnitureData.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/FurnitureData.py @@ -59,6 +59,9 @@ FLUME_RULES = [ {"source": "rtdd:flume_1", "item": "minecraft:bucket", "target": "rtdd:flume_0", "consume": 1, "giveItem": "minecraft:water_bucket", "tip": "§a取走了水, 水桶装满水"}, + # 满水空手右键 -> 直接放空(倒掉水) + {"source": "rtdd:flume_1", "item": None, + "target": "rtdd:flume_0", "tip": "§a水槽已放空"}, # 放脏盘子(需满水) {"source": "rtdd:flume_1", "item": "rtdd:plate_0a", "target": "rtdd:flume_2", "consume": 1, "tip": "§a放入1个脏盘子"}, @@ -68,15 +71,15 @@ FLUME_RULES = [ "target": "rtdd:flume_4", "consume": 1, "tip": "§a放入1个脏盘子"}, {"source": "rtdd:flume_4", "item": "rtdd:plate_0a", "target": "rtdd:flume_5", "consume": 1, "tip": "§a放入1个脏盘子"}, - # 取脏盘子 + # 取脏盘子(洗好取出的是 盘子 rtdd:plate_0) {"source": "rtdd:flume_5", "item": None, - "target": "rtdd:flume_4", "giveItem": "rtdd:plate_0a", "tip": "§a取回1个脏盘子"}, + "target": "rtdd:flume_4", "giveItem": "rtdd:plate_0", "tip": "§a取回1个盘子"}, {"source": "rtdd:flume_4", "item": None, - "target": "rtdd:flume_3", "giveItem": "rtdd:plate_0a", "tip": "§a取回1个脏盘子"}, + "target": "rtdd:flume_3", "giveItem": "rtdd:plate_0", "tip": "§a取回1个盘子"}, {"source": "rtdd:flume_3", "item": None, - "target": "rtdd:flume_2", "giveItem": "rtdd:plate_0a", "tip": "§a取回1个脏盘子"}, + "target": "rtdd:flume_2", "giveItem": "rtdd:plate_0", "tip": "§a取回1个盘子"}, {"source": "rtdd:flume_2", "item": None, - "target": "rtdd:flume_1", "giveItem": "rtdd:plate_0a", "tip": "§a取回1个脏盘子"}, + "target": "rtdd:flume_0", "giveItem": "rtdd:plate_0", "tip": "§a取回最后1个盘子"}, ] # ============================================================ @@ -158,70 +161,48 @@ for _i in range(len(_BOOKCASE_CHAIN) - 1, 0, -1): }) # ============================================================ -# 五、厨具架 (kitchenwarerack, 至多挂2件, 方块状态即组合, 纯切换) +# 五、厨具架 (kitchenwarerack, 至多挂2件) +# 组合由方块状态+stack记录决定, 与放入顺序无关, 取回后放先取。 +# 通用逻辑在 FurnitureService._handleKitchenRack, 这里只放常量。 # 可放: 锅铲(spatula) / 锅勺(potandspoon) / 菜刀(cleaver) / 炒锅(wok) # ============================================================ -KITCHENRACK_RULES = [ - # ---- 放入 (空架 -> 单件) ---- - {"source": "rtdd:kitchenwarerack", "item": "rtdd:spatula", - "target": "rtdd:kitchenwareracka_1", "consume": 1, "tip": "§a放上了锅铲"}, - {"source": "rtdd:kitchenwarerack", "item": "rtdd:potandspoon", - "target": "rtdd:kitchenwarerackb_1", "consume": 1, "tip": "§a放上了锅勺"}, - {"source": "rtdd:kitchenwarerack", "item": "rtdd:cleaver", - "target": "rtdd:kitchenwarerackd_1", "consume": 1, "tip": "§a放上了菜刀"}, - {"source": "rtdd:kitchenwarerack", "item": "rtdd:wok", - "target": "rtdd:kitchenwarerackc_1", "consume": 1, "tip": "§a放上了炒锅"}, - # ---- 放入 (单件 -> 双件/组合) ---- - {"source": "rtdd:kitchenwareracka_1", "item": "rtdd:spatula", - "target": "rtdd:kitchenwareracka_2", "consume": 1, "tip": "§a再放上一把锅铲"}, - {"source": "rtdd:kitchenwareracka_1", "item": "rtdd:potandspoon", - "target": "rtdd:kitchenwareracka_3", "consume": 1, "tip": "§a放上了锅勺"}, - {"source": "rtdd:kitchenwarerackb_1", "item": "rtdd:potandspoon", - "target": "rtdd:kitchenwarerackb_2", "consume": 1, "tip": "§a再放上一把锅勺"}, - {"source": "rtdd:kitchenwarerackc_1", "item": "rtdd:cleaver", - "target": "rtdd:kitchenwarerackc_2", "consume": 1, "tip": "§a放上了菜刀"}, - {"source": "rtdd:kitchenwarerackd_1", "item": "rtdd:cleaver", - "target": "rtdd:kitchenwarerackd_3", "consume": 1, "tip": "§a再放上一把菜刀"}, - {"source": "rtdd:kitchenwarerackd_1", "item": "rtdd:spatula", - "target": "rtdd:kitchenwarerackd_2", "consume": 1, "tip": "§a放上了锅铲"}, - {"source": "rtdd:kitchenwarerackd_1", "item": "rtdd:potandspoon", - "target": "rtdd:kitchenwarerackd_4", "consume": 1, "tip": "§a放上了锅勺"}, - # ---- 取回 (空手右键, 掉落对应厨具) ---- - {"source": "rtdd:kitchenwareracka_1", "item": None, - "target": "rtdd:kitchenwarerack", - "dropItem": [{"name": "rtdd:spatula", "count": 1}], "tip": "§a取回了锅铲"}, - {"source": "rtdd:kitchenwareracka_2", "item": None, - "target": "rtdd:kitchenwareracka_1", - "dropItem": [{"name": "rtdd:spatula", "count": 1}], "tip": "§a取回了一把锅铲"}, - {"source": "rtdd:kitchenwareracka_3", "item": None, - "target": "rtdd:kitchenwareracka_1", - "dropItem": [{"name": "rtdd:potandspoon", "count": 1}], "tip": "§a取回了锅勺"}, - {"source": "rtdd:kitchenwarerackb_1", "item": None, - "target": "rtdd:kitchenwarerack", - "dropItem": [{"name": "rtdd:potandspoon", "count": 1}], "tip": "§a取回了锅勺"}, - {"source": "rtdd:kitchenwarerackb_2", "item": None, - "target": "rtdd:kitchenwarerackb_1", - "dropItem": [{"name": "rtdd:potandspoon", "count": 1}], "tip": "§a取回了一把锅勺"}, - {"source": "rtdd:kitchenwarerackc_1", "item": None, - "target": "rtdd:kitchenwarerack", - "dropItem": [{"name": "rtdd:wok", "count": 1}], "tip": "§a取回了炒锅"}, - {"source": "rtdd:kitchenwarerackc_2", "item": None, - "target": "rtdd:kitchenwarerackc_1", - "dropItem": [{"name": "rtdd:cleaver", "count": 1}], "tip": "§a取回了菜刀"}, - {"source": "rtdd:kitchenwarerackd_1", "item": None, - "target": "rtdd:kitchenwarerack", - "dropItem": [{"name": "rtdd:cleaver", "count": 1}], "tip": "§a取回了菜刀"}, - {"source": "rtdd:kitchenwarerackd_2", "item": None, - "target": "rtdd:kitchenwarerackd_1", - "dropItem": [{"name": "rtdd:spatula", "count": 1}], "tip": "§a取回了锅铲"}, - {"source": "rtdd:kitchenwarerackd_3", "item": None, - "target": "rtdd:kitchenwarerackd_1", - "dropItem": [{"name": "rtdd:cleaver", "count": 1}], "tip": "§a取回了一把菜刀"}, - {"source": "rtdd:kitchenwarerackd_4", "item": None, - "target": "rtdd:kitchenwarerackd_1", - "dropItem": [{"name": "rtdd:potandspoon", "count": 1}], "tip": "§a取回了锅勺"}, +KITCHENRACK_BLOCKS = [ + "rtdd:kitchenwarerack", # 厨具架(空) + "rtdd:kitchenwareracka_1", # 单锅铲 + "rtdd:kitchenwareracka_2", # 双锅铲 + "rtdd:kitchenwareracka_3", # 锅铲+锅勺 + "rtdd:kitchenwarerackb_1", # 单锅勺 + "rtdd:kitchenwarerackb_2", # 双锅勺 + "rtdd:kitchenwarerackc_1", # 单炒锅 + "rtdd:kitchenwarerackc_2", # 炒锅+菜刀 + "rtdd:kitchenwarerackd_1", # 单菜刀 + "rtdd:kitchenwarerackd_2", # 菜刀+锅铲 + "rtdd:kitchenwarerackd_3", # 双菜刀 + "rtdd:kitchenwarerackd_4", # 菜刀+锅勺 ] +# 可上架的厨具物品 +KITCHENWARE_ITEMS = ("rtdd:spatula", "rtdd:potandspoon", "rtdd:cleaver", "rtdd:wok") + +# 单件 -> 对应方块 +KITCHENRACK_SINGLE_BLOCK = { + "rtdd:spatula": "rtdd:kitchenwareracka_1", + "rtdd:potandspoon": "rtdd:kitchenwarerackb_1", + "rtdd:wok": "rtdd:kitchenwarerackc_1", + "rtdd:cleaver": "rtdd:kitchenwarerackd_1", +} + +# 双件组合(sorted) -> 对应方块, 顺序无关(先放A再放B == 先放B再放A) +KITCHENRACK_COMBO_BLOCK = { + ("rtdd:potandspoon", "rtdd:spatula"): "rtdd:kitchenwareracka_3", # 锅铲+锅勺 + ("rtdd:cleaver", "rtdd:wok"): "rtdd:kitchenwarerackc_2", # 炒锅+菜刀 + ("rtdd:cleaver", "rtdd:spatula"): "rtdd:kitchenwarerackd_2", # 菜刀+锅铲 + ("rtdd:cleaver", "rtdd:potandspoon"): "rtdd:kitchenwarerackd_4", # 菜刀+锅勺 + ("rtdd:spatula", "rtdd:spatula"): "rtdd:kitchenwareracka_2", # 双锅铲 + ("rtdd:potandspoon", "rtdd:potandspoon"): "rtdd:kitchenwarerackb_2", # 双锅勺 + ("rtdd:cleaver", "rtdd:cleaver"): "rtdd:kitchenwarerackd_3", # 双菜刀 +} + # ============================================================ # 六、古式唱片机 (b_108 无碟 / b_109 有碟) # 放入: 手持任意原版唱片 -> 有碟, 消耗1, 记录唱片(rtdd_disc) @@ -259,8 +240,7 @@ TRASHBIN_RULES = [ ] # ============================================================ -# 汇总: 家具家私全部右键转换规则 +# 汇总: 家具家私右键转换规则(厨具架为通用逻辑, 不在规则表, 单独注册) # ============================================================ FURNITURE_SWITCHES = (ARROWBARREL_RULES + FLUME_RULES + TRAYRACKS_RULES - + BOOKCASE_RULES + KITCHENRACK_RULES - + RECORDPLAYER_RULES + TRASHBIN_RULES) + + BOOKCASE_RULES + RECORDPLAYER_RULES + TRASHBIN_RULES) diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/service/FurnitureService.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/service/FurnitureService.py index 7886181..5d0470d 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/service/FurnitureService.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/jiaju/service/FurnitureService.py @@ -57,7 +57,9 @@ blockEntityDataComp = comp.CreateBlockEntityData(LevelId) gameComp = comp.CreateGame(LevelId) # ---- 只导入家具家私自己的数据库 ---- -from ..FurnitureData import FURNITURE_SWITCHES +from ..FurnitureData import (FURNITURE_SWITCHES, + KITCHENRACK_BLOCKS, KITCHENWARE_ITEMS, + KITCHENRACK_SINGLE_BLOCK, KITCHENRACK_COMBO_BLOCK) # ---- 统一分发器 ---- from ...service.FeatureDispatcher import FeatureDispatcher @@ -82,12 +84,15 @@ class FurnitureService(BlueFoxServerSystem): # ---- 构建规则字典(O(1) 查找) ---- self.furnitureRecipes = {} - self.furnitureBlockSet = set() + self.furnitureBlockSet = set(KITCHENRACK_BLOCKS) # 厨具架通用逻辑, 单独注册 for sw in FURNITURE_SWITCHES: key = (sw["source"], sw.get("item")) self.furnitureRecipes[key] = sw self.furnitureBlockSet.add(sw["source"]) + # ---- 厨具架方块集合(通用组合逻辑用) ---- + self.kitchenrackBlockSet = set(KITCHENRACK_BLOCKS) + # ---- 右键冷却表 ---- self.cooldown = {} @@ -122,6 +127,14 @@ class FurnitureService(BlueFoxServerSystem): key = (dim, x, y, z) itemDict = self.getCarriedItem(playerId) + itemName = itemDict.get("newItemName") if itemDict else None + + # 厨具架: 通用组合逻辑(顺序无关, 后放先取), 单独处理 + if blockName in self.kitchenrackBlockSet: + if not self.checkCooldown(key, 0.5): + return True + self._handleKitchenRack(playerId, pos, dim, itemDict, itemName) + return True recipe = self.findRecipe(blockName, itemDict) if not recipe: @@ -268,7 +281,61 @@ class FurnitureService(BlueFoxServerSystem): playerId, "§a取回了 %d 只箭" % retCount) # ============================================================================ - # 四、切换型规则处理(水槽/盘子架/书柜/厨具架/唱片机/垃圾桶) + # 四、厨具架通用逻辑(组合由 stack 记录计算, 与放入顺序无关, 取回后放先取) + # ============================================================================ + + def _handleKitchenRack(self, playerId, pos, dim, itemDict, itemName): + """ + 厨具架:放入/取回通用处理。 + 放入: 手持 锅铲/锅勺/菜刀/炒锅 右键空架/单件架 -> 按组合(顺序无关)成型 + 取回: 空手右键 -> 弹出最后放入的厨具并返还, 形态退回剩余单件/空 + """ + record = self._loadRecord(pos, dim) + stack = record["stack"] if record else [] + + # ---- 取回: 空手 ---- + if not itemName or itemName == "minecraft:air": + if not stack: + return + topItem = stack.pop() + self.giveItemObj(playerId, topItem) + if stack: + target = KITCHENRACK_SINGLE_BLOCK.get( + stack[0]["itemName"], "rtdd:kitchenwarerack") + else: + target = "rtdd:kitchenwarerack" + self.replaceBlock(pos, dim, target, playerId) + if stack: + self._saveRecordDelayed(pos, dim, {"stack": stack}) + else: + self._clearRecord(pos, dim) + comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a取回了厨具") + return + + # ---- 放入: 手持厨具 ---- + if itemName not in KITCHENWARE_ITEMS: + return + if len(stack) >= 2: + comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§c厨具架已满!") + return + # 计算组合目标方块(顺序无关: 先放A再放B == 先放B再放A) + newItems = [s["itemName"] for s in stack] + [itemName] + if len(newItems) == 1: + target = KITCHENRACK_SINGLE_BLOCK.get(newItems[0]) + else: + target = KITCHENRACK_COMBO_BLOCK.get(tuple(sorted(newItems))) + if not target: + comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§c这个搭配放不上厨具架!") + return + # 消耗1个, 压栈并替换 + self.consumeItem(playerId, itemDict, 1) + stack.append(self._toItemObj(itemDict)) + self.replaceBlock(pos, dim, target, playerId) + self._saveRecordDelayed(pos, dim, {"stack": stack}) + comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a放上了厨具") + + # ============================================================================ + # 五、切换型规则处理(水槽/盘子架/书柜/唱片机/垃圾桶) # ============================================================================ def handleSwitch(self, recipe, playerId, pos, dim, itemDict, key): diff --git a/tuilun/全部功能做了什么.txt b/tuilun/全部功能做了什么.txt index caed8b6..9174f70 100644 --- a/tuilun/全部功能做了什么.txt +++ b/tuilun/全部功能做了什么.txt @@ -200,8 +200,9 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher) 二、水槽 (flume_0~5) - 加水: 空手右键空槽 → 满水 [已实现] - 取水: 手持空水桶右键满水 → 空槽 + 返还装满水的水桶 [已实现] -- 放脏盘子: 满水起手持脏盘子逐个放入(最多4个), 消耗1个 [已实现] -- 取脏盘子: 空手右键逐个取回 [已实现] +- 放水: 空手右键满水 → 直接把水放掉回到空槽(不放水桶取水) [已实现] +- 放脏盘子: 满水起手持脏盘子(rtdd:plate_0a)逐个放入(最多4个), 消耗1个 [已实现] +- 取盘子: 空手右键逐个取回, 取回的是洗好的 盘子(rtdd:plate_0); 取完最后一个 → 空槽 [已实现] 三、盘子架 (trayracks_1 空 ~ trayracks_6 五个) - 放盘子: 手持盘子逐个放入(最多5个), 消耗1个 [已实现] @@ -212,13 +213,12 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher) 字段 rtdd_swt=stack, 退出重进不丢) [已实现] - 取书: 空手右键后放先取(LIFO) [已实现] -五、厨具架 (kitchenwarerack 系列, 纯切换, 方块状态即组合) -- 放入: 手持 锅铲/锅勺/菜刀/炒锅 右键空架/未满架 → 消耗1个 → 形态变为对应组合 [已实现] - (空+锅铲→单锅铲, 空+锅勺→单锅勺, 空+菜刀→单菜刀, 空+炒锅→单炒锅; - 单锅铲+锅铲→双锅铲, 单锅铲+锅勺→锅铲+锅勺, 单锅勺+锅勺→双锅勺, - 单炒锅+菜刀→炒锅+菜刀, 单菜刀+菜刀→双菜刀, 单菜刀+锅铲→菜刀+锅铲, - 单菜刀+锅勺→菜刀+锅勺) -- 取回: 空手右键 → 掉落对应厨具 → 形态退回上一组合/空 [已实现] +五、厨具架 (kitchenwarerack 系列, 组合顺序无关, 后放先取, 至多2件) +- 放入: 手持 锅铲/锅勺/菜刀/炒锅 右键空架/未满架 → 消耗1个 → 按组合成型 [已实现] + (组合与顺序无关: 先放锅再放刀 == 先放刀再放锅, 都是 炒锅+菜刀; + 空+锅铲→单锅铲, 空+锅勺→单锅勺, 空+菜刀→单菜刀, 空+炒锅→单炒锅; + 双锅铲/锅铲+锅勺/双锅勺/炒锅+菜刀/菜刀+锅铲/双菜刀/菜刀+锅勺) +- 取回: 空手右键 → 后放先取(LIFO), 取回最后放入的厨具, 形态退回剩余单件/空 [已实现] 六、古式唱片机 (b_108 无碟 / b_109 有碟) - 放入: 手持任意原版唱片(minecraft:music_disc_*)右键无碟 → 有碟, 消耗1个, 记录唱片 [已实现] diff --git a/tuilun/家具家私转化关系.txt b/tuilun/家具家私转化关系.txt index fd2bb73..baab563 100644 --- a/tuilun/家具家私转化关系.txt +++ b/tuilun/家具家私转化关系.txt @@ -45,6 +45,10 @@ 转换条件:[手持 水桶 右键 进行转换, 消耗空水桶, 获得装满水的水桶] 机制: 手持空水桶右键, 取水, 消耗空水桶返还装满水的水桶(minecraft:water_bucket) +4a. 水槽_2(水槽_满水) -> 水槽_1(水槽_空) +转换条件:[右键 进行转换(放水)] +机制: 空手右键, 直接把水放掉, 回到空槽(不放水桶取水) + 5. 水槽_2(满水) + 脏盘子 -> 水槽_3(一个脏盘子) 转换条件:[手持 脏盘子 右键 进行转换, 脏盘子数量减少] 机制: 手持脏盘子右键, 消耗1个, 放入脏盘子(需水槽有水才能放) @@ -150,7 +154,8 @@ ======================================== - 可放厨具: 锅铲(rtdd:spatula)、锅勺(rtdd:potandspoon)、菜刀(rtdd:cleaver)、炒锅(rtdd:wok) - 放入: 手持厨具右键 厨具架(空/未满) → 放入该厨具, 消耗1个, 厨具架形态变为对应组合 -- 取回: 空手右键 → 取回厨具(后放先取), 厨具架形态退回上一组合/空 + (组合与放入顺序无关: 先放锅再放刀 == 先放刀再放锅, 都是 炒锅+菜刀) +- 取回: 空手右键 → 后放先取(LIFO), 取回最后放入的厨具, 形态退回剩余单件/空 - 厨具架方块状态(方块名称即组合, 一块最多挂2件): kitchenwarerack = 厨具架(空) kitchenwareracka_1 = 厨具架(单锅铲) ← 放1把锅铲