面食 7 提示补充 烤炉转换物品 变成掉落物

This commit is contained in:
wenhe committed 2026-09-11 12:11:59 +08:00
1 parent c1a4de6a9f
commit 0bf10f1cb3
5 files changed
+157 -17

No files matched your search

@@ -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",
@@ -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
# ============================================================================
# 六、工具方法:获取玩家主手物品
# ============================================================================
@@ -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
+6 -3
View File
@@ -624,12 +624,15 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
- 蛋液半成品 手持右键蒸笼 -> 蒸笼(蒸牛奶鸡蛋_生), 60秒 -> 熟 [已实现]
【烤炉机制】下方判定为烤炉才对该方块计时(烤炉只做判断); 计时中烤炉被打碎 ->
终止计时 + 烤炉上方方块变掉落物 + 提示 [已实现]
终止计时 + 烤炉上方方块变掉落物 + 提示; 烤制完成成品 空手右键(下方是烤炉) ->
成品掉落取走(烤炉不动) [已实现]
【蒸笼机制】手持生食右键蒸笼 -> 蒸笼变蒸X_生(蒸笼原位); 蒸X_生下方是
点燃的炉灶(stove_2)才计时60秒 -> 熟; 取出时蒸笼归位 [已实现]
【信息提示】所有转换有成功提示(含消耗数量); 计时开始提示(和面完成开始发酵/
转法棍胚开始发酵/烤制60秒/蒸制); 计时完成提示发给发起玩家; 烤炉被打碎/
蒸笼下炉灶移走有中断/暂停提示 [已实现]
转法棍胚开始发酵/烤制60秒/蒸制); 计时完成提示发给发起玩家(发起者不在则提示附近
玩家); 烤炉被打碎/蒸笼下炉灶移走有中断/暂停提示 [已实现]
【操作方向提示】每个转换完成后自动追加"下一步"指引(如: 空手右键/手持菜刀右键/
手持生饺子右键蒸笼/放烤炉上计时/空手右键取走等), 玩家始终知道下一步干什么 [已实现]
【右键体验】右键转换/放入/取出均有0.4秒冷却(长按不会疯狂弹提示); 手持方块物品
右键"功能方块"时若无非处理服务, 直接取消默认放置, 不会"先放一个方块再消失" [已实现]
+7 -7
View File
@@ -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秒变熟]