油锅 5 加入更好的提示

This commit is contained in:
wenhe committed 2026-09-11 16:12:46 +08:00
1 parent b69e487b10
commit 5627e040ce
7 files changed
+98 -138

No files matched your search

@@ -81,10 +81,20 @@ NAME_MAP = {
"rtdd:bread_4": "甜甜圈", "rtdd:bread_4c": "甜甜圈胚(烤熟)",
"rtdd:shouroubao": "熟肉包子", "rtdd:cream_0": "奶油",
"rtdd:dumplings_4": "生饺子", "rtdd:roubaozi_3": "生肉包子",
"rtdd:bamboo_4": "竹筒(加入肉)", "rtdd:plate_34": "蛋液半成品",
"rtdd:bamboo_4": "竹筒(加肉)", "rtdd:plate_34": "蛋液半成品",
"rtdd:dought_7": "生面饼", "rtdd:farineblock_1": "面粉(加鸡蛋)",
"rtdd:cakebatterblock": "蛋糕面糊(烤熟)", "rtdd:plate_35": "布丁半成品",
"rtdd:souffle_0": "舒芙蕾", "rtdd:dumplings_0": "饺子皮",
# ---- 计时/烤制用到的方块名 ----
"rtdd:dough_0": "发酵面团", "rtdd:rawdough_4": "和好的面团",
"rtdd:breaddough_1": "法棍面胚", "rtdd:breaddough_1a": "发面",
"rtdd:breaddough_2": "吐司面胚", "rtdd:breaddough_4d": "甜甜圈胚",
"rtdd:dought_9": "可颂面胚", "rtdd:cakebatterblock_0": "蛋糕面糊(生)",
"rtdd:creampastry_0": "舒芙蕾半成品", "rtdd:cream_caramel": "焦糖布丁",
"rtdd:steamerdumplings_0": "蒸笼(饺子)", "rtdd:steamerdumplings_1": "熟饺子",
"rtdd:baozilong_1": "蒸笼(包子)", "rtdd:baozilong_2": "熟包子",
"rtdd:bamboo_6": "蒸笼(竹筒饭)", "rtdd:bamboo_7": "熟竹筒饭",
"rtdd:steamermilkandegg": "蒸笼(蛋液)", "rtdd:steamermilkandegg_1": "蒸牛奶鸡蛋",
}
# 竹筒饭加肉: 接受原版常见生熟肉类(【待确认】具体肉类未定, 先放开常见肉)
@@ -119,7 +129,7 @@ SWITCH_RULES = [
{"block": "rtdd:rawdough_1", "item": None, "target": "rtdd:rawdough_2", "tip": "§a和面中…"},
{"block": "rtdd:rawdough_2", "item": None, "target": "rtdd:rawdough_3", "tip": "§a和面中…"},
{"block": "rtdd:rawdough_3", "item": None, "target": "rtdd:rawdough_4",
"startTimer": "rtdd:rawdough_4", "tip": "§a和面完成, 开始发酵(60秒)"},
"startTimer": "rtdd:rawdough_4", "tip": "§a和面完成, 开始发酵"},
{"block": "rtdd:rawdough_4", "item": CLEAVER, "action": "chop_smalldough",
"tip": "§a切出了8个小面团"},
{"block": "rtdd:dough_0", "item": ROLLINGPIN, "target": "rtdd:dough_1",
@@ -260,7 +270,7 @@ SWITCH_RULES = [
# ---- 八、面团·胚料组(右键循环转换) ----
{"block": "rtdd:dough_0", "item": None, "target": "rtdd:breaddough_1",
"startTimer": "rtdd:breaddough_1", "tip": "§a转成法棍面胚, 开始发酵(60秒)"},
"startTimer": "rtdd:breaddough_1", "tip": "§a转成法棍面胚, 开始发酵"},
{"block": "rtdd:breaddough_1", "item": None, "target": "rtdd:breaddough_2",
"tip": "§a转成吐司面胚"},
{"block": "rtdd:breaddough_2", "item": None, "target": "rtdd:breaddough_4d",
@@ -90,30 +90,44 @@ class MianshiService(BlueFoxServerSystem):
for b in OVEN_RESULT_BLOCKS:
self.featureBlocks.add(b)
# ---- 目标方块 -> "下一步操作"提示(自动生成, 供转换/计时完成提示追加) ----
self.nextOps = {}
# ---- 结果方块/物品 -> "下一步"可读提示(供转换/入笼提示追加) ----
# 例子: 饺子皮 -> "加入 猪肉馅、青菜碎"; 可颂面胚 -> "放在烤炉上等计时(60秒)结束变成 可颂"
self.nextTips = {}
def _addTip(key, op):
self.nextTips.setdefault(key, []).append(op)
# 1) 右键转换: 以"当前方块"为 key, 列出玩家可做的操作
for r in SWITCH_RULES:
item = r.get("item")
if item is None:
op = "空手右键"
_addTip(r["block"], "空手右键")
elif item == CLEAVER:
op = "手持菜刀右键"
_addTip(r["block"], "手持菜刀右键")
elif item == ROLLINGPIN:
op = "手持擀面杖右键"
_addTip(r["block"], "手持擀面杖右键")
elif item == PLATE:
_addTip(r["block"], "手持盘子右键取出")
else:
op = "手持%s右键" % NAME_MAP.get(item, "对应物品")
self.nextOps.setdefault(r["block"], []).append(op)
_addTip(r["block"], "加入" + NAME_MAP.get(item, "对应物品"))
# 2) 手持物品右键表面(itemUseOn): 以"手持物品"为 key
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"], "表面")))
_addTip(r["item"], "手持%s右键%s" % (
NAME_MAP.get(r["item"], "它"), NAME_MAP.get(r["surface"], "表面")))
# 3) 计时: 以"计时源方块"为 key, 说清等多久、变成什么
for r in TIMER_RULES:
src = r["source"]
if r.get("below"):
self.nextOps.setdefault(src, []).append(
"放在%s上计时" % NAME_MAP.get(r["below"][0], "下方方块"))
sec = r.get("time", 60)
tgt = NAME_MAP.get(r["target"], r["target"])
if r.get("below") == [OVEN]:
_addTip(src, "放在烤炉上等计时(%d秒)结束变成 %s" % (sec, tgt))
else:
self.nextOps.setdefault(src, []).append("自动计时")
_addTip(src, "等计时(%d秒)结束变成 %s" % (sec, tgt))
# ---- 计时源方块 -> 计时结束后的成品名(烤炉固定开始烤制提示用) ----
self.timerTargetName = {}
for r in TIMER_RULES:
self.timerTargetName[r["source"]] = NAME_MAP.get(r["target"], r["target"])
# ---- itemUseOn 映射: 手持物品 -> 规则 ----
self.itemUseOnMap = {}
@@ -161,7 +175,9 @@ 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秒), 烤好空手右键取走")
tip = "§a开始烤制…(60秒),等计时结束变成 " + \
self.timerTargetName.get(blockName, "成品")
comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip)
return True
# ---- 烤制成品取走: 空手右键成品(下方是烤炉) -> 成品掉落物, 烤炉不动 ----
@@ -250,9 +266,9 @@ class MianshiService(BlueFoxServerSystem):
if rule.get("tip"):
tip = rule["tip"]
nxt = self._nextOpsFor(rule.get("replace") or rule.get("above"))
nxt = self._nextStepTip(rule.get("replace") or rule.get("above"))
if nxt:
tip += ";下一步: " + "、".join(nxt)
tip += ";" + nxt
comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip)
return True
@@ -348,9 +364,9 @@ class MianshiService(BlueFoxServerSystem):
# 提示(追加"下一步操作"指引)
if recipe.get("tip"):
tip = recipe["tip"]
nxt = self._nextOpsFor(recipe.get("target") or recipe.get("dropItem"))
nxt = self._nextStepTip(recipe.get("target") or recipe.get("dropItem"))
if nxt:
tip += ";下一步: " + "、".join(nxt)
tip += ";" + nxt
comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip)
# ============================================================================
@@ -368,18 +384,30 @@ class MianshiService(BlueFoxServerSystem):
"""方块/物品的中文名(提示用), 未知则原样"""
return NAME_MAP.get(blockName, blockName)
def _nextOpsFor(self, key):
"""返回某方块/物品的"下一步操作"提示列表(去重保序)"""
def _nextStepTip(self, key):
"""按结果方块/物品生成"你可以…"的可读下一步提示; 无则返回空串
例: 饺子皮 -> "你可以加入 猪肉馅、青菜碎"
可颂面胚 -> "你可以放在烤炉上等计时(60秒)结束变成 可颂"
"""
if not key:
return []
ops = self.nextOps.get(key, [])
return ""
ops = self.nextTips.get(key, [])
seen = set()
out = []
uniq = []
for o in ops:
if o not in seen:
seen.add(o)
out.append(o)
return out
uniq.append(o)
if not uniq:
return ""
# 加料类("加入 XX")合并成一句(用顿号); 其余(工具/计时)用"或"并列
adds = [o[2:] for o in uniq if o.startswith("加入")]
others = [o for o in uniq if not o.startswith("加入")]
parts = []
if adds:
parts.append("加入 " + "、".join(adds))
parts.extend(others)
return "你可以" + " 或 ".join(parts)
# ============================================================================
# 六、工具方法:获取玩家主手物品
@@ -148,7 +148,7 @@ class MianshiTimerService(BlueFoxServerSystem):
tdur = blockData["rtdd_tdur"]
if time.time() - tstart >= tdur:
self._finishTimer(dim, pos, rule, blockData)
self._finishTimer(dim, pos, rule)
except Exception:
pass
@@ -181,20 +181,9 @@ class MianshiTimerService(BlueFoxServerSystem):
self._setAir(dim, pos)
self._notifyIfOnline(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):
def _finishTimer(self, dim, pos, rule):
"""到点转换(计时结束提示已取消, 只保留开始计时提示; 异常提示走 _handleBelowBroken)"""
try:
# 先取出发起玩家(下方 replaceBlock/_clearTimerData 会把实体数据清掉, 必须提前读)
tp = ""
try:
tp = data["rtdd_tp"] or ""
except Exception:
tp = ""
cur = comp.CreateBlockInfo(LevelId).GetBlockNew(pos, dim)
if cur and cur.get("name") != rule["source"]:
self._clearTimerData(dim, pos)
@@ -202,50 +191,10 @@ class MianshiTimerService(BlueFoxServerSystem):
# 到点转换
self.replaceBlock(pos, dim, rule["target"], None)
self._clearTimerData(dim, pos)
tip = rule.get("doneTip", "")
if tip:
tip += self._nextStepTip(rule)
self._notifyIfOnline(tp, tip)
if not 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
# 计时完成后的"下一步"指引已取消(提示只保留开始计时的), 见 tuilun 记录
# ============================================================================
# 四、计时数据读写(存在方块实体数据里,重启不丢)
@@ -84,41 +84,41 @@ SWITCH_RULES = [
{"block": OILPOT_1, "item": BREADED_CHICKEN, "target": CHICKEN_0,
"consume": 1, "startTimer": CHICKEN_0,
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
"tip": "§a放入裹粉鸡块, 开始炸制(60秒半熟, 再30秒熟)"},
"tip": "§a放入裹粉鸡块, 等计时(60秒)结束变成 炸鸡块(半熟), 再等(30秒)结束变成 炸鸡块(熟)"},
{"block": OILPOT_1, "item": BREADED_PORK, "target": PORK_0,
"consume": 1, "startTimer": PORK_0,
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
"tip": "§a放入裹粉猪肉, 开始炸制(60秒半熟, 再30秒熟)"},
"tip": "§a放入裹粉猪肉, 等计时(60秒)结束变成 炸猪排(半熟), 再等(30秒)结束变成 炸猪排(熟)"},
{"block": OILPOT_1, "item": BREADED_FRIES, "target": FRIES_0,
"consume": 3, "startTimer": FRIES_0,
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
"tip": "§a放入裹粉薯条x3, 开始炸制(60秒半熟, 再30秒熟)"},
"tip": "§a放入裹粉薯条x3, 等计时(60秒)结束变成 炸薯条(半熟), 再等(30秒)结束变成 炸薯条(熟)"},
{"block": OILPOT_1, "item": BREADED_FISH, "target": FISH_0,
"consume": 1, "startTimer": FISH_0,
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
"tip": "§a放入裹粉鱼, 开始炸制(60秒半熟, 再30秒熟)"},
"tip": "§a放入裹粉鱼, 等计时(60秒)结束变成 炸鱼块(半熟), 再等(30秒)结束变成 炸鱼块(熟)"},
{"block": OILPOT_1, "item": BREADED_TEMPURA, "target": TEMPURA_1,
"consume": 4, "startTimer": TEMPURA_1,
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
"tip": "§a放入裹粉天妇罗x4, 开始炸制(60秒)"},
"tip": "§a放入裹粉天妇罗x4, 等计时(60秒)结束变成 炸天妇罗(熟)"},
{"block": OILPOT_1, "item": DUMPLINGS, "target": DUMPLING_1,
"consume": 3, "startTimer": DUMPLING_1,
"needBelow": LIT_STOVE, "belowTip": "§c油锅需要放在点燃的炉灶上",
"tip": "§a放入生饺子x3, 开始炸制(60秒), 计时/取出都在炸饺子上"},
"tip": "§a放入生饺子x3, 等计时(60秒)结束变成 炸饺子(熟)"},
# ---- 三、出锅(熟炸物 + 盘子 -> 掉落盘装成品) ----
{"block": CHICKEN_2, "item": PLATE, "action": "take_out",
"dropItem": PLATE_CHICKEN, "consume": 1, "tip": "§a取出盘装鸡块"},
"dropItem": PLATE_CHICKEN, "consume": 1, "tip": "§a取出盘装鸡块, 油锅恢复满油, 可继续放料"},
{"block": PORK_2, "item": PLATE, "action": "take_out",
"dropItem": PLATE_PORK, "consume": 1, "tip": "§a取出炸猪排(盘装)"},
"dropItem": PLATE_PORK, "consume": 1, "tip": "§a取出炸猪排(盘装), 油锅恢复满油, 可继续放料"},
{"block": FRIES_2, "item": PLATE, "action": "take_out",
"dropItem": PLATE_FRIES, "consume": 1, "tip": "§a取出炸薯条(盘装)"},
"dropItem": PLATE_FRIES, "consume": 1, "tip": "§a取出炸薯条(盘装), 油锅恢复满油, 可继续放料"},
{"block": FISH_2, "item": PLATE, "action": "take_out",
"dropItem": PLATE_FISH, "consume": 1, "tip": "§a取出盘装炸鱼"},
"dropItem": PLATE_FISH, "consume": 1, "tip": "§a取出盘装炸鱼, 油锅恢复满油, 可继续放料"},
{"block": TEMPURA_2, "item": PLATE, "action": "take_out",
"dropItem": PLATE_TEMPURA, "consume": 1, "tip": "§a取出天妇罗炸虾"},
"dropItem": PLATE_TEMPURA, "consume": 1, "tip": "§a取出天妇罗炸虾, 油锅恢复满油, 可继续放料"},
{"block": DUMPLING_2, "item": PLATE, "action": "take_out",
"dropItem": PLATE_DUMPLINGS, "consume": 1, "tip": "§a取出炸饺子(盘装)"},
"dropItem": PLATE_DUMPLINGS, "consume": 1, "tip": "§a取出炸饺子(盘装), 油锅恢复满油, 可继续放料"},
]
# ============================================================================
@@ -141,7 +141,7 @@ class YouguoTimerService(BlueFoxServerSystem):
tdur = blockData["rtdd_tdur"]
if time.time() - tstart >= tdur:
self._finishTimer(dim, pos, rule, blockData)
self._finishTimer(dim, pos, rule)
except Exception:
pass
@@ -154,14 +154,9 @@ class YouguoTimerService(BlueFoxServerSystem):
tp = ""
self._notifyIfOnline(tp, "§c油锅下的炉灶移走了, 暂停炸制")
def _finishTimer(self, dim, pos, rule, data):
def _finishTimer(self, dim, pos, rule):
"""到点转换(计时结束提示已取消, 只保留放料时的开始提示; 炉灶移走提示走 _handleBelowBroken)"""
try:
# 先取出发起玩家(下方 replaceBlock/_clearTimerData 会把实体数据清掉, 必须提前读)
tp = ""
try:
tp = data["rtdd_tp"] or ""
except Exception:
tp = ""
cur = comp.CreateBlockInfo(LevelId).GetBlockNew(pos, dim)
if cur and cur.get("name") != rule["source"]:
self._clearTimerData(dim, pos)
@@ -169,12 +164,6 @@ class YouguoTimerService(BlueFoxServerSystem):
# 到点转换
self.replaceBlock(pos, dim, rule["target"], None)
self._clearTimerData(dim, pos)
# 计时结束提示: 发给发起玩家; 发起者不在/未知则提示附近
tip = rule.get("doneTip", "")
if tip:
self._notifyIfOnline(tp, tip)
if not tp:
self._notifyNearby(dim, pos, tip)
except Exception:
pass
@@ -221,29 +210,6 @@ class YouguoTimerService(BlueFoxServerSystem):
except Exception:
pass
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
# ============================================================================
# 六、工具方法:替换方块
# ============================================================================