From 0bf10f1cb3e1a1b7cab0fb414624de075439c656 Mon Sep 17 00:00:00 2001 From: wenhe <1046926120@qq.com> Date: Fri, 11 Sep 2026 12:11:59 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=A2=E9=A3=9F=207=20=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=A1=A5=E5=85=85=20=E7=83=A4=E7=82=89=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E7=89=A9=E5=93=81=20=E5=8F=98=E6=88=90=E6=8E=89=E8=90=BD?= =?UTF-8?q?=E7=89=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xiangyemod/mianshi/MianshiData.py | 25 ++++++ .../mianshi/service/MianshiService.py | 76 +++++++++++++++++-- .../mianshi/service/MianshiTimerService.py | 50 +++++++++++- tuilun/全部功能做了什么.txt | 9 ++- tuilun/面食.甜食转化关系.txt | 14 ++-- 5 files changed, 157 insertions(+), 17 deletions(-) diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/MianshiData.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/MianshiData.py index aa5e913..444493c 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/MianshiData.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/MianshiData.py @@ -62,6 +62,31 @@ OVEN_FIX_BLOCKS = { "rtdd:cakebatterblock_0", "rtdd:plate_34", "rtdd:creampastry_0", } +# 烤制完成后的成品方块(下方是烤炉时空手右键 -> 掉落取走, 烤炉本身不参与): +# 法棍/吐司/可颂/甜甜圈胚(烤熟)/蛋糕面糊(烤熟)/布丁半成品/舒芙蕾 +OVEN_RESULT_BLOCKS = { + "rtdd:bread_1", "rtdd:bread_2", "rtdd:bread_3", "rtdd:bread_4c", + "rtdd:cakebatterblock", "rtdd:plate_35", "rtdd:souffle_0", +} + +# 物品/方块 -> 中文名(用于"下一步操作"提示) +NAME_MAP = { + EGG: "鸡蛋", CLEAVER: "菜刀", ROLLINGPIN: "擀面杖", + PORK_FILLING: "猪肉馅", BEEF_FILLING: "牛肉馅", VEGGIE: "青菜碎", + COOKED_BEEF: "熟牛肉", COOKED_PORK: "熟猪肉", COOKED_COD: "熟鳕鱼", + POTATO: "熟土豆", BROWN_RICE: "生大米", CREAM: "奶油", + HONEY: "蜂蜜", BERRIES: "浆果", SUGAR: "糖", PLATE: "盘子", + BOWL: "木碗", STEAMER: "蒸笼", OVEN: "烤炉", LIT_STOVE: "点燃的炉灶", + "rtdd:bread_1": "法棍", "rtdd:bread_2": "吐司", "rtdd:bread_3": "可颂", + "rtdd:bread_4": "甜甜圈", "rtdd:bread_4c": "甜甜圈胚(烤熟)", + "rtdd:shouroubao": "熟肉包子", "rtdd:cream_0": "奶油", + "rtdd:dumplings_4": "生饺子", "rtdd:roubaozi_3": "生肉包子", + "rtdd:bamboo_4": "竹筒(加入肉)", "rtdd:plate_34": "蛋液半成品", + "rtdd:dought_7": "生面饼", "rtdd:farineblock_1": "面粉(加鸡蛋)", + "rtdd:cakebatterblock": "蛋糕面糊(烤熟)", "rtdd:plate_35": "布丁半成品", + "rtdd:souffle_0": "舒芙蕾", "rtdd:dumplings_0": "饺子皮", +} + # 竹筒饭加肉: 接受原版常见生熟肉类(【待确认】具体肉类未定, 先放开常见肉) MEAT_ITEMS = [ "minecraft:porkchop", "minecraft:cooked_porkchop", diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/service/MianshiService.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/service/MianshiService.py index 948d5a5..5c77f11 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/service/MianshiService.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/service/MianshiService.py @@ -37,7 +37,8 @@ from ....BlueFoxTools.ToolsConfig import LevelId from ..MianshiData import ( CLEAVER, ROLLINGPIN, BOWL, OVEN, STEAMER, MEAT_ITEMS, FILLING_ITEMS, RICH_MEAT_ITEMS, - SWITCH_RULES, KNEAD_COUNTERS, ITEM_USE_ON_RULES, OVEN_FIX_BLOCKS, + SWITCH_RULES, KNEAD_COUNTERS, ITEM_USE_ON_RULES, TIMER_RULES, + OVEN_FIX_BLOCKS, OVEN_RESULT_BLOCKS, NAME_MAP, ) # ---- 统一分发器 ---- @@ -85,6 +86,35 @@ class MianshiService(BlueFoxServerSystem): for b in OVEN_FIX_BLOCKS: self.featureBlocks.add(b) + # 烤制成品也登记右键路由(空手右键取走) + for b in OVEN_RESULT_BLOCKS: + self.featureBlocks.add(b) + + # ---- 目标方块 -> "下一步操作"提示(自动生成, 供转换/计时完成提示追加) ---- + self.nextOps = {} + for r in SWITCH_RULES: + item = r.get("item") + if item is None: + op = "空手右键" + elif item == CLEAVER: + op = "手持菜刀右键" + elif item == ROLLINGPIN: + op = "手持擀面杖右键" + else: + op = "手持%s右键" % NAME_MAP.get(item, "对应物品") + self.nextOps.setdefault(r["block"], []).append(op) + for r in ITEM_USE_ON_RULES: + it = r["item"] + self.nextOps.setdefault(it, []).append( + "手持%s右键%s" % (NAME_MAP.get(it, "它"), NAME_MAP.get(r["surface"], "表面"))) + for r in TIMER_RULES: + src = r["source"] + if r.get("below"): + self.nextOps.setdefault(src, []).append( + "放在%s上计时" % NAME_MAP.get(r["below"][0], "下方方块")) + else: + self.nextOps.setdefault(src, []).append("自动计时") + # ---- itemUseOn 映射: 手持物品 -> 规则 ---- self.itemUseOnMap = {} for r in ITEM_USE_ON_RULES: @@ -131,7 +161,18 @@ class MianshiService(BlueFoxServerSystem): if blockName in OVEN_FIX_BLOCKS and self._belowIs(dim, pos, OVEN): FeatureDispatcher.startTimerFor(blockName, dim, pos, playerId) if self.checkCooldown(key, 0.4): - comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a开始烤制…(60秒)") + comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a开始烤制…(60秒), 烤好空手右键取走") + return True + + # ---- 烤制成品取走: 空手右键成品(下方是烤炉) -> 成品掉落物, 烤炉不动 ---- + if blockName in OVEN_RESULT_BLOCKS and self._belowIs(dim, pos, OVEN) \ + and (not itemName or itemName == "minecraft:air"): + if not self.checkCooldown(key, 0.4): + return True + self.clearBlock(pos, dim) + self.dropItem(dim, pos, blockName) + comp.CreateMsg(playerId).NotifyOneMessage( + playerId, "§a取走" + self._nameOf(blockName)) return True # ---- 常规转换 ---- @@ -208,7 +249,11 @@ class MianshiService(BlueFoxServerSystem): rule["startTimer"], dim, (x, y, z), playerId) if rule.get("tip"): - comp.CreateMsg(playerId).NotifyOneMessage(playerId, rule["tip"]) + tip = rule["tip"] + nxt = self._nextOpsFor(rule.get("replace") or rule.get("above")) + if nxt: + tip += ";下一步: " + "、".join(nxt) + comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip) return True # ============================================================================ @@ -300,9 +345,13 @@ class MianshiService(BlueFoxServerSystem): # 转换后启动计时(发酵等, 记录玩家以便完成提示送达) if recipe.get("startTimer"): FeatureDispatcher.startTimerFor(recipe["startTimer"], dim, pos, playerId) - # 提示 + # 提示(追加"下一步操作"指引) if recipe.get("tip"): - comp.CreateMsg(playerId).NotifyOneMessage(playerId, recipe["tip"]) + tip = recipe["tip"] + nxt = self._nextOpsFor(recipe.get("target") or recipe.get("dropItem")) + if nxt: + tip += ";下一步: " + "、".join(nxt) + comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip) # ============================================================================ # 五、工具方法:判断正下方是否指定方块(烤炉/点燃炉灶) @@ -315,6 +364,23 @@ class MianshiService(BlueFoxServerSystem): except Exception: return False + def _nameOf(self, blockName): + """方块/物品的中文名(提示用), 未知则原样""" + return NAME_MAP.get(blockName, blockName) + + def _nextOpsFor(self, key): + """返回某方块/物品的"下一步操作"提示列表(去重保序)""" + if not key: + return [] + ops = self.nextOps.get(key, []) + seen = set() + out = [] + for o in ops: + if o not in seen: + seen.add(o) + out.append(o) + return out + # ============================================================================ # 六、工具方法:获取玩家主手物品 # ============================================================================ diff --git a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/service/MianshiTimerService.py b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/service/MianshiTimerService.py index 990d79a..ac7071b 100644 --- a/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/service/MianshiTimerService.py +++ b/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/xiangyemod/mianshi/service/MianshiTimerService.py @@ -171,6 +171,12 @@ class MianshiTimerService(BlueFoxServerSystem): self._setAir(dim, pos) self._notifyIfOnline(data.get("rtdd_tp"), BREAK_TIP) + # 蒸制/烤制/发酵 完成后的"下一步"指引(按目标方块) + _STEAM_DONE = {"rtdd:steamerdumplings_1", "rtdd:baozilong_2", + "rtdd:bamboo_7", "rtdd:steamermilkandegg_1"} + _OVEN_DONE = {"rtdd:bread_1", "rtdd:bread_2", "rtdd:bread_3", "rtdd:bread_4c", + "rtdd:cakebatterblock", "rtdd:plate_35", "rtdd:souffle_0"} + def _finishTimer(self, dim, pos, rule, data): try: cur = comp.CreateBlockInfo(LevelId).GetBlockNew(pos, dim) @@ -180,8 +186,48 @@ class MianshiTimerService(BlueFoxServerSystem): # 到点转换 self.replaceBlock(pos, dim, rule["target"], None) self._clearTimerData(dim, pos) - if rule.get("doneTip"): - self._notifyIfOnline(data.get("rtdd_tp"), rule["doneTip"]) + tip = rule.get("doneTip", "") + if tip: + tip += self._nextStepTip(rule) + self._notifyIfOnline(data.get("rtdd_tp"), tip) + if not data.get("rtdd_tp"): + self._notifyNearby(dim, pos, tip) + except Exception: + pass + + def _nextStepTip(self, rule): + """计时完成后的"下一步"指引(让玩家知道该干什么)""" + t = rule.get("target", "") + if t in self._STEAM_DONE: + return ";空手右键取出" + if t in self._OVEN_DONE: + return ";空手右键取走" + if t == "rtdd:dough_0": + return ";可空手擀面或手持菜刀切小面团" + if t == "rtdd:breaddough_1a": + return ";放烤炉上烤制" + return "" + + def _notifyNearby(self, dim, pos, tip, radius=6): + """完成提示兜底: 发起玩家不在/未知时, 提示该方块附近(三维距离)的在线玩家""" + if not tip: + return + try: + r2 = radius * radius + for pid in comp.CreateGame(LevelId).GetAllPlayerIds(): + try: + if comp.CreateDimension(pid).GetEntityDimensionId() != dim: + continue + fp = comp.CreatePos(pid).GetFootPos() + if fp is None: + continue + dx = fp[0] - pos[0] + dy = fp[1] - pos[1] + dz = fp[2] - pos[2] + if dx * dx + dy * dy + dz * dz <= r2: + comp.CreateMsg(pid).NotifyOneMessage(pid, tip) + except Exception: + pass except Exception: pass diff --git a/tuilun/全部功能做了什么.txt b/tuilun/全部功能做了什么.txt index 292a16f..65dcb2e 100644 --- a/tuilun/全部功能做了什么.txt +++ b/tuilun/全部功能做了什么.txt @@ -624,12 +624,15 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher) - 蛋液半成品 手持右键蒸笼 -> 蒸笼(蒸牛奶鸡蛋_生), 60秒 -> 熟 [已实现] 【烤炉机制】下方判定为烤炉才对该方块计时(烤炉只做判断); 计时中烤炉被打碎 -> -终止计时 + 烤炉上方方块变掉落物 + 提示 [已实现] +终止计时 + 烤炉上方方块变掉落物 + 提示; 烤制完成成品 空手右键(下方是烤炉) -> +成品掉落取走(烤炉不动) [已实现] 【蒸笼机制】手持生食右键蒸笼 -> 蒸笼变蒸X_生(蒸笼原位); 蒸X_生下方是 点燃的炉灶(stove_2)才计时60秒 -> 熟; 取出时蒸笼归位 [已实现] 【信息提示】所有转换有成功提示(含消耗数量); 计时开始提示(和面完成开始发酵/ -转法棍胚开始发酵/烤制60秒/蒸制); 计时完成提示发给发起玩家; 烤炉被打碎/ -蒸笼下炉灶移走有中断/暂停提示 [已实现] +转法棍胚开始发酵/烤制60秒/蒸制); 计时完成提示发给发起玩家(发起者不在则提示附近 +玩家); 烤炉被打碎/蒸笼下炉灶移走有中断/暂停提示 [已实现] +【操作方向提示】每个转换完成后自动追加"下一步"指引(如: 空手右键/手持菜刀右键/ +手持生饺子右键蒸笼/放烤炉上计时/空手右键取走等), 玩家始终知道下一步干什么 [已实现] 【右键体验】右键转换/放入/取出均有0.4秒冷却(长按不会疯狂弹提示); 手持方块物品 右键"功能方块"时若无非处理服务, 直接取消默认放置, 不会"先放一个方块再消失" [已实现] diff --git a/tuilun/面食.甜食转化关系.txt b/tuilun/面食.甜食转化关系.txt index f3693ed..e5348a0 100644 --- a/tuilun/面食.甜食转化关系.txt +++ b/tuilun/面食.甜食转化关系.txt @@ -207,13 +207,13 @@ todo 熟竹筒饭 右键吃 (吃的操作后续实现) 51. 法棍面胚_1(未发面) -> 法棍面胚_2(发面) 转换条件:[计时发酵60秒] 52. 法棍面胚_2(发面) -> 法棍 -转换条件:[下方方块是 烤炉, 计时60秒] +转换条件:[下方方块是 烤炉, 计时60秒; 烤好 空手右键取走] 53. 吐司面胚 -> 吐司1 -转换条件:[下方方块是 烤炉, 计时60秒] +转换条件:[下方方块是 烤炉, 计时60秒; 烤好 空手右键取走] 54. 甜甜圈胚(生) -> 甜甜圈胚(烤熟) -转换条件:[下方方块是 烤炉, 计时60秒] +转换条件:[下方方块是 烤炉, 计时60秒; 烤好 空手右键取走] 55. 可颂面胚 -> 可颂1 -转换条件:[下方方块是 烤炉, 计时60秒] +转换条件:[下方方块是 烤炉, 计时60秒; 烤好 空手右键取走] 56. 蛋液半成品: 由 搅拌器 鸡蛋牛奶 用盘子取出(厨具转化关系.txt), 供甜点/蒸蛋 ======================================== @@ -228,7 +228,7 @@ todo 熟竹筒饭 右键吃 (吃的操作后续实现) 转换条件:[手持 面粉(加鸡蛋) 右键, 消耗1个] 机制: 面粉(加鸡蛋)倒入木碗成面糊 58. 蛋糕面糊(生) -> 蛋糕面糊(烤熟) -转换条件:[下方方块是 烤炉, 计时60秒] +转换条件:[下方方块是 烤炉, 计时60秒; 烤好 空手右键取走] 59. 蛋糕面糊(烤熟) -> 蛋糕胚 转换条件:[右键脱模, 掉落 1个蛋糕胚 + 1个木碗] 60. 蛋糕胚 + 奶油(食材) -> 奶油蛋糕 @@ -242,13 +242,13 @@ todo 巧克力暂不实现 转换条件:[手持 菜刀 右键拆分, 半块消失 + 掉落 2个 小块] todo 各小块 空手右键 吃 (吃的操作后续实现) 63. 蛋液半成品 -> 布丁半成品 -转换条件:[下方方块是 烤炉, 计时60秒] +转换条件:[下方方块是 烤炉, 计时60秒; 烤好 空手右键取走] 64. 布丁半成品 -> 焦糖布丁 转换条件:[手持 糖 右键, 消耗16个] 65. 蛋液半成品 -> 舒芙蕾半成品 转换条件:[手持 奶油 右键, 消耗1个] 66. 舒芙蕾半成品 -> 舒芙蕾 -转换条件:[下方方块是 烤炉, 计时60秒] +转换条件:[下方方块是 烤炉, 计时60秒; 烤好 空手右键取走] 67. 蒸笼 + 蛋液半成品 -> 蒸笼(蒸牛奶鸡蛋_生) -> 蒸笼(蒸牛奶鸡蛋_熟) 转换条件:[手持 蛋液半成品 右键蒸笼 -> 蒸笼(蒸牛奶鸡蛋_生); 蒸笼下面要点燃的炉灶(stove_2)才计时60秒变熟]